//
//   hunglish - Dual English/Hungarian keyboard definition for XKB.
//
//   Author: Lorentey Karoly <lorentey@elte.hu>.
//
//   Time-stamp: <2001-11-29 20:15:38 lorentey>
//


//======================================================================

// This is a symbol definition for a very simple PC-style Hunglish
// layout.  It has basically the alphanumeric keys, punctuation, one
// shift key, one control key and caps lock.  It uses the punctuation
// keys configurations common on PC keyboards (e.g. key <ABO9> is { [
// period greater ] })

partial hidden alphanumeric_keys modifier_keys
xkb_symbols "basic" {

    // There are three groups available for each alphanumeric key.
    name[group1]= "US/ASCII";
    name[group3]= "Hungarian";
    name[group4]= "AltGr";

    // Escape key.
    key <ESC>  { [ Escape ] };

    //////////////////////////////////////////////////////////////
    // Top row.
    //////////////////////////////////////////////////////////////

    // This should be the digit `0' in the Hungarian (second) group,
    // but if I respect the standard Hungarian key layout, then there
    // would be no (easy) way to get the letter `iacute' () on a US
    // keyboard.  (This key is redefined to be `0' if you use one of
    // the 102/105-key configurations that are defined at the bottom
    // of this file.)
    key <TLDE> {
        symbols[group1] = [ quoteleft, asciitilde ],
        symbols[group3] = [ iacute, Iacute ],
        symbols[group4] = [ notsign ]
    };

    key <AE01> {
        symbols[group1] = [ 1, exclam ],
        symbols[group3] = [ 1, apostrophe ],
        symbols[group4] = [ asciitilde, dead_tilde ]
    };
    key <AE02> {
        symbols[group1] = [ 2, at ],
        symbols[group3] = [ 2, quotedbl ],
        symbols[group4] = [ caron, dead_caron ]
    };
    key <AE03> {
        symbols[group1] = [ 3, numbersign ],
        symbols[group3] = [ 3, plus ],
        symbols[group4] = [ asciicircum, dead_circumflex ]
    };
    key <AE04> {
        symbols[group1] = [ 4, dollar ],
        symbols[group3] = [ 4, exclam ],
        symbols[group4] = [ breve, dead_breve ]
    };
    key <AE05> {
        symbols[group1] = [ 5, percent ],
        symbols[group3] = [ 5, percent ],
        symbols[group4] = [ degree, dead_abovering ]
    };
    key <AE06> {
        symbols[group1] = [ 6, asciicircum ],
        symbols[group3] = [ 6, slash ],
        symbols[group4] = [ ogonek, dead_ogonek ]
    };
    key <AE07> {
        symbols[group1] = [ 7, ampersand ],
        symbols[group3] = [ 7, equal ],
        symbols[group4] = [ grave, dead_grave ]
    };
    key <AE08> {
        symbols[group1] = [ 8, asterisk ],
        symbols[group3] = [ 8, parenleft ],
        symbols[group4] = [ abovedot, dead_abovedot ]
    };
    key <AE09> {
        symbols[group1] = [ 9, parenleft ],
        symbols[group3] = [ 9, parenright ],
        symbols[group4] = [ acute, dead_acute ]
    };
    key <AE10> {
        symbols[group1] = [ 0, parenright ],
        symbols[group3] = [ odiaeresis, Odiaeresis ],
        symbols[group4] = [ doubleacute, dead_doubleacute]
    };
    key <AE11> {
        symbols[group1] = [ minus, underscore ],
        symbols[group3] = [ udiaeresis, Udiaeresis ],
        symbols[group4] = [ diaeresis, dead_diaeresis ]
    };
    key <AE12> {
        symbols[group1] = [ equal, plus ],
        symbols[group3] = [ oacute, Oacute ],
        symbols[group4] = [ cedilla, dead_cedilla ]
    };
    key <BKSP> { [ BackSpace ] };

    //////////////////////////////////////////////////////////////
    // Second row.
    //////////////////////////////////////////////////////////////

    key  <TAB> { [ Tab, ISO_Left_Tab ] };
    key <AD01> {
        symbols[group1] = [ q, Q ],
        symbols[group3] = [ q, Q ],
        symbols[group4] = [ backslash ]
    };
    key <AD02> {
        symbols[group1] = [ w, W ],
        symbols[group3] = [ w, W ],
        symbols[group4] = [ bar ]
    };
    key <AD03> {
        symbols[group1] = [ e, E ],
        symbols[group3] = [ e, E ]
    };
    key <AD04> {
        symbols[group1] = [ r, R ],
        symbols[group3] = [ r, R ]
    };
    key <AD05> {
        symbols[group1] = [ t, T ],
        symbols[group3] = [ t, T ]
    };

    // Note that this should be the letter `z' in the Hungarian
    // (second) group, but I _detest_ QWERTZ layouts.  (You can force
    // QWERTZ by specifying the symbol configuration as
    // hunglish(pc10Xqwertz).)
    key <AD06> {
        symbols[group1] = [ y, Y ],
        symbols[group3] = [ y, Y ]
    };

    key <AD07> {
        symbols[group1] = [ u, U ],
        symbols[group3] = [ u, U ]
    };
    key <AD08> {
        symbols[group1] = [ i, I ],
        symbols[group3] = [ i, I ],
        symbols[group4] = [ Iacute ]
    };
    key <AD09> {
        symbols[group1] = [ o, O ],
        symbols[group3] = [ o, O ]
    };
    key <AD10> {
        symbols[group1] = [ p, P ],
        symbols[group3] = [ p, P ]
    };

    // The <AD11> key should be `odoubleacute' in the Hungarian
    // (second) group, but there are very few applications that
    // understand that keysym.  Therefore, we have to settle for
    // `otilde', which works almost anywhere.  The correct definition
    // is given in a comment below in case you live in an ideal world,
    // where applications speak Hungarian. :-) (See also the keyname
    // <BKSL>.)
    key <AD11> {
        symbols[group1] = [ bracketleft, braceleft ],
        symbols[group3] = [ otilde, Otilde ],
        symbols[group4] = [ division ]
    };
//  key <AD11> {
//      symbols[group1] = [ bracketleft, braceleft ],
//      symbols[group3] = [ odoubleacute, Odoubleacute ],
//      symbols[group4] = [ division ]
//  };

    key <AD12> {
        symbols[group1] = [ bracketright, braceright ],
        symbols[group3] = [ uacute, Uacute ],
        symbols[group4] = [ multiply ]
    };
    key <RTRN> { [ Return ] };

    //////////////////////////////////////////////////////////////
    // Third row.
    //////////////////////////////////////////////////////////////

    key <CAPS> { [ Caps_Lock ] };
    key <AC01> {
        symbols[group1] = [ a, A ],
        symbols[group3] = [ a, A ]
    };
    key <AC02> {
        symbols[group1] = [ s, S ],
        symbols[group3] = [ s, S ],
        symbols[group4] = [ dstroke ]
    };
    key <AC03> {
        symbols[group1] = [ d, D ],
        symbols[group3] = [ d, D ],
        symbols[group4] = [ Dstroke ]
    };
    key <AC04> {
        symbols[group1] = [ f, F ],
        symbols[group3] = [ f, F ],
        symbols[group4] = [ bracketleft ]
    };
    key <AC05> {
        symbols[group1] = [ g, G ],
        symbols[group3] = [ g, G ],
        symbols[group4] = [ bracketright ]
    };
    key <AC06> {
        symbols[group1] = [ h, H ],
        symbols[group3] = [ h, H ]
    };
    key <AC07> {
        symbols[group1] = [ j, J ],
        symbols[group3] = [ j, J ],
        symbols[group4] = [ iacute ]
    };
    key <AC08> {
        symbols[group1] = [ k, K ],
        symbols[group3] = [ k, K ],
        symbols[group4] = [ lstroke ]
    };
    key <AC09> {
        symbols[group1] = [ l, L ],
        symbols[group3] = [ l, L ],
        symbols[group4] = [ Lstroke ]
    };
    key <AC10> {
        symbols[group1] = [ semicolon, colon ],
        symbols[group3] = [ eacute, Eacute ],
        symbols[group4] = [ dollar ]
    };
    key <AC11> {
        symbols[group1] = [ quoteright, quotedbl ],
        symbols[group3] = [ aacute, Aacute ],
        symbols[group4] = [ ssharp ]
    };

    // The <BKSL> key should be `udoubleacute' in the Hungarian
    // (second) group, but there are very few applications that
    // understand that keysym.  Therefore, we have to settle for
    // `ucircumflex', which works almost anywhere.  The correct
    // definition is given in a comment below in case you live in an
    // ideal world, where applications speak Hungarian. :-) (See also
    // the keyname <AD11>.)

    key <BKSL> {
        symbols[group1] = [ backslash, bar ],
        symbols[group3] = [ ucircumflex, Ucircumflex ],
        symbols[group4] = [ currency ]
    };
//  key <BKSL> { 
//      symbols[group1] = [ backslash, bar ],
//      symbols[group3] = [ udoubleacute, Udoubleacute ],
//      symbols[group4] = [ currency ]
//  };


    //////////////////////////////////////////////////////////////
    // Fourth row.
    //////////////////////////////////////////////////////////////

    key <LFSH> { [ Shift_L ] };

    // Note that this should be the letter `y' in the Hungarian
    // (second) group, but I _detest_ QWERTZ layouts.  (You can force
    // QWERTZ by specifying the symbol configuration as
    // hunglish(pc10Xqwertz).)
    key <AB01> {
        symbols[group1] = [ z, Z ],
        symbols[group3] = [ z, Z ],
        symbols[group4] = [ greater ]
    };

    key <AB02> {
        symbols[group1] = [ x, X ],
        symbols[group3] = [ x, X ],
        symbols[group4] = [ numbersign ]
    };
    key <AB03> {
        symbols[group1] = [ c, C ],
        symbols[group3] = [ c, C ],
        symbols[group4] = [ ampersand ]
    };
    key <AB04> {
        symbols[group1] = [ v, V ],
        symbols[group3] = [ v, V ],
        symbols[group4] = [ at ]
    };
    key <AB05> {
        symbols[group1] = [ b, B ],
        symbols[group3] = [ b, B ],
        symbols[group4] = [ braceleft ]
    };
    key <AB06> {
        symbols[group1] = [ n, N ],
        symbols[group3] = [ n, N ],
        symbols[group4] = [ braceright ]
    };
    key <AB07> {
        symbols[group1] = [ m, M ],
        symbols[group3] = [ m, M ]
    };
    key <AB08> {
        symbols[group1] = [ comma, less ],
        symbols[group3] = [ comma, question ],
        symbols[group4] = [ semicolon ]
    };
    key <AB09> {
        symbols[group1] = [ period, greater ],
        symbols[group3] = [ period, colon ]
    };
    key <AB10> {
        symbols[group1] = [ slash, question ],
        symbols[group3] = [ minus, underscore ],
        symbols[group4] = [ asterisk ]
    };

    //////////////////////////////////////////////////////////////
    // Fifth (final) row.
    //////////////////////////////////////////////////////////////

    key <LCTL> { [ Control_L ] };
    key <SPCE> { [ space ] };

    //////////////////////////////////////////////////////////////
    // Modifier mappings.
    //////////////////////////////////////////////////////////////

    modifier_map Shift  { Shift_L };
    modifier_map Lock   { Caps_Lock };
    modifier_map Control{ Control_L };
};


//======================================================================

// Modifies the basic Hunglish defined above to be a QWERTZ layout.
// Eck!
partial alphanumeric_keys xkb_symbols "qwertz"
{
    key <AD06> {
        symbols[group1] = [ y, Y ],
        symbols[group3] = [ z, Z ]
    };
    key <AB01> {
        symbols[group1] = [ z, Z ],
        symbols[group3] = [ y, Y ],
        symbols[group4] = [ greater ]
    };
};

//======================================================================

// This modifies the basic Hunglish layout to put the digit `0' and
// the letter `' (iacute) to their standard places.  Useful if you
// have a Hungarian/European keyboard with 102/105 keys instead of 101/104.
partial alphanumeric_keys xkb_symbols "european"
{
    key <TLDE> {
        symbols[group1] = [ quoteleft, asciitilde ],
        symbols[group3] = [ 0, section ],
        symbols[group4] = [ notsign ]
    };
    key <LSGT> {
        symbols[group1] = [ less, greater ],
        symbols[group3] = [ iacute, Iacute ],
        symbols[group4] = [ less ]
    };
};

//======================================================================

partial xkb_symbols "right_alt_is_altgr"
{
    key <RALT> {  symbols[group1] = [ Alt_R, Meta_R ],
                  symbols[group2] = [ Alt_R, Meta_R ],
                  symbols[group3] = [ ISO_Group_Shift, ISO_Group_Shift ],
                  symbols[group4] = [ ISO_Group_Shift, ISO_Group_Shift ]
    };
};

//======================================================================

partial xkb_symbols "right_alt_is_modeshift"
{
    key <RALT> {  symbols[group1] = [ ISO_Group_Latch ],
                  symbols[group2] = [ ISO_Group_Latch ],
                  symbols[group3] = [ ISO_Group_Latch ],
                  symbols[group4] = [ ISO_Group_Latch ]
    };
};

//======================================================================

// Supplement the basic Hunglish layout with windows keys (defined as
// mode shift/compose).
partial xkb_symbols "win"
{
    key <RWIN> { [ ISO_Group_Latch, Multi_key ] };
    key <LWIN> { [ ISO_Group_Latch, Multi_key ] };
    key <MENU> { [ Multi_key ] };
};

//======================================================================

// Definition of a Hunglish layout for a typical 101-key keyboard.
// Includes the basic alphanumeric and punctuation keys and then
// defines the "extra" (right) modifier keys, function keys, cursor,
// edit, and keypad keys.
xkb_symbols "generic101" {
    include "hunglish(basic)"

    // Right modifier keys.
    key <RTSH> { [ Shift_R ] };
    key <LALT> { [ Alt_L, Meta_L ] };
    key <RCTL> { [ Control_R ] };
    key <RALT> { [ Alt_R, Meta_R ] };

    // Function keys.
    key <FK01> { type="HUNGLISH_FUNCTION", [ F1,  F13, F25 ] };
    key <FK02> { type="HUNGLISH_FUNCTION", [ F2,  F14, F26 ] };
    key <FK03> { type="HUNGLISH_FUNCTION", [ F3,  F15, F27 ] };
    key <FK04> { type="HUNGLISH_FUNCTION", [ F4,  F16, F28 ] };
    key <FK05> { type="HUNGLISH_FUNCTION", [ F5,  F17, F29 ] };
    key <FK06> { type="HUNGLISH_FUNCTION", [ F6,  F18, F30 ] };
    key <FK07> { type="HUNGLISH_FUNCTION", [ F7,  F19, F31 ] };
    key <FK08> { type="HUNGLISH_FUNCTION", [ F8,  F20, F32 ] };
    key <FK09> { type="HUNGLISH_FUNCTION", [ F9,  F21, F33 ] };
    key <FK10> { type="HUNGLISH_FUNCTION", [ F10, F22, F34 ] };
    key <FK11> { type="HUNGLISH_FUNCTION", [ F11, F23, F35 ] };
    key <FK12> { type="HUNGLISH_FUNCTION", [ F12, F24 ] };

    // System keys.

    // Print screen is defined to be the mode switch key.
    // SysReq stays on Alt-PrtScr.
    key <PRSC> {
        type= "PC_SYSRQ",
        symbols[Group1]= [ ISO_Last_Group, Execute ],
        symbols[Group2]= [ ISO_Last_Group, Execute ],
        symbols[Group3]= [ ISO_First_Group, Execute ],
        symbols[Group4]= [ ISO_First_Group, Execute ]
    };
    key <SCLK> { [ Scroll_Lock ] };
    key <PAUS> {
        type= "PC_BREAK",
        symbols[Group1]= [ Pause, Break ]
    };

    // Editing keys.
    key  <INS> { [ Insert ] };
    key <HOME> { [ Home ] };
    key <PGUP> { [ Prior ] };
    key <DELE> { [ Delete ] };
    key  <END> { [ End ] };
    key <PGDN> { [ Next ] };

    key   <UP> { [ Up ] };
    key <LEFT> { [ Left ] };
    key <DOWN> { [ Down ] };
    key <RGHT> { [ Right ] };

    // Keypad.

    key <NMLK> { [ Num_Lock, Pointer_EnableKeys ] };
    key <KPDV> { [ KP_Divide ] };
    key <KPMU> { [ KP_Multiply ] };
    key <KPSU> { [ KP_Subtract ] };

    key  <KP7> { [ KP_Home, KP_7 ] };
    key  <KP8> { [ KP_Up, KP_8 ] };
    key  <KP9> { [ KP_Prior, KP_9 ] };
    key <KPAD> { [ KP_Add ] };

    key  <KP4> { [ KP_Left, KP_4 ] };
    key  <KP5> { [ KP_Begin, KP_5 ] };
    key  <KP6> { [ KP_Right, KP_6 ] };

    key  <KP1> { [ KP_End, KP_1 ] };
    key  <KP2> { [ KP_Down, KP_2 ] };
    key  <KP3> { [ KP_Next, KP_3 ] };
    key <KPEN> { [ KP_Enter ] };

    key  <KP0> { [ KP_Insert, KP_0 ] };
    key <KPDL> { [ KP_Delete, KP_Decimal ] };

    // Modifier mappings.
    modifier_map Shift  { Shift_R };
    modifier_map Control{ Control_R };
    modifier_map Mod1   { Alt_L, Meta_L, Alt_R, Meta_R };
    modifier_map Mod2   { Num_Lock };
    modifier_map Mod5   { Scroll_Lock };
};

//======================================================================

// Definition for the PC-AT type 101 key keyboard.
xkb_symbols "pc101" {
    include "hunglish(generic101)"
    include "hunglish(right_alt_is_modeshift)"
};

// QWERTZ version of the above layout.
xkb_symbols "pc101qwertz" {
    include "hunglish(pc101)"
    include "hunglish(qwertz)"
};

//======================================================================


// Definition for the extra key on 102-key keyboards.
xkb_symbols "pc102" {
    include "hunglish(pc101)"
    include "hunglish(european)"
};

// QWERTZ version of the above layout.
xkb_symbols "pc102qwertz" {
    include "hunglish(pc102)"
    include "hunglish(qwertz)"
};



//======================================================================

// Definition for the extra keys on 104-key "Windows95" keyboards.
xkb_symbols "pc104" {
    include "hunglish(pc101)"
    include "hunglish(right_alt_is_altgr)"
    include "hunglish(win)"
};

// QWERTZ version of the above layout.
xkb_symbols "pc104qwertz" {
    include "hunglish(pc104)"
    include "hunglish(qwertz)"
};

//======================================================================

// Definition which includes both the Windows95 keyboards _and_
// the extra key on most European keyboards.  This is the default, because
// I happen to have such a keyboard at home. :-)
default xkb_symbols "pc105" {
    include "hunglish(pc104)"
    include "hunglish(european)"
};


// QWERTZ version of the above layout.
xkb_symbols "pc105qwertz" {
    include "hunglish(pc105)"
    include "hunglish(qwertz)"
};

