Alternatief vensterbeheer in Linux

Ik ben een van degenen die Caps Lock hebben ingesteld om van lay-out te wisselen, omdat ik te lui ben om op twee toetsen te drukken terwijl ik er één kan indrukken. Ik zou zelfs graag 2 onnodige toetsen willen: ik zou er één gebruiken om de Engelse lay-out in te schakelen, en de tweede voor Russisch. Maar de tweede onnodige sleutel is het oproepen van het contextmenu, dat zo onnodig is dat het door veel laptopfabrikanten wordt weggelaten. Je moet dus tevreden zijn met wat je hebt.

En ik wil ook niet naar hun pictogrammen op de taakbalk zoeken als ik tussen vensters schakel, of de namen opvangen als ik er doorheen blader Alt + Tab, door bureaubladen bladeren, enz. Ik wil op een toetsencombinatie drukken (idealiter slechts één, maar er zijn geen gratis onnodige toetsen meer) en onmiddellijk naar het venster gaan dat ik nodig heb. Bijvoorbeeld als volgt:

  • Alt+F: Firefox
  • Alt+D: Firefox (privénavigatie)
  • Alt+T: Terminal
  • Alt+M: Rekenmachine
  • Alt+E: IntelliJ-idee
  • enzovoort.

Bovendien door bijvoorbeeld op te drukken Alt + M Ik wil de rekenmachine zien, ongeacht of dit programma momenteel actief is. Als het actief is, moet het venster focus krijgen, en als dat niet het geval is, voer dan het gewenste programma uit en breng de focus over wanneer het wordt geladen.

Voor gevallen die niet onder het vorige script vallen, wil ik universele toetscombinaties hebben die eenvoudig aan elk geopend venster kunnen worden toegewezen. Ik heb bijvoorbeeld 10 combinaties toegewezen gekregen van Alt + 1 naar Alt + 0, die niet aan programma's zijn gekoppeld. Ik kan gewoon klikken Alt + 1 en het venster dat momenteel in focus is, krijgt focus wanneer erop wordt geklikt Alt + 1.

Onder de snit vindt u een beschrijving van nog een paar functies en een antwoord op hoe dit kan worden gedaan. Maar ik waarschuw je meteen dat een dergelijke aanpassing ‘voor jezelf’ ernstige verslaving en zelfs terugtrekking kan veroorzaken als je Windows, Mac OS of zelfs de computer van iemand anders met Linux moet gebruiken.

Als je erover nadenkt, gebruiken we eigenlijk niet zoveel programma's dagelijks. Een browser, een terminal, een IDE, een soort messenger, een bestandsbeheerder, een rekenmachine en misschien is dat bijna alles. Er zijn niet veel toetscombinaties nodig om 95% van de dagelijkse taken uit te voeren.

Voor programma's waarbij meerdere vensters geopend zijn, kan één daarvan als hoofdvenster worden aangewezen. U hebt bijvoorbeeld meerdere IntelliJ Idea-vensters geopend en toegewezen Alt + E. Onder normale omstandigheden, wanneer u op drukt Alt + E Er wordt een venster van dit programma geopend, hoogstwaarschijnlijk het venster dat het eerst werd geopend. Als u echter op klikt Alt + E wanneer een van de vensters van dit programma al in focus is, dan zal dit specifieke venster worden toegewezen als het hoofdvenster en zal dit het venster zijn dat focus krijgt wanneer volgende combinaties worden ingedrukt.

Het hoofdvenster kan opnieuw worden toegewezen. Om dit te doen, moet u eerst de combinatie resetten en er vervolgens een ander venster aan toewijzen als hoofdvenster. Om een ​​combinatie te resetten, moet je op de combinatie zelf drukken, en dan op een speciale resetcombinatie, waaraan ik deze heb toegewezen Alt+Backspace. Hierdoor wordt een script aangeroepen dat de toewijzing van het hoofdvenster voor de vorige combinatie ongedaan maakt. En dan kunt u een nieuw hoofdvenster toewijzen zoals beschreven in de vorige paragraaf. Het resetten van een gekoppeld venster naar universele combinaties gebeurt op dezelfde manier.

De introductie bleek lang te duren, maar ik wilde eerst vertellen wat we gaan doen en dan uitleggen hoe we dat moeten doen.

Voor wie het lezen beu is

Kortom, de link naar de scripts staat aan het einde van het artikel.

Maar u kunt het nog steeds niet meteen installeren en gebruiken. Je zult eerst moeten uitzoeken hoe het script het gewenste venster vindt. Zonder dit is het niet mogelijk om het script te vertellen waar precies de focus moet worden verlegd. En u moet begrijpen wat u moet doen als er plotseling geen geschikt venster wordt gevonden.

En ik zal me niet concentreren op het configureren van de uitvoering van scripts door op toetscombinaties te drukken. In KDE bevindt dit zich bijvoorbeeld in Systeeminstellingen → Snelkoppelingen → Aangepaste snelkoppelingen. Dit zou ook het geval moeten zijn bij andere vensterbeheerders.

Maak kennis met wmctrl

Wmctrl — consolehulpprogramma voor interactie met X Window Manager. Dit is het sleutelprogramma voor het script. Laten we eens kijken hoe u het kunt gebruiken.

Laten we eerst een lijst met geopende vensters weergeven:

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

optie -l toont een lijst met alle geopende vensters, en -X voegt de klassenaam toe aan de uitvoer (skype.Skype, Navigator.Firefox enz). Hier hebben we de venster-ID (kolom 1), klassenaam (kolom 3) en vensternaam (laatste kolom) nodig.

U kunt proberen een venster te activeren met behulp van de optie -a:

$ wmctrl -a skype.Skype -x

Als alles volgens plan verliep, zou het Skype-venster op het scherm moeten verschijnen. Als in plaats van de optie -x optie gebruiken -i, dan kunt u in plaats van de klassenaam de venster-ID opgeven. Het probleem met ID is dat de venster-ID elke keer verandert wanneer de applicatie wordt gestart en dat we dit niet van tevoren kunnen weten. Aan de andere kant identificeert dit attribuut een venster op unieke wijze, wat belangrijk kan zijn wanneer een toepassing meer dan één venster opent. Hierover verderop meer.

In dit stadium moeten we onthouden dat we met regex op uitvoer naar het gewenste venster zullen zoeken wmctrl-lx. Maar dat betekent niet dat we iets ingewikkelds moeten gebruiken. Meestal is de klassenaam of vensternaam voldoende.

Kortom, het hoofdidee zou al duidelijk moeten zijn. Configureer in de algemene instellingen voor sneltoetsen/snelkoppelingen voor uw vensterbeheerder de vereiste combinatie om het script uit te voeren.

Hoe scripts te gebruiken

Eerst moet u consolehulpprogramma's installeren wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Vervolgens moet u de scripts downloaden en toevoegen $ PATH. Meestal zet ik ze erin ~/bak:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

Als de map ~/bak was er niet, dan moet u deze aanmaken en opnieuw opstarten (of opnieuw inloggen), anders ~/bak zal niet slaan $ PATH. Als alles correct is gedaan, zouden de scripts toegankelijk moeten zijn vanaf de console en zou het invullen van tabbladen moeten werken.

Hoofdscript showwinst heeft 2 parameters nodig: de eerste is een regex, waarmee we naar het vereiste venster zoeken, en de tweede parameter is een commando dat moet worden uitgevoerd als het vereiste venster niet wordt gevonden.

U kunt proberen een script uit te voeren, bijvoorbeeld:

$ showwin "Mozilla Firefox$" firefox

Als Firefox is geïnstalleerd, moet het venster focus krijgen. Zelfs als Firefox niet actief was, had het moeten starten.

Als het werkt, kun je proberen de uitvoering van opdrachten op combinaties te configureren. Voeg in de algemene sneltoetsen/snelkoppelingen instellingen toe:

  • Alt+F: showwin “Mozilla Firefox$” Firefox
  • Alt+D: showwin "Mozilla Firefox (privénavigatie)$" "firefox -privé-venster"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" chroom-browser
  • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S: showwin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

Enz. Iedereen kan toetscombinaties en software naar eigen inzicht configureren.
Als alles goed is gegaan, kunnen we met behulp van de bovenstaande combinaties tussen vensters schakelen door simpelweg op de toetsen te drukken.

Ik zal chroomliefhebbers teleurstellen: het kan incognito een gewoon venster onderscheiden door zijn output wmctrl Dat kan niet, ze hebben dezelfde klassennamen en venstertitels. In de voorgestelde regex zijn de karakters N* en I* alleen nodig zodat deze reguliere expressies van elkaar verschillen en kunnen worden toegewezen als hoofdvensters.

Om het hoofdvenster van de vorige combinatie te resetten (in feite voor regex, welke showwinst laatst gebeld) moet je het script aanroepen showwinOntkoppel. Ik heb dit script toegewezen aan een toetsencombinatie Alt+Backspace.

Bij het script showwinst er is nog een functie. Wanneer het wordt aangeroepen met één parameter (in dit geval is de parameter slechts een identificatie), controleert het de regex helemaal niet, maar beschouwt het alle vensters als geschikt. Op zichzelf lijkt dit nutteloos, maar op deze manier kunnen we elk venster als hoofdvenster aanwijzen en snel naar dat specifieke venster overschakelen.

Ik heb de volgende combinaties geconfigureerd:

  • Alt+1: toonwin "CustomKey1"
  • Alt+2: toonwin "CustomKey2"
  • ...
  • Alt+0: toonwin "CustomKey0"
  • Alt+Backspace: showwinDetach

Op deze manier kan ik alle vensters aan combinaties binden Alt + 1...Alt + 0. Gewoon door te klikken Alt + 1 Ik bind het huidige venster aan deze combinatie. Ik kan de binding annuleren door op te klikken Alt + 1en dan Alt+Backspace. Of sluit het raam, dat werkt ook.

Vervolgens zal ik u enkele technische details vertellen. Je hoeft ze niet te lezen, maar probeer ze gewoon op te zetten en te zien. Maar ik zou nog steeds aanraden om de scripts van anderen te begrijpen voordat je ze op je computer uitvoert :).

Hoe onderscheid te maken tussen verschillende vensters van dezelfde applicatie

In principe werkte het allereerste voorbeeld “wmctrl -a skype.Skype -x” en kan het worden gebruikt. Maar laten we nog eens kijken naar het voorbeeld met Firefox, waarin 2 vensters geopend zijn:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

Het eerste venster is de normale modus en het tweede is Privénavigatie. Ik zou deze vensters als verschillende toepassingen willen beschouwen en er met verschillende toetscombinaties naartoe kunnen overschakelen.

Het is noodzakelijk om het script dat van venster wisselt ingewikkelder te maken. Ik heb deze oplossing gebruikt: een lijst met alle vensters weergeven, doen grep door regex, neem de eerste regel met hoofd, haal de eerste kolom op (dit is de venster-ID) met behulp van gesneden, schakel over naar venster op id.

Er zou een grap moeten zijn over reguliere expressies en twee problemen, maar in feite gebruik ik niets ingewikkelds. Ik heb reguliere expressies nodig zodat ik het einde van de regel kan aangeven (het “$”-symbool) en onderscheid kan maken tussen “Mozilla Firefox$” en “Mozilla Firefox (Private Browsing)$”.

Het commando ziet er ongeveer zo uit:

$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

Hier kun je al raden naar de tweede functie van het script: als grep niets retourneert, is de gewenste applicatie niet geopend en moet je deze starten door de opdracht uit de tweede parameter uit te voeren. En controleer vervolgens periodiek of het gewenste venster is geopend om de focus daarop over te brengen. Ik zal me hier niet op concentreren; iedereen die het nodig heeft, zal naar de bronnen kijken.

Wanneer toepassingsvensters niet te onderscheiden zijn

We hebben dus geleerd hoe we de focus kunnen verplaatsen naar het venster van de gewenste applicatie. Maar wat als een applicatie meer dan één venster open heeft? Waar moet ik de focus op leggen? Het bovenstaande script wordt hoogstwaarschijnlijk overgebracht naar het eerste geopende venster. Wij zouden echter graag meer flexibiliteit willen. Ik zou graag willen onthouden welk venster we nodig hebben en naar dat specifieke venster kunnen overschakelen.

Het idee was dit: als we een specifiek venster voor een toetscombinatie willen onthouden, moeten we op deze combinatie drukken wanneer het gewenste venster in focus is. Als u in de toekomst op deze combinatie drukt, wordt de focus op dit venster gelegd. Totdat het venster sluit of we een reset uitvoeren voor deze scriptcombinatie showwinOntkoppel.

Scriptalgoritme showwinst iets zoals dit:

  • Controleer of we eerder de ID hebben onthouden van het venster waarnaar de focus moet worden overgebracht.
    Als u het zich herinnert en een dergelijk venster bestaat nog steeds, dan verplaatsen we de focus ernaar en sluiten we af.
  • We kijken naar welk venster momenteel in focus is, en als het overeenkomt met ons verzoek, onthouden we de ID ervan om er in de toekomst naartoe te gaan en af ​​te sluiten.
  • We gaan naar ten minste een geschikt venster als het bestaat of openen de gewenste applicatie.

U kunt erachter komen welk venster momenteel in focus is met behulp van het xdotool-consolehulpprogramma door de uitvoer ervan naar hexadecimaal formaat te converteren:

$ printf "0x%08x" `xdotool getwindowfocus`

De eenvoudigste manier om iets in bash te onthouden is door bestanden aan te maken in een virtueel bestandssysteem in het geheugen. In Ubuntu is dit standaard ingeschakeld /dev/shm/. Over andere distributies kan ik niets zeggen, ik hoop dat er ook iets soortgelijks bestaat. Je kunt kijken met het commando:

$ mount -l | grep tmpfs

Het script maakt lege mappen in deze map, zoals deze: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Bovendien wordt er elke keer dat het wordt aangeroepen een symlink gemaakt /dev/shm/$USER/showwin/showwin_last op /dev/shm/$USER/showwin/$SEARCH_REGEX. Dit is nodig om, indien nodig, met behulp van een script het venster-ID voor een bepaalde combinatie te verwijderen showwinOntkoppel.

Wat kan er verbeterd worden

Ten eerste moeten de scripts handmatig worden geconfigureerd. Zeker, vanwege de noodzaak om je te verdiepen in en veel met je handen te doen, zullen velen van jullie niet eens proberen het systeem te configureren. Als het mogelijk zou zijn om het pakket eenvoudigweg te installeren en alles eenvoudiger te configureren, dan zou het misschien wat aan populariteit winnen. En kijk dan, de applicatie zou worden vrijgegeven in standaarddistributies.

En wellicht kan het makkelijker. Als u aan de hand van de id van een venster de id kunt achterhalen van het proces dat het heeft gemaakt, en aan de hand van de id van het proces kunt u achterhalen welk commando het heeft gemaakt, dan zou het mogelijk zijn om de installatie te automatiseren. Sterker nog, ik begreep niet of wat ik in deze paragraaf schreef mogelijk was. Feit is dat ik persoonlijk tevreden ben met de manier waarop het nu werkt. Maar als iemand anders dan ik de hele aanpak handig vindt en iemand deze verbetert, dan gebruik ik graag een betere oplossing.

Een ander probleem is, zoals ik al schreef, dat de vensters in sommige gevallen niet van elkaar te onderscheiden zijn. Tot nu toe heb ik dit alleen bij incognito in chroom/chroom waargenomen, maar misschien is er ergens anders iets soortgelijks. Als laatste redmiddel is er altijd de mogelijkheid van universele combinaties Alt + 1...Alt + 0. Nogmaals, ik gebruik Firefox en voor mij persoonlijk is dit probleem niet significant.

Maar het grote probleem voor mij is dat ik Mac OS voor mijn werk gebruik en dat ik zoiets daar niet kon configureren. nutsvoorziening wmctrl Ik denk dat ik het heb kunnen installeren, maar het werkt niet echt op Mac OS. Er kan iets gedaan worden met de applicatie Automator, maar het is zo traag dat het niet handig is om het te gebruiken, zelfs als het werkt. Ik kon ook geen toetscombinaties instellen zodat ze in alle programma's werkten. Als iemand plotseling met een oplossing komt, zal ik die graag gebruiken.

In plaats Output

Het bleken een onverwacht groot aantal woorden voor zo’n ogenschijnlijk eenvoudige functionaliteit. Ik wilde het idee overbrengen en de tekst niet overbelasten, maar ik ben er nog niet achter hoe ik het eenvoudiger kan vertellen. Misschien zou het beter zijn in videoformaat, maar zo vinden mensen het hier niet leuk.

Ik heb een beetje gesproken over wat er onder de motorkap van het script zit en hoe je het kunt configureren. Ik ben niet ingegaan op de details van het script zelf, maar het zijn slechts 50 regels, dus het is niet moeilijk te begrijpen.

Ik hoop dat iemand anders dit idee zal uitproberen en het misschien zelfs zal waarderen. Ik kan over mezelf zeggen dat het script ongeveer 3 jaar geleden is geschreven en dat het HEEL handig voor mij is. Zo handig dat het ernstig ongemak veroorzaakt bij het werken met de computers van anderen. En met een werkende MacBook.

Link naar scripts

Bron: www.habr.com

Voeg een reactie