/* * DWN - Desktop Window Manager * Event Bus System */ #ifndef WM_EVENT_H #define WM_EVENT_H #include "wm_types.h" #include "wm_client.h" #include "wm_string.h" #ifdef __cplusplus extern "C" { #endif /*============================================================================== * Event Data Structures *============================================================================*/ typedef struct { WmEventType type; WmTime timestamp; WmId source_id; } WmEventHeader; /* Window Events */ typedef struct { WmEventHeader header; AbstractClient *client; } WmEventWindowBase; typedef struct { WmEventHeader header; AbstractClient *client; } WmEventWindowCreated; typedef struct { WmEventHeader header; AbstractClient *client; WmString *old_title; WmString *new_title; } WmEventWindowTitleChanged; typedef struct { WmEventHeader header; AbstractClient *client; WmRect old_geometry; WmRect new_geometry; } WmEventWindowMoved; typedef struct { WmEventHeader header; AbstractClient *client; WmRect old_geometry; WmRect new_geometry; } WmEventWindowResized; typedef struct { WmEventHeader header; AbstractClient *client; WmClientFlags old_flags; WmClientFlags new_flags; } WmEventWindowStateChanged; /* Workspace Events */ typedef struct { WmEventHeader header; WmWorkspaceId workspace; } WmEventWorkspaceBase; typedef struct { WmEventHeader header; WmWorkspaceId old_workspace; WmWorkspaceId new_workspace; } WmEventWorkspaceSwitched; typedef struct { WmEventHeader header; WmWorkspaceId workspace; WmLayoutType old_layout; WmLayoutType new_layout; } WmEventWorkspaceLayoutChanged; typedef struct { WmEventHeader header; WmWorkspaceId workspace; AbstractClient *client; } WmEventClientWorkspaceChanged; /* Input Events */ typedef struct { WmEventHeader header; unsigned int keycode; unsigned int keysym; unsigned int modifiers; const char *key_name; } WmEventKey; typedef struct { WmEventHeader header; unsigned int button; int x; int y; unsigned int modifiers; } WmEventButton; typedef struct { WmEventHeader header; int x; int y; int delta_x; int delta_y; unsigned int modifiers; } WmEventMotion; typedef struct { WmEventHeader header; int delta; int x; int y; } WmEventScroll; /* Monitor Events */ typedef struct { WmEventHeader header; int monitor_index; WmRect geometry; bool primary; } WmEventMonitorAdded; typedef struct { WmEventHeader header; int monitor_index; } WmEventMonitorRemoved; /* Configuration Events */ typedef struct { WmEventHeader header; WmString *config_path; bool success; WmString *error_message; } WmEventConfigReloaded; /* Command Events */ typedef struct { WmEventHeader header; WmCommandType command; bool success; WmString *error_message; } WmEventCommandExecuted; /* Custom Event */ typedef struct { WmEventHeader header; WmString *event_name; void *custom_data; WmDestroyFunc destroy_func; } WmEventCustom; /*============================================================================== * Event Bus Lifecycle *============================================================================*/ WmEventBus* wm_event_bus_create(void); void wm_event_bus_destroy(WmEventBus *bus); WmEventBus* wm_event_bus_get_default(void); void wm_event_bus_set_default(WmEventBus *bus); /*============================================================================== * Event Subscription *============================================================================*/ WmEventSubscription* wm_event_subscribe(WmEventBus *bus, WmEventType type, WmEventHandler handler, void *user_data); WmEventSubscription* wm_event_subscribe_pattern(WmEventBus *bus, WmEventType type_min, WmEventType type_max, WmEventHandler handler, void *user_data); WmEventSubscription* wm_event_subscribe_all(WmEventBus *bus, WmEventHandler handler, void *user_data); void wm_event_unsubscribe(WmEventBus *bus, WmEventSubscription *subscription); void wm_event_unsubscribe_all(WmEventBus *bus, void *user_data); /*============================================================================== * Event Emission *============================================================================*/ void wm_event_emit(WmEventBus *bus, WmEventType type, const void *event_data); void wm_event_emit_async(WmEventBus *bus, WmEventType type, const void *event_data); /* Convenience emitters */ void wm_event_emit_window_created(WmEventBus *bus, AbstractClient *client); void wm_event_emit_window_destroyed(WmEventBus *bus, AbstractClient *client); void wm_event_emit_window_focused(WmEventBus *bus, AbstractClient *client, AbstractClient *prev_focus); void wm_event_emit_window_moved(WmEventBus *bus, AbstractClient *client, const WmRect *old_geom); void wm_event_emit_window_resized(WmEventBus *bus, AbstractClient *client, const WmRect *old_geom); void wm_event_emit_window_state_changed(WmEventBus *bus, AbstractClient *client, WmClientFlags old_flags, WmClientFlags new_flags); void wm_event_emit_workspace_switched(WmEventBus *bus, WmWorkspaceId old_ws, WmWorkspaceId new_ws); void wm_event_emit_workspace_layout_changed(WmEventBus *bus, WmWorkspaceId ws, WmLayoutType old_layout, WmLayoutType new_layout); /*============================================================================== * Event Processing *============================================================================*/ void wm_event_process(WmEventBus *bus); void wm_event_process_all(WmEventBus *bus); bool wm_event_process_one(WmEventBus *bus); void wm_event_dispatch_pending(WmEventBus *bus); int wm_event_get_pending_count(const WmEventBus *bus); /*============================================================================== * Event Data Helpers *============================================================================*/ WmEventHeader* wm_event_get_header(void *event_data); WmTime wm_event_get_timestamp(const void *event_data); const char* wm_event_type_to_string(WmEventType type); WmEventType wm_event_type_from_string(const char *str); /*============================================================================== * Event Blocking/Filtering *============================================================================*/ void wm_event_begin_block(WmEventBus *bus, WmEventType type); void wm_event_end_block(WmEventBus *bus, WmEventType type); bool wm_event_is_blocked(const WmEventBus *bus, WmEventType type); void wm_event_suppress(WmEventBus *bus, WmEventType type); void wm_event_unsuppress(WmEventBus *bus, WmEventType type); bool wm_event_is_suppressed(const WmEventBus *bus, WmEventType type); /*============================================================================== * Custom Events *============================================================================*/ void wm_event_emit_custom(WmEventBus *bus, const char *event_name, void *data, WmDestroyFunc destroy_fn); WmEventSubscription* wm_event_subscribe_custom(WmEventBus *bus, const char *event_name, WmEventHandler handler, void *user_data); /*============================================================================== * Event Statistics *============================================================================*/ uint64_t wm_event_get_emit_count(const WmEventBus *bus, WmEventType type); uint64_t wm_event_get_total_emit_count(const WmEventBus *bus); void wm_event_reset_statistics(WmEventBus *bus); #ifdef __cplusplus } #endif #endif /* WM_EVENT_H */