diff --git a/src/config.rs b/src/config.rs index 74e0f40..b8a63df 100644 --- a/src/config.rs +++ b/src/config.rs @@ -15,8 +15,14 @@ #![allow(dead_code, clippy::module_name_repetitions)] +use crate::msg_listener::Action; use crate::Result; -use serde::Deserialize; +use breadx::auto::xproto::KeyButMask; +use serde::{ + de::{Deserializer, Visitor}, + Deserialize, +}; +use std::collections::HashMap; use std::path::PathBuf; #[derive(Clone, Debug, Deserialize)] @@ -27,6 +33,9 @@ pub struct XcrabConfig { gap_size: Option, outer_gap_size: Option, pub msg: Option, + #[allow(clippy::zero_sized_map_values)] // TODO: Action will be expanded in the future + #[serde(default)] + pub binds: HashMap, } #[derive(Clone, Debug, Deserialize)] @@ -48,6 +57,7 @@ impl Default for XcrabConfig { gap_size: Some(DEFAULT_GAP_SIZE), outer_gap_size: None, msg: Some(XcrabMsgConfig::default()), + binds: HashMap::new(), } } } @@ -96,3 +106,79 @@ pub fn load_file() -> Result { fn get_home() -> Result { Ok(std::env::var("HOME")?) } + +struct ActionVisitor; +impl<'de> Visitor<'de> for ActionVisitor { + type Value = Action; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a valid WM action") + } + + fn visit_str(self, value: &str) -> std::result::Result { + value.parse().map_err(|s| E::custom(s)) + } +} + +impl<'de> Deserialize<'de> for Action { + fn deserialize>(deserializer: D) -> std::result::Result { + deserializer.deserialize_str(ActionVisitor) + } +} + +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] +pub struct Keybind { + pub key: char, + pub mods: KeyButMask, +} + +struct KeybindVisitor; +impl<'de> Visitor<'de> for KeybindVisitor { + type Value = Keybind; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("a keybind in the form of 'M-x'") + } + + fn visit_str(self, value: &str) -> std::result::Result { + let mut mask = KeyButMask::default(); + + for part in value.split('-') { + if part.len() > 1 { + return Err(E::custom("parts may only contain one character")); + } + + let c = part + .chars() + .next() + .ok_or_else(|| E::custom("parts must contain at least one character"))?; + + if c.is_ascii_uppercase() { + // FIXME: add more as required + match c { + 'C' => mask.set_control(true), + 'S' => mask.set_shift(true), + 'A' => mask.set_mod1(true), // alt key + 'W' => mask.set_mod4(true), // super key, 'w' for windows because S is taken + _ => return Err(E::custom(format!("no such modifier: {}", c))), + }; + } + } + + // ignores extraneous keys + let c = value + .split('-') + .flat_map(str::chars) + .find(char::is_ascii_lowercase) + .ok_or_else(|| E::custom("must specify one normal key"))? + .to_ascii_uppercase(); + + Ok(Keybind { key: c, mods: mask }) + } +} + +impl<'de> Deserialize<'de> for Keybind { + fn deserialize>(deserializer: D) -> std::result::Result { + deserializer.deserialize_str(KeybindVisitor) + } +} diff --git a/src/keysymdef.rs b/src/keysymdef.rs new file mode 100644 index 0000000..ef732d0 --- /dev/null +++ b/src/keysymdef.rs @@ -0,0 +1,2107 @@ +/* automatically generated by rust-bindgen 0.60.1 */ + +#![allow(unused, clippy::unreadable_literal, dead_code)] +pub const VOID_SYMBOL: u32 = 16777215; +pub const BACKSPACE: u32 = 65288; +pub const TAB: u32 = 65289; +pub const LINEFEED: u32 = 65290; +pub const CLEAR: u32 = 65291; +pub const RETURN: u32 = 65293; +pub const PAUSE: u32 = 65299; +pub const SCROLL_LOCK: u32 = 65300; +pub const SYS_REQ: u32 = 65301; +pub const ESCAPE: u32 = 65307; +pub const DELETE: u32 = 65535; +pub const MULTI_KEY: u32 = 65312; +pub const CODEINPUT: u32 = 65335; +pub const SINGLE_CANDIDATE: u32 = 65340; +pub const MULTIPLE_CANDIDATE: u32 = 65341; +pub const PREVIOUS_CANDIDATE: u32 = 65342; +pub const KANJI: u32 = 65313; +pub const MUHENKAN: u32 = 65314; +pub const HENKAN_MODE: u32 = 65315; +pub const HENKAN: u32 = 65315; +pub const ROMAJI: u32 = 65316; +pub const HIRAGANA: u32 = 65317; +pub const KATAKANA: u32 = 65318; +pub const HIRAGANA_KATAKANA: u32 = 65319; +pub const ZENKAKU: u32 = 65320; +pub const HANKAKU: u32 = 65321; +pub const ZENKAKU_HANKAKU: u32 = 65322; +pub const TOUROKU: u32 = 65323; +pub const MASSYO: u32 = 65324; +pub const KANA_LOCK: u32 = 65325; +pub const KANA_SHIFT: u32 = 65326; +pub const EISU_SHIFT: u32 = 65327; +pub const EISU_TOGGLE: u32 = 65328; +pub const KANJI_BANGOU: u32 = 65335; +pub const ZEN_KOHO: u32 = 65341; +pub const MAE_KOHO: u32 = 65342; +pub const HOME: u32 = 65360; +pub const LEFT: u32 = 65361; +pub const UP: u32 = 65362; +pub const RIGHT: u32 = 65363; +pub const DOWN: u32 = 65364; +pub const PRIOR: u32 = 65365; +pub const PAGE_UP: u32 = 65365; +pub const NEXT: u32 = 65366; +pub const PAGE_DOWN: u32 = 65366; +pub const END: u32 = 65367; +pub const BEGIN: u32 = 65368; +pub const SELECT: u32 = 65376; +pub const PRINT: u32 = 65377; +pub const EXECUTE: u32 = 65378; +pub const INSERT: u32 = 65379; +pub const UNDO: u32 = 65381; +pub const REDO: u32 = 65382; +pub const MENU: u32 = 65383; +pub const FIND: u32 = 65384; +pub const CANCEL: u32 = 65385; +pub const HELP: u32 = 65386; +pub const BREAK: u32 = 65387; +pub const MODE_SWITCH: u32 = 65406; +pub const SCRIPT_SWITCH: u32 = 65406; +pub const NUMBER_LOCK: u32 = 65407; +pub const KP_SPACE: u32 = 65408; +pub const KP_TAB: u32 = 65417; +pub const KP_ENTER: u32 = 65421; +pub const KP_F1: u32 = 65425; +pub const KP_F2: u32 = 65426; +pub const KP_F3: u32 = 65427; +pub const KP_F4: u32 = 65428; +pub const KP_HOME: u32 = 65429; +pub const KP_LEFT: u32 = 65430; +pub const KP_UP: u32 = 65431; +pub const KP_RIGHT: u32 = 65432; +pub const KP_DOWN: u32 = 65433; +pub const KP_PRIOR: u32 = 65434; +pub const KP_PAGE_UP: u32 = 65434; +pub const KP_NEXT: u32 = 65435; +pub const KP_PAGE_DOWN: u32 = 65435; +pub const KP_END: u32 = 65436; +pub const KP_BEGIN: u32 = 65437; +pub const KP_INSERT: u32 = 65438; +pub const KP_DELETE: u32 = 65439; +pub const KP_EQUAL: u32 = 65469; +pub const KP_MULTIPLY: u32 = 65450; +pub const KP_ADD: u32 = 65451; +pub const KP_SEPARATOR: u32 = 65452; +pub const KP_SUBTRACT: u32 = 65453; +pub const KP_DECIMAL: u32 = 65454; +pub const KP_DIVIDE: u32 = 65455; +pub const KP_0: u32 = 65456; +pub const KP_1: u32 = 65457; +pub const KP_2: u32 = 65458; +pub const KP_3: u32 = 65459; +pub const KP_4: u32 = 65460; +pub const KP_5: u32 = 65461; +pub const KP_6: u32 = 65462; +pub const KP_7: u32 = 65463; +pub const KP_8: u32 = 65464; +pub const KP_9: u32 = 65465; +pub const F1: u32 = 65470; +pub const F2: u32 = 65471; +pub const F3: u32 = 65472; +pub const F4: u32 = 65473; +pub const F5: u32 = 65474; +pub const F6: u32 = 65475; +pub const F7: u32 = 65476; +pub const F8: u32 = 65477; +pub const F9: u32 = 65478; +pub const F10: u32 = 65479; +pub const F11: u32 = 65480; +pub const L1: u32 = 65480; +pub const F12: u32 = 65481; +pub const L2: u32 = 65481; +pub const F13: u32 = 65482; +pub const L3: u32 = 65482; +pub const F14: u32 = 65483; +pub const L4: u32 = 65483; +pub const F15: u32 = 65484; +pub const L5: u32 = 65484; +pub const F16: u32 = 65485; +pub const L6: u32 = 65485; +pub const F17: u32 = 65486; +pub const L7: u32 = 65486; +pub const F18: u32 = 65487; +pub const L8: u32 = 65487; +pub const F19: u32 = 65488; +pub const L9: u32 = 65488; +pub const F20: u32 = 65489; +pub const L10: u32 = 65489; +pub const F21: u32 = 65490; +pub const R1: u32 = 65490; +pub const F22: u32 = 65491; +pub const R2: u32 = 65491; +pub const F23: u32 = 65492; +pub const R3: u32 = 65492; +pub const F24: u32 = 65493; +pub const R4: u32 = 65493; +pub const F25: u32 = 65494; +pub const R5: u32 = 65494; +pub const F26: u32 = 65495; +pub const R6: u32 = 65495; +pub const F27: u32 = 65496; +pub const R7: u32 = 65496; +pub const F28: u32 = 65497; +pub const R8: u32 = 65497; +pub const F29: u32 = 65498; +pub const R9: u32 = 65498; +pub const F30: u32 = 65499; +pub const R10: u32 = 65499; +pub const F31: u32 = 65500; +pub const R11: u32 = 65500; +pub const F32: u32 = 65501; +pub const R12: u32 = 65501; +pub const F33: u32 = 65502; +pub const R13: u32 = 65502; +pub const F34: u32 = 65503; +pub const R14: u32 = 65503; +pub const F35: u32 = 65504; +pub const R15: u32 = 65504; +pub const SHIFT_L: u32 = 65505; +pub const SHIFT_R: u32 = 65506; +pub const CONTROL_L: u32 = 65507; +pub const CONTROL_R: u32 = 65508; +pub const CAPS_LOCK: u32 = 65509; +pub const SHIFT_LOCK: u32 = 65510; +pub const META_L: u32 = 65511; +pub const META_R: u32 = 65512; +pub const ALT_L: u32 = 65513; +pub const ALT_R: u32 = 65514; +pub const SUPER_L: u32 = 65515; +pub const SUPER_R: u32 = 65516; +pub const HYPER_L: u32 = 65517; +pub const HYPER_R: u32 = 65518; +pub const ISO_LOCK: u32 = 65025; +pub const ISO_LEVEL2_LOCK: u32 = 65026; +pub const ISO_LEVEL3_SHIFT: u32 = 65027; +pub const ISO_LEVEL3_LATCH: u32 = 65028; +pub const ISO_LEVEL3_LOCK: u32 = 65029; +pub const ISO_LEVEL5_SHIFT: u32 = 65041; +pub const ISO_LEVEL5_LATCH: u32 = 65042; +pub const ISO_LEVEL5_LOCK: u32 = 65043; +pub const ISO_GROUP_SHIFT: u32 = 65406; +pub const ISO_GROUP_LATCH: u32 = 65030; +pub const ISO_GROUP_LOCK: u32 = 65031; +pub const ISO_NEXT_GROUP: u32 = 65032; +pub const ISO_NEXT_GROUP_LOCK: u32 = 65033; +pub const ISO_PREV_GROUP: u32 = 65034; +pub const ISO_PREV_GROUP_LOCK: u32 = 65035; +pub const ISO_FIRST_GROUP: u32 = 65036; +pub const ISO_FIRST_GROUP_LOCK: u32 = 65037; +pub const ISO_LAST_GROUP: u32 = 65038; +pub const ISO_LAST_GROUP_LOCK: u32 = 65039; +pub const ISO_LEFT_TAB: u32 = 65056; +pub const ISO_MOVE_LINE_UP: u32 = 65057; +pub const ISO_MOVE_LINE_DOWN: u32 = 65058; +pub const ISO_PARTIAL_LINE_UP: u32 = 65059; +pub const ISO_PARTIAL_LINE_DOWN: u32 = 65060; +pub const ISO_PARTIAL_SPACE_LEFT: u32 = 65061; +pub const ISO_PARTIAL_SPACE_RIGHT: u32 = 65062; +pub const ISO_SET_MARGIN_LEFT: u32 = 65063; +pub const ISO_SET_MARGIN_RIGHT: u32 = 65064; +pub const ISO_RELEASE_MARGIN_LEFT: u32 = 65065; +pub const ISO_RELEASE_MARGIN_RIGHT: u32 = 65066; +pub const ISO_RELEASE_BOTH_MARGINS: u32 = 65067; +pub const ISO_FAST_CURSOR_LEFT: u32 = 65068; +pub const ISO_FAST_CURSOR_RIGHT: u32 = 65069; +pub const ISO_FAST_CURSOR_UP: u32 = 65070; +pub const ISO_FAST_CURSOR_DOWN: u32 = 65071; +pub const ISO_CONTINUOUS_UNDERLINE: u32 = 65072; +pub const ISO_DISCONTINUOUS_UNDERLINE: u32 = 65073; +pub const ISO_EMPHASIZE: u32 = 65074; +pub const ISO_CENTER_OBJECT: u32 = 65075; +pub const ISO_ENTER: u32 = 65076; +pub const DEAD_GRAVE: u32 = 65104; +pub const DEAD_ACUTE: u32 = 65105; +pub const DEAD_CIRCUMFLEX: u32 = 65106; +pub const DEAD_TILDE: u32 = 65107; +pub const DEAD_PERISPOMENI: u32 = 65107; +pub const DEAD_MACRON: u32 = 65108; +pub const DEAD_BREVE: u32 = 65109; +pub const DEAD_ABOVEDOT: u32 = 65110; +pub const DEAD_DIAERESIS: u32 = 65111; +pub const DEAD_ABOVERING: u32 = 65112; +pub const DEAD_DOUBLEACUTE: u32 = 65113; +pub const DEAD_CARON: u32 = 65114; +pub const DEAD_CEDILLA: u32 = 65115; +pub const DEAD_OGONEK: u32 = 65116; +pub const DEAD_IOTA: u32 = 65117; +pub const DEAD_VOICED_SOUND: u32 = 65118; +pub const DEAD_SEMIVOICED_SOUND: u32 = 65119; +pub const DEAD_BELOWDOT: u32 = 65120; +pub const DEAD_HOOK: u32 = 65121; +pub const DEAD_HORN: u32 = 65122; +pub const dead_stroke: u32 = 65123; +pub const DEAD_ABOVECOMMA: u32 = 65124; +pub const DEAD_PSILI: u32 = 65124; +pub const DEAD_ABOVEREVERSEDCOMMA: u32 = 65125; +pub const DEAD_DASIA: u32 = 65125; +pub const DEAD_DOUBLEGRAVE: u32 = 65126; +pub const DEAD_BELOWRING: u32 = 65127; +pub const DEAD_BELOWMACRON: u32 = 65128; +pub const DEAD_BELOWCIRCUMFLEX: u32 = 65129; +pub const dead_belowtilde: u32 = 65130; +pub const dead_belowbreve: u32 = 65131; +pub const dead_belowdiaeresis: u32 = 65132; +pub const dead_invertedbreve: u32 = 65133; +pub const dead_belowcomma: u32 = 65134; +pub const dead_currency: u32 = 65135; +pub const dead_lowline: u32 = 65168; +pub const dead_aboveverticalline: u32 = 65169; +pub const dead_belowverticalline: u32 = 65170; +pub const dead_longsolidusoverlay: u32 = 65171; +pub const dead_a: u32 = 65152; +pub const dead_A: u32 = 65153; +pub const dead_e: u32 = 65154; +pub const dead_E: u32 = 65155; +pub const dead_i: u32 = 65156; +pub const dead_I: u32 = 65157; +pub const dead_o: u32 = 65158; +pub const dead_O: u32 = 65159; +pub const dead_u: u32 = 65160; +pub const dead_U: u32 = 65161; +pub const dead_small_schwa: u32 = 65162; +pub const dead_capital_schwa: u32 = 65163; +pub const dead_greek: u32 = 65164; +pub const First_Virtual_Screen: u32 = 65232; +pub const Prev_Virtual_Screen: u32 = 65233; +pub const Next_Virtual_Screen: u32 = 65234; +pub const Last_Virtual_Screen: u32 = 65236; +pub const Terminate_Server: u32 = 65237; +pub const AccessX_Enable: u32 = 65136; +pub const AccessX_Feedback_Enable: u32 = 65137; +pub const RepeatKeys_Enable: u32 = 65138; +pub const SlowKeys_Enable: u32 = 65139; +pub const BounceKeys_Enable: u32 = 65140; +pub const StickyKeys_Enable: u32 = 65141; +pub const MouseKeys_Enable: u32 = 65142; +pub const MouseKeys_Accel_Enable: u32 = 65143; +pub const Overlay1_Enable: u32 = 65144; +pub const Overlay2_Enable: u32 = 65145; +pub const AudibleBell_Enable: u32 = 65146; +pub const Pointer_Left: u32 = 65248; +pub const Pointer_Right: u32 = 65249; +pub const Pointer_Up: u32 = 65250; +pub const Pointer_Down: u32 = 65251; +pub const Pointer_UpLeft: u32 = 65252; +pub const Pointer_UpRight: u32 = 65253; +pub const Pointer_DownLeft: u32 = 65254; +pub const Pointer_DownRight: u32 = 65255; +pub const Pointer_Button_Dflt: u32 = 65256; +pub const Pointer_Button1: u32 = 65257; +pub const Pointer_Button2: u32 = 65258; +pub const Pointer_Button3: u32 = 65259; +pub const Pointer_Button4: u32 = 65260; +pub const Pointer_Button5: u32 = 65261; +pub const Pointer_DblClick_Dflt: u32 = 65262; +pub const Pointer_DblClick1: u32 = 65263; +pub const Pointer_DblClick2: u32 = 65264; +pub const Pointer_DblClick3: u32 = 65265; +pub const Pointer_DblClick4: u32 = 65266; +pub const Pointer_DblClick5: u32 = 65267; +pub const Pointer_Drag_Dflt: u32 = 65268; +pub const Pointer_Drag1: u32 = 65269; +pub const Pointer_Drag2: u32 = 65270; +pub const Pointer_Drag3: u32 = 65271; +pub const Pointer_Drag4: u32 = 65272; +pub const Pointer_Drag5: u32 = 65277; +pub const Pointer_EnableKeys: u32 = 65273; +pub const Pointer_Accelerate: u32 = 65274; +pub const Pointer_DfltBtnNext: u32 = 65275; +pub const Pointer_DfltBtnPrev: u32 = 65276; +pub const ch: u32 = 65184; +pub const Ch: u32 = 65185; +pub const CH: u32 = 65186; +pub const c_h: u32 = 65187; +pub const C_h: u32 = 65188; +pub const C_H: u32 = 65189; +pub const Duplicate_3270: u32 = 64769; +pub const FieldMark_3270: u32 = 64770; +pub const Right2_3270: u32 = 64771; +pub const Left2_3270: u32 = 64772; +pub const BackTab_3270: u32 = 64773; +pub const EraseEOF_3270: u32 = 64774; +pub const EraseInput_3270: u32 = 64775; +pub const Reset_3270: u32 = 64776; +pub const Quit_3270: u32 = 64777; +pub const PA1_3270: u32 = 64778; +pub const PA2_3270: u32 = 64779; +pub const PA3_3270: u32 = 64780; +pub const Test_3270: u32 = 64781; +pub const Attn_3270: u32 = 64782; +pub const CursorBlink_3270: u32 = 64783; +pub const AltCursor_3270: u32 = 64784; +pub const KeyClick_3270: u32 = 64785; +pub const Jump_3270: u32 = 64786; +pub const Ident_3270: u32 = 64787; +pub const Rule_3270: u32 = 64788; +pub const Copy_3270: u32 = 64789; +pub const Play_3270: u32 = 64790; +pub const Setup_3270: u32 = 64791; +pub const Record_3270: u32 = 64792; +pub const ChangeScreen_3270: u32 = 64793; +pub const DeleteWord_3270: u32 = 64794; +pub const ExSelect_3270: u32 = 64795; +pub const CursorSelect_3270: u32 = 64796; +pub const PrintScreen_3270: u32 = 64797; +pub const Enter_3270: u32 = 64798; +pub const SPACE: u32 = 32; +pub const EXCLAM: u32 = 33; +pub const QUOTEDBL: u32 = 34; +pub const NUMBERSIGN: u32 = 35; +pub const DOLLAR: u32 = 36; +pub const PERCENT: u32 = 37; +pub const APERSAND: u32 = 38; +pub const APOSTROPHE: u32 = 39; +pub const QUOTERIGHT: u32 = 39; +pub const PARENLEFT: u32 = 40; +pub const PARENRIGHT: u32 = 41; +pub const ASTERISK: u32 = 42; +pub const PLUS: u32 = 43; +pub const COMMA: u32 = 44; +pub const MINUS: u32 = 45; +pub const PERIOD: u32 = 46; +pub const SLASH: u32 = 47; +pub const N_0: u32 = 48; +pub const N_1: u32 = 49; +pub const N_2: u32 = 50; +pub const N_3: u32 = 51; +pub const N_4: u32 = 52; +pub const N_5: u32 = 53; +pub const N_6: u32 = 54; +pub const N_7: u32 = 55; +pub const N_8: u32 = 56; +pub const N_9: u32 = 57; +pub const COLON: u32 = 58; +pub const SEMICOLON: u32 = 59; +pub const LESS: u32 = 60; +pub const EQUAL: u32 = 61; +pub const GREATER: u32 = 62; +pub const QUESTION: u32 = 63; +pub const AT: u32 = 64; +pub const UPPER_A: u32 = 65; +pub const UPPER_B: u32 = 66; +pub const UPPER_C: u32 = 67; +pub const UPPER_D: u32 = 68; +pub const UPPER_E: u32 = 69; +pub const UPPER_F: u32 = 70; +pub const UPPER_G: u32 = 71; +pub const UPPER_H: u32 = 72; +pub const UPPER_I: u32 = 73; +pub const UPPER_J: u32 = 74; +pub const UPPER_K: u32 = 75; +pub const UPPER_L: u32 = 76; +pub const UPPER_M: u32 = 77; +pub const UPPER_N: u32 = 78; +pub const UPPER_O: u32 = 79; +pub const UPPER_P: u32 = 80; +pub const UPPER_Q: u32 = 81; +pub const UPPER_R: u32 = 82; +pub const UPPER_S: u32 = 83; +pub const UPPER_T: u32 = 84; +pub const UPPER_U: u32 = 85; +pub const UPPER_V: u32 = 86; +pub const UPPER_W: u32 = 87; +pub const UPPER_X: u32 = 88; +pub const UPPER_Y: u32 = 89; +pub const UPPER_Z: u32 = 90; +pub const BRACKETLEFT: u32 = 91; +pub const BACKSLASH: u32 = 92; +pub const BRACKETRIGHT: u32 = 93; +pub const ASCIICIRCUM: u32 = 94; +pub const UNDERSCORE: u32 = 95; +pub const GRAVE: u32 = 96; +pub const QUOTELEFT: u32 = 96; +pub const LOWER_A: u32 = 97; +pub const LOWER_B: u32 = 98; +pub const LOWER_C: u32 = 99; +pub const LOWER_D: u32 = 100; +pub const LOWER_E: u32 = 101; +pub const LOWER_F: u32 = 102; +pub const LOWER_G: u32 = 103; +pub const LOWER_H: u32 = 104; +pub const LOWER_I: u32 = 105; +pub const LOWER_J: u32 = 106; +pub const LOWER_K: u32 = 107; +pub const LOWER_L: u32 = 108; +pub const LOWER_M: u32 = 109; +pub const LOWER_N: u32 = 110; +pub const LOWER_O: u32 = 111; +pub const LOWER_P: u32 = 112; +pub const LOWER_Q: u32 = 113; +pub const LOWER_R: u32 = 114; +pub const LOWER_S: u32 = 115; +pub const LOWER_T: u32 = 116; +pub const LOWER_U: u32 = 117; +pub const LOWER_V: u32 = 118; +pub const LOWER_W: u32 = 119; +pub const LOWER_X: u32 = 120; +pub const LOWER_Y: u32 = 121; +pub const LOWER_Z: u32 = 122; +pub const BRACELEFT: u32 = 123; +pub const BAR: u32 = 124; +pub const BRACERIGHT: u32 = 125; +pub const ASCIITILDI: u32 = 126; +pub const NOBREAKSPACE: u32 = 160; +pub const EXCLAMDOWN: u32 = 161; +pub const cent: u32 = 162; +pub const sterling: u32 = 163; +pub const currency: u32 = 164; +pub const yen: u32 = 165; +pub const brokenbar: u32 = 166; +pub const section: u32 = 167; +pub const diaeresis: u32 = 168; +pub const copyright: u32 = 169; +pub const ordfeminine: u32 = 170; +pub const guillemotleft: u32 = 171; +pub const notsign: u32 = 172; +pub const hyphen: u32 = 173; +pub const registered: u32 = 174; +pub const macron: u32 = 175; +pub const degree: u32 = 176; +pub const plusminus: u32 = 177; +pub const twosuperior: u32 = 178; +pub const threesuperior: u32 = 179; +pub const acute: u32 = 180; +pub const mu: u32 = 181; +pub const paragraph: u32 = 182; +pub const periodcentered: u32 = 183; +pub const cedilla: u32 = 184; +pub const onesuperior: u32 = 185; +pub const masculine: u32 = 186; +pub const guillemotright: u32 = 187; +pub const onequarter: u32 = 188; +pub const onehalf: u32 = 189; +pub const threequarters: u32 = 190; +pub const questiondown: u32 = 191; +pub const Agrave: u32 = 192; +pub const Aacute: u32 = 193; +pub const Acircumflex: u32 = 194; +pub const Atilde: u32 = 195; +pub const Adiaeresis: u32 = 196; +pub const Aring: u32 = 197; +pub const AE: u32 = 198; +pub const Ccedilla: u32 = 199; +pub const Egrave: u32 = 200; +pub const Eacute: u32 = 201; +pub const Ecircumflex: u32 = 202; +pub const Ediaeresis: u32 = 203; +pub const Igrave: u32 = 204; +pub const Iacute: u32 = 205; +pub const Icircumflex: u32 = 206; +pub const Idiaeresis: u32 = 207; +pub const ETH: u32 = 208; +pub const Eth: u32 = 208; +pub const Ntilde: u32 = 209; +pub const Ograve: u32 = 210; +pub const Oacute: u32 = 211; +pub const Ocircumflex: u32 = 212; +pub const Otilde: u32 = 213; +pub const Odiaeresis: u32 = 214; +pub const multiply: u32 = 215; +pub const Oslash: u32 = 216; +pub const Ooblique: u32 = 216; +pub const Ugrave: u32 = 217; +pub const Uacute: u32 = 218; +pub const Ucircumflex: u32 = 219; +pub const Udiaeresis: u32 = 220; +pub const Yacute: u32 = 221; +pub const THORN: u32 = 222; +pub const Thorn: u32 = 222; +pub const ssharp: u32 = 223; +pub const agrave: u32 = 224; +pub const aacute: u32 = 225; +pub const acircumflex: u32 = 226; +pub const atilde: u32 = 227; +pub const adiaeresis: u32 = 228; +pub const aring: u32 = 229; +pub const ae: u32 = 230; +pub const ccedilla: u32 = 231; +pub const egrave: u32 = 232; +pub const eacute: u32 = 233; +pub const ecircumflex: u32 = 234; +pub const ediaeresis: u32 = 235; +pub const igrave: u32 = 236; +pub const iacute: u32 = 237; +pub const icircumflex: u32 = 238; +pub const idiaeresis: u32 = 239; +pub const eth: u32 = 240; +pub const ntilde: u32 = 241; +pub const ograve: u32 = 242; +pub const oacute: u32 = 243; +pub const ocircumflex: u32 = 244; +pub const otilde: u32 = 245; +pub const odiaeresis: u32 = 246; +pub const division: u32 = 247; +pub const oslash: u32 = 248; +pub const ooblique: u32 = 248; +pub const ugrave: u32 = 249; +pub const uacute: u32 = 250; +pub const ucircumflex: u32 = 251; +pub const udiaeresis: u32 = 252; +pub const yacute: u32 = 253; +pub const thorn: u32 = 254; +pub const ydiaeresis: u32 = 255; +pub const Aogonek: u32 = 417; +pub const breve: u32 = 418; +pub const Lstroke: u32 = 419; +pub const Lcaron: u32 = 421; +pub const Sacute: u32 = 422; +pub const Scaron: u32 = 425; +pub const Scedilla: u32 = 426; +pub const Tcaron: u32 = 427; +pub const Zacute: u32 = 428; +pub const Zcaron: u32 = 430; +pub const Zabovedot: u32 = 431; +pub const aogonek: u32 = 433; +pub const ogonek: u32 = 434; +pub const lstroke: u32 = 435; +pub const lcaron: u32 = 437; +pub const sacute: u32 = 438; +pub const caron: u32 = 439; +pub const scaron: u32 = 441; +pub const scedilla: u32 = 442; +pub const tcaron: u32 = 443; +pub const zacute: u32 = 444; +pub const doubleacute: u32 = 445; +pub const zcaron: u32 = 446; +pub const zabovedot: u32 = 447; +pub const Racute: u32 = 448; +pub const Abreve: u32 = 451; +pub const Lacute: u32 = 453; +pub const Cacute: u32 = 454; +pub const Ccaron: u32 = 456; +pub const Eogonek: u32 = 458; +pub const Ecaron: u32 = 460; +pub const Dcaron: u32 = 463; +pub const Dstroke: u32 = 464; +pub const Nacute: u32 = 465; +pub const Ncaron: u32 = 466; +pub const Odoubleacute: u32 = 469; +pub const Rcaron: u32 = 472; +pub const Uring: u32 = 473; +pub const Udoubleacute: u32 = 475; +pub const Tcedilla: u32 = 478; +pub const racute: u32 = 480; +pub const abreve: u32 = 483; +pub const lacute: u32 = 485; +pub const cacute: u32 = 486; +pub const ccaron: u32 = 488; +pub const eogonek: u32 = 490; +pub const ecaron: u32 = 492; +pub const dcaron: u32 = 495; +pub const dstroke: u32 = 496; +pub const nacute: u32 = 497; +pub const ncaron: u32 = 498; +pub const odoubleacute: u32 = 501; +pub const rcaron: u32 = 504; +pub const uring: u32 = 505; +pub const udoubleacute: u32 = 507; +pub const tcedilla: u32 = 510; +pub const abovedot: u32 = 511; +pub const Hstroke: u32 = 673; +pub const Hcircumflex: u32 = 678; +pub const Iabovedot: u32 = 681; +pub const Gbreve: u32 = 683; +pub const Jcircumflex: u32 = 684; +pub const hstroke: u32 = 689; +pub const hcircumflex: u32 = 694; +pub const idotless: u32 = 697; +pub const gbreve: u32 = 699; +pub const jcircumflex: u32 = 700; +pub const Cabovedot: u32 = 709; +pub const Ccircumflex: u32 = 710; +pub const Gabovedot: u32 = 725; +pub const Gcircumflex: u32 = 728; +pub const Ubreve: u32 = 733; +pub const Scircumflex: u32 = 734; +pub const cabovedot: u32 = 741; +pub const ccircumflex: u32 = 742; +pub const gabovedot: u32 = 757; +pub const gcircumflex: u32 = 760; +pub const ubreve: u32 = 765; +pub const scircumflex: u32 = 766; +pub const kra: u32 = 930; +pub const kappa: u32 = 930; +pub const Rcedilla: u32 = 931; +pub const Itilde: u32 = 933; +pub const Lcedilla: u32 = 934; +pub const Emacron: u32 = 938; +pub const Gcedilla: u32 = 939; +pub const Tslash: u32 = 940; +pub const rcedilla: u32 = 947; +pub const itilde: u32 = 949; +pub const lcedilla: u32 = 950; +pub const emacron: u32 = 954; +pub const gcedilla: u32 = 955; +pub const tslash: u32 = 956; +pub const ENG: u32 = 957; +pub const eng: u32 = 959; +pub const Amacron: u32 = 960; +pub const Iogonek: u32 = 967; +pub const Eabovedot: u32 = 972; +pub const Imacron: u32 = 975; +pub const Ncedilla: u32 = 977; +pub const Omacron: u32 = 978; +pub const Kcedilla: u32 = 979; +pub const Uogonek: u32 = 985; +pub const Utilde: u32 = 989; +pub const Umacron: u32 = 990; +pub const amacron: u32 = 992; +pub const iogonek: u32 = 999; +pub const eabovedot: u32 = 1004; +pub const imacron: u32 = 1007; +pub const ncedilla: u32 = 1009; +pub const omacron: u32 = 1010; +pub const kcedilla: u32 = 1011; +pub const uogonek: u32 = 1017; +pub const utilde: u32 = 1021; +pub const umacron: u32 = 1022; +pub const Wcircumflex: u32 = 16777588; +pub const wcircumflex: u32 = 16777589; +pub const Ycircumflex: u32 = 16777590; +pub const ycircumflex: u32 = 16777591; +pub const Babovedot: u32 = 16784898; +pub const babovedot: u32 = 16784899; +pub const Dabovedot: u32 = 16784906; +pub const dabovedot: u32 = 16784907; +pub const Fabovedot: u32 = 16784926; +pub const fabovedot: u32 = 16784927; +pub const Mabovedot: u32 = 16784960; +pub const mabovedot: u32 = 16784961; +pub const Pabovedot: u32 = 16784982; +pub const pabovedot: u32 = 16784983; +pub const Sabovedot: u32 = 16784992; +pub const sabovedot: u32 = 16784993; +pub const Tabovedot: u32 = 16785002; +pub const tabovedot: u32 = 16785003; +pub const Wgrave: u32 = 16785024; +pub const wgrave: u32 = 16785025; +pub const Wacute: u32 = 16785026; +pub const wacute: u32 = 16785027; +pub const Wdiaeresis: u32 = 16785028; +pub const wdiaeresis: u32 = 16785029; +pub const Ygrave: u32 = 16785138; +pub const ygrave: u32 = 16785139; +pub const OE: u32 = 5052; +pub const oe: u32 = 5053; +pub const Ydiaeresis: u32 = 5054; +pub const overline: u32 = 1150; +pub const kana_fullstop: u32 = 1185; +pub const kana_openingbracket: u32 = 1186; +pub const kana_closingbracket: u32 = 1187; +pub const kana_comma: u32 = 1188; +pub const kana_conjunctive: u32 = 1189; +pub const kana_middledot: u32 = 1189; +pub const kana_WO: u32 = 1190; +pub const kana_a: u32 = 1191; +pub const kana_i: u32 = 1192; +pub const kana_u: u32 = 1193; +pub const kana_e: u32 = 1194; +pub const kana_o: u32 = 1195; +pub const kana_ya: u32 = 1196; +pub const kana_yu: u32 = 1197; +pub const kana_yo: u32 = 1198; +pub const kana_tsu: u32 = 1199; +pub const kana_tu: u32 = 1199; +pub const prolongedsound: u32 = 1200; +pub const kana_A: u32 = 1201; +pub const kana_I: u32 = 1202; +pub const kana_U: u32 = 1203; +pub const kana_E: u32 = 1204; +pub const kana_O: u32 = 1205; +pub const kana_KA: u32 = 1206; +pub const kana_KI: u32 = 1207; +pub const kana_KU: u32 = 1208; +pub const kana_KE: u32 = 1209; +pub const kana_KO: u32 = 1210; +pub const kana_SA: u32 = 1211; +pub const kana_SHI: u32 = 1212; +pub const kana_SU: u32 = 1213; +pub const kana_SE: u32 = 1214; +pub const kana_SO: u32 = 1215; +pub const kana_TA: u32 = 1216; +pub const kana_CHI: u32 = 1217; +pub const kana_TI: u32 = 1217; +pub const kana_TSU: u32 = 1218; +pub const kana_TU: u32 = 1218; +pub const kana_TE: u32 = 1219; +pub const kana_TO: u32 = 1220; +pub const kana_NA: u32 = 1221; +pub const kana_NI: u32 = 1222; +pub const kana_NU: u32 = 1223; +pub const kana_NE: u32 = 1224; +pub const kana_NO: u32 = 1225; +pub const kana_HA: u32 = 1226; +pub const kana_HI: u32 = 1227; +pub const kana_FU: u32 = 1228; +pub const kana_HU: u32 = 1228; +pub const kana_HE: u32 = 1229; +pub const kana_HO: u32 = 1230; +pub const kana_MA: u32 = 1231; +pub const kana_MI: u32 = 1232; +pub const kana_MU: u32 = 1233; +pub const kana_ME: u32 = 1234; +pub const kana_MO: u32 = 1235; +pub const kana_YA: u32 = 1236; +pub const kana_YU: u32 = 1237; +pub const kana_YO: u32 = 1238; +pub const kana_RA: u32 = 1239; +pub const kana_RI: u32 = 1240; +pub const kana_RU: u32 = 1241; +pub const kana_RE: u32 = 1242; +pub const kana_RO: u32 = 1243; +pub const kana_WA: u32 = 1244; +pub const kana_N: u32 = 1245; +pub const voicedsound: u32 = 1246; +pub const semivoicedsound: u32 = 1247; +pub const kana_switch: u32 = 65406; +pub const Farsi_0: u32 = 16778992; +pub const Farsi_1: u32 = 16778993; +pub const Farsi_2: u32 = 16778994; +pub const Farsi_3: u32 = 16778995; +pub const Farsi_4: u32 = 16778996; +pub const Farsi_5: u32 = 16778997; +pub const Farsi_6: u32 = 16778998; +pub const Farsi_7: u32 = 16778999; +pub const Farsi_8: u32 = 16779000; +pub const Farsi_9: u32 = 16779001; +pub const Arabic_percent: u32 = 16778858; +pub const Arabic_superscript_alef: u32 = 16778864; +pub const Arabic_tteh: u32 = 16778873; +pub const Arabic_peh: u32 = 16778878; +pub const Arabic_tcheh: u32 = 16778886; +pub const Arabic_ddal: u32 = 16778888; +pub const Arabic_rreh: u32 = 16778897; +pub const Arabic_comma: u32 = 1452; +pub const Arabic_fullstop: u32 = 16778964; +pub const Arabic_0: u32 = 16778848; +pub const Arabic_1: u32 = 16778849; +pub const Arabic_2: u32 = 16778850; +pub const Arabic_3: u32 = 16778851; +pub const Arabic_4: u32 = 16778852; +pub const Arabic_5: u32 = 16778853; +pub const Arabic_6: u32 = 16778854; +pub const Arabic_7: u32 = 16778855; +pub const Arabic_8: u32 = 16778856; +pub const Arabic_9: u32 = 16778857; +pub const Arabic_semicolon: u32 = 1467; +pub const Arabic_question_mark: u32 = 1471; +pub const Arabic_hamza: u32 = 1473; +pub const Arabic_maddaonalef: u32 = 1474; +pub const Arabic_hamzaonalef: u32 = 1475; +pub const Arabic_hamzaonwaw: u32 = 1476; +pub const Arabic_hamzaunderalef: u32 = 1477; +pub const Arabic_hamzaonyeh: u32 = 1478; +pub const Arabic_alef: u32 = 1479; +pub const Arabic_beh: u32 = 1480; +pub const Arabic_tehmarbuta: u32 = 1481; +pub const Arabic_teh: u32 = 1482; +pub const Arabic_theh: u32 = 1483; +pub const Arabic_jeem: u32 = 1484; +pub const Arabic_hah: u32 = 1485; +pub const Arabic_khah: u32 = 1486; +pub const Arabic_dal: u32 = 1487; +pub const Arabic_thal: u32 = 1488; +pub const Arabic_ra: u32 = 1489; +pub const Arabic_zain: u32 = 1490; +pub const Arabic_seen: u32 = 1491; +pub const Arabic_sheen: u32 = 1492; +pub const Arabic_sad: u32 = 1493; +pub const Arabic_dad: u32 = 1494; +pub const Arabic_tah: u32 = 1495; +pub const Arabic_zah: u32 = 1496; +pub const Arabic_ain: u32 = 1497; +pub const Arabic_ghain: u32 = 1498; +pub const Arabic_tatweel: u32 = 1504; +pub const Arabic_feh: u32 = 1505; +pub const Arabic_qaf: u32 = 1506; +pub const Arabic_kaf: u32 = 1507; +pub const Arabic_lam: u32 = 1508; +pub const Arabic_meem: u32 = 1509; +pub const Arabic_noon: u32 = 1510; +pub const Arabic_ha: u32 = 1511; +pub const Arabic_heh: u32 = 1511; +pub const Arabic_waw: u32 = 1512; +pub const Arabic_alefmaksura: u32 = 1513; +pub const Arabic_yeh: u32 = 1514; +pub const Arabic_fathatan: u32 = 1515; +pub const Arabic_dammatan: u32 = 1516; +pub const Arabic_kasratan: u32 = 1517; +pub const Arabic_fatha: u32 = 1518; +pub const Arabic_damma: u32 = 1519; +pub const Arabic_kasra: u32 = 1520; +pub const Arabic_shadda: u32 = 1521; +pub const Arabic_sukun: u32 = 1522; +pub const Arabic_madda_above: u32 = 16778835; +pub const Arabic_hamza_above: u32 = 16778836; +pub const Arabic_hamza_below: u32 = 16778837; +pub const Arabic_jeh: u32 = 16778904; +pub const Arabic_veh: u32 = 16778916; +pub const Arabic_keheh: u32 = 16778921; +pub const Arabic_gaf: u32 = 16778927; +pub const Arabic_noon_ghunna: u32 = 16778938; +pub const Arabic_heh_doachashmee: u32 = 16778942; +pub const Farsi_yeh: u32 = 16778956; +pub const Arabic_farsi_yeh: u32 = 16778956; +pub const Arabic_yeh_baree: u32 = 16778962; +pub const Arabic_heh_goal: u32 = 16778945; +pub const Arabic_switch: u32 = 65406; +pub const Cyrillic_GHE_bar: u32 = 16778386; +pub const Cyrillic_ghe_bar: u32 = 16778387; +pub const Cyrillic_ZHE_descender: u32 = 16778390; +pub const Cyrillic_zhe_descender: u32 = 16778391; +pub const Cyrillic_KA_descender: u32 = 16778394; +pub const Cyrillic_ka_descender: u32 = 16778395; +pub const Cyrillic_KA_vertstroke: u32 = 16778396; +pub const Cyrillic_ka_vertstroke: u32 = 16778397; +pub const Cyrillic_EN_descender: u32 = 16778402; +pub const Cyrillic_en_descender: u32 = 16778403; +pub const Cyrillic_U_straight: u32 = 16778414; +pub const Cyrillic_u_straight: u32 = 16778415; +pub const Cyrillic_U_straight_bar: u32 = 16778416; +pub const Cyrillic_u_straight_bar: u32 = 16778417; +pub const Cyrillic_HA_descender: u32 = 16778418; +pub const Cyrillic_ha_descender: u32 = 16778419; +pub const Cyrillic_CHE_descender: u32 = 16778422; +pub const Cyrillic_che_descender: u32 = 16778423; +pub const Cyrillic_CHE_vertstroke: u32 = 16778424; +pub const Cyrillic_che_vertstroke: u32 = 16778425; +pub const Cyrillic_SHHA: u32 = 16778426; +pub const Cyrillic_shha: u32 = 16778427; +pub const Cyrillic_SCHWA: u32 = 16778456; +pub const Cyrillic_schwa: u32 = 16778457; +pub const Cyrillic_I_macron: u32 = 16778466; +pub const Cyrillic_i_macron: u32 = 16778467; +pub const Cyrillic_O_bar: u32 = 16778472; +pub const Cyrillic_o_bar: u32 = 16778473; +pub const Cyrillic_U_macron: u32 = 16778478; +pub const Cyrillic_u_macron: u32 = 16778479; +pub const Serbian_dje: u32 = 1697; +pub const Macedonia_gje: u32 = 1698; +pub const Cyrillic_io: u32 = 1699; +pub const Ukrainian_ie: u32 = 1700; +pub const Ukranian_je: u32 = 1700; +pub const Macedonia_dse: u32 = 1701; +pub const Ukrainian_i: u32 = 1702; +pub const Ukranian_i: u32 = 1702; +pub const Ukrainian_yi: u32 = 1703; +pub const Ukranian_yi: u32 = 1703; +pub const Cyrillic_je: u32 = 1704; +pub const Serbian_je: u32 = 1704; +pub const Cyrillic_lje: u32 = 1705; +pub const Serbian_lje: u32 = 1705; +pub const Cyrillic_nje: u32 = 1706; +pub const Serbian_nje: u32 = 1706; +pub const Serbian_tshe: u32 = 1707; +pub const Macedonia_kje: u32 = 1708; +pub const Ukrainian_ghe_with_upturn: u32 = 1709; +pub const Byelorussian_shortu: u32 = 1710; +pub const Cyrillic_dzhe: u32 = 1711; +pub const Serbian_dze: u32 = 1711; +pub const numerosign: u32 = 1712; +pub const Serbian_DJE: u32 = 1713; +pub const Macedonia_GJE: u32 = 1714; +pub const Cyrillic_IO: u32 = 1715; +pub const Ukrainian_IE: u32 = 1716; +pub const Ukranian_JE: u32 = 1716; +pub const Macedonia_DSE: u32 = 1717; +pub const Ukrainian_I: u32 = 1718; +pub const Ukranian_I: u32 = 1718; +pub const Ukrainian_YI: u32 = 1719; +pub const Ukranian_YI: u32 = 1719; +pub const Cyrillic_JE: u32 = 1720; +pub const Serbian_JE: u32 = 1720; +pub const Cyrillic_LJE: u32 = 1721; +pub const Serbian_LJE: u32 = 1721; +pub const Cyrillic_NJE: u32 = 1722; +pub const Serbian_NJE: u32 = 1722; +pub const Serbian_TSHE: u32 = 1723; +pub const Macedonia_KJE: u32 = 1724; +pub const Ukrainian_GHE_WITH_UPTURN: u32 = 1725; +pub const Byelorussian_SHORTU: u32 = 1726; +pub const Cyrillic_DZHE: u32 = 1727; +pub const Serbian_DZE: u32 = 1727; +pub const Cyrillic_yu: u32 = 1728; +pub const Cyrillic_a: u32 = 1729; +pub const Cyrillic_be: u32 = 1730; +pub const Cyrillic_tse: u32 = 1731; +pub const Cyrillic_de: u32 = 1732; +pub const Cyrillic_ie: u32 = 1733; +pub const Cyrillic_ef: u32 = 1734; +pub const Cyrillic_ghe: u32 = 1735; +pub const Cyrillic_ha: u32 = 1736; +pub const Cyrillic_i: u32 = 1737; +pub const Cyrillic_shorti: u32 = 1738; +pub const Cyrillic_ka: u32 = 1739; +pub const Cyrillic_el: u32 = 1740; +pub const Cyrillic_em: u32 = 1741; +pub const Cyrillic_en: u32 = 1742; +pub const Cyrillic_o: u32 = 1743; +pub const Cyrillic_pe: u32 = 1744; +pub const Cyrillic_ya: u32 = 1745; +pub const Cyrillic_er: u32 = 1746; +pub const Cyrillic_es: u32 = 1747; +pub const Cyrillic_te: u32 = 1748; +pub const Cyrillic_u: u32 = 1749; +pub const Cyrillic_zhe: u32 = 1750; +pub const Cyrillic_ve: u32 = 1751; +pub const Cyrillic_softsign: u32 = 1752; +pub const Cyrillic_yeru: u32 = 1753; +pub const Cyrillic_ze: u32 = 1754; +pub const Cyrillic_sha: u32 = 1755; +pub const Cyrillic_e: u32 = 1756; +pub const Cyrillic_shcha: u32 = 1757; +pub const Cyrillic_che: u32 = 1758; +pub const Cyrillic_hardsign: u32 = 1759; +pub const Cyrillic_YU: u32 = 1760; +pub const Cyrillic_A: u32 = 1761; +pub const Cyrillic_BE: u32 = 1762; +pub const Cyrillic_TSE: u32 = 1763; +pub const Cyrillic_DE: u32 = 1764; +pub const Cyrillic_IE: u32 = 1765; +pub const Cyrillic_EF: u32 = 1766; +pub const Cyrillic_GHE: u32 = 1767; +pub const Cyrillic_HA: u32 = 1768; +pub const Cyrillic_I: u32 = 1769; +pub const Cyrillic_SHORTI: u32 = 1770; +pub const Cyrillic_KA: u32 = 1771; +pub const Cyrillic_EL: u32 = 1772; +pub const Cyrillic_EM: u32 = 1773; +pub const Cyrillic_EN: u32 = 1774; +pub const Cyrillic_O: u32 = 1775; +pub const Cyrillic_PE: u32 = 1776; +pub const Cyrillic_YA: u32 = 1777; +pub const Cyrillic_ER: u32 = 1778; +pub const Cyrillic_ES: u32 = 1779; +pub const Cyrillic_TE: u32 = 1780; +pub const Cyrillic_U: u32 = 1781; +pub const Cyrillic_ZHE: u32 = 1782; +pub const Cyrillic_VE: u32 = 1783; +pub const Cyrillic_SOFTSIGN: u32 = 1784; +pub const Cyrillic_YERU: u32 = 1785; +pub const Cyrillic_ZE: u32 = 1786; +pub const Cyrillic_SHA: u32 = 1787; +pub const Cyrillic_E: u32 = 1788; +pub const Cyrillic_SHCHA: u32 = 1789; +pub const Cyrillic_CHE: u32 = 1790; +pub const Cyrillic_HARDSIGN: u32 = 1791; +pub const Greek_ALPHAaccent: u32 = 1953; +pub const Greek_EPSILONaccent: u32 = 1954; +pub const Greek_ETAaccent: u32 = 1955; +pub const Greek_IOTAaccent: u32 = 1956; +pub const Greek_IOTAdieresis: u32 = 1957; +pub const Greek_IOTAdiaeresis: u32 = 1957; +pub const Greek_OMICRONaccent: u32 = 1959; +pub const Greek_UPSILONaccent: u32 = 1960; +pub const Greek_UPSILONdieresis: u32 = 1961; +pub const Greek_OMEGAaccent: u32 = 1963; +pub const Greek_accentdieresis: u32 = 1966; +pub const Greek_horizbar: u32 = 1967; +pub const Greek_alphaaccent: u32 = 1969; +pub const Greek_epsilonaccent: u32 = 1970; +pub const Greek_etaaccent: u32 = 1971; +pub const Greek_iotaaccent: u32 = 1972; +pub const Greek_iotadieresis: u32 = 1973; +pub const Greek_iotaaccentdieresis: u32 = 1974; +pub const Greek_omicronaccent: u32 = 1975; +pub const Greek_upsilonaccent: u32 = 1976; +pub const Greek_upsilondieresis: u32 = 1977; +pub const Greek_upsilonaccentdieresis: u32 = 1978; +pub const Greek_omegaaccent: u32 = 1979; +pub const Greek_ALPHA: u32 = 1985; +pub const Greek_BETA: u32 = 1986; +pub const Greek_GAMMA: u32 = 1987; +pub const Greek_DELTA: u32 = 1988; +pub const Greek_EPSILON: u32 = 1989; +pub const Greek_ZETA: u32 = 1990; +pub const Greek_ETA: u32 = 1991; +pub const Greek_THETA: u32 = 1992; +pub const Greek_IOTA: u32 = 1993; +pub const Greek_KAPPA: u32 = 1994; +pub const Greek_LAMDA: u32 = 1995; +pub const Greek_LAMBDA: u32 = 1995; +pub const Greek_MU: u32 = 1996; +pub const Greek_NU: u32 = 1997; +pub const Greek_XI: u32 = 1998; +pub const Greek_OMICRON: u32 = 1999; +pub const Greek_PI: u32 = 2000; +pub const Greek_RHO: u32 = 2001; +pub const Greek_SIGMA: u32 = 2002; +pub const Greek_TAU: u32 = 2004; +pub const Greek_UPSILON: u32 = 2005; +pub const Greek_PHI: u32 = 2006; +pub const Greek_CHI: u32 = 2007; +pub const Greek_PSI: u32 = 2008; +pub const Greek_OMEGA: u32 = 2009; +pub const Greek_alpha: u32 = 2017; +pub const Greek_beta: u32 = 2018; +pub const Greek_gamma: u32 = 2019; +pub const Greek_delta: u32 = 2020; +pub const Greek_epsilon: u32 = 2021; +pub const Greek_zeta: u32 = 2022; +pub const Greek_eta: u32 = 2023; +pub const Greek_theta: u32 = 2024; +pub const Greek_iota: u32 = 2025; +pub const Greek_kappa: u32 = 2026; +pub const Greek_lamda: u32 = 2027; +pub const Greek_lambda: u32 = 2027; +pub const Greek_mu: u32 = 2028; +pub const Greek_nu: u32 = 2029; +pub const Greek_xi: u32 = 2030; +pub const Greek_omicron: u32 = 2031; +pub const Greek_pi: u32 = 2032; +pub const Greek_rho: u32 = 2033; +pub const Greek_sigma: u32 = 2034; +pub const Greek_finalsmallsigma: u32 = 2035; +pub const Greek_tau: u32 = 2036; +pub const Greek_upsilon: u32 = 2037; +pub const Greek_phi: u32 = 2038; +pub const Greek_chi: u32 = 2039; +pub const Greek_psi: u32 = 2040; +pub const Greek_omega: u32 = 2041; +pub const Greek_switch: u32 = 65406; +pub const leftradical: u32 = 2209; +pub const topleftradical: u32 = 2210; +pub const horizconnector: u32 = 2211; +pub const topintegral: u32 = 2212; +pub const botintegral: u32 = 2213; +pub const vertconnector: u32 = 2214; +pub const topleftsqbracket: u32 = 2215; +pub const botleftsqbracket: u32 = 2216; +pub const toprightsqbracket: u32 = 2217; +pub const botrightsqbracket: u32 = 2218; +pub const topleftparens: u32 = 2219; +pub const botleftparens: u32 = 2220; +pub const toprightparens: u32 = 2221; +pub const botrightparens: u32 = 2222; +pub const leftmiddlecurlybrace: u32 = 2223; +pub const rightmiddlecurlybrace: u32 = 2224; +pub const topleftsummation: u32 = 2225; +pub const botleftsummation: u32 = 2226; +pub const topvertsummationconnector: u32 = 2227; +pub const botvertsummationconnector: u32 = 2228; +pub const toprightsummation: u32 = 2229; +pub const botrightsummation: u32 = 2230; +pub const rightmiddlesummation: u32 = 2231; +pub const lessthanequal: u32 = 2236; +pub const notequal: u32 = 2237; +pub const greaterthanequal: u32 = 2238; +pub const integral: u32 = 2239; +pub const therefore: u32 = 2240; +pub const variation: u32 = 2241; +pub const infinity: u32 = 2242; +pub const nabla: u32 = 2245; +pub const approximate: u32 = 2248; +pub const similarequal: u32 = 2249; +pub const ifonlyif: u32 = 2253; +pub const implies: u32 = 2254; +pub const identical: u32 = 2255; +pub const radical: u32 = 2262; +pub const includedin: u32 = 2266; +pub const includes: u32 = 2267; +pub const intersection: u32 = 2268; +pub const union: u32 = 2269; +pub const logicaland: u32 = 2270; +pub const logicalor: u32 = 2271; +pub const partialderivative: u32 = 2287; +pub const function: u32 = 2294; +pub const leftarrow: u32 = 2299; +pub const uparrow: u32 = 2300; +pub const rightarrow: u32 = 2301; +pub const downarrow: u32 = 2302; +pub const blank: u32 = 2527; +pub const soliddiamond: u32 = 2528; +pub const checkerboard: u32 = 2529; +pub const ht: u32 = 2530; +pub const ff: u32 = 2531; +pub const cr: u32 = 2532; +pub const lf: u32 = 2533; +pub const nl: u32 = 2536; +pub const vt: u32 = 2537; +pub const lowrightcorner: u32 = 2538; +pub const uprightcorner: u32 = 2539; +pub const upleftcorner: u32 = 2540; +pub const lowleftcorner: u32 = 2541; +pub const crossinglines: u32 = 2542; +pub const horizlinescan1: u32 = 2543; +pub const horizlinescan3: u32 = 2544; +pub const horizlinescan5: u32 = 2545; +pub const horizlinescan7: u32 = 2546; +pub const horizlinescan9: u32 = 2547; +pub const leftt: u32 = 2548; +pub const rightt: u32 = 2549; +pub const bott: u32 = 2550; +pub const topt: u32 = 2551; +pub const vertbar: u32 = 2552; +pub const emspace: u32 = 2721; +pub const enspace: u32 = 2722; +pub const em3space: u32 = 2723; +pub const em4space: u32 = 2724; +pub const digitspace: u32 = 2725; +pub const punctspace: u32 = 2726; +pub const thinspace: u32 = 2727; +pub const hairspace: u32 = 2728; +pub const emdash: u32 = 2729; +pub const endash: u32 = 2730; +pub const signifblank: u32 = 2732; +pub const ellipsis: u32 = 2734; +pub const doubbaselinedot: u32 = 2735; +pub const onethird: u32 = 2736; +pub const twothirds: u32 = 2737; +pub const onefifth: u32 = 2738; +pub const twofifths: u32 = 2739; +pub const threefifths: u32 = 2740; +pub const fourfifths: u32 = 2741; +pub const onesixth: u32 = 2742; +pub const fivesixths: u32 = 2743; +pub const careof: u32 = 2744; +pub const figdash: u32 = 2747; +pub const leftanglebracket: u32 = 2748; +pub const decimalpoint: u32 = 2749; +pub const rightanglebracket: u32 = 2750; +pub const marker: u32 = 2751; +pub const oneeighth: u32 = 2755; +pub const threeeighths: u32 = 2756; +pub const fiveeighths: u32 = 2757; +pub const seveneighths: u32 = 2758; +pub const trademark: u32 = 2761; +pub const signaturemark: u32 = 2762; +pub const trademarkincircle: u32 = 2763; +pub const leftopentriangle: u32 = 2764; +pub const rightopentriangle: u32 = 2765; +pub const emopencircle: u32 = 2766; +pub const emopenrectangle: u32 = 2767; +pub const leftsinglequotemark: u32 = 2768; +pub const rightsinglequotemark: u32 = 2769; +pub const leftdoublequotemark: u32 = 2770; +pub const rightdoublequotemark: u32 = 2771; +pub const prescription: u32 = 2772; +pub const permille: u32 = 2773; +pub const minutes: u32 = 2774; +pub const seconds: u32 = 2775; +pub const latincross: u32 = 2777; +pub const hexagram: u32 = 2778; +pub const filledrectbullet: u32 = 2779; +pub const filledlefttribullet: u32 = 2780; +pub const filledrighttribullet: u32 = 2781; +pub const emfilledcircle: u32 = 2782; +pub const emfilledrect: u32 = 2783; +pub const enopencircbullet: u32 = 2784; +pub const enopensquarebullet: u32 = 2785; +pub const openrectbullet: u32 = 2786; +pub const opentribulletup: u32 = 2787; +pub const opentribulletdown: u32 = 2788; +pub const openstar: u32 = 2789; +pub const enfilledcircbullet: u32 = 2790; +pub const enfilledsqbullet: u32 = 2791; +pub const filledtribulletup: u32 = 2792; +pub const filledtribulletdown: u32 = 2793; +pub const leftpointer: u32 = 2794; +pub const rightpointer: u32 = 2795; +pub const club: u32 = 2796; +pub const diamond: u32 = 2797; +pub const heart: u32 = 2798; +pub const maltesecross: u32 = 2800; +pub const dagger: u32 = 2801; +pub const doubledagger: u32 = 2802; +pub const checkmark: u32 = 2803; +pub const ballotcross: u32 = 2804; +pub const musicalsharp: u32 = 2805; +pub const musicalflat: u32 = 2806; +pub const malesymbol: u32 = 2807; +pub const femalesymbol: u32 = 2808; +pub const telephone: u32 = 2809; +pub const telephonerecorder: u32 = 2810; +pub const phonographcopyright: u32 = 2811; +pub const caret: u32 = 2812; +pub const singlelowquotemark: u32 = 2813; +pub const doublelowquotemark: u32 = 2814; +pub const cursor: u32 = 2815; +pub const leftcaret: u32 = 2979; +pub const rightcaret: u32 = 2982; +pub const downcaret: u32 = 2984; +pub const upcaret: u32 = 2985; +pub const overbar: u32 = 3008; +pub const downtack: u32 = 3010; +pub const upshoe: u32 = 3011; +pub const downstile: u32 = 3012; +pub const underbar: u32 = 3014; +pub const jot: u32 = 3018; +pub const quad: u32 = 3020; +pub const uptack: u32 = 3022; +pub const circle: u32 = 3023; +pub const upstile: u32 = 3027; +pub const downshoe: u32 = 3030; +pub const rightshoe: u32 = 3032; +pub const leftshoe: u32 = 3034; +pub const lefttack: u32 = 3036; +pub const righttack: u32 = 3068; +pub const hebrew_doublelowline: u32 = 3295; +pub const hebrew_aleph: u32 = 3296; +pub const hebrew_bet: u32 = 3297; +pub const hebrew_beth: u32 = 3297; +pub const hebrew_gimel: u32 = 3298; +pub const hebrew_gimmel: u32 = 3298; +pub const hebrew_dalet: u32 = 3299; +pub const hebrew_daleth: u32 = 3299; +pub const hebrew_he: u32 = 3300; +pub const hebrew_waw: u32 = 3301; +pub const hebrew_zain: u32 = 3302; +pub const hebrew_zayin: u32 = 3302; +pub const hebrew_chet: u32 = 3303; +pub const hebrew_het: u32 = 3303; +pub const hebrew_tet: u32 = 3304; +pub const hebrew_teth: u32 = 3304; +pub const hebrew_yod: u32 = 3305; +pub const hebrew_finalkaph: u32 = 3306; +pub const hebrew_kaph: u32 = 3307; +pub const hebrew_lamed: u32 = 3308; +pub const hebrew_finalmem: u32 = 3309; +pub const hebrew_mem: u32 = 3310; +pub const hebrew_finalnun: u32 = 3311; +pub const hebrew_nun: u32 = 3312; +pub const hebrew_samech: u32 = 3313; +pub const hebrew_samekh: u32 = 3313; +pub const hebrew_ayin: u32 = 3314; +pub const hebrew_finalpe: u32 = 3315; +pub const hebrew_pe: u32 = 3316; +pub const hebrew_finalzade: u32 = 3317; +pub const hebrew_finalzadi: u32 = 3317; +pub const hebrew_zade: u32 = 3318; +pub const hebrew_zadi: u32 = 3318; +pub const hebrew_qoph: u32 = 3319; +pub const hebrew_kuf: u32 = 3319; +pub const hebrew_resh: u32 = 3320; +pub const hebrew_shin: u32 = 3321; +pub const hebrew_taw: u32 = 3322; +pub const hebrew_taf: u32 = 3322; +pub const Hebrew_switch: u32 = 65406; +pub const Thai_kokai: u32 = 3489; +pub const Thai_khokhai: u32 = 3490; +pub const Thai_khokhuat: u32 = 3491; +pub const Thai_khokhwai: u32 = 3492; +pub const Thai_khokhon: u32 = 3493; +pub const Thai_khorakhang: u32 = 3494; +pub const Thai_ngongu: u32 = 3495; +pub const Thai_chochan: u32 = 3496; +pub const Thai_choching: u32 = 3497; +pub const Thai_chochang: u32 = 3498; +pub const Thai_soso: u32 = 3499; +pub const Thai_chochoe: u32 = 3500; +pub const Thai_yoying: u32 = 3501; +pub const Thai_dochada: u32 = 3502; +pub const Thai_topatak: u32 = 3503; +pub const Thai_thothan: u32 = 3504; +pub const Thai_thonangmontho: u32 = 3505; +pub const Thai_thophuthao: u32 = 3506; +pub const Thai_nonen: u32 = 3507; +pub const Thai_dodek: u32 = 3508; +pub const Thai_totao: u32 = 3509; +pub const Thai_thothung: u32 = 3510; +pub const Thai_thothahan: u32 = 3511; +pub const Thai_thothong: u32 = 3512; +pub const Thai_nonu: u32 = 3513; +pub const Thai_bobaimai: u32 = 3514; +pub const Thai_popla: u32 = 3515; +pub const Thai_phophung: u32 = 3516; +pub const Thai_fofa: u32 = 3517; +pub const Thai_phophan: u32 = 3518; +pub const Thai_fofan: u32 = 3519; +pub const Thai_phosamphao: u32 = 3520; +pub const Thai_moma: u32 = 3521; +pub const Thai_yoyak: u32 = 3522; +pub const Thai_rorua: u32 = 3523; +pub const Thai_ru: u32 = 3524; +pub const Thai_loling: u32 = 3525; +pub const Thai_lu: u32 = 3526; +pub const Thai_wowaen: u32 = 3527; +pub const Thai_sosala: u32 = 3528; +pub const Thai_sorusi: u32 = 3529; +pub const Thai_sosua: u32 = 3530; +pub const Thai_hohip: u32 = 3531; +pub const Thai_lochula: u32 = 3532; +pub const Thai_oang: u32 = 3533; +pub const Thai_honokhuk: u32 = 3534; +pub const Thai_paiyannoi: u32 = 3535; +pub const Thai_saraa: u32 = 3536; +pub const Thai_maihanakat: u32 = 3537; +pub const Thai_saraaa: u32 = 3538; +pub const Thai_saraam: u32 = 3539; +pub const Thai_sarai: u32 = 3540; +pub const Thai_saraii: u32 = 3541; +pub const Thai_saraue: u32 = 3542; +pub const Thai_sarauee: u32 = 3543; +pub const Thai_sarau: u32 = 3544; +pub const Thai_sarauu: u32 = 3545; +pub const Thai_phinthu: u32 = 3546; +pub const Thai_maihanakat_maitho: u32 = 3550; +pub const Thai_baht: u32 = 3551; +pub const Thai_sarae: u32 = 3552; +pub const Thai_saraae: u32 = 3553; +pub const Thai_sarao: u32 = 3554; +pub const Thai_saraaimaimuan: u32 = 3555; +pub const Thai_saraaimaimalai: u32 = 3556; +pub const Thai_lakkhangyao: u32 = 3557; +pub const Thai_maiyamok: u32 = 3558; +pub const Thai_maitaikhu: u32 = 3559; +pub const Thai_maiek: u32 = 3560; +pub const Thai_maitho: u32 = 3561; +pub const Thai_maitri: u32 = 3562; +pub const Thai_maichattawa: u32 = 3563; +pub const Thai_thanthakhat: u32 = 3564; +pub const Thai_nikhahit: u32 = 3565; +pub const Thai_leksun: u32 = 3568; +pub const Thai_leknung: u32 = 3569; +pub const Thai_leksong: u32 = 3570; +pub const Thai_leksam: u32 = 3571; +pub const Thai_leksi: u32 = 3572; +pub const Thai_lekha: u32 = 3573; +pub const Thai_lekhok: u32 = 3574; +pub const Thai_lekchet: u32 = 3575; +pub const Thai_lekpaet: u32 = 3576; +pub const Thai_lekkao: u32 = 3577; +pub const Hangul: u32 = 65329; +pub const Hangul_Start: u32 = 65330; +pub const Hangul_End: u32 = 65331; +pub const Hangul_Hanja: u32 = 65332; +pub const Hangul_Jamo: u32 = 65333; +pub const Hangul_Romaja: u32 = 65334; +pub const Hangul_Codeinput: u32 = 65335; +pub const Hangul_Jeonja: u32 = 65336; +pub const Hangul_Banja: u32 = 65337; +pub const Hangul_PreHanja: u32 = 65338; +pub const Hangul_PostHanja: u32 = 65339; +pub const Hangul_SingleCandidate: u32 = 65340; +pub const Hangul_MultipleCandidate: u32 = 65341; +pub const Hangul_PreviousCandidate: u32 = 65342; +pub const Hangul_Special: u32 = 65343; +pub const Hangul_switch: u32 = 65406; +pub const Hangul_Kiyeog: u32 = 3745; +pub const Hangul_SsangKiyeog: u32 = 3746; +pub const Hangul_KiyeogSios: u32 = 3747; +pub const Hangul_Nieun: u32 = 3748; +pub const Hangul_NieunJieuj: u32 = 3749; +pub const Hangul_NieunHieuh: u32 = 3750; +pub const Hangul_Dikeud: u32 = 3751; +pub const Hangul_SsangDikeud: u32 = 3752; +pub const Hangul_Rieul: u32 = 3753; +pub const Hangul_RieulKiyeog: u32 = 3754; +pub const Hangul_RieulMieum: u32 = 3755; +pub const Hangul_RieulPieub: u32 = 3756; +pub const Hangul_RieulSios: u32 = 3757; +pub const Hangul_RieulTieut: u32 = 3758; +pub const Hangul_RieulPhieuf: u32 = 3759; +pub const Hangul_RieulHieuh: u32 = 3760; +pub const Hangul_Mieum: u32 = 3761; +pub const Hangul_Pieub: u32 = 3762; +pub const Hangul_SsangPieub: u32 = 3763; +pub const Hangul_PieubSios: u32 = 3764; +pub const Hangul_Sios: u32 = 3765; +pub const Hangul_SsangSios: u32 = 3766; +pub const Hangul_Ieung: u32 = 3767; +pub const Hangul_Jieuj: u32 = 3768; +pub const Hangul_SsangJieuj: u32 = 3769; +pub const Hangul_Cieuc: u32 = 3770; +pub const Hangul_Khieuq: u32 = 3771; +pub const Hangul_Tieut: u32 = 3772; +pub const Hangul_Phieuf: u32 = 3773; +pub const Hangul_Hieuh: u32 = 3774; +pub const Hangul_A: u32 = 3775; +pub const Hangul_AE: u32 = 3776; +pub const Hangul_YA: u32 = 3777; +pub const Hangul_YAE: u32 = 3778; +pub const Hangul_EO: u32 = 3779; +pub const Hangul_E: u32 = 3780; +pub const Hangul_YEO: u32 = 3781; +pub const Hangul_YE: u32 = 3782; +pub const Hangul_O: u32 = 3783; +pub const Hangul_WA: u32 = 3784; +pub const Hangul_WAE: u32 = 3785; +pub const Hangul_OE: u32 = 3786; +pub const Hangul_YO: u32 = 3787; +pub const Hangul_U: u32 = 3788; +pub const Hangul_WEO: u32 = 3789; +pub const Hangul_WE: u32 = 3790; +pub const Hangul_WI: u32 = 3791; +pub const Hangul_YU: u32 = 3792; +pub const Hangul_EU: u32 = 3793; +pub const Hangul_YI: u32 = 3794; +pub const Hangul_I: u32 = 3795; +pub const Hangul_J_Kiyeog: u32 = 3796; +pub const Hangul_J_SsangKiyeog: u32 = 3797; +pub const Hangul_J_KiyeogSios: u32 = 3798; +pub const Hangul_J_Nieun: u32 = 3799; +pub const Hangul_J_NieunJieuj: u32 = 3800; +pub const Hangul_J_NieunHieuh: u32 = 3801; +pub const Hangul_J_Dikeud: u32 = 3802; +pub const Hangul_J_Rieul: u32 = 3803; +pub const Hangul_J_RieulKiyeog: u32 = 3804; +pub const Hangul_J_RieulMieum: u32 = 3805; +pub const Hangul_J_RieulPieub: u32 = 3806; +pub const Hangul_J_RieulSios: u32 = 3807; +pub const Hangul_J_RieulTieut: u32 = 3808; +pub const Hangul_J_RieulPhieuf: u32 = 3809; +pub const Hangul_J_RieulHieuh: u32 = 3810; +pub const Hangul_J_Mieum: u32 = 3811; +pub const Hangul_J_Pieub: u32 = 3812; +pub const Hangul_J_PieubSios: u32 = 3813; +pub const Hangul_J_Sios: u32 = 3814; +pub const Hangul_J_SsangSios: u32 = 3815; +pub const Hangul_J_Ieung: u32 = 3816; +pub const Hangul_J_Jieuj: u32 = 3817; +pub const Hangul_J_Cieuc: u32 = 3818; +pub const Hangul_J_Khieuq: u32 = 3819; +pub const Hangul_J_Tieut: u32 = 3820; +pub const Hangul_J_Phieuf: u32 = 3821; +pub const Hangul_J_Hieuh: u32 = 3822; +pub const Hangul_RieulYeorinHieuh: u32 = 3823; +pub const Hangul_SunkyeongeumMieum: u32 = 3824; +pub const Hangul_SunkyeongeumPieub: u32 = 3825; +pub const Hangul_PanSios: u32 = 3826; +pub const Hangul_KkogjiDalrinIeung: u32 = 3827; +pub const Hangul_SunkyeongeumPhieuf: u32 = 3828; +pub const Hangul_YeorinHieuh: u32 = 3829; +pub const Hangul_AraeA: u32 = 3830; +pub const Hangul_AraeAE: u32 = 3831; +pub const Hangul_J_PanSios: u32 = 3832; +pub const Hangul_J_KkogjiDalrinIeung: u32 = 3833; +pub const Hangul_J_YeorinHieuh: u32 = 3834; +pub const Korean_Won: u32 = 3839; +pub const Armenian_ligature_ew: u32 = 16778631; +pub const Armenian_full_stop: u32 = 16778633; +pub const Armenian_verjaket: u32 = 16778633; +pub const Armenian_separation_mark: u32 = 16778589; +pub const Armenian_but: u32 = 16778589; +pub const Armenian_hyphen: u32 = 16778634; +pub const Armenian_yentamna: u32 = 16778634; +pub const Armenian_exclam: u32 = 16778588; +pub const Armenian_amanak: u32 = 16778588; +pub const Armenian_accent: u32 = 16778587; +pub const Armenian_shesht: u32 = 16778587; +pub const Armenian_question: u32 = 16778590; +pub const Armenian_paruyk: u32 = 16778590; +pub const Armenian_AYB: u32 = 16778545; +pub const Armenian_ayb: u32 = 16778593; +pub const Armenian_BEN: u32 = 16778546; +pub const Armenian_ben: u32 = 16778594; +pub const Armenian_GIM: u32 = 16778547; +pub const Armenian_gim: u32 = 16778595; +pub const Armenian_DA: u32 = 16778548; +pub const Armenian_da: u32 = 16778596; +pub const Armenian_YECH: u32 = 16778549; +pub const Armenian_yech: u32 = 16778597; +pub const Armenian_ZA: u32 = 16778550; +pub const Armenian_za: u32 = 16778598; +pub const Armenian_E: u32 = 16778551; +pub const Armenian_e: u32 = 16778599; +pub const Armenian_AT: u32 = 16778552; +pub const Armenian_at: u32 = 16778600; +pub const Armenian_TO: u32 = 16778553; +pub const Armenian_to: u32 = 16778601; +pub const Armenian_ZHE: u32 = 16778554; +pub const Armenian_zhe: u32 = 16778602; +pub const Armenian_INI: u32 = 16778555; +pub const Armenian_ini: u32 = 16778603; +pub const Armenian_LYUN: u32 = 16778556; +pub const Armenian_lyun: u32 = 16778604; +pub const Armenian_KHE: u32 = 16778557; +pub const Armenian_khe: u32 = 16778605; +pub const Armenian_TSA: u32 = 16778558; +pub const Armenian_tsa: u32 = 16778606; +pub const Armenian_KEN: u32 = 16778559; +pub const Armenian_ken: u32 = 16778607; +pub const Armenian_HO: u32 = 16778560; +pub const Armenian_ho: u32 = 16778608; +pub const Armenian_DZA: u32 = 16778561; +pub const Armenian_dza: u32 = 16778609; +pub const Armenian_GHAT: u32 = 16778562; +pub const Armenian_ghat: u32 = 16778610; +pub const Armenian_TCHE: u32 = 16778563; +pub const Armenian_tche: u32 = 16778611; +pub const Armenian_MEN: u32 = 16778564; +pub const Armenian_men: u32 = 16778612; +pub const Armenian_HI: u32 = 16778565; +pub const Armenian_hi: u32 = 16778613; +pub const Armenian_NU: u32 = 16778566; +pub const Armenian_nu: u32 = 16778614; +pub const Armenian_SHA: u32 = 16778567; +pub const Armenian_sha: u32 = 16778615; +pub const Armenian_VO: u32 = 16778568; +pub const Armenian_vo: u32 = 16778616; +pub const Armenian_CHA: u32 = 16778569; +pub const Armenian_cha: u32 = 16778617; +pub const Armenian_PE: u32 = 16778570; +pub const Armenian_pe: u32 = 16778618; +pub const Armenian_JE: u32 = 16778571; +pub const Armenian_je: u32 = 16778619; +pub const Armenian_RA: u32 = 16778572; +pub const Armenian_ra: u32 = 16778620; +pub const Armenian_SE: u32 = 16778573; +pub const Armenian_se: u32 = 16778621; +pub const Armenian_VEV: u32 = 16778574; +pub const Armenian_vev: u32 = 16778622; +pub const Armenian_TYUN: u32 = 16778575; +pub const Armenian_tyun: u32 = 16778623; +pub const Armenian_RE: u32 = 16778576; +pub const Armenian_re: u32 = 16778624; +pub const Armenian_TSO: u32 = 16778577; +pub const Armenian_tso: u32 = 16778625; +pub const Armenian_VYUN: u32 = 16778578; +pub const Armenian_vyun: u32 = 16778626; +pub const Armenian_PYUR: u32 = 16778579; +pub const Armenian_pyur: u32 = 16778627; +pub const Armenian_KE: u32 = 16778580; +pub const Armenian_ke: u32 = 16778628; +pub const Armenian_O: u32 = 16778581; +pub const Armenian_o: u32 = 16778629; +pub const Armenian_FE: u32 = 16778582; +pub const Armenian_fe: u32 = 16778630; +pub const Armenian_apostrophe: u32 = 16778586; +pub const Georgian_an: u32 = 16781520; +pub const Georgian_ban: u32 = 16781521; +pub const Georgian_gan: u32 = 16781522; +pub const Georgian_don: u32 = 16781523; +pub const Georgian_en: u32 = 16781524; +pub const Georgian_vin: u32 = 16781525; +pub const Georgian_zen: u32 = 16781526; +pub const Georgian_tan: u32 = 16781527; +pub const Georgian_in: u32 = 16781528; +pub const Georgian_kan: u32 = 16781529; +pub const Georgian_las: u32 = 16781530; +pub const Georgian_man: u32 = 16781531; +pub const Georgian_nar: u32 = 16781532; +pub const Georgian_on: u32 = 16781533; +pub const Georgian_par: u32 = 16781534; +pub const Georgian_zhar: u32 = 16781535; +pub const Georgian_rae: u32 = 16781536; +pub const Georgian_san: u32 = 16781537; +pub const Georgian_tar: u32 = 16781538; +pub const Georgian_un: u32 = 16781539; +pub const Georgian_phar: u32 = 16781540; +pub const Georgian_khar: u32 = 16781541; +pub const Georgian_ghan: u32 = 16781542; +pub const Georgian_qar: u32 = 16781543; +pub const Georgian_shin: u32 = 16781544; +pub const Georgian_chin: u32 = 16781545; +pub const Georgian_can: u32 = 16781546; +pub const Georgian_jil: u32 = 16781547; +pub const Georgian_cil: u32 = 16781548; +pub const Georgian_char: u32 = 16781549; +pub const Georgian_xan: u32 = 16781550; +pub const Georgian_jhan: u32 = 16781551; +pub const Georgian_hae: u32 = 16781552; +pub const Georgian_he: u32 = 16781553; +pub const Georgian_hie: u32 = 16781554; +pub const Georgian_we: u32 = 16781555; +pub const Georgian_har: u32 = 16781556; +pub const Georgian_hoe: u32 = 16781557; +pub const Georgian_fi: u32 = 16781558; +pub const Xabovedot: u32 = 16785034; +pub const Ibreve: u32 = 16777516; +pub const Zstroke: u32 = 16777653; +pub const Gcaron: u32 = 16777702; +pub const Ocaron: u32 = 16777681; +pub const Obarred: u32 = 16777631; +pub const xabovedot: u32 = 16785035; +pub const ibreve: u32 = 16777517; +pub const zstroke: u32 = 16777654; +pub const gcaron: u32 = 16777703; +pub const ocaron: u32 = 16777682; +pub const obarred: u32 = 16777845; +pub const SCHWA: u32 = 16777615; +pub const schwa: u32 = 16777817; +pub const EZH: u32 = 16777655; +pub const ezh: u32 = 16777874; +pub const Lbelowdot: u32 = 16784950; +pub const lbelowdot: u32 = 16784951; +pub const Abelowdot: u32 = 16785056; +pub const abelowdot: u32 = 16785057; +pub const Ahook: u32 = 16785058; +pub const ahook: u32 = 16785059; +pub const Acircumflexacute: u32 = 16785060; +pub const acircumflexacute: u32 = 16785061; +pub const Acircumflexgrave: u32 = 16785062; +pub const acircumflexgrave: u32 = 16785063; +pub const Acircumflexhook: u32 = 16785064; +pub const acircumflexhook: u32 = 16785065; +pub const Acircumflextilde: u32 = 16785066; +pub const acircumflextilde: u32 = 16785067; +pub const Acircumflexbelowdot: u32 = 16785068; +pub const acircumflexbelowdot: u32 = 16785069; +pub const Abreveacute: u32 = 16785070; +pub const abreveacute: u32 = 16785071; +pub const Abrevegrave: u32 = 16785072; +pub const abrevegrave: u32 = 16785073; +pub const Abrevehook: u32 = 16785074; +pub const abrevehook: u32 = 16785075; +pub const Abrevetilde: u32 = 16785076; +pub const abrevetilde: u32 = 16785077; +pub const Abrevebelowdot: u32 = 16785078; +pub const abrevebelowdot: u32 = 16785079; +pub const Ebelowdot: u32 = 16785080; +pub const ebelowdot: u32 = 16785081; +pub const Ehook: u32 = 16785082; +pub const ehook: u32 = 16785083; +pub const Etilde: u32 = 16785084; +pub const etilde: u32 = 16785085; +pub const Ecircumflexacute: u32 = 16785086; +pub const ecircumflexacute: u32 = 16785087; +pub const Ecircumflexgrave: u32 = 16785088; +pub const ecircumflexgrave: u32 = 16785089; +pub const Ecircumflexhook: u32 = 16785090; +pub const ecircumflexhook: u32 = 16785091; +pub const Ecircumflextilde: u32 = 16785092; +pub const ecircumflextilde: u32 = 16785093; +pub const Ecircumflexbelowdot: u32 = 16785094; +pub const ecircumflexbelowdot: u32 = 16785095; +pub const Ihook: u32 = 16785096; +pub const ihook: u32 = 16785097; +pub const Ibelowdot: u32 = 16785098; +pub const ibelowdot: u32 = 16785099; +pub const Obelowdot: u32 = 16785100; +pub const obelowdot: u32 = 16785101; +pub const Ohook: u32 = 16785102; +pub const ohook: u32 = 16785103; +pub const Ocircumflexacute: u32 = 16785104; +pub const ocircumflexacute: u32 = 16785105; +pub const Ocircumflexgrave: u32 = 16785106; +pub const ocircumflexgrave: u32 = 16785107; +pub const Ocircumflexhook: u32 = 16785108; +pub const ocircumflexhook: u32 = 16785109; +pub const Ocircumflextilde: u32 = 16785110; +pub const ocircumflextilde: u32 = 16785111; +pub const Ocircumflexbelowdot: u32 = 16785112; +pub const ocircumflexbelowdot: u32 = 16785113; +pub const Ohornacute: u32 = 16785114; +pub const ohornacute: u32 = 16785115; +pub const Ohorngrave: u32 = 16785116; +pub const ohorngrave: u32 = 16785117; +pub const Ohornhook: u32 = 16785118; +pub const ohornhook: u32 = 16785119; +pub const Ohorntilde: u32 = 16785120; +pub const ohorntilde: u32 = 16785121; +pub const Ohornbelowdot: u32 = 16785122; +pub const ohornbelowdot: u32 = 16785123; +pub const Ubelowdot: u32 = 16785124; +pub const ubelowdot: u32 = 16785125; +pub const Uhook: u32 = 16785126; +pub const uhook: u32 = 16785127; +pub const Uhornacute: u32 = 16785128; +pub const uhornacute: u32 = 16785129; +pub const Uhorngrave: u32 = 16785130; +pub const uhorngrave: u32 = 16785131; +pub const Uhornhook: u32 = 16785132; +pub const uhornhook: u32 = 16785133; +pub const Uhorntilde: u32 = 16785134; +pub const uhorntilde: u32 = 16785135; +pub const Uhornbelowdot: u32 = 16785136; +pub const uhornbelowdot: u32 = 16785137; +pub const Ybelowdot: u32 = 16785140; +pub const ybelowdot: u32 = 16785141; +pub const Yhook: u32 = 16785142; +pub const yhook: u32 = 16785143; +pub const Ytilde: u32 = 16785144; +pub const ytilde: u32 = 16785145; +pub const Ohorn: u32 = 16777632; +pub const ohorn: u32 = 16777633; +pub const Uhorn: u32 = 16777647; +pub const uhorn: u32 = 16777648; +pub const combining_tilde: u32 = 16777987; +pub const combining_grave: u32 = 16777984; +pub const combining_acute: u32 = 16777985; +pub const combining_hook: u32 = 16777993; +pub const combining_belowdot: u32 = 16778019; +pub const EcuSign: u32 = 16785568; +pub const ColonSign: u32 = 16785569; +pub const CruzeiroSign: u32 = 16785570; +pub const FFrancSign: u32 = 16785571; +pub const LiraSign: u32 = 16785572; +pub const MillSign: u32 = 16785573; +pub const NairaSign: u32 = 16785574; +pub const PesetaSign: u32 = 16785575; +pub const RupeeSign: u32 = 16785576; +pub const WonSign: u32 = 16785577; +pub const NewSheqelSign: u32 = 16785578; +pub const DongSign: u32 = 16785579; +pub const EuroSign: u32 = 8364; +pub const zerosuperior: u32 = 16785520; +pub const foursuperior: u32 = 16785524; +pub const fivesuperior: u32 = 16785525; +pub const sixsuperior: u32 = 16785526; +pub const sevensuperior: u32 = 16785527; +pub const eightsuperior: u32 = 16785528; +pub const ninesuperior: u32 = 16785529; +pub const zerosubscript: u32 = 16785536; +pub const onesubscript: u32 = 16785537; +pub const twosubscript: u32 = 16785538; +pub const threesubscript: u32 = 16785539; +pub const foursubscript: u32 = 16785540; +pub const fivesubscript: u32 = 16785541; +pub const sixsubscript: u32 = 16785542; +pub const sevensubscript: u32 = 16785543; +pub const eightsubscript: u32 = 16785544; +pub const ninesubscript: u32 = 16785545; +pub const partdifferential: u32 = 16785922; +pub const emptyset: u32 = 16785925; +pub const elementof: u32 = 16785928; +pub const notelementof: u32 = 16785929; +pub const containsas: u32 = 16785931; +pub const squareroot: u32 = 16785946; +pub const cuberoot: u32 = 16785947; +pub const fourthroot: u32 = 16785948; +pub const dintegral: u32 = 16785964; +pub const tintegral: u32 = 16785965; +pub const because: u32 = 16785973; +pub const approxeq: u32 = 16785992; +pub const notapproxeq: u32 = 16785991; +pub const notidentical: u32 = 16786018; +pub const stricteq: u32 = 16786019; +pub const braille_dot_1: u32 = 65521; +pub const braille_dot_2: u32 = 65522; +pub const braille_dot_3: u32 = 65523; +pub const braille_dot_4: u32 = 65524; +pub const braille_dot_5: u32 = 65525; +pub const braille_dot_6: u32 = 65526; +pub const braille_dot_7: u32 = 65527; +pub const braille_dot_8: u32 = 65528; +pub const braille_dot_9: u32 = 65529; +pub const braille_dot_10: u32 = 65530; +pub const braille_blank: u32 = 16787456; +pub const braille_dots_1: u32 = 16787457; +pub const braille_dots_2: u32 = 16787458; +pub const braille_dots_12: u32 = 16787459; +pub const braille_dots_3: u32 = 16787460; +pub const braille_dots_13: u32 = 16787461; +pub const braille_dots_23: u32 = 16787462; +pub const braille_dots_123: u32 = 16787463; +pub const braille_dots_4: u32 = 16787464; +pub const braille_dots_14: u32 = 16787465; +pub const braille_dots_24: u32 = 16787466; +pub const braille_dots_124: u32 = 16787467; +pub const braille_dots_34: u32 = 16787468; +pub const braille_dots_134: u32 = 16787469; +pub const braille_dots_234: u32 = 16787470; +pub const braille_dots_1234: u32 = 16787471; +pub const braille_dots_5: u32 = 16787472; +pub const braille_dots_15: u32 = 16787473; +pub const braille_dots_25: u32 = 16787474; +pub const braille_dots_125: u32 = 16787475; +pub const braille_dots_35: u32 = 16787476; +pub const braille_dots_135: u32 = 16787477; +pub const braille_dots_235: u32 = 16787478; +pub const braille_dots_1235: u32 = 16787479; +pub const braille_dots_45: u32 = 16787480; +pub const braille_dots_145: u32 = 16787481; +pub const braille_dots_245: u32 = 16787482; +pub const braille_dots_1245: u32 = 16787483; +pub const braille_dots_345: u32 = 16787484; +pub const braille_dots_1345: u32 = 16787485; +pub const braille_dots_2345: u32 = 16787486; +pub const braille_dots_12345: u32 = 16787487; +pub const braille_dots_6: u32 = 16787488; +pub const braille_dots_16: u32 = 16787489; +pub const braille_dots_26: u32 = 16787490; +pub const braille_dots_126: u32 = 16787491; +pub const braille_dots_36: u32 = 16787492; +pub const braille_dots_136: u32 = 16787493; +pub const braille_dots_236: u32 = 16787494; +pub const braille_dots_1236: u32 = 16787495; +pub const braille_dots_46: u32 = 16787496; +pub const braille_dots_146: u32 = 16787497; +pub const braille_dots_246: u32 = 16787498; +pub const braille_dots_1246: u32 = 16787499; +pub const braille_dots_346: u32 = 16787500; +pub const braille_dots_1346: u32 = 16787501; +pub const braille_dots_2346: u32 = 16787502; +pub const braille_dots_12346: u32 = 16787503; +pub const braille_dots_56: u32 = 16787504; +pub const braille_dots_156: u32 = 16787505; +pub const braille_dots_256: u32 = 16787506; +pub const braille_dots_1256: u32 = 16787507; +pub const braille_dots_356: u32 = 16787508; +pub const braille_dots_1356: u32 = 16787509; +pub const braille_dots_2356: u32 = 16787510; +pub const braille_dots_12356: u32 = 16787511; +pub const braille_dots_456: u32 = 16787512; +pub const braille_dots_1456: u32 = 16787513; +pub const braille_dots_2456: u32 = 16787514; +pub const braille_dots_12456: u32 = 16787515; +pub const braille_dots_3456: u32 = 16787516; +pub const braille_dots_13456: u32 = 16787517; +pub const braille_dots_23456: u32 = 16787518; +pub const braille_dots_123456: u32 = 16787519; +pub const braille_dots_7: u32 = 16787520; +pub const braille_dots_17: u32 = 16787521; +pub const braille_dots_27: u32 = 16787522; +pub const braille_dots_127: u32 = 16787523; +pub const braille_dots_37: u32 = 16787524; +pub const braille_dots_137: u32 = 16787525; +pub const braille_dots_237: u32 = 16787526; +pub const braille_dots_1237: u32 = 16787527; +pub const braille_dots_47: u32 = 16787528; +pub const braille_dots_147: u32 = 16787529; +pub const braille_dots_247: u32 = 16787530; +pub const braille_dots_1247: u32 = 16787531; +pub const braille_dots_347: u32 = 16787532; +pub const braille_dots_1347: u32 = 16787533; +pub const braille_dots_2347: u32 = 16787534; +pub const braille_dots_12347: u32 = 16787535; +pub const braille_dots_57: u32 = 16787536; +pub const braille_dots_157: u32 = 16787537; +pub const braille_dots_257: u32 = 16787538; +pub const braille_dots_1257: u32 = 16787539; +pub const braille_dots_357: u32 = 16787540; +pub const braille_dots_1357: u32 = 16787541; +pub const braille_dots_2357: u32 = 16787542; +pub const braille_dots_12357: u32 = 16787543; +pub const braille_dots_457: u32 = 16787544; +pub const braille_dots_1457: u32 = 16787545; +pub const braille_dots_2457: u32 = 16787546; +pub const braille_dots_12457: u32 = 16787547; +pub const braille_dots_3457: u32 = 16787548; +pub const braille_dots_13457: u32 = 16787549; +pub const braille_dots_23457: u32 = 16787550; +pub const braille_dots_123457: u32 = 16787551; +pub const braille_dots_67: u32 = 16787552; +pub const braille_dots_167: u32 = 16787553; +pub const braille_dots_267: u32 = 16787554; +pub const braille_dots_1267: u32 = 16787555; +pub const braille_dots_367: u32 = 16787556; +pub const braille_dots_1367: u32 = 16787557; +pub const braille_dots_2367: u32 = 16787558; +pub const braille_dots_12367: u32 = 16787559; +pub const braille_dots_467: u32 = 16787560; +pub const braille_dots_1467: u32 = 16787561; +pub const braille_dots_2467: u32 = 16787562; +pub const braille_dots_12467: u32 = 16787563; +pub const braille_dots_3467: u32 = 16787564; +pub const braille_dots_13467: u32 = 16787565; +pub const braille_dots_23467: u32 = 16787566; +pub const braille_dots_123467: u32 = 16787567; +pub const braille_dots_567: u32 = 16787568; +pub const braille_dots_1567: u32 = 16787569; +pub const braille_dots_2567: u32 = 16787570; +pub const braille_dots_12567: u32 = 16787571; +pub const braille_dots_3567: u32 = 16787572; +pub const braille_dots_13567: u32 = 16787573; +pub const braille_dots_23567: u32 = 16787574; +pub const braille_dots_123567: u32 = 16787575; +pub const braille_dots_4567: u32 = 16787576; +pub const braille_dots_14567: u32 = 16787577; +pub const braille_dots_24567: u32 = 16787578; +pub const braille_dots_124567: u32 = 16787579; +pub const braille_dots_34567: u32 = 16787580; +pub const braille_dots_134567: u32 = 16787581; +pub const braille_dots_234567: u32 = 16787582; +pub const braille_dots_1234567: u32 = 16787583; +pub const braille_dots_8: u32 = 16787584; +pub const braille_dots_18: u32 = 16787585; +pub const braille_dots_28: u32 = 16787586; +pub const braille_dots_128: u32 = 16787587; +pub const braille_dots_38: u32 = 16787588; +pub const braille_dots_138: u32 = 16787589; +pub const braille_dots_238: u32 = 16787590; +pub const braille_dots_1238: u32 = 16787591; +pub const braille_dots_48: u32 = 16787592; +pub const braille_dots_148: u32 = 16787593; +pub const braille_dots_248: u32 = 16787594; +pub const braille_dots_1248: u32 = 16787595; +pub const braille_dots_348: u32 = 16787596; +pub const braille_dots_1348: u32 = 16787597; +pub const braille_dots_2348: u32 = 16787598; +pub const braille_dots_12348: u32 = 16787599; +pub const braille_dots_58: u32 = 16787600; +pub const braille_dots_158: u32 = 16787601; +pub const braille_dots_258: u32 = 16787602; +pub const braille_dots_1258: u32 = 16787603; +pub const braille_dots_358: u32 = 16787604; +pub const braille_dots_1358: u32 = 16787605; +pub const braille_dots_2358: u32 = 16787606; +pub const braille_dots_12358: u32 = 16787607; +pub const braille_dots_458: u32 = 16787608; +pub const braille_dots_1458: u32 = 16787609; +pub const braille_dots_2458: u32 = 16787610; +pub const braille_dots_12458: u32 = 16787611; +pub const braille_dots_3458: u32 = 16787612; +pub const braille_dots_13458: u32 = 16787613; +pub const braille_dots_23458: u32 = 16787614; +pub const braille_dots_123458: u32 = 16787615; +pub const braille_dots_68: u32 = 16787616; +pub const braille_dots_168: u32 = 16787617; +pub const braille_dots_268: u32 = 16787618; +pub const braille_dots_1268: u32 = 16787619; +pub const braille_dots_368: u32 = 16787620; +pub const braille_dots_1368: u32 = 16787621; +pub const braille_dots_2368: u32 = 16787622; +pub const braille_dots_12368: u32 = 16787623; +pub const braille_dots_468: u32 = 16787624; +pub const braille_dots_1468: u32 = 16787625; +pub const braille_dots_2468: u32 = 16787626; +pub const braille_dots_12468: u32 = 16787627; +pub const braille_dots_3468: u32 = 16787628; +pub const braille_dots_13468: u32 = 16787629; +pub const braille_dots_23468: u32 = 16787630; +pub const braille_dots_123468: u32 = 16787631; +pub const braille_dots_568: u32 = 16787632; +pub const braille_dots_1568: u32 = 16787633; +pub const braille_dots_2568: u32 = 16787634; +pub const braille_dots_12568: u32 = 16787635; +pub const braille_dots_3568: u32 = 16787636; +pub const braille_dots_13568: u32 = 16787637; +pub const braille_dots_23568: u32 = 16787638; +pub const braille_dots_123568: u32 = 16787639; +pub const braille_dots_4568: u32 = 16787640; +pub const braille_dots_14568: u32 = 16787641; +pub const braille_dots_24568: u32 = 16787642; +pub const braille_dots_124568: u32 = 16787643; +pub const braille_dots_34568: u32 = 16787644; +pub const braille_dots_134568: u32 = 16787645; +pub const braille_dots_234568: u32 = 16787646; +pub const braille_dots_1234568: u32 = 16787647; +pub const braille_dots_78: u32 = 16787648; +pub const braille_dots_178: u32 = 16787649; +pub const braille_dots_278: u32 = 16787650; +pub const braille_dots_1278: u32 = 16787651; +pub const braille_dots_378: u32 = 16787652; +pub const braille_dots_1378: u32 = 16787653; +pub const braille_dots_2378: u32 = 16787654; +pub const braille_dots_12378: u32 = 16787655; +pub const braille_dots_478: u32 = 16787656; +pub const braille_dots_1478: u32 = 16787657; +pub const braille_dots_2478: u32 = 16787658; +pub const braille_dots_12478: u32 = 16787659; +pub const braille_dots_3478: u32 = 16787660; +pub const braille_dots_13478: u32 = 16787661; +pub const braille_dots_23478: u32 = 16787662; +pub const braille_dots_123478: u32 = 16787663; +pub const braille_dots_578: u32 = 16787664; +pub const braille_dots_1578: u32 = 16787665; +pub const braille_dots_2578: u32 = 16787666; +pub const braille_dots_12578: u32 = 16787667; +pub const braille_dots_3578: u32 = 16787668; +pub const braille_dots_13578: u32 = 16787669; +pub const braille_dots_23578: u32 = 16787670; +pub const braille_dots_123578: u32 = 16787671; +pub const braille_dots_4578: u32 = 16787672; +pub const braille_dots_14578: u32 = 16787673; +pub const braille_dots_24578: u32 = 16787674; +pub const braille_dots_124578: u32 = 16787675; +pub const braille_dots_34578: u32 = 16787676; +pub const braille_dots_134578: u32 = 16787677; +pub const braille_dots_234578: u32 = 16787678; +pub const braille_dots_1234578: u32 = 16787679; +pub const braille_dots_678: u32 = 16787680; +pub const braille_dots_1678: u32 = 16787681; +pub const braille_dots_2678: u32 = 16787682; +pub const braille_dots_12678: u32 = 16787683; +pub const braille_dots_3678: u32 = 16787684; +pub const braille_dots_13678: u32 = 16787685; +pub const braille_dots_23678: u32 = 16787686; +pub const braille_dots_123678: u32 = 16787687; +pub const braille_dots_4678: u32 = 16787688; +pub const braille_dots_14678: u32 = 16787689; +pub const braille_dots_24678: u32 = 16787690; +pub const braille_dots_124678: u32 = 16787691; +pub const braille_dots_34678: u32 = 16787692; +pub const braille_dots_134678: u32 = 16787693; +pub const braille_dots_234678: u32 = 16787694; +pub const braille_dots_1234678: u32 = 16787695; +pub const braille_dots_5678: u32 = 16787696; +pub const braille_dots_15678: u32 = 16787697; +pub const braille_dots_25678: u32 = 16787698; +pub const braille_dots_125678: u32 = 16787699; +pub const braille_dots_35678: u32 = 16787700; +pub const braille_dots_135678: u32 = 16787701; +pub const braille_dots_235678: u32 = 16787702; +pub const braille_dots_1235678: u32 = 16787703; +pub const braille_dots_45678: u32 = 16787704; +pub const braille_dots_145678: u32 = 16787705; +pub const braille_dots_245678: u32 = 16787706; +pub const braille_dots_1245678: u32 = 16787707; +pub const braille_dots_345678: u32 = 16787708; +pub const braille_dots_1345678: u32 = 16787709; +pub const braille_dots_2345678: u32 = 16787710; +pub const braille_dots_12345678: u32 = 16787711; +pub const Sinh_ng: u32 = 16780674; +pub const Sinh_h2: u32 = 16780675; +pub const Sinh_a: u32 = 16780677; +pub const Sinh_aa: u32 = 16780678; +pub const Sinh_ae: u32 = 16780679; +pub const Sinh_aee: u32 = 16780680; +pub const Sinh_i: u32 = 16780681; +pub const Sinh_ii: u32 = 16780682; +pub const Sinh_u: u32 = 16780683; +pub const Sinh_uu: u32 = 16780684; +pub const Sinh_ri: u32 = 16780685; +pub const Sinh_rii: u32 = 16780686; +pub const Sinh_lu: u32 = 16780687; +pub const Sinh_luu: u32 = 16780688; +pub const Sinh_e: u32 = 16780689; +pub const Sinh_ee: u32 = 16780690; +pub const Sinh_ai: u32 = 16780691; +pub const Sinh_o: u32 = 16780692; +pub const Sinh_oo: u32 = 16780693; +pub const Sinh_au: u32 = 16780694; +pub const Sinh_ka: u32 = 16780698; +pub const Sinh_kha: u32 = 16780699; +pub const Sinh_ga: u32 = 16780700; +pub const Sinh_gha: u32 = 16780701; +pub const Sinh_ng2: u32 = 16780702; +pub const Sinh_nga: u32 = 16780703; +pub const Sinh_ca: u32 = 16780704; +pub const Sinh_cha: u32 = 16780705; +pub const Sinh_ja: u32 = 16780706; +pub const Sinh_jha: u32 = 16780707; +pub const Sinh_nya: u32 = 16780708; +pub const Sinh_jnya: u32 = 16780709; +pub const Sinh_nja: u32 = 16780710; +pub const Sinh_tta: u32 = 16780711; +pub const Sinh_ttha: u32 = 16780712; +pub const Sinh_dda: u32 = 16780713; +pub const Sinh_ddha: u32 = 16780714; +pub const Sinh_nna: u32 = 16780715; +pub const Sinh_ndda: u32 = 16780716; +pub const Sinh_tha: u32 = 16780717; +pub const Sinh_thha: u32 = 16780718; +pub const Sinh_dha: u32 = 16780719; +pub const Sinh_dhha: u32 = 16780720; +pub const Sinh_na: u32 = 16780721; +pub const Sinh_ndha: u32 = 16780723; +pub const Sinh_pa: u32 = 16780724; +pub const Sinh_pha: u32 = 16780725; +pub const Sinh_ba: u32 = 16780726; +pub const Sinh_bha: u32 = 16780727; +pub const Sinh_ma: u32 = 16780728; +pub const Sinh_mba: u32 = 16780729; +pub const Sinh_ya: u32 = 16780730; +pub const Sinh_ra: u32 = 16780731; +pub const Sinh_la: u32 = 16780733; +pub const Sinh_va: u32 = 16780736; +pub const Sinh_sha: u32 = 16780737; +pub const Sinh_ssha: u32 = 16780738; +pub const Sinh_sa: u32 = 16780739; +pub const Sinh_ha: u32 = 16780740; +pub const Sinh_lla: u32 = 16780741; +pub const Sinh_fa: u32 = 16780742; +pub const Sinh_al: u32 = 16780746; +pub const Sinh_aa2: u32 = 16780751; +pub const Sinh_ae2: u32 = 16780752; +pub const Sinh_aee2: u32 = 16780753; +pub const Sinh_i2: u32 = 16780754; +pub const Sinh_ii2: u32 = 16780755; +pub const Sinh_u2: u32 = 16780756; +pub const Sinh_uu2: u32 = 16780758; +pub const Sinh_ru2: u32 = 16780760; +pub const Sinh_e2: u32 = 16780761; +pub const Sinh_ee2: u32 = 16780762; +pub const Sinh_ai2: u32 = 16780763; +pub const Sinh_o2: u32 = 16780764; +pub const Sinh_oo2: u32 = 16780765; +pub const Sinh_au2: u32 = 16780766; +pub const Sinh_lu2: u32 = 16780767; +pub const Sinh_ruu2: u32 = 16780786; +pub const Sinh_luu2: u32 = 16780787; +pub const Sinh_kunddaliya: u32 = 16780788; diff --git a/src/main.rs b/src/main.rs index 47c0fa1..b015a8d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,12 +28,16 @@ use breadx::{ use lazy_static::lazy_static; +use tokio::sync::mpsc; + use tokio::sync::mpsc::unbounded_channel; mod config; mod msg_listener; mod x11; +mod keysymdef; + use x11::client::{may_not_exist, XcrabWindowManager}; use std::collections::HashMap; @@ -140,19 +144,20 @@ async fn main() -> Result<()> { conn.ungrab_server_async().await?; let (send, mut recv) = unbounded_channel(); + let (result_send, result_recv) = mpsc::unbounded_channel(); tokio::spawn(msg_listener::listener_task( CONFIG.msg.clone().unwrap_or_default().socket_path, send, + result_recv, )); - let mask = ModMask { - inner: 20 - }; + let mask = ModMask { inner: 20 }; let keymap = keymap(&mut conn).await.unwrap_or_default(); let key_u32 = u32::from_str_radix("0078", 16).unwrap_or_default(); - let key: &u8 = keymap - .get(&key_u32).ok_or(XcrabError::Custom("the keysym requested was not found in the keymap".to_string()))?; + let key: &u8 = keymap.get(&key_u32).ok_or_else(|| { + XcrabError::Custom("the keysym requested was not found in the keymap".to_string()) + })?; conn.exchange_request_async(GrabKeyRequest { req_type: 33, @@ -166,13 +171,15 @@ async fn main() -> Result<()> { }) .await?; + // let mut keyboard_state = KeyboardState::new_async(&mut conn).await?; + loop { // biased mode makes select! poll the channel first in order to keep xcrab-msg from being // starved by x11 events. Probably unnecessary, but better safe than sorry. tokio::select! { biased; - Some(s) = recv.recv() => msg_listener::on_recv(s, &mut manager, &mut conn).await?, - Ok(ev) = conn.wait_for_event_async() => process_event(ev, &mut manager, &mut conn, root, &keymap).await?, + Some(s) = recv.recv() => msg_listener::on_recv(s, &mut manager, &mut conn, &result_send).await?, + Ok(ev) = conn.wait_for_event_async() => process_event(ev, &mut manager, &mut conn, root, &keymap,/* &mut keyboard_state */).await?, } } } @@ -183,6 +190,7 @@ async fn process_event( conn: &mut Dpy, root: Window, keymap: &HashMap, + // keyboard_state: &mut KeyboardState, ) -> Result<()> { match ev { Event::MapRequest(ev) => { @@ -225,8 +233,9 @@ async fn process_event( } } Event::KeyPress(ev) => { - let key_u32 = u32::from_str_radix("0078", 16).unwrap_or_default(); - let key = keymap.get(&key_u32).unwrap_or(&u8::MIN); + let keysym = u32::from_str_radix("0078", 16).unwrap_or_default(); + let key = keymap.get(&keysym).unwrap_or(&u8::MIN); + if ev.detail == *key { manager.destroy_focused_client(conn).await?; } diff --git a/src/msg/config.rs b/src/msg/config.rs index 82cedbe..f4a4d8d 100644 --- a/src/msg/config.rs +++ b/src/msg/config.rs @@ -1,33 +1,28 @@ // Copyright (C) 2022 Infoshock Tech - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. - // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - use crate::Result; use serde::Deserialize; use std::path::PathBuf; - +#[allow(clippy::module_name_repetitions)] #[derive(Clone, Debug, Default, Deserialize)] // Dummy struct for deserializing the message config - we're using the same file for both binaries pub struct XcrabConfig { pub msg: XcrabMsgConfig, } - +#[allow(clippy::module_name_repetitions)] #[derive(Clone, Debug, Deserialize)] pub struct XcrabMsgConfig { pub socket_path: PathBuf, } - impl Default for XcrabMsgConfig { fn default() -> Self { Self { @@ -35,21 +30,15 @@ impl Default for XcrabMsgConfig { } } } - fn load_file_inner() -> Result { let home_dir = get_home(); - let contents = std::fs::read_to_string(format!("{}/.config/xcrab/config.toml", home_dir))?; - let config: XcrabConfig = toml::from_str(&contents)?; - Ok(config) } - pub fn load_file() -> XcrabConfig { load_file_inner().unwrap_or_default() } - fn get_home() -> String { std::env::var("HOME").expect("Error: $HOME variable was not set") } diff --git a/src/msg/main.rs b/src/msg/main.rs index 9231125..3497ffc 100644 --- a/src/msg/main.rs +++ b/src/msg/main.rs @@ -1,36 +1,47 @@ // Copyright (C) 2022 Infoshock Tech - // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. - // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. - // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +#![warn(clippy::pedantic)] mod config; - -use tokio::io::AsyncWriteExt; +use std::error::Error; +use std::fmt::{Debug, Display, Formatter, Result as FmtResult}; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::UnixStream; - -type Result = std::result::Result>; - +type Result = std::result::Result>; +struct CustomError(String); +impl Debug for CustomError { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + f.write_str(&self.0) + } +} +impl Display for CustomError { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + f.write_str(&self.0) + } +} +impl Error for CustomError {} #[tokio::main] async fn main() -> Result<()> { let msg = std::env::args().skip(1).collect::>().join(" "); - let conf = config::load_file(); - let path = conf.msg.socket_path; - - let mut stream = UnixStream::connect(path).await?; - - stream.write_all(msg.as_bytes()).await?; - + let stream = UnixStream::connect(path).await?; + let (mut read, mut write) = stream.into_split(); + write.write_all(msg.as_bytes()).await?; + drop(write); // Shutdown the writer half so that the write actually goes through + // "Don't cross the streams!"" + let mut buf = String::new(); + read.read_to_string(&mut buf).await?; + if !buf.is_empty() { + return Err(CustomError(buf).into()); + } Ok(()) } diff --git a/src/msg_listener.rs b/src/msg_listener.rs index 0da7523..7bc5407 100644 --- a/src/msg_listener.rs +++ b/src/msg_listener.rs @@ -17,9 +17,10 @@ use crate::x11::client::XcrabWindowManager; use crate::Result; use breadx::AsyncDisplay; use std::path::Path; -use tokio::io::AsyncReadExt; +use std::str::FromStr; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::UnixListener; -use tokio::sync::mpsc::UnboundedSender; +use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender}; macro_rules! unwrap_or_continue { ($e:expr) => { @@ -34,6 +35,7 @@ macro_rules! unwrap_or_continue { pub async fn listener_task>( socket_path: P, sender: UnboundedSender, + mut result_recv: UnboundedReceiver>, ) -> Result<()> { let socket_path = socket_path.as_ref(); if socket_path.exists() { @@ -47,6 +49,13 @@ pub async fn listener_task>( stream.read_to_string(&mut buf).await?; drop(sender.send(buf)); // go back to ms word clippy + + // we can unwrap here because if the channel is closed then something's not right + if let Err(e) = result_recv.recv().await.unwrap() { + stream.write_all(format!("{}", e).as_bytes()).await?; + } else { + stream.write_all(&[]).await?; + } } } @@ -54,10 +63,76 @@ pub async fn on_recv( data: String, manager: &mut XcrabWindowManager, conn: &mut Dpy, + result_sender: &UnboundedSender>, ) -> Result<()> { - match &*data { - "close" => manager.destroy_focused_client(conn).await?, - _ => println!("{}", data), + let res = { data.parse::() }; + + if let Ok(ref a) = res { + a.eval(manager, conn).await?; // Don't send these errors over the channel, because they're + // xcrab errors, not msg errors } + + drop(result_sender.send(res.map(|_| ()))); + Ok(()) } + +#[derive(Debug, Clone)] +#[non_exhaustive] +pub enum Action { + Close, +} + +impl FromStr for Action { + type Err = crate::XcrabError; + + fn from_str(s: &str) -> std::result::Result { + #[allow(clippy::enum_glob_use)] + use Action::*; + let parts: Vec = s + .split(' ') + .map(str::to_ascii_lowercase) + .filter(|s| !s.is_empty()) + .collect(); + + if parts.is_empty() { + return Err(String::from("No action provided").into()); + } + + macro_rules! eq_ignore_ascii_case_match { + (($scrutinee:expr) { $($s:literal => $v:expr,)+ else => $else:expr $(,)? }) => { + $( + if $scrutinee.eq_ignore_ascii_case($s) { + $v + } else + )+ { + $else + } + }; + } + + // TODO: When more actions are added (such as focus etc), they will take arguments. In that + // case, they will get passed the rest of `parts`. + eq_ignore_ascii_case_match!((parts[0]) { + "close" => Ok(Close), + else => Err(format!("Unknown action: {}", s).into()), + }) + } +} + +impl Action { + pub async fn eval( + &self, + manager: &mut XcrabWindowManager, + conn: &mut Dpy, + ) -> Result<()> { + #[allow(clippy::enum_glob_use)] + use Action::*; + + match self { + Close => manager.destroy_focused_client(conn).await?, + } + + Ok(()) + } +} diff --git a/src/x11/client.rs b/src/x11/client.rs index c1a4c74..7d937ad 100644 --- a/src/x11/client.rs +++ b/src/x11/client.rs @@ -137,14 +137,12 @@ enum RectangleContents { Client(Client), } -#[allow(clippy::module_name_repetitions)] #[derive(Debug, Clone)] struct Pane { children: Vec, directionality: Directionality, } -#[allow(clippy::module_name_repetitions)] #[derive(Debug, Clone, Copy)] struct Client { frame: FramedWindow, @@ -244,7 +242,10 @@ impl XcrabWindowManager { }; if let Some(focus) = self.focused { - req.focus = focus; + let focused_key = self.clients.get(&focus).unwrap(); + let focused = self.rects.get(*focused_key).unwrap(); + let focused_frame = focused.unwrap_client().frame; + req.focus = focused_frame.input; } conn.exchange_request_async(req).await?; @@ -610,6 +611,17 @@ impl XcrabWindowManager { Ok(()) } + + pub async fn get_focused(&self) -> Option { + self.focused + } + + pub async fn get_framed_window(&self, window: Window) -> FramedWindow { + let focused_key = self.clients.get(&window).unwrap(); + let focused = self.rects.get(*focused_key).unwrap(); + let focused_frame = focused.unwrap_client().frame; + focused_frame + } } pub fn may_not_exist(res: breadx::Result) -> breadx::Result { @@ -625,9 +637,10 @@ pub fn may_not_exist(res: breadx::Result) -> breadx::Result { } #[derive(Debug, Clone, Copy)] -struct FramedWindow { - frame: Window, - win: Window, +pub struct FramedWindow { + pub frame: Window, + pub win: Window, + pub input: Window, } impl FramedWindow { @@ -687,12 +700,27 @@ impl FramedWindow { .await, )?; + self.input + .configure_async( + conn, + ConfigureWindowParameters { + x: Some(0), + y: Some(0), + width, + height, + border_width: None, + ..Default::default() + }, + ) + .await?; + Ok(()) } async fn map(self, conn: &mut Dpy) -> Result<()> { may_not_exist(self.win.map_async(conn).await)?; self.frame.map_async(conn).await?; + self.input.map_async(conn).await?; Ok(()) } @@ -708,6 +736,10 @@ impl FramedWindow { // no longer related to us, remove from save set may_not_exist(self.win.change_save_set_async(conn, SetMode::Delete).await)?; + self.input.unmap_async(conn).await?; + + self.input.free_async(conn).await?; + self.frame.free_async(conn).await?; Ok(()) @@ -819,6 +851,21 @@ async fn frame(conn: &mut Dpy, win: Window) -> Resul ) .await?; + let input = conn + .create_window_async( + frame, + breadx::WindowClass::InputOnly, + None, + Some(conn.default_visual_id()), + 0, + 0, + geometry.width, + geometry.height, + 0, + WindowParameters::default(), + ) + .await?; + frame .set_event_mask_async( conn, @@ -829,9 +876,21 @@ async fn frame(conn: &mut Dpy, win: Window) -> Resul win.set_event_mask_async(conn, EventMask::BUTTON_PRESS) .await?; + input + .set_event_mask_async( + conn, + EventMask::BUTTON_PRESS + | EventMask::BUTTON_RELEASE + | EventMask::KEY_PRESS + | EventMask::KEY_RELEASE + | EventMask::ENTER_WINDOW + | EventMask::LEAVE_WINDOW, + ) + .await?; + may_not_exist(win.change_save_set_async(conn, SetMode::Insert).await)?; may_not_exist(win.reparent_async(conn, frame, 0, 0).await)?; - Ok(FramedWindow { frame, win }) + Ok(FramedWindow { frame, win, input }) }