[PATCH 07/12] Xming: Cache atom lookups in clipboard integration code

Jon TURNEY jon.turney at dronecode.org.uk
Wed May 20 04:52:25 PDT 2009


From: Colin Harrison <colin.harrison at virgin.net>

Cache the CLIPBOARD atom lookups in winClipboardWindowProc()
Cache atom lookups in winClipboardFlushXEvents()
Recache on server regeneration

Copyright (C) Colin Harrison 2005-2008
http://www.straightrunning.com/XmingNotes/
http://sourceforge.net/projects/xming/

Signed-off-by: Jon TURNEY <jon.turney at dronecode.org.uk>
---
 hw/xwin/winclipboardwndproc.c |   21 ++++++++++++---------
 hw/xwin/winclipboardxevents.c |   27 +++++++++++++++------------
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/hw/xwin/winclipboardwndproc.c b/hw/xwin/winclipboardwndproc.c
index 04c0c58..2983de8 100644
--- a/hw/xwin/winclipboardwndproc.c
+++ b/hw/xwin/winclipboardwndproc.c
@@ -36,6 +36,7 @@
 #include <sys/types.h>
 #include <sys/time.h>
 #include "winclipboard.h"
+#include "misc.h"
 
 extern void		winFixClipboardChain();
 
@@ -261,6 +262,8 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 
     case WM_DRAWCLIPBOARD:
       {
+	static Atom atomClipboard;
+	static int generation;
 	static Bool s_fProcessingDrawClipboard = FALSE;
 	Display	*pDisplay = g_pClipboardDisplay;
 	Window	iWindow = g_iClipboardWindow;
@@ -268,6 +271,12 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 
 	winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD: Enter\n");
 
+	if (generation != serverGeneration)
+          {
+            generation = serverGeneration;
+            atomClipboard = XInternAtom (pDisplay, "CLIPBOARD", False);
+          }
+
 	/*
 	 * We've occasionally seen a loop in the clipboard chain.
 	 * Try and fix it on the first hint of recursion.
@@ -355,17 +364,13 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 
 	    /* Release CLIPBOARD selection if owned */
 	    iReturn = XGetSelectionOwner (pDisplay,
-					  XInternAtom (pDisplay,
-						       "CLIPBOARD",
-						       False));
+					  atomClipboard);
 	    if (iReturn == g_iClipboardWindow)
 	      {
 		winDebug ("winClipboardWindowProc - WM_DRAWCLIPBOARD - "
 			"CLIPBOARD selection is owned by us.\n");
 		XSetSelectionOwner (pDisplay,
-				    XInternAtom (pDisplay,
-						 "CLIPBOARD",
-						 False),
+				    atomClipboard,
 				    None,
 				    CurrentTime);
 	      }
@@ -399,9 +404,7 @@ winClipboardWindowProc (HWND hwnd, UINT message,
 	
 	/* Reassert ownership of the CLIPBOARD */	  
 	iReturn = XSetSelectionOwner (pDisplay,
-				      XInternAtom (pDisplay,
-						   "CLIPBOARD",
-						   False),
+				      atomClipboard,
 				      iWindow,
 				      CurrentTime);
 
diff --git a/hw/xwin/winclipboardxevents.c b/hw/xwin/winclipboardxevents.c
index 95e86b1..ab8d5e4 100644
--- a/hw/xwin/winclipboardxevents.c
+++ b/hw/xwin/winclipboardxevents.c
@@ -34,6 +34,7 @@
 #include <xwin-config.h>
 #endif
 #include "winclipboard.h"
+#include "misc.h"
 
 
 /*
@@ -53,18 +54,20 @@ winClipboardFlushXEvents (HWND hwnd,
 			  Display *pDisplay,
 			  Bool fUseUnicode)
 {
-  Atom			atomLocalProperty = XInternAtom (pDisplay,
-							 WIN_LOCAL_PROPERTY,
-							 False);
-  Atom			atomUTF8String = XInternAtom (pDisplay,
-						      "UTF8_STRING",
-						      False);
-  Atom			atomCompoundText = XInternAtom (pDisplay,
-							"COMPOUND_TEXT",
-							False);
-  Atom			atomTargets = XInternAtom (pDisplay,
-						   "TARGETS",
-						   False);
+  static Atom atomLocalProperty;
+  static Atom atomCompoundText;
+  static Atom atomUTF8String;
+  static Atom atomTargets;
+  static int generation;
+
+  if (generation != serverGeneration)
+    {
+      generation = serverGeneration;
+      atomLocalProperty = XInternAtom (pDisplay, WIN_LOCAL_PROPERTY, False);
+      atomUTF8String = XInternAtom (pDisplay, "UTF8_STRING", False);
+      atomCompoundText = XInternAtom (pDisplay, "COMPOUND_TEXT", False);
+      atomTargets = XInternAtom (pDisplay, "TARGETS", False);
+    }
 
   /* Process all pending events */
   while (XPending (pDisplay))
-- 
1.6.1.2



More information about the xorg-devel mailing list