]> www.fi.muni.cz Git - evince.git/commitdiff
Add support for multiscreen systems. Fixes bug #316206.
authorCarlos Garcia Campos <carlosgc@gnome.org>
Tue, 31 Oct 2006 19:40:45 +0000 (19:40 +0000)
committerCarlos Garcia Campos <carlosgc@src.gnome.org>
Tue, 31 Oct 2006 19:40:45 +0000 (19:40 +0000)
2006-10-31  Carlos Garcia Campos  <carlosgc@gnome.org>
* 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.

ChangeLog
shell/ev-application-service.xml
shell/ev-application.c
shell/ev-application.h
shell/ev-window.c
shell/main.c

index 2f88c96ed24506a5e225b90969a7d2b1dd2f8b2b..d22f7cb1d0025eec429691b8b889891a91d775ea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2006-10-31  Carlos Garcia Campos  <carlosgc@gnome.org>
+
+       * 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  <carlosgc@gnome.org>
 
        * shell/ev-jobs.[ch]: (ev_job_print_new),
index 4ef2cfa304616553ae395f906925333da6d30e64..f56bf0bac6c464806147a7eab6a56add6f80d4e8 100644 (file)
@@ -6,7 +6,8 @@
     <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="ev_application"/>
 
     <method name="OpenWindow">
-      <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="ev_application_open_window"/>
+       <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="ev_application_open_window"/>
+       <arg type="a{sv}" name="args" direction="in"/>
       <arg type="u" name="timestamp" direction="in"/>
     </method>
 
index 386b86ee5ffd1df6bea82c61f6efe911472ecf56..388c8d276d5dea5ac9d4af345b80f0ff34fbafa7 100644 (file)
@@ -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);
        }
 }
 
index 880f0377a3c24bb476bd8661bf56eab7db970bb9..09519b1e3496e37b75365e042d42537a02fe0b0e 100644 (file)
@@ -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);
 
index a88816c859f8b66ec623373a7d9e36b263132191..dd8ae817d99c74213ccba28c3d9470e15240addc 100644 (file)
@@ -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);
index 928f7fa8dd16a8a028243d4b83f72b3783aaf645..56b6098a55b4caec8126c782f6f6f31534e64451 100644 (file)
@@ -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)) {