浏览代码

get_screen_position() added

hurikhan 10 年之前
父节点
当前提交
ce7c7a862e

+ 5 - 0
core/bind/core_bind.cpp

@@ -181,6 +181,10 @@ int _OS::get_screen_count() const {
 	return OS::get_singleton()->get_screen_count();
 }
 
+Point2 _OS::get_screen_position(int p_screen) const {
+	return OS::get_singleton()->get_screen_position(p_screen);
+}
+
 Size2 _OS::get_screen_size(int p_screen) const {
 	return OS::get_singleton()->get_screen_size(p_screen);
 }
@@ -668,6 +672,7 @@ void _OS::_bind_methods() {
 
 #ifdef EXPERIMENTAL_WM_API
 	ObjectTypeDB::bind_method(_MD("get_screen_count"),&_OS::get_screen_count);
+	ObjectTypeDB::bind_method(_MD("get_screen_position"),&_OS::get_screen_position,DEFVAL(0));
 	ObjectTypeDB::bind_method(_MD("get_screen_size"),&_OS::get_screen_size,DEFVAL(0));
 	ObjectTypeDB::bind_method(_MD("get_window_position"),&_OS::get_window_position);
 	ObjectTypeDB::bind_method(_MD("set_window_position"),&_OS::set_window_position);

+ 1 - 0
core/bind/core_bind.h

@@ -110,6 +110,7 @@ public:
 
 #ifdef EXPERIMENTAL_WM_API
 	virtual int get_screen_count() const;
+	virtual Point2 get_screen_position(int p_screen=0) const;
 	virtual Size2 get_screen_size(int p_screen=0) const;
 	virtual Point2 get_window_position() const;
 	virtual void set_window_position(const Point2& p_position);

+ 1 - 0
core/os/os.h

@@ -152,6 +152,7 @@ public:
 
 #ifdef EXPERIMENTAL_WM_API
 	virtual int get_screen_count() const=0;
+	virtual Point2 get_screen_position(int p_screen=0) const=0;
 	virtual Size2 get_screen_size(int p_screen=0) const=0;
 	virtual Point2 get_window_position() const=0;
 	virtual void set_window_position(const Point2& p_position)=0;

+ 8 - 3
demos/misc/window_management/control.gd

@@ -15,11 +15,16 @@ func _fixed_process(delta):
 	
 	get_node("Label_Screen0_Resolution").set_text( str("Screen0 Resolution:\n", OS.get_screen_size() ) )
 	
+	get_node("Label_Screen0_Position").set_text(str("Screen0 Position:\n",OS.get_screen_position()))
+	
 	if(OS.get_screen_count() > 1):
 		get_node("Label_Screen1_Resolution").show()
-		get_node("Label_Screen1_Resolution").set_text( str("Screen0 Resolution:\n", OS.get_screen_size(1) ) )
-
-
+		get_node("Label_Screen1_Resolution").set_text( str("Screen1 Resolution:\n", OS.get_screen_size(1) ) )
+		get_node("Label_Screen1_Position").show()
+		get_node("Label_Screen1_Position").set_text( str("Screen1 Position:\n", OS.get_screen_size(1) ) )
+	else:
+		get_node("Label_Screen1_Resolution").hide()
+		get_node("Label_Screen1_Position").hide()
 func _ready():
 	set_fixed_process(true)
 

二进制
demos/misc/window_management/window_management.scn


+ 12 - 0
platform/x11/os_x11.cpp

@@ -561,7 +561,19 @@ int OS_X11::get_screen_count() const {
 	return XScreenCount(x11_display);
 }
 
+Point2 OS_X11::get_screen_position(int p_screen) const {
+	if( p_screen >= XScreenCount(x11_display) )
+		return Point2i(0,0);
+
+	Window root = XRootWindow(x11_display, p_screen);
+	XWindowAttributes xwa;
+	XGetWindowAttributes(x11_display, root, &xwa);
+	return Point2i(xwa.x, xwa.y);
+}
+
 Size2 OS_X11::get_screen_size(int p_screen) const {
+	if( p_screen >= XScreenCount(x11_display) )
+		return Size2i(0,0);
 	Window root = XRootWindow(x11_display, p_screen);
 	XWindowAttributes xwa;
 	XGetWindowAttributes(x11_display, root, &xwa);

+ 1 - 0
platform/x11/os_x11.h

@@ -221,6 +221,7 @@ public:
 
 #ifdef EXPERIMENTAL_WM_API
 	virtual int get_screen_count() const;
+	virtual Point2 get_screen_position(int p_screen=0) const;
 	virtual Size2 get_screen_size(int p_screen=0) const;
 	virtual Point2 get_window_position() const;
 	virtual void set_window_position(const Point2& p_position);