366 lines
10 KiB
C
366 lines
10 KiB
C
|
|
/*
|
||
|
|
* DWN - Desktop Window Manager
|
||
|
|
* Layout Plugin Interface
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef LAYOUT_PLUGIN_H
|
||
|
|
#define LAYOUT_PLUGIN_H
|
||
|
|
|
||
|
|
#include "core/wm_types.h"
|
||
|
|
#include "core/wm_client.h"
|
||
|
|
|
||
|
|
#ifdef __cplusplus
|
||
|
|
extern "C" {
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Plugin API Version
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
#define WM_LAYOUT_PLUGIN_API_VERSION 1
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Forward Declarations
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
typedef struct LayoutPlugin LayoutPlugin;
|
||
|
|
typedef struct LayoutContext LayoutContext;
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Geometry
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout geometry for a single client.
|
||
|
|
*/
|
||
|
|
typedef struct {
|
||
|
|
int x, y;
|
||
|
|
int width, height;
|
||
|
|
bool floating; /* If true, layout doesn't manage this client */
|
||
|
|
bool fullscreen; /* If true, client should be fullscreen */
|
||
|
|
bool hidden; /* If true, client should be hidden */
|
||
|
|
} WmLayoutGeometry;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Work area for layout calculations.
|
||
|
|
*/
|
||
|
|
typedef struct {
|
||
|
|
int x, y;
|
||
|
|
int width, height;
|
||
|
|
int padding_top;
|
||
|
|
int padding_bottom;
|
||
|
|
int padding_left;
|
||
|
|
int padding_right;
|
||
|
|
int gap;
|
||
|
|
} WmLayoutWorkArea;
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Configuration
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout configuration parameter.
|
||
|
|
*/
|
||
|
|
typedef struct {
|
||
|
|
const char *name;
|
||
|
|
const char *description;
|
||
|
|
union {
|
||
|
|
int int_value;
|
||
|
|
float float_value;
|
||
|
|
bool bool_value;
|
||
|
|
const char *string_value;
|
||
|
|
} default_value;
|
||
|
|
enum {
|
||
|
|
WM_LAYOUT_PARAM_INT,
|
||
|
|
WM_LAYOUT_PARAM_FLOAT,
|
||
|
|
WM_LAYOUT_PARAM_BOOL,
|
||
|
|
WM_LAYOUT_PARAM_STRING,
|
||
|
|
WM_LAYOUT_PARAM_CHOICE
|
||
|
|
} type;
|
||
|
|
/* For PARAM_CHOICE */
|
||
|
|
const char **choices;
|
||
|
|
int num_choices;
|
||
|
|
} WmLayoutParameter;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout configuration instance.
|
||
|
|
*/
|
||
|
|
typedef struct {
|
||
|
|
WmLayoutParameter *parameters;
|
||
|
|
int num_parameters;
|
||
|
|
void *user_data; /* Plugin can store parsed config here */
|
||
|
|
} WmLayoutConfig;
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout State
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Opaque layout state per workspace.
|
||
|
|
* Layout plugins can store workspace-specific state here.
|
||
|
|
*/
|
||
|
|
typedef struct WmLayoutState WmLayoutState;
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Context
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Context passed to layout operations.
|
||
|
|
*/
|
||
|
|
struct LayoutContext {
|
||
|
|
/* Workspace info */
|
||
|
|
WmWorkspaceId workspace;
|
||
|
|
WmLayoutWorkArea work_area;
|
||
|
|
|
||
|
|
/* Client counts */
|
||
|
|
int client_count;
|
||
|
|
int master_count;
|
||
|
|
int stack_count;
|
||
|
|
|
||
|
|
/* Layout parameters */
|
||
|
|
float master_ratio;
|
||
|
|
int master_count_target;
|
||
|
|
int gap;
|
||
|
|
|
||
|
|
/* Configuration */
|
||
|
|
WmLayoutConfig *config;
|
||
|
|
|
||
|
|
/* Layout state (managed by plugin) */
|
||
|
|
WmLayoutState *state;
|
||
|
|
|
||
|
|
/* User data (for plugin use) */
|
||
|
|
void *user_data;
|
||
|
|
};
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Plugin Interface
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout plugin interface vtable.
|
||
|
|
* All layouts must implement these functions.
|
||
|
|
*/
|
||
|
|
typedef struct {
|
||
|
|
/* Version check */
|
||
|
|
int api_version;
|
||
|
|
|
||
|
|
/* Metadata */
|
||
|
|
const char *name;
|
||
|
|
const char *description;
|
||
|
|
const char *author;
|
||
|
|
const char *version;
|
||
|
|
|
||
|
|
/* Configuration */
|
||
|
|
WmLayoutParameter *parameters;
|
||
|
|
int num_parameters;
|
||
|
|
|
||
|
|
/* Lifecycle */
|
||
|
|
bool (*init)(LayoutPlugin *plugin);
|
||
|
|
void (*shutdown)(LayoutPlugin *plugin);
|
||
|
|
|
||
|
|
/* State management */
|
||
|
|
WmLayoutState* (*state_create)(LayoutPlugin *plugin, WmWorkspaceId workspace);
|
||
|
|
void (*state_destroy)(LayoutPlugin *plugin, WmLayoutState *state);
|
||
|
|
void (*state_reset)(LayoutPlugin *plugin, WmLayoutState *state);
|
||
|
|
|
||
|
|
/* Configuration */
|
||
|
|
bool (*config_parse)(LayoutPlugin *plugin, WmLayoutConfig *config,
|
||
|
|
const char *key, const char *value);
|
||
|
|
void (*config_apply)(LayoutPlugin *plugin, WmLayoutConfig *config);
|
||
|
|
|
||
|
|
/* Layout calculation */
|
||
|
|
bool (*arrange)(LayoutPlugin *plugin, LayoutContext *ctx,
|
||
|
|
AbstractClient **clients, int num_clients,
|
||
|
|
WmLayoutGeometry *geometries);
|
||
|
|
|
||
|
|
/* Client operations */
|
||
|
|
void (*client_added)(LayoutPlugin *plugin, LayoutContext *ctx,
|
||
|
|
AbstractClient *client);
|
||
|
|
void (*client_removed)(LayoutPlugin *plugin, LayoutContext *ctx,
|
||
|
|
AbstractClient *client);
|
||
|
|
void (*client_floating_changed)(LayoutPlugin *plugin, LayoutContext *ctx,
|
||
|
|
AbstractClient *client, bool floating);
|
||
|
|
|
||
|
|
/* Layout manipulation */
|
||
|
|
void (*inc_master)(LayoutPlugin *plugin, LayoutContext *ctx, int delta);
|
||
|
|
void (*set_master_ratio)(LayoutPlugin *plugin, LayoutContext *ctx, float ratio);
|
||
|
|
void (*set_master_count)(LayoutPlugin *plugin, LayoutContext *ctx, int count);
|
||
|
|
void (*swap_master)(LayoutPlugin *plugin, LayoutContext *ctx);
|
||
|
|
void (*rotate)(LayoutPlugin *plugin, LayoutContext *ctx, bool clockwise);
|
||
|
|
|
||
|
|
/* Mouse resizing support */
|
||
|
|
void (*resize_master)(LayoutPlugin *plugin, LayoutContext *ctx,
|
||
|
|
int x, int y, int *new_master_count, float *new_ratio);
|
||
|
|
|
||
|
|
} LayoutPluginInterface;
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Plugin Structure
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout plugin instance.
|
||
|
|
*/
|
||
|
|
struct LayoutPlugin {
|
||
|
|
/* Interface vtable */
|
||
|
|
const LayoutPluginInterface *interface;
|
||
|
|
|
||
|
|
/* Plugin handle (for dynamic loading) */
|
||
|
|
void *handle;
|
||
|
|
|
||
|
|
/* Plugin path */
|
||
|
|
char *path;
|
||
|
|
|
||
|
|
/* Enabled state */
|
||
|
|
bool enabled;
|
||
|
|
|
||
|
|
/* Global configuration */
|
||
|
|
WmLayoutConfig config;
|
||
|
|
|
||
|
|
/* Per-workspace states */
|
||
|
|
WmLayoutState **workspace_states;
|
||
|
|
int num_workspaces;
|
||
|
|
|
||
|
|
/* Plugin-private data */
|
||
|
|
void *user_data;
|
||
|
|
};
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Manager
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout manager handles all loaded layouts.
|
||
|
|
*/
|
||
|
|
typedef struct LayoutManager LayoutManager;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the global layout manager.
|
||
|
|
*/
|
||
|
|
LayoutManager* wm_layout_manager_get(void);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Initialize the layout manager.
|
||
|
|
*/
|
||
|
|
bool wm_layout_manager_init(void);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Shutdown the layout manager.
|
||
|
|
*/
|
||
|
|
void wm_layout_manager_shutdown(void);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Register a layout plugin.
|
||
|
|
*/
|
||
|
|
bool wm_layout_manager_register(LayoutManager *mgr, LayoutPlugin *plugin);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Unregister a layout plugin.
|
||
|
|
*/
|
||
|
|
void wm_layout_manager_unregister(LayoutManager *mgr, LayoutPlugin *plugin);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Load a layout plugin from a file.
|
||
|
|
*/
|
||
|
|
LayoutPlugin* wm_layout_manager_load(LayoutManager *mgr, const char *path);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Unload a layout plugin.
|
||
|
|
*/
|
||
|
|
void wm_layout_manager_unload(LayoutManager *mgr, LayoutPlugin *plugin);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get a loaded layout by name.
|
||
|
|
*/
|
||
|
|
LayoutPlugin* wm_layout_manager_get_layout(LayoutManager *mgr, const char *name);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the default layout.
|
||
|
|
*/
|
||
|
|
LayoutPlugin* wm_layout_manager_get_default(LayoutManager *mgr);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Set the default layout.
|
||
|
|
*/
|
||
|
|
void wm_layout_manager_set_default(LayoutManager *mgr, LayoutPlugin *plugin);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get list of available layouts.
|
||
|
|
*/
|
||
|
|
const char** wm_layout_manager_list(LayoutManager *mgr, int *count);
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Layout Operations
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Apply a layout to a workspace.
|
||
|
|
*/
|
||
|
|
bool wm_layout_arrange(LayoutPlugin *plugin, WmWorkspaceId workspace);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Apply layout to specific clients.
|
||
|
|
*/
|
||
|
|
bool wm_layout_arrange_clients(LayoutPlugin *plugin, LayoutContext *ctx,
|
||
|
|
AbstractClient **clients, int num_clients);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Create a layout context for a workspace.
|
||
|
|
*/
|
||
|
|
bool wm_layout_context_init(LayoutContext *ctx, WmWorkspaceId workspace);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Clean up a layout context.
|
||
|
|
*/
|
||
|
|
void wm_layout_context_cleanup(LayoutContext *ctx);
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Built-in Layouts
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/* Tiling layout */
|
||
|
|
extern const LayoutPluginInterface wm_layout_tiling;
|
||
|
|
|
||
|
|
/* Floating layout */
|
||
|
|
extern const LayoutPluginInterface wm_layout_floating;
|
||
|
|
|
||
|
|
/* Monocle (maximized) layout */
|
||
|
|
extern const LayoutPluginInterface wm_layout_monocle;
|
||
|
|
|
||
|
|
/* Grid layout */
|
||
|
|
extern const LayoutPluginInterface wm_layout_grid;
|
||
|
|
|
||
|
|
/* Spiral layout */
|
||
|
|
extern const LayoutPluginInterface wm_layout_spiral;
|
||
|
|
|
||
|
|
/* Dwindle layout */
|
||
|
|
extern const LayoutPluginInterface wm_layout_dwindle;
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Plugin Entry Point
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Layout plugins must export this function.
|
||
|
|
*/
|
||
|
|
typedef const LayoutPluginInterface* (*LayoutPluginEntryFunc)(void);
|
||
|
|
|
||
|
|
#define WM_LAYOUT_PLUGIN_ENTRY "wm_layout_plugin_entry"
|
||
|
|
|
||
|
|
/*==============================================================================
|
||
|
|
* Helper Macros
|
||
|
|
*============================================================================*/
|
||
|
|
|
||
|
|
#define WM_LAYOUT_REGISTER(name, iface) \
|
||
|
|
__attribute__((unused)) static const LayoutPluginInterface* wm_layout_plugin_entry(void) { return &(iface); }
|
||
|
|
|
||
|
|
/* Typedef for built-in layout getters */
|
||
|
|
typedef const LayoutPluginInterface* (*WmLayoutBuiltinFunc)(void);
|
||
|
|
|
||
|
|
#ifdef __cplusplus
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#endif /* LAYOUT_PLUGIN_H */
|