rearrange stdin handler
This commit is contained in:
		
							parent
							
								
									1c538a003d
								
							
						
					
					
						commit
						a4cbf117c9
					
				
							
								
								
									
										112
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								src/main.cpp
									
									
									
									
									
								
							| @ -51,6 +51,8 @@ struct Seat { | ||||
| static void updatemon(Monitor &mon); | ||||
| static void setupStatusFifo(); | ||||
| static void onStatus(); | ||||
| static void onStdin(); | ||||
| static void handleStdin(); | ||||
| static void cleanup(); | ||||
| static void requireGlobal(const void* p, const char* name); | ||||
| static void waylandFlush(); | ||||
| @ -177,61 +179,6 @@ static const struct wl_seat_listener seatListener = { | ||||
| 	.name = [](void*, wl_seat*, const char *name) { } | ||||
| }; | ||||
| 
 | ||||
| static void handleStdin(const std::string& line) | ||||
| { | ||||
| 	// this parses the lines that dwl sends in printstatus()
 | ||||
| 	std::string monName, command; | ||||
| 	auto stream = std::istringstream {line}; | ||||
| 	stream >> monName >> command; | ||||
| 	if (!stream.good()) { | ||||
| 		return; | ||||
| 	} | ||||
| 	auto mon = std::find_if(begin(monitors), end(monitors), [&](const Monitor& mon) { | ||||
| 		return mon.xdgName == monName; | ||||
| 	}); | ||||
| 	if (mon == end(monitors)) | ||||
| 		return; | ||||
| 	if (command == "title") { | ||||
| 		auto title = std::string {}; | ||||
|  		std::getline(stream, title); | ||||
| 		mon->bar->setTitle(title); | ||||
| 	} else if (command == "selmon") { | ||||
| 		uint32_t selected; | ||||
| 		stream >> selected; | ||||
| 		mon->bar->setSelected(selected); | ||||
| 	} else if (command == "tags") { | ||||
| 		uint32_t occupied, tags, clientTags, urgent; | ||||
| 		stream >> occupied >> tags >> clientTags >> urgent; | ||||
| 		for (auto i=0u; i<tagNames.size(); i++) { | ||||
| 			auto tagMask = 1 << i; | ||||
| 			int state = TagState::None; | ||||
| 			if (tags & tagMask) | ||||
| 				state |= TagState::Active; | ||||
| 			if (urgent & tagMask) | ||||
| 				state |= TagState::Urgent; | ||||
| 			mon->bar->setTag(i, state, occupied & tagMask ? 1 : 0, clientTags ? 1 : 0); | ||||
| 		} | ||||
| 		mon->tags = tags; | ||||
| 	} else if (command == "layout") { | ||||
| 		auto layout = std::string {}; | ||||
| 		std::getline(stream, layout); | ||||
| 		mon->bar->setLayout(layout); | ||||
| 	} | ||||
| 	mon->hasData = true; | ||||
| 	updatemon(*mon); | ||||
| } | ||||
| 
 | ||||
| static LineBuffer<512> _stdinBuffer; | ||||
| static void onStdin() | ||||
| { | ||||
| 	auto res = _stdinBuffer.readLines( | ||||
| 		[](void* p, size_t size) { return read(0, p, size); }, | ||||
| 		[](char* p, size_t size) { handleStdin({p, size}); }); | ||||
| 	if (res == 0) { | ||||
| 		quitting = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void setupMonitor(Monitor& monitor) { | ||||
| 	monitor.bar.emplace(&monitor); | ||||
| 	monitor.bar->setStatus(lastStatus); | ||||
| @ -307,6 +254,61 @@ static void setupStatusFifo() | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static LineBuffer<512> _stdinBuffer; | ||||
| static void onStdin() | ||||
| { | ||||
| 	auto res = _stdinBuffer.readLines( | ||||
| 		[](void* p, size_t size) { return read(0, p, size); }, | ||||
| 		[](char* p, size_t size) { handleStdin({p, size}); }); | ||||
| 	if (res == 0) { | ||||
| 		quitting = true; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void handleStdin(const std::string& line) | ||||
| { | ||||
| 	// this parses the lines that dwl sends in printstatus()
 | ||||
| 	std::string monName, command; | ||||
| 	auto stream = std::istringstream {line}; | ||||
| 	stream >> monName >> command; | ||||
| 	if (!stream.good()) { | ||||
| 		return; | ||||
| 	} | ||||
| 	auto mon = std::find_if(begin(monitors), end(monitors), [&](const Monitor& mon) { | ||||
| 		return mon.xdgName == monName; | ||||
| 	}); | ||||
| 	if (mon == end(monitors)) | ||||
| 		return; | ||||
| 	if (command == "title") { | ||||
| 		auto title = std::string {}; | ||||
|  		std::getline(stream, title); | ||||
| 		mon->bar->setTitle(title); | ||||
| 	} else if (command == "selmon") { | ||||
| 		uint32_t selected; | ||||
| 		stream >> selected; | ||||
| 		mon->bar->setSelected(selected); | ||||
| 	} else if (command == "tags") { | ||||
| 		uint32_t occupied, tags, clientTags, urgent; | ||||
| 		stream >> occupied >> tags >> clientTags >> urgent; | ||||
| 		for (auto i=0u; i<tagNames.size(); i++) { | ||||
| 			auto tagMask = 1 << i; | ||||
| 			int state = TagState::None; | ||||
| 			if (tags & tagMask) | ||||
| 				state |= TagState::Active; | ||||
| 			if (urgent & tagMask) | ||||
| 				state |= TagState::Urgent; | ||||
| 			mon->bar->setTag(i, state, occupied & tagMask ? 1 : 0, clientTags ? 1 : 0); | ||||
| 		} | ||||
| 		mon->tags = tags; | ||||
| 	} else if (command == "layout") { | ||||
| 		auto layout = std::string {}; | ||||
| 		std::getline(stream, layout); | ||||
| 		mon->bar->setLayout(layout); | ||||
| 	} | ||||
| 	mon->hasData = true; | ||||
| 	updatemon(*mon); | ||||
| } | ||||
| 
 | ||||
| const std::string prefixStatus = "status "; | ||||
| const std::string prefixShow = "show "; | ||||
| const std::string prefixHide = "hide "; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user