feat: add system monitor feature with panel toggle and event handling

This commit is contained in:
retoor 2026-01-29 14:36:28 +01:00
parent df34716ea5
commit aee7030b30
20 changed files with 74 additions and 2 deletions

BIN
bin/dwn

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -21,7 +21,7 @@ build/main.o: src/main.c include/dwn.h include/config.h include/dwn.h \
/usr/include/dbus-1.0/dbus/dbus-threads.h include/systray.h \ /usr/include/dbus-1.0/dbus/dbus-threads.h include/systray.h \
include/news.h include/applauncher.h include/ai.h include/autostart.h \ include/news.h include/applauncher.h include/ai.h include/autostart.h \
include/services.h include/api.h include/demo.h include/screenshot.h \ include/services.h include/api.h include/demo.h include/screenshot.h \
include/ocr.h include/util.h include/ocr.h include/sysmon.h include/util.h
include/dwn.h: include/dwn.h:
include/config.h: include/config.h:
include/dwn.h: include/dwn.h:
@ -61,4 +61,5 @@ include/api.h:
include/demo.h: include/demo.h:
include/screenshot.h: include/screenshot.h:
include/ocr.h: include/ocr.h:
include/sysmon.h:
include/util.h: include/util.h:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -107,6 +107,7 @@ typedef struct Workspace Workspace;
typedef struct Monitor Monitor; typedef struct Monitor Monitor;
typedef struct Panel Panel; typedef struct Panel Panel;
typedef struct Config Config; typedef struct Config Config;
typedef struct SystemMonitor SystemMonitor;
struct Client { struct Client {
Window window; Window window;
@ -176,6 +177,8 @@ typedef struct {
Panel *top_panel; Panel *top_panel;
Panel *bottom_panel; Panel *bottom_panel;
SystemMonitor *sysmon;
Config *config; Config *config;
bool running; bool running;

View File

@ -24,6 +24,7 @@
#include "demo.h" #include "demo.h"
#include "screenshot.h" #include "screenshot.h"
#include "ocr.h" #include "ocr.h"
#include "sysmon.h"
#include "util.h" #include "util.h"
#include <stdio.h> #include <stdio.h>
@ -343,7 +344,12 @@ static void handle_map_request(XMapRequestEvent *ev)
return; return;
} }
client_manage(ev->window); SystemMonitor *sysmon = sysmon_find_by_window(ev->window);
Client *client = client_manage(ev->window);
if (sysmon != NULL && client != NULL) {
sysmon_set_client(sysmon, client);
}
} }
static void handle_unmap_notify(XUnmapEvent *ev) static void handle_unmap_notify(XUnmapEvent *ev)
@ -458,6 +464,10 @@ static void handle_expose(XExposeEvent *ev)
return; return;
} }
if (dwn->sysmon != NULL) {
sysmon_render(dwn->sysmon);
}
if (dwn->top_panel != NULL && ev->window == dwn->top_panel->window) { if (dwn->top_panel != NULL && ev->window == dwn->top_panel->window) {
panel_render(dwn->top_panel); panel_render(dwn->top_panel);
return; return;
@ -529,6 +539,10 @@ static void handle_button_press(XButtonEvent *ev)
return; return;
} }
if (dwn->sysmon != NULL) {
sysmon_handle_event(dwn->sysmon, (XEvent *)ev);
}
if (volume_slider != NULL && volume_slider->visible) { if (volume_slider != NULL && volume_slider->visible) {
if (ev->window == volume_slider->window) { if (ev->window == volume_slider->window) {
volume_slider_handle_click(volume_slider, ev->x, ev->y); volume_slider_handle_click(volume_slider, ev->x, ev->y);
@ -565,6 +579,11 @@ static void handle_button_press(XButtonEvent *ev)
} }
if (is_client_window) { if (is_client_window) {
SystemMonitor *sysmon = sysmon_find_by_window(ev->window);
if (sysmon != NULL) {
sysmon_handle_event(sysmon, (XEvent *)ev);
return;
}
XAllowEvents(dwn->display, ReplayPointer, ev->time); XAllowEvents(dwn->display, ReplayPointer, ev->time);
client_focus(c, true); client_focus(c, true);
return; return;
@ -648,6 +667,12 @@ static void handle_motion_notify(XMotionEvent *ev)
return; return;
} }
SystemMonitor *sysmon = sysmon_find_by_window(ev->window);
if (sysmon != NULL) {
sysmon_handle_event(sysmon, (XEvent *)ev);
return;
}
if (volume_slider != NULL && volume_slider->visible && ev->window == volume_slider->window) { if (volume_slider != NULL && volume_slider->visible && ev->window == volume_slider->window) {
volume_slider_handle_motion(volume_slider, ev->x, ev->y); volume_slider_handle_motion(volume_slider, ev->x, ev->y);
return; return;
@ -920,6 +945,8 @@ int dwn_init(void)
panels_init(); panels_init();
dwn->sysmon = sysmon_create();
systray_init(); systray_init();
xembed_init(); xembed_init();
@ -992,6 +1019,12 @@ void dwn_cleanup(void)
keys_cleanup(); keys_cleanup();
xembed_cleanup(); xembed_cleanup();
systray_cleanup(); systray_cleanup();
if (dwn->sysmon != NULL) {
sysmon_destroy(dwn->sysmon);
dwn->sysmon = NULL;
}
panels_cleanup(); panels_cleanup();
decorations_cleanup(); decorations_cleanup();
workspace_cleanup(); workspace_cleanup();
@ -1112,6 +1145,11 @@ void dwn_run(void)
panel_update_clock(); panel_update_clock();
panel_update_system_stats(); panel_update_system_stats();
systray_update(); systray_update();
if (dwn->sysmon != NULL) {
sysmon_update(dwn->sysmon);
}
last_clock_update = now; last_clock_update = now;
} }

View File

@ -717,6 +717,36 @@ void panel_handle_click(Panel *panel, int x, int y, int button)
return; return;
} }
} else if (panel->position == PANEL_BOTTOM) { } else if (panel->position == PANEL_BOTTOM) {
int clock_width = panel_text_width(clock_buffer, strlen(clock_buffer));
int stats_width = panel_calculate_stats_width();
int stats_x = panel->width - clock_width - stats_width - PANEL_PADDING - WIDGET_SPACING;
int stats_end_x = stats_x + stats_width;
if (x >= stats_x && x <= stats_end_x && button == 1) {
extern SystemMonitor *sysmon_get_instance(void);
SystemMonitor *mon = sysmon_get_instance();
if (mon != NULL) {
extern void sysmon_toggle(SystemMonitor *mon);
sysmon_toggle(mon);
}
return;
}
int date_width = panel_text_width(date_buffer, strlen(date_buffer));
int top_proc_x = PANEL_PADDING + date_width + WIDGET_SPACING;
int top_proc_width = TOP_PROCESS_WIDGET_WIDTH;
int top_proc_end_x = top_proc_x + top_proc_width;
if (x >= top_proc_x && x <= top_proc_end_x && button == 1) {
extern SystemMonitor *sysmon_get_instance(void);
SystemMonitor *mon = sysmon_get_instance();
if (mon != NULL) {
extern void sysmon_toggle(SystemMonitor *mon);
sysmon_toggle(mon);
}
return;
}
if (button == 1) { if (button == 1) {
news_handle_click(x, y); news_handle_click(x, y);
} }