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:
raichoo 2020-09-14 12:35:09 +00:00
parent b8b7fed92f
commit b084a678fb
6 changed files with 104 additions and 95 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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)

View File

@ -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); \
} \
} \
}

View File

@ -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)