core: 窗口分层类型与接口草案
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "core/types.h"
|
#include "core/types.h"
|
||||||
#include "core/wm_desc.h"
|
#include "core/window.h"
|
||||||
|
|
||||||
typedef enum event_type_t {
|
typedef enum event_type_t {
|
||||||
ZDWM_EVENT_KEY_PRESS,
|
ZDWM_EVENT_KEY_PRESS,
|
||||||
@@ -63,9 +63,9 @@ typedef struct pointer_enter_event_t {
|
|||||||
} pointer_enter_event_t;
|
} pointer_enter_event_t;
|
||||||
|
|
||||||
typedef struct window_map_request_event_t {
|
typedef struct window_map_request_event_t {
|
||||||
window_info_t info;
|
window_id_t id;
|
||||||
window_id_t transient_for;
|
window_props_t props;
|
||||||
bool is_dialog;
|
window_metadata_t metadata;
|
||||||
} window_map_request_event_t;
|
} window_map_request_event_t;
|
||||||
|
|
||||||
typedef enum window_remove_reason_t {
|
typedef enum window_remove_reason_t {
|
||||||
@@ -88,10 +88,7 @@ typedef enum window_metadata_change_flags_t {
|
|||||||
typedef struct window_metadata_change_event_t {
|
typedef struct window_metadata_change_event_t {
|
||||||
window_id_t window;
|
window_id_t window;
|
||||||
uint32_t changed_fields;
|
uint32_t changed_fields;
|
||||||
const char *title;
|
window_metadata_t metadata;
|
||||||
const char *app_id;
|
|
||||||
const char *class_name;
|
|
||||||
const char *instance_name;
|
|
||||||
} window_metadata_change_event_t;
|
} window_metadata_change_event_t;
|
||||||
|
|
||||||
typedef enum window_hint_changed_flags_t {
|
typedef enum window_hint_changed_flags_t {
|
||||||
|
|||||||
30
src/core/layer.h
Normal file
30
src/core/layer.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "core/types.h"
|
||||||
|
#include "core/window.h"
|
||||||
|
|
||||||
|
/* 层级从低到高 */
|
||||||
|
typedef enum layer_type_t {
|
||||||
|
ZDWM_WINDOW_LAYER_DESKTOP = 0,
|
||||||
|
ZDWM_WINDOW_LAYER_NORMAL,
|
||||||
|
ZDWM_WINDOW_LAYER_TOP,
|
||||||
|
ZDWM_WINDOW_LAYER_OVERLAY,
|
||||||
|
ZDWM_WINDOW_LAYER_COUNT,
|
||||||
|
} layer_type_t;
|
||||||
|
|
||||||
|
typedef struct layer_stack_t {
|
||||||
|
window_id_t *order;
|
||||||
|
size_t count;
|
||||||
|
size_t capacity;
|
||||||
|
} layer_stack_t;
|
||||||
|
|
||||||
|
void layer_stack_init(layer_stack_t *layer);
|
||||||
|
void layer_stack_reset(layer_stack_t *layer);
|
||||||
|
void layer_stack_append(layer_stack_t *layer, window_id_t window);
|
||||||
|
void layer_stack_remove(layer_stack_t *layer, window_id_t window);
|
||||||
|
void layer_stack_raise(layer_stack_t *layer, window_id_t window);
|
||||||
|
void layer_stack_lower(layer_stack_t *layer, window_id_t window);
|
||||||
|
|
||||||
|
layer_type_t layer_classify(const window_props_t *props);
|
||||||
8
src/core/policy.h
Normal file
8
src/core/policy.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/layer.h"
|
||||||
|
#include "core/state.h"
|
||||||
|
#include "core/types.h"
|
||||||
|
|
||||||
|
layer_type_t policy_adjust_window_layer_from_transient(
|
||||||
|
const state_t *state, window_id_t transient_for, layer_type_t base_layer);
|
||||||
@@ -2,14 +2,17 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "core/layer.h"
|
||||||
#include "core/types.h"
|
#include "core/types.h"
|
||||||
#include "core/wm_desc.h"
|
#include "core/wm_desc.h"
|
||||||
|
|
||||||
/* 核心实体定义 */
|
/* 核心实体定义 */
|
||||||
typedef struct window_t {
|
typedef struct window_t {
|
||||||
window_id_t id;
|
window_id_t id;
|
||||||
|
window_id_t transient_for;
|
||||||
workspace_id_t workspace_id;
|
workspace_id_t workspace_id;
|
||||||
|
|
||||||
|
layer_type_t layer;
|
||||||
window_geometry_mode_t geometry_mode;
|
window_geometry_mode_t geometry_mode;
|
||||||
bool floating;
|
bool floating;
|
||||||
bool sticky;
|
bool sticky;
|
||||||
@@ -64,9 +67,11 @@ typedef struct state_t {
|
|||||||
size_t window_count;
|
size_t window_count;
|
||||||
size_t window_capacity;
|
size_t window_capacity;
|
||||||
|
|
||||||
/* 与 windows[] 一一对应的堆叠顺序视图,长度等于 window_count */
|
/* TODO: 过渡期全局 z-order 视图,后续由 layer stack 替代 */
|
||||||
window_id_t *stack_order;
|
window_id_t *stack_order;
|
||||||
|
|
||||||
|
/* TODO: 分层堆叠顺序:每层内部从低到高排列 */
|
||||||
|
layer_stack_t stacks[ZDWM_WINDOW_LAYER_COUNT];
|
||||||
} state_t;
|
} state_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -128,13 +133,13 @@ bool state_output_valid(const state_t *state, output_id_t id);
|
|||||||
/*
|
/*
|
||||||
* state 持有的 window 集合接口
|
* state 持有的 window 集合接口
|
||||||
*
|
*
|
||||||
* 这组接口负责管理 state_t.windows[] 容器本身,并保持
|
* TODO: 这组接口负责管理 state_t.windows[] 容器本身,并维护当前过渡期的
|
||||||
* stack_order[] 与 windows[] 同步。
|
* stack_order[] 视图;后续会切换到 layer stack 为主。
|
||||||
* 对外只提供只读访问。
|
* 对外只提供只读访问。
|
||||||
* window 的运行期可变状态必须通过专门的 state 级更新接口修改。
|
* window 的运行期可变状态必须通过专门的 state 级更新接口修改。
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* 添加窗口,并将其追加到 stack_order[] 顶部。
|
* TODO: 添加窗口,并将其追加到当前过渡期的 stack_order[] 顶部。
|
||||||
*
|
*
|
||||||
* info 提供 backend 已探测到的窗口基础信息。
|
* info 提供 backend 已探测到的窗口基础信息。
|
||||||
* workspace 归属与其他策略相关字段由后续 state_window_* 接口设置。
|
* workspace 归属与其他策略相关字段由后续 state_window_* 接口设置。
|
||||||
@@ -142,7 +147,7 @@ bool state_output_valid(const state_t *state, output_id_t id);
|
|||||||
const window_t *state_window_add(state_t *state, const window_info_t *info);
|
const window_t *state_window_add(state_t *state, const window_info_t *info);
|
||||||
const window_t *state_window_get(const state_t *state, window_id_t id);
|
const window_t *state_window_get(const state_t *state, window_id_t id);
|
||||||
const window_t *state_window_at(const state_t *state, size_t index);
|
const window_t *state_window_at(const state_t *state, size_t index);
|
||||||
/* 删除窗口,并同步从 stack_order[] 中移除。 */
|
/* TODO: 删除窗口,并同步从当前过渡期的 stack_order[] 中移除。 */
|
||||||
void state_window_remove(state_t *state, window_id_t id);
|
void state_window_remove(state_t *state, window_id_t id);
|
||||||
size_t state_window_count(const state_t *state);
|
size_t state_window_count(const state_t *state);
|
||||||
|
|
||||||
@@ -175,10 +180,11 @@ bool state_window_set_instance(state_t *state, window_id_t window_id,
|
|||||||
const char *instance_name);
|
const char *instance_name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* state 持有的堆叠顺序接口
|
* TODO: state 持有的过渡期堆叠顺序接口
|
||||||
*
|
*
|
||||||
* stack_order[] 是全局 z-order 的唯一真相,从下到上排列。
|
* 这组接口服务于当前保留的全局 stack_order[] 视图;后续会由 layer stack
|
||||||
* 其长度恒等于 state_window_count(state),因此不提供单独的 count 接口。
|
* 取代。stack_order[] 从下到上排列,其长度恒等于 state_window_count(state),
|
||||||
|
* 因此不提供单独的 count 接口。
|
||||||
*/
|
*/
|
||||||
const window_id_t *state_stack_order(const state_t *state);
|
const window_id_t *state_stack_order(const state_t *state);
|
||||||
window_id_t state_stack_at(const state_t *state, size_t index);
|
window_id_t state_stack_at(const state_t *state, size_t index);
|
||||||
|
|||||||
50
src/core/window.h
Normal file
50
src/core/window.h
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "core/types.h"
|
||||||
|
|
||||||
|
/* Internal semantic window types mapped from backend-specific protocols. */
|
||||||
|
typedef enum window_type_t {
|
||||||
|
ZDWM_WINDOW_TYPE_NORMAL = 0,
|
||||||
|
ZDWM_WINDOW_TYPE_DESKTOP,
|
||||||
|
ZDWM_WINDOW_TYPE_DOCK,
|
||||||
|
ZDWM_WINDOW_TYPE_TOOLBAR,
|
||||||
|
ZDWM_WINDOW_TYPE_DIALOG,
|
||||||
|
ZDWM_WINDOW_TYPE_UTILITY,
|
||||||
|
ZDWM_WINDOW_TYPE_SPLASH,
|
||||||
|
ZDWM_WINDOW_TYPE_MENU,
|
||||||
|
ZDWM_WINDOW_TYPE_DROPDOWN_MENU,
|
||||||
|
ZDWM_WINDOW_TYPE_POPUP_MENU,
|
||||||
|
ZDWM_WINDOW_TYPE_TOOLTIP,
|
||||||
|
ZDWM_WINDOW_TYPE_COMBO,
|
||||||
|
ZDWM_WINDOW_TYPE_DND,
|
||||||
|
ZDWM_WINDOW_TYPE_NOTIFICATION,
|
||||||
|
} window_type_t;
|
||||||
|
|
||||||
|
/* Internal semantic window states mapped from backend-specific protocols. */
|
||||||
|
typedef enum window_state_t {
|
||||||
|
ZDWM_WINDOW_STATE_ABOVE = 0,
|
||||||
|
ZDWM_WINDOW_STATE_FULLSCREEN,
|
||||||
|
ZDWM_WINDOW_STATE_MODAL,
|
||||||
|
ZDWM_WINDOW_STATE_STICKY,
|
||||||
|
} window_state_t;
|
||||||
|
|
||||||
|
typedef struct window_props_t {
|
||||||
|
window_id_t transient_for;
|
||||||
|
|
||||||
|
bool override_redirect;
|
||||||
|
|
||||||
|
window_type_t *types;
|
||||||
|
size_t type_count;
|
||||||
|
|
||||||
|
window_state_t *states;
|
||||||
|
size_t state_count;
|
||||||
|
} window_props_t;
|
||||||
|
|
||||||
|
typedef struct window_metadata_t {
|
||||||
|
const char *title;
|
||||||
|
const char *app_id;
|
||||||
|
const char *class_name;
|
||||||
|
const char *instance_name;
|
||||||
|
} window_metadata_t;
|
||||||
Reference in New Issue
Block a user