diff options
| author | DDoSolitary <DDoSolitary@gmail.com> | 2025-01-21 01:53:29 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-20 17:53:29 +0000 |
| commit | 9e8d9791c7f9b7d1183110da370772a8b2c1b6f4 (patch) | |
| tree | b76cacc082b7f9f78f0898f1bad44aebb3e84760 /src/xwayland/XWM.cpp | |
| parent | 2d82a923241c0d7cb6209ee035bbac581d4dc555 (diff) | |
xwayland: support sending clipboard change notification on focus (#9111)
Diffstat (limited to 'src/xwayland/XWM.cpp')
| -rw-r--r-- | src/xwayland/XWM.cpp | 13 |
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; } } |
