diff --git a/milepost b/milepost
index d2c4acf..2fe683b 160000
--- a/milepost
+++ b/milepost
@@ -1 +1 @@
-Subproject commit d2c4acf6e2e13d251c036ab8bd51e70d9c28505f
+Subproject commit 2fe683b79d25a1b1ef7c3b1777f651358cce09ca
diff --git a/samples/pong/build.bat b/samples/pong/build.bat
new file mode 100644
index 0000000..ae1f2ba
--- /dev/null
+++ b/samples/pong/build.bat
@@ -0,0 +1,17 @@
+@echo off
+
+:: compile wasm module
+set wasmFlags=--target=wasm32^
+ --no-standard-libraries ^
+ -fno-builtin ^
+ -Wl,--no-entry ^
+ -Wl,--export-all ^
+ -Wl,--allow-undefined ^
+ -g ^
+ -D__ORCA__ ^
+ -I ..\.. -I ..\..\src -I ..\..\sdk -I..\..\milepost -I ..\..\milepost\src
+
+clang %wasmFlags% -o .\module.wasm ..\..\sdk\orca.c src\main.c
+
+
+python3 ..\..\scripts\mkapp.py --orca-dir ../.. --name Pong --icon icon.png --data-dir dir1 module.wasm
diff --git a/samples/pong/src/main.c b/samples/pong/src/main.c
index 613e2ab..ade684e 100644
--- a/samples/pong/src/main.c
+++ b/samples/pong/src/main.c
@@ -78,7 +78,7 @@ void OnInit(void)
#endif // TEST_IMAGE
//NOTE: testing file io
- file_handle file = file_open(STR8("/test_write.txt"), FILE_OPEN_CREATE | FILE_OPEN_WRITE);
+ file_handle file = file_open(STR8("/test_write.txt"), FILE_ACCESS_WRITE, FILE_OPEN_CREATE);
if(file_last_error(file) == IO_OK)
{
str8 string = STR8("Hello, file!\n");
@@ -90,7 +90,7 @@ void OnInit(void)
log_error("Couldn't open file test_write.txt\n");
}
- file = file_open(STR8("/dir1/test_read.txt"), FILE_OPEN_READ);
+ file = file_open(STR8("/dir1/test_read.txt"), FILE_ACCESS_READ, 0);
u64 size = file_size(file);
char* buffer = mem_arena_alloc(mem_scratch(), size);
file_read(file, size, buffer);
diff --git a/scripts/mkapp.py b/scripts/mkapp.py
index b4220e8..dc0f394 100644
--- a/scripts/mkapp.py
+++ b/scripts/mkapp.py
@@ -1,162 +1,239 @@
-#!/usr/bin/env python3
-
-import os
-import shutil
-import subprocess
-from argparse import ArgumentParser
-
-#---------------------------------------------------------------------------------------------
-# NOTE: get args
-#
-# mkapp.py [options] module
-#
-# -n, --name the name of the app
-# -r, --res-file copies a file to the app bundle's resource directory
-# -R, --res-dir copies the contents of a directory to the bundle's resource directory
-# -i, --icon icon file
-# -D, --out-dir output directory
-#----------------------------------------------------------------------------------------------
-
-parser = ArgumentParser(prog='mkapp')
-parser.add_argument("-d", "--data-file", action='append', dest='data_files')
-parser.add_argument("-D", "--data-dir", action='append', dest='data_dirs')
-parser.add_argument("-i", "--icon")
-parser.add_argument("-C", "--out-dir", default=os.getcwd())
-parser.add_argument("-n", "--name", default='out')
-parser.add_argument("-O", "--orca-dir", default='.')
-parser.add_argument("--version", default='0.0.0')
-parser.add_argument("module")
-
-args = parser.parse_args()
-
-#-----------------------------------------------------------
-#NOTE: make bundle directory structure
-#-----------------------------------------------------------
-app_name = args.name
-bundle_name = app_name + '.app'
-bundle_path = args.out_dir + '/' + bundle_name
-contents_dir = bundle_path + '/Contents'
-exe_dir = contents_dir + '/MacOS'
-res_dir = contents_dir + '/resources'
-guest_dir = contents_dir + '/app'
-wasm_dir = guest_dir + '/wasm'
-data_dir = guest_dir + '/data'
-
-if os.path.exists(bundle_path):
- shutil.rmtree(bundle_path)
-os.mkdir(bundle_path)
-os.mkdir(contents_dir)
-os.mkdir(exe_dir)
-os.mkdir(res_dir)
-os.mkdir(guest_dir)
-os.mkdir(wasm_dir)
-os.mkdir(data_dir)
-
-#-----------------------------------------------------------
-#NOTE: copy orca runtime executable and libraries
-#-----------------------------------------------------------
-orca_exe = args.orca_dir + '/bin/orca'
-milepost_lib = args.orca_dir + '/bin/libmilepost.dylib'
-gles_lib = args.orca_dir + '/bin/libGLESv2.dylib'
-egl_lib = args.orca_dir + '/bin/libEGL.dylib'
-renderer_lib = args.orca_dir + '/bin/mtl_renderer.metallib'
-
-shutil.copy(orca_exe, exe_dir)
-shutil.copy(milepost_lib, exe_dir)
-shutil.copy(gles_lib, exe_dir)
-shutil.copy(egl_lib, exe_dir)
-shutil.copy(renderer_lib, exe_dir)
-
-#-----------------------------------------------------------
-#NOTE: copy wasm module and data
-#-----------------------------------------------------------
-shutil.copy(args.module, wasm_dir + '/module.wasm')
-
-if args.data_files != None:
- for data in args.data_files:
- shutil.copy(data, data_dir)
-
-if args.data_dirs != None:
- for data in args.data_dirs:
- shutil.copytree(data, data_dir + '/' + os.path.basename(data), dirs_exist_ok=True)
-
-#-----------------------------------------------------------
-#NOTE: copy runtime resources
-#-----------------------------------------------------------
-# default fonts
-shutil.copy(args.orca_dir + '/resources/OpenSansLatinSubset.ttf', res_dir)
-shutil.copy(args.orca_dir + '/resources/Menlo.ttf', res_dir)
-shutil.copy(args.orca_dir + '/resources/Menlo Bold.ttf', res_dir)
-shutil.copy(args.orca_dir + '/resources/Menlo Italics.ttf', res_dir)
-
-#-----------------------------------------------------------
-#NOTE make icon
-#-----------------------------------------------------------
-src_image=args.icon
-
-#if src_image == None:
-# src_image = orca_dir + '/resources/default_app_icon.png'
-
-if src_image != None:
- iconset = os.path.splitext(src_image)[0] + '.iconset'
-
- if os.path.exists(iconset):
- shutil.rmtree(iconset)
-
- os.mkdir(iconset)
-
- size = 16
- for i in range(0, 7):
- size_str = str(size)
- icon = 'icon_' + size_str + 'x' + size_str + '.png'
- subprocess.run(['sips', '-z', size_str, size_str, src_image, '--out', iconset + '/' + icon],
- stdout = subprocess.DEVNULL,
- stderr = subprocess.DEVNULL)
-
- size_str_retina = str(size*2)
- icon = 'icon_' + size_str + 'x' + size_str + '@2x.png'
- subprocess.run(['sips', '-z', size_str_retina, size_str_retina, src_image, '--out', iconset + '/' + icon],
- stdout = subprocess.DEVNULL,
- stderr = subprocess.DEVNULL)
-
- size = size*2
-
- subprocess.run(['iconutil', '-c', 'icns', '-o', res_dir + '/icon.icns', iconset])
- shutil.rmtree(iconset)
-
-#-----------------------------------------------------------
-#NOTE: write plist file
-#-----------------------------------------------------------
-version = args.version
-bundle_sig = "????"
-icon_file = ''
-
-plist_contents = """
-
-
-
-
- CFBundleName
- {app_name}
- CFBundleDisplayName
- {app_name}
- CFBundleIdentifier
- {app_name}
- CFBundleVersion
- {version}
- CFBundlePackageType
- APPL
- CFBundleSignature
- {bundle_sig}
- CFBundleExecutable
- orca
- CFBundleIconFile
- icon.icns
- NSHighResolutionCapable
- True
-
-
-""".format(app_name=app_name, version=version, bundle_sig=bundle_sig, icon_file=icon_file)
-
-plist_file = open(contents_dir + '/Info.plist', 'w')
-print(plist_contents, file=plist_file)
+#!/usr/bin/env python3
+
+import os
+import platform
+import shutil
+import subprocess
+from argparse import ArgumentParser
+
+def macos_make_app(args):
+ #-----------------------------------------------------------
+ #NOTE: make bundle directory structure
+ #-----------------------------------------------------------
+ app_name = args.name
+ bundle_name = app_name + '.app'
+ bundle_path = args.out_dir + '/' + bundle_name
+ contents_dir = bundle_path + '/Contents'
+ exe_dir = contents_dir + '/MacOS'
+ res_dir = contents_dir + '/resources'
+ guest_dir = contents_dir + '/app'
+ wasm_dir = guest_dir + '/wasm'
+ data_dir = guest_dir + '/data'
+
+ if os.path.exists(bundle_path):
+ shutil.rmtree(bundle_path)
+ os.mkdir(bundle_path)
+ os.mkdir(contents_dir)
+ os.mkdir(exe_dir)
+ os.mkdir(res_dir)
+ os.mkdir(guest_dir)
+ os.mkdir(wasm_dir)
+ os.mkdir(data_dir)
+
+ #-----------------------------------------------------------
+ #NOTE: copy orca runtime executable and libraries
+ #-----------------------------------------------------------
+ orca_exe = args.orca_dir + '/bin/orca'
+ milepost_lib = args.orca_dir + '/bin/libmilepost.dylib'
+ gles_lib = args.orca_dir + '/bin/libGLESv2.dylib'
+ egl_lib = args.orca_dir + '/bin/libEGL.dylib'
+ renderer_lib = args.orca_dir + '/bin/mtl_renderer.metallib'
+
+ shutil.copy(orca_exe, exe_dir)
+ shutil.copy(milepost_lib, exe_dir)
+ shutil.copy(gles_lib, exe_dir)
+ shutil.copy(egl_lib, exe_dir)
+ shutil.copy(renderer_lib, exe_dir)
+
+ #-----------------------------------------------------------
+ #NOTE: copy wasm module and data
+ #-----------------------------------------------------------
+ shutil.copy(args.module, wasm_dir + '/module.wasm')
+
+ if args.data_files != None:
+ for data in args.data_files:
+ shutil.copy(data, data_dir)
+
+ if args.data_dirs != None:
+ for data in args.data_dirs:
+ shutil.copytree(data, data_dir + '/' + os.path.basename(data), dirs_exist_ok=True)
+
+ #-----------------------------------------------------------
+ #NOTE: copy runtime resources
+ #-----------------------------------------------------------
+ # default fonts
+ shutil.copy(args.orca_dir + '/resources/OpenSansLatinSubset.ttf', res_dir)
+ shutil.copy(args.orca_dir + '/resources/Menlo.ttf', res_dir)
+ shutil.copy(args.orca_dir + '/resources/Menlo Bold.ttf', res_dir)
+ shutil.copy(args.orca_dir + '/resources/Menlo Italics.ttf', res_dir)
+
+ #-----------------------------------------------------------
+ #NOTE make icon
+ #-----------------------------------------------------------
+ src_image=args.icon
+
+ #if src_image == None:
+ # src_image = orca_dir + '/resources/default_app_icon.png'
+
+ if src_image != None:
+ iconset = os.path.splitext(src_image)[0] + '.iconset'
+
+ if os.path.exists(iconset):
+ shutil.rmtree(iconset)
+
+ os.mkdir(iconset)
+
+ size = 16
+ for i in range(0, 7):
+ size_str = str(size)
+ icon = 'icon_' + size_str + 'x' + size_str + '.png'
+ subprocess.run(['sips', '-z', size_str, size_str, src_image, '--out', iconset + '/' + icon],
+ stdout = subprocess.DEVNULL,
+ stderr = subprocess.DEVNULL)
+
+ size_str_retina = str(size*2)
+ icon = 'icon_' + size_str + 'x' + size_str + '@2x.png'
+ subprocess.run(['sips', '-z', size_str_retina, size_str_retina, src_image, '--out', iconset + '/' + icon],
+ stdout = subprocess.DEVNULL,
+ stderr = subprocess.DEVNULL)
+
+ size = size*2
+
+ subprocess.run(['iconutil', '-c', 'icns', '-o', res_dir + '/icon.icns', iconset])
+ shutil.rmtree(iconset)
+
+ #-----------------------------------------------------------
+ #NOTE: write plist file
+ #-----------------------------------------------------------
+ version = args.version
+ bundle_sig = "????"
+ icon_file = ''
+
+ plist_contents = """
+
+
+
+
+ CFBundleName
+ {app_name}
+ CFBundleDisplayName
+ {app_name}
+ CFBundleIdentifier
+ {app_name}
+ CFBundleVersion
+ {version}
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ {bundle_sig}
+ CFBundleExecutable
+ orca
+ CFBundleIconFile
+ icon.icns
+ NSHighResolutionCapable
+ True
+
+
+ """.format(app_name=app_name, version=version, bundle_sig=bundle_sig, icon_file=icon_file)
+
+ plist_file = open(contents_dir + '/Info.plist', 'w')
+ print(plist_contents, file=plist_file)
+
+def windows_make_app(args):
+ #-----------------------------------------------------------
+ #NOTE: make bundle directory structure
+ #-----------------------------------------------------------
+ app_name = args.name
+ bundle_name = app_name
+ bundle_dir = args.out_dir + '/' + bundle_name
+ exe_dir = bundle_dir + '/bin'
+ res_dir = bundle_dir + '/resources'
+ guest_dir = bundle_dir + '/app'
+ wasm_dir = guest_dir + '/wasm'
+ data_dir = guest_dir + '/data'
+
+ if os.path.exists(bundle_dir):
+ shutil.rmtree(bundle_dir)
+ os.mkdir(bundle_dir)
+ os.mkdir(exe_dir)
+ os.mkdir(res_dir)
+ os.mkdir(guest_dir)
+ os.mkdir(wasm_dir)
+ os.mkdir(data_dir)
+
+ #-----------------------------------------------------------
+ #NOTE: copy orca runtime executable and libraries
+ #-----------------------------------------------------------
+ orca_exe = args.orca_dir + '/bin/orca.exe'
+ milepost_lib = args.orca_dir + '/bin/milepost.dll'
+ gles_lib = args.orca_dir + '/milepost/bin/libGLESv2.dll'
+ egl_lib = args.orca_dir + '/milepost/bin/libEGL.dll'
+ pthread_lib = args.orca_dir + '/bin/pthreadVC3.dll'
+
+ shutil.copy(orca_exe, exe_dir)
+ shutil.copy(milepost_lib, exe_dir)
+ shutil.copy(gles_lib, exe_dir)
+ shutil.copy(egl_lib, exe_dir)
+ shutil.copy(pthread_lib, exe_dir)
+
+ #-----------------------------------------------------------
+ #NOTE: copy wasm module and data
+ #-----------------------------------------------------------
+ shutil.copy(args.module, wasm_dir + '/module.wasm')
+
+ if args.data_files != None:
+ for data in args.data_files:
+ shutil.copy(data, data_dir)
+
+ if args.data_dirs != None:
+ for data in args.data_dirs:
+ shutil.copytree(data, data_dir + '/' + os.path.basename(data), dirs_exist_ok=True)
+
+ #-----------------------------------------------------------
+ #NOTE: copy runtime resources
+ #-----------------------------------------------------------
+ # default fonts
+ shutil.copy(args.orca_dir + '/resources/OpenSansLatinSubset.ttf', res_dir)
+ shutil.copy(args.orca_dir + '/resources/Menlo.ttf', res_dir)
+ shutil.copy(args.orca_dir + '/resources/Menlo Bold.ttf', res_dir)
+ shutil.copy(args.orca_dir + '/resources/Menlo Italics.ttf', res_dir)
+
+ #-----------------------------------------------------------
+ #NOTE make icon
+ #-----------------------------------------------------------
+ #TODO
+
+#---------------------------------------------------------------------------------------------
+# NOTE: get args
+#
+# mkapp.py [options] module
+#
+# -n, --name the name of the app
+# -r, --res-file copies a file to the app bundle's resource directory
+# -R, --res-dir copies the contents of a directory to the bundle's resource directory
+# -i, --icon icon file
+# -D, --out-dir output directory
+#----------------------------------------------------------------------------------------------
+
+parser = ArgumentParser(prog='mkapp')
+parser.add_argument("-d", "--data-file", action='append', dest='data_files')
+parser.add_argument("-D", "--data-dir", action='append', dest='data_dirs')
+parser.add_argument("-i", "--icon")
+parser.add_argument("-C", "--out-dir", default=os.getcwd())
+parser.add_argument("-n", "--name", default='out')
+parser.add_argument("-O", "--orca-dir", default='.')
+parser.add_argument("--version", default='0.0.0')
+parser.add_argument("module")
+
+args = parser.parse_args()
+
+#----------------------------------------------------------------------------------------------
+# Dispatch to platform-specific function
+#----------------------------------------------------------------------------------------------
+platformName = platform.system()
+if platformName == 'Darwin':
+ macos_make_app(args)
+elif platformName == 'Windows':
+ windows_make_app(args)
+else:
+ print("Platform '" + platformName + "' is not supported for now...")
diff --git a/sdk/keys.h b/sdk/keys.h
index 3d254a7..a350dae 100644
--- a/sdk/keys.h
+++ b/sdk/keys.h
@@ -1,140 +1,140 @@
-/************************************************************//**
-*
-* @file: keys.h
-* @author: Martin Fouilleul
-* @date: 26/08/2022
-* @revision:
-*
-*****************************************************************/
-#ifndef __KEYS_H_
-#define __KEYS_H_
-
-#include"typedefs.h"
-
-typedef i32 key_code;
-static const key_code KEY_UNKNOWN = -1,
- KEY_SPACE = 32,
- KEY_APOSTROPHE = 39, // '
- KEY_COMMA = 44, // ,
- KEY_MINUS = 45, // -
- KEY_PERIOD = 46, // .
- KEY_SLASH = 47, // /
- KEY_0 = 48,
- KEY_1 = 49,
- KEY_2 = 50,
- KEY_3 = 51,
- KEY_4 = 52,
- KEY_5 = 53,
- KEY_6 = 54,
- KEY_7 = 55,
- KEY_8 = 56,
- KEY_9 = 57,
- KEY_SEMICOLON = 59, // ;
- KEY_EQUAL = 61, // =
- KEY_A = 65,
- KEY_B = 66,
- KEY_C = 67,
- KEY_D = 68,
- KEY_E = 69,
- KEY_F = 70,
- KEY_G = 71,
- KEY_H = 72,
- KEY_I = 73,
- KEY_J = 74,
- KEY_K = 75,
- KEY_L = 76,
- KEY_M = 77,
- KEY_N = 78,
- KEY_O = 79,
- KEY_P = 80,
- KEY_Q = 81,
- KEY_R = 82,
- KEY_S = 83,
- KEY_T = 84,
- KEY_U = 85,
- KEY_V = 86,
- KEY_W = 87,
- KEY_X = 88,
- KEY_Y = 89,
- KEY_Z = 90,
- KEY_LEFT_BRACKET = 91, // [
- KEY_BACKSLASH = 92, // \ */
- KEY_RIGHT_BRACKET = 93, // ]
- KEY_GRAVE_ACCENT = 96, // `
- KEY_WORLD_1 = 161, // non-US #1
- KEY_WORLD_2 = 162, // non-US #2
- KEY_ESCAPE = 256,
- KEY_ENTER = 257,
- KEY_TAB = 258,
- KEY_BACKSPACE = 259,
- KEY_INSERT = 260,
- KEY_DELETE = 261,
- KEY_RIGHT = 262,
- KEY_LEFT = 263,
- KEY_DOWN = 264,
- KEY_UP = 265,
- KEY_PAGE_UP = 266,
- KEY_PAGE_DOWN = 267,
- KEY_HOME = 268,
- KEY_END = 269,
- KEY_CAPS_LOCK = 280,
- KEY_SCROLL_LOCK = 281,
- KEY_NUM_LOCK = 282,
- KEY_PRINT_SCREEN = 283,
- KEY_PAUSE = 284,
- KEY_F1 = 290,
- KEY_F2 = 291,
- KEY_F3 = 292,
- KEY_F4 = 293,
- KEY_F5 = 294,
- KEY_F6 = 295,
- KEY_F7 = 296,
- KEY_F8 = 297,
- KEY_F9 = 298,
- KEY_F10 = 299,
- KEY_F11 = 300,
- KEY_F12 = 301,
- KEY_F13 = 302,
- KEY_F14 = 303,
- KEY_F15 = 304,
- KEY_F16 = 305,
- KEY_F17 = 306,
- KEY_F18 = 307,
- KEY_F19 = 308,
- KEY_F20 = 309,
- KEY_F21 = 310,
- KEY_F22 = 311,
- KEY_F23 = 312,
- KEY_F24 = 313,
- KEY_F25 = 314,
- KEY_KP_0 = 320,
- KEY_KP_1 = 321,
- KEY_KP_2 = 322,
- KEY_KP_3 = 323,
- KEY_KP_4 = 324,
- KEY_KP_5 = 325,
- KEY_KP_6 = 326,
- KEY_KP_7 = 327,
- KEY_KP_8 = 328,
- KEY_KP_9 = 329,
- KEY_KP_DECIMAL = 330,
- KEY_KP_DIVIDE = 331,
- KEY_KP_MULTIPLY = 332,
- KEY_KP_SUBTRACT = 333,
- KEY_KP_ADD = 334,
- KEY_KP_ENTER = 335,
- KEY_KP_EQUAL = 336,
- KEY_LEFT_SHIFT = 340,
- KEY_LEFT_CONTROL = 341,
- KEY_LEFT_ALT = 342,
- KEY_LEFT_SUPER = 343,
- KEY_RIGHT_SHIFT = 344,
- KEY_RIGHT_CONTROL = 345,
- KEY_RIGHT_ALT = 346,
- KEY_RIGHT_SUPER = 347,
- KEY_MENU = 348;
-
-static const key_code KEY_MAX = KEY_MENU;
-
-
-#endif //__KEYS_H_
+/************************************************************//**
+*
+* @file: keys.h
+* @author: Martin Fouilleul
+* @date: 26/08/2022
+* @revision:
+*
+*****************************************************************/
+#ifndef __KEYS_H_
+#define __KEYS_H_
+
+#include"util/typedefs.h"
+
+typedef i32 key_code;
+static const key_code KEY_UNKNOWN = -1,
+ KEY_SPACE = 32,
+ KEY_APOSTROPHE = 39, // '
+ KEY_COMMA = 44, // ,
+ KEY_MINUS = 45, // -
+ KEY_PERIOD = 46, // .
+ KEY_SLASH = 47, // /
+ KEY_0 = 48,
+ KEY_1 = 49,
+ KEY_2 = 50,
+ KEY_3 = 51,
+ KEY_4 = 52,
+ KEY_5 = 53,
+ KEY_6 = 54,
+ KEY_7 = 55,
+ KEY_8 = 56,
+ KEY_9 = 57,
+ KEY_SEMICOLON = 59, // ;
+ KEY_EQUAL = 61, // =
+ KEY_A = 65,
+ KEY_B = 66,
+ KEY_C = 67,
+ KEY_D = 68,
+ KEY_E = 69,
+ KEY_F = 70,
+ KEY_G = 71,
+ KEY_H = 72,
+ KEY_I = 73,
+ KEY_J = 74,
+ KEY_K = 75,
+ KEY_L = 76,
+ KEY_M = 77,
+ KEY_N = 78,
+ KEY_O = 79,
+ KEY_P = 80,
+ KEY_Q = 81,
+ KEY_R = 82,
+ KEY_S = 83,
+ KEY_T = 84,
+ KEY_U = 85,
+ KEY_V = 86,
+ KEY_W = 87,
+ KEY_X = 88,
+ KEY_Y = 89,
+ KEY_Z = 90,
+ KEY_LEFT_BRACKET = 91, // [
+ KEY_BACKSLASH = 92, // \ */
+ KEY_RIGHT_BRACKET = 93, // ]
+ KEY_GRAVE_ACCENT = 96, // `
+ KEY_WORLD_1 = 161, // non-US #1
+ KEY_WORLD_2 = 162, // non-US #2
+ KEY_ESCAPE = 256,
+ KEY_ENTER = 257,
+ KEY_TAB = 258,
+ KEY_BACKSPACE = 259,
+ KEY_INSERT = 260,
+ KEY_DELETE = 261,
+ KEY_RIGHT = 262,
+ KEY_LEFT = 263,
+ KEY_DOWN = 264,
+ KEY_UP = 265,
+ KEY_PAGE_UP = 266,
+ KEY_PAGE_DOWN = 267,
+ KEY_HOME = 268,
+ KEY_END = 269,
+ KEY_CAPS_LOCK = 280,
+ KEY_SCROLL_LOCK = 281,
+ KEY_NUM_LOCK = 282,
+ KEY_PRINT_SCREEN = 283,
+ KEY_PAUSE = 284,
+ KEY_F1 = 290,
+ KEY_F2 = 291,
+ KEY_F3 = 292,
+ KEY_F4 = 293,
+ KEY_F5 = 294,
+ KEY_F6 = 295,
+ KEY_F7 = 296,
+ KEY_F8 = 297,
+ KEY_F9 = 298,
+ KEY_F10 = 299,
+ KEY_F11 = 300,
+ KEY_F12 = 301,
+ KEY_F13 = 302,
+ KEY_F14 = 303,
+ KEY_F15 = 304,
+ KEY_F16 = 305,
+ KEY_F17 = 306,
+ KEY_F18 = 307,
+ KEY_F19 = 308,
+ KEY_F20 = 309,
+ KEY_F21 = 310,
+ KEY_F22 = 311,
+ KEY_F23 = 312,
+ KEY_F24 = 313,
+ KEY_F25 = 314,
+ KEY_KP_0 = 320,
+ KEY_KP_1 = 321,
+ KEY_KP_2 = 322,
+ KEY_KP_3 = 323,
+ KEY_KP_4 = 324,
+ KEY_KP_5 = 325,
+ KEY_KP_6 = 326,
+ KEY_KP_7 = 327,
+ KEY_KP_8 = 328,
+ KEY_KP_9 = 329,
+ KEY_KP_DECIMAL = 330,
+ KEY_KP_DIVIDE = 331,
+ KEY_KP_MULTIPLY = 332,
+ KEY_KP_SUBTRACT = 333,
+ KEY_KP_ADD = 334,
+ KEY_KP_ENTER = 335,
+ KEY_KP_EQUAL = 336,
+ KEY_LEFT_SHIFT = 340,
+ KEY_LEFT_CONTROL = 341,
+ KEY_LEFT_ALT = 342,
+ KEY_LEFT_SUPER = 343,
+ KEY_RIGHT_SHIFT = 344,
+ KEY_RIGHT_CONTROL = 345,
+ KEY_RIGHT_ALT = 346,
+ KEY_RIGHT_SUPER = 347,
+ KEY_MENU = 348;
+
+static const key_code KEY_MAX = KEY_MENU;
+
+
+#endif //__KEYS_H_
diff --git a/src/orca_app.h b/src/orca_app.h
index 6646a52..7735b9c 100644
--- a/src/orca_app.h
+++ b/src/orca_app.h
@@ -42,7 +42,7 @@ typedef struct g_event_handler_desc
} g_event_handler_desc;
const g_event_handler_desc G_EVENT_HANDLER_DESC[] = {
- #define STR8LIT(s) {sizeof(s), s} //NOTE: msvc doesn't accept STR8(s) as compile-time constant...
+ #define STR8LIT(s) {sizeof(s)-1, s} //NOTE: msvc doesn't accept STR8(s) as compile-time constant...
#define G_EVENT_HANDLER_DESC_ENTRY(kind, name, rets, args) {STR8LIT(name), STR8LIT(rets), STR8LIT(args)},
G_EVENTS(G_EVENT_HANDLER_DESC_ENTRY)