[draft] just a quick proof-of-concept for window-rules in support lxqt-panel

Related-to: #768
This commit is contained in:
Johan Malm 2023-02-17 22:31:55 +00:00
parent d571b0b28a
commit ed4edd77a4
9 changed files with 96 additions and 0 deletions

View file

@ -348,6 +348,7 @@ void xdg_toplevel_decoration(struct wl_listener *listener, void *data);
void xdg_activation_handle_request(struct wl_listener *listener, void *data);
void xdg_toplevel_view_convert_to_unmanaged(struct view *view);
void xdg_surface_new(struct wl_listener *listener, void *data);
void foreign_toplevel_handle_create(struct view *view);

View file

@ -13,6 +13,7 @@ enum node_descriptor_type {
LAB_NODE_DESC_NODE = 0,
LAB_NODE_DESC_VIEW,
LAB_NODE_DESC_XDG_POPUP,
LAB_NODE_DESC_XDG_UNMANAGED,
LAB_NODE_DESC_LAYER_SURFACE,
LAB_NODE_DESC_LAYER_POPUP,
LAB_NODE_DESC_MENUITEM,
@ -37,6 +38,7 @@ struct node_descriptor {
* @data: struct to point to as follows:
* - LAB_NODE_DESC_VIEW struct view
* - LAB_NODE_DESC_XDG_POPUP struct view
* - LAB_NODE_DESC_XDG_UNMANAGED struct xdg_unmanaged
* - LAB_NODE_DESC_LAYER_SURFACE struct lab_layer_surface
* - LAB_NODE_DESC_LAYER_POPUP struct lab_layer_popup
* - LAB_NODE_DESC_MENUITEM struct menuitem

View file

@ -167,6 +167,7 @@ void view_adjust_size(struct view *view, int *w, int *h);
void view_evacuate_region(struct view *view);
void view_on_output_destroy(struct view *view);
void view_destroy(struct view *view);
void view_apply_rules(struct view *view);
/* xdg.c */
struct wlr_xdg_surface *xdg_surface_from_view(struct view *view);

10
include/xdg-unmanaged.h Normal file
View file

@ -0,0 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef __LABWC_XDG_UNMANAGED
#define __LABWC_XDG_UNMANAGED
struct server;
struct wlr_xdg_surface;
void xdg_unmanaged_create(struct server *server, struct wlr_xdg_surface *wlr_xdg_surface);
#endif /* __LABWC_XDG_UNMANAGED */

View file

@ -348,6 +348,10 @@ get_cursor_context(struct server *server)
ret.surface = lab_wlr_surface_from_node(ret.node);
}
return ret;
case LAB_NODE_DESC_XDG_UNMANAGED:
ret.type = LAB_SSD_CLIENT;
ret.surface = lab_wlr_surface_from_node(ret.node);
return ret;
case LAB_NODE_DESC_SSD_BUTTON: {
/*
* Always return the top scene node for SSD

View file

@ -26,6 +26,7 @@ labwc_sources = files(
'xdg.c',
'xdg-deco.c',
'xdg-popup.c',
'xdg-unmanaged.c',
)
if have_xwayland

View file

@ -978,6 +978,26 @@ view_get_string_prop(struct view *view, const char *prop)
return "";
}
void
view_apply_rules(struct view *view)
{
if (!view->mapped) {
return;
}
/* TODO: read rc.xml <applications> element */
const char *title = view_get_string_prop(view, "title");
if (title && !strcmp(title, "lxqt-panel")) {
xdg_toplevel_view_convert_to_unmanaged(view);
return;
}
const char *app_id = view_get_string_prop(view, "app_id");
if (app_id && !strcmp(app_id, "lxqt-panel")) {
xdg_toplevel_view_convert_to_unmanaged(view);
return;
}
}
void
view_update_title(struct view *view)
{

44
src/xdg-unmanaged.c Normal file
View file

@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-2.0-only
#include <assert.h>
#include "common/mem.h"
#include "labwc.h"
#include "node.h"
#include "view.h"
#include "view-impl-common.h"
#include "workspaces.h"
#include "xdg-unmanaged.h"
struct xdg_unmanaged {
struct server *server;
struct wlr_xdg_surface *wlr_xdg_surface;
struct wlr_scene_tree *tree;
struct wlr_scene_node *node;
struct wl_listener destroy;
};
static void
unmanaged_handle_destroy(struct wl_listener *listener, void *data)
{
struct xdg_unmanaged *unmanaged = wl_container_of(listener, unmanaged, destroy);
wl_list_remove(&unmanaged->destroy.link);
free(unmanaged);
}
void
xdg_unmanaged_create(struct server *server, struct wlr_xdg_surface *wlr_xdg_surface)
{
struct xdg_unmanaged *unmanaged = znew(*unmanaged);
unmanaged->server = server;
unmanaged->wlr_xdg_surface = wlr_xdg_surface;
unmanaged->destroy.notify = unmanaged_handle_destroy;
wl_signal_add(&wlr_xdg_surface->events.destroy, &unmanaged->destroy);
unmanaged->tree = server->view_tree_always_on_top;
unmanaged->node = &wlr_scene_surface_create(unmanaged->tree,
wlr_xdg_surface->surface)->buffer->node;
node_descriptor_create(unmanaged->node, LAB_NODE_DESC_XDG_UNMANAGED, unmanaged);
wlr_scene_node_set_position(unmanaged->node, 0, 0);
cursor_update_focus(unmanaged->server);
}

View file

@ -6,6 +6,7 @@
#include "view.h"
#include "view-impl-common.h"
#include "workspaces.h"
#include "xdg-unmanaged.h"
static struct xdg_toplevel_view *
xdg_toplevel_view_from_view(struct view *view)
@ -134,6 +135,17 @@ handle_destroy(struct wl_listener *listener, void *data)
view_destroy(view);
}
void
xdg_toplevel_view_convert_to_unmanaged(struct view *view)
{
struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view);
struct server *server = view->server;
handle_unmap(&view->unmap, xdg_surface);
handle_destroy(&view->destroy, xdg_surface);
xdg_unmanaged_create(server, xdg_surface);
}
static void
handle_request_move(struct wl_listener *listener, void *data)
{
@ -375,6 +387,7 @@ xdg_toplevel_view_map(struct view *view)
wl_signal_add(&xdg_surface->surface->events.commit, &view->commit);
view_impl_map(view);
view_apply_rules(view);
}
static void