// Josh's Dvorak Keyboard Layout Some xtra stuff.
// Josh Rahm (joshuarahm@gmail.com)

default partial alphanumeric_keys
xkb_symbols "josh-dvorak-intl" {
  name[Group1]= "English (Josh, Dvorak, international with dead keys)";
  name[Group2]= "English (Josh, Dvorak, Vi Mode)";

  include "us(dvorak)"

  key.type = "EIGHT_LEVEL";

  key <ESC> {
    symbols = [NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
    NoSymbol, NoSymbol],
    actions = [
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True),
      SetMods(modifiers=level1,clearLocks=True)
    ]
  };

  key <LWIN> {
    symbols[Group1] = [Control_L, Control_L, Control_L, Control_L, Control_L, Control_L, Control_L, Control_L],
    symbols[Group2] = []
  };
  key <RWIN> {
    type[Group1]="ONE_LEVEL", symbols[Group1]=[ISO_Level3_Shift]
    // symbols[Group1] = [Control_R, Control_R, Control_R, Control_R, Control_R, Control_R, Control_R, Control_R],
    // symbols[Group2] = []
  };
  key <LCTL> {
    symbols[Group1] = [Hyper_L, Hyper_L, Hyper_L, Hyper_L, Hyper_L, Hyper_L, Hyper_L, Hyper_L],
    symbols[Group2] = []
  };
  key <RTSH> {
    symbols[Group1] = [ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift, ISO_Level5_Shift],
    symbols[Group2] = []
  };
  key <CAPS> {
    symbols[Group1] = [Escape, Escape, Home, Home, User, Pointer_EnableKeys, Delete, Delete],
    symbols[Group2] = []
  };
  key <RTRN> {
    symbols[Group1] = [Return, Return],
    symbols[Group2] = []
  }; // ‹Return›
  key <BKSP> {
    symbols[Group1] = [BackSpace],
    symbols[Group2] = []
  };
  key <TAB> {
    symbols[Group1] = [Super_L, ISO_Left_Tab],
    symbols[Group2] = []
  };
  key <RCTL> {
    symbols[Group1] = [Super_L, Super_L],
    symbols[Group2] = []
  };

  modifier_map Mod4 {<RCTL>, <TAB>};

  modifier_map Mod3 {<LCTL>};

  key <RALT> {
    type[Group1]="ONE_LEVEL", symbols[Group1]=[ISO_Level3_Shift]
  };
  modifier_map Mod5 {<RALT>};

  key <RTSH> {
    symbols[Group1] = type[Group1]="ONE_LEVEL", symbols[Group1]=[ISO_Level5_Shift],
    symbols[Group2] = []
  };
  modifier_map Lock {<RTSH> };

  // Set Menu and PrintScreen to Hyper.
  key <MENU> {
    symbols = [Hyper_R, Hyper_R],
    actions = [SetMods(modifiers=Mod3), SetMods(modifiers=Mod3)]
  };

  key <PRSC> {
    symbols = [Hyper_R, Hyper_R],
    actions = [SetMods(modifiers=Mod3), SetMods(modifiers=Mod3)]
  };

  key <TLDE> {
    symbols[Group1] = [grave, asciitilde, dead_grave, dead_tilde],
    symbols[Group2] = []
  };
  key <AE01> {
    symbols[Group1] = [1, exclam, exclamdown, onesuperior, U2081, U00B9],
    symbols[Group2] = []
  };
  key <AE02> {
    symbols[Group1] = [2, at, twosuperior, dead_doubleacute, U2082, U00B2],
    symbols[Group2] = []
  };
  key <AE03> {
    symbols[Group1] = [3, numbersign, threesuperior, dead_macron, U2083, threesuperior],
    symbols[Group2] = []
  };
  key <AE04> {
    symbols[Group1] = [4, dollar, currency, sterling, U2084, U2074],
    symbols[Group2] = []
  };
  key <AE05> {
    symbols[Group1] = [5, percent, EuroSign, dead_cedilla, U2085, U2075],
    symbols[Group2] = []
  };
  key <AE06> {
    symbols[Group1] = [6, dead_circumflex, onequarter, asciicircum, U2086, U2076],
    symbols[Group2] = []
  };
  key <AE07> {
    symbols[Group1] = [7, ampersand, onehalf, dead_horn, U2087, U2077],
    symbols[Group2] = []
  };
  key <AE08> {
    symbols[Group1] = [8, asterisk, threequarters, dead_ogonek, U2088, U2078, infinity],
    symbols[Group2] = []
  };
  key <AE09> {
    symbols[Group1] = [9, parenleft, leftsinglequotemark, dead_breve, U2089, U2079],
    symbols[Group2] = []
  };
  key <AE10> {
    symbols[Group1] = [0, parenright, rightsinglequotemark, dead_abovering, U2080, U2070],
    symbols[Group2] = []
  };
  key <AE11> {
    symbols[Group1] = [bracketleft, braceleft, guillemotleft, leftdoublequotemark],
    symbols[Group2] = []
  };
  key <AE12> {
    symbols[Group1] = [bracketright, braceright, guillemotright, rightdoublequotemark],
    symbols[Group2] = []
  };

  key <AD01> {
    symbols[Group1] = [apostrophe, quotedbl, dead_acute, dead_diaeresis],
    symbols[Group2] = []
  };
  key <AD02> {
    symbols[Group1] = [comma, less, ccedilla, Ccedilla, leftanglebracket, U2227],
    symbols[Group2] = [Pointer_Up, Pointer_Button4]
  };
  key <AD03> {
    symbols[Group1] = [period, greater, dead_abovedot, dead_caron, rightanglebracket, periodcentered, U2218, U2228],
    symbols[Group2] = []
  };
  key <AD04> {
    symbols[Group1] = [p, P, odiaeresis, Odiaeresis, Greek_pi, Greek_PI],
    symbols[Group2] = []
  };
  key <AD05> {
    symbols[Group1] = [y, Y, udiaeresis, Udiaeresis, Greek_upsilon, Greek_UPSILON],
    symbols[Group2] = []
  };

  key <AD06> {
    symbols[Group1] = [f, F, Greek_alpha, Greek_ALPHA, Greek_phi, Greek_PHI],
    symbols[Group2] = []
  };
  key <AD07> {
    symbols[Group1] = [g, G, Greek_epsilon, Greek_EPSILON, Greek_gamma, Greek_GAMMA],
    symbols[Group2] = []
  };
  key <AD08> {
    symbols[Group1] = [c, C, copyright, cent, Greek_psi, Greek_PSI],
    symbols[Group2] = []
  };
  key <AD09> {
    symbols[Group1] = [r, R, registered, registered, Greek_rho, Greek_RHO],
    symbols[Group2] = []
  };
  key <AD10> {
    symbols[Group1] = [l, L, oslash, Ooblique, Greek_lambda, Greek_LAMBDA],
    symbols[Group2] = [Right, Right, Pointer_Right]
  };
  key <AD11> {
    symbols[Group1] = [slash, question, questiondown, dead_hook],
    symbols[Group2] = []
  };
  key <AD12> {
    symbols[Group1] = [equal, plus, multiply, division, U2295, U2297, U229B, U29FA],
    symbols[Group2] = []
  }; // = + × ÷ ⊕ ⊗ ⊛ ∅

  key <AC01> {
    symbols[Group1] = [a, A, aacute, Aacute, Greek_alpha, Greek_ALPHA],
    symbols[Group2] = [Pointer_Left]
  };
  key <AC02> {
    symbols[Group1] = [o, O, oacute, Oacute, Greek_omicron, Greek_OMICRON, U01A1, U01A0],
    symbols[Group2] = [Pointer_Down, Pointer_Button5]
  };
  key <AC03> {
    symbols[Group1] = [e, E, eacute, Eacute, Greek_epsilon, Greek_EPSILON],
    symbols[Group2] = [Right]
  };
  key <AC04> {
    symbols[Group1] = [u, U, uacute, Uacute, Greek_theta, Greek_THETA],
    symbols[Group2] = [Prior, Prior, NoSymbol, NoSymbol, NoSymbol, NoSymbol]
  };
  key <AC05> {
    symbols[Group1] = [i, I, iacute, Iacute, Greek_iota, Greek_IOTA, U2208],
    symbols[Group2] = [ISO_Next_Group, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol]
  };
  key <AC05> {
    symbols[Group1] = [i, I, iacute, Iacute, Greek_iota, Greek_IOTA, U2208],
    symbols[Group2] = [ISO_Previous_Group]
  };
  key <AC06> {
    symbols[Group1] = [d, D, eth, ETH, Greek_delta, Greek_DELTA],
    symbols[Group2] = [Next, Next, NoSymbol, NoSymbol, NoSymbol, NoSymbol]
  };
  key <AC07> {
    symbols[Group1] = [h, H, Greek_lambda, Greek_LAMBDA, Greek_eta, Greek_ETA],
    symbols[Group2] = [Left, Left, Pointer_Left]
  };
  key <AC08> {
    symbols[Group1] = [t, T, thorn, THORN, Greek_tau, Greek_TAU],
    symbols[Group2] = []
  };
  key <AC09> {
    symbols[Group1] = [n, N, ntilde, Ntilde, Greek_nu, Greek_NU, U2115],
    symbols[Group2] = []
  };
  key <AC10> {
    symbols[Group1] = [s, S, ssharp, section, Greek_sigma, Greek_SIGMA, U017f, integral],
    symbols[Group2] = []
  };
  key <AC11> {
    symbols[Group1] = [minus, underscore, yen, dead_belowdot, U2500],
    symbols[Group2] = []
  };

  key <AB01> {
    symbols[Group1] = [semicolon, colon, paragraph, degree, Multi_key],
    symbols[Group2] = []
  };
  key <AB02> {
    symbols[Group1] = [q, Q, adiaeresis, Adiaeresis],
    symbols[Group2] = []
  };
  key <AB03> {
    symbols[Group1] = [j, J, idiaeresis, Idiaeresis, Greek_xi, Greek_XI],
    symbols[Group2] = [Down, Down, Pointer_Down]
  };
  key <AB04> {
    symbols[Group1] = [k, K, oe, OE, Greek_kappa, Greek_KAPPA],
    symbols[Group2] = [Up, Up, Pointer_Up]
  };
  key <AB05> {
    symbols[Group1] = [x, X, U2713, U2717, Greek_chi, Greek_CHI],
    symbols[Group2] = [Delete]
  };
  key <AB06> {
    symbols[Group1] = [b, B, Greek_beta, U2603, Greek_beta, Greek_BETA],
    symbols[Group2] = []
  };
  key <AB07> {
    symbols[Group1] = [m, M, mu, mu, Greek_mu, Greek_MU],
    symbols[Group2] = [NoSymbol]
  };
  key <AB08> {
    symbols[Group1] = [w, W, aring, Aring, Greek_finalsmallsigma],
    symbols[Group2] = []
  };
  key <AB09> {
    symbols[Group1] = [v, V, U1F609, U1F620, Greek_omega, Greek_OMEGA],
    symbols[Group2] = [NoSymbol]
  };
  key <AB10> {
    symbols[Group1] = [z, Z, ae, AE, Greek_zeta, Greek_ZETA],
    symbols[Group2] = []
  };

  key <BKSL> {
    symbols[Group1] = [backslash, bar, notsign, brokenbar, U2502],
    symbols[Group2] = []
  };
  key <SPCE> {
    symbols[Group1] = [space, space, U12001, U12002, U12003, U12004, U12005, U12006],
    symbols[Group2] = [Pointer_Button1]
  };

  key <DOWN> {
    symbols[Group1] = [Down, U2193, U21D3],
    symbols[Group2] = []
  };
  key <UP> {
    symbols[Group1] = [Up, U2191, U21D1],
    symbols[Group2] = []
  };
  key <LEFT> {
    symbols[Group1] = [Left, U2190, U21D0],
    symbols[Group2] = []
  };
  key <RGHT> {
    symbols[Group1] = [Right, U2192, U21D2],
    symbols[Group2] = []
  };

  // A random key none of my keyboards have. Map it to tab so I can use xcape.
  key <JPCM> {
    symbols[Group1] = [Tab],
    symbols[Group2] = []
  };
};

partial alphanumeric_keys
xkb_symbols "jdvp" {
  include "jr(josh-dvorak-intl)"
  
  name[Group1]= "English (Josh, Dovark, Programmer, International)";
  key.type = "EIGHT_LEVEL";

  key <TLDE> {
    symbols[Group1] = [dollar, asciitilde]
  };
  key <AE01> {
    symbols[Group1] = [ ampersand, percent ]
  };
  key <AE02> {
    symbols[Group1] = [ bracketleft, 7, currency, nosymbol, U2087, U2077 ]
  };
  key <AE03> {
    symbols[Group1] = [ braceleft, 5, cent, nosymbol, U2085, U2075 ]
  };
  key <AE04> {
    symbols[Group1] = [ braceright, 3, yen, nosymbol, U2083, threesuperior ]
  };
  key <AE05> {
    symbols[Group1] = [ parenleft, 1, EuroSign, nosymbol, U2081, U00B9 ]
  };
  key <AE06> {
    symbols[Group1] = [ equal, 9, sterling, nosymbol, U2089, U2079 ]
  };

  // symbols row, right side
  key <AE07> {
    symbols[Group1] = [asterisk, 0, nosymbol, nosymbol, U2080, U2070]
  };
  key <AE08> {
    symbols[Group1] = [ parenright, 2, onehalf, nosymbol, U2082, U00B2 ]
  };
  key <AE09> {
    symbols[Group1] = [ plus, 4, nosymbol, nosymbol, U2084, U2074 ]
  };
  key <AE10> {
    symbols[Group1] = [ bracketright, 6, nosymbol, nosymbol, U2086, U2076 ]
  };
  key <AE11> {
    symbols[Group1] = [ exclam, 8, exclamdown, U2E18, U2088, U2078 ]
  }; // reversed interrobang
  key <AE12> {
    symbols[Group1] = [ numbersign, grave, dead_grave ]
  };

  key <AD01> {
    symbols[Group1] = [ semicolon, colon, dead_diaeresis ]
  };
  key <AD12> {
    symbols[Group1] = [ at, asciicircum, dead_circumflex, dead_caron ]
  };

  key <AB01> {
    symbols[Group1] = [ apostrophe, quotedbl, dead_acute ]
  };
};

// The Royal Kludge Keyboard stupidly requires you to hold down Fn to toggle
// escape, so swap the escape key with the tilda key.
partial alphanumeric_keys
xkb_symbols "jdvprk" {
  include "jr(jdvp)"

  key <ESC> {
    symbols[Group1] = [ dollar, asciitilde ] ,
    symbols[Group2] = []
  };

  key <TLDE> {
    symbols[Group1] = [ Escape ]
  };
};
