Search code examples
luaawesome-wm

Awesome WM: Placing tiled clients in specific order on startup


I've installed Awesome WM about a week ago. Since then I've been trying to place terminal clients (bare terminal and vim, vifm, htop) in a specific order on startup. Here is a visual representation of what I'm trying to achieve:

########################
#            #   htop  #
#            ###########
#    vim     #   bare  #
#            ###########
#            #   vifm  #
########################

I've managed to place vim in the right position, but other windows are placed in what seems to be an arbitrary order, which changes with every reboot. Here is the content of my autostart.lua config:

    1 local awful = require("awful")                                 
    1                                                                
    2 awful.spawn.single_instance(terminal.."-e xmodmap ~/.Xmodmap; exit")             
    3 awful.spawn.single_instance("brave-browser", {                 
    4     fullscreen = true,                                         
    5     focus = true                                               
    6 })                                                             
    7             
    8 awful.spawn(terminal.." -e vim", {
    9     tag = "edit",
   10     placement = awful.placement.left,                          
   11     callback = function(c) awful.client.setmaster(c) end})
   12 awful.spawn(terminal.." -e htop", {                      
   13     tag = "edit",                                          
   14     height = 80, 
   15     placement = awful.placement.top_right})               
   16 awful.spawn(terminal, {
   17     tag = "edit",                                              
   18     placement = awful.placement.right})
   19 awful.spawn(terminal.." -e vifm", {   
   20     tag = "edit",    
   21     placement = awful.placement.bottom_right})
   22                                                                
   23 awful.spawn(terminal.." -e neomutt", {
   24     tag = "communication",                                     
   25     fullscreen = true })
   26                                                         
   27 awful.spawn("Spotify", { tag = "read" })

The layout of the tag with which I have problem is "tile". I'm on Awesome v4.3. What client property should I add to get the desired behavior?


Solution

  • To get clients been spawned in the desired positions on startup callback option should be used. Here is a chunk of my autostart.lua file related to the issue:

        1 local awful = require("awful")                                                   
        1                                                                                  
        2 local function spawn_vifm ()                                                     
        3     awful.spawn(terminal.." -e vifm", {                                          
        4         tag = "edit",                                                            
        5         placement = awful.placement.bottom_right                                 
        6     })                                                                           
        7 end                                                                              
        8                                                                                  
        9 local function spawn_term ()                                                     
       10     awful.spawn(terminal, {                                                      
       11         tag = "edit",                                                            
       12         placement = awful.placement.right,                                       
       13         callback = function(c) spawn_vifm() end                                  
       14 })                                                                               
       15 end                                                                              
       16                                                                                  
       17 local function spawn_htop ()                                                     
       18     awful.spawn(terminal.." -e htop", {                                          
       19         tag = "edit",                                                            
       20         placement = awful.placement.top_right,                                   
       21         callback = function(c) spawn_term() end                                  
       22     })                                                                           
       23 end
       .......
       38 awful.spawn(terminal.." -e vim", {                                               
       39     tag = "edit",                                                                
       40     placement = awful.placement.left,                                            
       41     callback = function(c)                                                       
       42         awful.client.setmaster(c)                                                
       43         store_active_client(awful.tag.find_by_name(awful.screen.focused(), "edit"), c)
       44         spawn_htop()                                                             
       45     end                                                                          
       46 })
    

    Spawning the next client in the callback function of the previous one ensures, that the placement property will be preserved for both of them.