{"id":55206,"date":"2020-01-15T00:00:00","date_gmt":"2020-01-14T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/alternativnoe-upravlenie-oknami-v-linux"},"modified":"2020-02-18T14:03:18","modified_gmt":"2020-02-18T11:03:18","slug":"alternativnoe-upravlenie-oknami-v-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","title":{"rendered":"Alternative window management in Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I am one of those who sets Caps Lock to switch layouts because I am too lazy to press two keys when I can press one. I would even like to have two unnecessary keys: one I would use to switch to the English layout, and the other for the Russian one. But the second unnecessary key is for calling the context menu, which is so unnecessary that many laptop manufacturers remove it. So I have to make do with what I have. <\/p>\n<p><\/p>\n<p>And I also don\u2019t want to look for window icons on the taskbar when switching between them, trying to catch the names while scrolling through <em>Alt+Tab<\/em>, switching desktops, etc. I want to press a keyboard shortcut (ideally just one, but there are no spare unnecessary keys left) and instantly get to the window I need. For instance:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: Firefox<\/li>\n<li>Alt+D: Firefox (Private Browsing)<\/li>\n<li>Alt+T: Terminal<\/li>\n<li>Alt+M: Calculator<\/li>\n<li>Alt+E: IntelliJ Idea<\/li>\n<li>and so on.<\/li>\n<\/ul>\n<p><\/p>\n<p>Moreover, by pressing, for example, <em>Alt+M<\/em> I want to see the calculator regardless of whether this program is currently running. If it is running, its window should be focused, and if not, it should launch the required program and focus it when it loads.<\/p>\n<p><\/p>\n<p>For cases that are not covered by the previous scenario, I want to have universal keyboard shortcuts that can be easily assigned to any of the open windows. For example, I have assigned 10 shortcuts from <em>Alt+1<\/em> up to <em>Alt+0<\/em>, which are not tied to any specific programs. I can simply press <em>Alt+1<\/em> and the window that is currently in focus will gain focus when I press <em>Alt+1<\/em>.<\/p>\n<p><\/p>\n<p>Below are descriptions of a couple more features and answers on how to achieve this. But let me warn you right away that such customization 'for yourself' can lead to a strong dependency and even withdrawal symptoms when needing to use Windows, Mac OS, or even someone else's computer with Linux.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>In fact, if you think about it, we do not use that many programs daily. A browser, terminal, IDE, some messenger, file manager, calculator, and that's probably about it. You don\u2019t need that many keyboard shortcuts to cover 95% of everyday tasks.<\/p>\n<p><\/p>\n<p>For programs that have multiple windows open, one of them can be designated as the main one. For example, several IntelliJ Idea windows are assigned to <em>Alt+E.<\/em>Under normal conditions, when you press <em>Alt+E.<\/em> , some window of that program will open, most likely the one that was opened first. However, if you press <em>Alt+E.<\/em> When one of the windows of this application is already in focus, this window will be designated as the main one, and it will receive the focus on subsequent key combination presses. <\/p>\n<p><\/p>\n<p>The main window can be reassigned. To do this, the combination must first be reset, and then assign a different window as the main one. To reset the combination, you need to press the combination itself and then a special reset combination, which I have assigned to <em>Alt+Backspace<\/em>. This will trigger a script that cancels the assignment of the main window for the previous combination. After that, you can assign a new main window as described in the previous paragraph. Resetting the bound window to universal combinations occurs in the same way.<\/p>\n<p><\/p>\n<p>The introduction turned out to be long, but I wanted to explain what we will be doing first, and then describe how to do it.<\/p>\n<p><\/p>\n<h2 id=\"dlya-teh-komu-nadoelo-chitat\">For those who are tired of reading<\/h2>\n<p><\/p>\n<p>In short, the link to the scripts is at the end of the article.<\/p>\n<p><\/p>\n<p>However, you won't be able to just install and start using it right away. First, you'll need to figure out how the script finds the required window. Without this, you won't be able to tell the script where to pass the focus. And you need to understand what to do if the appropriate window is suddenly not found.<\/p>\n<p><\/p>\n<p>Also, I won't focus on how to set up the execution of scripts on key combinations. For example, in KDE, this is in System Settings \u2192 Shortcuts \u2192 Custom Shortcuts. This should also be possible in other window managers.<\/p>\n<p><\/p>\n<h2 id=\"znakomstvo-s-wmctrl\">Introduction to wmctrl<\/h2>\n<p><\/p>\n<p><em>Wmctrl<\/em> is a console utility for interacting with the X Window Manager. This is a key program for the script. Let's take a quick look at how to use it.<\/p>\n<p><\/p>\n<p>First, let\u2019s display a list of open windows:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -lx\n0x01e0000e -1 plasmashell.plasmashell             N\/A Desktop \u2014 Plasma\n0x01e0001e -1 plasmashell.plasmashell             N\/A Plasma\n0x03a00001  0 skype.Skype                         N\/A Skype\n0x04400003  0 Navigator.Firefox                   N\/A Google Translate - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Best Posts of the Day \/ Habr - Mozilla Firefox (Private Browsing)\n...<\/code><\/pre>\n<p><\/p>\n<p>Option <em>-l<\/em> outputs a list of all open windows, and <em>-x<\/em> adds the class name to the output (<em>skype.Skype<\/em>, <em>Navigator.Firefox<\/em> etc.). We will need the window id (column 1), class name (column 3), and window title (the last column).<\/p>\n<p><\/p>\n<p>You can try to activate a window using the option <em>-a<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -a skype.Skype -x<\/code><\/pre>\n<p><\/p>\n<p>If all goes according to plan, the Skype window should appear on the screen. If instead, use the option <em>-x<\/em> to use option <em>-i<\/em>, instead of the class name, you can specify the window's id. The problem with the id is that it changes each time the application is launched, and we can't know it in advance. On the other hand, this attribute uniquely identifies the window, which can be important when the application opens more than one window. More on this later.<\/p>\n<p><\/p>\n<p>At this stage, we need to remember that we will be looking for the desired window using regex on the output <em>wmctrl -lx<\/em>. But this doesn't mean we have to use something complex. Usually, the class name or window title is sufficient. <\/p>\n<p><\/p>\n<p>In principle, the main idea should already be clear. In the global hotkeys\/shortcuts settings for your window manager, we configure the desired combination to execute the script.<\/p>\n<p><\/p>\n<h2 id=\"kak-polzovatsya-skriptami\">How to use scripts<\/h2>\n<p><\/p>\n<p>First, we need to install the console utilities <em>wmctrl<\/em> and <em>xdotool<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get install wmctrl xdotool<\/code><\/pre>\n<p><\/p>\n<p>Next, we need to download the scripts and add them to <em>$PATH<\/em>. I usually place them in <em>~\/bin<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd ~\/bin\n$ git clone https:\/\/github.com\/masyamandev\/Showwin-script.git\n$ ln -s .\/Showwin-script\/showwin showwin\n$ ln -s .\/Showwin-script\/showwinDetach showwinDetach<\/code><\/pre>\n<p><\/p>\n<p>If the directory <em>~\/bin<\/em> did not exist, it needs to be created and you must restart (or re-login), otherwise <em>~\/bin<\/em> will not be recognized in <em>$PATH<\/em>. If everything was done correctly, the scripts should be accessible from the console, and tab autocompletion should work.<\/p>\n<p><\/p>\n<p>The main script <strong>showwin<\/strong> takes 2 parameters: the first is the regex we will use to find the desired window, and the second parameter is the command to be executed if the desired window is not found. <\/p>\n<p><\/p>\n<p>You can try executing the script, for example:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ showwin \"Mozilla Firefox$\" firefox<\/code><\/pre>\n<p><\/p>\n<p>If Firefox is installed, focus should be given to its window. Even if Firefox was not running, it should have started.<\/p>\n<p><\/p>\n<p>If successful, you can try configuring command executions for combinations. In the global hotkeys\/shortcuts settings, add:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: showwin \u00abMozilla Firefox\u00bb firefox<\/li>\n<li>Alt+D: showwin \u00abMozilla Firefox (Private Browsing)\u00bb \u00abfirefox -private-window\u00bb<\/li>\n<li>Alt+C: showwin \u00abchromium-browser.Chromium-browser N*\u00bb chromium-browser<\/li>\n<li>Alt+X: showwin \u00abchromium-browser.Chromium-browser I*\u00bb \u00abchromium-browser -incognito\u00bb<\/li>\n<li>Alt+S: showwin \u00abskype.Skype\u00bb skypeforlinux<\/li>\n<li>Alt+E: showwin \u00abjetbrains-idea\u00bb idea.sh<\/li>\n<\/ul>\n<p><\/p>\n<p>And so on. Each person can configure the key combinations and software to their liking.<br \/>\nIf everything was set up correctly, we will be able to switch between windows simply by pressing the keys for the combinations specified above.<\/p>\n<p><\/p>\n<p>I will disappoint Chrome lovers: it is not possible to distinguish a regular window from an incognito one based on output. <em>wmctrl<\/em> You can\u2019t have them; they have the same class names and window titles. The N* and I* characters in the suggested regex are needed so that these regex patterns can be distinguished from each other and different main windows can be assigned to them.<\/p>\n<p><\/p>\n<p>To reset the main window of the previous combination (effectively for the regex that was <strong>showwin<\/strong> called last), you need to call the script <strong>showwinDetach<\/strong>. I have this script assigned to a key combination. <em>Alt+Backspace<\/em>. <\/p>\n<p><\/p>\n<p>The script <strong>showwin<\/strong> has another function. When it is called with a single parameter (in this case, the parameter is just an identifier), it does not check the regex at all and considers all windows suitable. This may seem useless in itself, but this way we can assign any window as the main one and quickly switch to that window.<\/p>\n<p><\/p>\n<p>I have the following combinations set up:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+1: showwin \u00abCustomKey1\u00bb<\/li>\n<li>Alt+2: showwin \u00abCustomKey2\u00bb<\/li>\n<li>\u2026<\/li>\n<li>Alt+0: showwin \u00abCustomKey0\u00bb<\/li>\n<li>Alt+Backspace: showwinDetach<\/li>\n<\/ul>\n<p><\/p>\n<p>Thus, I can bind any windows to the combinations. <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>By simply pressing <em>Alt+1<\/em> , I bind the current window to this combination. I can unbind it by pressing <em>Alt+1<\/em>, and then <em>Alt+Backspace<\/em>. Or I can close the window, that also works.<\/p>\n<p><\/p>\n<p>Next, I will share a few technical details. You can skip reading them and just try to set up and see. But I would recommend figuring out other people's scripts before running them on your computer :).<\/p>\n<p><\/p>\n<h2 id=\"kak-razlichat-raznye-okna-odnogo-prilozheniya\">How to distinguish between different windows of the same application<\/h2>\n<p><\/p>\n<p>In principle, the very first example \"wmctrl -a skype.Skype -x\" was working and can be used. But let\u2019s take another look at the example with Firefox, where 2 windows are opened:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">0x04400003  0 Navigator.Firefox                   N\/A Google Translate - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Top publications of the day \/ Habr - Mozilla Firefox (Private Browsing)<\/code><\/pre>\n<p><\/p>\n<p>The first window is in regular mode, while the second is in Private Browsing. These windows would like to be considered different applications, allowing different key combinations to switch between them. <\/p>\n<p><\/p>\n<p>The script that switches windows needs to be more complex. I used the following solution: output a list of all windows, making <em>grep<\/em> by regex, take the first line using <em>head<\/em>, retrieve the first column (this will be the window id) using <em>cut<\/em>, and switch to the window by id.<\/p>\n<p><\/p>\n<p>There should be a joke here about regular expressions and two problems, but in fact, I\u2019m not using anything complicated. I need regex to specify the end of the line (the symbol \"$\") and to distinguish \"Mozilla Firefox$\" from \"Mozilla Firefox (Private Browsing)$\".<\/p>\n<p><\/p>\n<p>The team looks something like this:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -i -a `wmctrl -lx | grep -i \"Mozilla Firefox$\" | head -1 | cut -d\" \" -f1`<\/code><\/pre>\n<p><\/p>\n<p>Here, one can already guess the second feature of the script: if grep outputs nothing, it means the required application is not open, and it needs to be started by executing the command from the second parameter. Then, periodically check if the required window has opened to pass the focus to it. I won't dwell on this; anyone interested can look at the source code.<\/p>\n<p><\/p>\n<h2 id=\"kogda-okna-prilozheniya-ne-razlichimy\">When the application windows are indistinguishable<\/h2>\n<p><\/p>\n<p>So, we have learned to pass focus to the desired application's window. But what if more than one window of the application is open? To which one should we pass the focus? The script above will most likely transfer focus to the first open window. However, we would prefer more flexibility. We would like the ability to remember which specific window we need and switch to that window.<\/p>\n<p><\/p>\n<p>The idea was this: If we want to remember a specific window for a keyboard shortcut, we need to press that shortcut when the desired window is in focus. In the future, when pressing this shortcut, the focus will be given to that specific window until it is closed or we reset it for that shortcut. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<p>The script's algorithm <strong>showwin<\/strong> is approximately as follows:<\/p>\n<p><\/p>\n<ul>\n<li>Check if we have previously memorized the window id to which we need to pass the focus.<br \/>\nIf we have memorized it and such a window still exists, we pass focus to it and exit. <\/li>\n<li>We check which window is currently in focus, and if it fits our requirement, we save its id for future transitions and exit.<\/li>\n<li>We switch to any suitable window if it exists or open the required application.<\/li>\n<\/ul>\n<p><\/p>\n<p>To find out which window is currently in focus, we can use the xdotool console utility, converting its output to hexadecimal format:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ printf \"0xx\" `xdotool getwindowfocus`<\/code><\/pre>\n<p><\/p>\n<p>Memorizing something in bash is easiest by creating files in a virtual filesystem that resides in memory. In Ubuntu, this is connected by default in <em>\/dev\/shm\/<\/em>. I can't say anything about other distributions, but I hope something similar exists as well. You can check with the command:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ mount -l | grep tmpfs<\/code><\/pre>\n<p><\/p>\n<p>The script will create empty directories in this folder, like these: <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX\/$WINDOW_ID<\/em>. Additionally, with each call, it will create a symlink <em>\/dev\/shm\/$USER\/showwin\/showwin_last<\/em> to <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX<\/em>. This will be necessary to remove the window id for a specific shortcut using the script if needed. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<h2 id=\"chto-mozhno-uluchshit\">What can be improved<\/h2>\n<p><\/p>\n<p>First of all, scripts need to be configured manually. Surely, due to the necessity to delve into and do a lot of it by hand, many of you may not even try to set up the system. If there was a way to simply install a package and configure everything more easily, it might have gained some popularity. And who knows, maybe it would have made its way into standard distributions.<\/p>\n<p><\/p>\n<p>And maybe it could be made easier. If you could find out the process ID of a window by its ID, and then determine which command created that process by its ID, the setup could be automated. In reality, I haven\u2019t looked into whether what I wrote in this paragraph is possible. The fact is, I\u2019m satisfied with how it works now. But if someone else finds the approach convenient and improves it, I would be glad to use the better solution.<\/p>\n<p><\/p>\n<p>Another problem, as I\u2019ve mentioned, is that in some cases, windows cannot be distinguished from one another. I've only observed this with incognito mode in Chrome\/Chromium, but perhaps there are similar cases elsewhere. In any case, there are always universal combinations to fall back on. <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>Again, I use Firefox, and for me personally, this problem is not significant.<\/p>\n<p><\/p>\n<p>However, a significant problem for me is that for work, I use Mac OS, and I couldn\u2019t set anything like that up there. I managed to install the utility, but it doesn\u2019t work well on Mac OS. <em>wmctrl<\/em> I can do something with the application, but it lags so much that it\u2019s inconvenient to use, even when it works. I also couldn\u2019t configure the keyboard shortcuts to work in all programs. If someone comes up with a solution, I would be happy to use it. <em>Automator<\/em>Unexpectedly, I've ended up with quite a few words for what seemed like a simple functionality. I wanted to convey the idea without overloading the text, but I haven\u2019t figured out how to explain it more simply. Perhaps it would be better in a video format, but this format isn't very popular here.<\/p>\n<p><\/p>\n<h2 id=\"vmesto-zaklyucheniya\">In conclusion<\/h2>\n<p><\/p>\n<p>I\u2019ve shared a bit about what\u2019s under the hood of the script and how to set it up. I didn't delve into the specifics of the script, but it's only 50 lines long, so it's not difficult to understand.<\/p>\n<p><\/p>\n<p>I\u2019ve covered some basics about what\u2019s involved in the script and how to set it up. I didn't go into the details of the script, but it consists of only 50 lines, so it\u2019s easy to grasp. <\/p>\n<p><\/p>\n<p>I hope someone else tries this idea and maybe even appreciates it. Speaking for myself, the script was written about 3 years ago and it\u2019s VERY convenient for me. So convenient that it causes serious discomfort when working on other people's computers and with my work MacBook. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/masyamandev\/Showwin-script\">Link to the scripts<\/a><\/noindex><\/p>\n<p>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483846\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443. \u042f \u0431\u044b \u0434\u0430\u0436\u0435 \u0445\u043e\u0442\u0435\u043b 2 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: \u043e\u0434\u043d\u0443 \u0431\u044b \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438, \u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u0439. \u041d\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55206","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-14T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Alternative window management in Linux | ProHoster","description":"I'm one of those who set the Caps Lock key for switching layouts because I'm too lazy to press 2 keys when I can just press one.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster","og:description":"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-14T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55206","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:48:29","updated":"2022-09-30 14:18:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/55206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=55206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/55206\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=55206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=55206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=55206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}