2 * ion/ioncore/fullscreen.c
4 * Copyright (c) Tuomo Valkonen 1999-2006.
6 * Ion is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
12 #include <libtu/setparam.h>
16 #include "clientwin.h"
20 #include "fullscreen.h"
26 bool clientwin_fullscreen_may_switchto(WClientWin *cwin)
28 return (region_may_control_focus((WRegion*)cwin)
29 || !REGION_IS_ACTIVE(region_screen_of((WRegion*)cwin)));
33 bool clientwin_check_fullscreen_request(WClientWin *cwin, int w, int h,
40 mwm=xwindow_get_mwmhints(cwin->win);
41 if(mwm==NULL || !(mwm->flags&MWM_HINTS_DECORATIONS) ||
46 if(!region_same_rootwin((WRegion*)scr, (WRegion*)cwin))
48 /* TODO: if there are multiple possible rootwins, use the one with
49 * requested position, if any.
51 if(REGION_GEOM(scr).w==w && REGION_GEOM(scr).h==h){
52 cwin->flags|=CLIENTWIN_FS_RQ;
53 if(!clientwin_fullscreen_scr(cwin, (WScreen*)scr, sw)){
54 cwin->flags&=~CLIENTWIN_FS_RQ;
61 rwgeom=®ION_GEOM(region_rootwin_of((WRegion*)cwin));
63 /* Catch Xinerama-unaware apps here */
64 if(rwgeom->w==w && rwgeom->h==h){
65 cwin->flags|=CLIENTWIN_FS_RQ;
66 if(clientwin_enter_fullscreen(cwin, sw))
68 cwin->flags&=~CLIENTWIN_FS_RQ;
75 static void destroy_pholder(WPHolder **fs_pholder)
77 WPHolder *ph=*fs_pholder;
79 destroy_obj((Obj*)ph);
83 static bool do_fullscreen_scr(WRegion *reg, WPHolder **fs_pholder,
84 WScreen *scr, bool switchto)
88 int swf=(switchto ? MPLEX_ATTACH_SWITCHTO : 0);
89 WRegion *mgr=REGION_MANAGER(reg);
92 destroy_pholder(fs_pholder);
94 if(*fs_pholder==NULL && mgr!=NULL)
95 *fs_pholder=region_managed_get_pholder(mgr, reg);
97 if(!mplex_attach_simple((WMPlex*)scr, reg, swf)){
98 warn(TR("Failed to enter full screen mode."));
100 destroy_pholder(fs_pholder);
108 static bool do_leave_fullscreen(WRegion *reg, WPHolder **fs_pholder,
112 int swf=(switchto ? PHOLDER_ATTACH_SWITCHTO : 0);
114 if(*fs_pholder==NULL)
117 cf=region_may_control_focus(reg);
119 if(!pholder_attach(*fs_pholder, swf, reg)){
120 warn(TR("Failed to return from full screen mode; remaining manager "
121 "or parent from previous location refused to manage us."));
125 if(*fs_pholder!=NULL)
126 destroy_pholder(fs_pholder);
135 static WRegion *get_group(WClientWin *cwin)
137 WGroupCW *cwg=OBJ_CAST(REGION_MANAGER(cwin), WGroupCW);
139 return ((cwg!=NULL && group_bottom(&cwg->grp)==(WRegion*)cwin)
145 bool clientwin_fullscreen_scr(WClientWin *cwin, WScreen *scr, bool switchto)
147 WRegion *reg=get_group(cwin);
148 return do_fullscreen_scr(reg, &cwin->fs_pholder, scr, switchto);
152 bool clientwin_enter_fullscreen(WClientWin *cwin, bool switchto)
154 WScreen *scr=region_screen_of((WRegion*)cwin);
157 scr=rootwin_current_scr(region_rootwin_of((WRegion*)cwin));
162 return clientwin_fullscreen_scr(cwin, scr, switchto);
165 bool clientwin_leave_fullscreen(WClientWin *cwin, bool switchto)
167 WRegion *reg=get_group(cwin);
168 return do_leave_fullscreen(reg, &cwin->fs_pholder, switchto);
172 bool clientwin_set_fullscreen(WClientWin *cwin, int sp)
174 bool set=REGION_IS_FULLSCREEN(cwin);
175 bool nset=libtu_do_setparam(sp, set);
181 clientwin_enter_fullscreen(cwin, TRUE);
183 clientwin_leave_fullscreen(cwin, TRUE);
185 return REGION_IS_FULLSCREEN(cwin);
190 * Set client window \var{cwin} full screen state according to the
191 * parameter \var{how} (set/unset/toggle). Resulting state is returned,
192 * which may not be what was requested.
194 EXTL_EXPORT_AS(WClientWin, set_fullscreen)
195 bool clientwin_set_fullscreen_extl(WClientWin *cwin, const char *how)
197 return clientwin_set_fullscreen(cwin, libtu_string_to_setparam(how));
202 * Is \var{cwin} in full screen mode?
206 bool clientwin_is_fullscreen(WClientWin *cwin)
208 return REGION_IS_FULLSCREEN(cwin);