[Xfce4-commits] <xfwm4:master> Compute screen size based on each monitor size and layout and avoid using reported size (bug #5795)

Olivier Fourdan noreply at xfce.org
Sun Oct 11 11:24:01 CEST 2009


Updating branch refs/heads/master
         to ba38bf2c5240a5663a47827b3a516c3bd9ddab91 (commit)
       from c4f0fdf689601169fc9bd75e422b2351d6539a6c (commit)

commit ba38bf2c5240a5663a47827b3a516c3bd9ddab91
Author: Olivier Fourdan <fourdan at xfce.org>
Date:   Sun Oct 11 11:22:07 2009 +0200

    Compute screen size based on each monitor size and layout and avoid using reported size (bug #5795)

 src/events.c |   12 ++----------
 src/screen.c |   39 ++++++++++++++++++++++++++++++++++++++-
 src/screen.h |    1 +
 3 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/events.c b/src/events.c
index f0148f7..b4e860b 100644
--- a/src/events.c
+++ b/src/events.c
@@ -2716,7 +2716,6 @@ size_changed_cb(GdkScreen *gscreen, gpointer data)
 {
     ScreenInfo *screen_info;
     DisplayInfo *display_info;
-    int new_width, new_height;
 
     TRACE ("entering size_changed_cb");
 
@@ -2738,21 +2737,14 @@ size_changed_cb(GdkScreen *gscreen, gpointer data)
      * If the overall size of the screen hasn't changed,
      * there is no need to continue any further...
      */
-    new_width  = WidthOfScreen (screen_info->xscreen);
-    new_height = HeightOfScreen (screen_info->xscreen);
-
-    if ((screen_info->width  == new_width) &&
-        (screen_info->height == new_height))
+    if (!myScreenComputeSize (screen_info))
     {
         return;
     }
-
     display_info = screen_info->display_info;
-    screen_info->width = new_width;
-    screen_info->height = new_height;
 
     setNetWorkarea (display_info, screen_info->xroot, screen_info->workspace_count,
-                    new_width, new_height, screen_info->margins);
+                    screen_info->width, screen_info->height, screen_info->margins);
     placeSidewalks (screen_info, screen_info->params->wrap_workspaces);
     clientScreenResize (screen_info);
     compositorUpdateScreenSize (screen_info);
diff --git a/src/screen.c b/src/screen.c
index e7b8a2a..2d39a77 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -531,6 +531,8 @@ myScreenGetKeyPressed (ScreenInfo *screen_info, XKeyEvent * ev)
 {
     int key, state;
 
+    TRACE ("entering myScreenGetKeyPressed");
+
     state = ev->state & MODIFIER_MASK;
     for (key = 0; key < KEY_COUNT; key++)
     {
@@ -566,10 +568,42 @@ myScreenGetClientFromWindow (ScreenInfo *screen_info, Window w, unsigned short m
     return NULL;
 }
 
+gboolean
+myScreenComputeSize (ScreenInfo *screen_info)
+{
+    gint num_monitors, i;
+    gint width, height;
+    GdkRectangle monitor;
+    gboolean changed;
+
+    g_return_val_if_fail (screen_info != NULL, FALSE);
+    g_return_val_if_fail (GDK_IS_SCREEN (screen_info->gscr), FALSE);
+    TRACE ("entering myScreenComputeSize");
+
+    width = 0;
+    height = 0;
+    num_monitors = gdk_screen_get_n_monitors (screen_info->gscr);
+
+    for (i = 0; i < num_monitors; i++)
+    {
+        gdk_screen_get_monitor_geometry (screen_info->gscr, i, &monitor);
+        width = MAX (monitor.x + monitor.width, width);
+        height = MAX (monitor.y + monitor.height, height);
+    }
+
+    changed = ((screen_info->width != width) | (screen_info->height != height));
+    screen_info->width = width;
+    screen_info->height != height;
+    TRACE ("myScreenComputeSize(): width=%i, height=%i", width, height);
+
+    return changed;
+}
+
 void
 myScreenInvalidateMonitorCache (ScreenInfo *screen_info)
 {
     g_return_if_fail (screen_info != NULL);
+    TRACE ("entering myScreenInvalidateMonitorCache");
 
     screen_info->cache_monitor.x = G_MAXINT;
     screen_info->cache_monitor.y = G_MAXINT;
@@ -591,6 +625,7 @@ myScreenFindMonitorAtPoint (ScreenInfo *screen_info, gint x, gint y, GdkRectangl
     g_return_if_fail (screen_info != NULL);
     g_return_if_fail (rect != NULL);
     g_return_if_fail (GDK_IS_SCREEN (screen_info->gscr));
+    TRACE ("entering myScreenFindMonitorAtPoint");
 
     /* Cache system */
     if ((x >= screen_info->cache_monitor.x) && (x < screen_info->cache_monitor.x + screen_info->cache_monitor.width) &&
@@ -643,6 +678,9 @@ myScreenUpdateFontHeight (ScreenInfo *screen_info)
     PangoLanguage *language;
     GtkWidget *widget;
 
+    g_return_val_if_fail (screen_info != NULL, FALSE);
+    TRACE ("entering myScreenUpdateFontHeight");
+
     widget = myScreenGetGtkWidget (screen_info);
     context = getUIPangoContext (widget);
     desc = getUIPangoFontDesc (widget);
@@ -660,5 +698,4 @@ myScreenUpdateFontHeight (ScreenInfo *screen_info)
     }
 
     return FALSE;
-
 }
diff --git a/src/screen.h b/src/screen.h
index 8c4b0ac..894e96c 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -212,6 +212,7 @@ int                      myScreenGetKeyPressed                  (ScreenInfo *,
 Client                  *myScreenGetClientFromWindow            (ScreenInfo *,
                                                                  Window,
                                                                  unsigned short);
+gboolean                 myScreenComputeSize                    (ScreenInfo *);
 void                     myScreenInvalidateMonitorCache         (ScreenInfo *);
 void                     myScreenFindMonitorAtPoint             (ScreenInfo *,
                                                                  gint,



More information about the Xfce4-commits mailing list