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); swayc_t *output = new_swayc(C_OUTPUT); output->width = size->w; output->height = size->h; output->handle = handle; if (name) { output->name = strdup(name); } add_child(&root_container, output); //TODO something with this int total_width = 0; container_map(&root_container, add_output_widths, &total_width); //Create workspace char *ws_name = workspace_next_name(); new_workspace(output, ws_name); free(ws_name); return output; }
swayc_t *workspace_create(const char* name) { swayc_t *parent; // Search for workspace<->output pair int i, e = config->workspace_outputs->length; for (i = 0; i < e; ++i) { struct workspace_output *wso = config->workspace_outputs->items[i]; if (strcasecmp(wso->workspace, name) == 0) { // Find output to use if it exists e = root_container.children->length; for (i = 0; i < e; ++i) { parent = root_container.children->items[i]; if (strcmp(parent->name, wso->output) == 0) { return new_workspace(parent, name); } } break; } } // Otherwise create a new one parent = get_focused_container(&root_container); parent = swayc_parent_by_type(parent, C_OUTPUT); return new_workspace(parent, name); }
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 %lu:%s", handle, name); swayc_t *output = new_swayc(C_OUTPUT); output->width = size->w; output->height = size->h; output->handle = handle; output->name = name ? strdup(name) : NULL; output->gaps = config->gaps_outer + config->gaps_inner / 2; add_child(&root_container, output); // Create workspace char *ws_name = NULL; if (name) { int i; for (i = 0; i < config->workspace_outputs->length; ++i) { struct workspace_output *wso = config->workspace_outputs->items[i]; if (strcasecmp(wso->output, name) == 0) { sway_log(L_DEBUG, "Matched workspace to output: %s for %s", wso->workspace, wso->output); // Check if any other workspaces are using this name if (find_container(&root_container, workspace_test, wso->workspace)) { sway_log(L_DEBUG, "But it's already taken"); break; } sway_log(L_DEBUG, "So we're going to use it"); ws_name = strdup(wso->workspace); break; } } } if (!ws_name) { ws_name = workspace_next_name(); } // create and initilize default workspace swayc_t *ws = new_workspace(output, ws_name); ws->is_focused = true; free(ws_name); return output; }
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); swayc_t *output = new_swayc(C_OUTPUT); output->width = size->w; output->height = size->h; output->handle = handle; output->name = name ? strdup(name) : NULL; add_child(&root_container, output); //TODO something with this int total_width = 0; container_map(&root_container, add_output_widths, &total_width); //Create workspace char *ws_name = NULL; if (name) { int i; for (i = 0; i < config->workspace_outputs->length; ++i) { struct workspace_output *wso = config->workspace_outputs->items[i]; if (strcasecmp(wso->output, name) == 0) { sway_log(L_DEBUG, "Matched workspace to output: %s for %s", wso->workspace, wso->output); ws_name = strdup(wso->workspace); break; } } } if (!ws_name) { ws_name = workspace_next_name(); } new_workspace(output, ws_name); free(ws_name); return output; }
void move_workspace_to(swayc_t* workspace, swayc_t* destination) { if (workspace == destination || swayc_is_parent_of(workspace, destination)) { return; } swayc_t *src_op = remove_child(workspace); // reset container geometry workspace->width = workspace->height = 0; add_child(destination, workspace); // Refocus destination (change to new workspace) set_focused_container(get_focused_view(workspace)); arrange_windows(destination, -1, -1); update_visibility(destination); // make sure source output has a workspace if (src_op->children->length == 0) { char *ws_name = workspace_next_name(src_op->name); swayc_t *ws = new_workspace(src_op, ws_name); ws->is_focused = true; free(ws_name); } set_focused_container(get_focused_view(src_op)); update_visibility(src_op); }
swayc_t *workspace_create(const char* name) { swayc_t *parent = get_focused_container(&root_container); parent = swayc_parent_by_type(parent, C_OUTPUT); return new_workspace(parent, name); }