Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-application.c
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/ev-application.c
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/ev-application.c')
-rw-r--r--shell/ev-application.c134
1 files changed, 114 insertions, 20 deletions
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);
}
}