 So, I spent the last couple of weeks reinstalling ArcoLinux here on my main production machine. I had ArcoLinux on this machine previously. I had the same installation up and running for about four years, but I had so much stuff installed on that installation, thousands and thousands of programs that I've tested out software over the years for purposes of the YouTube channel. I had like a million different window managers and programming languages. I had so much stuff installed on that installation that I had eventually, I was starting to experience some problems, some breakage packages either weren't working properly or in some cases weren't working at all. So I did a fresh installation of ArcoLinuxD, which is a minimal version of ArcoLinux. ArcoLinuxD and I installed the Qtile window manager on it. And with Qtile, I'm using my Qtile configs, not Arco's configs because I've got my own configs for practically everything that I've saved over the years. So I'm back up and running on this machine and it's quite minimal. I've only got the one window manager Qtile installed. And for a software suite, as far as, you know, desktop software programs, I installed only absolutely what I needed thus far. So I've got OBS up and running so I could record today's video. I've got Kaden live so I can render the video later. I've got GIMP so I can make a thumbnail. I've got the Brave browser and a few other odds and ends. Like, you know, I've got Emacs installed, of course. But I've tried to keep things quite minimal. That way, if I do run into breakage, anything that breaks, it's obvious what is the problem because it's going to be that package that I just installed, right? If you install thousands and thousands of packages and your installation is broken, it's very hard to figure out what is the problem there, right? But when you slowly add packages, it's obvious if you do run into any issues. And right now, I've got everything up and running. Let me show you my Qtile config. So let me go ahead and launch my Qtile config and let's go to my readme.org here. And let me zoom in here. So I've had to make some minor tweaks to my Qtile configs because I did run into some annoying situations where SDDM, which is the login manager that Arco Linux installs by default. And I like SDDM so I left it as the login manager. But when I log into Qtile from SDDM, it would hang, sometimes hang for a long period of time, like it would take 60 seconds for it finally to load Qtile. And sometimes when it finally did load Qtile, it didn't launch all the necessary programs. It didn't launch the session manager or the compositor PyCom or it was not launching background services needed for GPG keys, like the password store, like the pass command, things like that. Every now and then, you know, it would sort of log you in, but it didn't launch everything that it should. And it was kind of weird. And I assumed that it was having a problem with some of my startup services with Qtile because SDDM, when you log in, you tell what window manager to log in, in my case, Qtile. And it was trying to run some of these commands from these Qtile configs. And it was probably something not quite right with one or more of the commands. And you know, it was just causing me issues. So I started over with the Qtile config. Well, I didn't start over, but I really started with a blank canvas. And I tried to add only what I needed to the config. So this is a org document, by the way, for those of you that haven't seen my 50 to 60 Emacs videos, right? I write a lot of my config files in org. So readme.org actually writes out to a file called config.py. That is actually the proper Qtile config. If I scroll down, there will be the source code blocks here. So what this is, this is Python code inside the source code block. And it gets written to a file config.py, right? But by doing a org document, it also allows me to do a proper outline with comments. These comments will not get exported to config.py. They're just for purposes of documentation when I push the readme to my GitLab. And also for purposes of this video, it's a little easier on video for me to show you this stuff because it's obvious what each of the sections of the configs are because I've got it outlined as an org document. So I've tried to keep things pretty simple here. The first section is about this config. And this is simply all of the copyright and licensing information that is at the top of the default Qtile config.py. So I kept all of that, that's part of this source code block here. That's really the first source code block is just these comments. And then not part of config.py, but part of the readme here, is information about my GitLab and my YouTube channel. The next section is, of course, the import. So this is all of the Python libraries that I'm importing, so that I can use inside the Qtile config. The next section, of course, is variables. This is where I set up variables for my mod key, mod4. That's the super key. I always use super as my mod key. You could use alt. You could set mod to mod1 to use the alt key for your modifier key for your window manager. But if you use Emacs or many other programs on Linux or not just Linux, but pretty much any operating system, the alt key is used in a lot of other places where the super key is really never used. So I strongly recommend using the super key as the modifier key for all of your window managers. I also set up variables for my term. I use the alacrity terminal. My browser is Firefox. Now I actually don't use Firefox. That was part of the default config for Qtile. I'm actually going to change that to Brave. I actually did not know that was set. Let me write that and let me go ahead and do a org bevel tangle to write that over to my config.py, which is, again, the actual file that Qtile reads. I also set a variable for my Emacs, and that's going to be the Emacs client command because I always use Emacs as a client-server relationship. The next section is custom functions. These are just three custom functions that I created because they solve some problems that I needed to solve. The first one, add tree tab section. What this does, it allows me, if I'm using the tree tab layout within Qtile, I can add a section within the tree tab layout by assigning this a key binding, essentially. I don't actually have the tree tab layout enabled in my config currently, so I can't show you this, but if I ever do in the future want to use the tree tab layout, being able to quickly add sections to that layout with a key binding would be a nice thing to have, so I've created a function for that if I want to use that, and the next two I actually do use. These are this function here I called minimize all, and then this function here, maximize by switching the layout. So minimize all what it does. It allows me to have a key binding that runs this function to minimize all the windows on the screen. So let me show you this in action. Let me open up three terminals here. So if I do super shift M is what I've assigned this, super shift M minimizes all the windows. So all those programs are still up and running, but it hides them, right? Now to toggle that back on, super shift M again will bring all three of those windows back. Let me super shift C to close all those windows. The next function is a weird little function. I was having a problem when I wanted to full screen windows. Let me go back to a empty workspace. So let's imagine I've got two windows open. Let me make this one here full screen. So if I do super F, it makes it full screen. It essentially makes it like a max layout, right? But I was running into a problem where I'd sometimes toggle this full screen mode and I wouldn't get the layout I was in back. So most of the time on most workspaces, I have the Monad tall layout, which is your traditional master and stack layout. And what I wanted is if I was already in Monad tall and I decided to do super F to go to this max layout, it would go to the max layout, right? But if I was already in the max layout and I hit super F, it would switch to the Monad tall. But what this does, it basically allows that to actually be a toggle kind of thing, right? Now I'm in Monad tall. If I do super F, it's max, right? If I, right now I'm in max. If I do super F, it goes back to Monad tall. Or you can see that's what's going on with the if and the else statement. If I'm already in Monad tall, make me max. I'm already in max. Then make me Monad tall. The next section is probably the biggest section of the config. It is the key bindings. And of course, this is just org comments here, this table and this is not part of what gets exported to the config.py. This is just for documentation purposes. So if you go to my get lab, to my dot files repo to Qtile, right? You'll see a proper table that's nice and formatted for some of the more important key bindings, right? But this is actually the source code block begins here, keys equals, and I have a lot of different key bindings. So one thing I did want to mention is I had always, I've been using D menu for my run launcher forever, but I decided since, you know, I was changing things up a little bit doing a new installation. I went ahead and changed my run launcher to Rofi. So you can see I'm going to do super shift return. Now launches Rofi. So super shift return launches Rofi and you see D run. So that's searching for your desktop files. So proper desktop applications, right? Where D menu searches all the binaries on your system. Now I could change this if I do Rofi dash show and run instead of D run, run would actually search all the binaries, not just the desktop binaries. Well, for the most part, you know, all of my key bindings are basically the same things I've been using for years and all of my window managers. I've got a key cords set for launching Emacs related key binding. So I'm using the key cord, super E, say key cord mod E, super E followed by another key. So super E followed by E just launches Emacs. Super E followed by A launches E-M-M-S, which is a audio player, music player in Emacs. Super E B launches the Emacs iBuffer yada yada yada. And I did go ahead and set one other a kind of neat key binding here. This key binding runs a couple of commands. And that's super E followed by F4, kind of a weird key binding, but it's not something you'll use very often, but occasionally I need to do this. I want to kill Emacs and I want to restart the Emacs server, the Emacs daemon. So I set a key binding for it, like if Emacs ever hangs, if it ever crashes for some reason, this is the nuclear option, right? Super E followed by F4 will kill Emacs, restart the daemon, and then super EE. I could launch Emacs again back at the dashboard. And then the next key cord section, super P for prompt, super P followed by another key, launches all of my D-Menu scripts, my DM scripts, although I've got them all using the dash R flag, which means run the DM script using Rofi instead of D-Menu. So if I do super P H to run the DM hub, it runs the DM hub through Rofi rather than D-Menu. The next section is groups. This is pretty self-explanatory. Group names, one through nine. If you use my config, don't change group names. Group names, one through nine is important because super one through nine, how it determines those key bindings is the group name, super plus, and then it takes this list, right? So don't change this. If you want to change the actual titles of the Workspaces group labels, it's actually where you would change that. You can change this, but don't change group names. But for me, I have them both set to the same because these days I just prefer one through nine as the labels as well. And the default layouts, you can say I use monad tall on pretty much all nine layouts. Except three and four, I have set to tall. And then after that, you've got these four loops in Python. These four loops are what make the magic happen with super one through nine, super two, for example, I'm already on two, super three takes me to Workspace three, super two takes me back, super nine would take me to Workspace nine, right? These are what makes that kind of magic happen. So these four loops, don't touch these unless you really know what you're doing. These also handle a super shift one through nine, super shift one through nine would send a window to a workspace. So super shift three, just sent that Emax window to Workspace three, super three takes me to Workspace three, super shift two, sends that window back to Workspace two, super two takes me back to Workspace two. Next section is color schemes. This is all comments. The only bit of code is this code block here and this one line colors equals colors dot doom one. So I'm gonna use the doom one color scheme. And what this does, it takes that color scheme from a file that I have called colors dot pie. So you have config dot pie, which is your actual Qtile config, but I created also a second library that gets imported called colors. And I have defined like 10 or 12 different color schemes. You say I give them a name. So if I have colors set to colors dot doom one, doom one will be the color scheme for Qtile. For the widgets and the bar. If I'd set that colors equals colors dot Dracula, then the bar would be using the Dracula colors, et cetera, et cetera. Then I have this section here default settings for all layouts. So all of your layouts, monad tall, max floating, whatever it happens to be. I want them all to use the following of variables. Border width needs to be two, margin needs to be eight. Margin is the gaps between the windows. Border width, focus needs to be this color, border normal needs to be that color. So that just saves me from unnecessary code duplication later where when I'm playing with the individual layouts, you know, I know I'm going to use this and all of them. So let me just go ahead and set that right now. And then the next section is titled layouts. And it's a rather lengthy code block, but most of it is commented out. So what I've done is most of what I've got here are layouts that is pretty much all the available layouts in Qtile. I've got them all in my config. I don't use, but like four of them. But I've got them here again, mainly for documentation purposes. So if you guys want to try them out, for example, maybe you wanted to try this BSP layout. Well, you just uncomment that line, right? Now for me, I'm not going to use the BSP layout. So I'll undo that right and comment that back out. But you can see you've got all of these other things like ratio tiles, vertical tile, the matrix layout. I'm using monad tall, your traditional master and stack, but there's a monad wide layout, which is like a master and stack, but instead of like a horizontal master stack, it's like a vertical master and stack. That's kind of weird. Maybe depending on your monitor size and the orientation, you may want to experiment with some of that stuff. But I'm just using monad tall, tile and max. Max is full screen. Tile is a tiling layout. Let me actually open two windows in the tile layout. This is tile, right? I'm not using any gaps. And I have one window bigger than the other. And this is kind of weird. Why do you do that, DT? Well, I have certain situations where I actually want this, where for example, when I'm recording videos, I typically have OBS and a file manager open side by side. But OBS, I need pretty big because I want to actually be able to preview what I'm recording. But in the other window, I just want like my file manager open to the directory where those files, those video files are being created. So I can verify that the files are being created and recorded because I never want to hit start record in OBS without actually seeing that that file has actually been created because sometimes you'll mistakenly think that you hit start recording in OBS, but you really didn't click it properly, right? And you'll talk for 20 minutes and then realize you didn't record a dang thing. So this is, I use that for recording videos. I also use this for streaming videos where again, the big tiling section will be for OBS and the smaller tiling section would be for the YouTube browser window and like the pop out chat so I can actually monitor the YouTube chat during the live stream. So that's what I use that particular layout for. Next up is the widgets section. This is the biggest part of the config. It's all the widgets in the panel. You can think of this as the panel configuration. I'm just going to scroll through it. I'm going to really discuss this. There's a lot to it, but you guys, I've done videos on how to configure the panel and the widgets before in Qtel. The next section is the screens. Screens are your monitors. I have three monitors. So what I'm doing is this definition here, a knit widget screen one. This is my second monitor, the middle monitor. This is actually what we're watching here. I'm saying on this monitor, I want you to grab a knit widgets list. So basically grab all of the widgets that were part of that widgets block that I showed you a second ago. I want everything, but on the next one, a knit widget screen two. So this is the widgets that get displayed on the other two monitors, monitors one and three, right? I want you to display a different set of widgets on the panel on those monitors. Basically all the widgets that set up, I want you to delete two widgets. You see, I give it a range of 22 to 24. What this does is it deletes a sys tray widget and a spacer widget. So it basically gets rid of the sys tray on one and three, monitors one and three. Monitor two can have the sys tray, monitor one and three can't have the sys tray. And I did this because Tutile does not like you having multiple sys trays, it won't allow it. So if you use multiple monitors, you gotta get rid of those extra sys trays. So that is how I am doing it as I just have separate functions essentially for each panel on each monitor. The next section that I've entitled here some important functions. These are, I believe these were just default definitions in the default Qtall config. I did not create these. These are handling things like how windows get sent to previous screen, next screen, things like that. If you use key bindings for things like that. And the next section is drag floating layouts. So this is what your mouse does. So my mod and the left click will drag a window mod and the right click resizes a window. So mod left, mod right, just drags it. And then I can mod F to make that full screen mod F again to send that back. Super shift M, remember minimizes. Super shift M would bring that back. Then near the end of the Qtall config, we've got some window rules. So this is a list of various windows that I want to float. So you can see, you can specify a class name or you can specify title name for windows. And every time it finds a window that matches that class name or that title name, it will make sure it floats it. For example, match title calculate. I use calculate as my calculator. So let me super shift enter to launch Rofi and let me search for calculate. And it launches calculate as a floating window. If I didn't have that rule there, it might actually try to force that into a tiling layout which would look very bad for a calculator, right? So that's how you force windows that need to float to float. You just specify right here. And if you have a situation where you're not sure if what the program is, what it's window manager class name is or what it's title is, what you need to do is use the xprop command. Type xprop in a terminal, let me zoom in. So you can see xprop, x-p-r-o-p. Hit enter and your cursor is gonna turn into a X, like a cross, right? Click on the window that you wanna figure out the class name for, for example, this terminal window if I click on it, right? Now I get returned here in the terminal, window manager class name is alacrity with a capital A. Make sure you get the spelling, right? If you wanted the window name itself, when I ran the command was xprop space the tilde character because I was in the home directory. Now the window manager name of a terminal is gonna change depending on what you're doing in the terminal. So in this case, if you want all your terminals to have a floating rule, you would specify the class name, alacrity. But if you only wanted it when you're running a certain command and that command always showed the same title of the window, then you could specify by title name if you prefer. Other than that, the end of this config is one I definitely didn't want to just briefly talk about. Auto start programs. So one of the things, this function here, what it does is it runs this shell script, autostart.sh. So let me go to autostart.sh because I did spend a little bit of time on this. This file was much bigger before because I had a lot of different for loops and if statements, I had a lot going on in it. And some of that stuff I think was causing some of those login issues where things were hanging a little bit. I've really slimmed this down to where all I'm doing in this config now is I'm assigning a color scheme, doom one. So this variable color scheme equals doom one. I'm using that because here I'm gonna have that variable actually be substituted for doom one. And basically these lines here, these individual lines are programs that will be executed. So lxsession is my session manager, pycom dash dash daemon launch pycom as a daemon. And then emax dash dash daemon launch emax as a daemon. Then em applet is the network manager applet. So that's your networking applet. And then I want you to run dot screen layout layout.sh. This is a shell script that a render which is a GUI front end to X render executes. It basically fixes my monitor order because by default my monitors are plugged in in a weird order where they're all backwards. So I have this a render script that fixes the monitor order as soon as I log into Qtile. And then I sleep for one second just to give the computer time to breathe for one second. And then I launch conky. Conky of course is the system monitoring program that runs here. And then finally I have like four different ways to assign a wallpaper for you can comment out this one and you know, choose a different one if you want. For example, maybe you wanna use the find command and then use XRs to randomly pick a wallpaper for me. I'm always going to set a wallpaper that is found in dot cache slash wall. So this is just a plain text file that has a the location to an image saved. And so if I do super P B to run one of my DM scripts and I do set it launches SXIV which is the image viewer, right? And I just scroll down to any image I like such as this one here. I hit M on the keyboard to market super shift C to close that window. And what it does, it sets that wallpaper and it writes to that file dot cache slash wall the location to this image. So the next time I log into Qtile, Qtile with the X wallpaper command draws this wallpaper again. That's how it always remembers the wallpaper and always sets the correct wallpaper. So that's just a little bit of what I've been playing around with here in the last couple of weeks getting my fresh installation of Oracle Linux back up and running streamlining a little bit of what's going on on my computers. Qtile is running beautifully. I'm going to push the latest configs to my GitLab. So if you go to my GitLab.com slash DWT1 that's my GitLab. Look for my dot files repository. You'll find my Qtile config and dot config slash Qtile. Now before I go I want to thank a few special people. I want to thank the producers of the show Gabe James, Matt Paul, Steve West, Arkotic, Armor Dragon Commander, Henry George Lee, Matthew, Methos, Nate, Erion, Paul, Peace, Archon, Fedora, Realities4Less, Red Prophet, Roland, Soul, Astri, Tianran, Tools, Devler, Wardgentune, Ubuntu, and Willy. These guys, my highest tiered patrons. I want to thank these guys because I couldn't do what I do without each and every one of these guys. I also want to thank each and every one of these fine ladies and gentlemen as well. All these names you're seeing on the screen right now. These are all my supporters over on Patreon. I don't have any corporate sponsors. If you like my work, want to see more videos about Linux and free and open source software like Qtile, subscribe to DistroTube over on Patreon. Peace guys.