mirror of
https://github.com/labwc/labwc.git
synced 2026-04-10 08:21:07 -04:00
[draft] just a quick proof-of-concept for window-rules in support lxqt-panel
Related-to: #768
This commit is contained in:
parent
d571b0b28a
commit
ed4edd77a4
9 changed files with 96 additions and 0 deletions
|
|
@ -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_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 xdg_surface_new(struct wl_listener *listener, void *data);
|
||||||
|
|
||||||
void foreign_toplevel_handle_create(struct view *view);
|
void foreign_toplevel_handle_create(struct view *view);
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ enum node_descriptor_type {
|
||||||
LAB_NODE_DESC_NODE = 0,
|
LAB_NODE_DESC_NODE = 0,
|
||||||
LAB_NODE_DESC_VIEW,
|
LAB_NODE_DESC_VIEW,
|
||||||
LAB_NODE_DESC_XDG_POPUP,
|
LAB_NODE_DESC_XDG_POPUP,
|
||||||
|
LAB_NODE_DESC_XDG_UNMANAGED,
|
||||||
LAB_NODE_DESC_LAYER_SURFACE,
|
LAB_NODE_DESC_LAYER_SURFACE,
|
||||||
LAB_NODE_DESC_LAYER_POPUP,
|
LAB_NODE_DESC_LAYER_POPUP,
|
||||||
LAB_NODE_DESC_MENUITEM,
|
LAB_NODE_DESC_MENUITEM,
|
||||||
|
|
@ -37,6 +38,7 @@ struct node_descriptor {
|
||||||
* @data: struct to point to as follows:
|
* @data: struct to point to as follows:
|
||||||
* - LAB_NODE_DESC_VIEW struct view
|
* - LAB_NODE_DESC_VIEW struct view
|
||||||
* - LAB_NODE_DESC_XDG_POPUP 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_SURFACE struct lab_layer_surface
|
||||||
* - LAB_NODE_DESC_LAYER_POPUP struct lab_layer_popup
|
* - LAB_NODE_DESC_LAYER_POPUP struct lab_layer_popup
|
||||||
* - LAB_NODE_DESC_MENUITEM struct menuitem
|
* - LAB_NODE_DESC_MENUITEM struct menuitem
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,7 @@ void view_adjust_size(struct view *view, int *w, int *h);
|
||||||
void view_evacuate_region(struct view *view);
|
void view_evacuate_region(struct view *view);
|
||||||
void view_on_output_destroy(struct view *view);
|
void view_on_output_destroy(struct view *view);
|
||||||
void view_destroy(struct view *view);
|
void view_destroy(struct view *view);
|
||||||
|
void view_apply_rules(struct view *view);
|
||||||
|
|
||||||
/* xdg.c */
|
/* xdg.c */
|
||||||
struct wlr_xdg_surface *xdg_surface_from_view(struct view *view);
|
struct wlr_xdg_surface *xdg_surface_from_view(struct view *view);
|
||||||
|
|
|
||||||
10
include/xdg-unmanaged.h
Normal file
10
include/xdg-unmanaged.h
Normal 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 */
|
||||||
|
|
@ -348,6 +348,10 @@ get_cursor_context(struct server *server)
|
||||||
ret.surface = lab_wlr_surface_from_node(ret.node);
|
ret.surface = lab_wlr_surface_from_node(ret.node);
|
||||||
}
|
}
|
||||||
return ret;
|
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: {
|
case LAB_NODE_DESC_SSD_BUTTON: {
|
||||||
/*
|
/*
|
||||||
* Always return the top scene node for SSD
|
* Always return the top scene node for SSD
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ labwc_sources = files(
|
||||||
'xdg.c',
|
'xdg.c',
|
||||||
'xdg-deco.c',
|
'xdg-deco.c',
|
||||||
'xdg-popup.c',
|
'xdg-popup.c',
|
||||||
|
'xdg-unmanaged.c',
|
||||||
)
|
)
|
||||||
|
|
||||||
if have_xwayland
|
if have_xwayland
|
||||||
|
|
|
||||||
20
src/view.c
20
src/view.c
|
|
@ -978,6 +978,26 @@ view_get_string_prop(struct view *view, const char *prop)
|
||||||
return "";
|
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
|
void
|
||||||
view_update_title(struct view *view)
|
view_update_title(struct view *view)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
44
src/xdg-unmanaged.c
Normal file
44
src/xdg-unmanaged.c
Normal 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);
|
||||||
|
}
|
||||||
13
src/xdg.c
13
src/xdg.c
|
|
@ -6,6 +6,7 @@
|
||||||
#include "view.h"
|
#include "view.h"
|
||||||
#include "view-impl-common.h"
|
#include "view-impl-common.h"
|
||||||
#include "workspaces.h"
|
#include "workspaces.h"
|
||||||
|
#include "xdg-unmanaged.h"
|
||||||
|
|
||||||
static struct xdg_toplevel_view *
|
static struct xdg_toplevel_view *
|
||||||
xdg_toplevel_view_from_view(struct view *view)
|
xdg_toplevel_view_from_view(struct view *view)
|
||||||
|
|
@ -134,6 +135,17 @@ handle_destroy(struct wl_listener *listener, void *data)
|
||||||
view_destroy(view);
|
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
|
static void
|
||||||
handle_request_move(struct wl_listener *listener, void *data)
|
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);
|
wl_signal_add(&xdg_surface->surface->events.commit, &view->commit);
|
||||||
|
|
||||||
view_impl_map(view);
|
view_impl_map(view);
|
||||||
|
view_apply_rules(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue