From ae44233612221d40761036bfae6f37cc2dbb96d3 Mon Sep 17 00:00:00 2001 From: Sergey Udaltsov Date: Wed, 8 Dec 2004 01:37:04 +0000 Subject: another new call in API - apps cannot rely on XkbNumKbdGroups --- ChangeLog | 5 +++++ libxklavier/xklavier.c | 7 +++++++ libxklavier/xklavier.h | 9 +++++++++ libxklavier/xklavier_private.h | 22 ++++++++++++++++++++++ libxklavier/xklavier_private_xkb.h | 2 ++ libxklavier/xklavier_private_xmm.h | 2 ++ libxklavier/xklavier_xkb.c | 7 +++++++ libxklavier/xklavier_xmm.c | 6 ++++++ tests/test_config.c | 1 + 9 files changed, 61 insertions(+) diff --git a/ChangeLog b/ChangeLog index 288f3c5..58898d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-12-07 01:30 svu + + * libxklavier, tests: introducing XklGetMaxNumGroups. + Another new call in API. + 2004-12-07 00:20 svu * configure.in: using ac_x_includes to make configure diff --git a/libxklavier/xklavier.c b/libxklavier/xklavier.c index 94a7255..2109eaa 100644 --- a/libxklavier/xklavier.c +++ b/libxklavier/xklavier.c @@ -796,3 +796,10 @@ void _XklFreeAllInfo( void ) _XklEnsureVTableInited(); (*xklVTable->xklFreeAllInfoHandler)(); } + +unsigned XklGetMaxNumGroups( void ) +{ + _XklEnsureVTableInited(); + return (*xklVTable->xklGetMaxNumGroupsHandler)(); +} + diff --git a/libxklavier/xklavier.h b/libxklavier/xklavier.h index b9c5348..6d0565f 100644 --- a/libxklavier/xklavier.h +++ b/libxklavier/xklavier.h @@ -31,6 +31,7 @@ extern "C" * Backend allows to toggls indicators on/off */ #define XKLF_CAN_TOGGLE_INDICATORS 0x01 + /** * Backend allows to write ascii representation of the configuration */ @@ -97,6 +98,14 @@ extern "C" * @return ORed XKLF_* constants */ extern int XklGetBackendFeatures( void ); + +/** + * Provides the information on maximum number of simultaneously supported + * groups (layouts) + * @return maximum number of the groups in configuration, + * 0 if no restrictions. + */ + extern unsigned XklGetMaxNumGroups( void ); /** @} */ /** diff --git a/libxklavier/xklavier_private.h b/libxklavier/xklavier_private.h index c470721..6547926 100644 --- a/libxklavier/xklavier_private.h +++ b/libxklavier/xklavier_private.h @@ -21,6 +21,8 @@ typedef void ( *XklFreeAllInfoHandler )( void ); typedef const char **( *XklGetGroupNamesHandler )( void ); +typedef unsigned ( *XklGetMaxNumGroupsHandler )( void ); + typedef unsigned ( *XklGetNumGroupsHandler )( void ); typedef void ( *XklGetRealStateHandler)( XklState * curState_return ); @@ -39,22 +41,26 @@ typedef struct * Backend name */ const char *id; + /** * Functions supported by the backend, combination of XKLF_* constants */ int features; + /** * Activates the configuration. * xkb: create proper the XkbDescRec and send it to the server * xmodmap: save the property, init layout #1 */ XklConfigActivateHandler xklConfigActivateHandler; + /** * Background-specific initialization. * xkb: XkbInitAtoms - init internal xkb atoms table * xmodmap: void. */ XklConfigInitHandler xklConfigInitHandler; /* private */ + /** * Loads the registry tree into DOM (using whatever path(s)) * The XklConfigFreeRegistry is static - no virtualization necessary. @@ -62,6 +68,7 @@ typedef struct * xmodmap: loads xml from XMODMAP_BASE+"/"+ruleset+".xml" */ XklConfigLoadRegistryHandler xklConfigLoadRegistryHandler; + /** * Write the configuration into the file (binary/textual) * xkb: write xkb or xkm file @@ -69,24 +76,35 @@ typedef struct * file - not really useful. If binary - fail (not supported) */ XklConfigWriteFileHandler xklConfigWriteFileHandler; + /** * Handles X events. * xkb: XkbEvent handling * xmodmap: keep track on the root window properties. What else can we do? */ XklEventHandler xklEventHandler; + /** * Flushes the cached server config info. * xkb: frees XkbDesc * xmodmap: frees internal XklConfigRec */ XklFreeAllInfoHandler xklFreeAllInfoHandler; /* private */ + /** * Get the list of the group names * xkb: return cached list of the group names * xmodmap: return the list of layouts from the internal XklConfigRec */ XklGetGroupNamesHandler xklGetGroupNamesHandler; + + /** + * Get the maximum number of loaded groups + * xkb: returns 1 or XkbNumKbdGroups + * xmodmap: return 0 + */ + XklGetMaxNumGroupsHandler xklGetMaxNumGroupsHandler; + /** * Get the number of loaded groups * xkb: return from the cached XkbDesc @@ -107,6 +125,7 @@ typedef struct * xmodmap: loads internal XklConfigRec from server */ XklLoadAllInfoHandler xklLoadAllInfoHandler; /* private */ + /** * Switches the keyboard to the group N * xkb: simple one-liner to call the XKB function @@ -114,18 +133,21 @@ typedef struct * (listener invokes xmodmap with appropriate config file). */ XklLockGroupHandler xklLockGroupHandler; + /** * Stop tracking the keyboard-related events * xkb: XkbSelectEvents(..., 0) * xmodmap: Ungrab the switching shortcut. */ XklPauseResumeListenHandler xklPauseListenHandler; + /** * Start tracking the keyboard-related events * xkb: XkbSelectEvents + XkbSelectEventDetails * xmodmap: Grab the switching shortcut. */ XklPauseResumeListenHandler xklResumeListenHandler; + /** * Set the indicators state from the XklState * xkb: _XklSetIndicator for all indicators diff --git a/libxklavier/xklavier_private_xkb.h b/libxklavier/xklavier_private_xkb.h index 2c6ced5..8e458a2 100644 --- a/libxklavier/xklavier_private_xkb.h +++ b/libxklavier/xklavier_private_xkb.h @@ -40,6 +40,8 @@ extern void _XklXkbFreeAllInfo( void ); extern const char **_XklXkbGetGroupNames( void ); +extern unsigned _XklXkbGetMaxNumGroups( void ); + extern unsigned _XklXkbGetNumGroups( void ); extern void _XklXkbGetRealState( XklState * curState_return ); diff --git a/libxklavier/xklavier_private_xmm.h b/libxklavier/xklavier_private_xmm.h index 996a035..9ac4e19 100644 --- a/libxklavier/xklavier_private_xmm.h +++ b/libxklavier/xklavier_private_xmm.h @@ -57,6 +57,8 @@ extern void _XklXmmFreeAllInfo( void ); extern const char **_XklXmmGetGroupNames( void ); +extern unsigned _XklXmmGetMaxNumGroups( void ); + extern unsigned _XklXmmGetNumGroups( void ); extern void _XklXmmGetRealState( XklState * curState_return ); diff --git a/libxklavier/xklavier_xkb.c b/libxklavier/xklavier_xkb.c index 9399dd7..26a6c7d 100644 --- a/libxklavier/xklavier_xkb.c +++ b/libxklavier/xklavier_xkb.c @@ -70,6 +70,12 @@ int _XklXkbResumeListen( ) return 0; } +unsigned _XklXkbGetMaxNumGroups( void ) +{ + return xklVTable->features & XKLF_MULTIPLE_LAYOUTS_SUPPORTED ? + XkbNumKbdGroups : 1; +} + unsigned _XklXkbGetNumGroups( void ) { return _xklXkb->ctrls->num_groups; @@ -373,6 +379,7 @@ int _XklXkbInit( void ) _XklXkbEventHandler, _XklXkbFreeAllInfo, _XklXkbGetGroupNames, + _XklXkbGetMaxNumGroups, _XklXkbGetNumGroups, _XklXkbGetRealState, _XklXkbLoadAllInfo, diff --git a/libxklavier/xklavier_xmm.c b/libxklavier/xklavier_xmm.c index 4644041..ba30b19 100755 --- a/libxklavier/xklavier_xmm.c +++ b/libxklavier/xklavier_xmm.c @@ -130,6 +130,11 @@ int _XklXmmPauseListen( ) return 0; } +unsigned _XklXmmGetMaxNumGroups( void ) +{ + return 0; +} + unsigned _XklXmmGetNumGroups( void ) { return currentXmmConfig.numLayouts; @@ -239,6 +244,7 @@ int _XklXmmInit( void ) _XklXmmEventHandler, _XklXmmFreeAllInfo, _XklXmmGetGroupNames, + _XklXmmGetMaxNumGroups, _XklXmmGetNumGroups, _XklXmmGetRealState, _XklXmmLoadAllInfo, diff --git a/tests/test_config.c b/tests/test_config.c index cf01482..e5dcd58 100644 --- a/tests/test_config.c +++ b/tests/test_config.c @@ -105,6 +105,7 @@ int main( int argc, char * const argv[] ) XklDebug( 0, "Xklavier registry loaded\n" ); XklDebug( 0, "Bakend: [%s]\n", XklGetBackendName() ); XklDebug( 0, "Supported features: 0x0%X\n", XklGetBackendFeatures() ); + XklDebug( 0, "Max number of groups: %d\n", XklGetMaxNumGroups() ); XklConfigRecInit( ¤tConfig ); XklConfigGetFromServer( ¤tConfig ); -- cgit v1.2.1