Wire up clipboard lost events

This commit is contained in:
Kovid Goyal 2025-03-12 09:26:36 +05:30
parent 08b4e3f2e0
commit b34a88065b
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
10 changed files with 40 additions and 0 deletions

3
glfw/glfw3.h vendored
View file

@ -1432,6 +1432,7 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow*);
*/
typedef void (* GLFWapplicationclosefun)(int);
/*! @brief The function pointer type for system color theme change callbacks.
*
* This is the function pointer type for system color theme changes.
@ -1814,6 +1815,7 @@ typedef enum {
typedef GLFWDataChunk (* GLFWclipboarditerfun)(const char *mime_type, void *iter, GLFWClipboardType ctype);
typedef bool (* GLFWclipboardwritedatafun)(void *object, const char *data, size_t sz);
typedef bool (* GLFWimecursorpositionfun)(GLFWwindow *window, GLFWIMEUpdateEvent *ev);
typedef void (* GLFWclipboardlostfun )(GLFWClipboardType);
/*! @brief Video mode type.
*
@ -3985,6 +3987,7 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind
GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback);
GLFWAPI GLFWapplicationclosefun glfwSetApplicationCloseCallback(GLFWapplicationclosefun callback);
GLFWAPI GLFWsystemcolorthemechangefun glfwSetSystemColorThemeChangeCallback(GLFWsystemcolorthemechangefun callback);
GLFWAPI GLFWclipboardlostfun glfwSetClipboardLostCallback(GLFWclipboardlostfun callback);
GLFWAPI GLFWColorScheme glfwGetCurrentSystemColorTheme(bool query_if_unintialized);
/*! @brief Sets the refresh callback for the specified window.

7
glfw/init.c vendored
View file

@ -395,6 +395,13 @@ GLFWAPI GLFWsystemcolorthemechangefun glfwSetSystemColorThemeChangeCallback(GLFW
return cbfun;
}
GLFWAPI GLFWclipboardlostfun glfwSetClipboardLostCallback(GLFWclipboardlostfun cbfun)
{
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_GLFW_SWAP_POINTERS(_glfw.callbacks.clipboard_lost, cbfun);
return cbfun;
}
GLFWAPI GLFWdrawtextfun glfwSetDrawTextFunction(GLFWdrawtextfun cbfun)
{

5
glfw/input.c vendored
View file

@ -453,6 +453,11 @@ void _glfwInputColorScheme(GLFWColorScheme value, bool is_initial_value) {
if (_glfw.callbacks.system_color_theme_change) _glfw.callbacks.system_color_theme_change(value, is_initial_value);
}
void _glfwInputClipboardLost(GLFWClipboardType which) {
if (_glfw.callbacks.clipboard_lost) _glfw.callbacks.clipboard_lost(which);
}
//////////////////////////////////////////////////////////////////////////
////// GLFW internal API //////
//////////////////////////////////////////////////////////////////////////

2
glfw/internal.h vendored
View file

@ -644,6 +644,7 @@ struct _GLFWlibrary
GLFWmonitorfun monitor;
GLFWjoystickfun joystick;
GLFWapplicationclosefun application_close;
GLFWclipboardlostfun clipboard_lost;
GLFWsystemcolorthemechangefun system_color_theme_change;
GLFWdrawtextfun draw_text;
GLFWcurrentselectionfun get_current_selection;
@ -809,6 +810,7 @@ void _glfwInputWindowCloseRequest(_GLFWwindow* window);
void _glfwInputWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor);
void _glfwInputKeyboard(_GLFWwindow *window, GLFWkeyevent *ev);
void _glfwInputClipboardLost(GLFWClipboardType which);
void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset, int flags, int mods);
void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods);
void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos);

2
glfw/wl_window.c vendored
View file

@ -2204,6 +2204,7 @@ static void data_source_canceled(void *data UNUSED, struct wl_data_source *wl_da
if (_glfw.wl.dataSourceForClipboard == wl_data_source) {
_glfw.wl.dataSourceForClipboard = NULL;
_glfw_free_clipboard_data(&_glfw.clipboard);
_glfwInputClipboardLost(GLFW_CLIPBOARD);
}
wl_data_source_destroy(wl_data_source);
}
@ -2212,6 +2213,7 @@ static void primary_selection_source_canceled(void *data UNUSED, struct zwp_prim
if (_glfw.wl.dataSourceForPrimarySelection == primary_selection_source) {
_glfw.wl.dataSourceForPrimarySelection = NULL;
_glfw_free_clipboard_data(&_glfw.primary);
_glfwInputClipboardLost(GLFW_PRIMARY_SELECTION);
}
zwp_primary_selection_source_v1_destroy(primary_selection_source);
}

2
glfw/x11_window.c vendored
View file

@ -902,10 +902,12 @@ static void handleSelectionClear(XEvent* event)
if (event->xselectionclear.selection == _glfw.x11.PRIMARY)
{
_glfw_free_clipboard_data(&_glfw.primary);
_glfwInputClipboardLost(GLFW_PRIMARY_SELECTION);
}
else
{
_glfw_free_clipboard_data(&_glfw.clipboard);
_glfwInputClipboardLost(GLFW_CLIPBOARD);
}
}

View file

@ -18,6 +18,7 @@ from time import sleep
from typing import (
TYPE_CHECKING,
Any,
Literal,
Optional,
Union,
)
@ -3109,3 +3110,6 @@ class Boss:
cocoa_show_progress_bar_on_dock_icon(101)
else:
cocoa_show_progress_bar_on_dock_icon()
def on_clipboard_lost(self, which: Literal['clipboard', 'primary']) -> None:
pass

3
kitty/glfw-wrapper.c generated
View file

@ -245,6 +245,9 @@ load_glfw(const char* path) {
*(void **) (&glfwSetSystemColorThemeChangeCallback_impl) = dlsym(handle, "glfwSetSystemColorThemeChangeCallback");
if (glfwSetSystemColorThemeChangeCallback_impl == NULL) fail("Failed to load glfw function glfwSetSystemColorThemeChangeCallback with error: %s", dlerror());
*(void **) (&glfwSetClipboardLostCallback_impl) = dlsym(handle, "glfwSetClipboardLostCallback");
if (glfwSetClipboardLostCallback_impl == NULL) fail("Failed to load glfw function glfwSetClipboardLostCallback with error: %s", dlerror());
*(void **) (&glfwGetCurrentSystemColorTheme_impl) = dlsym(handle, "glfwGetCurrentSystemColorTheme");
if (glfwGetCurrentSystemColorTheme_impl == NULL) fail("Failed to load glfw function glfwGetCurrentSystemColorTheme with error: %s", dlerror());

6
kitty/glfw-wrapper.h generated
View file

@ -1170,6 +1170,7 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow*);
*/
typedef void (* GLFWapplicationclosefun)(int);
/*! @brief The function pointer type for system color theme change callbacks.
*
* This is the function pointer type for system color theme changes.
@ -1552,6 +1553,7 @@ typedef enum {
typedef GLFWDataChunk (* GLFWclipboarditerfun)(const char *mime_type, void *iter, GLFWClipboardType ctype);
typedef bool (* GLFWclipboardwritedatafun)(void *object, const char *data, size_t sz);
typedef bool (* GLFWimecursorpositionfun)(GLFWwindow *window, GLFWIMEUpdateEvent *ev);
typedef void (* GLFWclipboardlostfun )(GLFWClipboardType);
/*! @brief Video mode type.
*
@ -2017,6 +2019,10 @@ typedef GLFWsystemcolorthemechangefun (*glfwSetSystemColorThemeChangeCallback_fu
GFW_EXTERN glfwSetSystemColorThemeChangeCallback_func glfwSetSystemColorThemeChangeCallback_impl;
#define glfwSetSystemColorThemeChangeCallback glfwSetSystemColorThemeChangeCallback_impl
typedef GLFWclipboardlostfun (*glfwSetClipboardLostCallback_func)(GLFWclipboardlostfun);
GFW_EXTERN glfwSetClipboardLostCallback_func glfwSetClipboardLostCallback_impl;
#define glfwSetClipboardLostCallback glfwSetClipboardLostCallback_impl
typedef GLFWColorScheme (*glfwGetCurrentSystemColorTheme_func)(bool);
GFW_EXTERN glfwGetCurrentSystemColorTheme_func glfwGetCurrentSystemColorTheme_impl;
#define glfwGetCurrentSystemColorTheme glfwGetCurrentSystemColorTheme_impl

View file

@ -65,6 +65,11 @@ on_system_color_scheme_change(GLFWColorScheme appearance, bool is_initial_value)
call_boss(on_system_color_scheme_change, "sO", which, is_initial_value ? Py_True : Py_False);
}
static void
on_clipboard_lost(GLFWClipboardType which) {
call_boss(on_clipboard_lost, "s", which == GLFW_CLIPBOARD ? "clipboard" : "primary");
}
static void
strip_csi_(const char *title, char *buf, size_t bufsz) {
enum { NORMAL, IN_ESC, IN_CSI} state = NORMAL;
@ -1195,6 +1200,7 @@ create_os_window(PyObject UNUSED *self, PyObject *args, PyObject *kw) {
glfwSetHasCurrentSelectionCallback(has_current_selection);
glfwSetIMECursorPositionCallback(get_ime_cursor_position);
glfwSetSystemColorThemeChangeCallback(on_system_color_scheme_change);
glfwSetClipboardLostCallback(on_clipboard_lost);
// Request SRGB output buffer
// Prevents kitty from starting on Wayland + NVIDIA, sigh: https://github.com/kovidgoyal/kitty/issues/7021
// Remove after https://github.com/NVIDIA/egl-wayland/issues/85 is fixed.