diff options
author | taiyu <taiyu.len@gmail.com> | 2015-08-16 17:28:06 -0700 |
---|---|---|
committer | taiyu <taiyu.len@gmail.com> | 2015-08-16 17:28:06 -0700 |
commit | c024f0663176239c8b97e2957e5a7a45be5bceef (patch) | |
tree | acc5c67090bea80843188ad3b3acc048c2b33de2 /sway | |
parent | d64bff69bbc13c15ed0d2d1cdbce9709046ff818 (diff) |
handle_view_state_request
Diffstat (limited to 'sway')
-rw-r--r-- | sway/handlers.c | 37 | ||||
-rw-r--r-- | sway/layout.c | 31 |
2 files changed, 60 insertions, 8 deletions
diff --git a/sway/handlers.c b/sway/handlers.c index 32b0051d..e57b791b 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -130,6 +130,38 @@ static void handle_view_geometry_request(wlc_handle view, const struct wlc_geome // deny that shit } +static void handle_view_state_request(wlc_handle view, enum wlc_view_state_bit state, bool toggle) { + switch(state) { + case WLC_BIT_FULLSCREEN: + { + //I3 just lets it become fullscreen + wlc_view_set_state(view,state,toggle); + swayc_t *c = get_swayc_for_handle(view, &root_container); + sway_log(L_DEBUG, "setting view %ld %s, fullscreen %d",view,c->name,toggle); + if (c) { + arrange_windows(c->parent, -1, -1); + //Set it as focused window for that workspace if its going + //fullscreen + if (toggle) { + swayc_t *ws = c; + while (ws->type != C_WORKSPACE) { + ws = ws->parent; + } + //Set ws focus to c + focus_view_for(ws, c); + } + } + break; + } + case WLC_BIT_MAXIMIZED: + case WLC_BIT_RESIZING: + case WLC_BIT_MOVING: + case WLC_BIT_ACTIVATED: + break; + } + return; +} + static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifiers *modifiers, uint32_t key, uint32_t sym, enum wlc_key_state state) { @@ -239,7 +271,8 @@ struct wlc_interface interface = { .destroyed = handle_view_destroyed, .focus = handle_view_focus, .request = { - .geometry = handle_view_geometry_request + .geometry = handle_view_geometry_request, + .state = handle_view_state_request } }, .keyboard = { @@ -250,6 +283,6 @@ struct wlc_interface interface = { .button = handle_pointer_button }, .compositor = { - .ready = handle_wlc_ready + .ready = handle_wlc_ready } }; diff --git a/sway/layout.c b/sway/layout.c index 20b5999c..a6d6fcbb 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -238,15 +238,17 @@ void unfocus_all(swayc_t *container) { void focus_view(swayc_t *view) { sway_log(L_DEBUG, "Setting focus for %p", view); - while (view != &root_container) { - view->parent->focused = view; - view = view->parent; + swayc_t *c = view; + //Set focus from root to view + while (c != &root_container) { + c->parent->focused = c; + c = c->parent; } + //Set output + wlc_output_focus(c->focused->handle); + //get focus for views focused window while (view && view->type != C_VIEW) { view = view->focused; - if (view && view->type == C_OUTPUT) { - wlc_output_focus(view->handle); - } } if (view) { wlc_view_set_state(view->handle, WLC_BIT_ACTIVATED, true); @@ -254,3 +256,20 @@ void focus_view(swayc_t *view) { } } +void focus_view_for(swayc_t *top, swayc_t *view) { + swayc_t *find = view; + //Make sure top is a ancestor of view + while (find != top) { + if (find == &root_container) { + return; + } + find = find->parent; + } + //Set focus for top to go to view + while (view != top) { + view->parent->focused = view; + view = view->parent; + } +} + + |