Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2006-10-31 19:40:45 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2006-10-31 19:40:45 (GMT)
commit64d6ea86fc5614af0004c3e6e84d21706b04d56d (patch)
tree871874b4d16b870cd62743741484281d0b3f803f /shell
parent133ed2fb65129c8a36f674c06ae693f8ef77f77a (diff)
Add support for multiscreen systems. Fixes bug #316206.
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.
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-application-service.xml3
-rw-r--r--shell/ev-application.c134
-rw-r--r--shell/ev-application.h3
-rw-r--r--shell/ev-window.c33
-rw-r--r--shell/main.c25
5 files changed, 165 insertions, 33 deletions
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 @@
<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>
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)) {