/* * DWN - Desktop Window Manager * Backend Abstraction Interface */ #ifndef BACKEND_INTERFACE_H #define BACKEND_INTERFACE_H #include "core/wm_types.h" #ifdef __cplusplus extern "C" { #endif /*============================================================================== * Backend Capabilities *============================================================================*/ typedef enum { WM_BACKEND_CAP_WINDOWS = (1 << 0), WM_BACKEND_CAP_COMPOSITING = (1 << 1), WM_BACKEND_CAP_TRANSPARENCY = (1 << 2), WM_BACKEND_CAP_ANIMATIONS = (1 << 3), WM_BACKEND_CAP_MULTI_MONITOR = (1 << 4), WM_BACKEND_CAP_INPUT_EVENTS = (1 << 5), WM_BACKEND_CAP_CLIPBOARD = (1 << 6), WM_BACKEND_CAP_DRAG_DROP = (1 << 7), WM_BACKEND_CAP_TOUCH = (1 << 8), WM_BACKEND_CAP_GESTURES = (1 << 9) } WmBackendCapabilities; /*============================================================================== * Backend Information *============================================================================*/ typedef struct { const char *name; const char *version; const char *description; uint32_t capabilities; bool supports_multiple_instances; bool requires_compositor; } WmBackendInfo; /*============================================================================== * Backend Event Types *============================================================================*/ typedef enum { WM_BACKEND_EVENT_NONE, WM_BACKEND_EVENT_EXPOSE, WM_BACKEND_EVENT_CONFIGURE, WM_BACKEND_EVENT_MAP, WM_BACKEND_EVENT_UNMAP, WM_BACKEND_EVENT_DESTROY, WM_BACKEND_EVENT_FOCUS_IN, WM_BACKEND_EVENT_FOCUS_OUT, WM_BACKEND_EVENT_KEY_PRESS, WM_BACKEND_EVENT_KEY_RELEASE, WM_BACKEND_EVENT_BUTTON_PRESS, WM_BACKEND_EVENT_BUTTON_RELEASE, WM_BACKEND_EVENT_MOTION, WM_BACKEND_EVENT_ENTER, WM_BACKEND_EVENT_LEAVE, WM_BACKEND_EVENT_PROPERTY, WM_BACKEND_EVENT_CLIENT_MESSAGE, WM_BACKEND_EVENT_SELECTION, } WmBackendEventType; typedef struct { WmBackendEventType type; WmWindowHandle window; WmTime timestamp; union { struct { int x, y, width, height; } configure; struct { int x, y; } point; struct { unsigned int keycode; unsigned int state; } key; struct { unsigned int button; int x, y; unsigned int state; } button; struct { const char *name; const void *data; size_t size; } property; } data; } WmBackendEvent; /*============================================================================== * Backend Interface Definition *============================================================================*/ typedef struct BackendInterface { /* Identification */ const char *name; WmBackendInfo (*get_info)(void); /* Lifecycle */ bool (*init)(void *config); void (*shutdown)(void); bool (*is_initialized)(void); /* Connection */ bool (*connect)(void); void (*disconnect)(void); bool (*is_connected)(void); int (*get_file_descriptor)(void); void (*flush)(void); void (*sync)(void); /* Screen/Display */ void (*get_screen_dimensions)(int *width, int *height); int (*get_screen_count)(void); void (*get_screen_geometry)(int screen, WmRect *geometry); /* Monitor Management */ int (*get_monitor_count)(void); void (*get_monitor_geometry)(int monitor, WmRect *geometry); bool (*get_monitor_primary)(int monitor); const char* (*get_monitor_name)(int monitor); /* Work Area */ void (*get_work_area)(int monitor, WmRect *area); void (*set_work_area)(int monitor, const WmRect *area); /* Window Management - Lifecycle */ WmWindowHandle (*window_create)(const WmRect *geometry, uint32_t flags); void (*window_destroy)(WmWindowHandle window); WmWindowHandle (*window_create_frame)(WmWindowHandle parent, const WmRect *geometry); /* Window Management - Geometry */ void (*window_get_geometry)(WmWindowHandle window, WmRect *geometry); void (*window_set_geometry)(WmWindowHandle window, const WmRect *geometry); void (*window_move)(WmWindowHandle window, int x, int y); void (*window_resize)(WmWindowHandle window, int width, int height); void (*window_move_resize)(WmWindowHandle window, const WmRect *geometry); /* Window Management - Visibility */ void (*window_show)(WmWindowHandle window); void (*window_hide)(WmWindowHandle window); bool (*window_is_visible)(WmWindowHandle window); void (*window_map)(WmWindowHandle window); void (*window_unmap)(WmWindowHandle window); bool (*window_is_mapped)(WmWindowHandle window); /* Window Management - Stacking */ void (*window_raise)(WmWindowHandle window); void (*window_lower)(WmWindowHandle window); void (*window_raise_above)(WmWindowHandle window, WmWindowHandle above); void (*window_lower_below)(WmWindowHandle window, WmWindowHandle below); void (*window_set_stack_position)(WmWindowHandle window, int position); int (*window_get_stack_position)(WmWindowHandle window); /* Window Management - Reparenting */ void (*window_reparent)(WmWindowHandle window, WmWindowHandle parent, int x, int y); WmWindowHandle (*window_get_parent)(WmWindowHandle window); /* Window Management - Focus */ void (*window_focus)(WmWindowHandle window); void (*window_unfocus)(WmWindowHandle window); bool (*window_is_focused)(WmWindowHandle window); WmWindowHandle (*window_get_focused)(void); /* Window Management - Decoration */ void (*window_set_decorated)(WmWindowHandle window, bool decorated); bool (*window_is_decorated)(WmWindowHandle window); void (*window_set_border_width)(WmWindowHandle window, int width); int (*window_get_border_width)(WmWindowHandle window); void (*window_set_border_color)(WmWindowHandle window, WmColor color); /* Window Management - Properties */ void (*window_set_title)(WmWindowHandle window, const char *title); char* (*window_get_title)(WmWindowHandle window); void (*window_set_class)(WmWindowHandle window, const char *class, const char *instance); void (*window_get_class)(WmWindowHandle window, char **class, char **instance); void (*window_set_icon_name)(WmWindowHandle window, const char *name); /* Window Management - Protocols */ bool (*window_supports_protocol)(WmWindowHandle window, const char *protocol); void (*window_send_protocol)(WmWindowHandle window, const char *protocol, WmTime timestamp); void (*window_close)(WmWindowHandle window); void (*window_kill)(WmWindowHandle window); /* Window Management - State */ void (*window_set_fullscreen)(WmWindowHandle window, bool fullscreen); bool (*window_is_fullscreen)(WmWindowHandle window); void (*window_set_maximized)(WmWindowHandle window, bool maximized); bool (*window_is_maximized)(WmWindowHandle window); void (*window_set_minimized)(WmWindowHandle window, bool minimized); bool (*window_is_minimized)(WmWindowHandle window); void (*window_set_modal)(WmWindowHandle window, bool modal); void (*window_set_sticky)(WmWindowHandle window, bool sticky); void (*window_set_shaded)(WmWindowHandle window, bool shaded); void (*window_set_skip_taskbar)(WmWindowHandle window, bool skip); void (*window_set_skip_pager)(WmWindowHandle window, bool skip); void (*window_set_urgent)(WmWindowHandle window, bool urgent); bool (*window_is_urgent)(WmWindowHandle window); /* Window Management - Type */ void (*window_set_type)(WmWindowHandle window, WmWindowType type); WmWindowType (*window_get_type)(WmWindowHandle window); /* Window Management - Selection */ void (*window_set_selection_owner)(WmWindowHandle window, const char *selection, WmTime time); WmWindowHandle (*window_get_selection_owner)(const char *selection); void (*window_convert_selection)(WmWindowHandle requestor, const char *selection, const char *target, WmTime time); /* Window Management - Client List */ WmContainer* (*window_get_stacking_list)(void); WmContainer* (*window_get_client_list)(void); /* Input - Events */ bool (*poll_event)(WmBackendEvent *event); void (*wait_event)(WmBackendEvent *event); bool (*check_mask_event)(uint32_t mask, WmBackendEvent *event); void (*put_back_event)(const WmBackendEvent *event); /* Input - Key Grabbing */ void (*grab_key)(int keycode, uint32_t modifiers, WmWindowHandle window, bool owner_events, uint32_t pointer_mode, uint32_t keyboard_mode); void (*ungrab_key)(int keycode, uint32_t modifiers, WmWindowHandle window); void (*grab_keyboard)(WmWindowHandle window, bool owner_events, uint32_t pointer_mode, uint32_t keyboard_mode, WmTime time); void (*ungrab_keyboard)(WmTime time); /* Input - Button Grabbing */ void (*grab_button)(int button, uint32_t modifiers, WmWindowHandle window, bool owner_events, uint32_t event_mask, uint32_t pointer_mode, uint32_t keyboard_mode, WmWindowHandle confine_to, uint32_t cursor); void (*ungrab_button)(int button, uint32_t modifiers, WmWindowHandle window); void (*grab_pointer)(WmWindowHandle window, bool owner_events, uint32_t event_mask, uint32_t pointer_mode, uint32_t keyboard_mode, WmWindowHandle confine_to, uint32_t cursor, WmTime time); void (*ungrab_pointer)(WmTime time); /* Input - Pointer */ void (*query_pointer)(WmWindowHandle window, int *root_x, int *root_y, int *win_x, int *win_y, uint32_t *mask); void (*warp_pointer)(WmWindowHandle dest_w, int dest_x, int dest_y); void (*set_cursor)(WmWindowHandle window, uint32_t cursor); /* Rendering - Basic */ void (*fill_rectangle)(WmWindowHandle window, const WmRect *rect, WmColor color); void (*draw_rectangle)(WmWindowHandle window, const WmRect *rect, WmColor color, int line_width); void (*draw_line)(WmWindowHandle window, int x1, int y1, int x2, int y2, WmColor color, int line_width); void (*clear_window)(WmWindowHandle window); void (*copy_area)(WmWindowHandle src, WmWindowHandle dst, int src_x, int src_y, int width, int height, int dst_x, int dst_y); /* Rendering - Text (if supported) */ void* (*font_load)(const char *name, int size); void (*font_destroy)(void *font); int (*font_text_width)(void *font, const char *text, int len); void (*draw_text)(WmWindowHandle window, void *font, int x, int y, const char *text, int len, WmColor color); /* Rendering - Images (if supported) */ void* (*image_load)(const uint8_t *data, size_t size); void (*image_destroy)(void *image); void (*image_get_size)(void *image, int *width, int *height); void (*draw_image)(WmWindowHandle window, void *image, int x, int y, int width, int height); /* Rendering - Sync */ void (*begin_paint)(WmWindowHandle window); void (*end_paint)(WmWindowHandle window); /* Atoms/Properties */ uint32_t (*atom_get)(const char *name); const char* (*atom_get_name)(uint32_t atom); void (*property_set)(WmWindowHandle window, uint32_t property, uint32_t type, int format, const void *data, int num_items); int (*property_get)(WmWindowHandle window, uint32_t property, uint32_t type, void **data, int *num_items); void (*property_delete)(WmWindowHandle window, uint32_t property); /* Session Management */ void (*set_selection_owner)(WmWindowHandle owner, const char *selection); void (*send_client_message)(WmWindowHandle window, const char *message_type, const void *data, int format); /* Error Handling */ int (*get_last_error)(void); void (*set_error_handler)(int (*handler)(void *display, void *event)); void (*set_io_error_handler)(int (*handler)(void *display)); } BackendInterface; /*============================================================================== * Backend Registration *============================================================================*/ typedef const BackendInterface* (*BackendEntryFunc)(void); void wm_backend_register(const char *name, BackendEntryFunc entry); const BackendInterface* wm_backend_get(const char *name); WmContainer* wm_backend_get_available(void); /*============================================================================== * Backend Helpers *============================================================================*/ static inline bool wm_backend_has_capability(const BackendInterface *backend, WmBackendCapabilities cap) { WmBackendInfo info = backend->get_info(); return (info.capabilities & cap) != 0; } #ifdef __cplusplus } #endif #endif /* BACKEND_INTERFACE_H */