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>
This commit is contained in:
Joe MacDonald 2016-04-28 12:35:51 -04:00
parent b2c32475a0
commit 3afa2b710f
2 changed files with 15 additions and 0 deletions

View File

@ -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

View File

@ -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();