receive bar state
This commit is contained in:
		
							parent
							
								
									7298730969
								
							
						
					
					
						commit
						629e8f6e1c
					
				| @ -55,6 +55,12 @@ | |||||||
|         <description summary="control one monitor"> |         <description summary="control one monitor"> | ||||||
|         </description> |         </description> | ||||||
| 
 | 
 | ||||||
|  |         <enum name="tag_state"> | ||||||
|  |           <entry name="none" value="0" summary="no state"/> | ||||||
|  |           <entry name="active" value="1" summary="tag is active"/> | ||||||
|  |           <entry name="urgent" value="2" summary="tag has at least one urgent client"/> | ||||||
|  |         </enum> | ||||||
|  | 
 | ||||||
|         <request name="release" type="destructor"> |         <request name="release" type="destructor"> | ||||||
|             <description summary="release dwl_monitor"> |             <description summary="release dwl_monitor"> | ||||||
|             </description> |             </description> | ||||||
| @ -64,9 +70,9 @@ | |||||||
|             <description summary="sent every time a tag state gets updated"> |             <description summary="sent every time a tag state gets updated"> | ||||||
|             </description> |             </description> | ||||||
|             <arg name="tag" type="int"/> |             <arg name="tag" type="int"/> | ||||||
|             <arg name="active" type="int"/> |             <arg name="state" type="uint" enum="tag_state"/> | ||||||
|             <arg name="num_clients" type="int"/> |             <arg name="num_clients" type="int"/> | ||||||
|             <arg name="urgent" type="int"/> |             <arg name="focused_client" type="int" summary="-1 if there is no focused client"/> | ||||||
|         </event> |         </event> | ||||||
| 
 | 
 | ||||||
|         <event name="frame"> |         <event name="frame"> | ||||||
|  | |||||||
							
								
								
									
										43
									
								
								src/bar.cpp
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								src/bar.cpp
									
									
									
									
									
								
							| @ -30,7 +30,16 @@ static QFont getFont() | |||||||
| static QFont font = getFont(); | static QFont font = getFont(); | ||||||
| static QFontMetrics fontMetrics = QFontMetrics {font}; | static QFontMetrics fontMetrics = QFontMetrics {font}; | ||||||
| 
 | 
 | ||||||
| Bar::Bar(const wl_output *output) | const wl_surface* Bar::surface() const { return _surface.get(); } | ||||||
|  | 
 | ||||||
|  | Bar::Bar() | ||||||
|  | { | ||||||
|  |     for (auto tag : tagNames) { | ||||||
|  |         _tags.push_back({ tag, ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_NONE, 0, 0, 0 }); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Bar::create(wl_output *output) | ||||||
| { | { | ||||||
|     _surface.reset(wl_compositor_create_surface(compositor)); |     _surface.reset(wl_compositor_create_surface(compositor)); | ||||||
|     _layerSurface.reset(zwlr_layer_shell_v1_get_layer_surface(wlrLayerShell, |     _layerSurface.reset(zwlr_layer_shell_v1_get_layer_surface(wlrLayerShell, | ||||||
| @ -47,21 +56,15 @@ Bar::Bar(const wl_output *output) | |||||||
|     zwlr_layer_surface_v1_set_exclusive_zone(_layerSurface.get(), barSize); |     zwlr_layer_surface_v1_set_exclusive_zone(_layerSurface.get(), barSize); | ||||||
|     wl_surface_commit(_surface.get()); |     wl_surface_commit(_surface.get()); | ||||||
| 
 | 
 | ||||||
|     for (auto tag : tagNames) { |  | ||||||
|         _tags.push_back({ tag, false }); |  | ||||||
|     } |  | ||||||
|     _windowTitle = "Window title"; |     _windowTitle = "Window title"; | ||||||
|     _status = "Status"; |     _status = "Status"; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const wl_surface* Bar::surface() const { return _surface.get(); } |  | ||||||
| 
 |  | ||||||
| void Bar::click(int x, int) | void Bar::click(int x, int) | ||||||
| { | { | ||||||
|     for (auto tag=_tags.rbegin(); tag != _tags.rend(); tag++) { |     for (auto tag=_tags.rbegin(); tag != _tags.rend(); tag++) { | ||||||
|         if (x > tag->x) { |         if (x > tag->x) { | ||||||
|             tag->active = !tag->active; |             // todo toggle
 | ||||||
|             invalidate(); |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -76,10 +79,17 @@ void Bar::invalidate() | |||||||
|     wl_surface_commit(_surface.get()); |     wl_surface_commit(_surface.get()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Bar::setTag(int tag, znet_tapesoftware_dwl_wm_monitor_v1_tag_state state, int numClients, int focusedClient) | ||||||
|  | { | ||||||
|  |     auto& t = _tags[tag]; | ||||||
|  |     t.state = state; | ||||||
|  |     t.numClients = numClients; | ||||||
|  |     t.focusedClient = focusedClient; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Bar::setStatus(const QString &status) | void Bar::setStatus(const QString &status) | ||||||
| { | { | ||||||
|     _status = status; |     _status = status; | ||||||
|     invalidate(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Bar::layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height) | void Bar::layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height) | ||||||
| @ -103,8 +113,6 @@ void Bar::render() | |||||||
|     _x = 0; |     _x = 0; | ||||||
|     painter.setFont(font); |     painter.setFont(font); | ||||||
| 
 | 
 | ||||||
|     setColorScheme(colorActive); |  | ||||||
|     painter.fillRect(0, 0, img.width(), img.height(), painter.brush()); |  | ||||||
|     renderTags(); |     renderTags(); | ||||||
|     setColorScheme(colorActive); |     setColorScheme(colorActive); | ||||||
|     renderText(_windowTitle); |     renderText(_windowTitle); | ||||||
| @ -128,8 +136,17 @@ void Bar::renderTags() | |||||||
| { | { | ||||||
|     for (auto &tag : _tags) { |     for (auto &tag : _tags) { | ||||||
|         tag.x = _x; |         tag.x = _x; | ||||||
|         setColorScheme(tag.active ? colorActive : colorInactive); |         setColorScheme(tag.state & ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_URGENT ? colorUrgent | ||||||
|  |             : tag.state & ZNET_TAPESOFTWARE_DWL_WM_MONITOR_V1_TAG_STATE_ACTIVE ? colorActive : colorInactive); | ||||||
|         renderText(tag.name); |         renderText(tag.name); | ||||||
|  |         auto indicators = qMin(tag.numClients, _bufs->height/2); | ||||||
|  |         for (auto ind = 0; ind < indicators; ind++) { | ||||||
|  |             if (ind == tag.focusedClient) { | ||||||
|  |                 _painter->drawLine(tag.x, ind*2, tag.x+5, ind*2); | ||||||
|  |             } else { | ||||||
|  |                 _painter->drawPoint(tag.x, ind*2); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -143,9 +160,9 @@ void Bar::renderText(const QString &text) | |||||||
| 
 | 
 | ||||||
| void Bar::renderStatus() | void Bar::renderStatus() | ||||||
| { | { | ||||||
|  |     _painter->fillRect(_x, 0, _bufs->width-_x, _bufs->height, _painter->brush()); | ||||||
|     auto size = textWidth(_status) + paddingX*2; |     auto size = textWidth(_status) + paddingX*2; | ||||||
|     _x = _bufs->width - size; |     _x = _bufs->width - size; | ||||||
|     _painter->fillRect(_x, 0, size, _bufs->height, _painter->brush()); |  | ||||||
|     _painter->drawText(paddingX+_x, _textY, _status); |     _painter->drawText(paddingX+_x, _textY, _status); | ||||||
|     _x = _bufs->width; |     _x = _bufs->width; | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								src/bar.hpp
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								src/bar.hpp
									
									
									
									
									
								
							| @ -14,7 +14,9 @@ | |||||||
| 
 | 
 | ||||||
| struct Tag { | struct Tag { | ||||||
|     QString name; |     QString name; | ||||||
|     bool active; |     znet_tapesoftware_dwl_wm_monitor_v1_tag_state state; | ||||||
|  |     int numClients; | ||||||
|  |     int focusedClient; | ||||||
|     int x; |     int x; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -40,10 +42,12 @@ class Bar { | |||||||
|     void renderText(const QString &text); |     void renderText(const QString &text); | ||||||
|     int textWidth(const QString &text); |     int textWidth(const QString &text); | ||||||
|     void setColorScheme(const ColorScheme &scheme); |     void setColorScheme(const ColorScheme &scheme); | ||||||
|     void invalidate(); |  | ||||||
| public: | public: | ||||||
|     explicit Bar(const wl_output *output); |     Bar(); | ||||||
|     const wl_surface* surface() const; |     const wl_surface* surface() const; | ||||||
|  |     void create(wl_output *output); | ||||||
|  |     void setTag(int tag, znet_tapesoftware_dwl_wm_monitor_v1_tag_state state, int numClients, int focusedClient); | ||||||
|     void setStatus(const QString &status); |     void setStatus(const QString &status); | ||||||
|  |     void invalidate(); | ||||||
|     void click(int x, int y); |     void click(int x, int y); | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
| #include "common.hpp" | #include "common.hpp" | ||||||
| 
 | 
 | ||||||
| constexpr bool topbar = 1; | constexpr bool topbar = true; | ||||||
| 
 | 
 | ||||||
| constexpr int paddingX = 10; | constexpr int paddingX = 10; | ||||||
| constexpr int paddingY = 3; | constexpr int paddingY = 3; | ||||||
| @ -15,3 +15,4 @@ constexpr bool fontBold = true; | |||||||
| 
 | 
 | ||||||
| constexpr ColorScheme colorInactive = {QColor(255, 255, 255), QColor(0, 0, 0)}; | constexpr ColorScheme colorInactive = {QColor(255, 255, 255), QColor(0, 0, 0)}; | ||||||
| constexpr ColorScheme colorActive = {QColor(255, 255, 255), QColor(0, 0, 255)}; | constexpr ColorScheme colorActive = {QColor(255, 255, 255), QColor(0, 0, 255)}; | ||||||
|  | constexpr ColorScheme colorUrgent = {colorActive.bg, colorActive.fg}; | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/main.cpp
									
									
									
									
									
								
							| @ -27,6 +27,7 @@ struct Monitor { | |||||||
|     wl_unique_ptr<wl_output> wlOutput; |     wl_unique_ptr<wl_output> wlOutput; | ||||||
|     wl_unique_ptr<znet_tapesoftware_dwl_wm_monitor_v1> dwlMonitor; |     wl_unique_ptr<znet_tapesoftware_dwl_wm_monitor_v1> dwlMonitor; | ||||||
|     std::optional<Bar> bar; |     std::optional<Bar> bar; | ||||||
|  |     bool created; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static void waylandFlush(); | static void waylandFlush(); | ||||||
| @ -44,6 +45,7 @@ znet_tapesoftware_dwl_wm_v1 *dwlWm; | |||||||
| std::vector<QString> tagNames; | std::vector<QString> tagNames; | ||||||
| static bool ready; | static bool ready; | ||||||
| static std::vector<Monitor> monitors; | static std::vector<Monitor> monitors; | ||||||
|  | static QString lastStatus; | ||||||
| static std::string statusFifoName; | static std::string statusFifoName; | ||||||
| static int statusFifoFd {-1}; | static int statusFifoFd {-1}; | ||||||
| static int statusFifoWriter {-1}; | static int statusFifoWriter {-1}; | ||||||
| @ -68,10 +70,10 @@ struct SeatState { | |||||||
| static SeatState seatState; | static SeatState seatState; | ||||||
| static Bar* barFromSurface(const wl_surface *surface) | static Bar* barFromSurface(const wl_surface *surface) | ||||||
| { | { | ||||||
|     auto fbar = std::find_if(begin(monitors), end(monitors), [surface](const Monitor &mon) { |     auto mon = std::find_if(begin(monitors), end(monitors), [surface](const Monitor &mon) { | ||||||
|         return mon.bar && mon.bar->surface() == surface; |         return mon.bar && mon.bar->surface() == surface; | ||||||
|     }); |     }); | ||||||
|     return fbar != end(monitors) && fbar->bar ? &*fbar->bar : nullptr; |     return mon != end(monitors) && mon->bar ? &*mon->bar : nullptr; | ||||||
| } | } | ||||||
| static const struct wl_pointer_listener pointerListener = { | static const struct wl_pointer_listener pointerListener = { | ||||||
|     .enter = [](void*, wl_pointer *pointer, uint32_t serial, |     .enter = [](void*, wl_pointer *pointer, uint32_t serial, | ||||||
| @ -132,19 +134,24 @@ static const struct znet_tapesoftware_dwl_wm_v1_listener dwlWmListener = { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const struct znet_tapesoftware_dwl_wm_monitor_v1_listener dwlWmMonitorListener { | static const struct znet_tapesoftware_dwl_wm_monitor_v1_listener dwlWmMonitorListener { | ||||||
|     .tag = [](void*, znet_tapesoftware_dwl_wm_monitor_v1*, int tag, int active, int numClients, int urgent) { |     .tag = [](void *mv, znet_tapesoftware_dwl_wm_monitor_v1*, int32_t tag, uint32_t state, int32_t numClients, int32_t focusedClient) { | ||||||
|         printf("tag %s: active=%d, num_clients=%d, urgent=%d\n", qPrintable(tagNames[tag]), active, numClients, urgent); |         auto mon = static_cast<Monitor*>(mv); | ||||||
|  |         mon->bar->setTag(tag, static_cast<znet_tapesoftware_dwl_wm_monitor_v1_tag_state>(state), numClients, focusedClient); | ||||||
|     }, |     }, | ||||||
|     .frame = [](void *mv, znet_tapesoftware_dwl_wm_monitor_v1*) { |     .frame = [](void *mv, znet_tapesoftware_dwl_wm_monitor_v1*) { | ||||||
|         auto mon = static_cast<Monitor*>(mv); |         auto mon = static_cast<Monitor*>(mv); | ||||||
|         if (!mon->bar) { |         if (mon->created) { | ||||||
|             mon->bar.emplace(mon->wlOutput.get()); |             mon->bar->invalidate(); | ||||||
|  |         } else { | ||||||
|  |             mon->bar->create(mon->wlOutput.get()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static void setupMonitor(Monitor &monitor) { | static void setupMonitor(Monitor &monitor) { | ||||||
|     monitor.dwlMonitor.reset(znet_tapesoftware_dwl_wm_v1_get_monitor(dwlWm, monitor.wlOutput.get())); |     monitor.dwlMonitor.reset(znet_tapesoftware_dwl_wm_v1_get_monitor(dwlWm, monitor.wlOutput.get())); | ||||||
|  |     monitor.bar.emplace(); | ||||||
|  |     monitor.bar->setStatus(lastStatus); | ||||||
|     znet_tapesoftware_dwl_wm_monitor_v1_add_listener(monitor.dwlMonitor.get(), &dwlWmMonitorListener, &monitor); |     znet_tapesoftware_dwl_wm_monitor_v1_add_listener(monitor.dwlMonitor.get(), &dwlWmMonitorListener, &monitor); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -208,10 +215,11 @@ static void onStatus() | |||||||
| { | { | ||||||
|     char buffer[512]; |     char buffer[512]; | ||||||
|     auto n = read(statusFifoFd, buffer, sizeof(buffer)); |     auto n = read(statusFifoFd, buffer, sizeof(buffer)); | ||||||
|     auto str = QString::fromUtf8(buffer, n); |     lastStatus = QString::fromUtf8(buffer, n); | ||||||
|     for (auto &monitor : monitors) { |     for (auto &monitor : monitors) { | ||||||
|         if (monitor.bar) { |         if (monitor.bar) { | ||||||
|             monitor.bar->setStatus(str); |             monitor.bar->setStatus(lastStatus); | ||||||
|  |             monitor.bar->invalidate(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user