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 += -pipe
CFLAGS += -Wall CFLAGS += -Wall
CPPFLAGS += -D_GNU_SOURCE 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) 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 += $(shell $(PKG_CONFIG) --libs cairo xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
LIBS += -lpam LIBS += -lpam

View File

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