implement double click on process
Stefan Schuermans

Stefan Schuermans commited on 2020-10-18 15:23:44
Showing 3 changed files, with 48 additions and 2 deletions.


Double click on process on left side copies shell command to repeat process
execution to clipboard.
... ...
@@ -81,11 +81,23 @@ upt-tool mytrace.upt dump
81 81
 
82 82
 ## Graphical User interface
83 83
 
84
-To explore a trace in the graphical user interface, run:
84
+To explore a trace in the graphical user interface (GUI), run:
85 85
 ```
86 86
 upt-tool mytrace.upt gui
87 87
 ```
88 88
 
89
+The left half of the GUI shows the process tree with a few selected details
90
+about each process.  The right half shows further details of the process
91
+selected on the left side.
92
+
93
+By double-clicking on the entries in the right tree view, their content can be
94
+copied to the clipboard. If a row with subordinate rows is double-clicked, the
95
+contents of all the subordinate entries are copied to the clipboard, using
96
+proper shell-escaping of the individual entries. If a process row on the left
97
+side is double-clicked, a shell command for repeating the execution of the
98
+process (including working directory, environment variables and command line)
99
+is copied to the clipboard.
100
+
89 101
 ## Example: Trace Build Process
90 102
 
91 103
 To show the capabilities of the UProcTrace, a process that calls several child
... ...
@@ -81,6 +81,7 @@
81 81
                     <property name="fixed_height_mode">True</property>
82 82
                     <property name="enable_tree_lines">True</property>
83 83
                     <signal name="cursor-changed" handler="onProcessesCursorChanged" swapped="no"/>
84
+                    <signal name="row-activated" handler="onProcessesRowActivated" swapped="no"/>
84 85
                     <child internal-child="selection">
85 86
                       <object class="GtkTreeSelection"/>
86 87
                     </child>
... ...
@@ -182,7 +182,8 @@ class UptGui:
182 182
         handlers = {
183 183
             'onDestroy': self.onDestroy,
184 184
             'onDetailsRowActivated': self.onDetailsRowActivated,
185
-            'onProcessesCursorChanged': self.onProcessesCursorChanged
185
+            'onProcessesCursorChanged': self.onProcessesCursorChanged,
186
+            'onProcessesRowActivated': self.onProcessesRowActivated
186 187
         }
187 188
         self.builder.connect_signals(handlers)
188 189
         # open trace file
... ...
@@ -296,6 +297,38 @@ class UptGui:
296 297
         # show details of selected process
297 298
         self.showDetails(proc_id)
298 299
 
300
+    def onProcessesRowActivated(self, _widget, _row, _col):
301
+        """
302
+        Row in processes view has been activated.
303
+        """
304
+        # get selected row (if any)
305
+        processes_sel = self.wid_processes_view.get_selection()
306
+        if processes_sel is None:
307
+            return
308
+        processes_iter = processes_sel.get_selected()[1]
309
+        if processes_iter is None:
310
+            return
311
+        # get process
312
+        proc_id = self.wid_processes_tree.get_value(processes_iter,
313
+                                                    self.PROC_PROC_ID)
314
+        if proc_id is None or proc_id < 0:
315
+            return
316
+        proc = self.processes.getProcess(proc_id)
317
+        if proc is None:
318
+            return
319
+        # copy shell command line to repeat process call to clipboard
320
+        # ( cd <workdir>; env -i <environment> <cmdline> )
321
+        string = '('
322
+        if proc.cwd:
323
+            string += ' cd ' + cmdline_str_escape(proc.cwd) + ';'
324
+        if proc.environ:
325
+            string += ' env -i ' + cmdline2str(sorted(proc.environ))
326
+        if proc.cmdline:
327
+            string += ' ' + cmdline2str(proc.cmdline)
328
+        string += ' )'
329
+        self.clipboard.set_text(string, -1)
330
+        self.clipboard.store()
331
+
299 332
     def openTrace(self, proto_filename: str):
300 333
         """
301 334
         Open a trace file.
302 335