From 5558cc8a5122a9b8f863ef0c095ef8358d26d9a9 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 13 Jan 2026 11:41:31 +0100 Subject: [PATCH] Revert "Merge pull request #2706 from freeone3000/master" This reverts commit 2201dde8ed85209b5d6ca8a1806ace3ece8cb4b2, reversing changes made to 3a324b9f9f6aae3437f6511ad6ba925e00703244. --- gui/utils/clipboard.py | 64 ++++++++++++++++++++++++++++++++++++------ requirements.txt | 1 - 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/gui/utils/clipboard.py b/gui/utils/clipboard.py index d4b7bf33f..a8db13ca7 100644 --- a/gui/utils/clipboard.py +++ b/gui/utils/clipboard.py @@ -1,20 +1,68 @@ # noinspection PyPackageRequirements -import pyclip +import wx from logbook import Logger logger = Logger(__name__) def toClipboard(text): - pyclip.copy(text) + """ + Copy text to clipboard. Explicitly uses CLIPBOARD selection, not PRIMARY. + + On X11 systems, wxPython can confuse between PRIMARY and CLIPBOARD selections, + causing "already open" errors. This function ensures we always use CLIPBOARD. + + See: https://discuss.wxpython.org/t/wx-theclipboard-pasting-different-content-on-every-second-paste/35361 + """ + clipboard = wx.TheClipboard + try: + # Explicitly use CLIPBOARD selection, not PRIMARY selection + # This prevents X11 confusion between the two clipboard types + clipboard.UsePrimarySelection(False) + + if clipboard.Open(): + try: + data = wx.TextDataObject(text) + clipboard.SetData(data) + return True + finally: + clipboard.Close() + else: + logger.debug("Failed to open clipboard for writing") + return False + except Exception as e: + logger.warning("Error writing to clipboard: {}", e) + return False def fromClipboard(): """ - Read text from clipboard. Uses pyclip to grab in a cross-platform, reliable manner. + Read text from clipboard. Explicitly uses CLIPBOARD selection, not PRIMARY. + + On X11 systems, wxPython can confuse between PRIMARY and CLIPBOARD selections, + causing "already open" errors. This function ensures we always use CLIPBOARD. + + See: https://discuss.wxpython.org/t/wx-theclipboard-pasting-different-content-on-every-second-paste/35361 """ - data = pyclip.paste(text=True) - if not isinstance(data, str): - data = data.decode('utf-8') - logger.debug("Pasted data: {}", data) - return data + clipboard = wx.TheClipboard + try: + # Explicitly use CLIPBOARD selection, not PRIMARY selection + # This prevents X11 confusion between the two clipboard types + clipboard.UsePrimarySelection(False) + + if clipboard.Open(): + try: + data = wx.TextDataObject() + if clipboard.GetData(data): + return data.GetText() + else: + logger.debug("Clipboard open but no CLIPBOARD data available") + return None + finally: + clipboard.Close() + else: + logger.debug("Failed to open clipboard for reading") + return None + except Exception as e: + logger.warning("Error reading from clipboard: {}", e) + return None diff --git a/requirements.txt b/requirements.txt index 04964d842..46ed9241b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,3 @@ beautifulsoup4==4.12.2 pyyaml==6.0.1 python-jose==3.3.0 requests-cache==1.1.1 -pyclip >= 0.7.0