diff options
Diffstat (limited to 'platform/linuxbsd')
| -rw-r--r-- | platform/linuxbsd/detect.py | 6 | ||||
| -rw-r--r-- | platform/linuxbsd/display_server_x11.cpp | 33 | ||||
| -rw-r--r-- | platform/linuxbsd/display_server_x11.h | 2 | 
3 files changed, 41 insertions, 0 deletions
diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 3eb4c44bc1..f5e2c72bbc 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -35,6 +35,11 @@ def can_build():          print("xinerama not found.. x11 disabled.")          return False +    x11_error = os.system("pkg-config xext --modversion > /dev/null ") +    if x11_error: +        print("xext not found.. x11 disabled.") +        return False +      x11_error = os.system("pkg-config xrandr --modversion > /dev/null ")      if x11_error:          print("xrandr not found.. x11 disabled.") @@ -194,6 +199,7 @@ def configure(env):      env.ParseConfig("pkg-config x11 --cflags --libs")      env.ParseConfig("pkg-config xcursor --cflags --libs")      env.ParseConfig("pkg-config xinerama --cflags --libs") +    env.ParseConfig("pkg-config xext --cflags --libs")      env.ParseConfig("pkg-config xrandr --cflags --libs")      env.ParseConfig("pkg-config xrender --cflags --libs")      env.ParseConfig("pkg-config xi --cflags --libs") diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index fe9e253cc9..6e925d6ac7 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -50,6 +50,7 @@  #include <X11/Xatom.h>  #include <X11/Xutil.h>  #include <X11/extensions/Xinerama.h> +#include <X11/extensions/shape.h>  // ICCCM  #define WM_NormalState 1L // window normal state @@ -782,6 +783,38 @@ void DisplayServerX11::window_set_title(const String &p_title, WindowID p_window  	XChangeProperty(x11_display, wd.x11_window, _net_wm_name, utf8_string, 8, PropModeReplace, (unsigned char *)p_title.utf8().get_data(), p_title.utf8().length());  } +void DisplayServerX11::window_set_mouse_passthrough(const Vector<Vector2> &p_region, WindowID p_window) { +	_THREAD_SAFE_METHOD_ + +	ERR_FAIL_COND(!windows.has(p_window)); +	const WindowData &wd = windows[p_window]; + +	int event_base, error_base; +	const Bool ext_okay = XShapeQueryExtension(x11_display, &event_base, &error_base); +	if (ext_okay) { +		Region region; +		if (p_region.size() == 0) { +			region = XCreateRegion(); +			XRectangle rect; +			rect.x = 0; +			rect.y = 0; +			rect.width = window_get_real_size(p_window).x; +			rect.height = window_get_real_size(p_window).y; +			XUnionRectWithRegion(&rect, region, region); +		} else { +			XPoint *points = (XPoint *)memalloc(sizeof(XPoint) * p_region.size()); +			for (int i = 0; i < p_region.size(); i++) { +				points[i].x = p_region[i].x; +				points[i].y = p_region[i].y; +			} +			region = XPolygonRegion(points, p_region.size(), EvenOddRule); +			memfree(points); +		} +		XShapeCombineRegion(x11_display, wd.x11_window, ShapeInput, 0, 0, region, ShapeSet); +		XDestroyRegion(region); +	} +} +  void DisplayServerX11::window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window) {  	_THREAD_SAFE_METHOD_ diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index 57cee910a0..e894cf515c 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -291,6 +291,8 @@ public:  	virtual ObjectID window_get_attached_instance_id(WindowID p_window = MAIN_WINDOW_ID) const;  	virtual void window_set_title(const String &p_title, WindowID p_window = MAIN_WINDOW_ID); +	virtual void window_set_mouse_passthrough(const Vector<Vector2> &p_region, WindowID p_window = MAIN_WINDOW_ID); +  	virtual void window_set_rect_changed_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID);  	virtual void window_set_window_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID);  	virtual void window_set_input_event_callback(const Callable &p_callable, WindowID p_window = MAIN_WINDOW_ID);  |