浏览代码

Merge pull request #9619 from marcelofg55/master

Fix fullscreen on X11 for non-resizable windows
Rémi Verschelde 8 年之前
父节点
当前提交
9a502d3c17
共有 1 个文件被更改,包括 27 次插入0 次删除
  1. 27 0
      platform/x11/os_x11.cpp

+ 27 - 0
platform/x11/os_x11.cpp

@@ -686,6 +686,16 @@ void OS_X11::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) con
 }
 
 void OS_X11::set_wm_fullscreen(bool p_enabled) {
+	if (p_enabled && !is_window_resizable()) {
+		// Set the window as resizable to prevent window managers to ignore the fullscreen state flag.
+		XSizeHints *xsh;
+
+		xsh = XAllocSizeHints();
+		xsh->flags = 0L;
+		XSetWMNormalHints(x11_display, x11_window, xsh);
+		XFree(xsh);
+	}
+
 	// Using EWMH -- Extened Window Manager Hints
 	XEvent xev;
 	Atom wm_state = XInternAtom(x11_display, "_NET_WM_STATE", False);
@@ -701,6 +711,23 @@ void OS_X11::set_wm_fullscreen(bool p_enabled) {
 	xev.xclient.data.l[2] = 0;
 
 	XSendEvent(x11_display, DefaultRootWindow(x11_display), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+	XFlush(x11_display);
+
+	if (!p_enabled && !is_window_resizable()) {
+		// Reset the non-resizable flags if we un-set these before.
+		Size2 size = get_window_size();
+		XSizeHints *xsh;
+
+		xsh = XAllocSizeHints();
+		xsh->flags = PMinSize | PMaxSize;
+		xsh->min_width = size.x;
+		xsh->max_width = size.x;
+		xsh->min_height = size.y;
+		xsh->max_height = size.y;
+
+		XSetWMNormalHints(x11_display, x11_window, xsh);
+		XFree(xsh);
+	}
 }
 
 int OS_X11::get_screen_count() const {