bool region_enter_fullscreen(WRegion *reg, bool switchto) { WScreen *scr=region_screen_of(reg); if(scr==NULL){ scr=rootwin_current_scr(region_rootwin_of(reg)); if(scr==NULL) return FALSE; } return region_fullscreen_scr(reg, scr, switchto); }
WScreen *netwm_check_initial_fullscreen(WClientWin *cwin) { int i, n; int ret=0; long *data; n=xwindow_get_property(cwin->win, atom_net_wm_state, XA_ATOM, 1, TRUE, (uchar**)&data); if(n<0) return NULL; for(i=0; i<n; i++){ if(data[i]==(long)atom_net_wm_state_fullscreen) return region_screen_of((WRegion*)cwin); } XFree((void*)data); return NULL; }
bool clientwin_fullscreen_may_switchto(WClientWin *cwin) { return (region_may_control_focus((WRegion*)cwin) || !REGION_IS_ACTIVE(region_screen_of((WRegion*)cwin))); }
EXTL_EXPORT WDock *mod_dock_create(ExtlTab tab) { char *mode=NULL; bool floating=FALSE; int screenid=0; WScreen *screen=NULL; WDock *dock=NULL; WRegion *stdisp=NULL; WMPlexSTDispInfo din; WFitParams fp; if(extl_table_gets_s(tab, "mode", &mode)){ if(strcmp(mode, "floating")==0){ floating=TRUE; }else if(strcmp(mode, "embedded")!=0){ warn("Invalid dock mode."); free(mode); return NULL; } free(mode); } extl_table_gets_i(tab, "screen", &screenid); screen=ioncore_find_screen_id(screenid); if(screen==NULL){ warn("Screen %d does not exist.", screenid); return NULL; } for(dock=docks; dock; dock=dock->dock_next){ if(region_screen_of((WRegion*)dock)==screen){ warn("Screen %d already has a dock. Refusing to create another.", screenid); return NULL; } } if(!floating){ mplex_get_stdisp((WMPlex*)screen, &stdisp, &din); if(stdisp!=NULL && !extl_table_is_bool_set(tab, "force")){ warn("Screen %d already has an stdisp. Refusing to add embedded " "dock.", screenid); return NULL; } } /* Create the dock */ fp.mode=REGION_FIT_BOUNDS|REGION_FIT_WHATEVER; fp.g.x=0; fp.g.y=0; fp.g.w=1; fp.g.h=1; dock=create_dock((WWindow*)screen, &fp); if(dock==NULL){ warn("Failed to create dock."); return NULL; } /* Get parameters */ dock->save=FALSE; dock_do_set(dock, tab, FALSE); /* Calculate min/max size */ dock_managed_rqgeom_(dock, NULL, 0, NULL, NULL, TRUE); /* Final setup */ if(floating){ WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT; WRegionAttachData data; par.flags=(MPLEX_ATTACH_UNNUMBERED |MPLEX_ATTACH_SIZEPOLICY |MPLEX_ATTACH_GEOM |MPLEX_ATTACH_PASSIVE); par.geom.w=dock->min_w; par.geom.h=dock->min_h; par.geom.x=0; par.geom.y=0; mplexszplcy(dock->pos, &par.szplcy); if(extl_table_is_bool_set(tab, "floating_hidden")) par.flags|=MPLEX_ATTACH_HIDDEN; data.type=REGION_ATTACH_REPARENT; data.u.reg=(WRegion*)dock; if(mplex_do_attach((WMPlex*)screen, &par, &data)) return dock; }else{ mplexpos(dock->pos, &din.pos); din.fullsize=FALSE; /* not supported */ if(mplex_set_stdisp((WMPlex*)screen, (WRegion*)dock, &din)) return dock; } /* Failed to attach. */ warn("Failed to attach dock to screen."); destroy_obj((Obj*)dock); return NULL; }
bool clientwin_do_manage_default(WClientWin *cwin, const WManageParams *param) { WScreen *scr=NULL; WPHolder *ph=NULL; int swf=(param->switchto ? PHOLDER_ATTACH_SWITCHTO : 0); bool uq=FALSE; WRegion *createroot=NULL; /* Find a suitable screen */ scr=clientwin_find_suitable_screen(cwin, param); if(scr==NULL){ warn(TR("Unable to find a screen for a new client window.")); return FALSE; } if(handle_target_winprops(cwin, param, scr, &ph)) return TRUE; /* Check if param->tfor or any of its managers want to manage cwin. */ if(ph==NULL && param->tfor!=NULL){ assert(param->tfor!=cwin); ph=region_prepare_manage_transient((WRegion*)param->tfor, cwin, param, 0); uq=TRUE; } if(ph==NULL){ /* Find a placeholder for non-fullscreen state */ ph=region_prepare_manage((WRegion*)scr, cwin, param, MANAGE_PRIORITY_NONE); if(try_fullscreen(cwin, scr, param)){ if(pholder_target(ph)!=(WRegion*)region_screen_of((WRegion*)cwin)){ WRegion *grp=region_groupleader_of((WRegion*)cwin); if(region_do_set_return(grp, ph)) return TRUE; } destroy_obj((Obj*)ph); return TRUE; } } if(ph==NULL) return FALSE; /* Not in full-screen mode; use the placeholder to attach. */ { WRegionAttachData data; data.type=REGION_ATTACH_REPARENT; data.u.reg=(WRegion*)cwin; createroot=pholder_do_attach(ph, swf|PHOLDER_ATTACH_RETURN_CREATEROOT, &data); } destroy_obj((Obj*)ph); if(uq && createroot!=NULL) ioncore_unsqueeze(createroot, FALSE); return (createroot!=NULL); }