mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-05 06:28:01 +02:00
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:
parent
f22d0ecd97
commit
1f54f17ef8
1 changed files with 26 additions and 3 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue