From 11321ca2dd355be82175213795d88dcbfd0540ee Mon Sep 17 00:00:00 2001 From: taiyu Date: Tue, 18 Aug 2015 00:28:44 -0700 Subject: changed handling of focus, handling of view by type --- sway/container.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'sway/container.c') diff --git a/sway/container.c b/sway/container.c index 3534721d..67132a48 100644 --- a/sway/container.c +++ b/sway/container.c @@ -39,17 +39,11 @@ static void free_swayc(swayc_t *c) { } /* New containers */ -static void add_output_widths(swayc_t *container, void *_width) { - int *width = _width; - if (container->type == C_OUTPUT) { - *width += container->width; - } -} swayc_t *new_output(wlc_handle handle) { const struct wlc_size* size = wlc_output_get_resolution(handle); const char *name = wlc_output_get_name(handle); - sway_log(L_DEBUG, "Added output %u %s", (unsigned int)handle, name); + sway_log(L_DEBUG, "Added output %lu:%s", handle, name); swayc_t *output = new_swayc(C_OUTPUT); output->width = size->w; @@ -59,9 +53,12 @@ swayc_t *new_output(wlc_handle handle) { add_child(&root_container, output); - //TODO something with this - int total_width = 0; - container_map(&root_container, add_output_widths, &total_width); +//TODO still dont know why this is here? +// int total_width = 0; +// int i; +// for (i = 0; i < root_container.children->length; ++i) { +// total_width += ((swayc_t*)root_container.children->items[i])->width; +// } //Create workspace char *ws_name = NULL; @@ -79,7 +76,10 @@ swayc_t *new_output(wlc_handle handle) { if (!ws_name) { ws_name = workspace_next_name(); } - new_workspace(output, ws_name); + //create and initilize default workspace + swayc_t *ws = new_workspace(output, ws_name); + ws->is_focused = true; + free(ws_name); return output; @@ -139,14 +139,15 @@ swayc_t *new_container(swayc_t *child, enum swayc_layouts layout) { } swayc_t *new_view(swayc_t *sibling, wlc_handle handle) { - const char *title = wlc_view_get_title(handle); + const char *title = wlc_view_get_title(handle); swayc_t *view = new_swayc(C_VIEW); - sway_log(L_DEBUG, "Adding new view %u:%s to container %p %d", - (unsigned int)handle, title, sibling, sibling?sibling->type:0); + sway_log(L_DEBUG, "Adding new view %lu:%s to container %p %d", + handle, title, sibling, sibling ? sibling->type : 0); //Setup values view->handle = handle; view->name = title ? strdup(title) : NULL; view->visible = true; + view->is_focused = true; view->desired_width = -1; view->desired_height = -1; @@ -168,8 +169,8 @@ swayc_t *new_view(swayc_t *sibling, wlc_handle handle) { swayc_t *new_floating_view(wlc_handle handle) { const char *title = wlc_view_get_title(handle); swayc_t *view = new_swayc(C_VIEW); - sway_log(L_DEBUG, "Adding new view %u:%s as a floating view", - (unsigned int)handle, title); + sway_log(L_DEBUG, "Adding new view %lu:%x:%s as a floating view", + handle, wlc_view_get_type(handle), title); //Setup values view->handle = handle; view->name = title ? strdup(title) : NULL; @@ -197,6 +198,7 @@ swayc_t *new_floating_view(wlc_handle handle) { return view; } +/* Destroy container */ swayc_t *destroy_output(swayc_t *output) { if (output->children->length == 0) { @@ -300,3 +302,5 @@ void set_view_visibility(swayc_t *view, void *data) { } view->visible = (*p == 2); } + + -- cgit v1.2.3 From 63bc0d3b5451f4668186c98a1f283f3e0a104cfe Mon Sep 17 00:00:00 2001 From: taiyu Date: Tue, 18 Aug 2015 02:46:14 -0700 Subject: more changes --- include/layout.h | 2 +- sway/container.c | 13 +++++++------ sway/focus.c | 2 +- sway/handlers.c | 6 +++--- sway/layout.c | 9 +++++++-- 5 files changed, 19 insertions(+), 13 deletions(-) (limited to 'sway/container.c') diff --git a/include/layout.h b/include/layout.h index a7f43fda..26d00ce4 100644 --- a/include/layout.h +++ b/include/layout.h @@ -13,7 +13,7 @@ void add_child(swayc_t *parent, swayc_t *child); //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); +swayc_t *remove_child(swayc_t *child); //Layout void arrange_windows(swayc_t *container, int width, int height); diff --git a/sway/container.c b/sway/container.c index 67132a48..2b9f7554 100644 --- a/sway/container.c +++ b/sway/container.c @@ -27,10 +27,7 @@ static void free_swayc(swayc_t *c) { list_free(c->children); } if (c->parent) { - if (c->parent->focused == c) { - c->parent->focused = NULL; - } - remove_child(c->parent, c); + remove_child(c); } if (c->name) { free(c->name); @@ -118,6 +115,11 @@ swayc_t *new_container(swayc_t *child, enum swayc_layouts layout) { //reorder focus cont->focused = workspace->focused; workspace->focused = cont; + //set all children focu to container + int i; + for (i = 0; i < workspace->children->length; ++i) { + ((swayc_t *)workspace->children->items[i])->parent = cont; + } //Swap children list_t *tmp_list = workspace->children; workspace->children = cont->children; @@ -204,7 +206,7 @@ swayc_t *destroy_output(swayc_t *output) { if (output->children->length == 0) { //TODO move workspaces to other outputs } - sway_log(L_DEBUG, "OUTPUT: Destroying output '%u'", (unsigned int)output->handle); + sway_log(L_DEBUG, "OUTPUT: Destroying output '%lu'", output->handle); free_swayc(output); return &root_container; } @@ -246,7 +248,6 @@ swayc_t *destroy_view(swayc_t *view) { if (parent->type == C_CONTAINER) { return destroy_container(parent); } - return parent; } diff --git a/sway/focus.c b/sway/focus.c index 2999c6d0..4f57f252 100644 --- a/sway/focus.c +++ b/sway/focus.c @@ -135,7 +135,7 @@ void set_focused_container(swayc_t *c) { if (!locked_view_focus) { p = get_focused_view(c); //Set focus to p - if (p && p != prev_view && !(wlc_view_get_type(p->handle) & WLC_BIT_POPUP)) { + if (p && !(wlc_view_get_type(p->handle) & WLC_BIT_POPUP)) { if (prev_view) { wlc_view_set_state(prev_view->handle, WLC_BIT_ACTIVATED, false); } diff --git a/sway/handlers.c b/sway/handlers.c index 2a5113cc..24e8e014 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -38,6 +38,9 @@ static bool pointer_test(swayc_t *view, void *_origin) { swayc_t *container_under_pointer(void) { //root.output->workspace + if (!root_container.focused || !root_container.focused->focused) { + return NULL; + } swayc_t *lookup = root_container.focused->focused; //Case of empty workspace if (lookup->children == 0) { @@ -174,9 +177,6 @@ static void handle_view_destroyed(wlc_handle handle) { if (view) { swayc_t *parent = destroy_view(view); arrange_windows(parent, -1, -1); - if (!focused || focused == view) { - set_focused_container(container_under_pointer()); - } } break; //takes keyboard focus diff --git a/sway/layout.c b/sway/layout.c index de7ef370..8ff5c4b7 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -60,8 +60,9 @@ swayc_t *replace_child(swayc_t *child, swayc_t *new_child) { return parent; } -swayc_t *remove_child(swayc_t *parent, swayc_t *child) { +swayc_t *remove_child(swayc_t *child) { int i; + swayc_t *parent = child->parent; // Special case for floating views if (child->is_floating) { for (i = 0; i < parent->floating->length; ++i) { @@ -79,7 +80,11 @@ swayc_t *remove_child(swayc_t *parent, swayc_t *child) { } } if (parent->focused == child) { - parent->focused = NULL; + if (parent->children->length > 0) { + parent->focused = parent->children->items[i?i-1:0]; + } else { + parent->focused = NULL; + } } return parent; } -- cgit v1.2.3