diff options
| author | Michael Forney <mforney@mforney.org> | 2016-12-11 16:04:20 -0800 |
|---|---|---|
| committer | Michael Forney <mforney@mforney.org> | 2016-12-13 23:10:30 -0800 |
| commit | 293f5a93b77d92fd65db7f3d0df654f102e46cfb (patch) | |
| tree | 6ecd1170e3dd793862dd852814dc1b4cd5e44260 /desktop/dmenu | |
| parent | 9a506a6834df01a26795cea222b410f206efa9fa (diff) | |
Move to flat package hierarchy
Note to self: never try to move submodules again
To migrate your existing submodules (more or less):
set -x
set -e
mkdir .git/modules/pkg
for old in */*/src ; do
new="pkg/${old#*/}"
if ! [ -f "$old/.git" ] || [ "${old%%/*}" = pkg ] ; then
continue
fi
git -C ".git/modules/$old" config core.worktree "../../../../../$new"
rmdir "$new"
mv "$old" "$new"
sed -e "s,$old,$new," "$new/.git" > "$new/.git.tmp"
mv "$new/.git.tmp" "$new/.git"
mkdir ".git/modules/${new%/src}"
mv ".git/modules/$old" ".git/modules/$new"
rm "${old%/src}"/*.ninja
mv "${old%/src}"/*.tar.{gz,xz,bz2} "${new%/src}/"
rmdir "${old%/src}" || true
done
sed -e 's,^\[submodule "[^/]*/,[submodule "pkg/,' .git/config > .git/config.tmp
mv .git/config.tmp .git/config
Diffstat (limited to 'desktop/dmenu')
| -rw-r--r-- | desktop/dmenu/config.h | 23 | ||||
| -rw-r--r-- | desktop/dmenu/gen.rc | 32 | ||||
| -rw-r--r-- | desktop/dmenu/patch/0001-Port-to-wayland-using-wld-and-swc-panels.patch | 1234 | ||||
| -rw-r--r-- | desktop/dmenu/rev | 1 | ||||
| m--------- | desktop/dmenu/src | 0 |
5 files changed, 0 insertions, 1290 deletions
diff --git a/desktop/dmenu/config.h b/desktop/dmenu/config.h deleted file mode 100644 index 7ed23a78..00000000 --- a/desktop/dmenu/config.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "Terminus:pixelsize=14" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#999999", "#1a1a1a" }, - [SchemeSel] = { "#ffffff", "#338833" }, - [SchemeOut] = { "#000000", "#aaffaa" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/desktop/dmenu/gen.rc b/desktop/dmenu/gen.rc deleted file mode 100644 index 7500c452..00000000 --- a/desktop/dmenu/gen.rc +++ /dev/null @@ -1,32 +0,0 @@ -cflags\ - -D 'VERSION=''"4.6"''' \ - -isystem desktop/fontconfig/src\ - -isystem desktop/libxkbcommon/src\ - -isystem '$builddir'/desktop/pixman/include\ - -isystem '$builddir'/desktop/swc/include\ - -isystem '$builddir'/desktop/wayland/include\ - -isystem '$builddir'/desktop/wld/include\ - -I '$dir' - -phony deps\ - '$builddir'/desktop/^(fontconfig libxkbcommon)^/fetch.stamp\ - desktop/^(pixman swc wayland wld)^/headers - -exe dmenu -d '$dir'/deps dmenu.c drw.c util.c '$builddir'/^(\ - desktop/swc/swc-protocol.c.o\ - desktop/libxkbcommon/libxkbcommon.a\ - desktop/wld/libwld.a.d\ - desktop/fontconfig/libfontconfig.a.d\ - desktop/wayland/libwayland-client.a.d\ -) -file bin/dmenu '$outdir'/dmenu 755 -file share/man/man1/dmenu.1 '$srcdir'/dmenu.1 644 - -exe stest stest.c -file bin/stest '$outdir'/stest 755 -file share/man/man1/stest.1 '$srcdir'/stest.1 644 - -for(f in dmenu_path dmenu_run) - file bin/$f '$srcdir'/$f 755 - -fetch git diff --git a/desktop/dmenu/patch/0001-Port-to-wayland-using-wld-and-swc-panels.patch b/desktop/dmenu/patch/0001-Port-to-wayland-using-wld-and-swc-panels.patch deleted file mode 100644 index 3c059c36..00000000 --- a/desktop/dmenu/patch/0001-Port-to-wayland-using-wld-and-swc-panels.patch +++ /dev/null @@ -1,1234 +0,0 @@ -From d0d4bd1e7d5d39fe955dab33fa39d5a5115c89a7 Mon Sep 17 00:00:00 2001 -From: Michael Forney <mforney@mforney.org> -Date: Thu, 27 Oct 2016 21:04:23 -0700 -Subject: [PATCH] Port to wayland using wld and swc panels - ---- - Makefile | 16 +- - config.mk | 20 +-- - dmenu.c | 540 +++++++++++++++++++++++++++++++++----------------------------- - drw.c | 123 +++++++------- - drw.h | 26 ++- - 5 files changed, 372 insertions(+), 353 deletions(-) - -diff --git a/Makefile b/Makefile -index a7cd04f..5747934 100644 ---- a/Makefile -+++ b/Makefile -@@ -3,7 +3,7 @@ - - include config.mk - --SRC = drw.c dmenu.c stest.c util.c -+SRC = drw.c dmenu.c stest.c panel-protocol.c util.c - OBJ = ${SRC:.c=.o} - - all: options dmenu stest -@@ -22,11 +22,19 @@ config.h: - @echo creating $@ from config.def.h - @cp config.def.h $@ - --${OBJ}: arg.h config.h config.mk drw.h -+swc-protocol.c: $(SWCPROTO) -+ @echo GEN $@ -+ @wayland-scanner code < $< > $@ - --dmenu: dmenu.o drw.o util.o -+swc-client-protocol.h: $(SWCPROTO) -+ @echo GEN $@ -+ @wayland-scanner client-header < $< > $@ -+ -+${OBJ}: arg.h config.h config.mk drw.h swc-client-protocol.h -+ -+dmenu: dmenu.o drw.o swc-protocol.o util.o - @echo CC -o $@ -- @${CC} -o $@ dmenu.o drw.o util.o ${LDFLAGS} -+ @${CC} -o $@ dmenu.o drw.o swc-protocol.o util.o ${LDFLAGS} - - stest: stest.o - @echo CC -o $@ -diff --git a/config.mk b/config.mk -index 4d908a5..c6416ad 100644 ---- a/config.mk -+++ b/config.mk -@@ -5,25 +5,15 @@ VERSION = 4.6 - PREFIX = /usr/local - MANPREFIX = ${PREFIX}/share/man - --X11INC = /usr/X11R6/include --X11LIB = /usr/X11R6/lib -- --# Xinerama, comment if you don't want it --XINERAMALIBS = -lXinerama --XINERAMAFLAGS = -DXINERAMA -- --# freetype --FREETYPELIBS = -lfontconfig -lXft --FREETYPEINC = /usr/include/freetype2 --# OpenBSD (uncomment) --#FREETYPEINC = ${X11INC}/freetype2 -+PIXMANINC = /usr/include/pixman-1 -+SWCPROTO = /usr/share/swc/swc.xml - - # includes and libs --INCS = -I${X11INC} -I${FREETYPEINC} --LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -+INCS = -I${PIXMANINC} -+LIBS = -lwayland-client -lxkbcommon -lwld - - # flags --CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" - CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} - LDFLAGS = -s ${LIBS} - -diff --git a/dmenu.c b/dmenu.c -index 9278e91..9cd3c23 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -5,18 +5,18 @@ - #include <stdlib.h> - #include <string.h> - #include <strings.h> -+#include <sys/mman.h> - #include <time.h> -+#include <unistd.h> - --#include <X11/Xlib.h> --#include <X11/Xatom.h> --#include <X11/Xutil.h> --#ifdef XINERAMA --#include <X11/extensions/Xinerama.h> --#endif --#include <X11/Xft/Xft.h> -+#include <wayland-client.h> -+#include <wld/wayland.h> -+#include <wld/wld.h> -+#include <xkbcommon/xkbcommon.h> - - #include "drw.h" - #include "util.h" -+#include "swc-client-protocol.h" - - /* macros */ - #define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ -@@ -33,8 +33,16 @@ struct item { - int out; - }; - -+struct xkb { -+ struct xkb_context *context; -+ struct xkb_state *state; -+ struct xkb_keymap *keymap; -+ xkb_mod_index_t ctrl, alt, shift; -+}; -+ -+static void paste(void); -+ - static char text[BUFSIZ] = ""; --static char *embed; - static int bh, mw, mh; - static int inputw = 0, promptw; - static int lrpad; /* sum of left and right padding */ -@@ -42,12 +50,21 @@ static size_t cursor; - static struct item *items = NULL; - static struct item *matches, *matchend; - static struct item *prev, *curr, *next, *sel; --static int mon = -1, screen; -- --static Atom clip, utf8; --static Display *dpy; --static Window root, parentwin, win; --static XIC xic; -+static int mon = -1; -+ -+static struct wl_display *dpy; -+static struct wl_compositor *compositor; -+static struct wl_keyboard *kbd; -+static struct wl_seat *seat; -+static struct wl_shell *shell; -+static struct wl_surface *surface; -+static struct wl_data_device_manager *datadevman; -+static struct wl_data_device *datadev; -+static struct wl_data_offer *seloffer; -+static struct swc_screen *screen; -+static struct swc_panel_manager *panelman; -+static struct swc_panel *panel; -+static struct xkb xkb; - - static Drw *drw; - static Clr *scheme[SchemeLast]; -@@ -93,12 +110,10 @@ cleanup(void) - { - size_t i; - -- XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - drw_free(drw); -- XSync(dpy, False); -- XCloseDisplay(dpy); -+ wl_display_disconnect(dpy); - } - - static char * -@@ -132,6 +147,7 @@ drawmenu(void) - struct item *item; - int x = 0, y = 0, w; - -+ wld_set_target_surface(drw->renderer, drw->surface); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - -@@ -171,42 +187,7 @@ drawmenu(void) - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } -- drw_map(drw, win, 0, 0, mw, mh); --} -- --static void --grabfocus(void) --{ -- struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; -- Window focuswin; -- int i, revertwin; -- -- for (i = 0; i < 100; ++i) { -- XGetInputFocus(dpy, &focuswin, &revertwin); -- if (focuswin == win) -- return; -- XSetInputFocus(dpy, win, RevertToParent, CurrentTime); -- nanosleep(&ts, NULL); -- } -- die("cannot grab focus"); --} -- --static void --grabkeyboard(void) --{ -- struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; -- int i; -- -- if (embed) -- return; -- /* try to grab keyboard, we may have to wait for another process to ungrab */ -- for (i = 0; i < 1000; i++) { -- if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, -- GrabModeAsync, CurrentTime) == GrabSuccess) -- return; -- nanosleep(&ts, NULL); -- } -- die("cannot grab keyboard"); -+ drw_map(drw, surface, 0, 0, mw, mh); - } - - static void -@@ -288,88 +269,92 @@ nextrune(int inc) - } - - static void --keypress(XKeyEvent *ev) -+kbdkey(void *d, struct wl_keyboard *kbd, uint32_t serial, uint32_t time, -+ uint32_t key, uint32_t state) - { - char buf[32]; - int len; -- KeySym ksym = NoSymbol; -- Status status; -+ xkb_keysym_t ksym = XKB_KEY_NoSymbol; -+ int ctrl = xkb_state_mod_index_is_active(xkb.state, xkb.ctrl, XKB_STATE_MODS_EFFECTIVE); -+ int shift = xkb_state_mod_index_is_active(xkb.state, xkb.shift, XKB_STATE_MODS_EFFECTIVE); -+ int alt = xkb_state_mod_index_is_active(xkb.state, xkb.alt, XKB_STATE_MODS_EFFECTIVE); - -- len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); -- if (status == XBufferOverflow) -- return; -- if (ev->state & ControlMask) -+ if (state == WL_KEYBOARD_KEY_STATE_RELEASED) -+ goto update_state; -+ -+ ksym = xkb_state_key_get_one_sym(xkb.state, key + 8); -+ len = xkb_keysym_to_utf8(ksym, buf, sizeof buf) - 1; -+ if (ctrl) - switch(ksym) { -- case XK_a: ksym = XK_Home; break; -- case XK_b: ksym = XK_Left; break; -- case XK_c: ksym = XK_Escape; break; -- case XK_d: ksym = XK_Delete; break; -- case XK_e: ksym = XK_End; break; -- case XK_f: ksym = XK_Right; break; -- case XK_g: ksym = XK_Escape; break; -- case XK_h: ksym = XK_BackSpace; break; -- case XK_i: ksym = XK_Tab; break; -- case XK_j: /* fallthrough */ -- case XK_J: /* fallthrough */ -- case XK_m: /* fallthrough */ -- case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; -- case XK_n: ksym = XK_Down; break; -- case XK_p: ksym = XK_Up; break; -- -- case XK_k: /* delete right */ -+ case XKB_KEY_a: ksym = XKB_KEY_Home; break; -+ case XKB_KEY_b: ksym = XKB_KEY_Left; break; -+ case XKB_KEY_c: ksym = XKB_KEY_Escape; break; -+ case XKB_KEY_d: ksym = XKB_KEY_Delete; break; -+ case XKB_KEY_e: ksym = XKB_KEY_End; break; -+ case XKB_KEY_f: ksym = XKB_KEY_Right; break; -+ case XKB_KEY_g: ksym = XKB_KEY_Escape; break; -+ case XKB_KEY_h: ksym = XKB_KEY_BackSpace; break; -+ case XKB_KEY_i: ksym = XKB_KEY_Tab; break; -+ case XKB_KEY_j: /* fallthrough */ -+ case XKB_KEY_J: /* fallthrough */ -+ case XKB_KEY_m: /* fallthrough */ -+ case XKB_KEY_M: ksym = XKB_KEY_Return; ctrl = 0; break; -+ case XKB_KEY_n: ksym = XKB_KEY_Down; break; -+ case XKB_KEY_p: ksym = XKB_KEY_Up; break; -+ -+ case XKB_KEY_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; -- case XK_u: /* delete left */ -+ case XKB_KEY_u: /* delete left */ - insert(NULL, 0 - cursor); - break; -- case XK_w: /* delete word */ -+ case XKB_KEY_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; -- case XK_y: /* paste selection */ -- case XK_Y: -- XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, -- utf8, utf8, win, CurrentTime); -+ case XKB_KEY_y: /* paste selection */ -+ case XKB_KEY_Y: -+ paste(); - return; -- case XK_Return: -- case XK_KP_Enter: -+ case XKB_KEY_Return: -+ case XKB_KEY_KP_Enter: - break; -- case XK_bracketleft: -+ case XKB_KEY_bracketleft: - cleanup(); - exit(1); - default: - return; - } -- else if (ev->state & Mod1Mask) -+ else if (alt) - switch(ksym) { -- case XK_g: ksym = XK_Home; break; -- case XK_G: ksym = XK_End; break; -- case XK_h: ksym = XK_Up; break; -- case XK_j: ksym = XK_Next; break; -- case XK_k: ksym = XK_Prior; break; -- case XK_l: ksym = XK_Down; break; -+ case XKB_KEY_g: ksym = XKB_KEY_Home; break; -+ case XKB_KEY_G: ksym = XKB_KEY_End; break; -+ case XKB_KEY_h: ksym = XKB_KEY_Up; break; -+ case XKB_KEY_j: ksym = XKB_KEY_Next; break; -+ case XKB_KEY_k: ksym = XKB_KEY_Prior; break; -+ case XKB_KEY_l: ksym = XKB_KEY_Down; break; - default: - return; - } -- switch(ksym) { -+ switch (ksym) { - default: - if (!iscntrl(*buf)) - insert(buf, len); - break; -- case XK_Delete: -+ case XKB_KEY_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ -- case XK_BackSpace: -+ case XKB_KEY_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; -- case XK_End: -+ case XKB_KEY_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; -@@ -385,10 +370,10 @@ keypress(XKeyEvent *ev) - } - sel = matchend; - break; -- case XK_Escape: -+ case XKB_KEY_Escape: - cleanup(); - exit(1); -- case XK_Home: -+ case XKB_KEY_Home: - if (sel == matches) { - cursor = 0; - break; -@@ -396,7 +381,7 @@ keypress(XKeyEvent *ev) - sel = curr = matches; - calcoffsets(); - break; -- case XK_Left: -+ case XKB_KEY_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; -@@ -404,35 +389,35 @@ keypress(XKeyEvent *ev) - if (lines > 0) - return; - /* fallthrough */ -- case XK_Up: -+ case XKB_KEY_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; -- case XK_Next: -+ case XKB_KEY_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; -- case XK_Prior: -+ case XKB_KEY_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; -- case XK_Return: -- case XK_KP_Enter: -- puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); -- if (!(ev->state & ControlMask)) { -+ case XKB_KEY_Return: -+ case XKB_KEY_KP_Enter: -+ puts((sel && !shift) ? sel->text : text); -+ if (!ctrl) { - cleanup(); - exit(0); - } -- if (sel) -+ if(sel) - sel->out = 1; - break; -- case XK_Right: -+ case XKB_KEY_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; -@@ -440,13 +425,13 @@ keypress(XKeyEvent *ev) - if (lines > 0) - return; - /* fallthrough */ -- case XK_Down: -+ case XKB_KEY_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; -- case XK_Tab: -+ case XKB_KEY_Tab: - if (!sel) - return; - strncpy(text, sel->text, sizeof text - 1); -@@ -456,22 +441,28 @@ keypress(XKeyEvent *ev) - break; - } - drawmenu(); -+ -+update_state: -+ xkb_state_update_key(xkb.state, key + 8, -+ state == WL_KEYBOARD_KEY_STATE_PRESSED ? XKB_KEY_DOWN : XKB_KEY_UP); - } - - static void - paste(void) - { -- char *p, *q; -- int di; -- unsigned long dl; -- Atom da; -- -- /* we have been given the current selection, now insert it into input */ -- XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, -- utf8, &da, &di, &dl, &dl, (unsigned char **)&p); -- insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); -- XFree(p); -- drawmenu(); -+ int fds[2], len; -+ char buf[BUFSIZ], *nl; -+ -+ if (seloffer) { -+ pipe(fds); -+ wl_data_offer_receive(seloffer, "text/plain", fds[1]); -+ wl_display_flush(dpy); -+ close(fds[1]); -+ while((len = read(fds[0], buf, sizeof buf)) > 0) -+ insert(buf, (nl = strchr(buf, '\n')) ? nl - buf : len); -+ close(fds[0]); -+ drawmenu(); -+ } - } - - static void -@@ -506,145 +497,203 @@ readstdin(void) - static void - run(void) - { -- XEvent ev; -+ while (wl_display_dispatch(dpy) != -1) -+ ; -+} - -- while (!XNextEvent(dpy, &ev)) { -- if (XFilterEvent(&ev, win)) -- continue; -- switch(ev.type) { -- case Expose: -- if (ev.xexpose.count == 0) -- drw_map(drw, win, 0, 0, mw, mh); -- break; -- case FocusIn: -- /* regrab focus from parent window */ -- if (ev.xfocus.window != win) -- grabfocus(); -- break; -- case KeyPress: -- keypress(&ev.xkey); -- break; -- case SelectionNotify: -- if (ev.xselection.property == utf8) -- paste(); -- break; -- case VisibilityNotify: -- if (ev.xvisibility.state != VisibilityUnobscured) -- XRaiseWindow(dpy, win); -- break; -- } -+/* wayland event handlers */ -+static void -+regglobal(void *d, struct wl_registry *r, uint32_t name, const char *interface, uint32_t version) -+{ -+ if(strcmp(interface, "wl_compositor") == 0) -+ compositor = wl_registry_bind(r, name, &wl_compositor_interface, 1); -+ else if(strcmp(interface, "wl_shell") == 0) -+ shell = wl_registry_bind(r, name, &wl_shell_interface, 1); -+ else if(strcmp(interface, "wl_seat") == 0) -+ seat = wl_registry_bind(r, name, &wl_seat_interface, 1); -+ else if(strcmp(interface, "wl_data_device_manager") == 0) -+ datadevman = wl_registry_bind(r, name, &wl_data_device_manager_interface, 1); -+ else if(strcmp(interface, "swc_panel_manager") == 0) -+ panelman = wl_registry_bind(r, name, &swc_panel_manager_interface, 1); -+ else if (strcmp(interface, "swc_screen") == 0) { -+ if (mon != -1 && mon-- == 0) -+ screen = wl_registry_bind(r, name, &swc_screen_interface, 1); - } - } - - static void -+regglobalremove(void *d, struct wl_registry *reg, uint32_t name) -+{ -+} -+ -+static const struct wl_registry_listener reglistener = { regglobal, regglobalremove }; -+ -+static void -+kbdenter(void *data, struct wl_keyboard *kbd, uint32_t serial, -+ struct wl_surface *surface, struct wl_array *keys) -+{ -+} -+ -+static void -+kbdleave(void *d, struct wl_keyboard *kbd, uint32_t serial, -+ struct wl_surface *surface) -+{ -+} -+ -+/* kbdkey is defined above to reduce merge conflicts */ -+ -+static void -+kbdkeymap(void *d, struct wl_keyboard *kbd, uint32_t format, int32_t fd, uint32_t size) -+{ -+ char *string; -+ -+ if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { -+ close(fd); -+ return; -+ } -+ -+ string = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); -+ -+ if (string == MAP_FAILED) { -+ close(fd); -+ return; -+ } -+ -+ xkb.keymap = xkb_keymap_new_from_string(xkb.context, string, -+ XKB_KEYMAP_FORMAT_TEXT_V1, 0); -+ munmap(string, size); -+ close(fd); -+ xkb.state = xkb_state_new(xkb.keymap); -+ -+ xkb.ctrl = xkb_keymap_mod_get_index(xkb.keymap, XKB_MOD_NAME_CTRL); -+ xkb.alt = xkb_keymap_mod_get_index(xkb.keymap, XKB_MOD_NAME_ALT); -+ xkb.shift = xkb_keymap_mod_get_index(xkb.keymap, XKB_MOD_NAME_SHIFT); -+} -+ -+static void -+kbdmodifiers(void *d, struct wl_keyboard *kbd, uint32_t serial, uint32_t dep, -+ uint32_t lat, uint32_t lck, uint32_t grp) -+{ -+ xkb_state_update_mask(xkb.state, dep, lat, lck, grp, 0, 0); -+} -+ -+static const struct wl_keyboard_listener kbdlistener = { -+ kbdkeymap, kbdenter, kbdleave, kbdkey, kbdmodifiers, -+}; -+ -+static void -+dataofferoffer(void *d, struct wl_data_offer *offer, const char *mimetype) -+{ -+ if (strncmp(mimetype, "text/plain", 10) == 0) -+ wl_data_offer_set_user_data(offer, (void *)(uintptr_t) 1); -+} -+ -+static const struct wl_data_offer_listener dataofferlistener = { dataofferoffer }; -+ -+static void -+datadevoffer(void *d, struct wl_data_device *datadev, struct wl_data_offer *offer) -+{ -+ wl_data_offer_add_listener(offer, &dataofferlistener, NULL); -+} -+ -+static void -+datadeventer(void *d, struct wl_data_device *datadev, uint32_t serial, -+ struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, -+ struct wl_data_offer *offer) -+{ -+} -+ -+static void -+datadevleave(void *d, struct wl_data_device *datadev) -+{ -+} -+ -+static void -+datadevmotion(void *d, struct wl_data_device *datadev, uint32_t time, -+ wl_fixed_t x, wl_fixed_t y) -+{ -+} -+ -+static void -+datadevdrop(void *d, struct wl_data_device *datadev) -+{ -+} -+ -+static void -+datadevselection(void *d, struct wl_data_device *datadev, struct wl_data_offer *offer) -+{ -+ if (offer && (uintptr_t) wl_data_offer_get_user_data(offer) == 1) -+ seloffer = offer; -+} -+ -+static const struct wl_data_device_listener datadevlistener = { -+ datadevoffer, datadeventer, datadevleave, datadevmotion, datadevdrop, -+ datadevselection, -+}; -+ -+static void -+paneldocked(void *d, struct swc_panel *panel, uint32_t length) -+{ -+ mw = length; -+} -+ -+static const struct swc_panel_listener panellistener = { paneldocked }; -+ -+static void - setup(void) - { -- int x, y; -- XSetWindowAttributes swa; -- XIM xim; --#ifdef XINERAMA -- XineramaScreenInfo *info; -- Window w, pw, dw, *dws; -- XWindowAttributes wa; -- int a, j, di, n, i = 0, area = 0; -- unsigned int du; --#endif -+ if (!compositor || !seat || !panelman) -+ exit(1); -+ -+ kbd = wl_seat_get_keyboard(seat); -+ wl_keyboard_add_listener(kbd, &kbdlistener, NULL); -+ datadev = wl_data_device_manager_get_data_device(datadevman, seat); -+ wl_data_device_add_listener(datadev, &datadevlistener, NULL); -+ -+ xkb.context = xkb_context_new(0); - - /* init appearance */ - scheme[SchemeNorm] = drw_scm_create(drw, colors[SchemeNorm], 2); - scheme[SchemeSel] = drw_scm_create(drw, colors[SchemeSel], 2); - scheme[SchemeOut] = drw_scm_create(drw, colors[SchemeOut], 2); - -- clip = XInternAtom(dpy, "CLIPBOARD", False); -- utf8 = XInternAtom(dpy, "UTF8_STRING", False); -- - /* calculate menu geometry */ -- bh = drw->fonts->h + 2; -+ bh = drw->fonts->wld->height + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; --#ifdef XINERAMA -- if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { -- XGetInputFocus(dpy, &w, &di); -- if (mon >= 0 && mon < n) -- i = mon; -- else if (w != root && w != PointerRoot && w != None) { -- /* find top-level window containing current input focus */ -- do { -- if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) -- XFree(dws); -- } while (w != root && w != pw); -- /* find xinerama screen with which the window intersects most */ -- if (XGetWindowAttributes(dpy, pw, &wa)) -- for (j = 0; j < n; j++) -- if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { -- area = a; -- i = j; -- } -- } -- /* no focused window is on screen, so use pointer location instead */ -- if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) -- for (i = 0; i < n; i++) -- if (INTERSECT(x, y, 1, 1, info[i])) -- break; -- -- x = info[i].x_org; -- y = info[i].y_org + (topbar ? 0 : info[i].height - mh); -- mw = info[i].width; -- XFree(info); -- } else --#endif -- { -- if (!XGetWindowAttributes(dpy, parentwin, &wa)) -- die("could not get embedding window attributes: 0x%lx", -- parentwin); -- x = 0; -- y = topbar ? 0 : wa.height - mh; -- mw = wa.width; -- } -+ -+ /* create menu surface */ -+ surface = wl_compositor_create_surface(compositor); -+ -+ panel = swc_panel_manager_create_panel(panelman, surface); -+ swc_panel_add_listener(panel, &panellistener, NULL); -+ swc_panel_dock(panel, topbar ? SWC_PANEL_EDGE_TOP : SWC_PANEL_EDGE_BOTTOM, screen, 1); -+ -+ wl_display_roundtrip(dpy); -+ if (!mw) -+ exit(1); -+ - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = MIN(inputw, mw/3); - match(); - -- /* create menu window */ -- swa.override_redirect = True; -- swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -- swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; -- win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, -- CopyFromParent, CopyFromParent, CopyFromParent, -- CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); -- -- /* open input methods */ -- xim = XOpenIM(dpy, NULL, NULL, NULL); -- xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, -- XNClientWindow, win, XNFocusWindow, win, NULL); -- -- XMapRaised(dpy, win); -- if (embed) { -- XSelectInput(dpy, parentwin, FocusChangeMask); -- if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { -- for (i = 0; i < du && dws[i] != win; ++i) -- XSelectInput(dpy, dws[i], FocusChangeMask); -- XFree(dws); -- } -- grabfocus(); -- } -- drw_resize(drw, mw, mh); -+ drw_resize(drw, surface, mw, mh); - drawmenu(); - } - - static void - usage(void) - { -- fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" -- " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); -+ fputs("usage: dmenu [-biv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" -+ " [-nb color] [-nf color] [-sb color] [-sf color]\n", stderr); - exit(1); - } - - int - main(int argc, char *argv[]) - { -- XWindowAttributes wa; -- int i, fast = 0; -+ struct wl_registry *reg; -+ int i; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ -@@ -653,8 +702,6 @@ main(int argc, char *argv[]) - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; -- else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ -- fast = 1; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; -@@ -677,34 +724,23 @@ main(int argc, char *argv[]) - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; -- else if (!strcmp(argv[i], "-w")) /* embedding window id */ -- embed = argv[++i]; - else - usage(); - -- if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) -+ if (!setlocale(LC_CTYPE, "")) - fputs("warning: no locale support\n", stderr); -- if (!(dpy = XOpenDisplay(NULL))) -+ if (!(dpy = wl_display_connect(NULL))) - die("cannot open display"); -- screen = DefaultScreen(dpy); -- root = RootWindow(dpy, screen); -- if (!embed || !(parentwin = strtol(embed, NULL, 0))) -- parentwin = root; -- if (!XGetWindowAttributes(dpy, parentwin, &wa)) -- die("could not get embedding window attributes: 0x%lx", -- parentwin); -- drw = drw_create(dpy, screen, root, wa.width, wa.height); -+ if (!(reg = wl_display_get_registry(dpy))) -+ die("cannot get registry"); -+ wl_registry_add_listener(reg, ®listener, NULL); -+ wl_display_roundtrip(dpy); -+ drw = drw_create(dpy); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); -- lrpad = drw->fonts->h; -- -- if (fast) { -- grabkeyboard(); -- readstdin(); -- } else { -- readstdin(); -- grabkeyboard(); -- } -+ lrpad = drw->fonts->wld->height; -+ -+ readstdin(); - setup(); - run(); - -diff --git a/drw.c b/drw.c -index c1582e7..b6e6d33 100644 ---- a/drw.c -+++ b/drw.c -@@ -2,8 +2,9 @@ - #include <stdio.h> - #include <stdlib.h> - #include <string.h> --#include <X11/Xlib.h> --#include <X11/Xft/Xft.h> -+#include <wayland-client.h> -+#include <wld/wld.h> -+#include <wld/wayland.h> - - #include "drw.h" - #include "util.h" -@@ -61,40 +62,33 @@ utf8decode(const char *c, long *u, size_t clen) - } - - Drw * --drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -+drw_create(struct wl_display *dpy) - { - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; -- drw->screen = screen; -- drw->root = root; -- drw->w = w; -- drw->h = h; -- drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); -- drw->gc = XCreateGC(dpy, root, 0, NULL); -- XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); -+ drw->ctx = wld_wayland_create_context(dpy, WLD_ANY); -+ drw->renderer = wld_create_renderer(drw->ctx); -+ drw->fontctx = wld_font_create_context(); - - return drw; - } - - void --drw_resize(Drw *drw, unsigned int w, unsigned int h) -+drw_resize(Drw *drw, struct wl_surface *surface, unsigned int w, unsigned int h) - { -- if (!drw) -- return; -- -- drw->w = w; -- drw->h = h; -- if (drw->drawable) -- XFreePixmap(drw->dpy, drw->drawable); -- drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -+ if (drw->surface) -+ wld_destroy_surface(drw->surface); -+ drw->surface = wld_wayland_create_surface(drw->ctx, w, h, WLD_FORMAT_XRGB8888, 0, surface); - } - - void - drw_free(Drw *drw) - { -- XFreePixmap(drw->dpy, drw->drawable); -- XFreeGC(drw->dpy, drw->gc); -+ wld_destroy_surface(drw->surface); -+ wld_destroy_renderer(drw->renderer); -+ wld_destroy_context(drw->ctx); -+ wld_font_destroy_context(drw->fontctx); - free(drw); - } - -@@ -102,10 +96,10 @@ drw_free(Drw *drw) - * drw_fontset_create instead. - */ - static Fnt * --xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -+wldfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) - { - Fnt *font; -- XftFont *xfont = NULL; -+ struct wld_font *wld = NULL; - FcPattern *pattern = NULL; - - if (fontname) { -@@ -114,17 +108,17 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ -- if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { -+ if (!(wld = wld_font_open_name(drw->fontctx, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); -- XftFontClose(drw->dpy, xfont); -+ wld_font_close(wld); - return NULL; - } - } else if (fontpattern) { -- if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { -+ if (!(wld = wld_font_open_pattern(drw->fontctx, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } -@@ -133,22 +127,20 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) - } - - font = ecalloc(1, sizeof(Fnt)); -- font->xfont = xfont; -+ font->wld = wld; - font->pattern = pattern; -- font->h = xfont->ascent + xfont->descent; -- font->dpy = drw->dpy; - - return font; - } - - static void --xfont_free(Fnt *font) -+wldfont_free(Fnt *font) - { - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); -- XftFontClose(font->dpy, font->xfont); -+ wld_font_close(font->wld); - free(font); - } - -@@ -162,7 +154,7 @@ drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) - return NULL; - - for (i = 1; i <= fontcount; i++) { -- if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { -+ if ((cur = wldfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } -@@ -175,7 +167,7 @@ drw_fontset_free(Fnt *font) - { - if (font) { - drw_fontset_free(font->next); -- xfont_free(font); -+ wldfont_free(font); - } - } - -@@ -184,10 +176,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname) - { - if (!drw || !dest || !clrname) - return; -- -- if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), -- DefaultColormap(drw->dpy, drw->screen), -- clrname, dest)) -+ if (!(wld_lookup_named_color(clrname, dest))) - die("error, cannot allocate color '%s'", clrname); - } - -@@ -200,7 +189,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) - Clr *ret; - - /* need at least two colors for a scheme */ -- if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) -+ if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(*ret)))) - return NULL; - - for (i = 0; i < clrcount; i++) -@@ -227,11 +216,15 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int - { - if (!drw || !drw->scheme) - return; -- XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); -+ Clr color = invert ? drw->scheme[ColBg] : drw->scheme[ColFg]; - if (filled) -- XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); -- else -- XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -+ wld_fill_rectangle(drw->renderer, color, x, y, w, h); -+ else { -+ wld_fill_rectangle(drw->renderer, color, x, y, w, 1); -+ wld_fill_rectangle(drw->renderer, color, x + w - 1, y + 1, 1, h - 2); -+ wld_fill_rectangle(drw->renderer, color, x, y + 1, 1, h - 2); -+ wld_fill_rectangle(drw->renderer, color, x, y - 1, w, 1); -+ } - } - - int -@@ -240,7 +233,6 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - char buf[1024]; - int ty; - unsigned int ew; -- XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - size_t i, len; - int utf8strlen, utf8charlen, render = x || y || w || h; -@@ -249,7 +241,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; -- XftResult result; -+ FcResult result; - int charexists = 0; - - if (!drw || (render && !drw->scheme) || !text || !drw->fonts) -@@ -258,11 +250,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - if (!render) { - w = ~w; - } else { -- XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); -- XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); -- d = XftDrawCreate(drw->dpy, drw->drawable, -- DefaultVisual(drw->dpy, drw->screen), -- DefaultColormap(drw->dpy, drw->screen)); -+ wld_fill_rectangle(drw->renderer, drw->scheme[invert ? ColFg : ColBg], x, y, w, h); - x += lpad; - w -= lpad; - } -@@ -275,7 +263,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { -- charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); -+ charexists = charexists || wld_font_ensure_char(curfont->wld, utf8codepoint); - if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; -@@ -307,9 +295,9 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - ; /* NOP */ - - if (render) { -- ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; -- XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], -- usedfont->xfont, x, ty, (XftChar8 *)buf, len); -+ ty = y + (h - usedfont->wld->height) / 2 + usedfont->wld->ascent; -+ wld_draw_text(drw->renderer, usedfont->wld, drw->scheme[invert ? ColBg : ColFg], -+ x, ty, buf, len, NULL); - } - x += ew; - w -= ew; -@@ -330,7 +318,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { -- /* Refer to the comment in xfont_create for more information. */ -+ /* Refer to the comment in wldfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - -@@ -340,38 +328,37 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); -- match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); -+ match = FcFontMatch(NULL, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { -- usedfont = xfont_create(drw, NULL, match); -- if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { -+ usedfont = wldfont_create(drw, NULL, match); -+ if (usedfont && wld_font_ensure_char(usedfont->wld, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { -- xfont_free(usedfont); -+ wldfont_free(usedfont); - usedfont = drw->fonts; - } - } - } - } -- if (d) -- XftDrawDestroy(d); - - return x + (render ? w : 0); - } - - void --drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -+drw_map(Drw *drw, struct wl_surface *surface, int x, int y, unsigned int w, unsigned int h) - { - if (!drw) - return; - -- XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); -- XSync(drw->dpy, False); -+ wl_surface_damage(surface, x, y, w, h); -+ wld_flush(drw->renderer); -+ wld_swap(drw->surface); - } - - unsigned int -@@ -385,18 +372,19 @@ drw_fontset_getwidth(Drw *drw, const char *text) - void - drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) - { -- XGlyphInfo ext; -+ struct wld_extents ext; - - if (!font || !text) - return; - -- XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); -+ wld_font_text_extents_n(font->wld, text, len, &ext); - if (w) -- *w = ext.xOff; -+ *w = ext.advance; - if (h) -- *h = font->h; -+ *h = font->wld->height; - } - -+#if 0 - Cur * - drw_cur_create(Drw *drw, int shape) - { -@@ -419,3 +407,4 @@ drw_cur_free(Drw *drw, Cur *cursor) - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); - } -+#endif -diff --git a/drw.h b/drw.h -index 4c67419..1f1967e 100644 ---- a/drw.h -+++ b/drw.h -@@ -1,34 +1,30 @@ - /* See LICENSE file for copyright and license details. */ - --typedef struct { -- Cursor cursor; --} Cur; -+typedef void Cur; - - typedef struct Fnt { -- Display *dpy; -- unsigned int h; -- XftFont *xfont; -+ struct wld_font *wld; - FcPattern *pattern; - struct Fnt *next; - } Fnt; - - enum { ColFg, ColBg }; /* Clr scheme index */ --typedef XftColor Clr; -+typedef uint32_t Clr; - - typedef struct { - unsigned int w, h; -- Display *dpy; -- int screen; -- Window root; -- Drawable drawable; -- GC gc; -+ struct wl_display *dpy; -+ struct wld_context *ctx; -+ struct wld_renderer *renderer; -+ struct wld_surface *surface; -+ struct wld_font_context *fontctx; - Clr *scheme; - Fnt *fonts; - } Drw; - - /* Drawable abstraction */ --Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); --void drw_resize(Drw *drw, unsigned int w, unsigned int h); -+Drw *drw_create(struct wl_display *dpy); -+void drw_resize(Drw *drw, struct wl_surface *surface, unsigned int w, unsigned int h); - void drw_free(Drw *drw); - - /* Fnt abstraction */ -@@ -54,4 +50,4 @@ void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled - int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - - /* Map functions */ --void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); -+void drw_map(Drw *drw, struct wl_surface *surface, int x, int y, unsigned int w, unsigned int h); --- -2.10.1 - diff --git a/desktop/dmenu/rev b/desktop/dmenu/rev deleted file mode 100644 index d00491fd..00000000 --- a/desktop/dmenu/rev +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/desktop/dmenu/src b/desktop/dmenu/src deleted file mode 160000 -Subproject a9a5c6cc2d7d55ed7e556a4fe9d75307c6df2e8 |
