summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan.olivier@wanadoo.fr>2008-06-21 15:17:00 +0000
committerOlivier Fourdan <fourdan.olivier@wanadoo.fr>2008-06-21 15:17:00 +0000
commitf9c6b659a03ce9206e8f16506b7e6b548b2c55d6 (patch)
treef3bf9cd75db97b66ce2a0b5019de9eff2bb699ac
parentb4ce925478ba2ec0744d15c5789d44628c4c3c86 (diff)
downloadxfwm4-f9c6b659a03ce9206e8f16506b7e6b548b2c55d6.tar.gz
Rework the window menu, add more actions (above/normal/below, fullscreen/un-fullscreen)
(Old svn revision: 27111)
-rw-r--r--src/client.c37
-rw-r--r--src/client.h5
-rw-r--r--src/events.c144
-rw-r--r--src/menu.c20
-rw-r--r--src/menu.h9
-rw-r--r--src/netwm.c37
-rw-r--r--src/netwm.h3
7 files changed, 141 insertions, 114 deletions
diff --git a/src/client.c b/src/client.c
index 5d1142360..80c777044 100644
--- a/src/client.c
+++ b/src/client.c
@@ -1144,12 +1144,12 @@ clientApplyInitialState (Client * c)
if (FLAG_TEST_AND_NOT (c->flags, CLIENT_FLAG_ABOVE, CLIENT_FLAG_BELOW))
{
TRACE ("Applying client's initial state: above");
- clientUpdateAboveState (c);
+ clientUpdateLayerState (c);
}
if (FLAG_TEST_AND_NOT (c->flags, CLIENT_FLAG_BELOW, CLIENT_FLAG_ABOVE))
{
TRACE ("Applying client's initial state: below");
- clientUpdateBelowState (c);
+ clientUpdateLayerState (c);
}
if (FLAG_TEST (c->flags, CLIENT_FLAG_STICKY) &&
FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_STICK))
@@ -2678,37 +2678,50 @@ void clientToggleFullscreen (Client * c)
}
}
- if (!clientIsValidTransientOrModal (c) && (c->type == WINDOW_NORMAL))
+ if (!clientIsTransientOrModal (c) && (c->type == WINDOW_NORMAL))
{
FLAG_TOGGLE (c->flags, CLIENT_FLAG_FULLSCREEN);
clientUpdateFullscreenState (c);
}
}
-void clientToggleAbove (Client * c)
+void clientToggleLayerAbove (Client * c)
{
g_return_if_fail (c != NULL);
TRACE ("entering clientToggleAbove");
- TRACE ("toggle above client \"%s\" (0x%lx)", c->name, c->window);
- if (!clientIsValidTransientOrModal (c) &&
- !FLAG_TEST (c->flags, CLIENT_FLAG_BELOW | CLIENT_FLAG_FULLSCREEN))
+ if (!clientIsTransientOrModal (c) &&
+ !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
{
+ FLAG_UNSET (c->flags, CLIENT_FLAG_BELOW);
FLAG_TOGGLE (c->flags, CLIENT_FLAG_ABOVE);
- clientUpdateAboveState (c);
+ clientUpdateLayerState (c);
}
}
-void clientToggleBelow (Client * c)
+void clientToggleLayerBelow (Client * c)
{
g_return_if_fail (c != NULL);
TRACE ("entering clientToggleBelow");
- TRACE ("toggle below client \"%s\" (0x%lx)", c->name, c->window);
- if (!FLAG_TEST (c->flags, CLIENT_FLAG_ABOVE))
+ if (!clientIsTransientOrModal (c) &&
+ !FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
{
+ FLAG_UNSET (c->flags, CLIENT_FLAG_ABOVE);
FLAG_TOGGLE (c->flags, CLIENT_FLAG_BELOW);
- clientUpdateAboveState (c);
+ clientUpdateLayerState (c);
+ }
+}
+
+void clientSetLayerNormal (Client * c)
+{
+ g_return_if_fail (c != NULL);
+ TRACE ("entering clientSetLayerNormal");
+
+ if (!FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+ {
+ FLAG_UNSET (c->flags, CLIENT_FLAG_ABOVE | CLIENT_FLAG_BELOW);
+ clientUpdateLayerState (c);
}
}
diff --git a/src/client.h b/src/client.h
index 95ca039e6..b36c69e31 100644
--- a/src/client.h
+++ b/src/client.h
@@ -384,8 +384,9 @@ void clientUnstick (Client *,
void clientToggleSticky (Client *,
gboolean);
void clientToggleFullscreen (Client *);
-void clientToggleAbove (Client *);
-void clientToggleBelow (Client *);
+void clientToggleLayerAbove (Client *);
+void clientToggleLayerBelow (Client *);
+void clientSetLayerNormal (Client *);
void clientRemoveMaximizeFlag (Client *);
void clientToggleMaximized (Client *,
int,
diff --git a/src/events.c b/src/events.c
index 4e89964fc..ea6bb053a 100644
--- a/src/events.c
+++ b/src/events.c
@@ -383,7 +383,7 @@ handleKeyPress (DisplayInfo *display_info, XKeyEvent * ev)
clientLower (c, None);
break;
case KEY_TOGGLE_ABOVE:
- clientToggleAbove (c);
+ clientToggleLayerAbove (c);
break;
case KEY_TOGGLE_FULLSCREEN:
clientToggleFullscreen (c);
@@ -2519,7 +2519,6 @@ menu_callback (Menu * menu, MenuOp op, Window xid, gpointer menu_data, gpointer
{
clientHide (c, c->win_workspace, TRUE);
}
- frameQueueDraw (c, FALSE);
break;
case MENU_OP_MOVE:
clientMove (c, NULL);
@@ -2529,7 +2528,6 @@ menu_callback (Menu * menu, MenuOp op, Window xid, gpointer menu_data, gpointer
break;
case MENU_OP_MINIMIZE_ALL:
clientHideAll (c, c->win_workspace);
- frameQueueDraw (c, FALSE);
break;
case MENU_OP_UNMINIMIZE:
clientShow (c, TRUE);
@@ -2546,20 +2544,26 @@ menu_callback (Menu * menu, MenuOp op, Window xid, gpointer menu_data, gpointer
break;
case MENU_OP_WORKSPACES:
clientSetWorkspace (c, GPOINTER_TO_INT (item_data), TRUE);
- frameQueueDraw (c, FALSE);
break;
case MENU_OP_DELETE:
- frameQueueDraw (c, FALSE);
clientClose (c);
break;
case MENU_OP_CONTEXT_HELP:
clientEnterContextMenuState (c);
- frameQueueDraw (c, FALSE);
break;
case MENU_OP_ABOVE:
+ clientToggleLayerAbove (c);
+ break;
case MENU_OP_NORMAL:
- clientToggleAbove (c);
- /* Fall thru */
+ clientSetLayerNormal (c);
+ break;
+ case MENU_OP_BELOW:
+ clientToggleLayerBelow (c);
+ break;
+ case MENU_OP_FULLSCREEN:
+ case MENU_OP_UNFULLSCREEN:
+ clientToggleFullscreen (c);
+ break;
default:
frameQueueDraw (c, FALSE);
break;
@@ -2590,7 +2594,12 @@ show_window_menu (Client *c, gint px, gint py, guint button, guint32 time)
TRACE ("entering show_window_menu");
- if (!c || ((button != Button1) && (button != Button3)))
+ if ((button != Button1) && (button != Button3))
+ {
+ return;
+ }
+
+ if (!c || !FLAG_TEST_ALL (c->xfwm_flags, XFWM_FLAG_HAS_BORDER | XFWM_FLAG_VISIBLE))
{
return;
}
@@ -2607,26 +2616,13 @@ show_window_menu (Client *c, gint px, gint py, guint button, guint32 time)
ops = MENU_OP_DELETE | MENU_OP_MINIMIZE_ALL | MENU_OP_WORKSPACES | MENU_OP_MOVE | MENU_OP_RESIZE;
insensitive = 0;
- if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_CLOSE))
- {
- insensitive |= MENU_OP_DELETE;
- }
-
if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED))
{
ops |= MENU_OP_UNMAXIMIZE;
- if (!CLIENT_CAN_MAXIMIZE_WINDOW (c))
- {
- insensitive |= MENU_OP_UNMAXIMIZE;
- }
}
else
{
ops |= MENU_OP_MAXIMIZE;
- if (!CLIENT_CAN_MAXIMIZE_WINDOW (c))
- {
- insensitive |= MENU_OP_MAXIMIZE;
- }
}
if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_MOVE))
@@ -2634,27 +2630,13 @@ show_window_menu (Client *c, gint px, gint py, guint button, guint32 time)
insensitive |= MENU_OP_MOVE;
}
- if (!FLAG_TEST_ALL (c->xfwm_flags, XFWM_FLAG_HAS_RESIZE | XFWM_FLAG_IS_RESIZABLE) ||
- FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
- {
- insensitive |= MENU_OP_RESIZE;
- }
-
if (FLAG_TEST (c->flags, CLIENT_FLAG_ICONIFIED))
{
ops |= MENU_OP_UNMINIMIZE;
- if (!CLIENT_CAN_HIDE_WINDOW (c))
- {
- insensitive |= MENU_OP_UNMINIMIZE;
- }
}
else
{
ops |= MENU_OP_MINIMIZE;
- if (!CLIENT_CAN_HIDE_WINDOW (c))
- {
- insensitive |= MENU_OP_MINIMIZE;
- }
}
if (FLAG_TEST (c->flags, CLIENT_FLAG_SHADED))
@@ -2669,44 +2651,86 @@ show_window_menu (Client *c, gint px, gint py, guint button, guint32 time)
if (FLAG_TEST (c->flags, CLIENT_FLAG_STICKY))
{
ops |= MENU_OP_UNSTICK;
- if (!CLIENT_CAN_STICK_WINDOW(c))
- {
- insensitive |= MENU_OP_UNSTICK;
- }
}
else
{
ops |= MENU_OP_STICK;
- if (!CLIENT_CAN_STICK_WINDOW(c))
- {
- insensitive |= MENU_OP_STICK;
- }
}
- /* KDE extension */
- clientGetWMProtocols(c);
- if (FLAG_TEST (c->wm_flags, WM_FLAG_CONTEXT_HELP))
+ if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_CLOSE))
{
- ops |= MENU_OP_CONTEXT_HELP;
+ insensitive |= MENU_OP_DELETE;
+ }
+
+ if (!CLIENT_CAN_STICK_WINDOW(c))
+ {
+ insensitive |= MENU_OP_STICK | MENU_OP_UNSTICK;
+ }
+
+ if (!CLIENT_CAN_HIDE_WINDOW (c))
+ {
+ insensitive |= MENU_OP_MINIMIZE;
+ }
+
+ if (!CLIENT_CAN_MAXIMIZE_WINDOW (c))
+ {
+ insensitive |= MENU_OP_MAXIMIZE;
+ }
+
+ if (!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_MOVE))
+ {
+ insensitive |= MENU_OP_MOVE;
+ }
+
+ if (!FLAG_TEST_ALL (c->xfwm_flags, XFWM_FLAG_HAS_RESIZE | XFWM_FLAG_IS_RESIZABLE) ||
+ FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED))
+ {
+ insensitive |= MENU_OP_RESIZE;
+ }
+
+ if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+ {
+ insensitive |= MENU_OP_SHADE | MENU_OP_MOVE | MENU_OP_RESIZE | MENU_OP_MAXIMIZE | MENU_OP_UNMAXIMIZE;
+ }
+
+ if (FLAG_TEST(c->flags, CLIENT_FLAG_FULLSCREEN))
+ {
+ ops |= MENU_OP_UNFULLSCREEN;
+ }
+ else
+ {
+ ops |= MENU_OP_FULLSCREEN;
+ }
+
+ if (clientIsTransientOrModal (c) || (c->type != WINDOW_NORMAL))
+ {
+ insensitive |= MENU_OP_FULLSCREEN | MENU_OP_UNFULLSCREEN;
}
if (FLAG_TEST(c->flags, CLIENT_FLAG_ABOVE))
{
- ops |= MENU_OP_NORMAL;
- if (clientIsValidTransientOrModal (c) ||
- FLAG_TEST (c->flags, CLIENT_FLAG_BELOW | CLIENT_FLAG_FULLSCREEN))
- {
- insensitive |= MENU_OP_NORMAL;
- }
+ ops |= MENU_OP_NORMAL | MENU_OP_BELOW;
+ }
+ else if (FLAG_TEST(c->flags, CLIENT_FLAG_BELOW))
+ {
+ ops |= MENU_OP_NORMAL | MENU_OP_ABOVE;
}
else
{
- ops |= MENU_OP_ABOVE;
- if (clientIsValidTransientOrModal (c) ||
- FLAG_TEST (c->flags, CLIENT_FLAG_BELOW | CLIENT_FLAG_FULLSCREEN))
- {
- insensitive |= MENU_OP_ABOVE;
- }
+ ops |= MENU_OP_ABOVE | MENU_OP_BELOW;
+ }
+
+ if (clientIsValidTransientOrModal (c) ||
+ FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
+ {
+ insensitive |= MENU_OP_NORMAL | MENU_OP_ABOVE | MENU_OP_BELOW;
+ }
+
+ /* KDE extension */
+ clientGetWMProtocols(c);
+ if (FLAG_TEST (c->wm_flags, WM_FLAG_CONTEXT_HELP))
+ {
+ ops |= MENU_OP_CONTEXT_HELP;
}
if (clientIsValidTransientOrModal (c)
diff --git a/src/menu.c b/src/menu.c
index 4663dc249..6e81a865d 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -40,20 +40,24 @@
static GtkWidget *menu_open = NULL;
static MenuItem menuitems[] = {
{MENU_OP_MAXIMIZE, "gtk-zoom-100", N_("Ma_ximize")},
- {MENU_OP_UNMAXIMIZE, "gtk-zoom-out", N_("Un_maximize")},
- {MENU_OP_MINIMIZE, "gtk-undo", N_("_Hide")},
+ {MENU_OP_UNMAXIMIZE, "gtk-zoom-out", N_("(Un)Ma_ximize")},
+ {MENU_OP_MINIMIZE, "gtk-undo", N_("Mi_nimize")},
{MENU_OP_MINIMIZE_ALL, "gtk-clear", N_("Hide _all others")},
{MENU_OP_UNMINIMIZE, "gtk-add", N_("S_how")},
- {MENU_OP_MOVE, NULL, N_("Move")},
- {MENU_OP_RESIZE, NULL, N_("Resize")},
+ {MENU_OP_MOVE, NULL, N_("_Move")},
+ {MENU_OP_RESIZE, NULL, N_("_Resize")},
{0, NULL, NULL},
{MENU_OP_SHADE, "gtk-goto-top", N_("_Shade")},
- {MENU_OP_UNSHADE, "gtk-goto-bottom", N_("Un_shade")},
+ {MENU_OP_UNSHADE, "gtk-goto-bottom", N_("(Un)_Shade")},
{MENU_OP_STICK, "gtk-add", N_("S_tick")},
- {MENU_OP_UNSTICK, "gtk-remove", N_("Uns_tick")},
+ {MENU_OP_UNSTICK, "gtk-remove", N_("(Un)S_tick")},
{MENU_OP_CONTEXT_HELP, "gtk-help", N_("Context _help")},
- {MENU_OP_ABOVE, NULL, N_("Always on top")},
- {MENU_OP_NORMAL, "gtk-apply", N_("Always on top")},
+ {0, NULL, NULL},
+ {MENU_OP_ABOVE, "gtk-go-up", N_("Above")},
+ {MENU_OP_NORMAL, "gtk-go-forward", N_("Normal")},
+ {MENU_OP_BELOW, "gtk-go-down", N_("Below")},
+ {MENU_OP_FULLSCREEN, "gtk-fullscreen", N_("_Fullscreen")},
+ {MENU_OP_UNFULLSCREEN, "gtk-fullscreen", N_("(Un)_Fullscreen")},
{MENU_OP_WORKSPACES, NULL, N_("Send to...")},
{0, NULL, NULL},
{MENU_OP_DELETE, "gtk-close", N_("_Close")},
diff --git a/src/menu.h b/src/menu.h
index 05a5545d2..5b66fe62b 100644
--- a/src/menu.h
+++ b/src/menu.h
@@ -54,9 +54,12 @@ typedef enum
MENU_OP_QUIT = 1 << 14,
MENU_OP_RESTART = 1 << 15,
MENU_OP_ABOVE = 1 << 16,
- MENU_OP_NORMAL = 1 << 17,
- MENU_OP_CONTEXT_HELP = 1 << 18,
- MENU_OP_OTHER = 1 << 19
+ MENU_OP_BELOW = 1 << 17,
+ MENU_OP_NORMAL = 1 << 18,
+ MENU_OP_FULLSCREEN = 1 << 19,
+ MENU_OP_UNFULLSCREEN = 1 << 20,
+ MENU_OP_CONTEXT_HELP = 1 << 21,
+ MENU_OP_OTHER = 1 << 22
}
MenuOp;
diff --git a/src/netwm.c b/src/netwm.c
index 7338cfbf8..d0e6cfdca 100644
--- a/src/netwm.c
+++ b/src/netwm.c
@@ -448,17 +448,17 @@ clientUpdateNetState (Client * c, XClientMessageEvent * ev)
if ((action == NET_WM_STATE_ADD) && !FLAG_TEST (c->flags, CLIENT_FLAG_ABOVE))
{
FLAG_SET (c->flags, CLIENT_FLAG_ABOVE);
- clientUpdateAboveState (c);
+ clientUpdateLayerState (c);
}
else if ((action == NET_WM_STATE_REMOVE) && FLAG_TEST (c->flags, CLIENT_FLAG_ABOVE))
{
FLAG_UNSET (c->flags, CLIENT_FLAG_ABOVE);
- clientUpdateAboveState (c);
+ clientUpdateLayerState (c);
}
else if (action == NET_WM_STATE_TOGGLE)
{
FLAG_TOGGLE (c->flags, CLIENT_FLAG_ABOVE);
- clientUpdateAboveState (c);
+ clientUpdateLayerState (c);
}
}
}
@@ -471,17 +471,17 @@ clientUpdateNetState (Client * c, XClientMessageEvent * ev)
if ((action == NET_WM_STATE_ADD) && !FLAG_TEST (c->flags, CLIENT_FLAG_BELOW))
{
FLAG_SET (c->flags, CLIENT_FLAG_BELOW);
- clientUpdateBelowState (c);
+ clientUpdateLayerState (c);
}
else if ((action == NET_WM_STATE_REMOVE) && FLAG_TEST (c->flags, CLIENT_FLAG_BELOW))
{
FLAG_UNSET (c->flags, CLIENT_FLAG_BELOW);
- clientUpdateBelowState (c);
+ clientUpdateLayerState (c);
}
else if (action == NET_WM_STATE_TOGGLE)
{
FLAG_TOGGLE (c->flags, CLIENT_FLAG_BELOW);
- clientUpdateBelowState (c);
+ clientUpdateLayerState (c);
}
}
}
@@ -1312,36 +1312,19 @@ clientWindowType (Client * c)
}
void
-clientUpdateAboveState (Client * c)
+clientUpdateLayerState (Client * c)
{
int layer;
g_return_if_fail (c != NULL);
- TRACE ("entering clientUpdateAboveState");
- TRACE ("Update above state for client \"%s\" (0x%lx)", c->name, c->window);
+ TRACE ("entering clientUpdateLayerState");
+ TRACE ("Update layer state for client \"%s\" (0x%lx)", c->name, c->window);
if (FLAG_TEST (c->flags, CLIENT_FLAG_ABOVE))
{
layer = WIN_LAYER_ABOVE_DOCK;
}
- else
- {
- layer = c->initial_layer;
- }
- clientSetNetState (c);
- clientSetLayer (c, layer);
-}
-
-void
-clientUpdateBelowState (Client * c)
-{
- int layer;
-
- g_return_if_fail (c != NULL);
- TRACE ("entering clientUpdateBelowState");
- TRACE ("Update below state for client \"%s\" (0x%lx)", c->name, c->window);
-
- if (FLAG_TEST (c->flags, CLIENT_FLAG_BELOW))
+ else if (FLAG_TEST (c->flags, CLIENT_FLAG_BELOW))
{
layer = WIN_LAYER_BELOW;
}
diff --git a/src/netwm.h b/src/netwm.h
index 1da89451d..34a57b0e1 100644
--- a/src/netwm.h
+++ b/src/netwm.h
@@ -49,8 +49,7 @@ gboolean clientValidateNetStrut (Client *);
gboolean clientGetNetStruts (Client *);
void clientSetNetActions (Client *);
void clientWindowType (Client *);
-void clientUpdateAboveState (Client *);
-void clientUpdateBelowState (Client *);
+void clientUpdateLayerState (Client *);
void clientSetNetActiveWindow (ScreenInfo *,
Client *,
Time);