diff options
author | Ulrich Sibiller <uli42@gmx.de> | 2019-06-10 14:20:47 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2019-06-11 12:22:17 +0200 |
commit | 2972f6af1b63f4e98aa4504a83f756b8486c7df0 (patch) | |
tree | 549a44a0bf72f854ce727d26ec1bb802ce7c50b6 /nx-X11/programs/Xserver/hw/nxagent | |
parent | 3fd7e5f93fe0cc3198c5cc2fb5da9635b849c5be (diff) | |
download | nx-libs-2972f6af1b63f4e98aa4504a83f756b8486c7df0.tar.gz nx-libs-2972f6af1b63f4e98aa4504a83f756b8486c7df0.tar.bz2 nx-libs-2972f6af1b63f4e98aa4504a83f756b8486c7df0.zip |
Add nxagentSetSelectionCallback
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent')
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Clipboard.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c b/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c index 824c1dc47..9c518801b 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c @@ -1257,6 +1257,75 @@ void nxagentResetSelectionOwner(void) return; } +#ifdef NXAGENT_CLIPBOARD +void nxagentSetSelectionCallback(CallbackListPtr *callbacks, void *data, + void *args) +{ + /* + * Only act if the Trap is unset. The trap indicates that we are + * triggered by a clipboard event originating from the real X + * server. In that case we do not want to propagate back changes to + * the real X server, because it already knows about them and we + * would end up in an infinite loop of events. If there was a better + * way to identify that situation during Callback processing we + * could get rid of the Trap... + */ + if (nxagentExternalClipboardEventTrap != 0) + { + #ifdef DEBUG + fprintf(stderr, "%s: Trap is set, doing nothing\n", __func__); + #endif + return; + } + + SelectionInfoRec *info = (SelectionInfoRec *)args; + + Selection * pCurSel = (Selection *)info->selection; + + #ifdef DEBUG + fprintf(stderr, "%s: pCurSel->lastTimeChanged [%d]\n", __func__, pCurSel->lastTimeChanged.milliseconds); + #endif + + if (info->kind == SelectionSetOwner) + { + #ifdef DEBUG + fprintf(stderr, "%s: called with SelectionCallbackKind SelectionSetOwner\n", __func__); + fprintf(stderr, "%s: pCurSel->pWin [0x%x]\n", __func__, pCurSel->pWin ? pCurSel->pWin->drawable.id : NULL); + fprintf(stderr, "%s: pCurSel->selection [%s]\n", __func__, NameForAtom(pCurSel->selection)); + #endif + + if ((pCurSel->pWin != NULL) && + (nxagentOption(Clipboard) != ClipboardNone) && + ((pCurSel->selection == XA_PRIMARY) || + (pCurSel->selection == MakeAtom("CLIPBOARD", 9, 0)))) + { + #ifdef DEBUG + fprintf(stderr, "%s: calling nxagentSetSelectionOwner\n", __func__); + #endif + nxagentSetSelectionOwner(pCurSel); + } + } + else if (info->kind == SelectionWindowDestroy) + { + #ifdef DEBUG + fprintf(stderr, "%s: called with SelectionCallbackKind SelectionWindowDestroy\n", __func__); + #endif + } + else if (info->kind == SelectionClientClose) + { + #ifdef DEBUG + fprintf(stderr, "%s: called with SelectionCallbackKind SelectionClientClose\n", __func__); + #endif + } + else + { + #ifdef DEBUG + fprintf(stderr, "%s: called with unknown SelectionCallbackKind\n", __func__); + #endif + } +} +#endif + void nxagentSetSelectionOwner(Selection *pSelection) { #ifdef DEBUG |