diff --git a/include/layout.h b/include/layout.h index a136f917..38a1f24b 100644 --- a/include/layout.h +++ b/include/layout.h @@ -10,16 +10,19 @@ extern swayc_t root_container; void init_layout(void); void add_child(swayc_t *parent, swayc_t *child); -//Returns parent container wihch needs to be rearranged. +//Returns parent container which needs to be rearranged. swayc_t *add_sibling(swayc_t *sibling, swayc_t *child); swayc_t *replace_child(swayc_t *child, swayc_t *new_child); swayc_t *remove_child(swayc_t *parent, swayc_t *child); +//Layout +void arrange_windows(swayc_t *container, int width, int height); + +//Focus void unfocus_all(swayc_t *container); void focus_view(swayc_t *view); -void arrange_windows(swayc_t *container, int width, int height); +void focus_view_for(swayc_t *ancestor, swayc_t *container); swayc_t *get_focused_container(swayc_t *parent); - swayc_t *get_swayc_for_handle(wlc_handle handle, swayc_t *parent); #endif diff --git a/include/log.h b/include/log.h index e5075a39..d35b2a54 100644 --- a/include/log.h +++ b/include/log.h @@ -10,7 +10,7 @@ typedef enum { void init_log(int verbosity); void sway_log_colors(int mode); -void sway_log(int verbosity, char* format, ...); -void sway_abort(char* format, ...); +void sway_log(int verbosity, char* format, ...) __attribute__((format(printf,2,3))); +void sway_abort(char* format, ...)__attribute__((format(printf,1,2))); #endif 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; + } +} + +