summaryrefslogtreecommitdiff
path: root/src/xwayland/XWM.cpp
diff options
context:
space:
mode:
authorDDoSolitary <DDoSolitary@gmail.com>2025-01-21 01:53:29 +0800
committerGitHub <noreply@github.com>2025-01-20 17:53:29 +0000
commit9e8d9791c7f9b7d1183110da370772a8b2c1b6f4 (patch)
treeb76cacc082b7f9f78f0898f1bad44aebb3e84760 /src/xwayland/XWM.cpp
parent2d82a923241c0d7cb6209ee035bbac581d4dc555 (diff)
xwayland: support sending clipboard change notification on focus (#9111)
Diffstat (limited to 'src/xwayland/XWM.cpp')
-rw-r--r--src/xwayland/XWM.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/xwayland/XWM.cpp b/src/xwayland/XWM.cpp
index ae8e0ccc..3486b286 100644
--- a/src/xwayland/XWM.cpp
+++ b/src/xwayland/XWM.cpp
@@ -1144,7 +1144,8 @@ void CXWM::initSelection() {
XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER | XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_WINDOW_DESTROY | XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE;
xcb_xfixes_select_selection_input(connection, clipboard.window, HYPRATOMS["CLIPBOARD"], mask2);
- clipboard.listeners.setSelection = g_pSeatManager->events.setSelection.registerListener([this](std::any d) { clipboard.onSelection(); });
+ clipboard.listeners.setSelection = g_pSeatManager->events.setSelection.registerListener([this](std::any d) { clipboard.onSelection(); });
+ clipboard.listeners.keyboardFocusChange = g_pSeatManager->events.keyboardFocusChange.registerListener([this](std::any d) { clipboard.onKeyboardFocus(); });
dndSelection.window = xcb_generate_id(connection);
xcb_create_window(connection, XCB_COPY_FROM_PARENT, dndSelection.window, screen->root, 0, 0, 8192, 8192, 0, XCB_WINDOW_CLASS_INPUT_ONLY, screen->root_visual, XCB_CW_EVENT_MASK,
@@ -1287,6 +1288,16 @@ void SXSelection::onSelection() {
if (g_pSeatManager->selection.currentSelection) {
xcb_set_selection_owner(g_pXWayland->pWM->connection, g_pXWayland->pWM->clipboard.window, HYPRATOMS["CLIPBOARD"], XCB_TIME_CURRENT_TIME);
xcb_flush(g_pXWayland->pWM->connection);
+ g_pXWayland->pWM->clipboard.notifyOnFocus = true;
+ }
+}
+
+void SXSelection::onKeyboardFocus() {
+ if (!g_pSeatManager->state.keyboardFocusResource || g_pSeatManager->state.keyboardFocusResource->client() != g_pXWayland->pServer->xwaylandClient)
+ return;
+ if (g_pXWayland->pWM->clipboard.notifyOnFocus) {
+ onSelection();
+ g_pXWayland->pWM->clipboard.notifyOnFocus = false;
}
}