diff --git a/linux_4ed.cpp b/linux_4ed.cpp index 1491027b..fe608308 100644 --- a/linux_4ed.cpp +++ b/linux_4ed.cpp @@ -213,6 +213,7 @@ struct Linux_Vars{ Atom atom__NET_WM_STATE; Atom atom__NET_WM_STATE_MAXIMIZED_HORZ; Atom atom__NET_WM_STATE_MAXIMIZED_VERT; + Atom atom__NET_WM_STATE_FULLSCREEN; Atom atom__NET_WM_PING; Atom atom__NET_WM_WINDOW_TYPE; Atom atom__NET_WM_WINDOW_TYPE_NORMAL; @@ -288,6 +289,7 @@ internal Plat_Handle LinuxFDToHandle(int); internal int LinuxHandleToFD(Plat_Handle); internal void LinuxStringDup(String*, void*, size_t); +internal void LinuxToggleFullscreen(Display*, Window); internal Sys_Acquire_Lock_Sig(system_acquire_lock); internal Sys_Release_Lock_Sig(system_release_lock); @@ -760,6 +762,37 @@ SHOW_MOUSE_CURSOR_SIG(system_show_mouse_cursor){ XDefineCursor(linuxvars.XDisplay, linuxvars.XWindow, show ? None : linuxvars.hidden_cursor); } +internal +TOGGLE_FULLSCREEN_SIG(system_toggle_fullscreen){ + LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); +} + +internal +IS_FULLSCREEN_SIG(system_is_fullscreen){ + b32 result = 0; + + Atom type, *prop; + unsigned long nitems, pad; + int fmt; + + int ret = XGetWindowProperty(linuxvars.XDisplay, + linuxvars.XWindow, + linuxvars.atom__NET_WM_STATE, + 0, 32, False, XA_ATOM, + &type, + &fmt, + &nitems, + &pad, + (unsigned char**)&prop); + + if(ret == Success && prop){ + result = *prop == linuxvars.atom__NET_WM_STATE_FULLSCREEN; + XFree((unsigned char*)prop); + } + + return result; +} + // // Clipboard // @@ -1454,6 +1487,8 @@ LinuxLoadSystemCode(){ linuxvars.system.directory_cd = system_directory_cd; linuxvars.system.get_4ed_path = system_get_4ed_path; linuxvars.system.show_mouse_cursor = system_show_mouse_cursor; + linuxvars.system.toggle_fullscreen = system_toggle_fullscreen; + linuxvars.system.is_fullscreen = system_is_fullscreen; // clipboard linuxvars.system.post_clipboard = system_post_clipboard; @@ -2083,7 +2118,7 @@ LinuxScheduleStep(void) // internal void -LinuxMaximizeWindow(Display* d, Window w, b32 maximize) +LinuxSetWMState(Display* d, Window w, Atom one, Atom two, int mode) { //NOTE(inso): this will only work after it is mapped @@ -2095,10 +2130,10 @@ LinuxMaximizeWindow(Display* d, Window w, b32 maximize) e.xclient.message_type = linuxvars.atom__NET_WM_STATE; e.xclient.format = 32; e.xclient.window = w; - e.xclient.data.l[0] = maximize ? STATE_ADD : STATE_REMOVE; - e.xclient.data.l[1] = linuxvars.atom__NET_WM_STATE_MAXIMIZED_VERT; - e.xclient.data.l[2] = linuxvars.atom__NET_WM_STATE_MAXIMIZED_HORZ; - e.xclient.data.l[3] = 0L; + e.xclient.data.l[0] = mode; + e.xclient.data.l[1] = one; + e.xclient.data.l[2] = two; + e.xclient.data.l[3] = 1L; XSendEvent( d, @@ -2109,6 +2144,22 @@ LinuxMaximizeWindow(Display* d, Window w, b32 maximize) ); } +internal void +LinuxMaximizeWindow(Display* d, Window w, b32 maximize) +{ + LinuxSetWMState(d, + w, + linuxvars.atom__NET_WM_STATE_MAXIMIZED_HORZ, + linuxvars.atom__NET_WM_STATE_MAXIMIZED_VERT, + maximize != 0); +} + +internal void +LinuxToggleFullscreen(Display* d, Window w) +{ + LinuxSetWMState(d, w, linuxvars.atom__NET_WM_STATE_FULLSCREEN, 0, 2); +} + #include "linux_icon.h" internal void LinuxSetIcon(Display* d, Window w) @@ -2559,6 +2610,10 @@ LinuxX11WindowInit(int argc, char** argv, int* WinWidth, int* WinHeight) if (linuxvars.settings.maximize_window){ LinuxMaximizeWindow(linuxvars.XDisplay, linuxvars.XWindow, 1); } + else if(linuxvars.settings.fullscreen_window){ + LinuxToggleFullscreen(linuxvars.XDisplay, linuxvars.XWindow); + } + XSync(linuxvars.XDisplay, False); XWindowAttributes WinAttribs; @@ -3141,6 +3196,7 @@ main(int argc, char **argv) LOAD_ATOM(_NET_WM_STATE); LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_HORZ); LOAD_ATOM(_NET_WM_STATE_MAXIMIZED_VERT); + LOAD_ATOM(_NET_WM_STATE_FULLSCREEN); LOAD_ATOM(_NET_WM_PING); LOAD_ATOM(_NET_WM_WINDOW_TYPE); LOAD_ATOM(_NET_WM_WINDOW_TYPE_NORMAL);