PDF viewer to run until and only when it has existing windows

I.e. not to close whole application when one of the windows
is closed.
This commit is contained in:
Pekka Vuorela
2012-09-17 22:15:56 +03:00
committed by Kristian Høgsberg
parent 2dbe4c632e
commit 64988feb13
+26 -3
View File
@@ -49,6 +49,7 @@ struct view {
PopplerDocument *document; PopplerDocument *document;
int page; int page;
int fullscreen; int fullscreen;
int *view_counter;
}; };
static void static void
@@ -166,6 +167,23 @@ fullscreen_handler(struct window *window, void *data)
window_set_fullscreen(window, view->fullscreen); window_set_fullscreen(window, view->fullscreen);
} }
static void
close_handler(struct window *window, void *data)
{
struct view *view = data;
*view->view_counter -= 1;
if (*view->view_counter == 0)
display_exit(view->display);
widget_destroy(view->widget);
window_destroy(view->window);
if (view->document)
g_object_unref(view->document);
free(view);
}
static void static void
key_handler(struct window *window, struct input *input, uint32_t time, key_handler(struct window *window, struct input *input, uint32_t time,
uint32_t key, uint32_t unicode, uint32_t key, uint32_t unicode,
@@ -204,7 +222,7 @@ keyboard_focus_handler(struct window *window,
static struct view * static struct view *
view_create(struct display *display, view_create(struct display *display,
uint32_t key, const char *filename, int fullscreen) uint32_t key, const char *filename, int fullscreen, int *view_counter)
{ {
struct view *view; struct view *view;
gchar *basename; gchar *basename;
@@ -244,6 +262,7 @@ view_create(struct display *display,
window_set_keyboard_focus_handler(view->window, window_set_keyboard_focus_handler(view->window,
keyboard_focus_handler); keyboard_focus_handler);
window_set_fullscreen_handler(view->window, fullscreen_handler); window_set_fullscreen_handler(view->window, fullscreen_handler);
window_set_close_handler(view->window, close_handler);
widget_set_button_handler(view->widget, button_handler); widget_set_button_handler(view->widget, button_handler);
widget_set_resize_handler(view->widget, resize_handler); widget_set_resize_handler(view->widget, resize_handler);
@@ -255,6 +274,8 @@ view_create(struct display *display,
window_set_fullscreen(view->window, view->fullscreen); window_set_fullscreen(view->window, view->fullscreen);
window_schedule_resize(view->window, 500, 400); window_schedule_resize(view->window, 500, 400);
view->view_counter = view_counter;
*view_counter += 1;
return view; return view;
} }
@@ -270,6 +291,7 @@ main(int argc, char *argv[])
{ {
struct display *d; struct display *d;
int i; int i;
int view_counter = 0;
g_type_init(); g_type_init();
@@ -283,9 +305,10 @@ main(int argc, char *argv[])
} }
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
view_create (d, i, argv[i], option_fullscreen); view_create (d, i, argv[i], option_fullscreen, &view_counter);
display_run(d); if (view_counter > 0)
display_run(d);
return 0; return 0;
} }