Home | History | Annotate | Download | only in xkbcomp
      1 /*
      2  * Copyright  2009 Dan Nicholson
      3  * Copyright  2012 Intel Corporation
      4  * Copyright  2012 Ran Benita <ran234 (at) gmail.com>
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the next
     14  * paragraph) shall be included in all copies or substantial portions of the
     15  * Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     23  * DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors: Dan Nicholson <dbn.lists (at) gmail.com>
     26  *          Ran Benita <ran234 (at) gmail.com>
     27  *          Daniel Stone <daniel (at) fooishbar.org>
     28  */
     29 
     30 #include "xkbcomp-priv.h"
     31 #include "rules.h"
     32 
     33 static bool
     34 compile_keymap_file(struct xkb_keymap *keymap, XkbFile *file)
     35 {
     36     if (file->file_type != FILE_TYPE_KEYMAP) {
     37         log_err(keymap->ctx,
     38                 "Cannot compile a %s file alone into a keymap\n",
     39                 xkb_file_type_to_string(file->file_type));
     40         return false;
     41     }
     42 
     43     if (!CompileKeymap(file, keymap, MERGE_OVERRIDE)) {
     44         log_err(keymap->ctx,
     45                 "Failed to compile keymap\n");
     46         return false;
     47     }
     48 
     49     return true;
     50 }
     51 
     52 static bool
     53 text_v1_keymap_new_from_names(struct xkb_keymap *keymap,
     54                               const struct xkb_rule_names *rmlvo)
     55 {
     56     bool ok;
     57     struct xkb_component_names kccgst;
     58     XkbFile *file;
     59 
     60     log_dbg(keymap->ctx,
     61             "Compiling from RMLVO: rules '%s', model '%s', layout '%s', "
     62             "variant '%s', options '%s'\n",
     63             rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant,
     64             rmlvo->options);
     65 
     66     ok = xkb_components_from_rules(keymap->ctx, rmlvo, &kccgst);
     67     if (!ok) {
     68         log_err(keymap->ctx,
     69                 "Couldn't look up rules '%s', model '%s', layout '%s', "
     70                 "variant '%s', options '%s'\n",
     71                 rmlvo->rules, rmlvo->model, rmlvo->layout, rmlvo->variant,
     72                 rmlvo->options);
     73         return false;
     74     }
     75 
     76     log_dbg(keymap->ctx,
     77             "Compiling from KcCGST: keycodes '%s', types '%s', "
     78             "compat '%s', symbols '%s'\n",
     79             kccgst.keycodes, kccgst.types, kccgst.compat, kccgst.symbols);
     80 
     81     file = XkbFileFromComponents(keymap->ctx, &kccgst);
     82 
     83     free(kccgst.keycodes);
     84     free(kccgst.types);
     85     free(kccgst.compat);
     86     free(kccgst.symbols);
     87 
     88     if (!file) {
     89         log_err(keymap->ctx,
     90                 "Failed to generate parsed XKB file from components\n");
     91         return false;
     92     }
     93 
     94     ok = compile_keymap_file(keymap, file);
     95     FreeXkbFile(file);
     96     return ok;
     97 }
     98 
     99 static bool
    100 text_v1_keymap_new_from_string(struct xkb_keymap *keymap,
    101                                const char *string, size_t len)
    102 {
    103     bool ok;
    104     XkbFile *xkb_file;
    105 
    106     xkb_file = XkbParseString(keymap->ctx, string, len, "(input string)", NULL);
    107     if (!xkb_file) {
    108         log_err(keymap->ctx, "Failed to parse input xkb string\n");
    109         return NULL;
    110     }
    111 
    112     ok = compile_keymap_file(keymap, xkb_file);
    113     FreeXkbFile(xkb_file);
    114     return ok;
    115 }
    116 
    117 static bool
    118 text_v1_keymap_new_from_file(struct xkb_keymap *keymap, FILE *file)
    119 {
    120     bool ok;
    121     XkbFile *xkb_file;
    122 
    123     xkb_file = XkbParseFile(keymap->ctx, file, "(unknown file)", NULL);
    124     if (!xkb_file) {
    125         log_err(keymap->ctx, "Failed to parse input xkb file\n");
    126         return false;
    127     }
    128 
    129     ok = compile_keymap_file(keymap, xkb_file);
    130     FreeXkbFile(xkb_file);
    131     return ok;
    132 }
    133 
    134 const struct xkb_keymap_format_ops text_v1_keymap_format_ops = {
    135     .keymap_new_from_names = text_v1_keymap_new_from_names,
    136     .keymap_new_from_string = text_v1_keymap_new_from_string,
    137     .keymap_new_from_file = text_v1_keymap_new_from_file,
    138     .keymap_get_as_string = text_v1_keymap_get_as_string,
    139 };
    140