From 64d6ea86fc5614af0004c3e6e84d21706b04d56d Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 31 Oct 2006 19:40:45 +0000 Subject: Add support for multiscreen systems. Fixes bug #316206. 2006-10-31 Carlos Garcia Campos * shell/ev-application-service.xml: * shell/ev-application.[ch]: (ev_application_open_window), (ev_application_get_empty_window), (ev_application_open_uri_at_dest), (ev_application_open_uri), (ev_application_open_uri_list): * shell/ev-window.c: (file_open_dialog_response_cb), (ev_window_cmd_recent_file_activate), (ev_window_setup_recent), (drag_data_received_cb), (open_remote_link): * shell/main.c: (arguments_parse), (load_files), (load_files_remote): Add support for multiscreen systems. Fixes bug #316206. --- diff --git a/ChangeLog b/ChangeLog index 2f88c96..d22f7cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-10-31 Carlos Garcia Campos + + * shell/ev-application-service.xml: + * shell/ev-application.[ch]: (ev_application_open_window), + (ev_application_get_empty_window), (ev_application_open_uri_at_dest), + (ev_application_open_uri), (ev_application_open_uri_list): + * shell/ev-window.c: (file_open_dialog_response_cb), + (ev_window_cmd_recent_file_activate), (ev_window_setup_recent), + (drag_data_received_cb), (open_remote_link): + * shell/main.c: (arguments_parse), (load_files), (load_files_remote): + + Add support for multiscreen systems. Fixes bug #316206. + 2006-10-30 Carlos Garcia Campos * shell/ev-jobs.[ch]: (ev_job_print_new), diff --git a/shell/ev-application-service.xml b/shell/ev-application-service.xml index 4ef2cfa..f56bf0b 100644 --- a/shell/ev-application-service.xml +++ b/shell/ev-application-service.xml @@ -6,7 +6,8 @@ - + + diff --git a/shell/ev-application.c b/shell/ev-application.c index 386b86e..388c8d2 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -174,13 +174,109 @@ init_session (EvApplication *application) G_CALLBACK (removed_from_session), application); } +static GdkDisplay * +ev_display_open_if_needed (const gchar *name) +{ + GSList *displays; + GSList *l; + GdkDisplay *display = NULL; + + displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); + + for (l = displays; l != NULL; l = l->next) { + const gchar *display_name = gdk_display_get_name ((GdkDisplay *) l->data); + + if (g_ascii_strcasecmp (display_name, name) == 0) { + display = l->data; + break; + } + } + + g_slist_free (displays); + + return display != NULL ? display : gdk_display_open (name); +} + +static GdkScreen * +get_screen_from_args (GHashTable *args) +{ + GValue *value = NULL; + GdkDisplay *display = NULL; + GdkScreen *screen = NULL; + + g_assert (args != NULL); + + value = g_hash_table_lookup (args, "display"); + if (value) { + const gchar *display_name; + + display_name = g_value_get_string (value); + display = ev_display_open_if_needed (display_name); + } + + value = g_hash_table_lookup (args, "screen"); + if (value) { + gint screen_number; + + screen_number = g_value_get_int (value); + screen = gdk_display_get_screen (display, screen_number); + } + + return screen; +} + +static EvWindowRunMode +get_window_run_mode_from_args (GHashTable *args) +{ + EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL; + GValue *value = NULL; + + g_assert (args != NULL); + + value = g_hash_table_lookup (args, "mode"); + if (value) { + mode = g_value_get_uint (value); + } + + return mode; +} + +static EvLinkDest * +get_destination_from_args (GHashTable *args) +{ + EvLinkDest *dest = NULL; + GValue *value = NULL; + + g_assert (args != NULL); + + value = g_hash_table_lookup (args, "page-label"); + if (value) { + const gchar *page_label; + + page_label = g_value_get_string (value); + dest = ev_link_dest_new_page_label (page_label); + } + + return dest; +} + gboolean ev_application_open_window (EvApplication *application, + GHashTable *args, guint32 timestamp, GError **error) { GtkWidget *new_window = ev_window_new (); + GdkScreen *screen = NULL; + if (args) { + screen = get_screen_from_args (args); + } + + if (screen) { + gtk_window_set_screen (GTK_WINDOW (new_window), screen); + } + gtk_widget_show (new_window); gtk_window_present_with_time (GTK_WINDOW (new_window), @@ -189,7 +285,8 @@ ev_application_open_window (EvApplication *application, } static EvWindow * -ev_application_get_empty_window (EvApplication *application) +ev_application_get_empty_window (EvApplication *application, + GdkScreen *screen) { EvWindow *empty_window = NULL; GList *windows = ev_application_get_windows (application); @@ -198,7 +295,8 @@ ev_application_get_empty_window (EvApplication *application) for (l = windows; l != NULL; l = l->next) { EvWindow *window = EV_WINDOW (l->data); - if (ev_window_is_empty (window)) { + if (ev_window_is_empty (window) && + gtk_window_get_screen (GTK_WINDOW (window)) == screen) { empty_window = window; break; } @@ -238,6 +336,7 @@ ev_application_get_uri_window (EvApplication *application, const char *uri) void ev_application_open_uri_at_dest (EvApplication *application, const char *uri, + GdkScreen *screen, EvLinkDest *dest, EvWindowRunMode mode, guint timestamp) @@ -249,13 +348,16 @@ ev_application_open_uri_at_dest (EvApplication *application, new_window = ev_application_get_uri_window (application, uri); if (new_window == NULL) { - new_window = ev_application_get_empty_window (application); + new_window = ev_application_get_empty_window (application, screen); } if (new_window == NULL) { new_window = EV_WINDOW (ev_window_new ()); } + if (screen) + gtk_window_set_screen (GTK_WINDOW (new_window), screen); + /* We need to load uri before showing the window, so we can restore window size without flickering */ ev_window_open_uri (new_window, uri, dest, mode); @@ -275,25 +377,16 @@ ev_application_open_uri (EvApplication *application, { EvLinkDest *dest = NULL; EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL; + GdkScreen *screen = NULL; if (args) { - GValue *value = NULL; - - value = g_hash_table_lookup (args, "page-label"); - if (value) { - const gchar *page_label; - - page_label = g_value_get_string (value); - dest = ev_link_dest_new_page_label (page_label); - } - - value = g_hash_table_lookup (args, "mode"); - if (value) { - mode = g_value_get_uint (value); - } + screen = get_screen_from_args (args); + dest = get_destination_from_args (args); + mode = get_window_run_mode_from_args (args); } - ev_application_open_uri_at_dest (application, uri, dest, mode, timestamp); + ev_application_open_uri_at_dest (application, uri, screen, + dest, mode, timestamp); if (dest) g_object_unref (dest); @@ -304,13 +397,14 @@ ev_application_open_uri (EvApplication *application, void ev_application_open_uri_list (EvApplication *application, GSList *uri_list, + GdkScreen *screen, guint timestamp) { GSList *l; for (l = uri_list; l != NULL; l = l->next) { - ev_application_open_uri (application, (char *)l->data, - NULL, timestamp, NULL); + ev_application_open_uri_at_dest (application, (char *)l->data, + screen, NULL, 0, timestamp); } } diff --git a/shell/ev-application.h b/shell/ev-application.h index 880f037..09519b1 100644 --- a/shell/ev-application.h +++ b/shell/ev-application.h @@ -71,6 +71,7 @@ void ev_application_shutdown (EvApplication *application); gboolean ev_application_open_window (EvApplication *application, + GHashTable *args, guint32 timestamp, GError **error); gboolean ev_application_open_uri (EvApplication *application, @@ -80,11 +81,13 @@ gboolean ev_application_open_uri (EvApplication *applicati GError **error); void ev_application_open_uri_at_dest (EvApplication *application, const char *uri, + GdkScreen *screen, EvLinkDest *dest, EvWindowRunMode mode, guint32 timestamp); void ev_application_open_uri_list (EvApplication *application, GSList *uri_list, + GdkScreen *screen, guint32 timestamp); GList *ev_application_get_windows (EvApplication *application); diff --git a/shell/ev-window.c b/shell/ev-window.c index a88816c..dd8ae81 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -1122,7 +1122,9 @@ file_open_dialog_response_cb (GtkWidget *chooser, uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser)); - ev_application_open_uri_list (EV_APP, uris, GDK_CURRENT_TIME); + ev_application_open_uri_list (EV_APP, uris, + gtk_window_get_screen (GTK_WINDOW (ev_window)), + GDK_CURRENT_TIME); g_slist_foreach (uris, (GFunc)g_free, NULL); g_slist_free (uris); @@ -1167,14 +1169,20 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) #ifdef HAVE_GTK_RECENT static void ev_window_cmd_recent_file_activate (GtkAction *action, - GtkRecentInfo *info) + EvWindow *window) { - const gchar *uri; + GtkRecentInfo *info; + const gchar *uri; + info = g_object_get_data (G_OBJECT (action), "gtk-recent-info"); + g_assert (info != NULL); + uri = gtk_recent_info_get_uri (info); - ev_application_open_uri (EV_APP, uri, NULL, - GDK_CURRENT_TIME, NULL); + ev_application_open_uri_at_dest (EV_APP, uri, + gtk_window_get_screen (GTK_WINDOW (window)), + NULL, 0, + GDK_CURRENT_TIME); } #else static void @@ -1326,12 +1334,14 @@ ev_window_setup_recent (EvWindow *ev_window) "label", label, NULL); - g_object_weak_ref (G_OBJECT (action), - (GWeakNotify) gtk_recent_info_unref, - gtk_recent_info_ref (info)); + g_object_set_data_full (G_OBJECT (action), + "gtk-recent-info", + gtk_recent_info_ref (info), + (GDestroyNotify) gtk_recent_info_unref); + g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (ev_window_cmd_recent_file_activate), - (gpointer) info); + (gpointer) ev_window); gtk_action_group_add_action (ev_window->priv->recent_action_group, action); @@ -3605,7 +3615,9 @@ drag_data_received_cb (GtkWidget *widget, GdkDragContext *context, gnome_vfs_uri_list_free (uri_list); - ev_application_open_uri_list (EV_APP, uris, 0); + ev_application_open_uri_list (EV_APP, uris, + gtk_widget_get_screen (widget), + 0); g_slist_free (uris); } @@ -3878,6 +3890,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action) g_free (dir); ev_application_open_uri_at_dest (EV_APP, uri, + gtk_window_get_screen (GTK_WINDOW (window)), ev_link_action_get_dest (action), 0, GDK_CURRENT_TIME); diff --git a/shell/main.c b/shell/main.c index 928f7fa..56b6098 100644 --- a/shell/main.c +++ b/shell/main.c @@ -72,11 +72,31 @@ arguments_parse (void) GHashTable *args; GValue *value; EvWindowRunMode mode; + GdkScreen *screen; + GdkDisplay *display; + const gchar *display_name; + gint screen_number; args = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)value_free); + + screen = gdk_screen_get_default (); + display = gdk_screen_get_display (screen); + + display_name = gdk_display_get_name (display); + screen_number = gdk_screen_get_number (screen); + + value = g_new0 (GValue, 1); + g_value_init (value, G_TYPE_STRING); + g_value_set_string (value, display_name); + g_hash_table_insert (args, g_strdup ("display"), value); + + value = g_new0 (GValue, 1); + g_value_init (value, G_TYPE_INT); + g_value_set_int (value, screen_number); + g_hash_table_insert (args, g_strdup ("screen"), value); if (ev_page_label) { value = g_new0 (GValue, 1); @@ -111,7 +131,7 @@ load_files (const char **files, int i; if (!files) { - ev_application_open_window (EV_APP, GDK_CURRENT_TIME, NULL); + ev_application_open_window (EV_APP, args, GDK_CURRENT_TIME, NULL); return; } @@ -166,7 +186,7 @@ load_files_remote (const char **files, GdkDisplay *display; guint32 timestamp; - display = gdk_display_get_default(); + display = gdk_display_get_default (); timestamp = gdk_x11_display_get_user_time (display); connection = dbus_g_bus_get (DBUS_BUS_STARTER, &error); @@ -208,6 +228,7 @@ load_files_remote (const char **files, } #else if (!dbus_g_proxy_call (remote_object, "OpenWindow", &error, + dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), args, G_TYPE_UINT, timestamp, G_TYPE_INVALID, G_TYPE_INVALID)) { -- cgit v0.9.1