static void netwm_state_change_rq(WClientWin *cwin, const XClientMessageEvent *ev) { if((ev->data.l[1]==0 || ev->data.l[1]!=(long)atom_net_wm_state_fullscreen) && (ev->data.l[2]==0 || ev->data.l[2]!=(long)atom_net_wm_state_fullscreen)){ return; } /* Ok, full screen add/remove/toggle */ if(!REGION_IS_FULLSCREEN(cwin)){ if(ev->data.l[0]==_NET_WM_STATE_ADD || ev->data.l[0]==_NET_WM_STATE_TOGGLE){ WRegion *grp=region_groupleader_of((WRegion*)cwin); bool sw=clientwin_fullscreen_may_switchto(cwin); cwin->flags|=CLIENTWIN_FS_RQ; if(!region_enter_fullscreen(grp, sw)) cwin->flags&=~CLIENTWIN_FS_RQ; }else{ /* Should not be set.. */ cwin->flags&=~CLIENTWIN_FS_RQ; } }else{ if(ev->data.l[0]==_NET_WM_STATE_REMOVE || ev->data.l[0]==_NET_WM_STATE_TOGGLE){ WRegion *grp=region_groupleader_of((WRegion*)cwin); bool sw=clientwin_fullscreen_may_switchto(cwin); cwin->flags&=~CLIENTWIN_FS_RQ; region_leave_fullscreen(grp, sw); }else{ /* Set the flag */ cwin->flags|=CLIENTWIN_FS_RQ; } } }
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); }