X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fidev.h;h=c8c03f3d41be9937182fb184252f46e0f0fda544;hb=a9944163fe5600bce85898dae78cd68442a6ff7c;hp=0ae044cfd57d8c654976835054b24eea4a8a8a15;hpb=e06cc7b07465369fb7c01c9778b84cf82c82fdcf;p=elogind.git diff --git a/src/libsystemd-terminal/idev.h b/src/libsystemd-terminal/idev.h index 0ae044cfd..c8c03f3d4 100644 --- a/src/libsystemd-terminal/idev.h +++ b/src/libsystemd-terminal/idev.h @@ -110,6 +110,28 @@ struct idev_data_keyboard { uint32_t *codepoints; }; +static inline bool idev_kbdmatch(idev_data_keyboard *kdata, + uint32_t mods, uint32_t n_syms, + const uint32_t *syms) { + const uint32_t significant = IDEV_KBDMOD_SHIFT | + IDEV_KBDMOD_CTRL | + IDEV_KBDMOD_ALT | + IDEV_KBDMOD_LINUX; + uint32_t real; + + if (n_syms != kdata->n_syms) + return false; + + real = kdata->mods & ~kdata->consumed_mods & significant; + if (real != mods) + return false; + + return !memcmp(syms, kdata->keysyms, n_syms * sizeof(*syms)); +} + +#define IDEV_KBDMATCH(_kdata, _mods, _sym) \ + idev_kbdmatch((_kdata), (_mods), 1, (const uint32_t[]){ (_sym) }) + /* * Data Packets */