]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xdg/wayland-shell: handle set_app_id and set_class events
authorJohan Malm <jgm323@gmail.com>
Sat, 16 Oct 2021 20:50:56 +0000 (21:50 +0100)
committerJohan Malm <jgm323@gmail.com>
Sat, 16 Oct 2021 20:50:56 +0000 (21:50 +0100)
include/labwc.h
src/view-impl.c
src/view.c
src/xdg.c
src/xwayland.c

index 5dfebafba9b4b92bcd34e940dcd7b2b98f77b11c..03d133307f6dc92234cecce76ec610f56ebf841b 100644 (file)
@@ -259,6 +259,7 @@ struct view {
        struct wl_listener request_maximize;
        struct wl_listener request_fullscreen;
        struct wl_listener set_title;
+       struct wl_listener set_app_id;          /* class on xwayland */
        struct wl_listener new_popup;           /* xdg-shell only */
        struct wl_listener new_subsurface;      /* xdg-shell only */
 };
@@ -337,6 +338,7 @@ void view_for_each_popup_surface(struct view *view,
        wlr_surface_iterator_func_t iterator, void *data);
 void view_move_to_edge(struct view *view, const char *direction);
 void view_update_title(struct view *view);
+void view_update_app_id(struct view *view);
 
 void view_impl_map(struct view *view);
 
index f92d5d40515880df39773798647bc6b1f9e79581..8b948b129e859cf72dfb2ac3e21e05d9b5b74fa7 100644 (file)
@@ -10,13 +10,8 @@ view_impl_map(struct view *view)
        desktop_focus_and_activate_view(&view->server->seat, view);
        desktop_raise_view(view);
 
-       const char *app_id = view->impl->get_string_prop(view, "app_id");
-       if (app_id) {
-               wlr_foreign_toplevel_handle_v1_set_app_id(
-                       view->toplevel_handle, app_id);
-       }
-
        view_update_title(view);
+       view_update_app_id(view);
 
        damage_all_outputs(view->server);
 }
index 3a9c4a33629a667a9df2d054eb90cf6f8d749058..35c6e6bd5a00a3c8ad345cc8c91bf6550bad3a49 100644 (file)
@@ -242,3 +242,14 @@ view_update_title(struct view *view)
        ssd_update_title(view);
        wlr_foreign_toplevel_handle_v1_set_title(view->toplevel_handle, title);
 }
+
+void
+view_update_app_id(struct view *view)
+{
+       const char *app_id = view->impl->get_string_prop(view, "app_id");
+       if (!view->toplevel_handle || !app_id) {
+               return;
+       }
+       wlr_foreign_toplevel_handle_v1_set_app_id(
+               view->toplevel_handle, app_id);
+}
index 18a0e843cb9ce72a87e73a8957328e1e3eb321bc..0b9deefe938cb7ea68112cf99bd29a3da5f6000c 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -160,6 +160,14 @@ handle_set_title(struct wl_listener *listener, void *data)
        view_update_title(view);
 }
 
+static void
+handle_set_app_id(struct wl_listener *listener, void *data)
+{
+       struct view *view = wl_container_of(listener, view, set_app_id);
+       assert(view);
+       view_update_app_id(view);
+}
+
 static void
 xdg_toplevel_view_configure(struct view *view, struct wlr_box geo)
 {
@@ -408,8 +416,12 @@ xdg_surface_new(struct wl_listener *listener, void *data)
        view->request_fullscreen.notify = handle_request_fullscreen;
        wl_signal_add(&toplevel->events.request_fullscreen,
                &view->request_fullscreen);
+
        view->set_title.notify = handle_set_title;
        wl_signal_add(&toplevel->events.set_title, &view->set_title);
 
+       view->set_app_id.notify = handle_set_app_id;
+       wl_signal_add(&toplevel->events.set_app_id, &view->set_app_id);
+
        wl_list_insert(&server->views, &view->link);
 }
index bd17c55d02c368e1f6e30c5111e5e3e4784b7e78..6e08fc46f58284c3e8117e1652700aad2b34e489 100644 (file)
@@ -93,6 +93,14 @@ handle_set_title(struct wl_listener *listener, void *data)
        view_update_title(view);
 }
 
+static void
+handle_set_class(struct wl_listener *listener, void *data)
+{
+       struct view *view = wl_container_of(listener, view, set_app_id);
+       assert(view);
+       view_update_app_id(view);
+}
+
 static void
 configure(struct view *view, struct wlr_box geo)
 {
@@ -300,8 +308,12 @@ xwayland_surface_new(struct wl_listener *listener, void *data)
        view->request_fullscreen.notify = handle_request_fullscreen;
        wl_signal_add(&xsurface->events.request_fullscreen,
                &view->request_fullscreen);
+
        view->set_title.notify = handle_set_title;
        wl_signal_add(&xsurface->events.set_title, &view->set_title);
 
+       view->set_app_id.notify = handle_set_class;
+       wl_signal_add(&xsurface->events.set_class, &view->set_app_id);
+
        wl_list_insert(&view->server->views, &view->link);
 }