Fix group operations for multi monitor
Group operations tend to break with multiple outputs and some frankly do not make a lot of sense. * `raise` and `lower` group may and up looping * `group-only` should clear all workspaces
This commit is contained in:
parent
b8b7fed92f
commit
b084a678fb
|
@ -199,6 +199,18 @@ hikari_server_find_group(const char *group_name);
|
|||
struct hikari_group *
|
||||
hikari_server_find_or_create_group(const char *group_name);
|
||||
|
||||
void
|
||||
hikari_server_raise_group(void *arg);
|
||||
|
||||
void
|
||||
hikari_server_lower_group(void *arg);
|
||||
|
||||
void
|
||||
hikari_server_hide_group(void *arg);
|
||||
|
||||
void
|
||||
hikari_server_only_group(void *arg);
|
||||
|
||||
#define SHEET_ACTIONS(n) \
|
||||
static inline void hikari_server_display_sheet_##n(void *arg) \
|
||||
{ \
|
||||
|
@ -348,14 +360,10 @@ WORKSPACE_ACTION(toggle_view_floating)
|
|||
WORKSPACE_ACTION(toggle_view_invisible)
|
||||
WORKSPACE_ACTION(toggle_view_public)
|
||||
WORKSPACE_ACTION(only_view)
|
||||
WORKSPACE_ACTION(only_group)
|
||||
WORKSPACE_ACTION(hide_view)
|
||||
WORKSPACE_ACTION(hide_group)
|
||||
WORKSPACE_ACTION(sheet_show_group)
|
||||
WORKSPACE_ACTION(raise_view)
|
||||
WORKSPACE_ACTION(raise_group)
|
||||
WORKSPACE_ACTION(lower_view)
|
||||
WORKSPACE_ACTION(lower_group)
|
||||
WORKSPACE_ACTION(show_invisible_sheet_views)
|
||||
WORKSPACE_ACTION(reset_view_geometry)
|
||||
WORKSPACE_ACTION(quit_view)
|
||||
|
|
|
@ -137,17 +137,13 @@ WORKSPACE_ACTION(switch_to_prev_sheet)
|
|||
WORKSPACE_ACTION(switch_to_next_inhabited_sheet)
|
||||
WORKSPACE_ACTION(switch_to_prev_inhabited_sheet)
|
||||
WORKSPACE_ACTION(raise_view)
|
||||
WORKSPACE_ACTION(raise_group)
|
||||
WORKSPACE_ACTION(lower_view)
|
||||
WORKSPACE_ACTION(lower_group)
|
||||
WORKSPACE_ACTION(hide_view)
|
||||
WORKSPACE_ACTION(hide_group)
|
||||
WORKSPACE_ACTION(snap_view_up)
|
||||
WORKSPACE_ACTION(snap_view_down)
|
||||
WORKSPACE_ACTION(snap_view_left)
|
||||
WORKSPACE_ACTION(snap_view_right)
|
||||
WORKSPACE_ACTION(only_view)
|
||||
WORKSPACE_ACTION(only_group)
|
||||
WORKSPACE_ACTION(pin_view_to_sheet_0)
|
||||
WORKSPACE_ACTION(pin_view_to_sheet_1)
|
||||
WORKSPACE_ACTION(pin_view_to_sheet_2)
|
||||
|
|
37
src/group.c
37
src/group.c
|
@ -51,19 +51,17 @@ hikari_group_raise(struct hikari_group *group, struct hikari_view *top)
|
|||
assert(group != NULL);
|
||||
assert(top != NULL);
|
||||
|
||||
struct hikari_view *view, *view_temp, *first = NULL;
|
||||
hikari_view_raise(top);
|
||||
|
||||
struct hikari_view *view, *view_temp;
|
||||
wl_list_for_each_reverse_safe (
|
||||
view, view_temp, &group->visible_views, visible_group_views) {
|
||||
assert(!hikari_view_is_hidden(view));
|
||||
|
||||
if (view == first) {
|
||||
break;
|
||||
} else if (first == NULL) {
|
||||
first = view;
|
||||
}
|
||||
|
||||
if (view != top) {
|
||||
hikari_view_raise(view);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,21 +71,20 @@ hikari_group_raise(struct hikari_group *group, struct hikari_view *top)
|
|||
void
|
||||
hikari_group_lower(struct hikari_group *group, struct hikari_view *top)
|
||||
{
|
||||
assert(group != NULL);
|
||||
assert(top != NULL);
|
||||
|
||||
hikari_view_lower(top);
|
||||
|
||||
struct hikari_view *view, *view_temp, *first = NULL;
|
||||
struct hikari_view *view, *view_temp;
|
||||
wl_list_for_each_safe (
|
||||
view, view_temp, &group->visible_views, visible_group_views) {
|
||||
assert(!hikari_view_is_hidden(view));
|
||||
|
||||
if (view == first) {
|
||||
break;
|
||||
} else if (first == NULL) {
|
||||
first = view;
|
||||
}
|
||||
|
||||
if (view != top) {
|
||||
hikari_view_lower(view);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -104,17 +101,13 @@ hikari_group_damage(struct hikari_group *group)
|
|||
void
|
||||
hikari_group_show(struct hikari_group *group)
|
||||
{
|
||||
struct hikari_view *view, *view_temp, *top = NULL;
|
||||
struct hikari_view *view, *view_temp;
|
||||
wl_list_for_each_reverse_safe (view, view_temp, &group->views, group_views) {
|
||||
if (top == view) {
|
||||
if (hikari_view_is_hidden(view)) {
|
||||
hikari_view_show(view);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
if (top == NULL) {
|
||||
top = view;
|
||||
}
|
||||
|
||||
hikari_view_show(view);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
65
src/server.c
65
src/server.c
|
@ -1561,6 +1561,71 @@ hikari_server_increase_view_size_left(void *arg)
|
|||
move_resize_view(-step, 0, step, 0);
|
||||
}
|
||||
|
||||
void
|
||||
hikari_server_lower_group(void *arg)
|
||||
{
|
||||
struct hikari_view *focus_view = hikari_server.workspace->focus_view;
|
||||
|
||||
if (focus_view == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
|
||||
hikari_group_lower(group, focus_view);
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
void
|
||||
hikari_server_raise_group(void *arg)
|
||||
{
|
||||
struct hikari_view *focus_view = hikari_server.workspace->focus_view;
|
||||
|
||||
if (focus_view == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
|
||||
hikari_group_raise(group, focus_view);
|
||||
}
|
||||
|
||||
void
|
||||
hikari_server_only_group(void *arg)
|
||||
{
|
||||
struct hikari_view *focus_view = hikari_server.workspace->focus_view;
|
||||
|
||||
if (focus_view == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
|
||||
struct hikari_output *output;
|
||||
wl_list_for_each (output, &hikari_server.outputs, server_outputs) {
|
||||
hikari_workspace_clear(output->workspace);
|
||||
}
|
||||
|
||||
hikari_group_show(group);
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
void
|
||||
hikari_server_hide_group(void *arg)
|
||||
{
|
||||
struct hikari_view *focus_view = hikari_server.workspace->focus_view;
|
||||
|
||||
if (focus_view == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
assert(group != NULL);
|
||||
|
||||
hikari_group_hide(group);
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
void
|
||||
hikari_server_toggle_damage_tracking(void *arg)
|
||||
|
|
12
src/sheet.c
12
src/sheet.c
|
@ -440,19 +440,15 @@ hikari_sheet_is_visible(struct hikari_sheet *sheet)
|
|||
|
||||
#define SHOW_VIEWS(cond) \
|
||||
{ \
|
||||
struct hikari_view *view, *view_temp, *top = NULL; \
|
||||
struct hikari_view *view, *view_temp; \
|
||||
wl_list_for_each_reverse_safe ( \
|
||||
view, view_temp, &sheet->views, sheet_views) { \
|
||||
if (cond) { \
|
||||
if (top == view) { \
|
||||
if (hikari_view_is_hidden(view)) { \
|
||||
hikari_view_show(view); \
|
||||
} else { \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (top == NULL) { \
|
||||
top = view; \
|
||||
} \
|
||||
\
|
||||
hikari_view_show(view); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
|
|
@ -444,15 +444,6 @@ hikari_workspace_raise_view(struct hikari_workspace *workspace)
|
|||
hikari_indicator_damage(&hikari_server.indicator, focus_view);
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_raise_group(struct hikari_workspace *workspace)
|
||||
{
|
||||
FOCUS_GUARD(workspace, focus_view);
|
||||
|
||||
hikari_group_raise(focus_view->group, focus_view);
|
||||
hikari_indicator_damage(&hikari_server.indicator, focus_view);
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_lower_view(struct hikari_workspace *workspace)
|
||||
{
|
||||
|
@ -470,17 +461,6 @@ hikari_workspace_lower_view(struct hikari_workspace *workspace)
|
|||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_lower_group(struct hikari_workspace *workspace)
|
||||
{
|
||||
FOCUS_GUARD(workspace, focus_view);
|
||||
|
||||
hikari_group_lower(focus_view->group, focus_view);
|
||||
hikari_indicator_damage(&hikari_server.indicator, focus_view);
|
||||
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_hide_view(struct hikari_workspace *workspace)
|
||||
{
|
||||
|
@ -903,21 +883,6 @@ hikari_workspace_exchange_main_layout_view(struct hikari_workspace *workspace)
|
|||
hikari_view_center_cursor(first);
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_only_group(struct hikari_workspace *workspace)
|
||||
{
|
||||
FOCUS_GUARD(workspace, focus_view);
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
|
||||
struct hikari_view *view = NULL, *view_temp = NULL;
|
||||
wl_list_for_each_safe (view, view_temp, &workspace->views, workspace_views) {
|
||||
if (view->group != group) {
|
||||
hikari_view_hide(view);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_sheet_show_group(struct hikari_workspace *workspace)
|
||||
{
|
||||
|
@ -930,32 +895,17 @@ hikari_workspace_sheet_show_group(struct hikari_workspace *workspace)
|
|||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
void
|
||||
hikari_workspace_show_group(struct hikari_workspace *workspace)
|
||||
{
|
||||
FOCUS_GUARD(workspace, focus_view);
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
hikari_workspace_clear(workspace);
|
||||
hikari_group_show(group);
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
|
||||
#define SHOW_VIEWS(cond) \
|
||||
{ \
|
||||
struct hikari_view *view, *view_temp, *top = NULL; \
|
||||
struct hikari_view *view, *view_temp; \
|
||||
wl_list_for_each_reverse_safe ( \
|
||||
view, view_temp, &workspace->output->views, output_views) { \
|
||||
if (cond) { \
|
||||
if (top == view) { \
|
||||
if (hikari_view_is_hidden(view)) { \
|
||||
hikari_view_show(view); \
|
||||
} else { \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (top == NULL) { \
|
||||
top = view; \
|
||||
} \
|
||||
\
|
||||
hikari_view_show(view); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
@ -975,17 +925,18 @@ hikari_workspace_show_invisible(struct hikari_workspace *workspace)
|
|||
SHOW_VIEWS(hikari_view_is_invisible(view));
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
#undef SHOW_VIEWS
|
||||
|
||||
void
|
||||
hikari_workspace_hide_group(struct hikari_workspace *workspace)
|
||||
hikari_workspace_show_group(struct hikari_workspace *workspace)
|
||||
{
|
||||
FOCUS_GUARD(workspace, focus_view);
|
||||
|
||||
struct hikari_group *group = focus_view->group;
|
||||
hikari_group_hide(group);
|
||||
hikari_workspace_clear(workspace);
|
||||
SHOW_VIEWS(view->group == group);
|
||||
hikari_server_cursor_focus();
|
||||
}
|
||||
#undef SHOW_VIEWS
|
||||
|
||||
void
|
||||
hikari_workspace_show_all_sheet_views(struct hikari_workspace *workspace)
|
||||
|
|
Loading…
Reference in New Issue