keyboard_maps_code_gen.dart 11 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:path/path.dart' as path;

7 8 9
import 'base_code_gen.dart';
import 'key_data.dart';
import 'utils.dart';
10 11


12 13 14 15
/// Generates the keyboard_maps.dart files, based on the information in the key
/// data structure given to it.
class KeyboardMapsCodeGenerator extends BaseCodeGenerator {
  KeyboardMapsCodeGenerator(KeyData keyData) : super(keyData);
16

Mouad Debbar's avatar
Mouad Debbar committed
17 18 19 20 21 22
  List<Key> get numpadKeyData {
    return keyData.data.where((Key entry) {
      return entry.constantName.startsWith('numpad') && entry.keyLabel != null;
    }).toList();
  }

23 24 25 26 27 28 29
  List<Key> get functionKeyData {
    final RegExp functionKeyRe = RegExp(r'^f[0-9]+$');
    return keyData.data.where((Key entry) {
      return functionKeyRe.hasMatch(entry.constantName);
    }).toList();
  }

30 31 32
  /// This generates the map of GLFW number pad key codes to logical keys.
  String get glfwNumpadMap {
    final StringBuffer glfwNumpadMap = StringBuffer();
33
    for (final Key entry in numpadKeyData) {
34
      if (entry.glfwKeyCodes != null) {
35
        for (final int code in entry.glfwKeyCodes.cast<int>()) {
36
          glfwNumpadMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
37 38 39 40 41 42 43 44 45
        }
      }
    }
    return glfwNumpadMap.toString().trimRight();
  }

  /// This generates the map of GLFW key codes to logical keys.
  String get glfwKeyCodeMap {
    final StringBuffer glfwKeyCodeMap = StringBuffer();
46
    for (final Key entry in keyData.data) {
47
      if (entry.glfwKeyCodes != null) {
48
        for (final int code in entry.glfwKeyCodes.cast<int>()) {
49
          glfwKeyCodeMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
50 51 52 53 54 55
        }
      }
    }
    return glfwKeyCodeMap.toString().trimRight();
  }

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
  /// This generates the map of GTK number pad key codes to logical keys.
  String get gtkNumpadMap {
    final StringBuffer gtkNumpadMap = StringBuffer();
    for (final Key entry in numpadKeyData) {
      if (entry.gtkKeyCodes != null) {
        for (final int code in entry.gtkKeyCodes.cast<int>()) {
          gtkNumpadMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
        }
      }
    }
    return gtkNumpadMap.toString().trimRight();
  }

  /// This generates the map of GTK key codes to logical keys.
  String get gtkKeyCodeMap {
    final StringBuffer gtkKeyCodeMap = StringBuffer();
    for (final Key entry in keyData.data) {
      if (entry.gtkKeyCodes != null) {
        for (final int code in entry.gtkKeyCodes.cast<int>()) {
          gtkKeyCodeMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
        }
      }
    }
    return gtkKeyCodeMap.toString().trimRight();
  }

  /// This generates the map of XKB USB HID codes to physical keys.
83 84
  String get xkbScanCodeMap {
    final StringBuffer xkbScanCodeMap = StringBuffer();
85
    for (final Key entry in keyData.data) {
86
      if (entry.xKbScanCode != null) {
87
        xkbScanCodeMap.writeln('  ${toHex(entry.xKbScanCode)}: PhysicalKeyboardKey.${entry.constantName},');
88 89 90 91 92
      }
    }
    return xkbScanCodeMap.toString().trimRight();
  }

93 94 95
  /// This generates the map of Android key codes to logical keys.
  String get androidKeyCodeMap {
    final StringBuffer androidKeyCodeMap = StringBuffer();
96
    for (final Key entry in keyData.data) {
97
      if (entry.androidKeyCodes != null) {
98
        for (final int code in entry.androidKeyCodes.cast<int>()) {
99
          androidKeyCodeMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
100 101 102 103 104 105 106 107 108
        }
      }
    }
    return androidKeyCodeMap.toString().trimRight();
  }

  /// This generates the map of Android number pad key codes to logical keys.
  String get androidNumpadMap {
    final StringBuffer androidKeyCodeMap = StringBuffer();
109
    for (final Key entry in numpadKeyData) {
110
      if (entry.androidKeyCodes != null) {
111
        for (final int code in entry.androidKeyCodes.cast<int>()) {
112
          androidKeyCodeMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
113 114 115 116 117 118 119 120 121
        }
      }
    }
    return androidKeyCodeMap.toString().trimRight();
  }

  /// This generates the map of Android scan codes to physical keys.
  String get androidScanCodeMap {
    final StringBuffer androidScanCodeMap = StringBuffer();
122
    for (final Key entry in keyData.data) {
123
      if (entry.androidScanCodes != null) {
124
        for (final int code in entry.androidScanCodes.cast<int>()) {
125
          androidScanCodeMap.writeln('  $code: PhysicalKeyboardKey.${entry.constantName},');
126 127 128 129 130 131
        }
      }
    }
    return androidScanCodeMap.toString().trimRight();
  }

132 133 134 135 136
  /// This generates the map of Windows scan codes to physical keys.
  String get windowsScanCodeMap {
    final StringBuffer windowsScanCodeMap = StringBuffer();
    for (final Key entry in keyData.data) {
      if (entry.windowsScanCode != null) {
137
        windowsScanCodeMap.writeln('  ${toHex(entry.windowsScanCode)}: PhysicalKeyboardKey.${entry.constantName},');
138 139 140 141 142 143 144 145 146
      }
    }
    return windowsScanCodeMap.toString().trimRight();
  }

  /// This generates the map of Windows number pad key codes to logical keys.
  String get windowsNumpadMap {
    final StringBuffer windowsNumPadMap = StringBuffer();
    for (final Key entry in numpadKeyData) {
147 148 149 150
      if (entry.windowsKeyCodes != null){
        for (final int code in entry.windowsKeyCodes) {
          windowsNumPadMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
        }
151 152 153 154 155
      }
    }
    return windowsNumPadMap.toString().trimRight();
  }

156
  /// This generates the map of Windows key codes to logical keys.
157 158 159 160
  String get windowsKeyCodeMap {
    final StringBuffer windowsKeyCodeMap = StringBuffer();
    for (final Key entry in keyData.data) {
      if (entry.windowsKeyCodes != null) {
161 162
        for (final int code in entry.windowsKeyCodes) {
          windowsKeyCodeMap.writeln('  $code: LogicalKeyboardKey.${entry.constantName},');
163 164 165 166 167 168
        }
      }
    }
    return windowsKeyCodeMap.toString().trimRight();
  }

169 170 171
  /// This generates the map of macOS key codes to physical keys.
  String get macOsScanCodeMap {
    final StringBuffer macOsScanCodeMap = StringBuffer();
172
    for (final Key entry in keyData.data) {
173
      if (entry.macOsScanCode != null) {
174
        macOsScanCodeMap.writeln('  ${toHex(entry.macOsScanCode)}: PhysicalKeyboardKey.${entry.constantName},');
175 176 177 178 179 180 181 182
      }
    }
    return macOsScanCodeMap.toString().trimRight();
  }

  /// This generates the map of macOS number pad key codes to logical keys.
  String get macOsNumpadMap {
    final StringBuffer macOsNumPadMap = StringBuffer();
183
    for (final Key entry in numpadKeyData) {
184
      if (entry.macOsScanCode != null) {
185
        macOsNumPadMap.writeln('  ${toHex(entry.macOsScanCode)}: LogicalKeyboardKey.${entry.constantName},');
186 187 188 189 190
      }
    }
    return macOsNumPadMap.toString().trimRight();
  }

191 192
  String get macOsFunctionKeyMap {
    final StringBuffer macOsFunctionKeyMap = StringBuffer();
193
    for (final Key entry in functionKeyData) {
194
      if (entry.macOsScanCode != null) {
195
        macOsFunctionKeyMap.writeln('  ${toHex(entry.macOsScanCode)}: LogicalKeyboardKey.${entry.constantName},');
196 197 198 199 200
      }
    }
    return macOsFunctionKeyMap.toString().trimRight();
  }

201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
  /// This generates the map of iOS key codes to physical keys.
  String get iosScanCodeMap {
    final StringBuffer iosScanCodeMap = StringBuffer();
    for (final Key entry in keyData.data) {
      if (entry.iosScanCode != null) {
        iosScanCodeMap.writeln('  ${toHex(entry.iosScanCode)}: PhysicalKeyboardKey.${entry.constantName},');
      }
    }
    return iosScanCodeMap.toString().trimRight();
  }

  /// This generates the map of iOS number pad key codes to logical keys.
  String get iosNumpadMap {
    final StringBuffer iosNumPadMap = StringBuffer();
    for (final Key entry in numpadKeyData) {
      if (entry.iosScanCode != null) {
        iosNumPadMap.writeln('  ${toHex(entry.iosScanCode)}: LogicalKeyboardKey.${entry.constantName},');
      }
    }
    return iosNumPadMap.toString().trimRight();
  }

223 224 225
  /// This generates the map of Fuchsia key codes to logical keys.
  String get fuchsiaKeyCodeMap {
    final StringBuffer fuchsiaKeyCodeMap = StringBuffer();
226
    for (final Key entry in keyData.data) {
227
      if (entry.usbHidCode != null) {
228
        fuchsiaKeyCodeMap.writeln('  ${toHex(entry.flutterId)}: LogicalKeyboardKey.${entry.constantName},');
229 230 231 232 233 234 235 236
      }
    }
    return fuchsiaKeyCodeMap.toString().trimRight();
  }

  /// This generates the map of Fuchsia USB HID codes to physical keys.
  String get fuchsiaHidCodeMap {
    final StringBuffer fuchsiaScanCodeMap = StringBuffer();
237
    for (final Key entry in keyData.data) {
238
      if (entry.usbHidCode != null) {
239
        fuchsiaScanCodeMap.writeln('  ${toHex(entry.usbHidCode)}: PhysicalKeyboardKey.${entry.constantName},');
240 241 242 243 244
      }
    }
    return fuchsiaScanCodeMap.toString().trimRight();
  }

Mouad Debbar's avatar
Mouad Debbar committed
245 246 247
  /// This generates the map of Web KeyboardEvent codes to logical keys.
  String get webLogicalKeyMap {
    final StringBuffer result = StringBuffer();
248
    for (final Key entry in keyData.data) {
Mouad Debbar's avatar
Mouad Debbar committed
249
      if (entry.name != null) {
250
        result.writeln("  '${entry.name}': LogicalKeyboardKey.${entry.constantName},");
Mouad Debbar's avatar
Mouad Debbar committed
251 252 253 254 255 256 257 258
      }
    }
    return result.toString().trimRight();
  }

  /// This generates the map of Web KeyboardEvent codes to physical keys.
  String get webPhysicalKeyMap {
    final StringBuffer result = StringBuffer();
259
    for (final Key entry in keyData.data) {
Mouad Debbar's avatar
Mouad Debbar committed
260
      if (entry.name != null) {
261
        result.writeln("  '${entry.name}': PhysicalKeyboardKey.${entry.constantName},");
Mouad Debbar's avatar
Mouad Debbar committed
262 263 264 265 266 267 268 269
      }
    }
    return result.toString().trimRight();
  }

  /// This generates the map of Web number pad codes to logical keys.
  String get webNumpadMap {
    final StringBuffer result = StringBuffer();
270
    for (final Key entry in numpadKeyData) {
Mouad Debbar's avatar
Mouad Debbar committed
271
      if (entry.name != null) {
272
        result.writeln("  '${entry.name}': LogicalKeyboardKey.${entry.constantName},");
Mouad Debbar's avatar
Mouad Debbar committed
273 274 275 276 277
      }
    }
    return result.toString().trimRight();
  }

278 279 280 281 282 283
  @override
  String get templatePath => path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'keyboard_maps.tmpl');

  @override
  Map<String, String> mappings() {
    return <String, String>{
284 285 286 287 288
      'ANDROID_SCAN_CODE_MAP': androidScanCodeMap,
      'ANDROID_KEY_CODE_MAP': androidKeyCodeMap,
      'ANDROID_NUMPAD_MAP': androidNumpadMap,
      'FUCHSIA_SCAN_CODE_MAP': fuchsiaHidCodeMap,
      'FUCHSIA_KEY_CODE_MAP': fuchsiaKeyCodeMap,
289 290
      'MACOS_SCAN_CODE_MAP': macOsScanCodeMap,
      'MACOS_NUMPAD_MAP': macOsNumpadMap,
291
      'MACOS_FUNCTION_KEY_MAP': macOsFunctionKeyMap,
292 293
      'IOS_SCAN_CODE_MAP': iosScanCodeMap,
      'IOS_NUMPAD_MAP': iosNumpadMap,
294 295
      'GLFW_KEY_CODE_MAP': glfwKeyCodeMap,
      'GLFW_NUMPAD_MAP': glfwNumpadMap,
296 297
      'GTK_KEY_CODE_MAP': gtkKeyCodeMap,
      'GTK_NUMPAD_MAP': gtkNumpadMap,
298
      'XKB_SCAN_CODE_MAP': xkbScanCodeMap,
Mouad Debbar's avatar
Mouad Debbar committed
299 300 301
      'WEB_LOGICAL_KEY_MAP': webLogicalKeyMap,
      'WEB_PHYSICAL_KEY_MAP': webPhysicalKeyMap,
      'WEB_NUMPAD_MAP': webNumpadMap,
302 303
      'WINDOWS_LOGICAL_KEY_MAP': windowsKeyCodeMap,
      'WINDOWS_PHYSICAL_KEY_MAP': windowsScanCodeMap,
304
      'WINDOWS_NUMPAD_MAP': windowsNumpadMap,
305 306 307
    };
  }
}