nsxivbad9a70
Display filesize in window title
+75 −39
5 files changed
| @@ -73,7 +73,6 @@ int img_check(const char *filename) { | |||
| 73 | 73 | ||
| 74 | 74 | if ((ret = _imlib_load_image(filename))) | |
| 75 | 75 | imlib_free_image(); | |
| 76 | − | ||
| 77 | 76 | return ret; | |
| 78 | 77 | } | |
| 79 | 78 | ||
| @@ -194,12 +193,19 @@ int img_fit(img_t *img, win_t *win) { | |||
| 194 | 193 | return oz != img->zoom; | |
| 195 | 194 | } | |
| 196 | 195 | ||
| 197 | − | void img_center(img_t *img, win_t *win) { | |
| 196 | + | int img_center(img_t *img, win_t *win) { | |
| 197 | + | int ox, oy; | |
| 198 | + | ||
| 198 | 199 | if (!img || !win) | |
| 199 | − | return; | |
| 200 | + | return 0; | |
| 201 | + | ||
| 202 | + | ox = img->x; | |
| 203 | + | oy = img->y; | |
| 200 | 204 | ||
| 201 | 205 | img->x = (win->w - img->w * img->zoom) / 2; | |
| 202 | 206 | img->y = (win->h - img->h * img->zoom) / 2; | |
| 207 | + | ||
| 208 | + | return ox != img->x || oy != img->y; | |
| 203 | 209 | } | |
| 204 | 210 | ||
| 205 | 211 | int img_zoom(img_t *img, float z) { | |
| @@ -231,7 +237,6 @@ int img_zoom_in(img_t *img) { | |||
| 231 | 237 | if (zoom_levels[i] > img->zoom * 100.0) | |
| 232 | 238 | return img_zoom(img, zoom_levels[i] / 100.0); | |
| 233 | 239 | } | |
| 234 | − | ||
| 235 | 240 | return 0; | |
| 236 | 241 | } | |
| 237 | 242 | ||
| @@ -245,7 +250,6 @@ int img_zoom_out(img_t *img) { | |||
| 245 | 250 | if (zoom_levels[i] < img->zoom * 100.0) | |
| 246 | 251 | return img_zoom(img, zoom_levels[i] / 100.0); | |
| 247 | 252 | } | |
| 248 | − | ||
| 249 | 253 | return 0; | |
| 250 | 254 | } | |
| 251 | 255 | ||
| @@ -284,11 +288,11 @@ int img_pan(img_t *img, win_t *win, pandir_t dir) { | |||
| 284 | 288 | return 0; | |
| 285 | 289 | } | |
| 286 | 290 | ||
| 287 | − | int img_rotate(img_t *img, win_t *win, int d) { | |
| 291 | + | void img_rotate(img_t *img, win_t *win, int d) { | |
| 288 | 292 | int ox, oy, tmp; | |
| 289 | 293 | ||
| 290 | 294 | if (!img || !win) | |
| 291 | − | return 0; | |
| 295 | + | return; | |
| 292 | 296 | ||
| 293 | 297 | ox = d == 1 ? img->x : win->w - img->x - img->w * img->zoom; | |
| 294 | 298 | oy = d == 3 ? img->y : win->h - img->y - img->h * img->zoom; | |
| @@ -303,24 +307,20 @@ int img_rotate(img_t *img, win_t *win, int d) { | |||
| 303 | 307 | img->h = tmp; | |
| 304 | 308 | ||
| 305 | 309 | img->checkpan = 1; | |
| 306 | − | ||
| 307 | − | return 1; | |
| 308 | 310 | } | |
| 309 | 311 | ||
| 310 | − | int img_rotate_left(img_t *img, win_t *win) { | |
| 311 | − | return img_rotate(img, win, 3); | |
| 312 | + | void img_rotate_left(img_t *img, win_t *win) { | |
| 313 | + | img_rotate(img, win, 3); | |
| 312 | 314 | } | |
| 313 | 315 | ||
| 314 | − | int img_rotate_right(img_t *img, win_t *win) { | |
| 315 | − | return img_rotate(img, win, 1); | |
| 316 | + | void img_rotate_right(img_t *img, win_t *win) { | |
| 317 | + | img_rotate(img, win, 1); | |
| 316 | 318 | } | |
| 317 | 319 | ||
| 318 | − | int img_toggle_antialias(img_t *img) { | |
| 320 | + | void img_toggle_antialias(img_t *img) { | |
| 319 | 321 | if (!img) | |
| 320 | − | return 0; | |
| 322 | + | return; | |
| 321 | 323 | ||
| 322 | 324 | img->aa ^= 1; | |
| 323 | 325 | imlib_context_set_anti_alias(img->aa); | |
| 324 | − | ||
| 325 | − | return 1; | |
| 326 | 326 | } | |
| @@ -55,7 +55,7 @@ int img_load(img_t*, const char*); | |||
| 55 | 55 | void img_render(img_t*, win_t*); | |
| 56 | 56 | ||
| 57 | 57 | int img_fit(img_t*, win_t*); | |
| 58 | − | void img_center(img_t*, win_t*); | |
| 58 | + | int img_center(img_t*, win_t*); | |
| 59 | 59 | ||
| 60 | 60 | int img_zoom_in(img_t*); | |
| 61 | 61 | int img_zoom_out(img_t*); | |
| @@ -63,9 +63,9 @@ int img_zoom_out(img_t*); | |||
| 63 | 63 | int img_move(img_t*, win_t*, int, int); | |
| 64 | 64 | int img_pan(img_t*, win_t*, pandir_t); | |
| 65 | 65 | ||
| 66 | − | int img_rotate_left(img_t*, win_t*); | |
| 67 | − | int img_rotate_right(img_t*, win_t*); | |
| 66 | + | void img_rotate_left(img_t*, win_t*); | |
| 67 | + | void img_rotate_right(img_t*, win_t*); | |
| 68 | 68 | ||
| 69 | − | int img_toggle_antialias(img_t*); | |
| 69 | + | void img_toggle_antialias(img_t*); | |
| 70 | 70 | ||
| 71 | 71 | #endif /* IMAGE_H */ | |
| @@ -44,6 +44,7 @@ win_t win; | |||
| 44 | 44 | #define FNAME_CNT 4096 | |
| 45 | 45 | const char **filenames; | |
| 46 | 46 | int filecnt, fileidx; | |
| 47 | + | size_t filesize; | |
| 47 | 48 | ||
| 48 | 49 | #define TITLE_LEN 256 | |
| 49 | 50 | char win_title[TITLE_LEN]; | |
| @@ -57,6 +58,17 @@ void cleanup() { | |||
| 57 | 58 | } | |
| 58 | 59 | } | |
| 59 | 60 | ||
| 61 | + | int load_image() { | |
| 62 | + | struct stat fstats; | |
| 63 | + | ||
| 64 | + | if (stat(filenames[fileidx], &fstats)) | |
| 65 | + | warn("could not stat file: %s", filenames[fileidx]); | |
| 66 | + | else | |
| 67 | + | filesize = fstats.st_size; | |
| 68 | + | ||
| 69 | + | return img_load(&img, filenames[fileidx]); | |
| 70 | + | } | |
| 71 | + | ||
| 60 | 72 | int main(int argc, char **argv) { | |
| 61 | 73 | int i; | |
| 62 | 74 | const char *filename; | |
| @@ -102,7 +114,7 @@ int main(int argc, char **argv) { | |||
| 102 | 114 | win_open(&win); | |
| 103 | 115 | img_init(&img, &win); | |
| 104 | 116 | ||
| 105 | − | img_load(&img, filenames[fileidx]); | |
| 117 | + | load_image(); | |
| 106 | 118 | img_render(&img, &win); | |
| 107 | 119 | update_title(); | |
| 108 | 120 | ||
| @@ -115,10 +127,15 @@ int main(int argc, char **argv) { | |||
| 115 | 127 | ||
| 116 | 128 | void update_title() { | |
| 117 | 129 | int n; | |
| 130 | + | float size; | |
| 131 | + | const char *unit; | |
| 118 | 132 | ||
| 119 | − | n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> %s", fileidx + 1, | |
| 120 | − | filecnt, (int) (img.zoom * 100.0), filenames[fileidx]); | |
| 121 | − | ||
| 133 | + | size = filesize; | |
| 134 | + | size_readable(&size, &unit); | |
| 135 | + | ||
| 136 | + | n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] <%d%%> (%.2f%s) %s", | |
| 137 | + | fileidx + 1, filecnt, (int) (img.zoom * 100.0), size, unit, | |
| 138 | + | filenames[fileidx]); | |
| 122 | 139 | if (n >= TITLE_LEN) { | |
| 123 | 140 | win_title[TITLE_LEN - 2] = '.'; | |
| 124 | 141 | win_title[TITLE_LEN - 3] = '.'; | |
| @@ -223,37 +240,39 @@ void on_keypress(XKeyEvent *kev) { | |||
| 223 | 240 | case XK_n: | |
| 224 | 241 | case XK_space: | |
| 225 | 242 | if (fileidx + 1 < filecnt) { | |
| 226 | − | changed = img_load(&img, filenames[++fileidx]); | |
| 243 | + | ++fileidx; | |
| 244 | + | changed = load_image(); | |
| 227 | 245 | } | |
| 228 | 246 | break; | |
| 229 | 247 | case XK_p: | |
| 230 | 248 | case XK_BackSpace: | |
| 231 | 249 | if (fileidx > 0) { | |
| 232 | − | changed = img_load(&img, filenames[--fileidx]); | |
| 250 | + | --fileidx; | |
| 251 | + | changed = load_image(); | |
| 233 | 252 | } | |
| 234 | 253 | break; | |
| 235 | 254 | case XK_bracketleft: | |
| 236 | 255 | if (fileidx != 0) { | |
| 237 | 256 | fileidx = MAX(0, fileidx - 10); | |
| 238 | − | changed = img_load(&img, filenames[fileidx]); | |
| 257 | + | changed = load_image(); | |
| 239 | 258 | } | |
| 240 | 259 | break; | |
| 241 | 260 | case XK_bracketright: | |
| 242 | 261 | if (fileidx != filecnt - 1) { | |
| 243 | 262 | fileidx = MIN(fileidx + 10, filecnt - 1); | |
| 244 | − | changed = img_load(&img, filenames[fileidx]); | |
| 263 | + | changed = load_image(); | |
| 245 | 264 | } | |
| 246 | 265 | break; | |
| 247 | 266 | case XK_g: | |
| 248 | 267 | if (fileidx != 0) { | |
| 249 | 268 | fileidx = 0; | |
| 250 | − | changed = img_load(&img, filenames[fileidx]); | |
| 269 | + | changed = load_image(); | |
| 251 | 270 | } | |
| 252 | 271 | break; | |
| 253 | 272 | case XK_G: | |
| 254 | 273 | if (fileidx != filecnt - 1) { | |
| 255 | 274 | fileidx = filecnt - 1; | |
| 256 | − | changed = img_load(&img, filenames[fileidx]); | |
| 275 | + | changed = load_image(); | |
| 257 | 276 | } | |
| 258 | 277 | break; | |
| 259 | 278 | ||
| @@ -286,24 +305,29 @@ void on_keypress(XKeyEvent *kev) { | |||
| 286 | 305 | ||
| 287 | 306 | /* rotation */ | |
| 288 | 307 | case XK_less: | |
| 289 | − | changed = img_rotate_left(&img, &win); | |
| 308 | + | img_rotate_left(&img, &win); | |
| 309 | + | changed = 1; | |
| 290 | 310 | break; | |
| 291 | 311 | case XK_greater: | |
| 292 | − | changed = img_rotate_right(&img, &win); | |
| 312 | + | img_rotate_right(&img, &win); | |
| 313 | + | changed = 1; | |
| 293 | 314 | break; | |
| 294 | 315 | ||
| 295 | 316 | /* control window */ | |
| 296 | 317 | case XK_f: | |
| 297 | 318 | win_toggle_fullscreen(&win); | |
| 319 | + | /* render on next configurenotify */ | |
| 298 | 320 | break; | |
| 299 | 321 | ||
| 300 | 322 | /* miscellaneous */ | |
| 301 | 323 | case XK_a: | |
| 302 | − | changed = img_toggle_antialias(&img); | |
| 324 | + | img_toggle_antialias(&img); | |
| 325 | + | changed = 1; | |
| 303 | 326 | break; | |
| 304 | 327 | case XK_r: | |
| 305 | − | changed = img_load(&img, filenames[fileidx]); | |
| 328 | + | changed = load_image(); | |
| 306 | 329 | break; | |
| 330 | + | ; | |
| 307 | 331 | } | |
| 308 | 332 | ||
| 309 | 333 | if (changed) { | |
| @@ -326,8 +350,8 @@ void on_buttonpress(XButtonEvent *bev) { | |||
| 326 | 350 | switch (bev->button) { | |
| 327 | 351 | case Button1: | |
| 328 | 352 | if (fileidx + 1 < filecnt) { | |
| 329 | − | img_load(&img, filenames[++fileidx]); | |
| 330 | − | changed = 1; | |
| 353 | + | ++fileidx; | |
| 354 | + | changed = load_image(); | |
| 331 | 355 | } | |
| 332 | 356 | break; | |
| 333 | 357 | case Button2: | |
| @@ -337,8 +361,8 @@ void on_buttonpress(XButtonEvent *bev) { | |||
| 337 | 361 | break; | |
| 338 | 362 | case Button3: | |
| 339 | 363 | if (fileidx > 0) { | |
| 340 | − | img_load(&img, filenames[--fileidx]); | |
| 341 | − | changed = 1; | |
| 364 | + | --fileidx; | |
| 365 | + | changed = load_image(); | |
| 342 | 366 | } | |
| 343 | 367 | break; | |
| 344 | 368 | case Button4: | |
| @@ -66,3 +66,12 @@ void die(const char* fmt, ...) { | |||
| 66 | 66 | cleanup(); | |
| 67 | 67 | exit(1); | |
| 68 | 68 | } | |
| 69 | + | ||
| 70 | + | void size_readable(float *size, const char **unit) { | |
| 71 | + | const char *units[] = { "", "K", "M", "G" }; | |
| 72 | + | int i; | |
| 73 | + | ||
| 74 | + | for (i = 0; i < LEN(units) && *size > 1024; ++i) | |
| 75 | + | *size /= 1024; | |
| 76 | + | *unit = units[MIN(i, LEN(units) - 1)]; | |
| 77 | + | } | |
| @@ -24,6 +24,7 @@ | |||
| 24 | 24 | #define ABS(a) ((a) < 0 ? (-(a)) : (a)) | |
| 25 | 25 | #define MIN(a,b) ((a) < (b) ? (a) : (b)) | |
| 26 | 26 | #define MAX(a,b) ((a) > (b) ? (a) : (b)) | |
| 27 | + | #define LEN(a) (sizeof(a) / sizeof(a[0])) | |
| 27 | 28 | ||
| 28 | 29 | void* s_malloc(size_t); | |
| 29 | 30 | void* s_realloc(void*, size_t); | |
| @@ -31,4 +32,6 @@ void* s_realloc(void*, size_t); | |||
| 31 | 32 | void warn(const char*, ...); | |
| 32 | 33 | void die(const char*, ...); | |
| 33 | 34 | ||
| 35 | + | void size_readable(float*, const char**); | |
| 36 | + | ||
| 34 | 37 | #endif /* UTIL_H */ | |