image: handle multiple images correctly
Don't stop the application when only one window is closed. Don't stall indefinitely if no valid image file is given as input.
This commit is contained in:
committed by
Kristian Høgsberg
parent
f22d0ecd97
commit
1f54f17ef8
+26
-3
@@ -44,6 +44,7 @@ struct image {
|
||||
char *filename;
|
||||
cairo_surface_t *image;
|
||||
int fullscreen;
|
||||
int *image_counter;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -112,8 +113,25 @@ fullscreen_handler(struct window *window, void *data)
|
||||
window_set_fullscreen(window, image->fullscreen);
|
||||
}
|
||||
|
||||
static void
|
||||
close_handler(struct window *window, void *data)
|
||||
{
|
||||
struct image *image = data;
|
||||
|
||||
*image->image_counter -= 1;
|
||||
|
||||
if (*image->image_counter == 0)
|
||||
display_exit(image->display);
|
||||
|
||||
widget_destroy(image->widget);
|
||||
window_destroy(image->window);
|
||||
|
||||
free(image);
|
||||
}
|
||||
|
||||
static struct image *
|
||||
image_create(struct display *display, const char *filename)
|
||||
image_create(struct display *display, const char *filename,
|
||||
int *image_counter)
|
||||
{
|
||||
struct image *image;
|
||||
char *b, *copy, title[512];;
|
||||
@@ -140,12 +158,15 @@ image_create(struct display *display, const char *filename)
|
||||
image->widget = frame_create(image->window, image);
|
||||
window_set_title(image->window, title);
|
||||
image->display = display;
|
||||
image->image_counter = image_counter;
|
||||
*image_counter += 1;
|
||||
|
||||
window_set_user_data(image->window, image);
|
||||
widget_set_redraw_handler(image->widget, redraw_handler);
|
||||
window_set_keyboard_focus_handler(image->window,
|
||||
keyboard_focus_handler);
|
||||
window_set_fullscreen_handler(image->window, fullscreen_handler);
|
||||
window_set_close_handler(image->window, close_handler);
|
||||
|
||||
widget_schedule_resize(image->widget, 500, 400);
|
||||
|
||||
@@ -157,6 +178,7 @@ main(int argc, char *argv[])
|
||||
{
|
||||
struct display *d;
|
||||
int i;
|
||||
int image_counter = 0;
|
||||
|
||||
d = display_create(argc, argv);
|
||||
if (d == NULL) {
|
||||
@@ -165,9 +187,10 @@ main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
for (i = 1; i < argc; i++)
|
||||
image_create (d, argv[i]);
|
||||
image_create(d, argv[i], &image_counter);
|
||||
|
||||
display_run(d);
|
||||
if (image_counter > 0)
|
||||
display_run(d);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user