diff options
-rw-r--r-- | src/client.c | 37 | ||||
-rw-r--r-- | src/client.h | 5 | ||||
-rw-r--r-- | src/events.c | 144 | ||||
-rw-r--r-- | src/menu.c | 20 | ||||
-rw-r--r-- | src/menu.h | 9 | ||||
-rw-r--r-- | src/netwm.c | 37 | ||||
-rw-r--r-- | src/netwm.h | 3 |
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); |