i3 hacks #1

2 minute read Published:

I was looking for a simple way to bind an application to a specific i3 workspace based on its window properties. A concrete example: I want to bind application chromium-browser with webpage Freeture.ch to Workspace 1 and the same application with webpage Bing.com to Workspace 2.

Step 1 is to identify the different X properties offered by our window. Launch xprop and click on the chromium window, you shold get something like:

[xens:~] $ xprop
_NET_WM_STATE(ATOM) = 
WM_STATE(WM_STATE):
		window state: Normal
		icon window: 0x0
_NET_WM_USER_TIME(CARDINAL) = 4263399
WM_NORMAL_HINTS(WM_SIZE_HINTS):
		program specified location: 2, 18
		program specified minimum size: 411 by 66
WM_NAME(UTF8_STRING) = "Freeture.ch - Chromium"
_NET_WM_NAME(UTF8_STRING) = "Freeture.ch - Chromium"
XdndAware(ATOM) = BITMAP
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x2, 0x0, 0x1, 0x0, 0x0
_NET_WM_ICON(CARDINAL) = 	Icon (64 x 64):
	                                                                
	                                                                
	                                                                
	                         ░░▒▒▒▒▒▒▒▒▒▒░░                         
	                      ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░                      
	                   ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░                   
	                 ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░                 
	                ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░                
	              ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░              
	             ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░             
	            ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░            
	           ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░           
	          ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░          
	         ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░         
	        ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░        
	        ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒        
	       ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒       
	      ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░      
	      ░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░      
	     ░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░         ░░░░░░░░░░░░░░░░░░░░░      
	     ░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░             ░░░░░░░░░░░░░░░░░░░░     
	    ░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒░      ░░░░      ░░░░░░░░░░░░░░░░░░░     
	    ░░░░░░░▒▒▒▒▒▒▒▒▒▒▒░    ░░░░░░░░░░    ░░░░░░░░░░░░░░░░░░     
	    ░░░░░░░░▒▒▒▒▒▒▒▒▒░    ░░░░░░░░░░░░    ░░░░░░░░░░░░░░░░░░    
	   ░░░░░░░░░▒▒▒▒▒▒▒▒▒   ░░░░░░░░░░░░░░░░   ░░░░░░░░░░░░░░░░░    
	   ░░░░░░░░░░▒▒▒▒▒▒▒    ░░░░░░░░░░░░░░░░    ░░░░░░░░░░░░░░░░    
	   ░░░░░░░░░░▒▒▒▒▒▒▒   ░░░░░░░░░░░░░░░░░░   ░░░░░░░░░░░░░░░░    
	   ░░░░░░░░░░░▒▒▒▒▒░  ░░░░░░░░░░░░░░░░░░░░   ░░░░░░░░░░░░       
	   ░░░░░░░░░░░▒▒▒▒▒   ░░░░░░░░░░░░░░░░░░░░   ░░░░░░             
	   ░░░░░░░░░░░░▒▒▒▒   ░░░░░░░░░░░░░░░░░░░░    ░                 
	   ░░░░░░░░░░░░░▒▒░  ░░░░░░░░░░░░░░░░░░░░░░                     
	   ░░░░░░░░░░░░░▒▒░  ░░░░░░░░░░░░░░░░░░░░░░                 ░   
	   ░░░░░░░░░░░░░░▒░  ░░░░░░░░░░░░░░░░░░░░░░                 ░   
	   ░░░░░░░░░░░░░░▒░  ░░░░░░░░░░░░░░░░░░░░░░                 ░   
	   ░░░░░░░░░░░░░░░▒   ░░░░░░░░░░░░░░░░░░░░                 ░░   
	   ░░░░░░░░░░░░░░░░   ░░░░░░░░░░░░░░░░░░░░                 ░░   
	   ░░░░░░░░░░░░░░░░░  ░░░░░░░░░░░░░░░░░░░░                ░░░   
	   ░░░░░░░░░░░░░░░░░   ░░░░░░░░░░░░░░░░░░                ░░░    
	   ░░░░░░░░░░░░░░░░░    ░░░░░░░░░░░░░░░░                 ░░░    
	   ░░░░░░░░░░░░░░░░░░   ░░░░░░░░░░░░░░░░   ░            ░░░░    
	    ░░░░░░░░░░░░░░░░░░    ░░░░░░░░░░░░                  ░░░░    
	    ░░░░░░░░░░░░░░░░░░░    ░░░░░░░░░░    ░             ░░░░     
	    ░░░░░░░░░░░░░░░░░░░░      ░░░░      ░░            ░░░░░     
	     ░░░░░░░░░░░░░░░░░░░░              ░░            ░░░░░      
	     ░░░░░░░░░░░░░░░░░░░░░░          ░░░             ░░░░░      
	      ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░            ░░░░░░      
	      ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░            ░░░░░░       
	       ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░           ░░░░░░        
	        ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░           ░░░░░░░        
	        ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░          ░░░░░░░         
	         ░░░░░░░░░░░░░░░░░░░░░░░░░░░░          ░░░░░░░          
	          ░░░░░░░░░░░░░░░░░░░░░░░░░░          ░░░░░░░           
	           ░░░░░░░░░░░░░░░░░░░░░░░░░        ░░░░░░░░            
	            ░░░░░░░░░░░░░░░░░░░░░░░        ░░░░░░░░             
	             ░░░░░░░░░░░░░░░░░░░░░░       ░░░░░░░░              
	              ░░░░░░░░░░░░░░░░░░░░      ░░░░░░░░░               
	                ░░░░░░░░░░░░░░░░░░     ░░░░░░░░                 
	                 ░░░░░░░░░░░░░░░░    ░░░░░░░░░                  
	                   ░░░░░░░░░░░░░   ░░░░░░░░░                    
	                     ░░░░░░░░░░░ ░░░░░░░░                       
	                        ░░░░░░░░░░░░░                           
	                                                                
	                                                                
	                                                                


WM_WINDOW_ROLE(STRING) = "browser"
WM_CLASS(STRING) = "chromium-browser", "Chromium-browser"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
_NET_WM_PID(CARDINAL) = 26298
WM_LOCALE_NAME(STRING) = "en_US.UTF-8"
WM_CLIENT_MACHINE(STRING) = "thinkpad"
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, _NET_WM_PING

So there’s plenty of criteria that we can match, in our case we’ll use WM_NAME. According to i3 user guide (http://i3wm.org/docs/userguide.html#command_criteria) we must use the title criteria to match it, so here’s what your config will looks like:

for_window [title="^Freeture"] move container to workspace 1
for_window [title="^Bing"] move container to workspace 2
exec --no-startup-id chromium-browser --new-window freeture.ch
exec --no-startup-id chromium-browser --new-window bing.com

Then reload your i3 config and it should work !