From b82f44e3565b6670e816f4081076596d0ea0236b Mon Sep 17 00:00:00 2001
From: Ulrich Sibiller <uli42@gmx.de>
Date: Fri, 14 Feb 2020 00:28:59 +0100
Subject: nxagent: Add keystroke for dumping the current clipboard state

---
 nx-X11/programs/Xserver/hw/nxagent/Clipboard.c | 34 +++++++-------------------
 nx-X11/programs/Xserver/hw/nxagent/Clipboard.h |  2 ++
 nx-X11/programs/Xserver/hw/nxagent/Events.c    |  5 ++++
 nx-X11/programs/Xserver/hw/nxagent/Events.h    |  1 +
 nx-X11/programs/Xserver/hw/nxagent/Keystroke.c |  6 +++++
 nx-X11/programs/Xserver/hw/nxagent/Keystroke.h |  4 ++-
 6 files changed, 26 insertions(+), 26 deletions(-)

(limited to 'nx-X11/programs')

diff --git a/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c b/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c
index d51f066a9..990c175a0 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c
@@ -68,9 +68,7 @@ extern Selection *CurrentSelections;
 int nxagentLastClipboardClient = -1;
 
 static int agentClipboardInitialized = False;
-#ifdef DEBUG
 static int clientAccum;
-#endif
 
 XlibAtom serverTransToAgentProperty;
 Atom clientCutProperty;
@@ -156,19 +154,16 @@ static char szAgentCLIPBOARD[] = "CLIPBOARD";
 /* number of milliseconds to wait for a conversion from the real X server. */
 #define CONVERSION_TIMEOUT 5000
 
-#ifdef DEBUG
 /*
  * Time window (milliseconds) within to detect multiple conversion
  * calls of the same client.
  */
 #define ACCUM_TIME 5000
-#endif
 
 /*
  * some helpers for debugging output
  */
 
-#ifdef DEBUG
 static const char * getClientSelectionStageString(int stage)
 {
   switch(stage)
@@ -181,15 +176,18 @@ static const char * getClientSelectionStageString(int stage)
     default:                      return("UNKNOWN!"); break;;
   }
 }
+
+#ifdef DEBUG
 #define setClientSelectionStage(stage) do {fprintf(stderr, "%s: Changing selection stage from [%s] to [%s]\n", __func__, getClientSelectionStageString(lastClientStage), getClientSelectionStageString(SelectionStage##stage)); lastClientStage = SelectionStage##stage;} while (0)
 #define printClientSelectionStage() do {fprintf(stderr, "%s: Current selection stage [%s]\n", __func__, getClientSelectionStageString(lastClientStage));} while (0)
-#define WINDOWID(ptr) (ptr) ? (ptr->drawable.id) : 0
-#define CLINDEX(clientptr) (clientptr) ? (clientptr->index) : -1
 #else
 #define setClientSelectionStage(stage) do {lastClientStage = SelectionStage##stage;} while (0)
 #define printClientSelectionStage()
 #endif
 
+#define WINDOWID(ptr) (ptr) ? (ptr->drawable.id) : 0
+#define CLINDEX(clientptr) (clientptr) ? (clientptr->index) : -1
+
 #ifdef DEBUG
 /*
  * see also nx-X11/lib/src/ErrDes.c
@@ -267,7 +265,6 @@ void nxagentPrintClipboardStat(char *);
 extern unsigned long startTime;
 #endif
 
-#ifdef DEBUG
 static void printSelectionStat(int sel)
 {
   SelectionOwner lOwner = lastSelectionOwner[sel];
@@ -313,14 +310,12 @@ static void printSelectionStat(int sel)
   fprintf(stderr, "  CurrentSelections[].window             [0x%x]\n", curSel.window);
   return;
 }
-#endif
 
-void nxagentPrintClipboardStat(char *header)
+void nxagentDumpClipboardStat(void)
 {
-  #ifdef DEBUG
   char *s = NULL;
 
-  fprintf(stderr, "/----- Clipboard internal status - %s -----\n", header);
+  fprintf(stderr, "/----- Clipboard internal status -----\n");
 
   fprintf(stderr, "  current time                    (Time) [%u]\n", GetTimeInMillis());
   fprintf(stderr, "  agentClipboardInitialized       (Bool) [%s]\n", agentClipboardInitialized ? "True" : "False");
@@ -399,7 +394,6 @@ void nxagentPrintClipboardStat(char *header)
   fprintf(stderr, "\\------------------------------------------------------------------------------\n");
 
   SAFE_XFree(s);
-#endif
 }
 
 /*
@@ -581,8 +575,6 @@ void nxagentClearClipboard(ClientPtr pClient, WindowPtr pWindow)
               (void *) pClient, CLINDEX(pClient), (void *) pWindow, WINDOWID(pWindow));
   #endif
 
-  nxagentPrintClipboardStat("before nxagentClearClipboard");
-
   /*
    * Only for PRIMARY and CLIPBOARD selections.
    */
@@ -610,8 +602,6 @@ void nxagentClearClipboard(ClientPtr pClient, WindowPtr pWindow)
     lastClientWindowPtr = NULL;
     setClientSelectionStage(None);
   }
-
-  nxagentPrintClipboardStat("after nxagentClearClipboard");
 }
 
 /*
@@ -655,8 +645,6 @@ void nxagentHandleSelectionClearFromXServer(XEvent *X)
   fprintf(stderr, "%s: SelectionClear event for selection [%lu].\n", __func__, X->xselectionclear.selection);
   #endif
 
-  nxagentPrintClipboardStat("before nxagentHandleSelectionClearFromXServer");
-
   if (!agentClipboardInitialized)
   {
     #ifdef DEBUG
@@ -701,7 +689,6 @@ void nxagentHandleSelectionClearFromXServer(XEvent *X)
 
   lastClientWindowPtr = NULL;
   setClientSelectionStage(None);
-  nxagentPrintClipboardStat("after nxagentHandleSelectionClearFromXServer");
 }
 
 /*
@@ -760,8 +747,6 @@ void nxagentHandleSelectionRequestFromXServer(XEvent *X)
   }
   #endif
 
-  nxagentPrintClipboardStat("before nxagentHandleSelectionRequestFromXServer");
-
   if (!agentClipboardInitialized)
   {
     #ifdef DEBUG
@@ -984,7 +969,6 @@ void nxagentHandleSelectionRequestFromXServer(XEvent *X)
       }
     }
   }
-  nxagentPrintClipboardStat("after nxagentHandleSelectionRequestFromXServer");
 }
 
 /*
@@ -1887,7 +1871,6 @@ int nxagentConvertSelection(ClientPtr client, WindowPtr pWin, Atom selection,
     }
   }
 
-  #ifdef DEBUG
   if (lastClientClientPtr == client && (GetTimeInMillis() - lastClientReqTime < ACCUM_TIME))
   {
     /*
@@ -1897,9 +1880,11 @@ int nxagentConvertSelection(ClientPtr client, WindowPtr pWin, Atom selection,
      * client requesting PRIMARY and CLIPBOARD would match here, too
      */
 
+    #ifdef DEBUG
     fprintf(stderr, "%s: Consecutives request from client [%p] selection [%u] "
                 "elapsed time [%u] clientAccum [%d]\n", __func__, (void *) client, selection,
                     GetTimeInMillis() - lastClientReqTime, clientAccum);
+    #endif
 
     clientAccum++;
   }
@@ -1911,7 +1896,6 @@ int nxagentConvertSelection(ClientPtr client, WindowPtr pWin, Atom selection,
       clientAccum = 0;
     }
   }
-  #endif
 
   if (target == clientTEXT ||
           target == XA_STRING ||
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Clipboard.h b/nx-X11/programs/Xserver/hw/nxagent/Clipboard.h
index b741ef286..4817a03e2 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Clipboard.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Clipboard.h
@@ -78,4 +78,6 @@ extern WindowPtr nxagentGetClipboardWindow(Atom property);
 
 extern int nxagentSendNotify(xEvent *event);
 
+extern void nxagentDumpClipboardStat(void);
+
 #endif /* __Clipboard_H__ */
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.c b/nx-X11/programs/Xserver/hw/nxagent/Events.c
index 83091eff4..346ee48d8 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.c
@@ -1070,6 +1070,11 @@ void nxagentDispatchEvents(PredicateFuncPtr predicate)
             nxagentToggleAutoGrab();
             break;
           }
+          case doDumpClipboard:
+          {
+            nxagentDumpClipboardStat();
+            break;
+          }
           default:
           {
             FatalError("nxagentDispatchEvent: handleKeyPress returned unknown value\n");
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Events.h b/nx-X11/programs/Xserver/hw/nxagent/Events.h
index a33a1abb1..fc00ba1d0 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Events.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Events.h
@@ -52,6 +52,7 @@ enum HandleEventResult
   doSwitchResizeMode,
   doSwitchDeferMode,
   doAutoGrab,
+  doDumpClipboard
 };
 
 extern CARD32 nxagentLastEventTime;
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
index 73a5901f8..d6c659fec 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
@@ -102,6 +102,8 @@ char * nxagentSpecialKeystrokeNames[] = {
 
        "autograb",
 
+       "dump_clipboard",
+
        NULL,
 };
 
@@ -142,6 +144,7 @@ struct nxagentSpecialKeystrokeMap default_map[] = {
   {KEYSTROKE_VIEWPORT_SCROLL_DOWN, ControlMask, True, XK_KP_Down},
   {KEYSTROKE_REREAD_KEYSTROKES, ControlMask, True, XK_k},
   {KEYSTROKE_AUTOGRAB, ControlMask, True, XK_g},
+  {KEYSTROKE_DUMP_CLIPBOARD, ControlMask | ShiftMask, True, XK_c},
   {KEYSTROKE_END_MARKER, 0, False, NoSymbol},
 };
 struct nxagentSpecialKeystrokeMap *map = default_map;
@@ -715,6 +718,9 @@ Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
     case KEYSTROKE_AUTOGRAB:
       *result = doAutoGrab;
       break;
+    case KEYSTROKE_DUMP_CLIPBOARD:
+      *result = doDumpClipboard;
+      break;
     case KEYSTROKE_NOTHING: /* do nothing. difference to KEYSTROKE_IGNORE is the return value */
     case KEYSTROKE_END_MARKER: /* just to make gcc STFU */
     case KEYSTROKE_MAX:
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
index 463bda9b3..a5a6fbcf1 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
@@ -78,10 +78,12 @@ enum nxagentSpecialKeystroke {
 
        KEYSTROKE_AUTOGRAB,
 
-       KEYSTROKE_NOTHING,
+       KEYSTROKE_DUMP_CLIPBOARD,
 
        /* insert more here and in the string translation */
 
+       KEYSTROKE_NOTHING,
+
        KEYSTROKE_MAX,
 };
 
-- 
cgit v1.2.3