SalI18N_KeyboardExtension::SalI18N_KeyboardExtension( Display* pDisplay )
: mbUseExtension(true)
, mnEventBase(0)
{ // allow user to set the default keyboard group idx or to disable the usage // of x keyboard extension at all: // setenv SAL_XKEYBOARDGROUP disables keyboard extension // setenv SAL_XKEYBOARDGROUP 2 sets the keyboard group index to 2 // keyboard group index must be in [1,4], may be specified in hex or decimal staticchar *pUseKeyboardExtension = getenv( "SAL_XKEYBOARDGROUP" ); if ( pUseKeyboardExtension != nullptr )
{
mbUseExtension = pUseKeyboardExtension[0] != '\0' ;
}
// query XServer support for XKB Extension, // do not call XQueryExtension() / XInitExtension() due to possible version // clashes ! if ( mbUseExtension )
{ int nMajorExtOpcode; int nExtMajorVersion = XkbMajorVersion; int nExtMinorVersion = XkbMinorVersion; int nErrorBase = 0;
// query notification for changes of the keyboard group if ( mbUseExtension )
{
constexpr auto XkbGroupMask = XkbGroupStateMask | XkbGroupBaseMask
| XkbGroupLatchMask | XkbGroupLockMask;
// query initial keyboard group if ( mbUseExtension )
{
XkbStateRec aStateRecord;
XkbGetState( pDisplay, XkbUseCoreKbd, &aStateRecord );
}
}
void
SalI18N_KeyboardExtension::Dispatch( XEvent* pEvent )
{ // must the event be handled? if ( !mbUseExtension
|| (pEvent->type != mnEventBase) ) return;
// only handle state notify events for now, and only interested // in group details
sal_uInt32 nXKBType = reinterpret_cast<XkbAnyEvent*>(pEvent)->xkb_type; switch ( nXKBType )
{ case XkbStateNotify: break;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.