Browse Source

Add a focus out timeout for X11 to less events of this type are received

Juan Linietsky 5 years ago
parent
commit
0b7bc83fe3
2 changed files with 11 additions and 4 deletions
  1. 10 4
      platform/linuxbsd/display_server_x11.cpp
  2. 1 0
      platform/linuxbsd/display_server_x11.h

+ 10 - 4
platform/linuxbsd/display_server_x11.cpp

@@ -2349,11 +2349,17 @@ void DisplayServerX11::process_events() {
 		}
 
 		if (!focus_found) {
-			if (OS::get_singleton()->get_main_loop()) {
-				OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_OUT);
-			}
+			uint64_t delta = OS::get_singleton()->get_ticks_msec() - time_since_no_focus;
 
-			app_focused = false;
+			if (delta > 250) {
+				//X11 can go between windows and have no focus for a while, when creating them or something else. Use this as safety to avoid unnecesary focus in/outs.
+				if (OS::get_singleton()->get_main_loop()) {
+					OS::get_singleton()->get_main_loop()->notification(MainLoop::NOTIFICATION_APPLICATION_FOCUS_OUT);
+				}
+				app_focused = false;
+			}
+		} else {
+			time_since_no_focus = OS::get_singleton()->get_ticks_msec();
 		}
 	}
 

+ 1 - 0
platform/linuxbsd/display_server_x11.h

@@ -167,6 +167,7 @@ class DisplayServerX11 : public DisplayServer {
 	int last_click_button_index;
 	uint32_t last_button_state;
 	bool app_focused = false;
+	uint64_t time_since_no_focus = 0;
 
 	struct {
 		int opcode;