source: trunk/SL/MAPKEY/map_key.cxx

Last change on this file was 19612, checked in by westram, 11 days ago
  • insert module purposes.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.0 KB
Line 
1// ================================================================ //
2//                                                                  //
3//   File      : map_key.cxx                                        //
4//   Purpose   : customizable key mapping                           //
5//                                                                  //
6//   Institute of Microbiology (Technical University Munich)        //
7//   http://www.arb-home.de/                                        //
8//                                                                  //
9// ================================================================ //
10
11#include "map_key.hxx"
12
13#include "config_manager.hxx"
14
15#include <aw_window.hxx>
16#include <aw_root.hxx>
17#include <aw_awar.hxx>
18
19#include <arb_msg.h>
20
21#define KEYS_PER_COLUMN 10
22#define MAPPED_KEYS     (2*KEYS_PER_COLUMN)
23
24#define AWAR_KEYMAPPING_ENABLE "key_mapping/enable"
25
26ed_key::ed_key() {
27    int i;
28    for (i=0; i<256; i++) mapping[i] = i;
29}
30
31char ed_key::map_key(char k) const {
32    int i = k & 0xff;
33    return mapping[i];
34}
35
36inline const char *mapping_awar_name(int idx, const char *subkey) {
37    return GBS_global_string("key_mapping/key_%i/%s", idx, subkey);
38}
39inline char read_mapping_awar(AW_root *awr, int idx, const char *subkey) {
40    const char *awar_content = awr->awar(mapping_awar_name(idx, subkey))->read_char_pntr();
41    return awar_content[0];
42}
43
44void ed_key::rehash_mapping(AW_root *awr) {
45    for (int i=0; i<256; i++) mapping[i] = i;
46
47    long enable = awr->awar(AWAR_KEYMAPPING_ENABLE)->read_int();
48    if (enable) {
49        for (int i=0; i<MAPPED_KEYS; i++) {
50            char source = read_mapping_awar(awr, i, "source");
51            char dest   = read_mapping_awar(awr, i, "dest");
52
53            if (source && dest) mapping[safeCharIndex(source)] = dest;
54        }
55    }
56}
57
58static void ed_rehash_mapping(AW_root *awr, ed_key *ek) {
59    ek->rehash_mapping(awr);
60}
61
62void ed_key::create_awars(AW_root *awr) {
63    RootCallback rehash_mapping_cb = makeRootCallback(ed_rehash_mapping, this);
64
65    for (int i=0; i<MAPPED_KEYS; i++) {
66        awr->awar_string(mapping_awar_name(i, "source"))->add_callback(rehash_mapping_cb);
67        awr->awar_string(mapping_awar_name(i, "dest"))->add_callback(rehash_mapping_cb);
68    }
69    awr->awar_int(AWAR_KEYMAPPING_ENABLE, 1)->add_callback(rehash_mapping_cb);
70    rehash_mapping(awr);
71}
72
73static void setup_keymap_config(AWT_config_definition& cdef) {
74    for (int i=0; i<MAPPED_KEYS; i++) {
75        cdef.add(mapping_awar_name(i, "source"), GBS_global_string("src%02i", i));
76        cdef.add(mapping_awar_name(i, "dest"),   GBS_global_string("dst%02i", i));
77    }
78}
79
80AW_window *create_key_map_window(AW_root *root) {
81    AW_window_simple *aws = new AW_window_simple;
82    aws->init(root, "KEY_MAPPINGS", "KEY MAPPINGS");
83    aws->load_xfig("ed_key.fig");
84
85    aws->callback(AW_POPDOWN);
86    aws->at("close");
87    aws->create_button("CLOSE", "CLOSE", "C");
88
89    aws->callback(makeHelpCallback("nekey_map.hlp"));
90    aws->at("help");
91    aws->create_button("HELP", "HELP", "H");
92
93    aws->at("enable");
94    aws->create_toggle(AWAR_KEYMAPPING_ENABLE);
95
96    aws->at("config");
97    AWT_insert_config_manager(aws, AW_ROOT_DEFAULT, "keymap", makeConfigSetupCallback(setup_keymap_config));
98
99    aws->auto_space(10, 10);
100
101    aws->at("ascii2"); int ax2 = aws->get_at_xposition();
102    aws->at("ascii1"); int ax1 = aws->get_at_xposition();
103    aws->at("key2");   int kx2 = aws->get_at_xposition();
104    aws->at("key1");   int kx1 = aws->get_at_xposition();
105
106    int y = aws->get_at_yposition();
107
108    for (int i=0; i<KEYS_PER_COLUMN; ++i) {
109        aws->at(kx1, y); aws->create_input_field(mapping_awar_name(i,                 "source"), 2);
110        aws->at(ax1, y); aws->create_input_field(mapping_awar_name(i,                 "dest"),   2);
111        aws->at(kx2, y); aws->create_input_field(mapping_awar_name(i+KEYS_PER_COLUMN, "source"), 2);
112        aws->at(ax2, y); aws->create_input_field(mapping_awar_name(i+KEYS_PER_COLUMN, "dest"),   2);
113
114        aws->at_newline();
115        y = aws->get_at_yposition();
116    }
117
118    return aws;
119}
120
Note: See TracBrowser for help on using the repository browser.