From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sonic308-18.consmr.mail.ir2.yahoo.com (sonic308-18.consmr.mail.ir2.yahoo.com [77.238.178.146]) by sourceware.org (Postfix) with ESMTPS id F0CF2388E824 for ; Sat, 6 Mar 2021 17:45:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org F0CF2388E824 X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1615052725; bh=0FCXHN++sfP2zuYpqlesJ5iOXb+0iWzw9ZCNSn+efee=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=MC5PKbTWzXPn9am3PT+p2mKDR3rKLWHscmG5j0TNFzm4uQH31aleAHftSFcNVpxQyR+O9D6Cz/0VCWReERTYU6mGRMphSgt5U1oZTmYwCiglTNU7Tk3nKL4Mz512PrgBQTp4S5BCSpis7w24/SB4k7otkQueK8W+InnWni2xVSZxtcJWfiI6NdvNCoaxDiQld2HIRoC+ydj4t95LDePM+n8jJiiHaVhmbySdoFh5YAqpJUIEPp/2fcPkQq1lXfWPo5Choh51SqPwCm1usi1PS9ONeMQlR3IlfiTeFAt7W8XSXUTqvIi7v/9hUztbgovxGTeQRCcWidz1DY+oP5Xizw== X-YMail-OSG: GgpxDNkVM1lWBEgrJLRNPq7.xfaCu7uMG9VAjV55PMy5DnSn4qhGhbMEWDM45ig mjmgxiPNDwRrHVRpOLjE63di76GNYDH1C8UslsBoVCb0ZRHUiM.8OnLcE7Q3QY.cjggyiWp847br wNJ1sL2slritXMxIizH1PXe511m5CE4_K71rHSbagT8jnkoaUqPcgJncDOZCH1q8oFsUOGQ1gl._ zy_IdjZnqg8lfho.Q8DQtXiFAWqDWItT1MezAv54xj0qDinvL.lksrYJ2ehj6_s9M_ZJoP8tBOOP T8CzjRPchnU54XTRq9H0o40BaaVBFwfEDQOWYMz.uhcSBT1lqpe1ad.9w71rDCw9K3ARjVSzhkLR fdKe_4QXcc8dbDpUAxq2yDXie9CdM2aEKc5aK3YsJYNnUkQQrOlo37_.uQtQefdPWXFvq3pXBGuE fc6Dy1KQrlRU5w5EtWjj9fedxRQn9ijt2VZsrgkv1l90JSfhQvTVTXXEv8zgmhTsJKPaDQSdArU8 wANswNgg.tkB7a8vVPM7b9qs2X1KjKHvFcWPecTkipqCJTyA1IG_tSdW_Xq5DPLG1EfyYDpM6ack WGUhyTj0Ruq3QQk1mAbkyqla4PiqqbmgqEKquITqdBwGDwzOr92dq5taDv7tgndrvtF.qUtvPoIN 7Xf7yZZHCy.wew4JrC6mjeB0hKJiWrqYawiEvz1c3ZfegUVzD87okxGv8Pfb8IBmJgH4FHJwQzp1 G1jot.pFQ3HOi4mVH9DCfINiW.fyRpxc8oA7upHRTXvhRXT_28OEH5IXyWOmvCA3K7FNzMZLDQmd YYmE_1_8.6rvtqeFU4NT9redw3xRS0N8DQkT9gqSUG6HohBOQXfQBo3_ISdFbLGr2_q2.WU9vg6q _sgYngF5FOgpYYPeydMN4wuIJcUgVFTNNROEo47BUS35Mictdapcz1Xk4bnvN7QP2dWbhe4V6Jsy .soKuoPTveTjidDJh3thhh68gwKAX3d9TM0nIX98bA2R_qy1Aq3PHW4Gt0dyVz3lvNq_30Jsh2tS JTj0LLTPT8xoBHqKotCbNCcbHsxtpUouJB2vHmtKtsnkToTpACSMIzYNK0S8Jq1XAQ8jmEgcFP0h PncM.6wHeqTpcrTB6b90LyJQs2WU23t6008AgzFSD6QmdEqD1j8Oa3vfAgIFfYX3eQFS2LR8EARq 3.ndVEFoIKapgqpPTJePrBiegvWQsTeIxtf8PR8I2IDU3sukFLn1vTN8QUhFj5qYvXM8kytdf5Do rSd1fVSpnMvAbPRd8dj1vnDvpuj6zwBY_vgsQ.iHBjMi7LBac0QlRfIIKMvuJ_jnSayh1wHU1eR5 e2RDk3cQg8eCZaQpHnvjhBLXPTAiWBj0KnkLveeJJ_mViVeeKktFVfVxqZXVFeC2ySdzfb.9v29o smUT7nGWR75xdLOPSQSHbnEUorlrgTmQpxIdjkCHo.KAWIVtFAc1hS6qcZP2AAtQsnPfkbRTtTkM PeT4SoWzCwMPVS6QDzWgPe5zvUgQbKVpXHNQ7C9WTxAjCiTeUwgUluatixF4M7bQmgxJYBh2qXLX Vp4yUfEWl7jdvNoAJVD3rDJDM8PYPGxTXH5yhUeT9fgvbAZotZgT7jjvA2y9bilBR9EY_T2wkk0z OZ_SyHket7wuvW9qKTZL7caEBoKKsAxDazJGXqZ.Y5XRIQjVcxJD1nC1Xfn8Rdq83LNh4A6ljr.N Lmav_pEjE3BT.MSc1pgjIa2YSLq7Omu.eqARe2yBPAH2J1ekogs822r8XDOi.7iC5eR7JUhwTK0G aaFuEbSjaVZ8hdR79gA3OQ1CORxXDNuAd5nYeoMB5nPuE1uTn.IfOROxsYm.zedqbWWxOdFuRqw8 zIaYt9HyYggT7BxxPEKD_e1vJorkVSoybMUsa56n2h5NJWaFhNgu_vCFQUSP7W_dRPqMbsAaYxOs f5J4xe._umdcTCbi1pUdUPMktOg3Wv0wm_9koR9Adymasp44MimdjOD4inVXbTb.mDmiKOPAXi4w HmmzVGf5f70D5VNrrMUMsb1VsjiJ923jd0QV8qc_4wiZnvgRllspthUdSTkEn8gsoYybJplf3ll2 rN9kzLvBHeNqtDaa_kWLUKY4KR17LSEkQSgrn4oQ2w5YQaOBVxNrvDktPW4Le3_VFjOASwFd1hgo fk7gcSk2.y95cMCevm2Xwy3oBlvBRmTe.ibT..nVBOhVdeFkbluFKRYmzYff6dSgUTuTcdELqENb vwmcHnDbJzmVsEe_26ubySCCFWCC3EyP1zWd52LpJogdxDplYNi7IG2f0daQiAGZ.GbJADx8WOXu rfi0zLppL2NYuJDNlTQQ7hokBGI4UzZbJ5n5JnRsgjbzFwfJ82BrdhZOD9RN2DpONEGTD2S1uUKA a.iOVYF.JRL0V5idUVdnQzWD0Fk6Vhmj3zCHPOOdY6ecQxfVZvSMW9Bcb6YBVl5DPeRzgaze_nnB xgoEIk0mT7mM0TBhIIbgxUmIK67oAjzmbqN9oTCU7Pd8qefMVXyuyeKLux1A- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ir2.yahoo.com with HTTP; Sat, 6 Mar 2021 17:45:25 +0000 Received: by smtp416.mail.ir2.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID a5c27c167ad5f336b76dd6250ed2d9ff; Sat, 06 Mar 2021 17:45:20 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH 22/22] Copy variable value to clipboard on middle-click Date: Sat, 6 Mar 2021 18:44:50 +0100 Message-Id: <20210306174450.21718-3-ssbssa@yahoo.de> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210306174450.21718-1-ssbssa@yahoo.de> References: <20210306174450.21718-1-ssbssa@yahoo.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Antivirus: Avast (VPS 210306-0, 03/06/2021), Outbound message X-Antivirus-Status: Clean X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Mar 2021 17:45:27 -0000 For variables that don't have children, or the children tree is closed, its text representation is copied. If the variable has children, and the children tree is opened, the text representation of the children is copied instead (each on a separate line). I could imagine customizable actions on middle-click on VariableWindow variables, like some kind of callback function. I chose the clipboard myself because I relatively often have classes for graphical objects like lines and arcs. For easier readability, I created simple pretty printers, like: LINE 0 0 100 0 ARC 50 0 50 0 3.1415 So a middle-click on an opened vector containing these objects copies their text representation to the clipboard. I have another tool that is notified whenever the clipboard contents change, and if they are in this specific format, immediately visualizes them. The result is a relatively convenient way to visualize these graphical objects from the debugger, with a single mouse-click. --- gdb/python/lib/gdb/command/tui_windows.py | 76 +++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/gdb/python/lib/gdb/command/tui_windows.py b/gdb/python/lib/gdb/command/tui_windows.py index 45ba9502878..050ef4d1ddf 100644 --- a/gdb/python/lib/gdb/command/tui_windows.py +++ b/gdb/python/lib/gdb/command/tui_windows.py @@ -23,6 +23,62 @@ PY3 = sys.version_info[0] == 3 custom_windows = {} +if sys.platform == 'win32': + import ctypes + import ctypes.wintypes as w + + CF_TEXT = 1 + + u32 = ctypes.WinDLL('user32') + k32 = ctypes.WinDLL('kernel32') + + OpenClipboard = u32.OpenClipboard + OpenClipboard.argtypes = w.HWND, + OpenClipboard.restype = w.BOOL + + EmptyClipboard = u32.EmptyClipboard + EmptyClipboard.restype = w.BOOL + + SetClipboardData = u32.SetClipboardData + SetClipboardData.argtypes = w.UINT, w.HANDLE, + SetClipboardData.restype = w.HANDLE + + CloseClipboard = u32.CloseClipboard + CloseClipboard.restype = w.BOOL + + GHND = 0x0042 + + GlobalAlloc = k32.GlobalAlloc + GlobalAlloc.argtypes = w.UINT, ctypes.c_size_t, + GlobalAlloc.restype = w.HGLOBAL + + GlobalLock = k32.GlobalLock + GlobalLock.argtypes = w.HGLOBAL, + GlobalLock.restype = w.LPVOID + + GlobalUnlock = k32.GlobalUnlock + GlobalUnlock.argtypes = w.HGLOBAL, + GlobalUnlock.restype = w.BOOL + + def set_clipboard_text(s): + if OpenClipboard(None): + s = s.encode('utf-8') + EmptyClipboard() + h = GlobalAlloc(GHND, len(s) + 1) + p = GlobalLock(h) + ctypes.memmove(p, s, len(s)) + GlobalUnlock(h) + SetClipboardData(CF_TEXT, h) + CloseClipboard() + +else: + import base64 + + def set_clipboard_text(s): + b64 = base64.b64encode(s.encode('utf-8')).decode() + sys.__stdout__.write("\x1b]52;c;" + b64 + "\x07") + + col_esc_seq_re = re.compile('(\033\[[0-9;]*m)') def escaped_substr(s, n, c): col_esc_seq = False @@ -189,6 +245,26 @@ class VariableWindow(TextWindow): if prev is not None and prev[3] is not None: gdb.set_convenience_variable(self.convenience_name, prev[3]) self.refill(True) + elif button == 2 and line < len(self.line_names): + name = self.line_names[line] + if name: + prev = self.prev_vals[name] + if prev is not None: + if prev[0]: + name2 = name + ":" + child_texts = [] + for l in range(line + 1, len(self.line_names)): + child_name = self.line_names[l] + if not child_name: + continue + if not child_name.startswith(name2): + break + child = self.prev_vals[child_name] + if child is not None and child[1] != False: + child_texts.append(child[1]) + set_clipboard_text("\n".join(child_texts)) + elif prev[1] != False: + set_clipboard_text(prev[1]) def refill(self, keep_prev=False): if not self.win.is_valid(): -- 2.30.1