Browse Source

compose: make usage of xkbcompose optional

Older versions of libxkbcommon-dev (in Debian / Ubuntu) don't provide
xkbcommon-compose.h and the accompanying API.  Detect whether the header
file is present when building and if not, revert to the behaviour prior to
ef3ef30400, the commit that introduced the
usage of that header.

Signed-off-by: Joe MacDonald <joe_macdonald@mentor.com>
master
Joe MacDonald 9 years ago
parent
commit
3afa2b710f
  1. 1
      Makefile
  2. 14
      i3lock.c

1
Makefile

@ -13,6 +13,7 @@ CFLAGS += -std=c99
CFLAGS += -pipe
CFLAGS += -Wall
CPPFLAGS += -D_GNU_SOURCE
CPPFLAGS += -DXKBCOMPOSE=$(shell if test -e /usr/include/xkbcommon/xkbcommon-compose.h ; then echo 1 ; else echo 0 ; fi )
CFLAGS += $(shell $(PKG_CONFIG) --cflags cairo xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
LIBS += $(shell $(PKG_CONFIG) --libs cairo xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
LIBS += -lpam

14
i3lock.c

@ -24,7 +24,9 @@
#include <ev.h>
#include <sys/mman.h>
#include <xkbcommon/xkbcommon.h>
#if XKBCOMPOSE == 1
#include <xkbcommon/xkbcommon-compose.h>
#endif
#include <xkbcommon/xkbcommon-x11.h>
#include <cairo.h>
#include <cairo/cairo-xcb.h>
@ -88,8 +90,10 @@ bool show_failed_attempts = false;
static struct xkb_state *xkb_state;
static struct xkb_context *xkb_context;
static struct xkb_keymap *xkb_keymap;
#if XKBCOMPOSE == 1
static struct xkb_compose_table *xkb_compose_table;
static struct xkb_compose_state *xkb_compose_state;
#endif
static uint8_t xkb_base_event;
static uint8_t xkb_base_error;
@ -145,6 +149,7 @@ static bool load_keymap(void) {
return true;
}
#if XKBCOMPOSE == 1
/*
* Loads the XKB compose table from the given locale.
*
@ -168,6 +173,7 @@ static bool load_compose_table(const char *locale) {
return true;
}
#endif /* XKBCOMPOSE */
/*
* Clears the memory which stored the password to be a bit safer against
@ -353,7 +359,9 @@ static void handle_key_press(xcb_key_press_event_t *event) {
char buffer[128];
int n;
bool ctrl;
#if XKBCOMPOSE == 1
bool composed = false;
#endif
ksym = xkb_state_key_get_one_sym(xkb_state, event->detail);
ctrl = xkb_state_mod_name_is_active(xkb_state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_DEPRESSED);
@ -361,6 +369,7 @@ static void handle_key_press(xcb_key_press_event_t *event) {
/* The buffer will be null-terminated, so n >= 2 for 1 actual character. */
memset(buffer, '\0', sizeof(buffer));
#if XKBCOMPOSE == 1
if (xkb_compose_state && xkb_compose_state_feed(xkb_compose_state, ksym) == XKB_COMPOSE_FEED_ACCEPTED) {
switch (xkb_compose_state_get_status(xkb_compose_state)) {
case XKB_COMPOSE_NOTHING:
@ -383,6 +392,9 @@ static void handle_key_press(xcb_key_press_event_t *event) {
if (!composed) {
n = xkb_keysym_to_utf8(ksym, buffer, sizeof(buffer));
}
#else
n = xkb_keysym_to_utf8(ksym, buffer, sizeof(buffer));
#endif
switch (ksym) {
case XKB_KEY_Return:
@ -1060,6 +1072,7 @@ int main(int argc, char *argv[]) {
if (!load_keymap())
errx(EXIT_FAILURE, "Could not load keymap");
#if XKBCOMPOSE == 1
const char *locale = getenv("LC_ALL");
if (!locale)
locale = getenv("LC_CTYPE");
@ -1072,6 +1085,7 @@ int main(int argc, char *argv[]) {
}
load_compose_table(locale);
#endif
xinerama_init();
xinerama_query_screens();

Loading…
Cancel
Save