diff options
Diffstat (limited to 'sway/handlers.c')
-rw-r--r-- | sway/handlers.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/sway/handlers.c b/sway/handlers.c index f8dd9f4d..317b03a8 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -185,6 +185,63 @@ static bool handle_view_created(wlc_handle handle) { if (parent) { focused = swayc_by_handle(parent); } + + // TODO: test with wayland apps (gnome terminal or corebird) + + // try to match this up to a pid_workspace + struct wl_client *client = wlc_view_get_wl_client(handle); + pid_t pid; + struct pid_workspace *pw = NULL; + + sway_log(L_DEBUG, "checking pid workspaces, handle is %lu", handle); + + if (client) { + sway_log(L_DEBUG, "found client"); + wl_client_get_credentials(client, &pid, NULL, NULL); + } + + sway_log(L_DEBUG, "all pid_workspaces"); + for (int k = 0; k < config->pid_workspaces->length; k++) { + pw = config->pid_workspaces->items[k]; + sway_log(L_DEBUG, "pid %d workspace %s", *pw->pid, pw->workspace); + } + + if (pid) { + sway_log(L_DEBUG, "found pid %d for client", pid); + int i; + for (i = 0; i < config->pid_workspaces->length; i++) { + pw = config->pid_workspaces->items[i]; + pid_t *pw_pid = pw->pid; + sway_log(L_DEBUG, "checking pid %d against pid %d, i is %d", pid, *pw_pid, i); + if (pid == *pw_pid) { + sway_log(L_DEBUG, "found pid_workspace for pid, %d %s", pid, pw->workspace); + break; + } + pw = NULL; + } + + swayc_t *ws = NULL; + + if (pw) { + ws = workspace_by_name(pw->workspace); + + if (!ws) { + sway_log(L_DEBUG, "creating workspace %s because it disappeared", pw->workspace); + ws = workspace_create(pw->workspace); + } + + if (ws) { + sway_log(L_DEBUG, "workspace exists, name is %s", ws->name); + focused = ws; + } + + list_del(config->pid_workspaces, i); + } + } + + free_pid_workspace(pw); + // free(&pid); + if (!focused || focused->type == C_OUTPUT) { focused = get_focused_container(&root_container); // Move focus from floating view @@ -220,7 +277,7 @@ static bool handle_view_created(wlc_handle handle) { // Dmenu keeps viewfocus, but others with this flag don't, for now simulate // dmenu case WLC_BIT_OVERRIDE_REDIRECT: -// locked_view_focus = true; + // locked_view_focus = true; wlc_view_focus(handle); wlc_view_set_state(handle, WLC_BIT_ACTIVATED, true); wlc_view_bring_to_front(handle); |