/** * * @brief the simple floating windows relayout strategy, which is actually * doing nothing. * * Tested */ static void relayout_float(const tw_handle *views, const size_t nviews, const wlc_geometry *geo) { //this method has to be called in safe env. if(!views || !geo) return; const wlc_size *r = &geo->size; //this method is not safe, how do you ensure you will not access //unallocated memory? c++ vector? for (size_t i = 0; i < nviews; i++) { debug_log("relayout_float\n"); //the only thing we are doing here is ensure the the window //does not go out or border, but is may not be good, since //windows can have border struct wlc_geometry g = *wlc_view_get_geometry(views[i]); g.size.h = (g.size.h > 0) ? g.size.h : 100;//give a initial height if not avaliable g.size.w = (g.size.w > 0) ? g.size.w : 100;//give a initial wpidth if not avaliable int32_t view_botton = g.origin.y+g.size.h; int32_t view_right = g.origin.x+g.size.w; g.size.h = MIN(view_botton, r->h) - g.origin.y; g.size.w = MIN(view_right, r->w) - g.origin.x; wlc_view_set_geometry(views[i], 0, &g); wlc_view_bring_to_front(views[i]); } }
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_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; }
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; }