 In the last couple of years, my Tiling Window Manager of choice has been Exmonad. I've lived primarily in Exmonad, at least for the last couple of years, but recently I decided to go back to what is probably my second favorite Tiling Window Manager of all time, and that's what we're looking at right now. This is Qtile. Qtile began life many years ago as essentially an Exmonad clone. The developers, they decided they liked Exmonad, everything about it, the function, the feel, but they wanted to write their Tiling Window Manager using Python, rather than Haskell. And because I'm not a Pythonista, I'm not that great at Python scripting, but I would like to get better at it. I thought, you know what, for the next several weeks, or maybe even the next several months, I'm going to switch back to Qtile, I'm going to go back and live in Qtile, primarily both on the computer here at my office, my workstation here, as well as my personal computer at home. I've been working on my Qtile config, because the last time that I really lived in Qtile long term, not just logging in for a few hours just to checking up on things, the last time I really lived in Qtile was probably in the early days of this YouTube channel, which was started nearly six years ago, so it's been a long time, and I needed to go back and actually take a look at my Qtile config, because there were some errors in it. There were some things that I really, there were some unexpected bugs in it. And the reason there were some bugs in it is Qtile does see active development, so it does change over time. The configuration file has changed a lot over the probably nearly 10 years. I've probably been using Qtile on and off. I remember in the early days of Qtile, for example, instead of defaulting to numbers for the workspaces, they actually defaulted to the home row letters on the keyboard, DSDF, you know, all of that instead of one, two, three, four. I remember in the early days of Qtile, I believe the default layout was your standard master and stack layout, which they call monad tall. But these days, when I look at a default Qtile config, they're actually using like a stack layout or a columned layout by default. So again, things change over time, libraries get deprecated, new libraries get created. So what I decided to do is since my old config had some bugs, I started with a brand new config. So what I did, anybody that wants to get into Qtile or really any window manager, what you can do is typically you'll find default configs for most programs, but especially for your window managers, look for them and slash user slash share slash doc and then slash name of program. In this case, it'll be Qtile and in this directory, there is default underscore config dot pi. So there is the default config. So if you don't have a config in your home directory in dot config slash Qtile, by default, it'll read the default config dot pi that's in that directory in user share doc Qtile. Now one of the first things I wanted to focus on when I was rewriting my new config, let me zoom back out my new config. So you can see the two side by side here is the default config. When you get to the key bindings, this keys block here keys equals, and then you got the opening bracket, you know, this is not a lengthy list of key bindings, right? So it's not a lot of key bindings in the default config. And of course, if you've ever looked at any of my telling window manager configs, I have a ton of key bindings. So I actually went and added, here's my keys. And if I just, you know, scroll down a little bit, well scroll down too far, but it's a pretty big block. It's just keep scrolling, you know, it's three times the size is the default keys here. And one of the things I was doing in my old config that was kind of broken was key cords, because by default, you can use key cords in Qtile, which is one of the really neat things about Qtile. And it's also a neat thing about Xmone, which Xmone has the same built in feature where you can just use key cords out of the box. And you can see right here, I'm using a key cord, Mod E. So that's Super E followed by another key. So Super E followed by E launches Emacs and Super E followed by a launches Emacs, the E-M-M-S audio player, the music player that's built into Emacs. Super E-B would launch the iBuffer program inside Emacs. You can see all this Super E followed by another key, all these key bindings, they're Emacs related programs. And then I have Super P followed by various letters. And this is the DM scripts. So Super P, you can think as prompt, right? Because D-Menu, Rofi, you know, that's basically a run launch. It's really a run prompt. So Super P followed by these letters runs various DM scripts. Now I can show you this in action. Super P-H will launch the DM hub, right? Escape out of that. Super P-I launches the DM MAME program, which is actually a screenshot program. So D-P-I for basically image screenshots. You can do Super P-M to search for a man page or get a random man page if I'm really nerding out. I actually want to read the F-ing manual. Now the problem in my old config was there was an error somewhere. And I don't know where the error was, but there was something that caused my old config to bug out using key cords. It was a really strange error because the very first time you used a key cord after logging into Qtel. So imagine I just logged into Qtel and this is the very first key cord I ever hit is Super P-H. You know, it will work. And you know, I'll do whatever I needed to do with that particular program. But then all of my super key key bindings after that don't work as far as the workspace related key bindings. Like, I'm on workspace two, if I wanted to move to workspace one, super one takes me to workspace one, super two brings me back. All of these key bindings stop working after me running a key cord program the very first time. What I had to do to fix that is I just always knew that the very first time I hit a key cord key binding after that my super keys would quit working until I restarted Qtel. And it only happened the very first time. After that you could keep using your key cords and everything would work. But it was just a weird little bug and I couldn't figure it out. And I know other people also had this same kind of key cord related problem. But oddly enough, when I rewrote my config, I guess the problem, whatever the problem was fixed itself because I didn't import everything into my new config. I wasn't trying to basically make the new config like my old config. I wanted to try some new things out. But it looks like that problem has solved itself. Once you get past the key binding section of the config, you know, you have your groups. So groups are essentially workspaces. Qtel calls them groups. And my groups section is this section here. There's a lot going on in this because the default config, if I move over to the default config for Qtel, this is the group section, right? It's much smaller. You have groups equals i for i in 1, 2, 3, 4, 5, 6, 7, 8, 9. That's your workspaces, 1 through 9. And then for i in groups, you know, set the key bindings for super plus the number, super shift plus the number. And originally, because I started with the default config, I was going to use this. I was just going to use the numbers, which I am using the numbers. I was just going to use their default code. But I didn't like a couple of things about this. For one thing, their default code has this here, lazy window to group, switch group equals true. So what this does is when I send a window somewhere, so imagine I have a terminal open. So if I do super shift 3, it should send that window to workspace 3. Super shifts 3, right? That terminal window is now in workspace 3, which is hidden. It's not on any of my monitors right now. If I do super 3, I can go take a look at it. Super 2, back to workspace 2. Super 3, we'll go look at it again. If I do super shift 2, I send it back to workspace 2. Super 2, I'll go back to workspace 2, where both the windows are. But this config, the default config has this weird thing that I don't think was the case when I was initially trying out Qtile all those years ago. If this is set to true, what it does is if I hit super shift 3 to send that terminal to workspace 3, it actually brings workspace 3 to the terminal, meaning essentially it puts the terminal on workspace 3. It also takes focus of this monitor to workspace 3, and it was just weird because you could have already other things on workspace 3, and it was just, it was like everything was backwards. Every time I was trying to move windows around, the opposite of what I thought was going to happen happened, and I found that a very odd kind of workflow. So one of the things I wanted to do was make sure, in my config, I have the switch group equals false because that's the kind of standard way that pretty much every tiling window manager I've ever used kind of handles sending those windows to a new workspace. The other thing I did with the groups is instead of having this groups equals I for I and 1 through 9 and a range of 1 through 9, I just have the group names specified right in a list. So group names and group labels. Group labels is actually what is being displayed here, and you can see I have three different group labels, but if I got rid of the numbers and wanted to go back to actually naming the workspaces, because this is how I originally did it, although it looks like I got one too many workspaces, one, two, three, four, five, six, seven, eight, nine, yeah, okay. I'm glad I caught that error. I'll have to push that to my get lab when I'm done. But if I do a restart, you can say we can switch back to workspace names here are actual words for the group labels. But for me, I like simplicity just to save on space. I'm kind of digging just using the actual numbers for the workspaces 1 through 9. Under the group section of the config comes the layouts section. So this is where you specify all the layouts that you want to use, you know, because it's a dynamic Tyler, so you can have these predefined layouts. So like the master and stack layout or the max layout or the monocle layout, whatever you want to call it a full screen layout, you can have a grid layout or, you know, there's a ton of various telling window manager layouts, right? Well, and Qtile has a lot of them available, but it only actually has two out of the box that are enabled. The default column layout, which again, I thought they were using the master and stack by default years ago when I first tried this window manager, but the column layout is not something I would ever use. And then they have the max layout, which is something most people will find a need for. Sometimes you just want the window to be max, right? You want it full screen, so, you know, you want to get rid of the bar and everything. Just make a one window, the window with focus of the entire screen. But the master and stack layout, which is monad tall, they have turned off by default and the stack layouts turned off. The BSPWM kind of layouts turned off by default, you know, they have all these other really neat layouts. Well, you know, I went back and, you know, I've got my little block here and I actually turned on a lot of these. The most important one was monad tall and I made sure monad tall was the very first layout in the list that is uncommitted. That way monad tall will be the default layout unless I specify a certain workspace to have a another default layout other than monad tall. But back in my groups list here, group layouts, you can see I specified monad tall would be the layout, the default layout for each group one through nine. Now one of the trickiest parts to my configs is I'm a triple monitor user. So I've got three monitors. And that makes actually configuring the bar and all the widgets in the bar kind of tough because you don't have a good example of how to do that anywhere in the default Qtile config. This is the bar, screens. So screens equals screen and then bottom equals bar dot bar. So bottom by default, the panel was at the bottom. Well, obviously I want it at the top, so I'm going to change that in mine. But all of this happens on one screen. So how you handle this triple monitor thing is basically I need like three of these. So what I've done is I have this definition here. So I'm defining this function where I do the widget list. The widget list would be this section of their screens block here. Now mine is very long because I've got a lot going on. Lots of widgets, lots of things, right? So I have this widgets list that's very long of about 30 different widgets. Some of them are empty widgets, spacers, and things like that. And then at the end, I have defined a knit widgets screen one, a knit widgets screen two. I have a triple monitor set up, but two of the monitors will share the same bar and lay out. But one monitor, the bar will be slightly different. And the reason I have to do this is if I use a system tray, the system tray applet on the panel only works on one bar on one monitor. If you try to put it in all three bars on all three of my monitors, what happens is it crashes. It just errors out. It'll be a big white box on the bar that says config error, yada, yada, yada. So I have to basically eventually have three bars and they have three different widgets because the center bar returns everything in that widget list. But the other two panels, their other two bars, what I was doing is if it included the system tray widget, I was deleting widgets 9 and 10 from the list. So there's like 29 widgets here. That's nine and 10 were, I scroll up, there's a sys tray, right here, we've got it commented out. That's the sys tray and the separator right there. Those two widgets, because I no longer needed them. But what I ended up doing is because it was causing me some issues in other areas, I got rid of the system tray widget because honestly, I'm used to not using a system tray. For example, in DWM, you don't have a system tray available on the panel, right? DWM is very minimal. Honestly in Xmonad, I didn't use a system tray for a long time because Xmobar doesn't have a system tray. You have to use a third party tray program like a Trayer or Stallone tray or something like that. So I've, you know, I'm used to just living without a system tray. So I finally just decided, you know what, I'm going to get rid of the sys tray. The reason I got rid of the sys tray widget is because it does not like transparency. You probably noticed, I have a little transparency in this bar because the Qtile panel does accept true transparency as far as the background colors. And I have that set in my colors up here. See I have this here, of course that is RGB, a right, red, green, blue, alpha. And what you want to do to get true transparency is in the screen section, if I scroll back down where I finally have the screens listed, right here, the three different screens, the three different panels, the bars, right? Make sure you have background equals 0000000 in all of your panels. What this is is absolute transparency, right? That would be a completely transparent bar. So make sure you set the background to that. And then when you're defining your colors and your widgets, you know, and the various widgets have color colors that you can assign, you can see background colors equals zero well background colors, zero is this and that is a little bit of transparency as the EE at the end is a very slight transparency CC is a little more transparency because I actually can use a little bit of a gradient. If you wanted to really see this, I mean, I could make this one absolutely transparent and you can see it starts out with slight transparency and then fades to absolute transparency, right? That's a little jarring. Let's try something a little more subtle. Yeah. Yeah, that's not bad as well. For me, I just like a tinge of transparency, you know, I like my bar slightly transparent. I like my Emacs slightly transparent, like my cocky slightly transparent. I don't have my alacrity terminal set to be transparent, but I could turn that on if I wanted. And that's about it that I changed to the default config, the rest of the config here at the end with the some of the mouse rules and floating layouts, floating rules. All of this, all of this was default. The only other thing I added to the config was this little definition here start once and it's basically sub process call. So this is a Python function to call a shell process. And what I want you to do is I want you to run this script auto start.sh because I have this basically it's just a bash script. Let me show it to you if I can navigate to it. Just this little bash script where it runs all of these shell commands. So starts the LX session starts pi com starts the Emacs daemon starts cocky starts various system tray applets, but I'm not using a system tray at the moment. So what I think I'm going to do is comment these out. I'm really I'm convinced that going without the system tray is probably the best thing to do these days. System tray applets have always been kind of wonky on every panel I've ever tried. It was always a hassle getting any kind of system tray patching done with DWM. The system tray on Polybar is not easily configurable. I don't think you can actually specify a placement on the bar. I think it always has to be at the end of the bar. X-Mobar doesn't have a system tray, but using things like Stallone tray and tray are really clunky because you have to create complicated scripts for those things to appear on the screen in the right spot compared to where the actual X-Mobar is or Polybar whatever it is you're trying to use alongside it. System trays, a little weird. Also the system tray widget again had a bug in it to where the system tray widget does not work if your panel is transparent. So if you use any transparency at all in your panel, you cannot use the SysTray. Well, I say you can't. You can use it, but it looks really weird and really bad because it has like it's either all white background or all black background, but the icons themselves are actually fully transparent. It just bugs out. Another thing with the SysTray is it's Xorg only, which I'm using Xorg obviously with Qtile, but Qtile does have a Wayland version and the system tray is a Xorg program. So if you were using Qtile on Wayland, you couldn't use that particular SysTray widget anyway. So for now, I've just got it commented out. So that's the config. One last thing I want to just briefly talk about is when I was going back and starting with the default config, with the default key bindings for the configs, which I left a lot of the defaults in my current config, I did notice some of the behavior, especially switching window focus and moving windows around in the stack is a little different than I think the defaults were a few years ago because I didn't notice some peculiarities like if I switch up to this workspace here, we're in the master stack layout, right? The monad tall layout. If I hit J on the keyboard to navigate through the stack, that works. J goes back the other direction, but it seems like that doesn't work in every layout. Like if I do super tab to go to a different layout, like the stack layout, right? This window over here on the right side has focus, but J, actually, there's a stack in the stack. Remember, I had four windows open, three of them are in that right stack and J cycles through that. But how do I get to the window over there? Well, I don't have a way because super J and K obviously are just going up and down in the stack. And you would think, well, super H to go to the left, right? No, that is not set. I think what you have to do is, well, I'm going to have to actually go check the key bindings. It is, here's super H, J, K, L space, mod space, super space, lazy layout next is the command move window focus to the other window. Let's see if that works. So if I do super space, now I'm over in, I guess, the left stack, super space gets me back in the right stack. Yeah, it's just kind of weird super tab would cycle through the rest of the layouts that I have in my config. Another cool thing that I added, X mode has the ability to shrink and expand windows up, down, left and right and things like that. Obviously, Qtile has that. Now, some of the key bindings that I was using for that kind of stuff were taken up by some of the default key bindings and I didn't want to just go in and just overwrite all the default key bindings. So I decided I was actually going to use some different key bindings for this. So to expand a window, right, to make it grow, and it's actually, that is the name of the function is lazy grow window or something, I'd have to go check the config. I'm going to use super plus because I think that makes sense. When you grow, when you zoom in and out of text on a terminal emulator, a most terminal emulators, what's the key binding, the default key binding? It's control plus, control minus. Well, I'm going to use super plus and super minus for this. So if I do super plus on this middle window, super plus grows it. Super minus shrinks it, right? If I change focus and I do super plus on this one, you know, the bigger window it grows, super minus will shrink it back. So pretty cool little functionality and not those functions or those key bindings are here. So these were the ones I added mod equal, mod minus. So mod equal is lazy layout grow, mod minus is lazy layout shrink. And I specified that that key binding would be done in the monad tall and monad wide layouts because I have layout equals monad tall, monad wide. Just because I may, those key bindings don't really need to be in use for some of the other layouts like the BSP layout or the columns layout, because those layouts actually require you to be able to move windows, resize windows in all four directions using HJKL. And they've already in the default Qtile config, they've already got that set to super control HJKL. Just some neat things you can do with key bindings. I think most people probably, if you're new to Qtile, most people probably don't know that you can actually set a key binding to do two different things. So that's just a little bit of what I've done with Qtile here in the last few days while I'm thinking about it. Let me add my latest configs to my dot files. That way you guys can go over to my GitLab at gitlab.com slash dwt1 slash dot files and go to my dot files repo and look for the config.pi that's going to be in my home directory slash dot config slash Qtile slash config.pi. You can check out my latest config that I've been working a lot on. I spent many hours in the last two days by many, I mean, probably six, seven hours rewriting that config from the ground up, slowly adding things, taking things away, seeing what I like, seeing what I don't like. Right now I'm pretty happy with the panel, the transparency, all the widgets. I'm really happy with all the default key bindings and layouts and everything. And I'm really excited to be back in this thing, right? Because again, I haven't lived full time in Qtile in at least five years, probably, because I've spent so much time and other window managers over the course of this channel. And here in the last couple of years, I just kind of settled, you know, I've kind of settled on what was working. You know, kind of like I don't distro hop anymore. There came a time when I decided I wasn't going to window manager hop, you know, because I already had everything working in X modem. And then I was like, you know what, I'm just going to stay here. But now I'm kind of happy to be back in Qtile. It's almost like coming home. And as I do more with this config, extend it, maybe start writing some of my own custom functions. And we really pimp this thing out because I'm pretty excited. I want to start playing a little more with Python programming in general. So this will be a good testing ground for that. As I do some of that stuff, of course, I'm going to get it on camera and you guys will get it as a video. And before I go, I need to thank a few special people. I need to thank the producers of this episode. Gabe James, Matt Paul, Roy West, Armored Dragon, Commander Ingrid, George Lee, Methos, Nate Erion, Paul Fees, Archon, Fedora, reality's for us, Red Prophet, Roland, Solastry, Tools, Devler, Wardjintu, Anabuntu, and Willie. These guys, they're my highest tiered patrons over on Patreon. Without these guys, this episode you just watched would not have been possible. The show is brought to you by 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. I'm sponsored by you guys, the community. If you like my work and want to see more videos about free and open source software like Qtile, subscribe to DistroTube over on Patreon. Peace, guys. I might even make Qtile the default on DTOS.