Author: post
Date: 2010-11-15 20:27:13 +0100 (Mon, 15 Nov 2010)
New Revision: 3624

Modified:
   trunk/src/gtk-interface.c
Log:
Multiscreen preview: First request all displays, then request all screens on 
that display. Hopefully this will work on more systems.

Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c   2010-11-14 15:34:51 UTC (rev 3623)
+++ trunk/src/gtk-interface.c   2010-11-15 19:27:13 UTC (rev 3624)
@@ -405,6 +405,7 @@
        preview_fullscreen_filler = gtk_label_new(_("Press F10 to return 
preview to this window"));
        gtk_container_add(GTK_CONTAINER(frame_preview_toolbox), 
preview_fullscreen_filler);
 
+       gtk_widget_show_all(GTK_WIDGET(frame_preview_toolbox));
        gtk_widget_show_all(rs->window_preview_screen);
        rs_conf_set_boolean("fullscreen-preview", TRUE);
 }
@@ -472,11 +473,29 @@
        if (waiting_for_user_selects_screen)
                return;
 
-       GdkDisplay *display = gdk_display_get_default();
-       int num_screens = gdk_display_get_n_screens(display);
+       /* For some obscure reason, if seems that 
gdk_display_manager_list_displays(..) */
+       /* returns one display on first call, two on second and so on. */
+       /* Therefore we have the display list as a static variable. */
+       /* I guess you have to restart Rawstudio to detect new displays */
+       static GSList *disps = NULL;
+       GdkDisplayManager *disp_man = gdk_display_manager_get();
+       if (!disps)
+               disps = gdk_display_manager_list_displays(disp_man);
 
-       if (num_screens <= 1)
+       GSList *cdisp = disps;
+       GSList *all_screens = NULL;
+       gint total_screens = 0;
+       do {
+               gint num_screens = 
gdk_display_get_n_screens((GdkDisplay*)cdisp->data);
+               total_screens += num_screens;
+               gint i;
+               for (i = 0; i < num_screens; i++)
+                       all_screens = g_slist_append(all_screens, 
gdk_display_get_screen(cdisp->data, i));
+       } while ((cdisp = cdisp->next));
+
+       if (total_screens <= 1)
        {
+               g_slist_free(all_screens);
                gui_status_notify(_("Unable to detect more than one display. 
Cannot open offscreen preview"));
                return;
        }
@@ -487,11 +506,11 @@
        gchar *main_screen_name = gdk_screen_make_display_name(main_screen);
 
        /* If two displays, just open on the other */
-       if (num_screens == 2)
+       if (total_screens == 2)
        {
-               GdkScreen *first_screen = gdk_display_get_screen(display, 0);
+               GdkScreen *first_screen = all_screens->data;
                gchar *first_screen_name = 
gdk_screen_make_display_name(first_screen);
-               GdkScreen *second_screen = gdk_display_get_screen(display, 1);
+               GdkScreen *second_screen = all_screens->next->data;
                gchar *second_screen_name = 
gdk_screen_make_display_name(second_screen);
                if (!g_strcmp0(first_screen_name, main_screen_name))
                {
@@ -516,9 +535,9 @@
                info->rs = rs;
                gint i;
                waiting_for_user_selects_screen = TRUE;
-               for (i = 0; i < num_screens; i++)
+               for (i = 0; i < total_screens; i++)
                {
-                       GdkScreen *screen = gdk_display_get_screen(display, i);
+                       GdkScreen *screen = 
GDK_SCREEN(g_slist_nth_data(all_screens, i));
                        gchar *screen_name = 
gdk_screen_make_display_name(screen);
                        if (0 != g_strcmp0(screen_name, main_screen_name))
                        {
@@ -541,6 +560,7 @@
                info->all_window_widgets = screen_widgets;
        }
        g_free(main_screen_name);
+       g_slist_free(all_screens);
 }
 
 static void


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to