6
#include <qtabwidget.h>
7
#include <qvgroupbox.h>
8
#include <qpushbutton.h>
11
#include <qwhatsthis.h>
12
#include <qcheckbox.h>
13
#include <qradiobutton.h>
14
#include <qlineedit.h>
15
#include <qlistview.h>
16
#include <qbuttongroup.h>
19
#include <kkeydialog.h>
23
#include <kstandarddirs.h>
25
#include <kapplication.h>
28
#include "kcmlayout.h"
29
#include "kcmlayout.moc"
32
#include "kcmlayoutwidget.h"
37
static const char* switchModes[] = {
38
"Global", "WinClass", "Window"
41
static QString lookupLocalized(const QDict<char> &dict, const QString& text)
43
QDictIterator<char> it(dict);
46
if ( i18n(it.current()) == text )
47
return it.currentKey();
54
OptionListItem::OptionListItem( OptionListItem *parent, const QString &text,
55
Type tt, const QString &optionName )
56
: QCheckListItem( parent, text, tt ), m_OptionName( optionName )
60
OptionListItem::OptionListItem( QListView *parent, const QString &text,
61
Type tt, const QString &optionName )
62
: QCheckListItem( parent, text, tt ), m_OptionName( optionName )
66
OptionListItem * OptionListItem::findChildItem( const QString& optionName )
68
OptionListItem *child = static_cast<OptionListItem *>( firstChild() );
72
if ( child->optionName() == optionName )
74
child = static_cast<OptionListItem *>( child->nextSibling() );
80
LayoutConfig::LayoutConfig(QWidget *parent, const char *name)
81
: KCModule(parent, name), m_rules(0)
83
QVBoxLayout *main = new QVBoxLayout(this, 0, KDialog::spacingHint());
85
widget = new LayoutConfigWidget(this, "widget");
86
main->addWidget(widget);
88
connect( widget->chkEnable, SIGNAL( toggled( bool )), this, SLOT(changed()));
89
connect( widget->chkShowSingle, SIGNAL( toggled( bool )), this, SLOT(changed()));
90
connect( widget->comboModel, SIGNAL(activated(int)), this, SLOT(changed()));
92
connect( widget->btnAdd, SIGNAL(clicked()), this, SLOT(changed()));
93
connect( widget->btnAdd, SIGNAL(clicked()), this, SLOT(add()));
94
connect( widget->btnRemove, SIGNAL(clicked()), this, SLOT(changed()));
95
connect( widget->btnRemove, SIGNAL(clicked()), this, SLOT(remove()));
97
connect( widget->comboVariant, SIGNAL(activated(int)), this, SLOT(changed()));
98
connect( widget->comboVariant, SIGNAL(activated(int)), this, SLOT(variantChanged()));
99
connect( widget->listLayoutsDst, SIGNAL(selectionChanged(QListViewItem *)),
100
this, SLOT(layoutSelChanged(QListViewItem *)));
102
connect( widget->chkLatin, SIGNAL(clicked()), this, SLOT(changed()));
103
connect( widget->chkLatin, SIGNAL(clicked()), this, SLOT(latinChanged()));
105
connect( widget->btnUp, SIGNAL(clicked()), this, SLOT(changed()));
106
connect( widget->btnUp, SIGNAL(clicked()), this, SLOT(moveUp()));
107
connect( widget->btnDown, SIGNAL(clicked()), this, SLOT(changed()));
108
connect( widget->btnDown, SIGNAL(clicked()), this, SLOT(moveDown()));
110
connect( widget->grpSwitching, SIGNAL( clicked( int ) ), SLOT(changed()));
112
connect( widget->chkEnableSticky, SIGNAL(toggled(bool)), this, SLOT(changed()));
113
connect( widget->spinStickyDepth, SIGNAL(valueChanged(int)), this, SLOT(changed()));
115
widget->listLayoutsSrc->setColumnWidth(0, 28);
116
widget->listLayoutsDst->setColumnWidth(0, 28);
117
widget->listLayoutsDst->setSorting(-1);
119
widget->listLayoutsDst->setResizeMode(QListView::LastColumn);
120
widget->listLayoutsSrc->setResizeMode(QListView::LastColumn);
123
//Read rules - we _must_ read _before_ creating xkb-options comboboxes
124
ruleChanged("xfree86");
132
LayoutConfig::~LayoutConfig()
137
void LayoutConfig::updateStickyLimit()
139
int layoutsCnt = widget->listLayoutsDst->childCount();
140
widget->spinStickyDepth->setMaxValue( (layoutsCnt<=2) ? 2 : layoutsCnt - 1);
143
void LayoutConfig::add()
145
QListViewItem* sel = widget->listLayoutsSrc->selectedItem();
149
widget->listLayoutsDst->insertItem(sel);
150
sel->moveItem(widget->listLayoutsDst->lastItem());
151
widget->listLayoutsSrc->setSelected(sel, true);
152
layoutSelChanged(sel);
157
void LayoutConfig::remove()
159
QListViewItem* sel = widget->listLayoutsDst->selectedItem();
160
QListViewItem* newSel = 0;
165
if( sel->itemBelow() )
166
newSel = sel->itemBelow();
168
if( sel->itemAbove() )
169
newSel = sel->itemAbove();
171
widget->listLayoutsSrc->insertItem(sel);
173
widget->listLayoutsSrc->setSelected(newSel, true);
174
layoutSelChanged(newSel);
179
void LayoutConfig::moveUp()
181
QListViewItem* sel = widget->listLayoutsDst->selectedItem();
182
if( sel == 0 || sel->itemAbove() == 0 )
185
if( sel->itemAbove()->itemAbove() == 0 ) {
186
widget->listLayoutsDst->takeItem(sel);
187
widget->listLayoutsDst->insertItem(sel);
188
widget->listLayoutsDst->setSelected(sel, true);
191
sel->moveItem(sel->itemAbove()->itemAbove());
194
void LayoutConfig::moveDown()
196
QListViewItem* sel = widget->listLayoutsDst->selectedItem();
197
if( sel == 0 || sel->itemBelow() == 0 )
200
sel->moveItem(sel->itemBelow());
203
void LayoutConfig::variantChanged()
205
QListViewItem* selLayout = widget->listLayoutsDst->selectedItem();
207
widget->comboVariant->clear();
208
widget->comboVariant->setEnabled(false);
212
QString kbdLayout = lookupLocalized( m_rules->layouts(), selLayout->text(1) );
213
m_variants.replace(kbdLayout, widget->comboVariant->currentText().latin1());
216
void LayoutConfig::latinChanged()
218
QListViewItem* selLayout = widget->listLayoutsDst->selectedItem();
220
widget->chkLatin->setChecked( false );
221
widget->chkLatin->setEnabled( false );
225
QString kbdLayout = lookupLocalized( m_rules->layouts(), selLayout->text( 1 ) );
226
if ( widget->chkLatin->isChecked() )
227
m_includes.replace( kbdLayout, "us" );
229
m_includes.replace( kbdLayout, "" );
232
void LayoutConfig::layoutSelChanged(QListViewItem *sel)
235
widget->comboVariant->clear();
236
widget->comboVariant->setEnabled( sel != 0 );
237
widget->chkLatin->setChecked( false );
238
widget->chkLatin->setEnabled( sel != 0 );
241
updateLayoutCommand();
245
QString kbdLayout = lookupLocalized( m_rules->layouts(), sel->text(1) );
247
if ( ! m_rules->isSingleGroup(kbdLayout) || kbdLayout == "us" ) {
248
widget->chkLatin->setEnabled( false );
251
char* inc = m_includes[ kbdLayout ];
252
if ( inc && strcmp(inc, "us")==0 ) {
253
widget->chkLatin->setChecked(true);
256
widget->chkLatin->setChecked(false);
260
QStringList vars = m_rules->getVariants(kbdLayout);
263
if( vars.count() == 0 ) { // cowardly running away
264
updateLayoutCommand();
268
char* variant = m_variants[kbdLayout];
269
widget->comboVariant->insertStringList(vars);
272
widget->comboVariant->setCurrentText(variant);
275
widget->comboVariant->setCurrentItem(0);
276
m_variants.insert(kbdLayout, widget->comboVariant->currentText().latin1());
279
updateLayoutCommand();
282
QWidget* LayoutConfig::makeOptionsTab()
284
QListView *listView = widget->listOptions;
286
listView->setMinimumHeight(150);
287
listView->setSortColumn( -1 );
288
listView->setColumnText( 0, i18n( "Options" ) );
291
connect(listView, SIGNAL(clicked(QListViewItem *)), SLOT(changed()));
292
connect(listView, SIGNAL(clicked(QListViewItem *)), SLOT(updateOptionsCommand()));
294
connect(widget->checkResetOld, SIGNAL(toggled(bool)), SLOT(changed()));
295
connect(widget->checkResetOld, SIGNAL(toggled(bool)), SLOT(updateOptionsCommand()));
297
//Create controllers for all options
298
QDictIterator<char> it(m_rules->options());
299
OptionListItem *parent;
300
for (; it.current(); ++it)
302
if (!it.currentKey().contains(':'))
304
if( it.currentKey() == "ctrl" || it.currentKey() == "caps"
305
|| it.currentKey() == "altwin" ) {
306
parent = new OptionListItem(listView, i18n( it.current() ),
307
QCheckListItem::RadioButtonController, it.currentKey());
308
OptionListItem *item = new OptionListItem(parent, i18n( "None" ),
309
QCheckListItem::RadioButton, "none");
310
item->setState(QCheckListItem::On);
313
parent = new OptionListItem(listView, i18n( it.current() ),
314
QCheckListItem::CheckBoxController, it.currentKey());
316
parent->setOpen(true);
317
m_optionGroups.insert(i18n(it.currentKey().local8Bit()), parent);
322
for( ; it.current(); ++it)
324
QString key = it.currentKey();
325
int pos = key.find(':');
328
OptionListItem *parent = m_optionGroups[key.left(pos)];
330
parent = m_optionGroups["misc"];
331
if (parent != NULL) {
332
// workaroung for mistake in rules file for xkb options in XFree 4.2.0
333
QString text(it.current());
334
text = text.replace( "Cap$", "Caps." );
335
if( parent->type() == QCheckListItem::RadioButtonController )
336
new OptionListItem(parent, i18n(text.latin1()),
337
QCheckListItem::RadioButton, key);
339
new OptionListItem(parent, i18n(text.latin1()),
340
QCheckListItem::CheckBox, key);
345
//scroll->setMinimumSize(450, 330);
350
void LayoutConfig::updateOptionsCommand()
353
QString options = createOptionString();
355
if( !options.isEmpty() ) {
356
setxkbmap = "setxkbmap -option "; //-rules " + m_rule
357
if( widget->checkResetOld->isChecked() )
358
setxkbmap += "-option ";
359
setxkbmap += options;
361
widget->editCmdLineOpt->setText(setxkbmap);
364
void LayoutConfig::updateLayoutCommand()
367
QListViewItem* sel = widget->listLayoutsDst->selectedItem();
370
QString kbdLayout = lookupLocalized(m_rules->layouts(), sel->text(1));
371
// char* variant = m_variants[kbdLayout];
372
QString variant = widget->comboVariant->currentText();
374
setxkbmap = "setxkbmap"; //-rules " + m_rule
375
setxkbmap += " -model " + lookupLocalized(m_rules->models(), widget->comboModel->currentText())
377
if( widget->chkLatin->isChecked() )
379
setxkbmap += kbdLayout;
381
if( !variant.isEmpty() ) {
382
setxkbmap += " -variant ";
383
if( widget->chkLatin->isChecked() )
385
setxkbmap += variant;
388
widget->editCmdLine->setText(setxkbmap);
391
void LayoutConfig::changed()
393
updateLayoutCommand();
394
emit KCModule::changed( true );
398
void LayoutConfig::load()
400
// open the config file
401
KConfig *config = new KConfig("kxkbrc", true);
402
config->setGroup("Layout");
404
bool use = config->readBoolEntry( "Use", false );
406
// find out which rule applies
407
QString rule = "xfree86"; //config->readEntry("Rule", "xfree86");
409
// update other files
412
// find out about the model
413
QString model = config->readEntry("Model", "pc104");
415
// TODO: When no model and no layout are known (1st start), we really
416
// should ask the X-server about it's settings!
418
QString m_name = m_rules->models()[model];
419
widget->comboModel->setCurrentText(i18n(m_name.local8Bit()));
421
QString layout = config->readEntry("Layout", "us");
422
QString l_name = m_rules->layouts()[layout];
424
QStringList otherLayouts = config->readListEntry("Additional");
425
if( !l_name.isEmpty() ) {
426
otherLayouts.prepend(layout);
428
// to optimize we should have gone from it.end to it.begin
429
for ( QStringList::Iterator it = otherLayouts.begin(); it != otherLayouts.end(); ++it ) {
430
QListViewItemIterator src_it( widget->listLayoutsSrc );
431
for ( ; src_it.current(); ++src_it ) {
432
QListViewItem* srcItem = src_it.current();
433
if ( *it == lookupLocalized(m_rules->layouts(), src_it.current()->text(1)) ) {
434
widget->listLayoutsDst->insertItem(srcItem);
435
srcItem->moveItem(widget->listLayoutsDst->lastItem());
442
QStringList vars = config->readListEntry("Variants");
443
m_rules->parseVariants(vars, m_variants);
444
// m_rules->parseVariants( vars, m_variants );
446
QStringList incs = config->readListEntry( "Includes" );
447
m_rules->parseVariants( incs, m_includes, false );
449
bool showSingle = config->readBoolEntry( "ShowSingle", false );
450
widget->chkShowSingle->setChecked(showSingle);
452
bool enableXkbOptions = config->readBoolEntry( "EnableXkbOptions", true );
453
widget->chkEnableOptions->setChecked( enableXkbOptions );
454
bool resetOld = config->readBoolEntry("ResetOldOptions", false);
455
widget->checkResetOld->setChecked(resetOld);
456
QStringList options = config->readListEntry("Options");
458
for (QStringList::Iterator it = options.begin(); it != options.end(); ++it)
460
QString option = *it;
461
QString optionKey = option.mid(0, option.find(':'));
462
QString optionName = m_rules->options()[option];
463
OptionListItem *item = m_optionGroups[optionKey];
465
OptionListItem *child = item->findChildItem( option );
468
child->setState( QCheckListItem::On );
470
kdDebug() << "load: Unknown option " << option << endl;
473
kdDebug() << "load: Unknown option group " << optionKey << endl;
477
QString swMode = config->readEntry("SwitchMode", "Global");
478
widget->grpSwitching->setButton(0);
480
for(int ii=1; ii<3; ii++)
481
if( swMode == switchModes[ii] )
482
widget->grpSwitching->setButton(ii);
484
bool stickySwitching = config->readBoolEntry("StickySwitching", false);
485
widget->chkEnableSticky->setChecked(stickySwitching);
486
widget->spinStickyDepth->setEnabled(stickySwitching);
487
widget->spinStickyDepth->setValue( config->readEntry("StickySwitchingDepth", "1").toInt() + 1);
493
widget->chkEnable->setChecked( use );
494
widget->grpLayouts->setEnabled(use);
495
widget->grpSwitching->setEnabled(use);
497
updateOptionsCommand();
498
emit KCModule::changed( false );
501
void LayoutConfig::ruleChanged(const QString &rule)
508
QString model; //, layout;
511
model = lookupLocalized(m_rules->models(), widget->comboModel->currentText());
512
// layout = lookupLocalized(m_rules->layouts(), layoutCombo->currentText());
516
m_rules = new KeyRules(rule);
519
widget->comboModel->clear();
520
QDictIterator<char> it(m_rules->models());
523
tmp.append(i18n(it.current()));
527
widget->comboModel->insertStringList(tmp);
530
// fill in the additional layouts -- moved from load() by A. Rysin
531
widget->listLayoutsSrc->clear();
532
QDictIterator<char> it2(m_rules->layouts());
533
while (it2.current())
535
QCheckListItem *item = new QCheckListItem(widget->listLayoutsSrc, "");
536
QString addLayout = it2.currentKey();
537
item->setPixmap(0, findPixmap(addLayout));
538
item->setText(1, i18n(it2.current()) );
539
item->setText(2, "(" + addLayout + ")" );
542
widget->listLayoutsSrc->setSorting(1); // from Qt3 QListView sorts by language
545
if (!model.isEmpty())
547
QString m_name = m_rules->models()[model];
548
widget->comboModel->setCurrentText(m_name);
553
QString LayoutConfig::createOptionString()
556
for (QDictIterator<char> it(m_rules->options()); it.current(); ++it)
558
QString option(it.currentKey());
560
if (option.contains(':')) {
562
QString optionKey = option.mid(0, option.find(':'));
563
OptionListItem *item = m_optionGroups[optionKey];
566
kdDebug() << "WARNING: skipping empty group for " << it.currentKey()
571
OptionListItem *child = item->findChildItem( option );
574
if ( child->state() == QCheckListItem::On ) {
575
QString selectedName = child->optionName();
576
if ( !selectedName.isEmpty() && selectedName != "none" ) {
577
if (!options.isEmpty())
579
options.append(selectedName);
584
kdDebug() << "Empty option button for group " << it.currentKey() << endl;
590
void LayoutConfig::save()
592
KConfig *config = new KConfig("kxkbrc", false);
593
config->setGroup("Layout");
594
// config->writeEntry("Rule", ruleCombo->currentText());
596
QString model = lookupLocalized(m_rules->models(), widget->comboModel->currentText());
597
config->writeEntry("Model", model);
599
config->writeEntry("EnableXkbOptions", widget->chkEnableOptions->isChecked() );
600
config->writeEntry("ResetOldOptions", widget->checkResetOld->isChecked());
601
config->writeEntry("Options", createOptionString() );
604
QStringList otherLayouts;
605
QListViewItem *item = widget->listLayoutsDst->firstChild();
607
layout = lookupLocalized(m_rules->layouts(), item->text(1));
608
if( !layout.isEmpty() )
609
config->writeEntry("Layout", layout);
610
item = item->nextSibling();
613
widget->chkEnable->setChecked(false);
617
QString layout = lookupLocalized(m_rules->layouts(), item->text(1));
618
otherLayouts.append(layout);
619
item = item->nextSibling();
621
config->writeEntry("Additional", otherLayouts);
625
item = widget->listLayoutsDst->firstChild();
627
QString layout = lookupLocalized( m_rules->layouts(), item->text( 1 ) );
628
if( m_includes[ layout ] && m_includes[ layout ][ 0 ] != '\0' )
630
QString inc = layout;
632
inc += m_includes[ layout ];
634
incList.append( inc );
636
if( m_variants[ layout ] && m_variants[ layout ][ 0 ] != '\0' )
638
QString var = layout;
640
var += m_variants[ layout ];
642
varList.append( var );
645
item = item->nextSibling();
647
config->writeEntry( "Includes", incList );
648
config->writeEntry("Variants", varList);
650
config->writeEntry("Use", widget->chkEnable->isChecked());
651
config->writeEntry("ShowSingle", widget->chkShowSingle->isChecked());
653
int modeId = widget->grpSwitching->id(widget->grpSwitching->selected());
654
if( modeId < 1 || modeId > 2 )
657
config->writeEntry("SwitchMode", switchModes[modeId]);
659
config->writeEntry("StickySwitching", widget->chkEnableSticky->isChecked());
660
config->writeEntry("StickySwitchingDepth", widget->spinStickyDepth->value() - 1);
666
kapp->kdeinitExec("kxkb");
667
emit KCModule::changed( false );
671
void LayoutConfig::defaults()
673
widget->chkEnable->setChecked(false);
674
ruleChanged("xfree86");
676
widget->comboModel->setCurrentText("pc104");
677
//layoutCombo->setCurrentText("us");
679
widget->chkEnableOptions->setChecked( true );
680
widget->checkResetOld->setChecked( false );
682
widget->grpSwitching->setButton(0);
684
widget->chkEnableSticky->setChecked( false );
685
widget->spinStickyDepth->setEnabled( false );
687
QListViewItem *item = widget->listLayoutsSrc->firstChild();
690
QCheckListItem *cli = dynamic_cast<QCheckListItem*>(item);
692
item = item->nextSibling();
694
emit KCModule::changed( true );
699
KCModule *create_keyboard_layout(QWidget *parent, const char *)
701
return new LayoutConfig(parent, "kcmlayout");
704
KCModule *create_keyboard(QWidget *parent, const char *)
706
return new KeyboardConfig(parent, "kcmlayout");
711
KConfig *config = new KConfig("kcminputrc", true); // Read-only, no globals
712
config->setGroup("Keyboard");
715
XKeyboardControl kbdc;
717
XGetKeyboardControl(kapp->getDisplay(), &kbd);
718
bool key = config->readBoolEntry("KeyboardRepeating", true);
719
kbdc.key_click_percent = config->readNumEntry("ClickVolume", kbd.key_click_percent);
720
kbdc.auto_repeat_mode = (key ? AutoRepeatModeOn : AutoRepeatModeOff);
722
XChangeKeyboardControl(kapp->getDisplay(),
723
KBKeyClickPercent | KBAutoRepeatMode,
727
int delay_ = config->readNumEntry("RepeatDelay", 250);
728
int rate_ = config->readNumEntry("RepeatRate", 30);
729
set_repeatrate(delay_, rate_);
733
int numlockState = config->readNumEntry( "NumLock", 2 );
734
if( numlockState != 2 )
735
numlockx_change_numlock_state( numlockState == 0 );
739
config = new KConfig("kxkbrc", true, false);
740
config->setGroup("Layout");
741
if (config->readBoolEntry("Use", false) == true)
742
kapp->startServiceByDesktopName("kxkb");
747
#if 0// do not remove!
748
// please don't change/fix messages below
749
// they're taken from XFree86 as is and should stay the same
750
I18N_NOOP("Brazilian ABNT2");
751
I18N_NOOP("Dell 101-key PC");
752
I18N_NOOP("Everex STEPnote");
753
I18N_NOOP("Generic 101-key PC");
754
I18N_NOOP("Generic 102-key (Intl) PC");
755
I18N_NOOP("Generic 104-key PC");
756
I18N_NOOP("Generic 105-key (Intl) PC");
757
I18N_NOOP("Japanese 106-key");
758
I18N_NOOP("Microsoft Natural");
759
I18N_NOOP("Northgate OmniKey 101");
760
I18N_NOOP("Keytronic FlexPro");
761
I18N_NOOP("Winbook Model XP5");
763
// These options are from XFree 4.1.0
764
I18N_NOOP("Group Shift/Lock behavior");
765
I18N_NOOP("R-Alt switches group while pressed");
766
I18N_NOOP("Right Alt key changes group");
767
I18N_NOOP("Caps Lock key changes group");
768
I18N_NOOP("Menu key changes group");
769
I18N_NOOP("Both Shift keys together change group");
770
I18N_NOOP("Control+Shift changes group");
771
I18N_NOOP("Alt+Control changes group");
772
I18N_NOOP("Alt+Shift changes group");
773
I18N_NOOP("Control Key Position");
774
I18N_NOOP("Make CapsLock an additional Control");
775
I18N_NOOP("Swap Control and Caps Lock");
776
I18N_NOOP("Control key at left of 'A'");
777
I18N_NOOP("Control key at bottom left");
778
I18N_NOOP("Use keyboard LED to show alternative group");
779
I18N_NOOP("Num_Lock LED shows alternative group");
780
I18N_NOOP("Caps_Lock LED shows alternative group");
781
I18N_NOOP("Scroll_Lock LED shows alternative group");
783
//these seem to be new in XFree86 4.2.0
784
I18N_NOOP("Left Win-key switches group while pressed");
785
I18N_NOOP("Right Win-key switches group while pressed");
786
I18N_NOOP("Both Win-keys switch group while pressed");
787
I18N_NOOP("Left Win-key changes group");
788
I18N_NOOP("Right Win-key changes group");
789
I18N_NOOP("Third level choosers");
790
I18N_NOOP("Press Right Control to choose 3rd level");
791
I18N_NOOP("Press Menu key to choose 3rd level");
792
I18N_NOOP("Press any of Win-keys to choose 3rd level");
793
I18N_NOOP("Press Left Win-key to choose 3rd level");
794
I18N_NOOP("Press Right Win-key to choose 3rd level");
795
I18N_NOOP("CapsLock key behavior");
796
I18N_NOOP("uses internal capitalization. Shift cancels Caps.");
797
I18N_NOOP("uses internal capitalization. Shift doesn't cancel Caps.");
798
I18N_NOOP("acts as Shift with locking. Shift cancels Caps.");
799
I18N_NOOP("acts as Shift with locking. Shift doesn't cancel Caps.");
800
I18N_NOOP("Alt/Win key behavior");
801
I18N_NOOP("Add the standard behavior to Menu key.");
802
I18N_NOOP("Alt and Meta on the Alt keys (default).");
803
I18N_NOOP("Meta is mapped to the Win-keys.");
804
I18N_NOOP("Meta is mapped to the left Win-key.");
805
I18N_NOOP("Super is mapped to the Win-keys (default).");
806
I18N_NOOP("Hyper is mapped to the Win-keys.");
807
I18N_NOOP("Right Alt is Compose");
808
I18N_NOOP("Right Win-key is Compose");
809
I18N_NOOP("Menu is Compose");
811
//these seem to be new in XFree86 4.3.0
812
I18N_NOOP( "Both Ctrl keys together change group" );
813
I18N_NOOP( "Both Alt keys together change group" );
814
I18N_NOOP( "Left Shift key changes group" );
815
I18N_NOOP( "Right Shift key changes group" );
816
I18N_NOOP( "Right Ctrl key changes group" );
817
I18N_NOOP( "Left Alt key changes group" );
818
I18N_NOOP( "Left Ctrl key changes group" );
819
I18N_NOOP( "Compose Key" );
821
//these seem to be new in XFree86 4.4.0
822
I18N_NOOP("Shift with numpad keys works as in MS Windows.");
823
I18N_NOOP("Special keys (Ctrl+Alt+<key>) handled in a server.");
824
I18N_NOOP("Miscellaneous compatibility options");
825
I18N_NOOP("Right Control key works as Right Alt");