/* * DWN - Desktop Window Manager * retoor * System tray widgets (WiFi, Audio, etc.) and XEmbed protocol */ #ifndef DWN_SYSTRAY_H #define DWN_SYSTRAY_H #include "dwn.h" #include #define MAX_WIFI_NETWORKS 20 #define MAX_TRAY_ICONS 32 #define TRAY_ICON_SIZE 22 #define TRAY_ICON_SPACING 4 #define SYSTEM_TRAY_REQUEST_DOCK 0 #define SYSTEM_TRAY_BEGIN_MESSAGE 1 #define SYSTEM_TRAY_CANCEL_MESSAGE 2 #define XEMBED_EMBEDDED_NOTIFY 0 #define XEMBED_WINDOW_ACTIVATE 1 #define XEMBED_WINDOW_DEACTIVATE 2 #define XEMBED_REQUEST_FOCUS 3 #define XEMBED_FOCUS_IN 4 #define XEMBED_FOCUS_OUT 5 #define XEMBED_MAPPED (1 << 0) #define XEMBED_PROTOCOL_VERSION 0 typedef struct { Window window; int x; int width; int height; bool mapped; } TrayIcon; extern TrayIcon tray_icons[MAX_TRAY_ICONS]; extern int tray_icon_count; extern Window tray_selection_owner; typedef struct { char ssid[64]; int signal; char security[32]; bool connected; } WifiNetwork; typedef struct { bool enabled; bool connected; char current_ssid[64]; int signal_strength; WifiNetwork networks[MAX_WIFI_NETWORKS]; int network_count; long last_scan; } WifiState; typedef struct { int volume; bool muted; } AudioState; typedef struct { bool present; bool charging; int percentage; int time_remaining; } BatteryState; typedef struct { Window window; int x, y; int width, height; bool visible; bool dragging; } VolumeSlider; typedef struct { Window window; int x, y; int width, height; int item_count; int hovered_item; bool visible; void (*on_select)(int index); } DropdownMenu; extern WifiState wifi_state; extern AudioState audio_state; extern BatteryState battery_state; extern DropdownMenu *wifi_menu; extern VolumeSlider *volume_slider; void systray_init(void); void systray_cleanup(void); void wifi_update_state(void); void wifi_scan_networks(void); void wifi_connect(const char *ssid); void wifi_disconnect(void); const char *wifi_get_icon(void); void audio_update_state(void); void audio_set_volume(int volume); void audio_toggle_mute(void); const char *audio_get_icon(void); void battery_update_state(void); const char *battery_get_icon(void); VolumeSlider *volume_slider_create(int x, int y); void volume_slider_destroy(VolumeSlider *slider); void volume_slider_show(VolumeSlider *slider); void volume_slider_hide(VolumeSlider *slider); void volume_slider_render(VolumeSlider *slider); void volume_slider_handle_click(VolumeSlider *slider, int x, int y); void volume_slider_handle_motion(VolumeSlider *slider, int x, int y); void volume_slider_handle_release(VolumeSlider *slider); DropdownMenu *dropdown_create(int x, int y, int width); void dropdown_destroy(DropdownMenu *menu); void dropdown_show(DropdownMenu *menu); void dropdown_hide(DropdownMenu *menu); void dropdown_add_item(DropdownMenu *menu, const char *label); void dropdown_render(DropdownMenu *menu); int dropdown_hit_test(DropdownMenu *menu, int x, int y); void dropdown_handle_click(DropdownMenu *menu, int x, int y); void dropdown_handle_motion(DropdownMenu *menu, int x, int y); void systray_render(Panel *panel, int x, int *width); int systray_get_width(void); void systray_handle_click(int x, int y, int button); int systray_hit_test(int x); void systray_update(void); void systray_lock(void); void systray_unlock(void); BatteryState systray_get_battery_snapshot(void); AudioState systray_get_audio_snapshot(void); void xembed_init(void); void xembed_cleanup(void); bool xembed_dock_icon(Window icon_win); void xembed_remove_icon(Window icon_win); TrayIcon *xembed_find_icon(Window icon_win); void xembed_send_message(Window icon, long message, long detail, long data1, long data2); int xembed_get_icons_width(void); void xembed_render_icons(Panel *panel, int x); void xembed_handle_click(int x, int y, int button); int xembed_hit_test(int x); void xembed_update_icon_state(Window icon_win); #endif