mirror of
https://github.com/swaywm/sway.git
synced 2025-11-16 06:59:49 -05:00
Merge branch 'master' into fix-resize-wiggle
This commit is contained in:
commit
47bf4ed0cb
28 changed files with 529 additions and 94 deletions
|
|
@ -62,8 +62,10 @@ void container_create_notify(struct sway_container *container) {
|
|||
// TODO send ipc event type based on the container type
|
||||
wl_signal_emit(&root_container.sway_root->events.new_container, container);
|
||||
|
||||
if (container->type == C_VIEW || container->type == C_CONTAINER) {
|
||||
if (container->type == C_VIEW) {
|
||||
ipc_event_window(container, "new");
|
||||
} else if (container->type == C_WORKSPACE) {
|
||||
ipc_event_workspace(NULL, container, "init");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -281,7 +283,7 @@ static struct sway_container *container_output_destroy(
|
|||
container_remove_child(workspace);
|
||||
if (!workspace_is_empty(workspace)) {
|
||||
container_add_child(new_output, workspace);
|
||||
ipc_event_workspace(workspace, NULL, "move");
|
||||
ipc_event_workspace(NULL, workspace, "move");
|
||||
} else {
|
||||
container_destroy(workspace);
|
||||
}
|
||||
|
|
@ -319,7 +321,13 @@ static struct sway_container *container_destroy_noreaping(
|
|||
}
|
||||
|
||||
wl_signal_emit(&con->events.destroy, con);
|
||||
ipc_event_window(con, "close");
|
||||
|
||||
// emit IPC event
|
||||
if (con->type == C_VIEW) {
|
||||
ipc_event_window(con, "close");
|
||||
} else if (con->type == C_WORKSPACE) {
|
||||
ipc_event_workspace(NULL, con, "empty");
|
||||
}
|
||||
|
||||
// The below functions move their children to somewhere else.
|
||||
if (con->type == C_OUTPUT) {
|
||||
|
|
@ -561,10 +569,15 @@ static struct sway_container *container_at_view(struct sway_container *swayc,
|
|||
*sx = _sx;
|
||||
*sy = _sy;
|
||||
*surface = _surface;
|
||||
return swayc;
|
||||
}
|
||||
return swayc;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct sway_container *tiling_container_at(
|
||||
struct sway_container *con, double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy);
|
||||
|
||||
/**
|
||||
* container_at for a container with layout L_TABBED.
|
||||
*/
|
||||
|
|
@ -591,7 +604,7 @@ static struct sway_container *container_at_tabbed(struct sway_container *parent,
|
|||
// Surfaces
|
||||
struct sway_container *current = seat_get_active_child(seat, parent);
|
||||
|
||||
return container_at(current, lx, ly, surface, sx, sy);
|
||||
return tiling_container_at(current, lx, ly, surface, sx, sy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -616,7 +629,7 @@ static struct sway_container *container_at_stacked(
|
|||
// Surfaces
|
||||
struct sway_container *current = seat_get_active_child(seat, parent);
|
||||
|
||||
return container_at(current, lx, ly, surface, sx, sy);
|
||||
return tiling_container_at(current, lx, ly, surface, sx, sy);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -634,45 +647,13 @@ static struct sway_container *container_at_linear(struct sway_container *parent,
|
|||
.height = child->height,
|
||||
};
|
||||
if (wlr_box_contains_point(&box, lx, ly)) {
|
||||
return container_at(child, lx, ly, surface, sx, sy);
|
||||
return tiling_container_at(child, lx, ly, surface, sx, sy);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct sway_container *container_at(struct sway_container *parent,
|
||||
double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy) {
|
||||
if (!sway_assert(parent->type >= C_WORKSPACE,
|
||||
"Expected workspace or deeper")) {
|
||||
return NULL;
|
||||
}
|
||||
if (parent->type == C_VIEW) {
|
||||
return container_at_view(parent, lx, ly, surface, sx, sy);
|
||||
}
|
||||
if (!parent->children->length) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (parent->layout) {
|
||||
case L_HORIZ:
|
||||
case L_VERT:
|
||||
return container_at_linear(parent, lx, ly, surface, sx, sy);
|
||||
case L_TABBED:
|
||||
return container_at_tabbed(parent, lx, ly, surface, sx, sy);
|
||||
case L_STACKED:
|
||||
return container_at_stacked(parent, lx, ly, surface, sx, sy);
|
||||
case L_FLOATING:
|
||||
sway_assert(false, "Didn't expect to see floating here");
|
||||
return NULL;
|
||||
case L_NONE:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct sway_container *floating_container_at(double lx, double ly,
|
||||
static struct sway_container *floating_container_at(double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy) {
|
||||
for (int i = 0; i < root_container.children->length; ++i) {
|
||||
struct sway_container *output = root_container.children->items[i];
|
||||
|
|
@ -694,7 +675,8 @@ struct sway_container *floating_container_at(double lx, double ly,
|
|||
.height = floater->height,
|
||||
};
|
||||
if (wlr_box_contains_point(&box, lx, ly)) {
|
||||
return container_at(floater, lx, ly, surface, sx, sy);
|
||||
return tiling_container_at(floater, lx, ly,
|
||||
surface, sx, sy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -702,6 +684,90 @@ struct sway_container *floating_container_at(double lx, double ly,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static struct sway_container *tiling_container_at(
|
||||
struct sway_container *con, double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy) {
|
||||
if (con->type == C_VIEW) {
|
||||
return container_at_view(con, lx, ly, surface, sx, sy);
|
||||
}
|
||||
if (!con->children->length) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (con->layout) {
|
||||
case L_HORIZ:
|
||||
case L_VERT:
|
||||
return container_at_linear(con, lx, ly, surface, sx, sy);
|
||||
case L_TABBED:
|
||||
return container_at_tabbed(con, lx, ly, surface, sx, sy);
|
||||
case L_STACKED:
|
||||
return container_at_stacked(con, lx, ly, surface, sx, sy);
|
||||
case L_FLOATING:
|
||||
sway_assert(false, "Didn't expect to see floating here");
|
||||
return NULL;
|
||||
case L_NONE:
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool surface_is_popup(struct wlr_surface *surface) {
|
||||
if (wlr_surface_is_xdg_surface(surface)) {
|
||||
struct wlr_xdg_surface *xdg_surface =
|
||||
wlr_xdg_surface_from_wlr_surface(surface);
|
||||
while (xdg_surface) {
|
||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
||||
return true;
|
||||
}
|
||||
xdg_surface = xdg_surface->toplevel->parent;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wlr_surface_is_xdg_surface_v6(surface)) {
|
||||
struct wlr_xdg_surface_v6 *xdg_surface_v6 =
|
||||
wlr_xdg_surface_v6_from_wlr_surface(surface);
|
||||
while (xdg_surface_v6) {
|
||||
if (xdg_surface_v6->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) {
|
||||
return true;
|
||||
}
|
||||
xdg_surface_v6 = xdg_surface_v6->toplevel->parent;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct sway_container *container_at(struct sway_container *workspace,
|
||||
double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy) {
|
||||
if (!sway_assert(workspace->type == C_WORKSPACE, "Expected a workspace")) {
|
||||
return NULL;
|
||||
}
|
||||
struct sway_container *c;
|
||||
// Focused view's popups
|
||||
struct sway_seat *seat = input_manager_current_seat(input_manager);
|
||||
struct sway_container *focus =
|
||||
seat_get_focus_inactive(seat, &root_container);
|
||||
if (focus && focus->type == C_VIEW) {
|
||||
container_at_view(focus, lx, ly, surface, sx, sy);
|
||||
if (*surface && surface_is_popup(*surface)) {
|
||||
return focus;
|
||||
}
|
||||
*surface = NULL;
|
||||
}
|
||||
// Floating
|
||||
if ((c = floating_container_at(lx, ly, surface, sx, sy))) {
|
||||
return c;
|
||||
}
|
||||
// Tiling
|
||||
if ((c = tiling_container_at(workspace, lx, ly, surface, sx, sy))) {
|
||||
return c;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void container_for_each_descendant_dfs(struct sway_container *container,
|
||||
void (*f)(struct sway_container *container, void *data),
|
||||
void *data) {
|
||||
|
|
|
|||
|
|
@ -217,7 +217,9 @@ void container_move_to(struct sway_container *container,
|
|||
container_sort_workspaces(new_parent);
|
||||
seat_set_focus(seat, new_parent);
|
||||
workspace_output_raise_priority(container, old_parent, new_parent);
|
||||
ipc_event_workspace(container, NULL, "move");
|
||||
ipc_event_workspace(NULL, container, "move");
|
||||
} else if (container->type == C_VIEW) {
|
||||
ipc_event_window(container, "move");
|
||||
}
|
||||
container_notify_subtree_changed(old_parent);
|
||||
container_notify_subtree_changed(new_parent);
|
||||
|
|
@ -578,6 +580,10 @@ void container_move(struct sway_container *container,
|
|||
container_notify_subtree_changed(old_parent);
|
||||
container_notify_subtree_changed(container->parent);
|
||||
|
||||
if (container->type == C_VIEW) {
|
||||
ipc_event_window(container, "move");
|
||||
}
|
||||
|
||||
if (old_parent) {
|
||||
seat_set_focus(config->handler_context.seat, old_parent);
|
||||
seat_set_focus(config->handler_context.seat, container);
|
||||
|
|
@ -592,7 +598,7 @@ void container_move(struct sway_container *container,
|
|||
next_ws = container_parent(next_ws, C_WORKSPACE);
|
||||
}
|
||||
if (last_ws && next_ws && last_ws != next_ws) {
|
||||
ipc_event_workspace(last_ws, container, "focus");
|
||||
ipc_event_workspace(last_ws, next_ws, "focus");
|
||||
workspace_detect_urgent(last_ws);
|
||||
workspace_detect_urgent(next_ws);
|
||||
}
|
||||
|
|
@ -995,13 +1001,13 @@ static void swap_focus(struct sway_container *con1,
|
|||
if (focus == con1 && (con2->parent->layout == L_TABBED
|
||||
|| con2->parent->layout == L_STACKED)) {
|
||||
if (workspace_is_visible(ws2)) {
|
||||
seat_set_focus_warp(seat, con2, false);
|
||||
seat_set_focus_warp(seat, con2, false, true);
|
||||
}
|
||||
seat_set_focus(seat, ws1 != ws2 ? con2 : con1);
|
||||
} else if (focus == con2 && (con1->parent->layout == L_TABBED
|
||||
|| con1->parent->layout == L_STACKED)) {
|
||||
if (workspace_is_visible(ws1)) {
|
||||
seat_set_focus_warp(seat, con1, false);
|
||||
seat_set_focus_warp(seat, con1, false, true);
|
||||
}
|
||||
seat_set_focus(seat, ws1 != ws2 ? con1 : con2);
|
||||
} else if (ws1 != ws2) {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ static void restore_workspaces(struct sway_container *output) {
|
|||
if (highest == output) {
|
||||
container_remove_child(ws);
|
||||
container_add_child(output, ws);
|
||||
ipc_event_workspace(ws, NULL, "move");
|
||||
ipc_event_workspace(NULL, ws, "move");
|
||||
j--;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -303,6 +303,12 @@ void view_close(struct sway_view *view) {
|
|||
}
|
||||
}
|
||||
|
||||
void view_close_popups(struct sway_view *view) {
|
||||
if (view->impl->close_popups) {
|
||||
view->impl->close_popups(view);
|
||||
}
|
||||
}
|
||||
|
||||
void view_damage_from(struct sway_view *view) {
|
||||
for (int i = 0; i < root_container.children->length; ++i) {
|
||||
struct sway_container *cont = root_container.children->items[i];
|
||||
|
|
@ -333,6 +339,16 @@ void view_for_each_surface(struct sway_view *view,
|
|||
}
|
||||
}
|
||||
|
||||
void view_for_each_popup(struct sway_view *view,
|
||||
wlr_surface_iterator_func_t iterator, void *user_data) {
|
||||
if (!view->surface) {
|
||||
return;
|
||||
}
|
||||
if (view->impl->for_each_popup) {
|
||||
view->impl->for_each_popup(view, iterator, user_data);
|
||||
}
|
||||
}
|
||||
|
||||
static void view_subsurface_create(struct sway_view *view,
|
||||
struct wlr_subsurface *subsurface);
|
||||
|
||||
|
|
@ -865,6 +881,8 @@ void view_update_title(struct sway_view *view, bool force) {
|
|||
|
||||
// Update title after the global font height is updated
|
||||
container_update_title_textures(view->swayc);
|
||||
|
||||
ipc_event_window(view->swayc, "title");
|
||||
}
|
||||
|
||||
static bool find_by_mark_iterator(struct sway_container *con,
|
||||
|
|
@ -887,6 +905,7 @@ bool view_find_and_unmark(char *mark) {
|
|||
free(view_mark);
|
||||
list_del(view->marks, i);
|
||||
view_update_marks_textures(view);
|
||||
ipc_event_window(container, "mark");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -894,11 +913,10 @@ bool view_find_and_unmark(char *mark) {
|
|||
}
|
||||
|
||||
void view_clear_marks(struct sway_view *view) {
|
||||
for (int i = 0; i < view->marks->length; ++i) {
|
||||
free(view->marks->items[i]);
|
||||
while (view->marks->length) {
|
||||
list_del(view->marks, 0);
|
||||
ipc_event_window(view->swayc, "mark");
|
||||
}
|
||||
list_free(view->marks);
|
||||
view->marks = create_list();
|
||||
}
|
||||
|
||||
bool view_has_mark(struct sway_view *view, char *mark) {
|
||||
|
|
@ -911,6 +929,11 @@ bool view_has_mark(struct sway_view *view, char *mark) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void view_add_mark(struct sway_view *view, char *mark) {
|
||||
list_add(view->marks, strdup(mark));
|
||||
ipc_event_window(view->swayc, "mark");
|
||||
}
|
||||
|
||||
static void update_marks_texture(struct sway_view *view,
|
||||
struct wlr_texture **texture, struct border_colors *class) {
|
||||
struct sway_container *output = container_parent(view->swayc, C_OUTPUT);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue