I answered on Ask Ubuntu Quit all instances of gnome-terminal via a command but as you all can read gnome-terminal didn’t seems to have a SIGcall I could use to simulate this “Close” event. So this lead me to ask, is there a way in GNOME/KDE/LXDE/{put your window/desktop manager/environment here} to simulate the “Click in close button” event? I have read different questions that could have any relation to this, but don’t answer this.
What I’m looking is for a global command (if exist) to do this in different scenarios. If none exist, please explain how the “Close” button works.
Posible uses:
- I open a set of applications for a determinated task, and want to close all of them (when no longer used) in a single stroke/command without suppress any You want to save your work? alerts.
- Close all the
gnome-terminalinstances but warn me if there is child process still running. - Nothing else comes into my mind right now…
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I believe the related man page is, XKillClient. You can use xdotool to simulate the close button being clicked from a terminal like so.
Example
Assuming I have a gnome-terminal open and it’s name is “[email protected]:/home”.
-
Get the window ID
$ xdotool search --name "<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d0a3b1bdbc90b7a2b9beb3b8a9">[email protected]</a>:/home" 96488188
-
Send it a Alt+F4
$ xdotool windowactivate --sync 96488188 key --clearmodifiers --delay 100 alt+F4
You can put them together by embedding the first command into the second:
$ xdotool windowactivate --sync $( ...1st command...) key --clearmodifiers
--delay 100 alt+F4
You can save yourself by letting xdotool do both at the same time:
$ xdotool search --name "<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4132202c2d012633282f222938">[email protected]</a>:~" key alt+f4
Globally
You can adapt what I’ve provided to run it on windows that have the same name:
$ xdotool search --name "<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="384b595554785f4a51565b5041">[email protected]</a>:~" 96488779 96468996
Or on windows by other attributes. You can use xwininfo to find out more about a particular window. Run it and then just click on the window of interest:
$ xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0x5c04d4b "<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5f2c3e32331f382d36313c3726">[email protected]</a>:~"
Absolute upper-left X: 14
Absolute upper-left Y: 74
Relative upper-left X: 14
Relative upper-left Y: 74
Width: 941
Height: 361
Depth: 32
Visual: 0x62
Visual Class: TrueColor
Border width: 0
Class: InputOutput
Colormap: 0x5c00003 (not installed)
Bit Gravity State: NorthWestGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +14+74 -485+74 -485-465 +14-465
-geometry 132x24+14+74
Other useful tools when dealing with X11 windows are xdpyinfo & xprop. xdpyinfo can be used to find out information about the X server. So you can figure out which window has focus:
$ xdpyinfo |grep focus focus: window 0x5c00005, revert to Parent
xprop and xwininfo can take a -id switch so you can provide them the Window ID that you’re interested in instead of having to click on it:
$ xprop -id 0x5c00001|grep -i class WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal"
References
Method 2
I found xdotool to be flaky/buggy, sometimes it closes the foreground window instead of the one that should be closed. This seems to be due to the way that keys are sent after bringing the window to the foreground instead of directly sending window events, and it’s a very annoying issue. I suggest using wmctrl, which directly closes a window without sending keystrokes.
You can close a window directly by matching on the name, e.g. both these will close the “Untitled Document 1 – gedit” window:
wmctrl -c "gedit" wmctrl -c "Untitled"
You can use the -F option to only consider exact matches:
wmctrl -F -c "Untitled Document 1 - gedit"
Or you can give the id directly:
wmctrl -i -c "121634821"
More usage examples/documentation can be found here.
One thing I do find very useful is xdotool‘s ability to wait until there is a result using the --sync argument. Combining the two in one command is done like this:
xdotool search --sync --name "gedit" | xargs wmctrl -i -c
If you are on a Mac, you’ll probably need the -I{} parameter:
xdotool search --sync --name "gedit" | xargs -I{} wmctrl -i -c {}
If you want to support multiple windows, you should tell xargs to call wmctrl with at at most 1 argument each time with the -n option. wmctrl does not explicitly support multiple windows as arguments:
xdotool search --sync --name "gedit" | xargs -I{} -n 1 wmctrl -i -c {}
This will wait until there is at least 1 such window, and then closes all of them.
Method 3
pkill(1) should be what you need.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0