diff options
-rw-r--r-- | src/core/window.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/core/window.c b/src/core/window.c index 3c1fa641..7cd19415 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -66,7 +66,7 @@ static void recalc_window_type (MetaWindow *window); static void set_wm_state (MetaWindow *window, int state); static void set_net_wm_state (MetaWindow *window); - +static void set_allowed_actions_hint (MetaWindow *window); static void send_configure_notify (MetaWindow *window); static gboolean process_property_notify (MetaWindow *window, XPropertyEvent *event); @@ -2469,6 +2469,8 @@ meta_window_minimize (MetaWindow *window) queue_calc_showing_func, NULL); + set_allowed_actions_hint (window); + if (window->has_focus) { meta_topic (META_DEBUG_FOCUS, @@ -2496,6 +2498,8 @@ meta_window_unminimize (MetaWindow *window) meta_window_foreach_transient (window, queue_calc_showing_func, NULL); + + set_allowed_actions_hint (window); } } @@ -2637,6 +2641,7 @@ meta_window_maximize_internal (MetaWindow *window, window->frame->need_reapply_frame_shape = TRUE; recalc_window_features (window); + set_allowed_actions_hint (window); set_net_wm_state (window); } @@ -2745,6 +2750,8 @@ meta_window_tile (MetaWindow *window) /* move_resize with new tiling constraints */ meta_window_queue (window, META_QUEUE_MOVE_RESIZE); + + set_allowed_actions_hint (window); } void @@ -2753,7 +2760,6 @@ meta_window_untile (MetaWindow *window) window->tiled = FALSE; meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL | META_MAXIMIZE_HORIZONTAL); - } static gboolean @@ -2806,6 +2812,7 @@ meta_window_unmaximize (MetaWindow *window, window->saved_maximize = FALSE; window->tile_mode = META_TILE_NONE; + window->tiled = FALSE; /* Only do something if the window isn't already maximized in the * given direction(s). @@ -2874,6 +2881,7 @@ meta_window_unmaximize (MetaWindow *window, } recalc_window_features (window); + set_allowed_actions_hint (window); set_net_wm_state (window); meta_compositor_unmaximize_window (window->display->compositor, window); @@ -2991,6 +2999,7 @@ meta_window_make_fullscreen_internal (MetaWindow *window) meta_stack_thaw (window->screen->stack); recalc_window_features (window); + set_allowed_actions_hint (window); set_net_wm_state (window); } } @@ -3089,6 +3098,8 @@ meta_window_shade (MetaWindow *window, meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING); + set_allowed_actions_hint (window); + /* After queuing the calc showing, since _focus flushes it, * and we need to focus the frame */ @@ -3112,6 +3123,8 @@ meta_window_unshade (MetaWindow *window, window->shaded = FALSE; meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING); + set_allowed_actions_hint (window); + /* focus the window */ meta_topic (META_DEBUG_FOCUS, "Focusing window %s after unshading it\n", @@ -6448,17 +6461,24 @@ set_allowed_actions_hint (MetaWindow *window) int i; i = 0; - if (window->has_move_func) + if (window->has_move_func && + !window->minimized) { data[i] = window->display->atom__NET_WM_ACTION_MOVE; ++i; } - if (window->has_resize_func) + if (window->has_resize_func && + !window->minimized && + !window->shaded && + !window->tiled && + !(window->maximized_horizontally && window->maximized_vertically)) { data[i] = window->display->atom__NET_WM_ACTION_RESIZE; ++i; } - if (window->has_fullscreen_func) + if (window->has_fullscreen_func && + !window->minimized && + !window->shaded) { data[i] = window->display->atom__NET_WM_ACTION_FULLSCREEN; ++i; @@ -6468,7 +6488,8 @@ set_allowed_actions_hint (MetaWindow *window) data[i] = window->display->atom__NET_WM_ACTION_MINIMIZE; ++i; } - if (window->has_shade_func) + if (window->has_shade_func && + !window->minimized) { data[i] = window->display->atom__NET_WM_ACTION_SHADE; ++i; @@ -6476,7 +6497,9 @@ set_allowed_actions_hint (MetaWindow *window) /* sticky according to EWMH is different from marco's sticky; * marco doesn't support EWMH sticky */ - if (window->has_maximize_func) + if (window->has_maximize_func && + !window->minimized && + !window->shaded) { data[i] = window->display->atom__NET_WM_ACTION_MAXIMIZE_HORZ; ++i; |