summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorIgnacio Casal Quinteiro <icq@gnome.org>2015-11-12 16:42:51 +0100
committerIgnacio Casal Quinteiro <icq@gnome.org>2015-11-12 17:09:25 +0100
commit1f5f3ca41bd2419e1aee3f210f683541a8a3f56f (patch)
tree6a042167877436de234b21af950c4817d7c3bd7e /gdk
parenta4ccf0e382e58d7124201027d2deab0a5eb29899 (diff)
downloadgtk+-1f5f3ca41bd2419e1aee3f210f683541a8a3f56f.tar.gz
win32: destroy clipboard notification window on dispose
The clipboard uses a hidden window to get some specific events. The window was created but never destroyed on dispose.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/win32/gdkdisplay-win32.c48
-rw-r--r--gdk/win32/gdkdisplay-win32.h1
2 files changed, 28 insertions, 21 deletions
diff --git a/gdk/win32/gdkdisplay-win32.c b/gdk/win32/gdkdisplay-win32.c
index c819efc7f3..7b1fbd8738 100644
--- a/gdk/win32/gdkdisplay-win32.c
+++ b/gdk/win32/gdkdisplay-win32.c
@@ -570,30 +570,32 @@ _clipboard_window_procedure (HWND hwnd,
/*
* Creates a hidden window and adds it to the clipboard chain
*/
-static HWND
-_gdk_win32_register_clipboard_notification (void)
+static gboolean
+register_clipboard_notification (GdkDisplay *display)
{
+ GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display);
WNDCLASS wclass = { 0, };
- HWND hwnd;
- ATOM klass;
+ HWND hwnd;
+ ATOM klass;
wclass.lpszClassName = "GdkClipboardNotification";
- wclass.lpfnWndProc = _clipboard_window_procedure;
- wclass.hInstance = _gdk_app_hmodule;
+ wclass.lpfnWndProc = _clipboard_window_procedure;
+ wclass.hInstance = _gdk_app_hmodule;
klass = RegisterClass (&wclass);
if (!klass)
- return NULL;
+ return FALSE;
+
+ display_win32->clipboard_hwnd = CreateWindow (MAKEINTRESOURCE (klass),
+ NULL, WS_POPUP,
+ 0, 0, 0, 0, NULL, NULL,
+ _gdk_app_hmodule, NULL);
- hwnd = CreateWindow (MAKEINTRESOURCE (klass),
- NULL, WS_POPUP,
- 0, 0, 0, 0, NULL, NULL,
- _gdk_app_hmodule, NULL);
- if (!hwnd)
+ if (display_win32->clipboard_hwnd == NULL)
goto failed;
SetLastError (0);
- _hwnd_next_viewer = SetClipboardViewer (hwnd);
+ _hwnd_next_viewer = SetClipboardViewer (display_win32->clipboard_hwnd);
if (_hwnd_next_viewer == NULL && GetLastError() != 0)
goto failed;
@@ -603,20 +605,20 @@ _gdk_win32_register_clipboard_notification (void)
/* if (AddClipboardFormatListener (hwnd) == FALSE) */
/* goto failed; */
- return hwnd;
+ return TRUE;
failed:
g_critical ("Failed to install clipboard viewer");
UnregisterClass (MAKEINTRESOURCE (klass), _gdk_app_hmodule);
- return NULL;
+ return FALSE;
}
static gboolean
gdk_win32_display_request_selection_notification (GdkDisplay *display,
- GdkAtom selection)
+ GdkAtom selection)
{
- static HWND hwndViewer = NULL;
+ GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display);
gboolean ret = FALSE;
GDK_NOTE (DND,
@@ -626,12 +628,14 @@ gdk_win32_display_request_selection_notification (GdkDisplay *display,
if (selection == GDK_SELECTION_CLIPBOARD ||
selection == GDK_SELECTION_PRIMARY)
{
- if (!hwndViewer)
+ if (display_win32->clipboard_hwnd == NULL)
{
- hwndViewer = _gdk_win32_register_clipboard_notification ();
- GDK_NOTE (DND, g_print (" registered"));
+ if (register_clipboard_notification (display))
+ GDK_NOTE (DND, g_print (" registered"));
+ else
+ GDK_NOTE (DND, g_print (" failed to register"));
}
- ret = (hwndViewer != NULL);
+ ret = (display_win32->clipboard_hwnd != NULL);
}
else
{
@@ -711,6 +715,8 @@ gdk_win32_display_dispose (GObject *object)
GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (object);
g_clear_pointer (&display_win32->hwnd, (GDestroyNotify)DestroyWindow);
+ g_clear_pointer (&display_win32->clipboard_hwnd, (GDestroyNotify)DestroyWindow);
+ _hwnd_next_viewer = NULL;
G_OBJECT_CLASS (gdk_win32_display_parent_class)->dispose (object);
}
diff --git a/gdk/win32/gdkdisplay-win32.h b/gdk/win32/gdkdisplay-win32.h
index 8cb08614fe..250c13bfce 100644
--- a/gdk/win32/gdkdisplay-win32.h
+++ b/gdk/win32/gdkdisplay-win32.h
@@ -32,6 +32,7 @@ struct _GdkWin32Display
GHashTable *cursor_cache;
HWND hwnd;
+ HWND clipboard_hwnd;
/* WGL/OpenGL Items */
guint have_wgl : 1;