feat: add system monitor feature with panel toggle and event handling
This commit is contained in:
parent
df34716ea5
commit
aee7030b30
BIN
build/ai.o
BIN
build/ai.o
Binary file not shown.
Binary file not shown.
BIN
build/client.o
BIN
build/client.o
Binary file not shown.
BIN
build/config.o
BIN
build/config.o
Binary file not shown.
Binary file not shown.
BIN
build/demo.o
BIN
build/demo.o
Binary file not shown.
BIN
build/keys.o
BIN
build/keys.o
Binary file not shown.
BIN
build/layout.o
BIN
build/layout.o
Binary file not shown.
@ -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 \
|
||||
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/ocr.h include/util.h
|
||||
include/ocr.h include/sysmon.h include/util.h
|
||||
include/dwn.h:
|
||||
include/config.h:
|
||||
include/dwn.h:
|
||||
@ -61,4 +61,5 @@ include/api.h:
|
||||
include/demo.h:
|
||||
include/screenshot.h:
|
||||
include/ocr.h:
|
||||
include/sysmon.h:
|
||||
include/util.h:
|
||||
|
||||
BIN
build/main.o
BIN
build/main.o
Binary file not shown.
BIN
build/news.o
BIN
build/news.o
Binary file not shown.
Binary file not shown.
BIN
build/panel.o
BIN
build/panel.o
Binary file not shown.
BIN
build/systray.o
BIN
build/systray.o
Binary file not shown.
BIN
build/util.o
BIN
build/util.o
Binary file not shown.
Binary file not shown.
@ -107,6 +107,7 @@ typedef struct Workspace Workspace;
|
||||
typedef struct Monitor Monitor;
|
||||
typedef struct Panel Panel;
|
||||
typedef struct Config Config;
|
||||
typedef struct SystemMonitor SystemMonitor;
|
||||
|
||||
struct Client {
|
||||
Window window;
|
||||
@ -176,6 +177,8 @@ typedef struct {
|
||||
Panel *top_panel;
|
||||
Panel *bottom_panel;
|
||||
|
||||
SystemMonitor *sysmon;
|
||||
|
||||
Config *config;
|
||||
|
||||
bool running;
|
||||
|
||||
40
src/main.c
40
src/main.c
@ -24,6 +24,7 @@
|
||||
#include "demo.h"
|
||||
#include "screenshot.h"
|
||||
#include "ocr.h"
|
||||
#include "sysmon.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -343,7 +344,12 @@ static void handle_map_request(XMapRequestEvent *ev)
|
||||
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)
|
||||
@ -458,6 +464,10 @@ static void handle_expose(XExposeEvent *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
if (dwn->sysmon != NULL) {
|
||||
sysmon_render(dwn->sysmon);
|
||||
}
|
||||
|
||||
if (dwn->top_panel != NULL && ev->window == dwn->top_panel->window) {
|
||||
panel_render(dwn->top_panel);
|
||||
return;
|
||||
@ -529,6 +539,10 @@ static void handle_button_press(XButtonEvent *ev)
|
||||
return;
|
||||
}
|
||||
|
||||
if (dwn->sysmon != NULL) {
|
||||
sysmon_handle_event(dwn->sysmon, (XEvent *)ev);
|
||||
}
|
||||
|
||||
if (volume_slider != NULL && volume_slider->visible) {
|
||||
if (ev->window == volume_slider->window) {
|
||||
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) {
|
||||
SystemMonitor *sysmon = sysmon_find_by_window(ev->window);
|
||||
if (sysmon != NULL) {
|
||||
sysmon_handle_event(sysmon, (XEvent *)ev);
|
||||
return;
|
||||
}
|
||||
XAllowEvents(dwn->display, ReplayPointer, ev->time);
|
||||
client_focus(c, true);
|
||||
return;
|
||||
@ -648,6 +667,12 @@ static void handle_motion_notify(XMotionEvent *ev)
|
||||
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) {
|
||||
volume_slider_handle_motion(volume_slider, ev->x, ev->y);
|
||||
return;
|
||||
@ -920,6 +945,8 @@ int dwn_init(void)
|
||||
|
||||
panels_init();
|
||||
|
||||
dwn->sysmon = sysmon_create();
|
||||
|
||||
systray_init();
|
||||
|
||||
xembed_init();
|
||||
@ -992,6 +1019,12 @@ void dwn_cleanup(void)
|
||||
keys_cleanup();
|
||||
xembed_cleanup();
|
||||
systray_cleanup();
|
||||
|
||||
if (dwn->sysmon != NULL) {
|
||||
sysmon_destroy(dwn->sysmon);
|
||||
dwn->sysmon = NULL;
|
||||
}
|
||||
|
||||
panels_cleanup();
|
||||
decorations_cleanup();
|
||||
workspace_cleanup();
|
||||
@ -1112,6 +1145,11 @@ void dwn_run(void)
|
||||
panel_update_clock();
|
||||
panel_update_system_stats();
|
||||
systray_update();
|
||||
|
||||
if (dwn->sysmon != NULL) {
|
||||
sysmon_update(dwn->sysmon);
|
||||
}
|
||||
|
||||
last_clock_update = now;
|
||||
}
|
||||
|
||||
|
||||
30
src/panel.c
30
src/panel.c
@ -717,6 +717,36 @@ void panel_handle_click(Panel *panel, int x, int y, int button)
|
||||
return;
|
||||
}
|
||||
} 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) {
|
||||
news_handle_click(x, y);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user