diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/st.c | 86 |
1 files changed, 66 insertions, 20 deletions
@@ -32,6 +32,7 @@ #include <wchar.h> #include "arg.h" +#include "xdg-shell-unstable-v5-client-protocol.h" #include "xdg-shell-unstable-v6-client-protocol.h" char *argv0; @@ -268,7 +269,9 @@ typedef struct { struct wl_surface *surface; struct wl_buffer *buffer; struct zxdg_shell_v6 *shell; - struct zxdg_surface_v6 *xdgsurface; + struct xdg_shell *xdgshell; + struct xdg_surface *xdgsurface; + struct zxdg_surface_v6 *xdgsurface_v6; struct zxdg_toplevel_v6 *xdgtoplevel; XKB xkb; bool configured; @@ -503,10 +506,13 @@ static void ptrbutton(void *, struct wl_pointer *, uint32_t, uint32_t, uint32_t, uint32_t); static void ptraxis(void *, struct wl_pointer *, uint32_t, uint32_t, wl_fixed_t); -static void xdgshellping(void *, struct zxdg_shell_v6 *, uint32_t); -static void xdgsurfconfigure(void *, struct zxdg_surface_v6 *, uint32_t); +static void xdgshellv6ping(void *, struct zxdg_shell_v6 *, uint32_t); +static void xdgsurfv6configure(void *, struct zxdg_surface_v6 *, uint32_t); +static void xdgsurfconfigure(void *, struct xdg_surface *, int32_t, int32_t, struct wl_array*, uint32_t); +static void xdgsurfclose(void *, struct xdg_surface *); static void xdgtopconfigure(void *, struct zxdg_toplevel_v6 *, int32_t, int32_t, struct wl_array*); static void xdgtopclose(void *, struct zxdg_toplevel_v6 *); +static void xdgshellping(void *,struct xdg_shell *, uint32_t); static void datadevoffer(void *, struct wl_data_device *, struct wl_data_offer *); static void datadeventer(void *, struct wl_data_device *, uint32_t, @@ -553,11 +559,14 @@ static struct wl_keyboard_listener kbdlistener = { kbdkeymap, kbdenter, kbdleave, kbdkey, kbdmodifiers, kbdrepeatinfo }; static struct wl_pointer_listener ptrlistener = { ptrenter, ptrleave, ptrmotion, ptrbutton, ptraxis }; -static struct zxdg_shell_v6_listener xdgshelllistener = { xdgshellping }; -static struct zxdg_surface_v6_listener xdgsurflistener = - { xdgsurfconfigure }; +static struct zxdg_shell_v6_listener shell_v6_listener = { xdgshellv6ping }; +static struct zxdg_surface_v6_listener surf_v6_listener = + { xdgsurfv6configure }; +static struct xdg_shell_listener shell_listener = { xdgshellping }; +static struct xdg_surface_listener xdgsurflistener = { xdgsurfconfigure, xdgsurfclose}; + static struct zxdg_toplevel_v6_listener xdgtoplevellistener = { - xdgtopconfigure, xdgtopclose, + xdgtopconfigure, xdgtopclose }; static struct wl_data_device_listener datadevlistener = { datadevoffer, datadeventer, datadevleave, datadevmotion, datadevdrop, @@ -3257,13 +3266,19 @@ wlinit(void) wl.surface = wl_compositor_create_surface(wl.cmp); wl_surface_add_listener(wl.surface, &surflistener, NULL); - - wl.xdgsurface = zxdg_shell_v6_get_xdg_surface(wl.shell, wl.surface); - zxdg_surface_v6_add_listener(wl.xdgsurface, &xdgsurflistener, NULL); - wl.xdgtoplevel = zxdg_surface_v6_get_toplevel(wl.xdgsurface); - zxdg_toplevel_v6_add_listener(wl.xdgtoplevel, &xdgtoplevellistener, NULL); - - + if(wl.shell) + { + wl.xdgsurface_v6 = zxdg_shell_v6_get_xdg_surface(wl.shell, wl.surface); + zxdg_surface_v6_add_listener(wl.xdgsurface_v6, &surf_v6_listener, NULL); + wl.xdgtoplevel = zxdg_surface_v6_get_toplevel(wl.xdgsurface_v6); + zxdg_toplevel_v6_add_listener(wl.xdgtoplevel, &xdgtoplevellistener, NULL); + } + else + { + wl.xdgsurface = xdg_shell_get_xdg_surface(wl.xdgshell, wl.surface); + xdg_surface_add_listener(wl.xdgsurface, &xdgsurflistener, NULL); + xdg_surface_set_app_id(wl.xdgsurface, opt_class ? opt_class : termname); + } wl.xkb.ctx = xkb_context_new(0); wlresettitle(); @@ -3775,7 +3790,7 @@ regglobal(void *data, struct wl_registry *registry, uint32_t name, } else if (strcmp(interface, "zxdg_shell_v6") == 0) { wl.shell = wl_registry_bind(registry, name, &zxdg_shell_v6_interface, 1); - zxdg_shell_v6_add_listener(wl.shell, &xdgshelllistener, NULL); + zxdg_shell_v6_add_listener(wl.shell, &shell_v6_listener, NULL); } else if (strcmp(interface, "wl_shm") == 0) { wl.shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); } else if (strcmp(interface, "wl_seat") == 0) { @@ -3787,7 +3802,11 @@ regglobal(void *data, struct wl_registry *registry, uint32_t name, } else if (strcmp(interface, "wl_output") == 0) { /* bind to outputs so we can get surface enter events */ wl_registry_bind(registry, name, &wl_output_interface, 2); - } + } else if (strcmp(interface, "xdg_shell") == 0) { + wl.xdgshell = wl_registry_bind(registry, name, + &xdg_shell_interface,1); + xdg_shell_add_listener(wl.xdgshell, &shell_listener, NULL); + } } void @@ -4118,18 +4137,34 @@ ptraxis(void * data, struct wl_pointer * pointer, uint32_t time, uint32_t axis, } void -xdgshellping(void *data, struct zxdg_shell_v6 *shell, uint32_t serial) +xdgshellv6ping(void *data, struct zxdg_shell_v6 *shell, uint32_t serial) { zxdg_shell_v6_pong(shell, serial); } void -xdgsurfconfigure(void *data, struct zxdg_surface_v6 *surf, uint32_t serial) +xdgsurfv6configure(void *data, struct zxdg_surface_v6 *surf, uint32_t serial) { zxdg_surface_v6_ack_configure(surf, serial); } void +xdgshellping(void * data, struct xdg_shell * shell, uint32_t serial) +{ + xdg_shell_pong(shell, serial); +} + +void +xdgsurfconfigure(void * data, struct xdg_surface * surf, int32_t w, int32_t h, struct wl_array * states, uint32_t serial) +{ + xdg_surface_ack_configure(surf, serial); + wl.configured = true; + if (wl.h == h && wl.w == w) return; + cresize(w,h); +} + + +void xdgtopconfigure(void * data, struct zxdg_toplevel_v6 * top, int32_t w, int32_t h, struct wl_array * states) { zxdg_toplevel_v6_set_app_id(top, opt_class ? opt_class : termname); @@ -4139,14 +4174,25 @@ xdgtopconfigure(void * data, struct zxdg_toplevel_v6 * top, int32_t w, int32_t h cresize(w,h); } -void -xdgtopclose(void * data, struct zxdg_toplevel_v6 * top) +static void close_shell_and_exit() { kill(pid, SIGHUP); exit(0); } void +xdgtopclose(void * data, struct zxdg_toplevel_v6 * top) +{ + close_shell_and_exit(); +} + +void +xdgsurfclose(void * data, struct xdg_surface * surf) +{ + close_shell_and_exit(); +} + +void datadevoffer(void *data, struct wl_data_device *datadev, struct wl_data_offer *offer) { |