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 %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; view->visible = true; // Set the geometry of the floating view const struct wlc_geometry* geometry = wlc_view_get_geometry(handle); // give it requested geometry, but place in center view->x = (active_workspace->width - geometry->size.w) / 2; view->y = (active_workspace->height- geometry->size.h) / 2; view->width = geometry->size.w; view->height = geometry->size.h; view->desired_width = view->width; view->desired_height = view->height; view->is_floating = true; // Case of focused workspace, just create as child of it list_add(active_workspace->floating, view); view->parent = active_workspace; if (active_workspace->focused == NULL) { set_focused_container_for(active_workspace, view); } return view; }
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); //Setup values view->handle = handle; view->name = title ? strdup(title) : NULL; view->visible = true; // Set the geometry of the floating view const struct wlc_geometry* geometry = wlc_view_get_geometry(handle); view->x = geometry->origin.x; view->y = geometry->origin.y; view->width = geometry->size.w; view->height = geometry->size.h; view->desired_width = view->width; view->desired_height = view->height; view->is_floating = true; //Case of focused workspace, just create as child of it list_add(active_workspace->floating, view); view->parent = active_workspace; if (active_workspace->focused == NULL) { active_workspace->focused = view; } return view; }
swayc_t *new_view(swayc_t *sibling, wlc_handle handle) { if (!ASSERT_NONNULL(sibling)) { return NULL; } const char *title = wlc_view_get_title(handle); swayc_t *view = new_swayc(C_VIEW); 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; // Setup geometry const struct wlc_geometry* geometry = wlc_view_get_geometry(handle); view->width = 0; view->height = 0; view->desired_width = geometry->size.w; view->desired_height = geometry->size.h; view->gaps = config->gaps_inner; view->is_floating = false; if (sibling->type == C_WORKSPACE) { // Case of focused workspace, just create as child of it add_child(sibling, view); } else { // Regular case, create as sibling of current container add_sibling(sibling, view); } return view; }
swayc_t *new_view(swayc_t *sibling, 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 to container %p %d", (unsigned int)handle, title, sibling, sibling?sibling->type:0); //Setup values view->handle = handle; view->name = title ? strdup(title) : NULL; view->visible = true; view->desired_width = -1; view->desired_height = -1; // TODO: properly set this view->is_floating = false; //Case of focused workspace, just create as child of it if (sibling->type == C_WORKSPACE) { add_child(sibling, view); } //Regular case, create as sibling of current container else { add_sibling(sibling, view); } return view; }
static bool handle_view_created(wlc_handle handle) { // if view is child of another view, the use that as focused container wlc_handle parent = wlc_view_get_parent(handle); swayc_t *focused = NULL; swayc_t *newview = NULL; // Get parent container, to add view in if (parent) { focused = get_swayc_for_handle(parent, &root_container); } if (!focused || focused->type == C_OUTPUT) { focused = get_focused_container(&root_container); } sway_log(L_DEBUG, "handle:%ld type:%x state:%x parent:%ld " "mask:%d (x:%d y:%d w:%d h:%d) title:%s " "class:%s appid:%s", handle, wlc_view_get_type(handle), wlc_view_get_state(handle), parent, wlc_view_get_mask(handle), wlc_view_get_geometry(handle)->origin.x, wlc_view_get_geometry(handle)->origin.y,wlc_view_get_geometry(handle)->size.w, wlc_view_get_geometry(handle)->size.h, wlc_view_get_title(handle), wlc_view_get_class(handle), wlc_view_get_app_id(handle)); // TODO properly figure out how each window should be handled. switch (wlc_view_get_type(handle)) { // regular view created regularly case 0: newview = new_view(focused, handle); wlc_view_set_state(handle, WLC_BIT_MAXIMIZED, true); break; // Dmenu keeps viewfocus, but others with this flag dont, for now simulate // dmenu case WLC_BIT_OVERRIDE_REDIRECT: // locked_view_focus = true; wlc_view_focus(handle); wlc_view_set_state(handle, WLC_BIT_ACTIVATED, true); wlc_view_bring_to_front(handle); break; // Firefox popups have this flag set. case WLC_BIT_OVERRIDE_REDIRECT|WLC_BIT_UNMANAGED: wlc_view_bring_to_front(handle); locked_container_focus = true; break; // Modals, get focus, popups do not case WLC_BIT_MODAL: wlc_view_focus(handle); wlc_view_bring_to_front(handle); newview = new_floating_view(handle); case WLC_BIT_POPUP: wlc_view_bring_to_front(handle); break; } if (newview) { set_focused_container(newview); swayc_t *output = swayc_parent_by_type(newview, C_OUTPUT); arrange_windows(output, -1, -1); } return true; }