aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2025-02-10 19:31:27 +0100
committerdec05eba <dec05eba@protonmail.com>2025-02-10 19:31:27 +0100
commitfc2f6f4c500d0364d5dd5cf366be2fa8592f8469 (patch)
treead8ffcab18e0aeca25abb4ea0f751f8bf12b7f8b /src
parentf4e44cbef5dbbc2a2b71e7b9b70ee72d30b7c6a6 (diff)
Better detect focused x11 window on wayland, properly get focused game name on wayland
Diffstat (limited to 'src')
-rw-r--r--src/Overlay.cpp2
-rw-r--r--src/WindowUtils.cpp25
2 files changed, 21 insertions, 6 deletions
diff --git a/src/Overlay.cpp b/src/Overlay.cpp
index 8a1eefc..feb4e6f 100644
--- a/src/Overlay.cpp
+++ b/src/Overlay.cpp
@@ -1453,6 +1453,8 @@ namespace gsr {
const Window gsr_ui_window = window ? window->get_system_handle() : None;
std::string focused_window_name = get_window_name_at_cursor_position(display, gsr_ui_window);
if(focused_window_name.empty())
+ focused_window_name = get_focused_window_name(display, WindowCaptureType::FOCUSED);
+ if(focused_window_name.empty())
focused_window_name = "Game";
string_replace_characters(focused_window_name.data(), "/\\", '_');
diff --git a/src/WindowUtils.cpp b/src/WindowUtils.cpp
index 3d3a6a6..c8bb859 100644
--- a/src/WindowUtils.cpp
+++ b/src/WindowUtils.cpp
@@ -16,8 +16,6 @@ extern "C" {
#include <string.h>
#include <poll.h>
-#include <optional>
-
#define MAX_PROPERTY_VALUE_LEN 4096
namespace gsr {
@@ -105,7 +103,17 @@ namespace gsr {
unsigned int dummy_u;
mgl::vec2i root_pos;
XQueryPointer(dpy, DefaultRootWindow(dpy), &root_window, window, &root_pos.x, &root_pos.y, &dummy_i, &dummy_i, &dummy_u);
+
+ const Window direct_window = *window;
*window = window_get_target_window_child(dpy, *window);
+ // HACK: Count some other x11 windows as having an x11 window focused. Some games seem to create an Input window and that gets focused.
+ if(!*window) {
+ XWindowAttributes attr;
+ memset(&attr, 0, sizeof(attr));
+ XGetWindowAttributes(dpy, direct_window, &attr);
+ if(attr.c_class == InputOnly && !get_window_title(dpy, direct_window))
+ *window = direct_window;
+ }
return root_pos;
}
@@ -162,7 +170,7 @@ namespace gsr {
return result;
}
- static std::optional<std::string> get_window_title(Display *dpy, Window window) {
+ std::optional<std::string> get_window_title(Display *dpy, Window window) {
const Atom net_wm_name_atom = XInternAtom(dpy, "_NET_WM_NAME", False);
const Atom wm_name_atom = XInternAtom(dpy, "WM_NAME", False);
const Atom utf8_string_atom = XInternAtom(dpy, "UTF8_STRING", False);
@@ -252,13 +260,18 @@ namespace gsr {
XWindowAttributes attr;
memset(&attr, 0, sizeof(attr));
XGetWindowAttributes(dpy, children[i], &attr);
- if(attr.override_redirect || attr.c_class != InputOutput)
+ if(attr.override_redirect || attr.c_class != InputOutput || attr.map_state != IsViewable)
continue;
- if(position.x >= attr.x && position.x <= attr.x + attr.width && position.y >= attr.y && position.y <= attr.y + attr.height && window_is_user_program(dpy, children[i])) {
- const std::optional<std::string> window_title = get_window_title(dpy, children[i]);
+ if(position.x >= attr.x && position.x <= attr.x + attr.width && position.y >= attr.y && position.y <= attr.y + attr.height) {
+ const Window real_window = window_get_target_window_child(dpy, children[i]);
+ if(!real_window || real_window == ignore_window)
+ continue;
+
+ const std::optional<std::string> window_title = get_window_title(dpy, real_window);
if(window_title)
result = strip(window_title.value());
+
break;
}
}