RmlUi.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. /*
  2. * This source file is part of RmlUi, the HTML/CSS Interface Middleware
  3. *
  4. * For the latest information, see http://github.com/mikke89/RmlUi
  5. *
  6. * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
  7. * Copyright (c) 2019-2023 The RmlUi Team, and contributors
  8. *
  9. * Permission is hereby granted, free of charge, to any person obtaining a copy
  10. * of this software and associated documentation files (the "Software"), to deal
  11. * in the Software without restriction, including without limitation the rights
  12. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. * copies of the Software, and to permit persons to whom the Software is
  14. * furnished to do so, subject to the following conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be included in
  17. * all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25. * THE SOFTWARE.
  26. *
  27. */
  28. #include "RmlUi.h"
  29. #include "ElementInstancer.h"
  30. #include "LuaElementInstancer.h"
  31. #include "RmlUiContextsProxy.h"
  32. #include <RmlUi/Core/Core.h>
  33. #include <RmlUi/Core/Factory.h>
  34. #include <RmlUi/Core/Input.h>
  35. namespace Rml {
  36. namespace Lua {
  37. #define RMLUILUA_INPUTENUM(keyident, tbl) \
  38. lua_pushinteger(L, Input::KI_##keyident); \
  39. lua_setfield(L, (tbl), #keyident);
  40. #define RMLUILUA_INPUTMODIFIERENUM(keymod, tbl) \
  41. lua_pushinteger(L, Input::KM_##keymod); \
  42. lua_setfield(L, (tbl), #keymod);
  43. // c++ representation of the global variable in Lua so that the syntax is consistent
  44. LuaRmlUi lua_global_rmlui;
  45. void LuaRmlUiPushrmluiGlobal(lua_State* L)
  46. {
  47. luaL_getmetatable(L, GetTClassName<LuaRmlUi>());
  48. LuaRmlUiEnumkey_identifier(L);
  49. lua_global_rmlui.key_identifier_ref = luaL_ref(L, -2);
  50. LuaRmlUiEnumkey_modifier(L);
  51. lua_global_rmlui.key_modifier_ref = luaL_ref(L, -2);
  52. LuaType<LuaRmlUi>::push(L, &lua_global_rmlui, false);
  53. lua_setglobal(L, "rmlui");
  54. }
  55. template <>
  56. void ExtraInit<LuaRmlUi>(lua_State* /*L*/, int /*metatable_index*/)
  57. {
  58. return;
  59. }
  60. int LuaRmlUiCreateContext(lua_State* L, LuaRmlUi* /*obj*/)
  61. {
  62. const char* name = luaL_checkstring(L, 1);
  63. Vector2i* dimensions = LuaType<Vector2i>::check(L, 2);
  64. Context* new_context = CreateContext(name, *dimensions);
  65. if (new_context == nullptr || dimensions == nullptr)
  66. {
  67. lua_pushnil(L);
  68. }
  69. else
  70. {
  71. LuaType<Context>::push(L, new_context);
  72. }
  73. return 1;
  74. }
  75. int LuaRmlUiLoadFontFace(lua_State* L, LuaRmlUi* /*obj*/)
  76. {
  77. const char* file = luaL_checkstring(L, 1);
  78. bool fallback_face = lua_gettop(L) <= 1 ? false : RMLUI_CHECK_BOOL(L, 2);
  79. int face_index = lua_gettop(L) <= 2 ? 0 : static_cast<int>(luaL_checkinteger(L, 3));
  80. lua_pushboolean(L, LoadFontFace(file, fallback_face, Style::FontWeight::Auto, face_index));
  81. return 1;
  82. }
  83. int LuaRmlUiRegisterTag(lua_State* L, LuaRmlUi* /*obj*/)
  84. {
  85. const char* tag = luaL_checkstring(L, 1);
  86. LuaElementInstancer* lei = (LuaElementInstancer*)LuaType<ElementInstancer>::check(L, 2);
  87. RMLUI_CHECK_OBJ(lei);
  88. Factory::RegisterElementInstancer(tag, lei);
  89. return 0;
  90. }
  91. int LuaRmlUiGetAttrcontexts(lua_State* L)
  92. {
  93. RmlUiContextsProxy* proxy = new RmlUiContextsProxy();
  94. LuaType<RmlUiContextsProxy>::push(L, proxy, true);
  95. return 1;
  96. }
  97. int LuaRmlUiGetAttrkey_identifier(lua_State* L)
  98. {
  99. luaL_getmetatable(L, GetTClassName<LuaRmlUi>());
  100. lua_rawgeti(L, -1, lua_global_rmlui.key_identifier_ref);
  101. return 1;
  102. }
  103. int LuaRmlUiGetAttrkey_modifier(lua_State* L)
  104. {
  105. luaL_getmetatable(L, GetTClassName<LuaRmlUi>());
  106. lua_rawgeti(L, -1, lua_global_rmlui.key_modifier_ref);
  107. return 1;
  108. }
  109. void LuaRmlUiEnumkey_identifier(lua_State* L)
  110. {
  111. lua_newtable(L);
  112. int tbl = lua_gettop(L);
  113. RMLUILUA_INPUTENUM(UNKNOWN, tbl)
  114. RMLUILUA_INPUTENUM(SPACE, tbl)
  115. RMLUILUA_INPUTENUM(0, tbl)
  116. RMLUILUA_INPUTENUM(1, tbl)
  117. RMLUILUA_INPUTENUM(2, tbl)
  118. RMLUILUA_INPUTENUM(3, tbl)
  119. RMLUILUA_INPUTENUM(4, tbl)
  120. RMLUILUA_INPUTENUM(5, tbl)
  121. RMLUILUA_INPUTENUM(6, tbl)
  122. RMLUILUA_INPUTENUM(7, tbl)
  123. RMLUILUA_INPUTENUM(8, tbl)
  124. RMLUILUA_INPUTENUM(9, tbl)
  125. RMLUILUA_INPUTENUM(A, tbl)
  126. RMLUILUA_INPUTENUM(B, tbl)
  127. RMLUILUA_INPUTENUM(C, tbl)
  128. RMLUILUA_INPUTENUM(D, tbl)
  129. RMLUILUA_INPUTENUM(E, tbl)
  130. RMLUILUA_INPUTENUM(F, tbl)
  131. RMLUILUA_INPUTENUM(G, tbl)
  132. RMLUILUA_INPUTENUM(H, tbl)
  133. RMLUILUA_INPUTENUM(I, tbl)
  134. RMLUILUA_INPUTENUM(J, tbl)
  135. RMLUILUA_INPUTENUM(K, tbl)
  136. RMLUILUA_INPUTENUM(L, tbl)
  137. RMLUILUA_INPUTENUM(M, tbl)
  138. RMLUILUA_INPUTENUM(N, tbl)
  139. RMLUILUA_INPUTENUM(O, tbl)
  140. RMLUILUA_INPUTENUM(P, tbl)
  141. RMLUILUA_INPUTENUM(Q, tbl)
  142. RMLUILUA_INPUTENUM(R, tbl)
  143. RMLUILUA_INPUTENUM(S, tbl)
  144. RMLUILUA_INPUTENUM(T, tbl)
  145. RMLUILUA_INPUTENUM(U, tbl)
  146. RMLUILUA_INPUTENUM(V, tbl)
  147. RMLUILUA_INPUTENUM(W, tbl)
  148. RMLUILUA_INPUTENUM(X, tbl)
  149. RMLUILUA_INPUTENUM(Y, tbl)
  150. RMLUILUA_INPUTENUM(Z, tbl)
  151. RMLUILUA_INPUTENUM(OEM_1, tbl)
  152. RMLUILUA_INPUTENUM(OEM_PLUS, tbl)
  153. RMLUILUA_INPUTENUM(OEM_COMMA, tbl)
  154. RMLUILUA_INPUTENUM(OEM_MINUS, tbl)
  155. RMLUILUA_INPUTENUM(OEM_PERIOD, tbl)
  156. RMLUILUA_INPUTENUM(OEM_2, tbl)
  157. RMLUILUA_INPUTENUM(OEM_3, tbl)
  158. RMLUILUA_INPUTENUM(OEM_4, tbl)
  159. RMLUILUA_INPUTENUM(OEM_5, tbl)
  160. RMLUILUA_INPUTENUM(OEM_6, tbl)
  161. RMLUILUA_INPUTENUM(OEM_7, tbl)
  162. RMLUILUA_INPUTENUM(OEM_8, tbl)
  163. RMLUILUA_INPUTENUM(OEM_102, tbl)
  164. RMLUILUA_INPUTENUM(NUMPAD0, tbl)
  165. RMLUILUA_INPUTENUM(NUMPAD1, tbl)
  166. RMLUILUA_INPUTENUM(NUMPAD2, tbl)
  167. RMLUILUA_INPUTENUM(NUMPAD3, tbl)
  168. RMLUILUA_INPUTENUM(NUMPAD4, tbl)
  169. RMLUILUA_INPUTENUM(NUMPAD5, tbl)
  170. RMLUILUA_INPUTENUM(NUMPAD6, tbl)
  171. RMLUILUA_INPUTENUM(NUMPAD7, tbl)
  172. RMLUILUA_INPUTENUM(NUMPAD8, tbl)
  173. RMLUILUA_INPUTENUM(NUMPAD9, tbl)
  174. RMLUILUA_INPUTENUM(NUMPADENTER, tbl)
  175. RMLUILUA_INPUTENUM(MULTIPLY, tbl)
  176. RMLUILUA_INPUTENUM(ADD, tbl)
  177. RMLUILUA_INPUTENUM(SEPARATOR, tbl)
  178. RMLUILUA_INPUTENUM(SUBTRACT, tbl)
  179. RMLUILUA_INPUTENUM(DECIMAL, tbl)
  180. RMLUILUA_INPUTENUM(DIVIDE, tbl)
  181. RMLUILUA_INPUTENUM(OEM_NEC_EQUAL, tbl)
  182. RMLUILUA_INPUTENUM(BACK, tbl)
  183. RMLUILUA_INPUTENUM(TAB, tbl)
  184. RMLUILUA_INPUTENUM(CLEAR, tbl)
  185. RMLUILUA_INPUTENUM(RETURN, tbl)
  186. RMLUILUA_INPUTENUM(PAUSE, tbl)
  187. RMLUILUA_INPUTENUM(CAPITAL, tbl)
  188. RMLUILUA_INPUTENUM(KANA, tbl)
  189. RMLUILUA_INPUTENUM(HANGUL, tbl)
  190. RMLUILUA_INPUTENUM(JUNJA, tbl)
  191. RMLUILUA_INPUTENUM(FINAL, tbl)
  192. RMLUILUA_INPUTENUM(HANJA, tbl)
  193. RMLUILUA_INPUTENUM(KANJI, tbl)
  194. RMLUILUA_INPUTENUM(ESCAPE, tbl)
  195. RMLUILUA_INPUTENUM(CONVERT, tbl)
  196. RMLUILUA_INPUTENUM(NONCONVERT, tbl)
  197. RMLUILUA_INPUTENUM(ACCEPT, tbl)
  198. RMLUILUA_INPUTENUM(MODECHANGE, tbl)
  199. RMLUILUA_INPUTENUM(PRIOR, tbl)
  200. RMLUILUA_INPUTENUM(NEXT, tbl)
  201. RMLUILUA_INPUTENUM(END, tbl)
  202. RMLUILUA_INPUTENUM(HOME, tbl)
  203. RMLUILUA_INPUTENUM(LEFT, tbl)
  204. RMLUILUA_INPUTENUM(UP, tbl)
  205. RMLUILUA_INPUTENUM(RIGHT, tbl)
  206. RMLUILUA_INPUTENUM(DOWN, tbl)
  207. RMLUILUA_INPUTENUM(SELECT, tbl)
  208. RMLUILUA_INPUTENUM(PRINT, tbl)
  209. RMLUILUA_INPUTENUM(EXECUTE, tbl)
  210. RMLUILUA_INPUTENUM(SNAPSHOT, tbl)
  211. RMLUILUA_INPUTENUM(INSERT, tbl)
  212. RMLUILUA_INPUTENUM(DELETE, tbl)
  213. RMLUILUA_INPUTENUM(HELP, tbl)
  214. RMLUILUA_INPUTENUM(LWIN, tbl)
  215. RMLUILUA_INPUTENUM(RWIN, tbl)
  216. RMLUILUA_INPUTENUM(APPS, tbl)
  217. RMLUILUA_INPUTENUM(POWER, tbl)
  218. RMLUILUA_INPUTENUM(SLEEP, tbl)
  219. RMLUILUA_INPUTENUM(WAKE, tbl)
  220. RMLUILUA_INPUTENUM(F1, tbl)
  221. RMLUILUA_INPUTENUM(F2, tbl)
  222. RMLUILUA_INPUTENUM(F3, tbl)
  223. RMLUILUA_INPUTENUM(F4, tbl)
  224. RMLUILUA_INPUTENUM(F5, tbl)
  225. RMLUILUA_INPUTENUM(F6, tbl)
  226. RMLUILUA_INPUTENUM(F7, tbl)
  227. RMLUILUA_INPUTENUM(F8, tbl)
  228. RMLUILUA_INPUTENUM(F9, tbl)
  229. RMLUILUA_INPUTENUM(F10, tbl)
  230. RMLUILUA_INPUTENUM(F11, tbl)
  231. RMLUILUA_INPUTENUM(F12, tbl)
  232. RMLUILUA_INPUTENUM(F13, tbl)
  233. RMLUILUA_INPUTENUM(F14, tbl)
  234. RMLUILUA_INPUTENUM(F15, tbl)
  235. RMLUILUA_INPUTENUM(F16, tbl)
  236. RMLUILUA_INPUTENUM(F17, tbl)
  237. RMLUILUA_INPUTENUM(F18, tbl)
  238. RMLUILUA_INPUTENUM(F19, tbl)
  239. RMLUILUA_INPUTENUM(F20, tbl)
  240. RMLUILUA_INPUTENUM(F21, tbl)
  241. RMLUILUA_INPUTENUM(F22, tbl)
  242. RMLUILUA_INPUTENUM(F23, tbl)
  243. RMLUILUA_INPUTENUM(F24, tbl)
  244. RMLUILUA_INPUTENUM(NUMLOCK, tbl)
  245. RMLUILUA_INPUTENUM(SCROLL, tbl)
  246. RMLUILUA_INPUTENUM(OEM_FJ_JISHO, tbl)
  247. RMLUILUA_INPUTENUM(OEM_FJ_MASSHOU, tbl)
  248. RMLUILUA_INPUTENUM(OEM_FJ_TOUROKU, tbl)
  249. RMLUILUA_INPUTENUM(OEM_FJ_LOYA, tbl)
  250. RMLUILUA_INPUTENUM(OEM_FJ_ROYA, tbl)
  251. RMLUILUA_INPUTENUM(LSHIFT, tbl)
  252. RMLUILUA_INPUTENUM(RSHIFT, tbl)
  253. RMLUILUA_INPUTENUM(LCONTROL, tbl)
  254. RMLUILUA_INPUTENUM(RCONTROL, tbl)
  255. RMLUILUA_INPUTENUM(LMENU, tbl)
  256. RMLUILUA_INPUTENUM(RMENU, tbl)
  257. RMLUILUA_INPUTENUM(BROWSER_BACK, tbl)
  258. RMLUILUA_INPUTENUM(BROWSER_FORWARD, tbl)
  259. RMLUILUA_INPUTENUM(BROWSER_REFRESH, tbl)
  260. RMLUILUA_INPUTENUM(BROWSER_STOP, tbl)
  261. RMLUILUA_INPUTENUM(BROWSER_SEARCH, tbl)
  262. RMLUILUA_INPUTENUM(BROWSER_FAVORITES, tbl)
  263. RMLUILUA_INPUTENUM(BROWSER_HOME, tbl)
  264. RMLUILUA_INPUTENUM(VOLUME_MUTE, tbl)
  265. RMLUILUA_INPUTENUM(VOLUME_DOWN, tbl)
  266. RMLUILUA_INPUTENUM(VOLUME_UP, tbl)
  267. RMLUILUA_INPUTENUM(MEDIA_NEXT_TRACK, tbl)
  268. RMLUILUA_INPUTENUM(MEDIA_PREV_TRACK, tbl)
  269. RMLUILUA_INPUTENUM(MEDIA_STOP, tbl)
  270. RMLUILUA_INPUTENUM(MEDIA_PLAY_PAUSE, tbl)
  271. RMLUILUA_INPUTENUM(LAUNCH_MAIL, tbl)
  272. RMLUILUA_INPUTENUM(LAUNCH_MEDIA_SELECT, tbl)
  273. RMLUILUA_INPUTENUM(LAUNCH_APP1, tbl)
  274. RMLUILUA_INPUTENUM(LAUNCH_APP2, tbl)
  275. RMLUILUA_INPUTENUM(OEM_AX, tbl)
  276. RMLUILUA_INPUTENUM(ICO_HELP, tbl)
  277. RMLUILUA_INPUTENUM(ICO_00, tbl)
  278. RMLUILUA_INPUTENUM(PROCESSKEY, tbl)
  279. RMLUILUA_INPUTENUM(ICO_CLEAR, tbl)
  280. RMLUILUA_INPUTENUM(ATTN, tbl)
  281. RMLUILUA_INPUTENUM(CRSEL, tbl)
  282. RMLUILUA_INPUTENUM(EXSEL, tbl)
  283. RMLUILUA_INPUTENUM(EREOF, tbl)
  284. RMLUILUA_INPUTENUM(PLAY, tbl)
  285. RMLUILUA_INPUTENUM(ZOOM, tbl)
  286. RMLUILUA_INPUTENUM(PA1, tbl)
  287. RMLUILUA_INPUTENUM(OEM_CLEAR, tbl)
  288. }
  289. void LuaRmlUiEnumkey_modifier(lua_State* L)
  290. {
  291. lua_newtable(L);
  292. int tbl = lua_gettop(L);
  293. RMLUILUA_INPUTMODIFIERENUM(CTRL, tbl)
  294. RMLUILUA_INPUTMODIFIERENUM(SHIFT, tbl)
  295. RMLUILUA_INPUTMODIFIERENUM(ALT, tbl)
  296. RMLUILUA_INPUTMODIFIERENUM(META, tbl)
  297. RMLUILUA_INPUTMODIFIERENUM(CAPSLOCK, tbl)
  298. RMLUILUA_INPUTMODIFIERENUM(NUMLOCK, tbl)
  299. RMLUILUA_INPUTMODIFIERENUM(SCROLLLOCK, tbl)
  300. }
  301. RegType<LuaRmlUi> LuaRmlUiMethods[] = {
  302. RMLUI_LUAMETHOD(LuaRmlUi, CreateContext),
  303. RMLUI_LUAMETHOD(LuaRmlUi, LoadFontFace),
  304. RMLUI_LUAMETHOD(LuaRmlUi, RegisterTag),
  305. {nullptr, nullptr},
  306. };
  307. luaL_Reg LuaRmlUiGetters[] = {
  308. RMLUI_LUAGETTER(LuaRmlUi, contexts),
  309. RMLUI_LUAGETTER(LuaRmlUi, key_identifier),
  310. RMLUI_LUAGETTER(LuaRmlUi, key_modifier),
  311. {nullptr, nullptr},
  312. };
  313. luaL_Reg LuaRmlUiSetters[] = {
  314. {nullptr, nullptr},
  315. };
  316. RMLUI_LUATYPE_DEFINE(LuaRmlUi)
  317. } // namespace Lua
  318. } // namespace Rml