浏览代码

Merge pull request #642 from adolson/x11-fullscreen-borderless

thanks enormously, this is fantastic!
Juan Linietsky 11 年之前
父节点
当前提交
ce92999b6a
共有 3 个文件被更改,包括 58 次插入12 次删除
  1. 0 11
      platform/x11/context_gl_x11.cpp
  2. 49 0
      platform/x11/os_x11.cpp
  3. 9 1
      platform/x11/os_x11.h

+ 0 - 11
platform/x11/context_gl_x11.cpp

@@ -129,17 +129,6 @@ Error ContextGL_X11::initialize() {
 		}
 		}
 		//};
 		//};
 
 
-	if (!OS::get_singleton()->get_video_mode().resizable) {
-		XSizeHints *xsh;
-		xsh = XAllocSizeHints();
-		xsh->flags = PMinSize | PMaxSize;
-		xsh->min_width = OS::get_singleton()->get_video_mode().width;
-		xsh->max_width = OS::get_singleton()->get_video_mode().width;
-		xsh->min_height = OS::get_singleton()->get_video_mode().height;
-		xsh->max_height = OS::get_singleton()->get_video_mode().height;
-		XSetWMNormalHints(x11_display, x11_window, xsh);
-	}
-
 
 
 	if (!opengl_3_context) {
 	if (!opengl_3_context) {
 		//oldstyle context:
 		//oldstyle context:

+ 49 - 0
platform/x11/os_x11.cpp

@@ -168,6 +168,55 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 		visual_server =memnew(VisualServerWrapMT(visual_server,get_render_thread_mode()==RENDER_SEPARATE_THREAD));
 		visual_server =memnew(VisualServerWrapMT(visual_server,get_render_thread_mode()==RENDER_SEPARATE_THREAD));
 	}
 	}
 
 
+	// borderless fullscreen window mode
+	if (current_videomode.fullscreen) {
+		// needed for lxde/openbox, possibly others
+		Hints hints;
+		Atom property;
+		hints.flags = 2;
+		hints.decorations = 0;
+		property = XInternAtom(x11_display, "_MOTIF_WM_HINTS", True);
+		XChangeProperty(x11_display, x11_window, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5);
+		XMapRaised(x11_display, x11_window);
+		XWindowAttributes xwa;
+		XGetWindowAttributes(x11_display, DefaultRootWindow(x11_display), &xwa);
+		XMoveResizeWindow(x11_display, x11_window, 0, 0, xwa.width, xwa.height);
+
+		// code for netwm-compliants
+		XEvent xev;
+		Atom wm_state = XInternAtom(x11_display, "_NET_WM_STATE", False);
+		Atom fullscreen = XInternAtom(x11_display, "_NET_WM_STATE_FULLSCREEN", False);
+
+		memset(&xev, 0, sizeof(xev));
+		xev.type = ClientMessage;
+		xev.xclient.window = x11_window;
+		xev.xclient.message_type = wm_state;
+		xev.xclient.format = 32;
+		xev.xclient.data.l[0] = 1;
+		xev.xclient.data.l[1] = fullscreen;
+		xev.xclient.data.l[2] = 0;
+
+		XSendEvent(x11_display, DefaultRootWindow(x11_display), False, SubstructureNotifyMask, &xev);
+	}
+
+	// disable resizeable window
+	if (!current_videomode.resizable) {
+		XSizeHints *xsh;
+		xsh = XAllocSizeHints();
+		xsh->flags = PMinSize | PMaxSize;
+		XWindowAttributes xwa;
+		if (current_videomode.fullscreen) {
+			XGetWindowAttributes(x11_display,DefaultRootWindow(x11_display),&xwa);
+		} else {
+			XGetWindowAttributes(x11_display,x11_window,&xwa);
+		}
+		xsh->min_width = xwa.width; 
+		xsh->max_width = xwa.width;
+		xsh->min_height = xwa.height;
+		xsh->max_height = xwa.height;
+		XSetWMNormalHints(x11_display, x11_window, xsh);
+	}
+
 	AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton();
 	AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton();
 
 
 	if (AudioDriverManagerSW::get_driver(p_audio_driver)->init()!=OK) {
 	if (AudioDriverManagerSW::get_driver(p_audio_driver)->init()!=OK) {

+ 9 - 1
platform/x11/os_x11.h

@@ -49,7 +49,15 @@
 #include <X11/Xlib.h>
 #include <X11/Xlib.h>
 #include <X11/Xcursor/Xcursor.h>
 #include <X11/Xcursor/Xcursor.h>
 
 
-//bitch
+// Hints for X11 fullscreen
+typedef struct {
+	unsigned long flags;
+	unsigned long functions;
+	unsigned long decorations;
+	long inputMode;
+	unsigned long status;
+} Hints;
+
 #undef CursorShape
 #undef CursorShape
 /**
 /**
 	@author Juan Linietsky <[email protected]>
 	@author Juan Linietsky <[email protected]>