Compare commits
2 Commits
a393308704
...
085a071f23
| Author | SHA1 | Date | |
|---|---|---|---|
|
085a071f23
|
|||
|
1485400b4c
|
@@ -466,6 +466,29 @@ find_or_push_configure(window_configure_list_t *configs, xcb_window_t window) {
|
|||||||
return cfg;
|
return cfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void merge_window_configure_params(
|
||||||
|
backend_t *backend,
|
||||||
|
const configure_data_t *data
|
||||||
|
) {
|
||||||
|
auto cfg = find_or_push_configure(&backend->config_list, data->window);
|
||||||
|
|
||||||
|
#define FIELD_MERGE(MASK, VALUE_FIELD, DATA_FIELD) \
|
||||||
|
if (data->changed_fields & (MASK)) { \
|
||||||
|
cfg->mask |= (MASK); \
|
||||||
|
cfg->value.VALUE_FIELD = data->DATA_FIELD; \
|
||||||
|
}
|
||||||
|
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_X, x, x);
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_Y, y, y);
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_WIDTH, width, width);
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_HEIGHT, height, height);
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_BORDER_WIDTH, border_width, border_width);
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_SIBLING, sibling, sibling);
|
||||||
|
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_STACK_MODE, stack_mode, stack_mode);
|
||||||
|
|
||||||
|
#undef FIELD_MERGE
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
backend_bind_key(backend_t *backend, const effect_bind_key_t *bind_key) {
|
backend_bind_key(backend_t *backend, const effect_bind_key_t *bind_key) {
|
||||||
auto root = backend->screen->root;
|
auto root = backend->screen->root;
|
||||||
@@ -477,8 +500,6 @@ static void backend_merge_effects(
|
|||||||
const effect_t *effects,
|
const effect_t *effects,
|
||||||
size_t effect_count
|
size_t effect_count
|
||||||
) {
|
) {
|
||||||
window_configure_list_t *configs = &backend->config_list;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < effect_count; ++i) {
|
for (size_t i = 0; i < effect_count; ++i) {
|
||||||
const effect_t *e = &effects[i];
|
const effect_t *e = &effects[i];
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
@@ -529,20 +550,9 @@ static void backend_merge_effects(
|
|||||||
window_set_net_wm_state(backend, window, 0, nullptr);
|
window_set_net_wm_state(backend, window, 0, nullptr);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case ZDWM_EFFECT_MOVE_WINDOW: {
|
case ZDWM_EFFECT_CONFIGURE_WINDOW:
|
||||||
window_configure_t *cfg =
|
merge_window_configure_params(backend, &e->as.configure);
|
||||||
find_or_push_configure(configs, e->as.move.window);
|
break;
|
||||||
cfg->mask |= XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
|
|
||||||
cfg->value.x = e->as.move.left_top_point.x;
|
|
||||||
cfg->value.y = e->as.move.left_top_point.y;
|
|
||||||
} break;
|
|
||||||
case ZDWM_EFFECT_RESIZE_WINDOW: {
|
|
||||||
window_configure_t *cfg =
|
|
||||||
find_or_push_configure(configs, e->as.resize.window);
|
|
||||||
cfg->mask |= XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
|
|
||||||
cfg->value.width = (uint32_t)e->as.resize.width;
|
|
||||||
cfg->value.height = (uint32_t)e->as.resize.height;
|
|
||||||
} break;
|
|
||||||
case ZDWM_EFFECT_CHANGE_BORDER_COLOR: {
|
case ZDWM_EFFECT_CHANGE_BORDER_COLOR: {
|
||||||
xcb_change_window_attributes_value_list_t value = {
|
xcb_change_window_attributes_value_list_t value = {
|
||||||
.border_pixel = e->as.change_border_color.color->argb
|
.border_pixel = e->as.change_border_color.color->argb
|
||||||
@@ -554,12 +564,6 @@ static void backend_merge_effects(
|
|||||||
&value
|
&value
|
||||||
);
|
);
|
||||||
} break;
|
} break;
|
||||||
case ZDWM_EFFECT_CHANGE_BORDER_WIDTH: {
|
|
||||||
window_configure_t *cfg =
|
|
||||||
find_or_push_configure(configs, e->as.change_border_width.window);
|
|
||||||
cfg->mask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
|
|
||||||
cfg->value.border_width = e->as.change_border_width.border_width;
|
|
||||||
} break;
|
|
||||||
case ZDWM_EFFECT_CHANGE_WINDOW_LIST:
|
case ZDWM_EFFECT_CHANGE_WINDOW_LIST:
|
||||||
backend_change_window_list(backend, false, &e->as.change_window_list);
|
backend_change_window_list(backend, false, &e->as.change_window_list);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -199,8 +199,27 @@ static bool handle_configure_request(
|
|||||||
event_t *event,
|
event_t *event,
|
||||||
const xcb_configure_request_event_t *xcb_event
|
const xcb_configure_request_event_t *xcb_event
|
||||||
) {
|
) {
|
||||||
event->type = ZDWM_EVENT_CONFIGURE_REQUEST;
|
event->type = ZDWM_EVENT_CONFIGURE_REQUEST;
|
||||||
/* TODO: */
|
auto data = &event->as.configure_request;
|
||||||
|
data->window = xcb_event->window;
|
||||||
|
data->changed_fields = 0u;
|
||||||
|
|
||||||
|
#define EXTRACT_FIELD(XCB_MASK, FIELD_MASK, DATA_FIELD, EVENT_FIELD) \
|
||||||
|
if (xcb_event->value_mask & XCB_CONFIG_WINDOW_##XCB_MASK) { \
|
||||||
|
data->DATA_FIELD = xcb_event->EVENT_FIELD; \
|
||||||
|
data->changed_fields |= ZDWM_CONFIGURE_FIELD_##FIELD_MASK; \
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTRACT_FIELD(X, X, x, x);
|
||||||
|
EXTRACT_FIELD(Y, Y, y, y);
|
||||||
|
EXTRACT_FIELD(WIDTH, WIDTH, width, width);
|
||||||
|
EXTRACT_FIELD(HEIGHT, HEIGHT, height, height);
|
||||||
|
EXTRACT_FIELD(BORDER_WIDTH, BORDER_WIDTH, border_width, border_width);
|
||||||
|
EXTRACT_FIELD(SIBLING, SIBLING, sibling, sibling);
|
||||||
|
EXTRACT_FIELD(STACK_MODE, STACK_MODE, stack_mode, stack_mode);
|
||||||
|
|
||||||
|
#undef EXTRACT_FIELD
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ typedef struct atoms_t {
|
|||||||
|
|
||||||
typedef struct window_configure_t {
|
typedef struct window_configure_t {
|
||||||
xcb_window_t window;
|
xcb_window_t window;
|
||||||
uint16_t mask;
|
uint32_t mask;
|
||||||
xcb_configure_window_value_list_t value;
|
xcb_configure_window_value_list_t value;
|
||||||
} window_configure_t;
|
} window_configure_t;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ typedef enum command_type_t {
|
|||||||
ZDWM_COMMAND_FOCUS_WINDOW,
|
ZDWM_COMMAND_FOCUS_WINDOW,
|
||||||
ZDWM_COMMAND_KILL_WINDOW,
|
ZDWM_COMMAND_KILL_WINDOW,
|
||||||
ZDWM_COMMAND_WITHDRAW_WINDOW,
|
ZDWM_COMMAND_WITHDRAW_WINDOW,
|
||||||
|
ZDWM_COMMAND_CONFIGURE_WINDOW,
|
||||||
ZDWM_COMMAND_CHANGE_WINDOW_STATE,
|
ZDWM_COMMAND_CHANGE_WINDOW_STATE,
|
||||||
ZDWM_COMMAND_SWITCH_WORKSPACE,
|
ZDWM_COMMAND_SWITCH_WORKSPACE,
|
||||||
} command_type_t;
|
} command_type_t;
|
||||||
@@ -51,6 +52,7 @@ typedef struct command_t {
|
|||||||
only_window_command_t focus;
|
only_window_command_t focus;
|
||||||
only_window_command_t kill;
|
only_window_command_t kill;
|
||||||
only_window_command_t withdraw;
|
only_window_command_t withdraw;
|
||||||
|
configure_data_t configure;
|
||||||
window_state_change_command_t state_change;
|
window_state_change_command_t state_change;
|
||||||
switch_workspace_command_t switch_workspace;
|
switch_workspace_command_t switch_workspace;
|
||||||
} as;
|
} as;
|
||||||
|
|||||||
@@ -114,23 +114,6 @@ typedef struct window_state_request_event_t {
|
|||||||
window_state_request_action_t action;
|
window_state_request_action_t action;
|
||||||
} window_state_request_event_t;
|
} window_state_request_event_t;
|
||||||
|
|
||||||
typedef enum configure_request_field_t {
|
|
||||||
ZDWM_CONFIGURE_REQUEST_FIELD_NONE = 0,
|
|
||||||
ZDWM_CONFIGURE_REQUEST_FIELD_X = 1u << 0,
|
|
||||||
ZDWM_CONFIGURE_REQUEST_FIELD_Y = 1u << 1,
|
|
||||||
ZDWM_CONFIGURE_REQUEST_FIELD_WIDTH = 1u << 2,
|
|
||||||
ZDWM_CONFIGURE_REQUEST_FIELD_HEIGHT = 1u << 3,
|
|
||||||
} configure_request_field_t;
|
|
||||||
|
|
||||||
typedef struct configure_request_event_t {
|
|
||||||
window_id_t window;
|
|
||||||
uint32_t changed_fields;
|
|
||||||
int32_t x;
|
|
||||||
int32_t y;
|
|
||||||
int32_t width;
|
|
||||||
int32_t height;
|
|
||||||
} configure_request_event_t;
|
|
||||||
|
|
||||||
typedef struct event_t {
|
typedef struct event_t {
|
||||||
event_type_t type;
|
event_type_t type;
|
||||||
union {
|
union {
|
||||||
@@ -145,7 +128,7 @@ typedef struct event_t {
|
|||||||
window_hints_changed_event_t window_hints_changed;
|
window_hints_changed_event_t window_hints_changed;
|
||||||
window_activate_request_event_t window_activate_request;
|
window_activate_request_event_t window_activate_request;
|
||||||
window_state_request_event_t window_state_request;
|
window_state_request_event_t window_state_request;
|
||||||
configure_request_event_t configure_request;
|
configure_data_t configure_request;
|
||||||
} as;
|
} as;
|
||||||
} event_t;
|
} event_t;
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,8 @@ typedef enum effect_type_t {
|
|||||||
ZDWM_EFFECT_MINIMIZE_WINDOW,
|
ZDWM_EFFECT_MINIMIZE_WINDOW,
|
||||||
ZDWM_EFFECT_MAXIMIZE_WINDOW,
|
ZDWM_EFFECT_MAXIMIZE_WINDOW,
|
||||||
ZDWM_EFFECT_FULLSCREEN_WINDOW,
|
ZDWM_EFFECT_FULLSCREEN_WINDOW,
|
||||||
ZDWM_EFFECT_MOVE_WINDOW,
|
ZDWM_EFFECT_CONFIGURE_WINDOW,
|
||||||
ZDWM_EFFECT_RESIZE_WINDOW,
|
|
||||||
ZDWM_EFFECT_CHANGE_BORDER_COLOR,
|
ZDWM_EFFECT_CHANGE_BORDER_COLOR,
|
||||||
ZDWM_EFFECT_CHANGE_BORDER_WIDTH,
|
|
||||||
ZDWM_EFFECT_CHANGE_WINDOW_LIST,
|
ZDWM_EFFECT_CHANGE_WINDOW_LIST,
|
||||||
ZDWM_EFFECT_RESTACK_WINDOWS,
|
ZDWM_EFFECT_RESTACK_WINDOWS,
|
||||||
ZDWM_EFFECT_BIND_KEY,
|
ZDWM_EFFECT_BIND_KEY,
|
||||||
@@ -43,11 +41,6 @@ typedef struct effect_change_border_color_t {
|
|||||||
const color_t *color;
|
const color_t *color;
|
||||||
} effect_change_border_color_t;
|
} effect_change_border_color_t;
|
||||||
|
|
||||||
typedef struct effect_change_border_width_t {
|
|
||||||
window_id_t window;
|
|
||||||
uint32_t border_width;
|
|
||||||
} effect_change_border_width_t;
|
|
||||||
|
|
||||||
typedef struct effect_window_list_t {
|
typedef struct effect_window_list_t {
|
||||||
const window_id_t *windows;
|
const window_id_t *windows;
|
||||||
size_t count;
|
size_t count;
|
||||||
@@ -74,10 +67,8 @@ typedef struct effect_t {
|
|||||||
effect_bool_window_t minimize;
|
effect_bool_window_t minimize;
|
||||||
effect_bool_window_t maximize;
|
effect_bool_window_t maximize;
|
||||||
effect_bool_window_t fullscreen;
|
effect_bool_window_t fullscreen;
|
||||||
effect_move_window_t move;
|
configure_data_t configure;
|
||||||
effect_resize_window_t resize;
|
|
||||||
effect_change_border_color_t change_border_color;
|
effect_change_border_color_t change_border_color;
|
||||||
effect_change_border_width_t change_border_width;
|
|
||||||
effect_window_list_t change_window_list;
|
effect_window_list_t change_window_list;
|
||||||
effect_window_list_t restack_windows;
|
effect_window_list_t restack_windows;
|
||||||
effect_bind_key_t bind_key;
|
effect_bind_key_t bind_key;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "core/policy.h"
|
#include "core/policy.h"
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
#include <zdwm/types.h>
|
#include <zdwm/types.h>
|
||||||
|
|
||||||
#include "base/macros.h"
|
#include "base/macros.h"
|
||||||
@@ -8,6 +9,7 @@
|
|||||||
#include "core/command.h"
|
#include "core/command.h"
|
||||||
#include "core/command_buffer.h"
|
#include "core/command_buffer.h"
|
||||||
#include "core/event.h"
|
#include "core/event.h"
|
||||||
|
#include "core/layout.h"
|
||||||
#include "core/plan.h"
|
#include "core/plan.h"
|
||||||
#include "core/rules.h"
|
#include "core/rules.h"
|
||||||
#include "core/state.h"
|
#include "core/state.h"
|
||||||
@@ -137,6 +139,50 @@ static void route_window_remove(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void route_configure_request(
|
||||||
|
state_t *state,
|
||||||
|
const configure_data_t *data,
|
||||||
|
const layout_registry_t *layouts,
|
||||||
|
command_buffer_t *out
|
||||||
|
) {
|
||||||
|
auto window = state_window_get(state, data->window);
|
||||||
|
if (!window) {
|
||||||
|
command_t configure_cmd = {
|
||||||
|
.type = ZDWM_COMMAND_CONFIGURE_WINDOW,
|
||||||
|
.as.configure = *data
|
||||||
|
};
|
||||||
|
command_buffer_push(out, &configure_cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->changed_fields & ZDWM_CONFIGURE_FIELD_BORDER_WIDTH) {
|
||||||
|
command_t configure_border_width_cmd = {
|
||||||
|
.type = ZDWM_COMMAND_CONFIGURE_WINDOW,
|
||||||
|
.as.configure = {
|
||||||
|
.window = window->id,
|
||||||
|
.border_width = data->border_width,
|
||||||
|
.changed_fields = ZDWM_CONFIGURE_FIELD_BORDER_WIDTH,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
command_buffer_push(out, &configure_border_width_cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state_workspace_show(state, window->workspace_id)) return;
|
||||||
|
if (window_need_layout(window)) return;
|
||||||
|
auto workspace = state_workspace_get(state, window->workspace_id);
|
||||||
|
if (layout_get(layouts, workspace->layout_id)) return;
|
||||||
|
|
||||||
|
command_t configure_rect_cmd = {
|
||||||
|
.type = ZDWM_COMMAND_CONFIGURE_WINDOW,
|
||||||
|
.as.configure = *data,
|
||||||
|
};
|
||||||
|
configure_rect_cmd.as.configure.changed_fields &=
|
||||||
|
ZDWM_CONFIGURE_FIELD_X | ZDWM_CONFIGURE_FIELD_Y |
|
||||||
|
ZDWM_CONFIGURE_FIELD_WIDTH | ZDWM_CONFIGURE_FIELD_HEIGHT;
|
||||||
|
command_buffer_push(out, &configure_rect_cmd);
|
||||||
|
}
|
||||||
|
|
||||||
void policy_route_event(
|
void policy_route_event(
|
||||||
const policy_context_t *ctx,
|
const policy_context_t *ctx,
|
||||||
const event_t *event,
|
const event_t *event,
|
||||||
@@ -153,6 +199,10 @@ void policy_route_event(
|
|||||||
case ZDWM_EVENT_WINDOW_REMOVE:
|
case ZDWM_EVENT_WINDOW_REMOVE:
|
||||||
route_window_remove(state, &event->as.window_remove, out);
|
route_window_remove(state, &event->as.window_remove, out);
|
||||||
break;
|
break;
|
||||||
|
case ZDWM_EVENT_CONFIGURE_REQUEST: {
|
||||||
|
auto data = &event->as.configure_request;
|
||||||
|
route_configure_request(state, data, ctx->layouts, out);
|
||||||
|
} break;
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -283,6 +333,56 @@ static void withdraw_window(state_t *state, window_id_t window, plan_t *plan) {
|
|||||||
plan_push_effect(plan, &withdraw_window_effect);
|
plan_push_effect(plan, &withdraw_window_effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
configure_window(state_t *state, const configure_data_t *data, plan_t *plan) {
|
||||||
|
auto window = state_window_get(state, data->window);
|
||||||
|
if (!window) {
|
||||||
|
effect_t configure_effect = {
|
||||||
|
.type = ZDWM_EFFECT_CONFIGURE_WINDOW,
|
||||||
|
.as.configure = *data,
|
||||||
|
};
|
||||||
|
plan_push_effect(plan, &configure_effect);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto rect = window->frame_rect;
|
||||||
|
#define PICK_FIELD(FIELD_MASK, RECT_FIELD, DATA_FIELD) \
|
||||||
|
if (data->changed_fields & (FIELD_MASK)) rect.RECT_FIELD = data->DATA_FIELD
|
||||||
|
|
||||||
|
PICK_FIELD(ZDWM_CONFIGURE_FIELD_X, x, x);
|
||||||
|
PICK_FIELD(ZDWM_CONFIGURE_FIELD_Y, y, y);
|
||||||
|
PICK_FIELD(ZDWM_CONFIGURE_FIELD_WIDTH, width, width);
|
||||||
|
PICK_FIELD(ZDWM_CONFIGURE_FIELD_HEIGHT, height, height);
|
||||||
|
|
||||||
|
#undef PICK_FIELD
|
||||||
|
|
||||||
|
auto need_move = window_need_move(window, rect.x, rect.y);
|
||||||
|
auto need_resize = window_need_resize(window, rect.width, rect.height);
|
||||||
|
if (!need_move && !need_resize) return;
|
||||||
|
|
||||||
|
state_window_set_frame_rect(state, window->id, rect);
|
||||||
|
|
||||||
|
effect_t configure_effect = {
|
||||||
|
.type = ZDWM_EFFECT_CONFIGURE_WINDOW,
|
||||||
|
.as.configure = {
|
||||||
|
.window = window->id,
|
||||||
|
.x = rect.x,
|
||||||
|
.y = rect.y,
|
||||||
|
.width = rect.width,
|
||||||
|
.height = rect.height,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (need_move) {
|
||||||
|
configure_effect.as.configure.changed_fields |=
|
||||||
|
ZDWM_CONFIGURE_FIELD_X | ZDWM_CONFIGURE_FIELD_Y;
|
||||||
|
}
|
||||||
|
if (need_resize) {
|
||||||
|
configure_effect.as.configure.changed_fields |=
|
||||||
|
ZDWM_CONFIGURE_FIELD_WIDTH | ZDWM_CONFIGURE_FIELD_HEIGHT;
|
||||||
|
}
|
||||||
|
plan_push_effect(plan, &configure_effect);
|
||||||
|
}
|
||||||
|
|
||||||
static void fullscreen_window(
|
static void fullscreen_window(
|
||||||
state_t *state,
|
state_t *state,
|
||||||
window_id_t window_id,
|
window_id_t window_id,
|
||||||
@@ -489,6 +589,9 @@ void policy_apply_command(
|
|||||||
case ZDWM_COMMAND_WITHDRAW_WINDOW:
|
case ZDWM_COMMAND_WITHDRAW_WINDOW:
|
||||||
withdraw_window(state, cmd->as.withdraw.window, plan);
|
withdraw_window(state, cmd->as.withdraw.window, plan);
|
||||||
break;
|
break;
|
||||||
|
case ZDWM_COMMAND_CONFIGURE_WINDOW:
|
||||||
|
configure_window(state, &cmd->as.configure, plan);
|
||||||
|
break;
|
||||||
case ZDWM_COMMAND_CHANGE_WINDOW_STATE:
|
case ZDWM_COMMAND_CHANGE_WINDOW_STATE:
|
||||||
change_window_state(state, &cmd->as.state_change, plan);
|
change_window_state(state, &cmd->as.state_change, plan);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "core/binding.h"
|
#include "core/binding.h"
|
||||||
#include "core/command_buffer.h"
|
#include "core/command_buffer.h"
|
||||||
#include "core/event.h"
|
#include "core/event.h"
|
||||||
|
#include "core/layout.h"
|
||||||
#include "core/plan.h"
|
#include "core/plan.h"
|
||||||
#include "core/rules.h"
|
#include "core/rules.h"
|
||||||
#include "core/state.h"
|
#include "core/state.h"
|
||||||
@@ -13,6 +14,7 @@ typedef struct policy_context_t {
|
|||||||
binding_table_t *bind_table;
|
binding_table_t *bind_table;
|
||||||
state_t *state;
|
state_t *state;
|
||||||
const rules_t *rules;
|
const rules_t *rules;
|
||||||
|
const layout_registry_t *layouts;
|
||||||
const zdwm_action_ctx_t action_ctx;
|
const zdwm_action_ctx_t action_ctx;
|
||||||
} policy_context_t;
|
} policy_context_t;
|
||||||
|
|
||||||
|
|||||||
@@ -216,27 +216,26 @@ static void runtime_apply_window_rect(
|
|||||||
|
|
||||||
auto need_move = window_need_move(window, rect.x, rect.y);
|
auto need_move = window_need_move(window, rect.x, rect.y);
|
||||||
auto need_resize = window_need_resize(window, rect.width, rect.height);
|
auto need_resize = window_need_resize(window, rect.width, rect.height);
|
||||||
|
|
||||||
|
uint32_t changed_fields = 0u;
|
||||||
if (need_move) {
|
if (need_move) {
|
||||||
effect_t move_window_effect = {
|
changed_fields |= ZDWM_CONFIGURE_FIELD_X | ZDWM_CONFIGURE_FIELD_Y;
|
||||||
.type = ZDWM_EFFECT_MOVE_WINDOW,
|
|
||||||
.as.move = {
|
|
||||||
.window = window_id,
|
|
||||||
.left_top_point = {.x = rect.x, .y = rect.y}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
plan_push_effect(plan, &move_window_effect);
|
|
||||||
}
|
}
|
||||||
if (need_resize) {
|
if (need_resize) {
|
||||||
effect_t resize_window_effect = {
|
changed_fields |= ZDWM_CONFIGURE_FIELD_WIDTH | ZDWM_CONFIGURE_FIELD_HEIGHT;
|
||||||
.type = ZDWM_EFFECT_RESIZE_WINDOW,
|
|
||||||
.as.resize = {
|
|
||||||
.window = window_id,
|
|
||||||
.width = rect.width,
|
|
||||||
.height = rect.height,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
plan_push_effect(plan, &resize_window_effect);
|
|
||||||
}
|
}
|
||||||
|
effect_t configure_effect = {
|
||||||
|
.type = ZDWM_EFFECT_CONFIGURE_WINDOW,
|
||||||
|
.as.configure = {
|
||||||
|
.window = window_id,
|
||||||
|
.x = rect.x,
|
||||||
|
.y = rect.y,
|
||||||
|
.width = rect.width,
|
||||||
|
.height = rect.height,
|
||||||
|
.changed_fields = changed_fields,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
plan_push_effect(plan, &configure_effect);
|
||||||
|
|
||||||
if (need_move || need_resize) {
|
if (need_move || need_resize) {
|
||||||
state_window_set_frame_rect(state, window_id, rect);
|
state_window_set_frame_rect(state, window_id, rect);
|
||||||
@@ -266,6 +265,7 @@ void runtime_run(runtime_t *runtime) {
|
|||||||
.bind_table = runtime->binding_table,
|
.bind_table = runtime->binding_table,
|
||||||
.state = &runtime->state,
|
.state = &runtime->state,
|
||||||
.rules = &runtime->rules,
|
.rules = &runtime->rules,
|
||||||
|
.layouts = &runtime->layouts,
|
||||||
.action_ctx = {
|
.action_ctx = {
|
||||||
.spawn = spawn,
|
.spawn = spawn,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -79,3 +79,25 @@ typedef enum window_state_request_action_t {
|
|||||||
ZDWM_WINDOW_STATE_ACTION_REMOVE,
|
ZDWM_WINDOW_STATE_ACTION_REMOVE,
|
||||||
ZDWM_WINDOW_STATE_ACTION_TOGGLE,
|
ZDWM_WINDOW_STATE_ACTION_TOGGLE,
|
||||||
} window_state_request_action_t;
|
} window_state_request_action_t;
|
||||||
|
|
||||||
|
typedef enum configure_field_t {
|
||||||
|
ZDWM_CONFIGURE_FIELD_X = 1u << 0,
|
||||||
|
ZDWM_CONFIGURE_FIELD_Y = 1u << 1,
|
||||||
|
ZDWM_CONFIGURE_FIELD_WIDTH = 1u << 2,
|
||||||
|
ZDWM_CONFIGURE_FIELD_HEIGHT = 1u << 3,
|
||||||
|
ZDWM_CONFIGURE_FIELD_BORDER_WIDTH = 1u << 4,
|
||||||
|
ZDWM_CONFIGURE_FIELD_SIBLING = 1u << 5,
|
||||||
|
ZDWM_CONFIGURE_FIELD_STACK_MODE = 1u << 6,
|
||||||
|
} configure_field_t;
|
||||||
|
|
||||||
|
typedef struct configure_data_t {
|
||||||
|
window_id_t window;
|
||||||
|
uint32_t changed_fields;
|
||||||
|
int32_t x;
|
||||||
|
int32_t y;
|
||||||
|
int32_t width;
|
||||||
|
int32_t height;
|
||||||
|
uint32_t border_width;
|
||||||
|
window_id_t sibling;
|
||||||
|
uint32_t stack_mode;
|
||||||
|
} configure_data_t;
|
||||||
|
|||||||
Reference in New Issue
Block a user