| 
									
										
										
										
											2016-09-27 04:18:43 +03:00
										 |  |  | # vim: ft=ruby | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-28 23:30:07 +03:00
										 |  |  | class BspwmPager < Worker | 
					
						
							|  |  |  | 	def mainloop() | 
					
						
							| 
									
										
										
										
											2016-10-23 02:08:29 +03:00
										 |  |  | 		IO.popen("bspc subscribe") do |pipe| | 
					
						
							| 
									
										
										
										
											2016-09-27 13:03:14 +03:00
										 |  |  | 			pipe.each do |line| | 
					
						
							| 
									
										
										
										
											2017-05-22 21:38:46 +03:00
										 |  |  | 				self.write parse_data(line) | 
					
						
							| 
									
										
										
										
											2016-09-27 04:18:43 +03:00
										 |  |  | 			end | 
					
						
							|  |  |  | 		end | 
					
						
							|  |  |  | 	end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def parse_data(string) | 
					
						
							|  |  |  | 		# Example: WMDVI-I-1:o1:o2:f3:f4:O5:f6:f7:f8:f9:fh:LT:TF:G | 
					
						
							|  |  |  | 		out = [] | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 		monitor = "" | 
					
						
							|  |  |  | 		state = { | 
					
						
							| 
									
										
										
										
											2017-05-24 16:39:18 +03:00
										 |  |  | 			monitors: {} | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-09-27 04:18:43 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 		string.chomp[1..-1].split(":").each do |part| | 
					
						
							| 
									
										
										
										
											2016-09-27 04:18:43 +03:00
										 |  |  | 			n = part[1..-1] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 			if part[0] =~ /^[Mm]$/ | 
					
						
							|  |  |  | 				monitor = n | 
					
						
							|  |  |  | 				state[:monitors][monitor] = { | 
					
						
							|  |  |  | 					desktops: {} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				state[:monitors][monitor][:focused] = true if part[0] == "M" | 
					
						
							|  |  |  | 			elsif part[0] =~ /^[OFUofu]$/ | 
					
						
							|  |  |  | 				d_focused = true if part[0] =~ /[OFU]/ | 
					
						
							|  |  |  | 				d_occupied = true if part[0] =~ /[Oo]/ | 
					
						
							|  |  |  | 				d_urgent = true if part[0] =~ /[Uu]/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				state[:monitors][monitor][:desktops][n] = { | 
					
						
							|  |  |  | 					focused: d_focused, | 
					
						
							|  |  |  | 					occupied: d_occupied, | 
					
						
							|  |  |  | 					urgent: d_urgent | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			elsif part[0] == "L" | 
					
						
							| 
									
										
										
										
											2017-05-24 16:39:18 +03:00
										 |  |  | 				state[:monitors][monitor][:layout] = n | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 			end | 
					
						
							|  |  |  | 		end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		state[:monitors].each do |m_name, m| | 
					
						
							|  |  |  | 			if @my_config['monitors'] != nil | 
					
						
							|  |  |  | 				next unless @my_config['monitors'].include?(m_name) | 
					
						
							|  |  |  | 			end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 16:42:23 +03:00
										 |  |  | 			if state[:monitors].count > 1 or @my_config['show_single_monitor'] | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				if m[:focused] | 
					
						
							| 
									
										
										
										
											2019-05-15 14:50:52 +03:00
										 |  |  | 					out << "%{BC{mon_focused}} #{m_name} %{B-}" | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				else | 
					
						
							|  |  |  | 					out << " #{m_name} " | 
					
						
							| 
									
										
										
										
											2016-09-27 04:18:43 +03:00
										 |  |  | 				end | 
					
						
							|  |  |  | 			end | 
					
						
							| 
									
										
										
										
											2017-05-22 21:38:46 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 			m[:desktops].each do |d_name, d| | 
					
						
							| 
									
										
										
										
											2017-05-24 16:42:23 +03:00
										 |  |  | 				if @my_config['blacklist'] != nil | 
					
						
							|  |  |  | 					next if @my_config['blacklist'].include?(d_name) | 
					
						
							|  |  |  | 				end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				if d[:focused] | 
					
						
							| 
									
										
										
										
											2019-05-15 14:50:52 +03:00
										 |  |  | 					out << "%{BC{bg_focused}} #{d_name} %{B-}" | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				elsif d[:urgent] | 
					
						
							|  |  |  | 					out << "%{A:bspc desktop -f #{d_name}:}%{R} #{d_name} %{R}%{A}" | 
					
						
							|  |  |  | 				elsif d[:occupied] | 
					
						
							|  |  |  | 					out << "%{A:bspc desktop -f #{d_name}:} #{d_name} %{A}" | 
					
						
							|  |  |  | 				else | 
					
						
							| 
									
										
										
										
											2016-10-04 15:34:25 +03:00
										 |  |  | 					if @my_config['show_empty_desktops'] | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 						out << " #{d_name} " | 
					
						
							| 
									
										
										
										
											2017-05-22 21:38:46 +03:00
										 |  |  | 					end | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				end | 
					
						
							|  |  |  | 			end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 16:39:18 +03:00
										 |  |  | 			if m[:layout] == "T" | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				out << " t " | 
					
						
							| 
									
										
										
										
											2017-05-24 16:39:18 +03:00
										 |  |  | 			elsif m[:layout] == "M" | 
					
						
							| 
									
										
										
										
											2017-05-23 06:20:28 +03:00
										 |  |  | 				out << " m " | 
					
						
							| 
									
										
										
										
											2016-09-27 04:18:43 +03:00
										 |  |  | 			end | 
					
						
							|  |  |  | 		end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return out.join.chomp | 
					
						
							|  |  |  | 	end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-28 23:30:07 +03:00
										 |  |  | Modules.add("bspwm_pager", "BspwmPager") |