summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2018-09-17 19:28:10 +0200
committerWilliam Wilgus <me.theuser@yahoo.com>2018-10-08 23:15:16 +0200
commite4b843335bc34810c11ed405d473e6f7c94a153f (patch)
tree5ebfe0f33aaf026d55a7962ae4f710cd5d846628
parentebaddc671e69f12c1933d107b5400002c2364479 (diff)
downloadrockbox-e4b843335bc34810c11ed405d473e6f7c94a153f.tar.gz
rockbox-e4b843335bc34810c11ed405d473e6f7c94a153f.zip
lua rocklib cleanup
removes tslf allocations from do_menu and gui_syncyesno_run in favor of lua_newuserdata removes some luaL_opt functions in favor of equivalent lua_to functions moves some definitions to the rocklib.h file Change-Id: Iaacc3249b8f1af2c220ce59dead0050c66cb3b04
-rw-r--r--apps/plugins/lua/rocklib.c152
-rw-r--r--apps/plugins/lua/rocklib.h16
2 files changed, 84 insertions, 84 deletions
diff --git a/apps/plugins/lua/rocklib.c b/apps/plugins/lua/rocklib.c
index ad8577cb43..57165a5d15 100644
--- a/apps/plugins/lua/rocklib.c
+++ b/apps/plugins/lua/rocklib.c
@@ -54,7 +54,7 @@
54 * ----------------------------- 54 * -----------------------------
55 */ 55 */
56 56
57#define RB_WRAP(M) static int rock_##M(lua_State UNUSED_ATTR *L) 57#define RB_WRAP(func) static int rock_##func(lua_State UNUSED_ATTR *L)
58#define SIMPLE_VOID_WRAPPER(func) RB_WRAP(func) { (void)L; func(); return 0; } 58#define SIMPLE_VOID_WRAPPER(func) RB_WRAP(func) { (void)L; func(); return 0; }
59 59
60/* Helper function for opt_viewport */ 60/* Helper function for opt_viewport */
@@ -66,7 +66,7 @@ static void check_tablevalue(lua_State *L,
66{ 66{
67 lua_getfield(L, tablepos, key); /* Find table[key] */ 67 lua_getfield(L, tablepos, key); /* Find table[key] */
68 68
69 int val = luaL_optint(L, -1, 0); 69 int val = lua_tointeger(L, -1);
70 70
71 if(is_unsigned) 71 if(is_unsigned)
72 *(unsigned*)res = (unsigned) val; 72 *(unsigned*)res = (unsigned) val;
@@ -123,25 +123,12 @@ RB_WRAP(current_tick)
123 return 1; 123 return 1;
124} 124}
125 125
126#ifdef HAVE_TOUCHSCREEN
127RB_WRAP(action_get_touchscreen_press)
128{
129 short x, y;
130 int result = rb->action_get_touchscreen_press(&x, &y);
131
132 lua_pushinteger(L, result);
133 lua_pushinteger(L, x);
134 lua_pushinteger(L, y);
135 return 3;
136}
137#endif
138
139RB_WRAP(kbd_input) 126RB_WRAP(kbd_input)
140{ 127{
141 luaL_Buffer b; 128 luaL_Buffer b;
142 luaL_buffinit(L, &b); 129 luaL_buffinit(L, &b);
143 130
144 const char *input = luaL_optstring(L, 1, NULL); 131 const char *input = lua_tostring(L, 1);
145 char *buffer = luaL_prepbuffer(&b); 132 char *buffer = luaL_prepbuffer(&b);
146 133
147 if(input != NULL) 134 if(input != NULL)
@@ -161,12 +148,24 @@ RB_WRAP(kbd_input)
161} 148}
162 149
163#ifdef HAVE_TOUCHSCREEN 150#ifdef HAVE_TOUCHSCREEN
151RB_WRAP(action_get_touchscreen_press)
152{
153 short x, y;
154 int result = rb->action_get_touchscreen_press(&x, &y);
155
156 lua_pushinteger(L, result);
157 lua_pushinteger(L, x);
158 lua_pushinteger(L, y);
159 return 3;
160}
161
164RB_WRAP(touchscreen_set_mode) 162RB_WRAP(touchscreen_set_mode)
165{ 163{
166 enum touchscreen_mode mode = luaL_checkint(L, 1); 164 enum touchscreen_mode mode = luaL_checkint(L, 1);
167 rb->touchscreen_set_mode(mode); 165 rb->touchscreen_set_mode(mode);
168 return 0; 166 return 0;
169} 167}
168
170RB_WRAP(touchscreen_get_mode) 169RB_WRAP(touchscreen_get_mode)
171{ 170{
172 lua_pushinteger(L, rb->touchscreen_get_mode()); 171 lua_pushinteger(L, rb->touchscreen_get_mode());
@@ -210,9 +209,9 @@ static void fill_text_message(lua_State *L, struct text_message * message,
210 int i; 209 int i;
211 luaL_checktype(L, pos, LUA_TTABLE); 210 luaL_checktype(L, pos, LUA_TTABLE);
212 int n = luaL_getn(L, pos); 211 int n = luaL_getn(L, pos);
213 const char **lines = (const char**) tlsf_malloc(n * sizeof(const char*)); 212
214 if(lines == NULL) 213 const char **lines = (const char**) lua_newuserdata(L, n * sizeof(const char*));
215 luaL_error(L, ERR_NO_ALLOC_DBYTES, n * sizeof(const char*)); 214
216 for(i=1; i<=n; i++) 215 for(i=1; i<=n; i++)
217 { 216 {
218 lua_rawgeti(L, pos, i); 217 lua_rawgeti(L, pos, i);
@@ -228,6 +227,7 @@ RB_WRAP(gui_syncyesno_run)
228 struct text_message main_message, yes_message, no_message; 227 struct text_message main_message, yes_message, no_message;
229 struct text_message *yes = NULL, *no = NULL; 228 struct text_message *yes = NULL, *no = NULL;
230 229
230 lua_settop(L, 3); /* newuserdata will be pushed onto stack after args*/
231 fill_text_message(L, &main_message, 1); 231 fill_text_message(L, &main_message, 1);
232 if(!lua_isnoneornil(L, 2)) 232 if(!lua_isnoneornil(L, 2))
233 fill_text_message(L, (yes = &yes_message), 2); 233 fill_text_message(L, (yes = &yes_message), 2);
@@ -236,12 +236,6 @@ RB_WRAP(gui_syncyesno_run)
236 236
237 enum yesno_res result = rb->gui_syncyesno_run(&main_message, yes, no); 237 enum yesno_res result = rb->gui_syncyesno_run(&main_message, yes, no);
238 238
239 tlsf_free(main_message.message_lines);
240 if(yes)
241 tlsf_free(yes_message.message_lines);
242 if(no)
243 tlsf_free(no_message.message_lines);
244
245 lua_pushinteger(L, result); 239 lua_pushinteger(L, result);
246 return 1; 240 return 1;
247} 241}
@@ -256,12 +250,13 @@ RB_WRAP(do_menu)
256 250
257 title = luaL_checkstring(L, 1); 251 title = luaL_checkstring(L, 1);
258 luaL_checktype(L, 2, LUA_TTABLE); 252 luaL_checktype(L, 2, LUA_TTABLE);
259 start_selected = luaL_optint(L, 3, 0); 253 start_selected = lua_tointeger(L, 3);
260 254
261 n = luaL_getn(L, 2); 255 n = luaL_getn(L, 2);
262 items = (const char**) tlsf_malloc(n * sizeof(const char*)); 256
263 if(items == NULL) 257 /* newuserdata will be pushed onto stack after args*/
264 luaL_error(L, ERR_NO_ALLOC_DBYTES, n * sizeof(const char*)); 258 items = (const char**) lua_newuserdata(L, n * sizeof(const char*));
259
265 for(i=1; i<=n; i++) 260 for(i=1; i<=n; i++)
266 { 261 {
267 lua_rawgeti(L, 2, i); /* Push item on the stack */ 262 lua_rawgeti(L, 2, i); /* Push item on the stack */
@@ -275,8 +270,6 @@ RB_WRAP(do_menu)
275 270
276 int result = rb->do_menu(&menu, &start_selected, NULL, false); 271 int result = rb->do_menu(&menu, &start_selected, NULL, false);
277 272
278 tlsf_free(items);
279
280 lua_pushinteger(L, result); 273 lua_pushinteger(L, result);
281 return 1; 274 return 1;
282} 275}
@@ -336,14 +329,17 @@ RB_WRAP(playlist_insert_directory)
336 329
337SIMPLE_VOID_WRAPPER(backlight_force_on); 330SIMPLE_VOID_WRAPPER(backlight_force_on);
338SIMPLE_VOID_WRAPPER(backlight_use_settings); 331SIMPLE_VOID_WRAPPER(backlight_use_settings);
332
339#ifdef HAVE_REMOTE_LCD 333#ifdef HAVE_REMOTE_LCD
340SIMPLE_VOID_WRAPPER(remote_backlight_force_on); 334SIMPLE_VOID_WRAPPER(remote_backlight_force_on);
341SIMPLE_VOID_WRAPPER(remote_backlight_use_settings); 335SIMPLE_VOID_WRAPPER(remote_backlight_use_settings);
342#endif 336#endif
337
343#ifdef HAVE_BUTTON_LIGHT 338#ifdef HAVE_BUTTON_LIGHT
344SIMPLE_VOID_WRAPPER(buttonlight_force_on); 339SIMPLE_VOID_WRAPPER(buttonlight_force_on);
345SIMPLE_VOID_WRAPPER(buttonlight_use_settings); 340SIMPLE_VOID_WRAPPER(buttonlight_use_settings);
346#endif 341#endif
342
347#ifdef HAVE_BACKLIGHT_BRIGHTNESS 343#ifdef HAVE_BACKLIGHT_BRIGHTNESS
348RB_WRAP(backlight_brightness_set) 344RB_WRAP(backlight_brightness_set)
349{ 345{
@@ -360,6 +356,7 @@ RB_WRAP(get_plugin_action)
360 static const struct button_mapping *m1[] = { pla_main_ctx }; 356 static const struct button_mapping *m1[] = { pla_main_ctx };
361 int timeout = luaL_checkint(L, 1); 357 int timeout = luaL_checkint(L, 1);
362 int btn; 358 int btn;
359
363#ifdef HAVE_REMOTE_LCD 360#ifdef HAVE_REMOTE_LCD
364 static const struct button_mapping *m2[] = { pla_main_ctx, pla_remote_ctx }; 361 static const struct button_mapping *m2[] = { pla_main_ctx, pla_remote_ctx };
365 bool with_remote = luaL_optint(L, 2, 0); 362 bool with_remote = luaL_optint(L, 2, 0);
@@ -373,67 +370,60 @@ RB_WRAP(get_plugin_action)
373 return 1; 370 return 1;
374} 371}
375 372
376#define R(NAME) {#NAME, rock_##NAME} 373#define RB_FUNC(func) {#func, rock_##func}
377static const luaL_Reg rocklib[] = 374static const luaL_Reg rocklib[] =
378{ 375{
379 /* Kernel */ 376 /* Kernel */
380 R(current_tick), 377 RB_FUNC(current_tick),
381 378
382 /* Buttons */ 379 /* Buttons */
383#ifdef HAVE_TOUCHSCREEN 380#ifdef HAVE_TOUCHSCREEN
384 R(action_get_touchscreen_press), 381 RB_FUNC(action_get_touchscreen_press),
385 R(touchscreen_set_mode), 382 RB_FUNC(touchscreen_set_mode),
386 R(touchscreen_get_mode), 383 RB_FUNC(touchscreen_get_mode),
387#endif 384#endif
388 R(kbd_input), 385
389 386 RB_FUNC(kbd_input),
390 R(font_getstringsize), 387
391 R(set_viewport), 388 RB_FUNC(font_getstringsize),
392 R(clear_viewport), 389 RB_FUNC(set_viewport),
393 R(current_path), 390 RB_FUNC(clear_viewport),
394 R(gui_syncyesno_run), 391 RB_FUNC(current_path),
395 R(playlist_sync), 392 RB_FUNC(gui_syncyesno_run),
396 R(playlist_remove_all_tracks), 393 RB_FUNC(playlist_sync),
397 R(playlist_insert_track), 394 RB_FUNC(playlist_remove_all_tracks),
398 R(playlist_insert_directory), 395 RB_FUNC(playlist_insert_track),
399 R(do_menu), 396 RB_FUNC(playlist_insert_directory),
397 RB_FUNC(do_menu),
400 398
401 /* Backlight helper */ 399 /* Backlight helper */
402 R(backlight_force_on), 400 RB_FUNC(backlight_force_on),
403 R(backlight_use_settings), 401 RB_FUNC(backlight_use_settings),
402
404#ifdef HAVE_REMOTE_LCD 403#ifdef HAVE_REMOTE_LCD
405 R(remote_backlight_force_on), 404 RB_FUNC(remote_backlight_force_on),
406 R(remote_backlight_use_settings), 405 RB_FUNC(remote_backlight_use_settings),
407#endif 406#endif
407
408#ifdef HAVE_BUTTON_LIGHT 408#ifdef HAVE_BUTTON_LIGHT
409 R(buttonlight_force_on), 409 RB_FUNC(buttonlight_force_on),
410 R(buttonlight_use_settings), 410 RB_FUNC(buttonlight_use_settings),
411#endif 411#endif
412
412#ifdef HAVE_BACKLIGHT_BRIGHTNESS 413#ifdef HAVE_BACKLIGHT_BRIGHTNESS
413 R(backlight_brightness_set), 414 RB_FUNC(backlight_brightness_set),
414 R(backlight_brightness_use_setting), 415 RB_FUNC(backlight_brightness_use_setting),
415#endif 416#endif
416 R(get_plugin_action), 417
418 RB_FUNC(get_plugin_action),
417 419
418 {NULL, NULL} 420 {NULL, NULL}
419}; 421};
420#undef R 422#undef RB_FUNC
423
421extern const luaL_Reg rocklib_aux[]; 424extern const luaL_Reg rocklib_aux[];
422extern const luaL_Reg rocklib_img[]; 425extern const luaL_Reg rocklib_img[];
423 426
424#define RB_CONSTANT(x) {#x, x}
425#define RB_STRING_CONSTANT(x) {#x, x}
426
427struct lua_int_reg {
428 char const* name;
429 int value;
430};
431
432struct lua_str_reg {
433 char const* name;
434 char const* value;
435};
436
437/* 427/*
438 ** Open Rockbox library 428 ** Open Rockbox library
439 */ 429 */
@@ -448,30 +438,32 @@ LUALIB_API int luaopen_rock(lua_State *L)
448 /* useful integer constants */ 438 /* useful integer constants */
449 RB_CONSTANT(HZ), 439 RB_CONSTANT(HZ),
450 440
451 RB_CONSTANT(LCD_WIDTH),
452 RB_CONSTANT(LCD_HEIGHT),
453 RB_CONSTANT(LCD_DEPTH), 441 RB_CONSTANT(LCD_DEPTH),
442 RB_CONSTANT(LCD_HEIGHT),
443 RB_CONSTANT(LCD_WIDTH),
454 444
455 RB_CONSTANT(FONT_SYSFIXED), 445 RB_CONSTANT(FONT_SYSFIXED),
456 RB_CONSTANT(FONT_UI), 446 RB_CONSTANT(FONT_UI),
457 447
458 RB_CONSTANT(PLAYLIST_PREPEND),
459 RB_CONSTANT(PLAYLIST_INSERT), 448 RB_CONSTANT(PLAYLIST_INSERT),
460 RB_CONSTANT(PLAYLIST_INSERT_LAST), 449 RB_CONSTANT(PLAYLIST_INSERT_LAST),
461 RB_CONSTANT(PLAYLIST_INSERT_FIRST), 450 RB_CONSTANT(PLAYLIST_INSERT_FIRST),
451 RB_CONSTANT(PLAYLIST_INSERT_LAST_SHUFFLED),
462 RB_CONSTANT(PLAYLIST_INSERT_SHUFFLED), 452 RB_CONSTANT(PLAYLIST_INSERT_SHUFFLED),
453 RB_CONSTANT(PLAYLIST_PREPEND),
463 RB_CONSTANT(PLAYLIST_REPLACE), 454 RB_CONSTANT(PLAYLIST_REPLACE),
464 RB_CONSTANT(PLAYLIST_INSERT_LAST_SHUFFLED),
465 455
466#ifdef HAVE_TOUCHSCREEN
467 RB_CONSTANT(TOUCHSCREEN_POINT),
468 RB_CONSTANT(TOUCHSCREEN_BUTTON),
469#endif
470 456
471 RB_CONSTANT(SCREEN_MAIN), 457 RB_CONSTANT(SCREEN_MAIN),
472#ifdef HAVE_REMOTE_LCD 458#ifdef HAVE_REMOTE_LCD
473 RB_CONSTANT(SCREEN_REMOTE), 459 RB_CONSTANT(SCREEN_REMOTE),
474#endif 460#endif
461
462#ifdef HAVE_TOUCHSCREEN
463 RB_CONSTANT(TOUCHSCREEN_POINT),
464 RB_CONSTANT(TOUCHSCREEN_BUTTON),
465#endif
466
475 {NULL, 0} 467 {NULL, 0}
476 }; 468 };
477 469
@@ -484,12 +476,12 @@ LUALIB_API int luaopen_rock(lua_State *L)
484 static const struct lua_str_reg rlib_const_str[] = 476 static const struct lua_str_reg rlib_const_str[] =
485 { 477 {
486 /* some useful paths constants */ 478 /* some useful paths constants */
487 RB_STRING_CONSTANT(ROCKBOX_DIR),
488 RB_STRING_CONSTANT(HOME_DIR), 479 RB_STRING_CONSTANT(HOME_DIR),
489 RB_STRING_CONSTANT(PLUGIN_DIR), 480 RB_STRING_CONSTANT(PLUGIN_DIR),
490 RB_STRING_CONSTANT(PLUGIN_APPS_DATA_DIR), 481 RB_STRING_CONSTANT(PLUGIN_APPS_DATA_DIR),
491 RB_STRING_CONSTANT(PLUGIN_GAMES_DATA_DIR), 482 RB_STRING_CONSTANT(PLUGIN_GAMES_DATA_DIR),
492 RB_STRING_CONSTANT(PLUGIN_DATA_DIR), 483 RB_STRING_CONSTANT(PLUGIN_DATA_DIR),
484 RB_STRING_CONSTANT(ROCKBOX_DIR),
493 RB_STRING_CONSTANT(VIEWERS_DATA_DIR), 485 RB_STRING_CONSTANT(VIEWERS_DATA_DIR),
494 {NULL,NULL} 486 {NULL,NULL}
495 }; 487 };
diff --git a/apps/plugins/lua/rocklib.h b/apps/plugins/lua/rocklib.h
index 83d82e56ef..25b5ae1088 100644
--- a/apps/plugins/lua/rocklib.h
+++ b/apps/plugins/lua/rocklib.h
@@ -32,10 +32,18 @@
32#define ERR_DATA_OVF "data overflow" 32#define ERR_DATA_OVF "data overflow"
33#endif 33#endif
34 34
35#ifndef ERR_NO_ALLOC_DBYTES 35#define RB_CONSTANT(x) {#x, x}
36#define ERR_NO_ALLOC_DBYTES "Can't allocate %d bytes!" 36#define RB_STRING_CONSTANT(x) RB_CONSTANT(x)
37#endif 37
38 38struct lua_int_reg {
39 char const* name;
40 const int value;
41};
42
43struct lua_str_reg {
44 char const* name;
45 char const* value;
46};
39 47
40LUALIB_API int (luaopen_rock) (lua_State *L); 48LUALIB_API int (luaopen_rock) (lua_State *L);
41const char* get_current_path(lua_State *L, int level); 49const char* get_current_path(lua_State *L, int level);