Friday, May 10, 2024
 Popular · Latest · Hot · Upcoming
23
rated 0 times [  23] [ 0]  / answers: 1 / hits: 38680  / 1 Year ago, fri, january 27, 2023, 8:57:44

I'm wondering is there any way to achieve the affect of the Ctrl-Alt-Keypad shortcuts in Unity using terminal commands instead? I want a command that sets a gui window to half the size of the screen, either left or right aligned.



By way of background, I'm writing a script that runs after log in. It uses Zenity to ask whether or not I want to open my development environment (GVim and IPython side-by-side). I have been trying to achieve two equal-sized windows for these programmes by using set lines= columns= in my .gvimrc and c.IPythonWidget.width = and c.IPythonWidget.height = in my ipython_qtconsole_config.py. However, there are problems associated with this approach.


More From » unity

 Answers
2

What you will run into



If you want to first call an application and, subsequently, place its window on a specific position and size, the time between calling the application and the moment the window actually appears, is unpredictable. If your system is occupied, it can be significantly longer than if it is idle.



You need a "smart" way to make sure the positioning/resizing is done (immediately) after the window appears.



Script to call an application, wait for it to appear and position it on the screen



With the script below, you can call an application and set the position and size it should appear on with the command:



<script> <application> <x-position> <y-position> <h-size> <v-size>


An few examples:




  • To call gnome-terminal and resize its window to 50% and place it on the right half:



    <script> gnome-terminal 840 0 50 100


    enter image description here


  • To call gedit, place its window on the left and call gnome-terminal, place it on the right (setting its v-size 46% to give it a little space between the windows):



    <script> gedit 0 0 46 100&&<script> gnome-terminal 860 0 46 100


    enter image description here


  • To call Inkscape, place its window in the left/upper quarter of the screen:



    <script> inkscape 0 0 50 50


    enter image description here




The script and how to use it




  1. install both xdotool and wmctrl. I used both since resizing with wmctrl can cause some peculiarities on (specifically) Unity.



    sudo apt-get install wmctrl
    sudo apt-get install xdotool

  2. Copy the script below into an empty file, save it as setwindow (no extension) in ~/bin; create the directory if necessary.

  3. Make the script executable (!)

  4. If you just created ~bin, run: source ~/.profile

  5. Test-run the script with the command (e.g.)



    setwindow gnome-terminal 0 0 50 100


    In other words:



    setwindow <application> <horizontal-position> <vertical-position> <horizontal-size (%)> <vertical-size (%)>



If all works fine, use the command wherever you need it.



The script



#!/usr/bin/env python3
import subprocess
import time
import sys

app = sys.argv[1]

get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
subprocess.Popen(["/bin/bash", "-c", app])

while t < 30:
ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
procs = [[(p, w[0]) for p in get("ps -e ww").splitlines()
if app in p and w[2] in p] for w in ws2]
if len(procs) > 0:
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
cmd3 = "xdotool windowsize --sync "+procs[0][0][1]+" "+sys.argv[4]+"% "+sys.argv[5]+"%"
cmd4 = "xdotool windowmove "+procs[0][0][1]+" "+sys.argv[2]+" "+sys.argv[3]
for cmd in [cmd1, cmd2, cmd3, cmd4]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1


What it does



When the script is called, it:




  1. starts up the application

  2. keeps an eye on the window list (usingwmctrl -lp)

  3. if a new window appears, it checks if the new window belongs to the called application (using ps -ef ww, comparing the pid of the window to the pid of the application)

  4. if so, it sets the size and position, according to your arguments.
    In case an application does not "show up" within appr. 15 seconds, the script assumes the application will not run due to an error. The script then terminates to prevent waiting for the new window infinitely.



Minor issue



In Unity, when you (re-)position and (re-)size a window with either wmctrl or xdotool, the window will always keep a small marge to the borders of your screen, unless you set it to 100%. You can see that in the image (3) above; while the inkscape window was placed on x position 0, you can still see a minor marge between the Unity Launcher and the inkscape window.


[#20353] Sunday, January 29, 2023, 1 Year  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
bunsistent

Total Points: 198
Total Questions: 108
Total Answers: 121

Location: Monaco
Member since Sun, Jan 16, 2022
2 Years ago
;