Beginning of a real fullscreen library
							parent
							
								
									cc892700c8
								
							
						
					
					
						commit
						07dfcf2298
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Doug Coleman
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,142 @@
 | 
			
		|||
! Copyright (C) 2010 Doug Coleman.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors alien.c-types arrays classes.struct fry kernel
 | 
			
		||||
literals locals make math math.bitwise multiline sequences
 | 
			
		||||
slots.syntax ui.backend.windows vocabs.loader windows.errors
 | 
			
		||||
windows.gdi32 windows.kernel32 windows.types windows.user32
 | 
			
		||||
ui.gadgets.worlds ;
 | 
			
		||||
IN: fullscreen
 | 
			
		||||
 | 
			
		||||
: hwnd>hmonitor ( HWND -- HMONITOR )
 | 
			
		||||
    MONITOR_DEFAULTTOPRIMARY MonitorFromWindow ;
 | 
			
		||||
 | 
			
		||||
: desktop-hmonitor ( -- HMONITOR )
 | 
			
		||||
    GetDesktopWindow hwnd>hmonitor ;
 | 
			
		||||
 | 
			
		||||
:: (monitor-info>devmodes) ( monitor-info n -- )
 | 
			
		||||
    DEVMODE <struct>
 | 
			
		||||
        DEVMODE heap-size >>dmSize
 | 
			
		||||
        { DM_BITSPERPEL DM_PELSWIDTH DM_PELSHEIGHT } flags >>dmFields
 | 
			
		||||
    :> devmode
 | 
			
		||||
 | 
			
		||||
    monitor-info szDevice>>
 | 
			
		||||
    n
 | 
			
		||||
    devmode
 | 
			
		||||
    EnumDisplaySettings 0 = [
 | 
			
		||||
        devmode ,
 | 
			
		||||
        monitor-info n 1 + (monitor-info>devmodes)
 | 
			
		||||
    ] unless ;
 | 
			
		||||
 | 
			
		||||
: monitor-info>devmodes ( monito-info -- devmodes )
 | 
			
		||||
    [ 0 (monitor-info>devmodes) ] { } make ;
 | 
			
		||||
 | 
			
		||||
: hmonitor>monitor-info ( HMONITOR -- monitor-info )
 | 
			
		||||
    MONITORINFOEX <struct>
 | 
			
		||||
        MONITORINFOEX heap-size >>cbSize
 | 
			
		||||
    [ GetMonitorInfo win32-error=0/f ] keep ;
 | 
			
		||||
 | 
			
		||||
: hwnd>monitor-info ( HWND -- monitor-info )
 | 
			
		||||
    hwnd>hmonitor hmonitor>monitor-info ;
 | 
			
		||||
 | 
			
		||||
: hmonitor>devmodes ( HMONITOR -- devmodes )
 | 
			
		||||
    hmonitor>monitor-info monitor-info>devmodes ;
 | 
			
		||||
 | 
			
		||||
: desktop-devmodes ( -- DEVMODEs )
 | 
			
		||||
    desktop-hmonitor hmonitor>devmodes ;
 | 
			
		||||
 | 
			
		||||
: desktop-monitor-info ( -- monitor-info )
 | 
			
		||||
    desktop-hmonitor hmonitor>monitor-info ;
 | 
			
		||||
 | 
			
		||||
: desktop-RECT ( -- RECT )
 | 
			
		||||
    GetDesktopWindow RECT <struct> [ GetWindowRect win32-error=0/f ] keep ;
 | 
			
		||||
 | 
			
		||||
ERROR: display-change-error n ;
 | 
			
		||||
 | 
			
		||||
: fullscreen-mode ( monitor-info devmode -- )
 | 
			
		||||
    [ szDevice>> ] dip f CDS_FULLSCREEN f
 | 
			
		||||
    ChangeDisplaySettingsEx dup DISP_CHANGE_SUCCESSFUL =
 | 
			
		||||
    [ drop ] [ display-change-error ] if ;
 | 
			
		||||
 | 
			
		||||
: non-fullscreen-mode ( monitor-info devmode -- )
 | 
			
		||||
    [ szDevice>> ] dip f 0 f
 | 
			
		||||
    ChangeDisplaySettingsEx dup DISP_CHANGE_SUCCESSFUL =
 | 
			
		||||
    [ drop ] [ display-change-error ] if ;
 | 
			
		||||
 | 
			
		||||
: get-style ( hwnd n -- style )
 | 
			
		||||
    GetWindowLongPtr [ win32-error=0/f ] keep ;
 | 
			
		||||
    
 | 
			
		||||
: set-style ( hwnd n style -- )
 | 
			
		||||
    SetWindowLongPtr win32-error=0/f ;
 | 
			
		||||
 | 
			
		||||
: change-style ( hwnd n quot -- )
 | 
			
		||||
    [ 2dup get-style ] dip call set-style ; inline
 | 
			
		||||
 | 
			
		||||
: set-fullscreen-styles ( hwnd -- )
 | 
			
		||||
    [ GWL_STYLE [ WS_OVERLAPPEDWINDOW unmask ] change-style ]
 | 
			
		||||
    [ GWL_EXSTYLE [ { WS_EX_APPWINDOW WS_EX_TOPMOST } flags bitor ] change-style ] bi ;
 | 
			
		||||
 | 
			
		||||
: set-non-fullscreen-styles ( hwnd -- )
 | 
			
		||||
    [ GWL_STYLE [ WS_OVERLAPPEDWINDOW bitor ] change-style ]
 | 
			
		||||
    [ GWL_EXSTYLE [ { WS_EX_APPWINDOW WS_EX_TOPMOST } flags unmask ] change-style ] bi ;
 | 
			
		||||
 | 
			
		||||
ERROR: unsupported-resolution triple ;
 | 
			
		||||
 | 
			
		||||
:: find-devmode ( triple hwnd -- devmode )
 | 
			
		||||
    hwnd hwnd>hmonitor hmonitor>devmodes
 | 
			
		||||
    [
 | 
			
		||||
        slots{ dmPelsWidth dmPelsHeight dmBitsPerPel }
 | 
			
		||||
        triple =
 | 
			
		||||
    ] find nip [ triple unsupported-resolution ] unless* ;
 | 
			
		||||
 | 
			
		||||
:: set-fullscreen-window-position ( hwnd triple -- )
 | 
			
		||||
    hwnd f
 | 
			
		||||
    desktop-monitor-info rcMonitor>> slots{ left top } first2
 | 
			
		||||
    triple first2
 | 
			
		||||
    {
 | 
			
		||||
        SWP_NOACTIVATE SWP_NOCOPYBITS SWP_NOOWNERZORDER
 | 
			
		||||
        SWP_NOREPOSITION SWP_NOZORDER
 | 
			
		||||
    } flags
 | 
			
		||||
    SetWindowPos win32-error=0/f ;
 | 
			
		||||
 | 
			
		||||
:: enable-fullscreen ( triple hwnd -- rect )
 | 
			
		||||
    hwnd hwnd>RECT :> rect
 | 
			
		||||
    
 | 
			
		||||
    desktop-monitor-info
 | 
			
		||||
    triple GetDesktopWindow find-devmode
 | 
			
		||||
    hwnd set-fullscreen-styles
 | 
			
		||||
    fullscreen-mode
 | 
			
		||||
 | 
			
		||||
    hwnd triple set-fullscreen-window-position
 | 
			
		||||
    rect ;
 | 
			
		||||
 | 
			
		||||
:: set-window-position ( hwnd rect -- )
 | 
			
		||||
    hwnd f rect get-RECT-dimensions SWP_FRAMECHANGED
 | 
			
		||||
    SetWindowPos win32-error=0/f ;
 | 
			
		||||
 | 
			
		||||
:: disable-fullscreen ( rect triple hwnd -- )
 | 
			
		||||
    desktop-monitor-info
 | 
			
		||||
    triple
 | 
			
		||||
    GetDesktopWindow find-devmode non-fullscreen-mode
 | 
			
		||||
    hwnd set-non-fullscreen-styles
 | 
			
		||||
    hwnd rect set-window-position ;
 | 
			
		||||
 | 
			
		||||
: enable-factor-fullscreen ( triple -- rect )
 | 
			
		||||
    GetForegroundWindow enable-fullscreen ;
 | 
			
		||||
 | 
			
		||||
: disable-factor-fullscreen ( rect triple -- )
 | 
			
		||||
    GetForegroundWindow disable-fullscreen ;
 | 
			
		||||
 | 
			
		||||
:: (set-fullscreen) ( world triple fullscreen? -- )
 | 
			
		||||
    world fullscreen?>> fullscreen? xor [
 | 
			
		||||
        triple
 | 
			
		||||
        world handle>> hWnd>>
 | 
			
		||||
        fullscreen? [
 | 
			
		||||
            enable-fullscreen world (>>saved-position)
 | 
			
		||||
        ] [
 | 
			
		||||
            [ world saved-position>> ] 2dip disable-fullscreen
 | 
			
		||||
        ] if
 | 
			
		||||
        fullscreen? world (>>fullscreen?)
 | 
			
		||||
    ] when ;
 | 
			
		||||
 | 
			
		||||
: set-fullscreen ( gadget triple fullscreen? -- )
 | 
			
		||||
    [ find-world ] 2dip (set-fullscreen) ;
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
windows
 | 
			
		||||
		Loading…
	
		Reference in New Issue