gdm r6720 - in trunk: . gui/simple-greeter



Author: halfline
Date: Fri Feb 20 02:46:40 2009
New Revision: 6720
URL: http://svn.gnome.org/viewvc/gdm?rev=6720&view=rev

Log:
2009-02-19 Ray Strode  <rstrode redhat com>

	Work better in broken randr fake clone mode

	* gui/simple-greeter/gdm-greeter-panel.c
	(get_outside_region), (get_monitor_geometry): drop
	(update_struts), (update_geometry):
	and just use gdk_screen_get_monitor_geometry.
	The logic here is wrong, so let's just solve this
	problem in a different way.

	* gui/simple-greeter/gdm-greeter-session.c
	(get_tallest_monitor_at_point), (toggle_panel):
	When picking a monitor, don't pick the first
	one in the unsorted list that happens to be
	under the pointer, but instead pick the tallest
	one in the list that's under the pointer.


Modified:
   trunk/ChangeLog
   trunk/gui/simple-greeter/gdm-greeter-panel.c
   trunk/gui/simple-greeter/gdm-greeter-session.c

Modified: trunk/gui/simple-greeter/gdm-greeter-panel.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-panel.c	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-panel.c	Fri Feb 20 02:46:40 2009
@@ -232,46 +232,6 @@
         }
 }
 
-static GdkRegion *
-get_outside_region (GdmGreeterPanel *panel)
-{
-        int        i;
-        GdkRegion *region;
-
-        region = gdk_region_new ();
-        for (i = 0; i < panel->priv->monitor; i++) {
-                GdkRectangle geometry;
-
-                gdk_screen_get_monitor_geometry (GTK_WINDOW (panel)->screen,
-                                                 i,
-                                                 &geometry);
-                gdk_region_union_with_rect (region, &geometry);
-        }
-
-        return region;
-}
-
-static void
-get_monitor_geometry (GdmGreeterPanel *panel,
-                      GdkRectangle    *geometry)
-{
-        GdkRegion   *outside_region;
-        GdkRegion   *monitor_region;
-        GdkRectangle geom;
-
-        outside_region = get_outside_region (panel);
-
-        gdk_screen_get_monitor_geometry (GTK_WINDOW (panel)->screen,
-                                         panel->priv->monitor,
-                                         &geom);
-        monitor_region = gdk_region_rectangle (&geom);
-        gdk_region_subtract (monitor_region, outside_region);
-        gdk_region_destroy (outside_region);
-
-        gdk_region_get_clipbox (monitor_region, geometry);
-        gdk_region_destroy (monitor_region);
-}
-
 static void
 set_struts (GdmGreeterPanel *panel,
             int              x,
@@ -332,7 +292,9 @@
 {
         GdkRectangle geometry;
 
-        get_monitor_geometry (panel, &geometry);
+        gdk_screen_get_monitor_geometry (GTK_WINDOW (panel)->screen,
+                                         panel->priv->monitor,
+                                         &geometry);
 
         /* FIXME: assumes only one panel */
         set_struts (panel,
@@ -348,7 +310,9 @@
 {
         GdkRectangle geometry;
 
-        get_monitor_geometry (panel, &geometry);
+        gdk_screen_get_monitor_geometry (GTK_WINDOW (panel)->screen,
+                                         panel->priv->monitor,
+                                         &geometry);
 
         panel->priv->geometry.width = geometry.width;
         panel->priv->geometry.height = requisition->height + 2 * GTK_CONTAINER (panel)->border_width;

Modified: trunk/gui/simple-greeter/gdm-greeter-session.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-session.c	(original)
+++ trunk/gui/simple-greeter/gdm-greeter-session.c	Fri Feb 20 02:46:40 2009
@@ -267,6 +267,43 @@
         gdm_greeter_client_call_start_session_when_ready (session->priv->client, TRUE);
 }
 
+static int
+get_tallest_monitor_at_point (GdkScreen *screen,
+                              int        x,
+                              int        y)
+{
+        GdkRectangle area;
+        GdkRegion *region;
+        int i;
+        int monitor;
+        int n_monitors;
+        int tallest_height;
+
+        monitor = gdk_screen_get_monitor_at_point (screen, x, y);
+
+        tallest_height = 0;
+        n_monitors = gdk_screen_get_n_monitors (screen);
+        monitor = -1;
+        for (i = 0; i < n_monitors; i++) {
+                gdk_screen_get_monitor_geometry (screen, i, &area);
+                region = gdk_region_rectangle (&area);
+
+                if (gdk_region_point_in (region, x, y)) {
+                        if (area.height > tallest_height) {
+                                monitor = i;
+                                tallest_height = area.height;
+                        }
+                }
+                gdk_region_destroy (region);
+        }
+
+        if (monitor == -1) {
+                monitor = gdk_screen_get_monitor_at_point (screen, x, y);
+        }
+
+        return monitor;
+}
+
 static void
 toggle_panel (GdmGreeterSession *session,
               gboolean           enabled)
@@ -281,7 +318,8 @@
 
                 display = gdk_display_get_default ();
                 gdk_display_get_pointer (display, &screen, &x, &y, NULL);
-                monitor = gdk_screen_get_monitor_at_point (screen, x, y);
+
+                monitor = get_tallest_monitor_at_point (screen, x, y);
 
                 session->priv->panel = gdm_greeter_panel_new (screen, monitor);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]