mirror of
https://codeberg.org/dwl/dwl.git
synced 2025-10-29 19:14:15 +00:00
Merge branch 'djpohly:main' into cursor-acceleration
This commit is contained in:
commit
736ff7c974
22
Makefile
22
Makefile
@ -11,6 +11,17 @@ LDLIBS += $(foreach p,$(PKGS),$(shell pkg-config --libs $(p)))
|
|||||||
|
|
||||||
all: dwl
|
all: dwl
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f dwl *.o *-protocol.h *-protocol.c
|
||||||
|
|
||||||
|
install: dwl
|
||||||
|
install -D dwl $(PREFIX)/bin/dwl
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
rm -f $(PREFIX)/bin/dwl
|
||||||
|
|
||||||
|
.PHONY: all clean install uninstall
|
||||||
|
|
||||||
# wayland-scanner is a tool which generates C headers and rigging for Wayland
|
# wayland-scanner is a tool which generates C headers and rigging for Wayland
|
||||||
# protocols, which are specified in XML. wlroots requires you to rig these up
|
# protocols, which are specified in XML. wlroots requires you to rig these up
|
||||||
# to your build system yourself and provide them in the include path.
|
# to your build system yourself and provide them in the include path.
|
||||||
@ -47,15 +58,6 @@ idle-protocol.o: idle-protocol.h
|
|||||||
config.h: | config.def.h
|
config.h: | config.def.h
|
||||||
cp config.def.h $@
|
cp config.def.h $@
|
||||||
|
|
||||||
dwl.o: config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h
|
dwl.o: config.mk config.h client.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h
|
||||||
|
|
||||||
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o
|
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f dwl *.o *-protocol.h *-protocol.c
|
|
||||||
|
|
||||||
install: dwl
|
|
||||||
install -D dwl $(PREFIX)/bin/dwl
|
|
||||||
|
|
||||||
.DEFAULT_GOAL=dwl
|
|
||||||
.PHONY: clean
|
|
||||||
|
|||||||
@ -37,7 +37,7 @@ Feature *non-goals* include:
|
|||||||
|
|
||||||
## Building dwl
|
## Building dwl
|
||||||
|
|
||||||
dwl has only two dependencies: wlroots 0.12 and wayland-protocols. Simply install these and run `make`. If you wish to build against a Git version of wlroots, check out the [wlroots-next branch](https://github.com/djpohly/dwl/tree/wlroots-next).
|
dwl has only two dependencies: wlroots 0.13 and wayland-protocols. Simply install these and run `make`. If you wish to build against a Git version of wlroots, check out the [wlroots-next branch](https://github.com/djpohly/dwl/tree/wlroots-next).
|
||||||
|
|
||||||
To enable XWayland, you should also install xorg-xwayland and uncomment its flag in `config.mk`.
|
To enable XWayland, you should also install xorg-xwayland and uncomment its flag in `config.mk`.
|
||||||
|
|
||||||
|
|||||||
62
dwl.c
62
dwl.c
@ -32,6 +32,7 @@
|
|||||||
#include <wlr/types/wlr_primary_selection.h>
|
#include <wlr/types/wlr_primary_selection.h>
|
||||||
#include <wlr/types/wlr_primary_selection_v1.h>
|
#include <wlr/types/wlr_primary_selection_v1.h>
|
||||||
#include <wlr/types/wlr_screencopy_v1.h>
|
#include <wlr/types/wlr_screencopy_v1.h>
|
||||||
|
#include <wlr/types/wlr_server_decoration.h>
|
||||||
#include <wlr/types/wlr_seat.h>
|
#include <wlr/types/wlr_seat.h>
|
||||||
#include <wlr/types/wlr_viewporter.h>
|
#include <wlr/types/wlr_viewporter.h>
|
||||||
#include <wlr/types/wlr_virtual_keyboard_v1.h>
|
#include <wlr/types/wlr_virtual_keyboard_v1.h>
|
||||||
@ -95,6 +96,7 @@ typedef struct {
|
|||||||
struct wl_listener map;
|
struct wl_listener map;
|
||||||
struct wl_listener unmap;
|
struct wl_listener unmap;
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
|
struct wl_listener set_title;
|
||||||
struct wl_listener fullscreen;
|
struct wl_listener fullscreen;
|
||||||
struct wlr_box geom; /* layout-relative, includes border */
|
struct wlr_box geom; /* layout-relative, includes border */
|
||||||
Monitor *mon;
|
Monitor *mon;
|
||||||
@ -228,18 +230,15 @@ static void createmon(struct wl_listener *listener, void *data);
|
|||||||
static void createnotify(struct wl_listener *listener, void *data);
|
static void createnotify(struct wl_listener *listener, void *data);
|
||||||
static void createlayersurface(struct wl_listener *listener, void *data);
|
static void createlayersurface(struct wl_listener *listener, void *data);
|
||||||
static void createpointer(struct wlr_input_device *device);
|
static void createpointer(struct wlr_input_device *device);
|
||||||
static void createxdeco(struct wl_listener *listener, void *data);
|
|
||||||
static void cursorframe(struct wl_listener *listener, void *data);
|
static void cursorframe(struct wl_listener *listener, void *data);
|
||||||
static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
|
static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
|
||||||
static void destroynotify(struct wl_listener *listener, void *data);
|
static void destroynotify(struct wl_listener *listener, void *data);
|
||||||
static void destroyxdeco(struct wl_listener *listener, void *data);
|
|
||||||
static Monitor *dirtomon(enum wlr_direction dir);
|
static Monitor *dirtomon(enum wlr_direction dir);
|
||||||
static void focusclient(Client *c, int lift);
|
static void focusclient(Client *c, int lift);
|
||||||
static void focusmon(const Arg *arg);
|
static void focusmon(const Arg *arg);
|
||||||
static void focusstack(const Arg *arg);
|
static void focusstack(const Arg *arg);
|
||||||
static void fullscreennotify(struct wl_listener *listener, void *data);
|
static void fullscreennotify(struct wl_listener *listener, void *data);
|
||||||
static Client *focustop(Monitor *m);
|
static Client *focustop(Monitor *m);
|
||||||
static void getxdecomode(struct wl_listener *listener, void *data);
|
|
||||||
static void incnmaster(const Arg *arg);
|
static void incnmaster(const Arg *arg);
|
||||||
static void inputdevice(struct wl_listener *listener, void *data);
|
static void inputdevice(struct wl_listener *listener, void *data);
|
||||||
static int keybinding(uint32_t mods, xkb_keysym_t sym);
|
static int keybinding(uint32_t mods, xkb_keysym_t sym);
|
||||||
@ -290,6 +289,7 @@ static void unmaplayersurface(LayerSurface *layersurface);
|
|||||||
static void unmaplayersurfacenotify(struct wl_listener *listener, void *data);
|
static void unmaplayersurfacenotify(struct wl_listener *listener, void *data);
|
||||||
static void unmapnotify(struct wl_listener *listener, void *data);
|
static void unmapnotify(struct wl_listener *listener, void *data);
|
||||||
static void updatemons(struct wl_listener *listener, void *data);
|
static void updatemons(struct wl_listener *listener, void *data);
|
||||||
|
static void updatetitle(struct wl_listener *listener, void *data);
|
||||||
static void view(const Arg *arg);
|
static void view(const Arg *arg);
|
||||||
static void virtualkeyboard(struct wl_listener *listener, void *data);
|
static void virtualkeyboard(struct wl_listener *listener, void *data);
|
||||||
static Client *xytoclient(double x, double y);
|
static Client *xytoclient(double x, double y);
|
||||||
@ -312,7 +312,6 @@ static struct wl_list stack; /* stacking z-order */
|
|||||||
static struct wl_list independents;
|
static struct wl_list independents;
|
||||||
static struct wlr_idle *idle;
|
static struct wlr_idle *idle;
|
||||||
static struct wlr_layer_shell_v1 *layer_shell;
|
static struct wlr_layer_shell_v1 *layer_shell;
|
||||||
static struct wlr_xdg_decoration_manager_v1 *xdeco_mgr;
|
|
||||||
static struct wlr_output_manager_v1 *output_mgr;
|
static struct wlr_output_manager_v1 *output_mgr;
|
||||||
static struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard_mgr;
|
static struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard_mgr;
|
||||||
|
|
||||||
@ -344,7 +343,6 @@ static struct wl_listener layout_change = {.notify = updatemons};
|
|||||||
static struct wl_listener new_input = {.notify = inputdevice};
|
static struct wl_listener new_input = {.notify = inputdevice};
|
||||||
static struct wl_listener new_virtual_keyboard = {.notify = virtualkeyboard};
|
static struct wl_listener new_virtual_keyboard = {.notify = virtualkeyboard};
|
||||||
static struct wl_listener new_output = {.notify = createmon};
|
static struct wl_listener new_output = {.notify = createmon};
|
||||||
static struct wl_listener new_xdeco = {.notify = createxdeco};
|
|
||||||
static struct wl_listener new_xdg_surface = {.notify = createnotify};
|
static struct wl_listener new_xdg_surface = {.notify = createnotify};
|
||||||
static struct wl_listener new_layer_shell_surface = {.notify = createlayersurface};
|
static struct wl_listener new_layer_shell_surface = {.notify = createlayersurface};
|
||||||
static struct wl_listener output_mgr_apply = {.notify = outputmgrapply};
|
static struct wl_listener output_mgr_apply = {.notify = outputmgrapply};
|
||||||
@ -895,6 +893,7 @@ createnotify(struct wl_listener *listener, void *data)
|
|||||||
LISTEN(&xdg_surface->events.map, &c->map, mapnotify);
|
LISTEN(&xdg_surface->events.map, &c->map, mapnotify);
|
||||||
LISTEN(&xdg_surface->events.unmap, &c->unmap, unmapnotify);
|
LISTEN(&xdg_surface->events.unmap, &c->unmap, unmapnotify);
|
||||||
LISTEN(&xdg_surface->events.destroy, &c->destroy, destroynotify);
|
LISTEN(&xdg_surface->events.destroy, &c->destroy, destroynotify);
|
||||||
|
LISTEN(&xdg_surface->toplevel->events.set_title, &c->set_title, updatetitle);
|
||||||
LISTEN(&xdg_surface->toplevel->events.request_fullscreen, &c->fullscreen,
|
LISTEN(&xdg_surface->toplevel->events.request_fullscreen, &c->fullscreen,
|
||||||
fullscreennotify);
|
fullscreennotify);
|
||||||
c->isfullscreen = 0;
|
c->isfullscreen = 0;
|
||||||
@ -965,18 +964,6 @@ createpointer(struct wlr_input_device *device)
|
|||||||
wlr_cursor_attach_input_device(cursor, device);
|
wlr_cursor_attach_input_device(cursor, device);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
createxdeco(struct wl_listener *listener, void *data)
|
|
||||||
{
|
|
||||||
struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
|
|
||||||
Decoration *d = wlr_deco->data = calloc(1, sizeof(*d));
|
|
||||||
|
|
||||||
LISTEN(&wlr_deco->events.request_mode, &d->request_mode, getxdecomode);
|
|
||||||
LISTEN(&wlr_deco->events.destroy, &d->destroy, destroyxdeco);
|
|
||||||
|
|
||||||
getxdecomode(&d->request_mode, wlr_deco);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cursorframe(struct wl_listener *listener, void *data)
|
cursorframe(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
@ -1017,6 +1004,7 @@ destroynotify(struct wl_listener *listener, void *data)
|
|||||||
wl_list_remove(&c->map.link);
|
wl_list_remove(&c->map.link);
|
||||||
wl_list_remove(&c->unmap.link);
|
wl_list_remove(&c->unmap.link);
|
||||||
wl_list_remove(&c->destroy.link);
|
wl_list_remove(&c->destroy.link);
|
||||||
|
wl_list_remove(&c->set_title.link);
|
||||||
wl_list_remove(&c->fullscreen.link);
|
wl_list_remove(&c->fullscreen.link);
|
||||||
#ifdef XWAYLAND
|
#ifdef XWAYLAND
|
||||||
if (c->type == X11Managed)
|
if (c->type == X11Managed)
|
||||||
@ -1027,17 +1015,6 @@ destroynotify(struct wl_listener *listener, void *data)
|
|||||||
free(c);
|
free(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
destroyxdeco(struct wl_listener *listener, void *data)
|
|
||||||
{
|
|
||||||
struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
|
|
||||||
Decoration *d = wlr_deco->data;
|
|
||||||
|
|
||||||
wl_list_remove(&d->destroy.link);
|
|
||||||
wl_list_remove(&d->request_mode.link);
|
|
||||||
free(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
togglefullscreen(const Arg *arg)
|
togglefullscreen(const Arg *arg)
|
||||||
{
|
{
|
||||||
@ -1192,14 +1169,6 @@ focustop(Monitor *m)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
getxdecomode(struct wl_listener *listener, void *data)
|
|
||||||
{
|
|
||||||
struct wlr_xdg_toplevel_decoration_v1 *wlr_deco = data;
|
|
||||||
wlr_xdg_toplevel_decoration_v1_set_mode(wlr_deco,
|
|
||||||
WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
incnmaster(const Arg *arg)
|
incnmaster(const Arg *arg)
|
||||||
{
|
{
|
||||||
@ -1278,7 +1247,7 @@ keypress(struct wl_listener *listener, void *data)
|
|||||||
wlr_idle_notify_activity(idle, seat);
|
wlr_idle_notify_activity(idle, seat);
|
||||||
|
|
||||||
/* On _press_, attempt to process a compositor keybinding. */
|
/* On _press_, attempt to process a compositor keybinding. */
|
||||||
if (event->state == WLR_KEY_PRESSED)
|
if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED)
|
||||||
for (i = 0; i < nsyms; i++)
|
for (i = 0; i < nsyms; i++)
|
||||||
handled = keybinding(mods, syms[i]) || handled;
|
handled = keybinding(mods, syms[i]) || handled;
|
||||||
|
|
||||||
@ -2004,7 +1973,7 @@ setup(void)
|
|||||||
* backend uses the renderer, for example, to fall back to software cursors
|
* backend uses the renderer, for example, to fall back to software cursors
|
||||||
* if the backend does not support hardware cursors (some older GPUs
|
* if the backend does not support hardware cursors (some older GPUs
|
||||||
* don't). */
|
* don't). */
|
||||||
if (!(backend = wlr_backend_autocreate(dpy, NULL)))
|
if (!(backend = wlr_backend_autocreate(dpy)))
|
||||||
BARF("couldn't create backend");
|
BARF("couldn't create backend");
|
||||||
|
|
||||||
/* If we don't provide a renderer, autocreate makes a GLES2 renderer for us.
|
/* If we don't provide a renderer, autocreate makes a GLES2 renderer for us.
|
||||||
@ -2058,9 +2027,11 @@ setup(void)
|
|||||||
xdg_shell = wlr_xdg_shell_create(dpy);
|
xdg_shell = wlr_xdg_shell_create(dpy);
|
||||||
wl_signal_add(&xdg_shell->events.new_surface, &new_xdg_surface);
|
wl_signal_add(&xdg_shell->events.new_surface, &new_xdg_surface);
|
||||||
|
|
||||||
/* Use xdg_decoration protocol to negotiate server-side decorations */
|
/* Use decoration protocols to negotiate server-side decorations */
|
||||||
xdeco_mgr = wlr_xdg_decoration_manager_v1_create(dpy);
|
wlr_server_decoration_manager_set_default_mode(
|
||||||
wl_signal_add(&xdeco_mgr->events.new_toplevel_decoration, &new_xdeco);
|
wlr_server_decoration_manager_create(dpy),
|
||||||
|
WLR_SERVER_DECORATION_MANAGER_MODE_SERVER);
|
||||||
|
wlr_xdg_decoration_manager_v1_create(dpy);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creates a cursor, which is a wlroots utility for tracking the cursor
|
* Creates a cursor, which is a wlroots utility for tracking the cursor
|
||||||
@ -2331,6 +2302,14 @@ updatemons(struct wl_listener *listener, void *data)
|
|||||||
wlr_output_manager_v1_set_configuration(output_mgr, config);
|
wlr_output_manager_v1_set_configuration(output_mgr, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
updatetitle(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
Client *c = wl_container_of(listener, c, set_title);
|
||||||
|
if (c == focustop(c->mon))
|
||||||
|
printstatus();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
view(const Arg *arg)
|
view(const Arg *arg)
|
||||||
{
|
{
|
||||||
@ -2467,6 +2446,7 @@ createnotifyx11(struct wl_listener *listener, void *data)
|
|||||||
activatex11);
|
activatex11);
|
||||||
LISTEN(&xwayland_surface->events.request_configure, &c->configure,
|
LISTEN(&xwayland_surface->events.request_configure, &c->configure,
|
||||||
configurex11);
|
configurex11);
|
||||||
|
LISTEN(&xwayland_surface->events.set_title, &c->set_title, updatetitle);
|
||||||
LISTEN(&xwayland_surface->events.destroy, &c->destroy, destroynotify);
|
LISTEN(&xwayland_surface->events.destroy, &c->destroy, destroynotify);
|
||||||
LISTEN(&xwayland_surface->events.request_fullscreen, &c->fullscreen,
|
LISTEN(&xwayland_surface->events.request_fullscreen, &c->fullscreen,
|
||||||
fullscreennotify);
|
fullscreennotify);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user