aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/st.c86
1 files changed, 66 insertions, 20 deletions
diff --git a/src/st.c b/src/st.c
index 9a59dca..93b56c3 100644
--- a/src/st.c
+++ b/src/st.c
@@ -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)
{