view: add move_to_front to struct view_impl

...to increase xwayland and xdg-shell encapsulation and to avoid passing a
function pointer as an argument in `xwayland_move_sub_views_to_front()`
which is inconsistent with labwc design patterns.

Rename view-impl.c to view-impl-common.c

Move function declarations that are common to view-implementations from
view.h into view-impl-common.h
This commit is contained in:
Johan Malm 2023-02-05 19:29:24 +00:00 committed by Johan Malm
parent 440372c2da
commit b8ec5a3e2e
10 changed files with 74 additions and 55 deletions

View file

@ -12,25 +12,16 @@
#include "workspaces.h"
#include "xwayland.h"
static void
move_to_front(struct view *view)
{
wl_list_remove(&view->link);
wl_list_insert(&view->server->views, &view->link);
wlr_scene_node_raise_to_top(&view->scene_tree->node);
}
void
desktop_move_to_front(struct view *view)
{
if (!view) {
return;
}
move_to_front(view);
#if HAVE_XWAYLAND
xwayland_move_sub_views_to_front(view, move_to_front);
#endif
cursor_update_focus(view->server);
if (view->impl->move_to_front) {
view->impl->move_to_front(view);
cursor_update_focus(view->server);
}
}
void

View file

@ -6,6 +6,7 @@
#include "key-state.h"
#include "labwc.h"
#include "regions.h"
#include "view.h"
#include "workspaces.h"
static bool should_cancel_cycling_on_next_key_release;

View file

@ -21,7 +21,7 @@ labwc_sources = files(
'touch.c',
'theme.c',
'view.c',
'view-impl.c',
'view-impl-common.c',
'workspaces.c',
'xdg.c',
'xdg-deco.c',

View file

@ -1,16 +1,24 @@
// SPDX-License-Identifier: GPL-2.0-only
/* view-impl.c: common code for shell view->impl functions */
/* view-impl-common.c: common code for shell view->impl functions */
#include <stdio.h>
#include <strings.h>
#include "labwc.h"
#include "view.h"
#include "view-impl-common.h"
void
view_impl_move_to_front(struct view *view)
{
wl_list_remove(&view->link);
wl_list_insert(&view->server->views, &view->link);
wlr_scene_node_raise_to_top(&view->scene_tree->node);
}
void
view_impl_map(struct view *view)
{
desktop_focus_and_activate_view(&view->server->seat, view);
desktop_move_to_front(view);
view_update_title(view);
view_update_app_id(view);
}

View file

@ -4,6 +4,7 @@
#include "labwc.h"
#include "node.h"
#include "view.h"
#include "view-impl-common.h"
#include "workspaces.h"
struct wlr_xdg_surface *
@ -389,6 +390,7 @@ static const struct view_impl xdg_toplevel_view_impl = {
.set_fullscreen = xdg_toplevel_view_set_fullscreen,
.unmap = xdg_toplevel_view_unmap,
.maximize = xdg_toplevel_view_maximize,
.move_to_front = view_impl_move_to_front,
};
void

View file

@ -8,6 +8,7 @@
#include "node.h"
#include "ssd.h"
#include "view.h"
#include "view-impl-common.h"
#include "workspaces.h"
#include "xwayland.h"
@ -57,40 +58,6 @@ top_parent_of(struct view *view)
return s;
}
void
xwayland_move_sub_views_to_front(struct view *parent,
void (*move_to_front)(struct view *view))
{
assert(parent);
assert(move_to_front);
if (parent->type != LAB_XWAYLAND_VIEW) {
return;
}
struct wlr_xwayland_surface *parent_xwayland_surface =
xwayland_surface_from_view(parent);
struct view *view, *next;
wl_list_for_each_reverse_safe(view, next, &parent->server->views, link)
{
/* need to stop here, otherwise loops keeps going forever */
if (view == parent) {
break;
}
if (view->type != LAB_XWAYLAND_VIEW) {
continue;
}
if (!view->mapped && !view->minimized) {
continue;
}
if (top_parent_of(view) != parent_xwayland_surface) {
continue;
}
move_to_front(view);
/* TODO: we should probably focus on these too here */
}
}
static struct xwayland_view *
xwayland_view_from_view(struct view *view)
{
@ -545,6 +512,44 @@ maximize(struct view *view, bool maximized)
maximized);
}
static void
move_sub_views_to_front(struct view *parent)
{
assert(parent);
if (parent->type != LAB_XWAYLAND_VIEW) {
return;
}
struct wlr_xwayland_surface *parent_xwayland_surface =
xwayland_surface_from_view(parent);
struct view *view, *next;
wl_list_for_each_reverse_safe(view, next, &parent->server->views, link)
{
/* need to stop here, otherwise loops keeps going forever */
if (view == parent) {
break;
}
if (view->type != LAB_XWAYLAND_VIEW) {
continue;
}
if (!view->mapped && !view->minimized) {
continue;
}
if (top_parent_of(view) != parent_xwayland_surface) {
continue;
}
view_impl_move_to_front(view);
}
}
static void
move_to_front(struct view *view)
{
view_impl_move_to_front(view);
move_sub_views_to_front(view);
}
static void
set_activated(struct view *view, bool activated)
{
@ -584,7 +589,8 @@ static const struct view_impl xwl_view_impl = {
.set_activated = set_activated,
.set_fullscreen = set_fullscreen,
.unmap = unmap,
.maximize = maximize
.maximize = maximize,
.move_to_front = move_to_front,
};
static void