From 08ed957073b68150244fb7cc40784b68f9126bad Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Fri, 23 Dec 2011 00:00:27 +0100 Subject: [PATCH] gtk-tpdfv-screen, tpdfview: Implemented "move window to next screen". This is done by pressing the 'M' (move) key. For this purpose, the functions gtk_tpdfv_screens_window_set() and gtk_tpdfv_screens_window_get() have been added, querying the list of screens for the right settings. --- src/gtk-tpdfv-screen.c | 56 ++++++++++++++++++++++++++++++++++++++++-- src/gtk-tpdfv.h | 11 +++++++++ src/tpdfview.c | 19 ++++++++++++-- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/gtk-tpdfv-screen.c b/src/gtk-tpdfv-screen.c index a118d79..104522e 100644 --- a/src/gtk-tpdfv-screen.c +++ b/src/gtk-tpdfv-screen.c @@ -121,7 +121,7 @@ gtk_tpdfv_screens_init(const gchar *display_name) } } return screens; -} /* gtk_tpdfv_new */ +} /* gtk_tpdfv_screens_init */ void gtk_tpdfv_screens_destroy(gtk_tpdfv_screens_t *screens) @@ -132,7 +132,7 @@ gtk_tpdfv_screens_destroy(gtk_tpdfv_screens_t *screens) if (screens->screens) free(screens->screens); free(screens); -} /* gtk_tpdfv_destroy_screens */ +} /* gtk_tpdfv_screens_destroy */ gint gtk_tpdfv_screens_number(const gtk_tpdfv_screens_t *screens) @@ -142,5 +142,57 @@ gtk_tpdfv_screens_number(const gtk_tpdfv_screens_t *screens) return screens->num_screens; } /* gtk_tpdfv_screens_number */ +void +gtk_tpdfv_screens_window_set(const gtk_tpdfv_screens_t *screens, + GtkWindow *window, gint screen) +{ + screen_t *s_old, *s_new; + + gint x = 0, y = 0; + gint current; + + if ((! screens) || (! window) + || (screen < 0) || (screen >= screens->num_screens)) + return; + + gtk_window_get_position(window, &x, &y); + + current = gtk_tpdfv_screens_window_get(screens, window); + assert((0 <= current) && (current < screens->num_screens)); + + s_old = screens->screens + current; + s_new = screens->screens + screen; + + gtk_window_set_screen(window, s_new->screen); + gtk_window_move(window, + s_new->x + (x - s_old->x), s_new->y + (y - s_old->y)); +} /* gtk_tpdfv_screens_window_set */ + +gint +gtk_tpdfv_screens_window_get(const gtk_tpdfv_screens_t *screens, + GtkWindow *window) +{ + GdkScreen *gdk_screen; + + gint x = 0, y = 0; + gint i; + + if ((! screens) || (! window)) + return -1; + + gdk_screen = gtk_window_get_screen(window); + gtk_window_get_position(window, &x, &y); + + for (i = 0; i < screens->num_screens; ++i) { + screen_t *screen = screens->screens + i; + + if ((screen->screen == gdk_screen) + && (screen->x <= x) && (x <= screen->x + screen->width) + && (screen->y <= y) && (y <= screen->y + screen->height)) + return i; + } + return -1; +} /* gtk_tpdfv_screens_window_set */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */ diff --git a/src/gtk-tpdfv.h b/src/gtk-tpdfv.h index 44ffd71..9dd48f8 100644 --- a/src/gtk-tpdfv.h +++ b/src/gtk-tpdfv.h @@ -141,6 +141,17 @@ gtk_tpdfv_screens_destroy(gtk_tpdfv_screens_t *screens); gint gtk_tpdfv_screens_number(const gtk_tpdfv_screens_t *screens); +/* + * gtk_tpdfv_screens_window_set, gtk_tpdfv_screens_window_get: + * Set or get the screen of a window. + */ +void +gtk_tpdfv_screens_window_set(const gtk_tpdfv_screens_t *screens, + GtkWindow *window, gint screen); +gint +gtk_tpdfv_screens_window_get(const gtk_tpdfv_screens_t *screens, + GtkWindow *window); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/tpdfview.c b/src/tpdfview.c index b15bad3..e6fee21 100644 --- a/src/tpdfview.c +++ b/src/tpdfview.c @@ -56,6 +56,11 @@ #include #include +/* + * Global variables. + */ +static gtk_tpdfv_screens_t *screens = NULL; + static void exit_usage(char *name, int status) { @@ -181,6 +186,18 @@ key_press(GtkWidget *window, GdkEventKey *event, gpointer data) case GDK_Right: gtk_tpdfv_scroll_right(tpdfv); break; + + /* screen management */ + case GDK_M: + { + gint n_screens = gtk_tpdfv_screens_number(screens); + gint screen = gtk_tpdfv_screens_window_get(screens, + GTK_WINDOW(window)); + + gtk_tpdfv_screens_window_set(screens, + GTK_WINDOW(window), (screen + 1) % n_screens); + } + break; } return FALSE; } /* key_press */ @@ -188,8 +205,6 @@ key_press(GtkWidget *window, GdkEventKey *event, gpointer data) int main(int argc, char **argv) { - gtk_tpdfv_screens_t *screens; - GtkWidget *win = NULL; GtkWidget *tpdfv = NULL; -- 2.30.2