mirror of
https://github.com/labwc/labwc.git
synced 2026-05-05 06:47:34 -04:00
Add Next/PreviousWindowImmediate to switch windows without OSD
Some checks failed
labwc.github.io / notify (push) Has been cancelled
Some checks failed
labwc.github.io / notify (push) Has been cancelled
Co-authored-by: @johanmalm
This commit is contained in:
parent
bc7498dc6f
commit
6ce25978e7
7 changed files with 94 additions and 9 deletions
|
|
@ -322,6 +322,61 @@ handle_osd_tree_destroy(struct wl_listener *listener, void *data)
|
|||
free(osd_output);
|
||||
}
|
||||
|
||||
static struct wl_list *prev(struct wl_list *elm) { return elm->prev; }
|
||||
static struct wl_list *next(struct wl_list *elm) { return elm->next; }
|
||||
|
||||
void
|
||||
cycle_immediate(enum lab_cycle_dir direction, struct cycle_filter filter)
|
||||
{
|
||||
if (wl_list_empty(&server.views)) {
|
||||
return;
|
||||
}
|
||||
enum lab_view_criteria criteria =
|
||||
LAB_VIEW_CRITERIA_NO_SKIP_WINDOW_SWITCHER
|
||||
| LAB_VIEW_CRITERIA_NO_DIALOG;
|
||||
if (filter.workspace == CYCLE_WORKSPACE_CURRENT) {
|
||||
criteria |= LAB_VIEW_CRITERIA_CURRENT_WORKSPACE;
|
||||
}
|
||||
uint64_t cycle_outputs = get_outputs_by_filter(filter.output);
|
||||
const char *cycle_app_id = NULL;
|
||||
if (filter.app_id == CYCLE_APP_ID_CURRENT && server.active_view) {
|
||||
cycle_app_id = server.active_view->app_id;
|
||||
}
|
||||
|
||||
struct wl_list *head = &server.views;
|
||||
struct wl_list *(*iter)(struct wl_list *list);
|
||||
iter = direction == LAB_CYCLE_DIR_FORWARD ? next : prev;
|
||||
|
||||
struct wl_list *from = (direction == LAB_CYCLE_DIR_FORWARD) && server.active_view
|
||||
? &server.active_view->link : head;
|
||||
|
||||
for (struct wl_list *elm = iter(from); elm != head; elm = iter(elm)) {
|
||||
struct view *view = wl_container_of(elm, view, link);
|
||||
if (!view_matches_criteria(view, criteria)) {
|
||||
continue;
|
||||
}
|
||||
if (filter.output != CYCLE_OUTPUT_ALL) {
|
||||
if (!view->output || !(cycle_outputs & view->output->id_bit)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (cycle_app_id && strcmp(view->app_id, cycle_app_id) != 0) {
|
||||
continue;
|
||||
}
|
||||
if (server.active_view && direction == LAB_CYCLE_DIR_FORWARD) {
|
||||
/*
|
||||
* When cycling forward, the current active view needs to be
|
||||
* sent to back to keep the same sequence and avoid getting
|
||||
* stuck in the 2 topmost views.
|
||||
*/
|
||||
view_move_to_back(server.active_view);
|
||||
}
|
||||
desktop_focus_view(view, true);
|
||||
break;
|
||||
}
|
||||
cursor_update_focus();
|
||||
}
|
||||
|
||||
/* Return false on failure */
|
||||
static bool
|
||||
init_cycle(struct cycle_filter filter)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue