Author: olivier
Date: 2006-07-16 16:56:18 +0000 (Sun, 16 Jul 2006)
New Revision: 22464

Modified:
   xfwm4/trunk/src/client.c
   xfwm4/trunk/src/events.c
   xfwm4/trunk/src/frame.c
   xfwm4/trunk/src/settings.c
   xfwm4/trunk/src/settings.h
Log:
Implement borderless full maximization (bug #1750)

Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c    2006-07-16 16:53:07 UTC (rev 22463)
+++ xfwm4/trunk/src/client.c    2006-07-16 16:56:18 UTC (rev 22464)
@@ -519,7 +519,8 @@
     TRACE ("setting width %i for client \"%s\" (0x%lx)", w1, c->name,
         c->window);
 
-    if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+    if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) ||
+        FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         /* Bypass resize increment and max sizes for fullscreen */
         c->width = w1;
@@ -562,7 +563,8 @@
     TRACE ("setting height %i for client \"%s\" (0x%lx)", h1, c->name,
         c->window);
 
-    if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+    if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN) ||
+        FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         /* Bypass resize increment and max sizes for fullscreen */
         c->height = h1;
@@ -738,7 +740,7 @@
         switch (wc->stack_mode)
         {
             /*
-             * Limitation: we don't support neither sibling,
+             * Limitation: we don't support neither
              * TopIf, BottomIf nor Opposite ...
              */
             case Above:
@@ -1260,7 +1262,7 @@
     TRACE ("entering clientApplyInitialState");
 
     /* We check that afterwards to make sure all states are now known */
-    if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ | 
CLIENT_FLAG_MAXIMIZED_VERT))
+    if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_MAXIMIZE))
         {
@@ -2735,8 +2737,7 @@
 
     g_return_if_fail (c != NULL);
     TRACE ("entering clientToggleMaximized");
-    TRACE ("maximzing/unmaximizing client \"%s\" (0x%lx)", c->name,
-        c->window);
+    TRACE ("maximzing/unmaximizing client \"%s\" (0x%lx)", c->name, c->window);
 
     screen_info = c->screen_info;
 
@@ -2757,33 +2758,43 @@
                   rect.x + rect.width) - full_x;
     full_h = MIN (screen_info->height - 
screen_info->params->xfwm_margins[BOTTOM],
                   rect.y + rect.height) - full_y;
+    /* Adjust size to the largest size available, not covering struts */
+    clientMaxSpace (screen_info, &full_x, &full_y, &full_w, &full_h);
 
-    if (((mode & WIN_STATE_MAXIMIZED_HORIZ) && !FLAG_TEST (c->flags, 
CLIENT_FLAG_MAXIMIZED_HORIZ)) &&
-        ((mode & WIN_STATE_MAXIMIZED_VERT) && !FLAG_TEST (c->flags, 
CLIENT_FLAG_MAXIMIZED_VERT)))
-    {
-        /* Adjust size to the largest size available, not covering struts */
-        clientMaxSpace (screen_info, &full_x, &full_y, &full_w, &full_h);
-    }
-    else if ((mode & WIN_STATE_MAXIMIZED_HORIZ) && !FLAG_TEST (c->flags, 
CLIENT_FLAG_MAXIMIZED_HORIZ))
-    {
-        int tmp_y, tmp_h;
+    wc.x = c->x;
+    wc.y = c->y;
+    wc.width = c->width;
+    wc.height = c->height;
 
-        tmp_y = frameY (c); 
-        tmp_h = frameHeight (c);
-        /* Adjust size to the widest size available, for the current vertical 
position/height */
-        clientMaxSpace (screen_info, &full_x, &tmp_y, &full_w, &tmp_h);
-    }
-    else if ((mode & WIN_STATE_MAXIMIZED_VERT) && !FLAG_TEST (c->flags, 
CLIENT_FLAG_MAXIMIZED_VERT))
+    if ((mode & WIN_STATE_MAXIMIZED_HORIZ) && (mode & 
WIN_STATE_MAXIMIZED_VERT))
     {
-        int tmp_x, tmp_w;
-        
-        tmp_x = frameX (c);
-        tmp_w = frameWidth (c);
-        /* Adjust size to the tallest size available, for the current 
horizontal position/width */
-        clientMaxSpace (screen_info, &tmp_x, &full_y, &tmp_w, &full_h);
+        if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED))
+        {
+            if (restore_position)
+            {
+                c->old_x = c->x;
+                c->old_y = c->y;
+                c->old_width = c->width;
+                c->old_height = c->height;
+            }
+            c->win_state |= (WIN_STATE_MAXIMIZED_HORIZ | 
WIN_STATE_MAXIMIZED_VERT);
+            FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED);
+            wc.x = full_x + frameLeft (c);
+            wc.y = full_y + frameTop (c);
+            wc.width = full_w - frameLeft (c) - frameRight (c);
+            wc.height = full_h - frameTop (c) - frameBottom (c);
+        }
+        else
+        {
+            c->win_state &= ~(WIN_STATE_MAXIMIZED_HORIZ | 
WIN_STATE_MAXIMIZED_VERT);
+            FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED);
+            wc.x = c->old_x;
+            wc.y = c->old_y;
+            wc.width = c->old_width;
+            wc.height = c->old_height;
+        }
     }
-
-    if (mode & WIN_STATE_MAXIMIZED_HORIZ)
+    else if (mode & WIN_STATE_MAXIMIZED_HORIZ)
     {
         if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ))
         {
@@ -2792,27 +2803,21 @@
                 c->old_x = c->x;
                 c->old_width = c->width;
             }
+            c->win_state |= WIN_STATE_MAXIMIZED_HORIZ;
+            FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ);
             wc.x = full_x + frameLeft (c);
             wc.width = full_w - frameLeft (c) - frameRight (c);
-            c->win_state |= WIN_STATE_MAXIMIZED_HORIZ;
-            FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ);
         }
         else
         {
+            c->win_state &= ~WIN_STATE_MAXIMIZED_HORIZ;
+            FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ);
             wc.x = c->old_x;
             wc.width = c->old_width;
-            c->win_state &= ~WIN_STATE_MAXIMIZED_HORIZ;
-            FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ);
         }
     }
-    else
+    else if (mode & WIN_STATE_MAXIMIZED_VERT)
     {
-        wc.x = c->x;
-        wc.width = c->width;
-    }
-
-    if (mode & WIN_STATE_MAXIMIZED_VERT)
-    {
         if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT))
         {
             if (restore_position)
@@ -2820,24 +2825,19 @@
                 c->old_y = c->y;
                 c->old_height = c->height;
             }
+            c->win_state |= WIN_STATE_MAXIMIZED_VERT;
+            FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED_VERT);
             wc.y = full_y + frameTop (c);
             wc.height = full_h - frameTop (c) - frameBottom (c);
-            c->win_state |= WIN_STATE_MAXIMIZED_VERT;
-            FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED_VERT);
         }
         else
         {
+            c->win_state &= ~WIN_STATE_MAXIMIZED_VERT;
+            FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_VERT);
             wc.y = c->old_y;
             wc.height = c->old_height;
-            c->win_state &= ~WIN_STATE_MAXIMIZED_VERT;
-            FLAG_UNSET (c->flags, CLIENT_FLAG_MAXIMIZED_VERT);
         }
     }
-    else
-    {
-        wc.y = c->y;
-        wc.height = c->height;
-    }
 
     c->x = wc.x;
     c->y = wc.y;
@@ -3665,6 +3665,7 @@
     g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
     g2 = myScreenGrabPointer (screen_info, ButtonMotionMask | 
ButtonReleaseMask, 
                               cursor, myDisplayGetCurrentTime (display_info));
+    XFlush (myScreenGetXDisplay (screen_info));
     if (!g1 || !g2)
     {
         TRACE ("grab failed in clientMove");
@@ -4141,6 +4142,11 @@
     TRACE ("entering clientResize");
     TRACE ("resizing client \"%s\" (0x%lx)", c->name, c->window);
 
+    if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+    {
+        return;
+    }
+
     screen_info = c->screen_info;
     display_info = screen_info->display_info;
 
@@ -4175,6 +4181,7 @@
     g2 = myScreenGrabPointer (screen_info, ButtonMotionMask | 
ButtonReleaseMask, 
                               myDisplayGetCursorResize(display_info, 
passdata.corner), 
                               myDisplayGetCurrentTime (display_info));
+    XFlush (myScreenGetXDisplay (screen_info));
 
     if (!g1 || !g2)
     {
@@ -4398,6 +4405,7 @@
 
     g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
     g2 = myScreenGrabPointer (screen_info, NoEventMask,  None, 
myDisplayGetCurrentTime (display_info));
+    XFlush (myScreenGetXDisplay (screen_info));
 
     if (!g1 || !g2)
     {

Modified: xfwm4/trunk/src/events.c
===================================================================
--- xfwm4/trunk/src/events.c    2006-07-16 16:53:07 UTC (rev 22463)
+++ xfwm4/trunk/src/events.c    2006-07-16 16:56:18 UTC (rev 22464)
@@ -1351,6 +1351,13 @@
 
             ev->value_mask |= (CWX | CWY | CWWidth | CWHeight);
         }
+        else if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+        {
+            wc.x = c->x;
+            wc.y = c->y;
+            wc.width = c->width;
+            wc.height = c->height;
+        }
         /* Clean up buggy requests that set all flags */
         if ((ev->value_mask & CWX) && (wc.x == c->x))
         {

Modified: xfwm4/trunk/src/frame.c
===================================================================
--- xfwm4/trunk/src/frame.c     2006-07-16 16:53:07 UTC (rev 22463)
+++ xfwm4/trunk/src/frame.c     2006-07-16 16:56:18 UTC (rev 22464)
@@ -40,7 +40,7 @@
 int
 frameDecorationLeft (ScreenInfo *screen_info)
 {
-    TRACE ("entering frameLeft");
+    TRACE ("entering frameDecorationLeft");
 
     g_return_val_if_fail (screen_info != NULL, 0);
     return screen_info->sides[SIDE_LEFT][ACTIVE].width;
@@ -49,7 +49,7 @@
 int
 frameDecorationRight (ScreenInfo *screen_info)
 {
-    TRACE ("entering frameLeft");
+    TRACE ("entering frameDecorationRight");
 
     g_return_val_if_fail (screen_info != NULL, 0);
     return screen_info->sides[SIDE_RIGHT][ACTIVE].width;
@@ -58,7 +58,7 @@
 int
 frameDecorationTop (ScreenInfo *screen_info)
 {
-    TRACE ("entering frameLeft");
+    TRACE ("entering frameDecorationTop");
 
     g_return_val_if_fail (screen_info != NULL, 0);
     return screen_info->title[TITLE_3][ACTIVE].height;
@@ -67,7 +67,7 @@
 int
 frameDecorationBottom (ScreenInfo *screen_info)
 {
-    TRACE ("entering frameLeft");
+    TRACE ("entering frameDecorationBottom");
 
     g_return_val_if_fail (screen_info != NULL, 0);
     return screen_info->sides[SIDE_BOTTOM][ACTIVE].height;
@@ -80,7 +80,8 @@
 
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+        && !FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         return c->screen_info->sides[SIDE_LEFT][ACTIVE].width;
     }
@@ -94,7 +95,8 @@
 
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+        && !FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         return c->screen_info->sides[SIDE_RIGHT][ACTIVE].width;
     }
@@ -122,7 +124,8 @@
 
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+        && !FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         return c->screen_info->sides[SIDE_BOTTOM][ACTIVE].height;
     }
@@ -136,7 +139,8 @@
 
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+        && !FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         return c->x - frameLeft (c);
     }
@@ -164,7 +168,8 @@
 
     g_return_val_if_fail (c != NULL, 0);
     if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)
-        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+        && !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)
+        && !FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
     {
         return c->width + frameLeft (c) + frameRight (c);
     }
@@ -191,6 +196,37 @@
     return c->height;
 }
 
+static int
+frameTopLeftWidth (Client * c, int state)
+{
+    if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+    {
+        return 0;
+    }
+    return c->screen_info->corners[CORNER_TOP_LEFT][state].width;
+
+}
+
+static int
+frameTopRightWidth (Client * c, int state)
+{
+    if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+    {
+        return 0;
+    }
+    return c->screen_info->corners[CORNER_TOP_RIGHT][state].width;
+}
+
+static int
+frameButtonOffset (Client *c)
+{
+    if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+    {
+        return MAX (0, c->screen_info->params->maximized_offset);
+    }
+    return c->screen_info->params->button_offset;
+}
+
 static void
 frameCreateTitlePixmap (Client * c, int state, int left, int right, xfwmPixmap 
* pm)
 {
@@ -219,8 +255,7 @@
         right = temp;
     }
 
-    width = frameWidth (c) - 
screen_info->corners[CORNER_TOP_LEFT][state].width -
-            screen_info->corners[CORNER_TOP_RIGHT][state].width;
+    width = frameWidth (c) - frameTopLeftWidth (c, state) - frameTopRightWidth 
(c, state);
     if (width < 1)
     {
         pm->pixmap = None;
@@ -230,21 +265,21 @@
         return;
     }
 
-    if (left < screen_info->corners[CORNER_TOP_LEFT][state].width)
+    if (left < frameTopLeftWidth (c, state))
     {
-        left = screen_info->corners[CORNER_TOP_LEFT][state].width;
+        left = frameTopLeftWidth (c, state);
     }
-    if (right > frameWidth (c) - 
screen_info->corners[CORNER_TOP_RIGHT][state].width)
+    if (right > frameWidth (c) - frameTopRightWidth (c, state))
     {
-        right = frameWidth (c) - 
screen_info->corners[CORNER_TOP_RIGHT][state].width;
+        right = frameWidth (c) - frameTopRightWidth (c, state);
     }
-    if (right < screen_info->corners[CORNER_TOP_LEFT][state].width)
+    if (right < frameTopLeftWidth (c, state))
     {
-        right = screen_info->corners[CORNER_TOP_LEFT][state].width;
+        right = frameTopLeftWidth (c, state);
     }
 
-    left = left - screen_info->corners[CORNER_TOP_LEFT][state].width;
-    right = right - screen_info->corners[CORNER_TOP_LEFT][state].width;
+    left = left - frameTopLeftWidth (c, state);
+    right = right - frameTopLeftWidth (c, state);
 
     x = 0;
     hoffset = 0;
@@ -275,7 +310,7 @@
                 hoffset = w3 - logical_rect.width - 
screen_info->params->title_horizontal_offset;
                 break;
             case ALIGN_CENTER:
-                hoffset = (w3 >> 1) - (logical_rect.width >> 1);
+                hoffset = (w3 / 2) - (logical_rect.width / 2);
                 break;
         }
         if (hoffset < screen_info->params->title_horizontal_offset)
@@ -304,7 +339,7 @@
                 w1 = right - w2 - w3 - w4 - 
screen_info->params->title_horizontal_offset;
                 break;
             case ALIGN_CENTER:
-                w1 = left + ((right - left) / 2) - (w3 >> 1) - w2;
+                w1 = left + ((right - left) / 2) - (w3 / 2) - w2;
                 break;
         }
         if (w1 < left)
@@ -537,7 +572,7 @@
     XRectangle rect;
     xfwmPixmap *my_pixmap;
     int i;
-   
+
     TRACE ("entering frameSetShape");
     TRACE ("setting shape for client (0x%lx)", c->window);
 
@@ -624,29 +659,32 @@
             }
         }
 
-        if (screen_info->corners[CORNER_TOP_LEFT][state].height > frameHeight 
(c) - frameBottom (c) + 1)
+        if (xfwmWindowVisible (&c->corners[CORNER_TOP_LEFT]) &&
+            (screen_info->corners[CORNER_TOP_LEFT][state].height > frameHeight 
(c) - frameBottom (c) + 1))
         {
             rect.x      = 0;
             rect.y      = frameHeight (c) - frameBottom (c) + 1;
-            rect.width  = screen_info->corners[CORNER_TOP_LEFT][state].width;
+            rect.width  = frameTopLeftWidth (c, state);
             rect.height = screen_info->corners[CORNER_TOP_LEFT][state].height
                            - (frameHeight (c) - frameBottom (c) + 1);
             XShapeCombineRectangles (display_info->dpy, MYWINDOW_XWINDOW 
(c->corners[CORNER_TOP_LEFT]), 
                                      ShapeBounding, 0, 0, &rect, 1, 
ShapeSubtract, 0);
         }
 
-        if (screen_info->corners[CORNER_TOP_RIGHT][state].height > frameHeight 
(c) - frameBottom (c) + 1)
+        if (xfwmWindowVisible (&c->corners[CORNER_TOP_RIGHT]) &&
+            (screen_info->corners[CORNER_TOP_RIGHT][state].height > 
frameHeight (c) - frameBottom (c) + 1))
         {
             rect.x      = 0;
             rect.y      = frameHeight (c) - frameBottom (c) + 1;
-            rect.width  = screen_info->corners[CORNER_TOP_RIGHT][state].width;
+            rect.width  = frameTopRightWidth (c, state);
             rect.height = screen_info->corners[CORNER_TOP_RIGHT][state].height
                            - (frameHeight (c) - frameBottom (c) + 1);
             XShapeCombineRectangles (display_info->dpy, MYWINDOW_XWINDOW 
(c->corners[CORNER_TOP_RIGHT]),
                                      ShapeBounding, 0, 0, &rect, 1, 
ShapeSubtract, 0);
         }
 
-        if (screen_info->corners[CORNER_BOTTOM_LEFT][state].height > 
frameHeight (c) - frameTop (c) + 1)
+        if (xfwmWindowVisible (&c->corners[CORNER_BOTTOM_LEFT]) &&
+            (screen_info->corners[CORNER_BOTTOM_LEFT][state].height > 
frameHeight (c) - frameTop (c) + 1))
         {
             rect.x      = 0;
             rect.y      = 0;
@@ -657,7 +695,8 @@
                                      ShapeBounding, 0, 0, &rect, 1, 
ShapeSubtract, 0);
         }
 
-        if (screen_info->corners[CORNER_BOTTOM_RIGHT][state].height > 
frameHeight (c) - frameTop (c) + 1)
+        if (xfwmWindowVisible (&c->corners[CORNER_BOTTOM_RIGHT]) &&
+            (screen_info->corners[CORNER_BOTTOM_RIGHT][state].height > 
frameHeight (c) - frameTop (c) + 1))
         {
             rect.x      = 0;
             rect.y      = 0;
@@ -686,7 +725,7 @@
         if (xfwmWindowVisible (&c->title))
         {
             XShapeCombineShape (display_info->dpy, temp, ShapeBounding,
-                                
screen_info->corners[CORNER_TOP_LEFT][state].width, 0,
+                                frameTopLeftWidth (c, state), 0,
                                 MYWINDOW_XWINDOW (c->title), ShapeBounding, 
ShapeUnion);
         }
 
@@ -723,7 +762,7 @@
         if (xfwmWindowVisible (&c->corners[CORNER_TOP_RIGHT]))
         {
             XShapeCombineShape (display_info->dpy, temp, ShapeBounding,
-                                frameWidth (c) - 
screen_info->corners[CORNER_TOP_RIGHT][state].width,
+                                frameWidth (c) - frameTopRightWidth (c, state),
                                 0, MYWINDOW_XWINDOW 
(c->corners[CORNER_TOP_RIGHT]), ShapeBounding, ShapeUnion);
         }
         
@@ -862,8 +901,12 @@
         }
 
         /* Then, show the ones that we do have on left... */
-        x = frameLeft (c) + screen_info->params->button_offset;
-        right = frameWidth (c) - frameRight (c) - 
screen_info->params->button_offset;
+        x = frameLeft (c) + frameButtonOffset (c);
+        if (x < 0)
+        {
+            x = 0;
+        }
+        right = frameWidth (c) - frameRight (c) - frameButtonOffset (c);
         for (i = 0; i < strlen (screen_info->params->button_layout); i++)
         {
             button = getButtonFromLetter 
(screen_info->params->button_layout[i], c);
@@ -898,7 +941,7 @@
 
         /* and those that we do have on right... */
         x = frameWidth (c) - frameRight (c) + 
screen_info->params->button_spacing -
-            screen_info->params->button_offset;
+            frameButtonOffset (c);
         for (j = strlen (screen_info->params->button_layout) - 1; j >= i; j--)
         {
             button = getButtonFromLetter 
(screen_info->params->button_layout[j], c);
@@ -932,18 +975,13 @@
         left = left - 2 * screen_info->params->button_spacing;
         right = x;
 
-        top_width =
-            frameWidth (c) - 
screen_info->corners[CORNER_TOP_LEFT][state].width -
-            screen_info->corners[CORNER_TOP_RIGHT][state].width;
-        bottom_width =
-            frameWidth (c) -
+        top_width = frameWidth (c) - frameTopLeftWidth (c, state) - 
frameTopRightWidth (c, state);
+        bottom_width = frameWidth (c) -
             screen_info->corners[CORNER_BOTTOM_LEFT][state].width -
             screen_info->corners[CORNER_BOTTOM_RIGHT][state].width;
-        left_height =
-            frameHeight (c) - frameTop (c) -
+        left_height = frameHeight (c) - frameTop (c) -
             screen_info->corners[CORNER_BOTTOM_LEFT][state].height;
-        right_height =
-            frameHeight (c) - frameTop (c) -
+        right_height = frameHeight (c) - frameTop (c) -
             screen_info->corners[CORNER_BOTTOM_RIGHT][state].height;
 
         if (c->pm_cache.pm_title[state].pixmap == None)
@@ -1015,37 +1053,51 @@
                 right_height, (requires_clearing | height_changed));
         }
 
-        xfwmWindowShow (&c->title,
-            screen_info->corners[CORNER_TOP_LEFT][state].width, 0, top_width,
-            frameTop (c), (requires_clearing | title_changed));
-        xfwmWindowShow (&c->sides[SIDE_BOTTOM],
-            screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
-            frameHeight (c) - frameBottom (c), bottom_width, frameBottom (c),
-            (requires_clearing | width_changed));
-        xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0,
-            screen_info->corners[CORNER_TOP_LEFT][state].width,
-            screen_info->corners[CORNER_TOP_LEFT][state].height,
-            requires_clearing);
-        xfwmWindowShow (&c->corners[CORNER_TOP_RIGHT],
-            frameWidth (c) - 
screen_info->corners[CORNER_TOP_RIGHT][state].width,
-            0, screen_info->corners[CORNER_TOP_RIGHT][state].width,
-            screen_info->corners[CORNER_TOP_RIGHT][state].height,
-            requires_clearing);
-        xfwmWindowShow (&c->corners[CORNER_BOTTOM_LEFT], 0,
-            frameHeight (c) -
-            screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
-            screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
-            screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
-            requires_clearing);
-        xfwmWindowShow (&c->corners[CORNER_BOTTOM_RIGHT],
-            frameWidth (c) -
-            screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
-            frameHeight (c) -
-            screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
-            screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
-            screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
-            requires_clearing);
-
+        if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+        {
+            xfwmWindowShow (&c->title, 0, 0, top_width, frameTop (c), 
+                (requires_clearing | title_changed));
+            xfwmWindowHide (&c->sides[SIDE_LEFT]);
+            xfwmWindowHide (&c->sides[SIDE_RIGHT]);
+            xfwmWindowHide (&c->sides[SIDE_BOTTOM]);
+            xfwmWindowHide (&c->corners[CORNER_TOP_LEFT]);
+            xfwmWindowHide (&c->corners[CORNER_TOP_RIGHT]);
+            xfwmWindowHide (&c->corners[CORNER_BOTTOM_LEFT]);
+            xfwmWindowHide (&c->corners[CORNER_BOTTOM_RIGHT]);
+        }
+        else
+        {
+            xfwmWindowShow (&c->title,
+                frameTopLeftWidth (c, state), 0, top_width,
+                frameTop (c), (requires_clearing | title_changed));
+            xfwmWindowShow (&c->sides[SIDE_BOTTOM],
+                screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
+                frameHeight (c) - frameBottom (c), bottom_width, frameBottom 
(c),
+                (requires_clearing | width_changed));
+            xfwmWindowShow (&c->corners[CORNER_TOP_LEFT], 0, 0,
+                frameTopLeftWidth (c, state),
+                screen_info->corners[CORNER_TOP_LEFT][state].height,
+                requires_clearing);
+            xfwmWindowShow (&c->corners[CORNER_TOP_RIGHT],
+                frameWidth (c) - frameTopRightWidth (c, state),
+                0, frameTopRightWidth (c, state),
+                screen_info->corners[CORNER_TOP_RIGHT][state].height,
+                requires_clearing);
+            xfwmWindowShow (&c->corners[CORNER_BOTTOM_LEFT], 0,
+                frameHeight (c) -
+                screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
+                screen_info->corners[CORNER_BOTTOM_LEFT][state].width,
+                screen_info->corners[CORNER_BOTTOM_LEFT][state].height,
+                requires_clearing);
+            xfwmWindowShow (&c->corners[CORNER_BOTTOM_RIGHT],
+                frameWidth (c) -
+                screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
+                frameHeight (c) -
+                screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
+                screen_info->corners[CORNER_BOTTOM_RIGHT][state].width,
+                screen_info->corners[CORNER_BOTTOM_RIGHT][state].height,
+                requires_clearing);
+        }
         if (requires_clearing | force_shape_update)
         {
             frameSetShape (c, state, &c->pm_cache, button_x);

Modified: xfwm4/trunk/src/settings.c
===================================================================
--- xfwm4/trunk/src/settings.c  2006-07-16 16:53:07 UTC (rev 22463)
+++ xfwm4/trunk/src/settings.c  2006-07-16 16:56:18 UTC (rev 22464)
@@ -1129,6 +1129,7 @@
     strncpy (screen_info->params->button_layout, getValue ("button_layout", 
rc), 7);
     screen_info->params->button_spacing = TOINT (getValue ("button_spacing", 
rc));
     screen_info->params->button_offset = TOINT (getValue ("button_offset", 
rc));
+    screen_info->params->maximized_offset = TOINT (getValue 
("maximized_offset", rc));
     screen_info->params->title_vertical_offset_active =
         TOINT (getValue ("title_vertical_offset_active", rc));
     screen_info->params->title_vertical_offset_inactive =
@@ -1288,6 +1289,7 @@
         {"margin_left", NULL, FALSE},
         {"margin_right", NULL, FALSE},
         {"margin_top", NULL, FALSE},
+        {"maximized_offset", NULL, TRUE},
         {"move_opacity", NULL, TRUE},
         {"placement_ratio", NULL, TRUE},
         {"popup_opacity", NULL, TRUE},

Modified: xfwm4/trunk/src/settings.h
===================================================================
--- xfwm4/trunk/src/settings.h  2006-07-16 16:53:07 UTC (rev 22463)
+++ xfwm4/trunk/src/settings.h  2006-07-16 16:56:18 UTC (rev 22464)
@@ -154,6 +154,7 @@
     int easy_click;
     int frame_opacity;
     int inactive_opacity;
+    int maximized_offset;
     int move_opacity;
     int placement_ratio;
     int popup_opacity;

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to