diff --git a/data/keyboards/keymaps/nb.xkb b/data/keyboards/keymaps/nb.xkb new file mode 100644 index 00000000..26036f89 --- /dev/null +++ b/data/keyboards/keymaps/nb.xkb @@ -0,0 +1,308 @@ +xkb_keymap { + + xkb_keycodes "squeekboard" { + minimum = 8; + maximum = 255; + = 9; + = 10; + = 11; + = 12; + = 13; + = 14; + = 15; + = 16; + = 17; + = 18; + = 19; + = 20; + = 21; + = 22; + = 23; + = 24; + = 25; + = 26; + = 27; + = 28; + = 29; + = 30; + = 31; + = 32; + = 33; + = 34; + = 35; + = 36; + = 37; + = 38; + = 39; + = 40; + = 41; + = 42; + = 43; + = 44; + = 45; + = 46; + = 47; + = 48; + = 49; + = 50; + = 51; + = 52; + = 53; + = 54; + = 55; + = 56; + = 57; + = 58; + = 59; + = 60; + = 61; + = 62; + = 63; + = 64; + = 65; + = 66; + = 67; + = 68; + = 69; + = 70; + = 71; + = 72; + = 73; + = 74; + = 75; + = 76; + = 77; + = 78; + = 79; + = 80; + = 81; + = 82; + = 83; + = 84; + = 85; + = 86; + = 87; + = 88; + = 89; + = 90; + = 91; + = 92; + = 94; + = 95; + = 96; + = 97; + = 98; + = 99; + = 100; + = 101; + = 102; + = 103; + = 104; + = 105; + = 106; + = 107; + = 108; + = 109; + = 110; + = 111; + = 112; + = 113; + = 114; + = 115; + = 116; + = 117; + = 118; + = 119; + = 120; + = 121; + = 122; + = 123; + = 124; + = 125; + = 126; + = 127; + = 128; + = 129; + = 130; + = 131; + = 132; + = 133; + = 134; + = 135; + = 136; + = 137; + = 138; + = 139; + = 140; + = 141; + = 142; + = 143; + = 144; + = 145; + = 146; + = 147; + = 148; + = 149; + = 150; + = 151; + = 152; + = 153; + = 154; + = 155; + = 156; + = 157; + = 158; + = 159; + = 160; + = 161; + = 162; + = 163; + = 164; + = 165; + = 166; + = 167; + = 168; + = 169; + = 170; + = 171; + = 172; + = 173; + = 174; + = 175; + = 176; + = 177; + = 178; + = 179; + = 180; + = 181; + = 182; + = 183; + = 184; + = 185; + = 186; + = 187; + = 188; + = 189; + = 190; + = 191; + = 192; + = 193; + = 194; + = 195; + = 196; + = 197; + = 198; + = 199; + = 200; + = 201; + = 202; + = 203; + = 204; + = 205; + = 206; + = 207; + = 208; + = 209; + = 210; + = 211; + = 212; + = 213; + = 214; + = 215; + = 216; + = 217; + = 218; + = 219; + = 220; + = 221; + = 222; + = 223; + = 224; + = 225; + = 226; + = 227; + = 228; + = 229; + = 230; + = 231; + = 232; + = 233; + = 234; + = 235; + = 236; + = 237; + = 238; + = 239; + = 240; + = 241; + = 242; + = 243; + = 244; + = 245; + = 246; + = 247; + = 248; + = 249; + = 250; + = 251; + = 252; + = 253; + = 254; + = 255; + }; + + xkb_symbols "squeekboard" { + + name[Group1] = "Letters"; + name[Group2] = "Numbers/Symbols"; + + key { [ q, Q ], [ 1, asciitilde ] }; + key { [ w, W ], [ 2, quoteleft ] }; + key { [ e, E ], [ 3, bar ] }; + key { [ r, R ], [ 4, U00B7 ] }; + key { [ t, T ], [ 5, squareroot ] }; + key { [ y, Y ], [ 6, Greek_pi ] }; + key { [ u, U ], [ 7, division ] }; + key { [ i, I ], [ 8, multiply ] }; + key { [ o, O ], [ 9, paragraph ] }; + key { [ p, P ], [ 0, U25B3 ] }; + key { [ aring, Aring ], [ U00B1, U00A7 ] }; + key { [ a, A ], [ at, copyright ] }; + key { [ s, S ], [ numbersign, U00AE ] }; + key { [ d, D ], [ dollar, U00A3 ] }; + key { [ f, F ], [ percent, EuroSign ] }; + key { [ g, G ], [ ampersand, U00A5 ] }; + key { [ h, H ], [ minus, underscore ] }; + key { [ j, J ], [ plus, equal ] }; + key { [ k, K ], [ U00FC, asciicircum ] }; + key { [ l, L ], [ U00F6, degree ] }; + key { [ oslash, Oslash ], [ parenleft, braceleft ] }; + key { [ ae, AE ], [ parenright, braceright ] }; + key { [ Return, Return ], [ Return, Return ] }; + key { [ Shift_L, Shift_L ], [ Shift_L, Shift_L ] }; + key { [ z, Z ], [ comma, backslash ] }; + key { [ x, X ], [ quotedbl, slash ] }; + key { [ c, C ], [ quoteright, less ] }; + key { [ v, V ], [ colon, greater ] }; + key { [ b, B ], [ semicolon, equal ] }; + key { [ n, N ], [ exclam, bracketleft ] }; + key { [ m, M ], [ question, bracketright ] }; + key { [ period, period ], [ period, period ] }; + key { [ preferences, preferences ], [ preferences, preferences ] }; + key { [ space, space ], [ space, space ] }; + key { [ BackSpace, BackSpace ], [ BackSpace, BackSpace ] }; + }; + + xkb_types "squeekboard" { + + type "TWO_LEVEL" { + modifiers = Shift; + map[Shift] = Level2; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + }; + }; + + xkb_compatibility "squeekboard" { + }; +}; diff --git a/data/squeekboard.gresources.xml b/data/squeekboard.gresources.xml index c5faaa70..60bc29fb 100644 --- a/data/squeekboard.gresources.xml +++ b/data/squeekboard.gresources.xml @@ -5,6 +5,7 @@ keyboards/geometry/compact.xml keyboards/geometry/extended.xml keyboards/keyboards.xml + keyboards/keymaps/nb.xkb keyboards/symbols/ar.xml keyboards/symbols/as-inscript.xml keyboards/symbols/be.xml diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index 434e5756..93c45a9b 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -86,6 +86,48 @@ struct _EekboardContextServicePrivate { G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT); /*static Display *display = NULL; */ +gchar * +get_keymap_from_resource(const gchar *keyboard_type) +{ + g_autoptr (GFile) file = NULL; + g_autoptr (GFileInfo) info = NULL; + g_autoptr (GFileInputStream) stream = NULL; + goffset size = 0; + gsize bytes_read = 0; + g_autofree gchar *contents = NULL; + g_autofree gchar *path = NULL; + GError *error = NULL; + + path = g_strconcat ("resource:///sm/puri/squeekboard/keyboards/keymaps/", + keyboard_type, ".xkb", NULL); + file = g_file_new_for_uri (path); + stream = g_file_read (file, NULL, &error); + + if (!stream) + goto keymap_error; + + info = g_file_input_stream_query_info (stream, + G_FILE_ATTRIBUTE_STANDARD_SIZE, + NULL, + &error); + + if (!info) + goto keymap_error; + + size = g_file_info_get_size (info); + contents = g_malloc0 (size); + + if (!g_input_stream_read_all (G_INPUT_STREAM(stream), contents, size, + &bytes_read, NULL, &error)) + goto keymap_error; + + return g_utf8_make_valid (contents, -1); + +keymap_error: + g_error ("failed to load keymap from resource: %s", error->message); + g_error_free (error); + return NULL; +} static EekKeyboard * eekboard_context_service_real_create_keyboard (EekboardContextService *self, @@ -146,11 +188,14 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self, if (!context) { g_error("No context created"); } - +/* struct xkb_rule_names rules = { 0 }; rules.layout = strdup(keyboard_type); - struct xkb_keymap *keymap = xkb_keymap_new_from_string(context, default_keymap, +*/ + struct xkb_keymap *keymap = xkb_keymap_new_from_string(context, + get_keymap_from_resource(keyboard_type), XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); + xkb_context_unref(context); if (!keymap) { g_error("Bad keymap"); diff --git a/eekboard/keymap.h b/eekboard/keymap.h index 82fd1f08..e33c502e 100644 --- a/eekboard/keymap.h +++ b/eekboard/keymap.h @@ -6,312 +6,3 @@ squeek_keymap_get_entries_for_keyval (struct xkb_keymap *xkb_keymap, guint keyval, GdkKeymapKey **keys, guint *n_keys); - -static const char default_keymap[] = "xkb_keymap {\ -\ -xkb_keycodes \"squeekboard\" {\ - minimum = 8;\ - maximum = 255;\ - = 9;\ - = 10;\ - = 11;\ - = 12;\ - = 13;\ - = 14;\ - = 15;\ - = 16;\ - = 17;\ - = 18;\ - = 19;\ - = 20;\ - = 21;\ - = 22;\ - = 23;\ - = 24;\ - = 25;\ - = 26;\ - = 27;\ - = 28;\ - = 29;\ - = 30;\ - = 31;\ - = 32;\ - = 33;\ - = 34;\ - = 35;\ - = 36;\ - = 37;\ - = 38;\ - = 39;\ - = 40;\ - = 41;\ - = 42;\ - = 43;\ - = 44;\ - = 45;\ - = 46;\ - = 47;\ - = 48;\ - = 49;\ - = 50;\ - = 51;\ - = 52;\ - = 53;\ - = 54;\ - = 55;\ - = 56;\ - = 57;\ - = 58;\ - = 59;\ - = 60;\ - = 61;\ - = 62;\ - = 63;\ - = 64;\ - = 65;\ - = 66;\ - = 67;\ - = 68;\ - = 69;\ - = 70;\ - = 71;\ - = 72;\ - = 73;\ - = 74;\ - = 75;\ - = 76;\ - = 77;\ - = 78;\ - = 79;\ - = 80;\ - = 81;\ - = 82;\ - = 83;\ - = 84;\ - = 85;\ - = 86;\ - = 87;\ - = 88;\ - = 89;\ - = 90;\ - = 91;\ - = 92;\ - = 94;\ - = 95;\ - = 96;\ - = 97;\ - = 98;\ - = 99;\ - = 100;\ - = 101;\ - = 102;\ - = 103;\ - = 104;\ - = 105;\ - = 106;\ - = 107;\ - = 108;\ - = 109;\ - = 110;\ - = 111;\ - = 112;\ - = 113;\ - = 114;\ - = 115;\ - = 116;\ - = 117;\ - = 118;\ - = 119;\ - = 120;\ - = 121;\ - = 122;\ - = 123;\ - = 124;\ - = 125;\ - = 126;\ - = 127;\ - = 128;\ - = 129;\ - = 130;\ - = 131;\ - = 132;\ - = 133;\ - = 134;\ - = 135;\ - = 136;\ - = 137;\ - = 138;\ - = 139;\ - = 140;\ - = 141;\ - = 142;\ - = 143;\ - = 144;\ - = 145;\ - = 146;\ - = 147;\ - = 148;\ - = 149;\ - = 150;\ - = 151;\ - = 152;\ - = 153;\ - = 154;\ - = 155;\ - = 156;\ - = 157;\ - = 158;\ - = 159;\ - = 160;\ - = 161;\ - = 162;\ - = 163;\ - = 164;\ - = 165;\ - = 166;\ - = 167;\ - = 168;\ - = 169;\ - = 170;\ - = 171;\ - = 172;\ - = 173;\ - = 174;\ - = 175;\ - = 176;\ - = 177;\ - = 178;\ - = 179;\ - = 180;\ - = 181;\ - = 182;\ - = 183;\ - = 184;\ - = 185;\ - = 186;\ - = 187;\ - = 188;\ - = 189;\ - = 190;\ - = 191;\ - = 192;\ - = 193;\ - = 194;\ - = 195;\ - = 196;\ - = 197;\ - = 198;\ - = 199;\ - = 200;\ - = 201;\ - = 202;\ - = 203;\ - = 204;\ - = 205;\ - = 206;\ - = 207;\ - = 208;\ - = 209;\ - = 210;\ - = 211;\ - = 212;\ - = 213;\ - = 214;\ - = 215;\ - = 216;\ - = 217;\ - = 218;\ - = 219;\ - = 220;\ - = 221;\ - = 222;\ - = 223;\ - = 224;\ - = 225;\ - = 226;\ - = 227;\ - = 228;\ - = 229;\ - = 230;\ - = 231;\ - = 232;\ - = 233;\ - = 234;\ - = 235;\ - = 236;\ - = 237;\ - = 238;\ - = 239;\ - = 240;\ - = 241;\ - = 242;\ - = 243;\ - = 244;\ - = 245;\ - = 246;\ - = 247;\ - = 248;\ - = 249;\ - = 250;\ - = 251;\ - = 252;\ - = 253;\ - = 254;\ - = 255;\ - };\ -\ - xkb_symbols \"squeekboard\" {\ -\ - name[Group1] = \"Letters\";\ - name[Group2] = \"Numbers/Symbols\";\ -\ - key { [ q, Q ], [ 1, asciitilde ] };\ - key { [ w, W ], [ 2, quoteleft ] };\ - key { [ e, E ], [ 3, bar ] };\ - key { [ r, R ], [ 4, U00B7 ] };\ - key { [ t, T ], [ 5, squareroot ] };\ - key { [ y, Y ], [ 6, Greek_pi ] };\ - key { [ u, U ], [ 7, division ] };\ - key { [ i, I ], [ 8, multiply ] };\ - key { [ o, O ], [ 9, paragraph ] };\ - key { [ p, P ], [ 0, U25B3 ] };\ - key { [ aring, Aring ], [ U00B1, U00A7 ] };\ - key { [ a, A ], [ at, copyright ] };\ - key { [ s, S ], [ numbersign, U00AE ] };\ - key { [ d, D ], [ dollar, U00A3 ] };\ - key { [ f, F ], [ percent, EuroSign ] };\ - key { [ g, G ], [ ampersand, U00A5 ] };\ - key { [ h, H ], [ minus, underscore ] };\ - key { [ j, J ], [ plus, equal ] };\ - key { [ k, K ], [ U00FC, asciicircum ] };\ - key { [ l, L ], [ U00F6, degree ] };\ - key { [ oslash, Oslash ], [ parenleft, braceleft ] };\ - key { [ ae, AE ], [ parenright, braceright ] };\ - key { [ Return, Return ], [ Return, Return ] };\ - key { [ Shift_L, Shift_L ], [ Shift_L, Shift_L ] };\ - key { [ z, Z ], [ comma, backslash ] };\ - key { [ x, X ], [ quotedbl, slash ] };\ - key { [ c, C ], [ quoteright, less ] };\ - key { [ v, V ], [ colon, greater ] };\ - key { [ b, B ], [ semicolon, equal ] };\ - key { [ n, N ], [ exclam, bracketleft ] };\ - key { [ m, M ], [ question, bracketright ] };\ - key { [ period, period ], [ period, period ] };\ - key { [ preferences, preferences ], [ preferences, preferences ] };\ - key { [ space, space ], [ space, space ] };\ - key { [ BackSpace, BackSpace ], [ BackSpace, BackSpace ] };\ - };\ -\ - xkb_types \"squeekboard\" {\ -\ - type \"TWO_LEVEL\" {\ - modifiers = Shift;\ - map[Shift] = Level2;\ - level_name[Level1] = \"Base\";\ - level_name[Level2] = \"Shift\";\ - };\ - };\ -\ - xkb_compatibility \"squeekboard\" {\ - };\ -};";