Author: olivier
Date: 2006-07-17 21:30:11 +0000 (Mon, 17 Jul 2006)
New Revision: 22472
Modified:
xfwm4/trunk/src/client.c
xfwm4/trunk/src/events.c
xfwm4/trunk/src/hints.h
Log:
Rework maximization switches (bug #2047)
Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c 2006-07-17 21:24:27 UTC (rev 22471)
+++ xfwm4/trunk/src/client.c 2006-07-17 21:30:11 UTC (rev 22472)
@@ -2726,29 +2726,83 @@
clientSetNetState (c);
}
-void
-clientToggleMaximized (Client * c, int mode, gboolean restore_position)
+static void
+clientNewMaxState (Client * c, XWindowChanges *wc, int mode, gboolean
restore_position)
{
+ /*
+ * We treat differently full maximization from vertical or horizontal
maximization.
+ * This is for usability concerns, otherwise maximization acts like a
toggle,
+ * switching from horizontal to vertical instead of switching to full
maximization.
+ *
+ * The full size is not computed yet, as full maximization removes borders
+ * while either horizontal or vertical maximization still shows
decorations...
+ */
+
+ if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED) && (restore_position))
+ {
+ c->old_x = c->x;
+ c->old_y = c->y;
+ c->old_width = c->width;
+ c->old_height = c->height;
+ }
+
+ if ((mode & WIN_STATE_MAXIMIZED) == WIN_STATE_MAXIMIZED)
+ {
+ if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED))
+ {
+ c->win_state |= WIN_STATE_MAXIMIZED;
+ FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED);
+ return;
+ }
+ }
+
+ if (mode & WIN_STATE_MAXIMIZED_HORIZ)
+ {
+ if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ))
+ {
+ c->win_state |= WIN_STATE_MAXIMIZED_HORIZ;
+ FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ);
+ return;
+ }
+ }
+
+ if (mode & WIN_STATE_MAXIMIZED_VERT)
+ {
+ if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT))
+ {
+ c->win_state |= WIN_STATE_MAXIMIZED_VERT;
+ FLAG_SET (c->flags, CLIENT_FLAG_MAXIMIZED_VERT);
+ return;
+ }
+ }
+
+ c->win_state &= ~WIN_STATE_MAXIMIZED;
+ 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;
+}
+
+static void
+clientNewMaxSize (Client * c, XWindowChanges *wc)
+{
ScreenInfo *screen_info;
GdkRectangle rect;
- XWindowChanges wc;
int cx, cy, full_x, full_y, full_w, full_h;
+ int tmp_x, tmp_y, tmp_w, tmp_h;
gint monitor_nbr;
- g_return_if_fail (c != NULL);
- TRACE ("entering clientToggleMaximized");
- TRACE ("maximzing/unmaximizing client \"%s\" (0x%lx)", c->name, c->window);
+ tmp_x = frameX (c);
+ tmp_y = frameY (c);
+ tmp_h = frameHeight (c);
+ tmp_w = frameWidth (c);
+ cx = tmp_x + (tmp_w / 2);
+ cy = tmp_y + (tmp_h / 2);
+
screen_info = c->screen_info;
- if (!CLIENT_CAN_MAXIMIZE_WINDOW (c))
- {
- return;
- }
-
- cx = frameX (c) + (frameWidth (c) / 2);
- cy = frameY (c) + (frameHeight (c) / 2);
-
monitor_nbr = find_monitor_at_point (screen_info->gscr, cx, cy);
gdk_screen_get_monitor_geometry (screen_info->gscr, monitor_nbr, &rect);
@@ -2759,102 +2813,65 @@
full_h = MIN (screen_info->height -
screen_info->params->xfwm_margins[BOTTOM],
rect.y + rect.height) - full_y;
- wc.x = c->x;
- wc.y = c->y;
- wc.width = c->width;
- wc.height = c->height;
+ if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+ {
+ /* Adjust size to the largest size available, not covering struts */
+ clientMaxSpace (screen_info, &full_x, &full_y, &full_w, &full_h);
+ 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);
- if ((mode & WIN_STATE_MAXIMIZED_HORIZ) && (mode &
WIN_STATE_MAXIMIZED_VERT))
- {
- 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);
- /* Adjust size to the largest size available, not covering struts
*/
- clientMaxSpace (screen_info, &full_x, &full_y, &full_w, &full_h);
- 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;
- }
+ return;
}
- else if (mode & WIN_STATE_MAXIMIZED_HORIZ)
+
+ if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ))
{
- if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_HORIZ))
- {
- int tmp_y, tmp_h;
+ /* Adjust size to the widest size available, for the current vertical
position/height */
+ clientMaxSpace (screen_info, &full_x, &tmp_y, &full_w, &tmp_h);
+ wc->x = full_x + frameLeft (c);
+ wc->width = full_w - frameLeft (c) - frameRight (c);
- if (restore_position)
- {
- 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);
- 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);
- wc.x = full_x + frameLeft (c);
- wc.width = full_w - frameLeft (c) - frameRight (c);
- }
- 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;
- }
+ return;
}
- else if (mode & WIN_STATE_MAXIMIZED_VERT)
+
+ if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT))
{
- if (!FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED_VERT))
- {
- int tmp_x, tmp_w;
+ /* Adjust size to the tallest size available, for the current
horizontal position/width */
+ clientMaxSpace (screen_info, &tmp_x, &full_y, &tmp_w, &full_h);
+ wc->y = full_y + frameTop (c);
+ wc->height = full_h - frameTop (c) - frameBottom (c);
- if (restore_position)
- {
- 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);
- 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);
- wc.y = full_y + frameTop (c);
- wc.height = full_h - frameTop (c) - frameBottom (c);
- }
- 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;
- }
+ return;
}
+}
- c->x = wc.x;
- c->y = wc.y;
- c->height = wc.height;
- c->width = wc.width;
+void
+clientToggleMaximized (Client * c, int mode, gboolean restore_position)
+{
+ XWindowChanges wc;
+
+ g_return_if_fail (c != NULL);
+ TRACE ("entering clientToggleMaximized");
+ TRACE ("maximzing/unmaximizing client \"%s\" (0x%lx)", c->name, c->window);
+
+ if (!CLIENT_CAN_MAXIMIZE_WINDOW (c))
+ {
+ return;
+ }
+
+ wc.x = c->x;
+ wc.y = c->y;
+ wc.width = c->width;
+ wc.height = c->height;
+
+ /* 1) Compute the new state */
+ clientNewMaxState (c, &wc, mode, restore_position);
+
+ /* 2) Compute the new size, based on the state */
+ clientNewMaxSize (c, &wc);
+
+ /* 3) Update window fields */
clientSetNetState (c);
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MANAGED))
@@ -2867,11 +2884,18 @@
grab focus in focus follow mouse mode. Grab the pointer to
avoid these effects
*/
- myScreenGrabPointer (screen_info, EnterWindowMask, None,
CurrentTime);
+ myScreenGrabPointer (c->screen_info, EnterWindowMask, None,
CurrentTime);
clientConfigure (c, &wc, CWWidth | CWHeight | CWX | CWY,
CFG_NOTIFY);
- myScreenUngrabPointer (screen_info, CurrentTime);
+ myScreenUngrabPointer (c->screen_info, CurrentTime);
}
+ return;
}
+
+ /* Window is not managed yet, just update its fields */
+ c->x = wc.x;
+ c->y = wc.y;
+ c->height = wc.height;
+ c->width = wc.width;
}
void
@@ -4630,19 +4654,17 @@
case MAXIMIZE_BUTTON:
if (CLIENT_CAN_MAXIMIZE_WINDOW (c))
{
- unsigned long mode = c->win_state & WIN_STATE_MAXIMIZED;
-
if (bev->button == Button1)
{
- clientToggleMaximized (c, mode ? mode :
WIN_STATE_MAXIMIZED, TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED, TRUE);
}
else if (bev->button == Button2)
{
- clientToggleMaximized (c, mode ? mode :
WIN_STATE_MAXIMIZED_VERT, TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED_VERT,
TRUE);
}
else if (bev->button == Button3)
{
- clientToggleMaximized (c, mode ? mode :
WIN_STATE_MAXIMIZED_HORIZ, TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED_HORIZ,
TRUE);
}
}
break;
Modified: xfwm4/trunk/src/events.c
===================================================================
--- xfwm4/trunk/src/events.c 2006-07-17 21:24:27 UTC (rev 22471)
+++ xfwm4/trunk/src/events.c 2006-07-17 21:30:11 UTC (rev 22472)
@@ -353,20 +353,17 @@
static void
handleKeyPress (DisplayInfo *display_info, XKeyEvent * ev)
{
- unsigned long mode;
ScreenInfo *screen_info;
Client *c;
int key;
TRACE ("entering handleKeyEvent");
- mode = 0;
c = clientGetFocus ();
if (c)
{
screen_info = c->screen_info;
key = getKeyPressed (screen_info, ev);
- mode = c->win_state & WIN_STATE_MAXIMIZED;
switch (key)
{
@@ -398,13 +395,13 @@
}
break;
case KEY_MAXIMIZE_WINDOW:
- clientToggleMaximized (c, mode ? mode : WIN_STATE_MAXIMIZED,
TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED, TRUE);
break;
case KEY_MAXIMIZE_VERT:
- clientToggleMaximized (c, mode ? mode :
WIN_STATE_MAXIMIZED_VERT, TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED_VERT, TRUE);
break;
case KEY_MAXIMIZE_HORIZ:
- clientToggleMaximized (c, mode ? mode :
WIN_STATE_MAXIMIZED_HORIZ, TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED_HORIZ, TRUE);
break;
case KEY_SHADE_WINDOW:
clientToggleShaded (c);
@@ -591,7 +588,6 @@
static void
button1Action (Client * c, XButtonEvent * ev)
{
- unsigned long mode;
ScreenInfo *screen_info;
DisplayInfo *display_info;
XEvent copy_event;
@@ -602,7 +598,6 @@
screen_info = c->screen_info;
display_info = screen_info->display_info;
- mode = c->win_state & WIN_STATE_MAXIMIZED;
if (!(c->type & WINDOW_TYPE_DONT_FOCUS))
{
@@ -623,7 +618,7 @@
switch (screen_info->params->double_click_action)
{
case ACTION_MAXIMIZE:
- clientToggleMaximized (c, mode ? mode : WIN_STATE_MAXIMIZED,
TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED, TRUE);
break;
case ACTION_SHADE:
clientToggleShaded (c);
@@ -2247,7 +2242,6 @@
static void
menu_callback (Menu * menu, MenuOp op, Window xid, gpointer menu_data,
gpointer item_data)
{
- unsigned long mode;
Client *c;
TRACE ("entering menu_callback");
@@ -2267,7 +2261,6 @@
if (c)
{
c->button_pressed[MENU_BUTTON] = FALSE;
- mode = c->win_state & WIN_STATE_MAXIMIZED;
switch (op)
{
@@ -2278,7 +2271,7 @@
case MENU_OP_UNMAXIMIZE:
if (CLIENT_CAN_MAXIMIZE_WINDOW (c))
{
- clientToggleMaximized (c, mode ? mode :
WIN_STATE_MAXIMIZED, TRUE);
+ clientToggleMaximized (c, WIN_STATE_MAXIMIZED, TRUE);
}
break;
case MENU_OP_MINIMIZE:
Modified: xfwm4/trunk/src/hints.h
===================================================================
--- xfwm4/trunk/src/hints.h 2006-07-17 21:24:27 UTC (rev 22471)
+++ xfwm4/trunk/src/hints.h 2006-07-17 21:30:11 UTC (rev 22472)
@@ -70,7 +70,8 @@
#define WIN_STATE_STICKY (1L<<0)
#define WIN_STATE_MAXIMIZED_VERT (1L<<2)
#define WIN_STATE_MAXIMIZED_HORIZ (1L<<3)
-#define WIN_STATE_MAXIMIZED ((1L<<2)|(1L<<3))
+#define WIN_STATE_MAXIMIZED (WIN_STATE_MAXIMIZED_VERT | \
+ WIN_STATE_MAXIMIZED_HORIZ)
#define WIN_STATE_SHADED (1L<<5)
#define WIN_HINTS_SKIP_FOCUS (1L<<0)
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits