void shoes_canvas_paint(VALUE self) { rb_rescue2(CASTHOOK(shoes_canvas_paint_call), self, CASTHOOK(shoes_canvas_error), self, rb_cObject, 0); return; }
VALUE shoes_safe_block(VALUE self, VALUE block, VALUE args) { safe_block sb; VALUE v; sb.canvas = shoes_find_canvas(self); sb.block = block; sb.args = args; rb_gc_register_address(&args); v = rb_rescue2(CASTHOOK(shoes_safe_block_call), (VALUE)&sb, CASTHOOK(shoes_safe_block_exception), (VALUE)&sb, rb_cObject, 0); rb_gc_unregister_address(&args); return v; }
shoes_code shoes_start(char *path, char *uri) { shoes_code code = SHOES_OK; char bootup[SHOES_BUFSIZE]; int len = shoes_snprintf(bootup, SHOES_BUFSIZE, "begin;" "DIR = File.expand_path(File.dirname(%%q<%s>));" "$:.replace([DIR+'/ruby/lib/'+PLATFORM, DIR+'/ruby/lib', DIR+'/lib']);" "require 'shoes';" "DIR;" "rescue Object => e;" "puts(e.message);" "end", path); if (len < 0 || len >= SHOES_BUFSIZE) { QUIT("Path to script is too long."); } VALUE str = rb_eval_string(bootup); if (NIL_P(str)) return SHOES_QUIT; StringValue(str); strcpy(shoes_world->path, RSTRING(str)->ptr); char *load_uri_str = NULL; VALUE load_uri = rb_rescue2(CASTHOOK(shoes_start_begin), Qnil, CASTHOOK(shoes_start_exception), Qnil, rb_cObject, 0); if (!RTEST(load_uri)) return SHOES_QUIT; if (rb_obj_is_kind_of(load_uri, rb_eException)) { QUIT_ALERT(load_uri); } if (rb_obj_is_kind_of(load_uri, rb_cString)) load_uri_str = RSTRING_PTR(load_uri); code = shoes_load(load_uri_str); if (code != SHOES_OK) goto quit; code = shoes_app_start(shoes_world->apps, uri); quit: return code; }
lumi_code lumi_start(char *path, char *uri) { lumi_code code = LUMI_OK; char bootup[LUMI_BUFSIZE]; int len = lumi_snprintf(bootup, LUMI_BUFSIZE, "begin;" "DIR = File.expand_path(File.dirname(%%q<%s>));" "$:.replace([DIR+'/ruby/lib/'+(ENV['LUMI_RUBY_ARCH'] || RUBY_PLATFORM), DIR+'/ruby/lib', DIR+'/lib', '.']);" "require 'lumi';" "DIR;" "rescue Object => e;" "puts(e.message);" "end", path); if (len < 0 || len >= LUMI_BUFSIZE) { QUIT("Path to script is too long."); } VALUE str = rb_eval_string(bootup); if (NIL_P(str)) return LUMI_QUIT; StringValue(str); strcpy(lumi_world->path, RSTRING_PTR(str)); char *load_uri_str = NULL; VALUE load_uri = rb_rescue2(CASTHOOK(lumi_start_begin), Qnil, CASTHOOK(lumi_start_exception), Qnil, rb_cObject, 0); if (!RTEST(load_uri)) return LUMI_QUIT; if (rb_obj_is_kind_of(load_uri, rb_eException)) { QUIT_ALERT(load_uri); } if (rb_obj_is_kind_of(load_uri, rb_cString)) load_uri_str = RSTRING_PTR(load_uri); code = lumi_load(load_uri_str); if (code != LUMI_OK) goto quit; code = lumi_app_start(lumi_world->apps, uri); quit: return code; }
shoes_code shoes_load(char *path) { shoes_code code = SHOES_QUIT; char bootup[SHOES_BUFSIZE]; if (path) { sprintf(bootup, "Shoes.load(%%q<%s>);", path); VALUE v = rb_rescue2(CASTHOOK(shoes_load_begin), (VALUE)bootup, CASTHOOK(shoes_load_exception), Qnil, rb_cObject, 0); if (rb_obj_is_kind_of(v, rb_eException)) { QUIT_ALERT(v); } } return SHOES_OK; }
lumi_code lumi_load(char *path) { char bootup[LUMI_BUFSIZE]; if (path) { sprintf(bootup, "Lumi.visit(%%q<%s>);", path); VALUE v = rb_rescue2(CASTHOOK(lumi_load_begin), (VALUE)bootup, CASTHOOK(lumi_load_exception), Qnil, rb_cObject, 0); if (rb_obj_is_kind_of(v, rb_eException)) { lumi_canvas_error(Qnil, v); rb_eval_string("Lumi.show_log"); } } return LUMI_OK; }
void shoes_menu_init() { cShoesMenu = rb_define_class_under(cTypes, "Menu", cNative); rb_define_method(cShoesMenu, "items", CASTHOOK(shoes_menu_list), 0); rb_define_method(cShoesMenu, "[]", CASTHOOK(shoes_menu_at), 1); rb_define_method(cShoesMenu, "title", CASTHOOK(shoes_menu_title), 0); rb_define_method(cShoesMenu, "<<", CASTHOOK(shoes_menu_append), 1); rb_define_method(cShoesMenu, "append", CASTHOOK(shoes_menu_append), 1); rb_define_method(cShoesMenu, "insert", CASTHOOK(shoes_menu_insert), 2); rb_define_method(cShoesMenu, "index", CASTHOOK(shoes_menu_index), 1); rb_define_method(cShoesMenu, "remove", CASTHOOK(shoes_menu_remove), 1); RUBY_M("+menu", menu, -1); }
VALUE ts_funcall2(VALUE obj, ID meth, int argc, VALUE *argv) { VALUE tmp[4]; if (!rb_block_given_p()) return rb_funcall2(obj, meth, argc, argv); tmp[0] = obj; tmp[1] = (VALUE)meth; tmp[2] = (VALUE)argc; tmp[3] = (VALUE)argv; return rb_iterate((VALUE(*)(VALUE))ts_each, (VALUE)tmp, CASTHOOK(rb_yield), 0); }
shoes_code shoes_app_visit(shoes_app *app, char *path) { shoes_exec exec; shoes_canvas *canvas; VALUE meth; Data_Get_Struct(app->canvas, shoes_canvas, canvas); canvas->slot->scrolly = 0; shoes_native_slot_clear(canvas); shoes_app_clear(app); shoes_app_reset_styles(app); meth = rb_funcall(cShoes, s_run, 1, app->location = rb_str_new2(path)); VALUE app_block = rb_iv_get(app->self, "@main_app"); if (!NIL_P(app_block)) rb_ary_store(meth, 0, app_block); exec.app = app; exec.block = rb_ary_entry(meth, 0); exec.args = rb_ary_entry(meth, 1); if (rb_obj_is_kind_of(exec.block, rb_cUnboundMethod)) { VALUE klass = rb_unbound_get_class(exec.block); exec.canvas = app->nestslot = shoes_slot_new(klass, ssNestSlot, app->canvas); exec.block = rb_funcall(exec.block, s_bind, 1, exec.canvas); exec.ieval = 0; rb_ary_push(canvas->contents, exec.canvas); } else { exec.canvas = app->nestslot = app->canvas; exec.ieval = 1; } rb_rescue2(CASTHOOK(shoes_app_run), (VALUE)&exec, CASTHOOK(shoes_app_exception), (VALUE)&exec, rb_cObject, 0); rb_ary_clear(exec.app->nesting); return SHOES_OK; }
void shoes_shoesevent_init() { cShoesEvent = rb_define_class_under(cTypes, "ShoesEvent", cNative); rb_define_alloc_func(cShoesEvent, shoes_event_alloc); rb_define_method(cShoesEvent, "type", CASTHOOK(shoes_event_type), 0); rb_define_method(cShoesEvent, "object", CASTHOOK(shoes_event_object), 0); rb_define_method(cShoesEvent, "accept", CASTHOOK(shoes_event_get_accept),0); rb_define_method(cShoesEvent, "accept=", CASTHOOK(shoes_event_set_accept),1); rb_define_method(cShoesEvent, "button", CASTHOOK(shoes_event_button), 0); rb_define_method(cShoesEvent, "x", CASTHOOK(shoes_event_x), 0); rb_define_method(cShoesEvent, "y", CASTHOOK(shoes_event_y), 0); rb_define_method(cShoesEvent, "width", CASTHOOK(shoes_event_width), 0); rb_define_method(cShoesEvent, "height", CASTHOOK(shoes_event_height), 0); rb_define_method(cShoesEvent, "key", CASTHOOK(shoes_event_key), 0); rb_define_method(cShoesEvent, "key=", CASTHOOK(shoes_event_set_key), 1); rb_define_method(cShoesEvent, "modifiers", CASTHOOK(shoes_event_modifiers), 0); RUBY_M("+shoesevent", shoesevent, -1); }
VALUE shoes_exit_setup(VALUE self) { rb_define_method(rb_mKernel, "quit", CASTHOOK(shoes_app_quit), 0); rb_define_method(rb_mKernel, "exit", CASTHOOK(shoes_app_quit), 0); return Qtrue; }
// // Everything exposed to Ruby is exposed here. // void shoes_ruby_init() { progname = rb_str_new2("(eval)"); rb_define_variable("$0", &progname); rb_define_variable("$PROGRAM_NAME", &progname); instance_eval_proc = rb_eval_string("lambda{|o,b| o.instance_eval(&b)}"); rb_gc_register_address(&instance_eval_proc); ssNestSlot = rb_eval_string("{:height => 1.0}"); rb_gc_register_address(&ssNestSlot); s_aref = rb_intern("[]="); s_perc = rb_intern("%"); s_mult = rb_intern("*"); SYMBOL_DEFS(SYMBOL_INTERN); symAltQuest = ID2SYM(rb_intern("alt_?")); symAltSlash = ID2SYM(rb_intern("alt_/")); symAltEqual = ID2SYM(rb_intern("alt_=")); symAltDot = ID2SYM(rb_intern("alt_.")); symAltSemiColon = ID2SYM(rb_intern("alt_;")); // // I want all elements to be addressed Shoes::Name, but also available in // a separate mixin (cTypes), for inclusion in every Shoes.app block. // cTypes = rb_define_module("Shoes"); rb_mod_remove_const(rb_cObject, rb_str_new2("Shoes")); cShoesWindow = rb_define_class_under(cTypes, "Window", rb_cObject); cMouse = rb_define_class_under(cTypes, "Mouse", rb_cObject); cCanvas = rb_define_class_under(cTypes, "Canvas", rb_cObject); rb_define_alloc_func(cCanvas, shoes_canvas_alloc); rb_define_method(cCanvas, "top", CASTHOOK(shoes_canvas_get_top), 0); rb_define_method(cCanvas, "left", CASTHOOK(shoes_canvas_get_left), 0); rb_define_method(cCanvas, "width", CASTHOOK(shoes_canvas_get_width), 0); rb_define_method(cCanvas, "height", CASTHOOK(shoes_canvas_get_height), 0); rb_define_method(cCanvas, "scroll_height", CASTHOOK(shoes_canvas_get_scroll_height), 0); rb_define_method(cCanvas, "scroll_max", CASTHOOK(shoes_canvas_get_scroll_max), 0); rb_define_method(cCanvas, "scroll_top", CASTHOOK(shoes_canvas_get_scroll_top), 0); rb_define_method(cCanvas, "scroll_top=", CASTHOOK(shoes_canvas_set_scroll_top), 1); rb_define_method(cCanvas, "displace", CASTHOOK(shoes_canvas_displace), 2); rb_define_method(cCanvas, "move", CASTHOOK(shoes_canvas_move), 2); rb_define_method(cCanvas, "style", CASTHOOK(shoes_canvas_style), -1); rb_define_method(cCanvas, "parent", CASTHOOK(shoes_canvas_get_parent), 0); rb_define_method(cCanvas, "contents", CASTHOOK(shoes_canvas_contents), 0); rb_define_method(cCanvas, "children", CASTHOOK(shoes_canvas_children), 0); rb_define_method(cCanvas, "draw", CASTHOOK(shoes_canvas_draw), 2); rb_define_method(cCanvas, "hide", CASTHOOK(shoes_canvas_hide), 0); rb_define_method(cCanvas, "show", CASTHOOK(shoes_canvas_show), 0); rb_define_method(cCanvas, "toggle", CASTHOOK(shoes_canvas_toggle), 0); rb_define_method(cCanvas, "remove", CASTHOOK(shoes_canvas_remove), 0); rb_define_method(cCanvas, "refresh_slot", CASTHOOK(shoes_canvas_refresh_slot), 0); rb_define_method(cCanvas, "refresh", CASTHOOK(shoes_canvas_refresh_slot), 0); rb_define_method(cCanvas, "cursor", CASTHOOK(shoes_canvas_get_cursor), 0); rb_define_method(cCanvas, "cursor=", CASTHOOK(shoes_canvas_set_cursor), 1); cShoes = rb_define_class("Shoes", cCanvas); rb_include_module(cShoes, cTypes); rb_const_set(cShoes, rb_intern("Types"), cTypes); shoes_version_init(); // other Shoes:: constants rb_const_set(cTypes, rb_intern("RAD2PI"), rb_float_new(SHOES_RAD2PI)); rb_const_set(cTypes, rb_intern("TWO_PI"), rb_float_new(SHOES_PIM2)); rb_const_set(cTypes, rb_intern("HALF_PI"), rb_float_new(SHOES_HALFPI)); rb_const_set(cTypes, rb_intern("PI"), rb_float_new(SHOES_PI)); cApp = rb_define_class_under(cTypes, "App", rb_cObject); rb_define_alloc_func(cApp, shoes_app_alloc); rb_define_method(cApp, "fullscreen", CASTHOOK(shoes_app_get_fullscreen), 0); rb_define_method(cApp, "fullscreen=", CASTHOOK(shoes_app_set_fullscreen), 1); rb_define_method(cApp, "name", CASTHOOK(shoes_app_get_title), 0); rb_define_method(cApp, "name=", CASTHOOK(shoes_app_set_title), 1); rb_define_method(cApp, "location", CASTHOOK(shoes_app_location), 0); rb_define_method(cApp, "started?", CASTHOOK(shoes_app_is_started), 0); rb_define_method(cApp, "left", CASTHOOK(shoes_app_get_window_x_position), 0); rb_define_method(cApp, "top", CASTHOOK(shoes_app_get_window_y_position), 0); rb_define_method(cApp, "move", CASTHOOK(shoes_app_set_window_position), 2); rb_define_method(cApp, "width", CASTHOOK(shoes_app_get_width), 0); rb_define_method(cApp, "height", CASTHOOK(shoes_app_get_height), 0); rb_define_method(cApp, "resize", CASTHOOK(shoes_app_resize_window), 2); rb_define_method(cApp, "resizable", CASTHOOK(shoes_app_get_resizable), 0); rb_define_method(cApp, "resizable=", CASTHOOK(shoes_app_set_resizable), 1); rb_define_method(cApp, "slot", CASTHOOK(shoes_app_slot), 0); rb_define_method(cApp, "set_window_icon_path", CASTHOOK(shoes_app_set_icon), 1); // New in 3.2.19 rb_define_method(cApp, "set_window_title", CASTHOOK(shoes_app_set_wtitle), 1); // New in 3.2.19 rb_define_method(cApp, "opacity", CASTHOOK(shoes_app_get_opacity), 0); rb_define_method(cApp, "opacity=", CASTHOOK(shoes_app_set_opacity), 1); rb_define_method(cApp, "decorated", CASTHOOK(shoes_app_get_decoration), 0); rb_define_method(cApp, "decorated=", CASTHOOK(shoes_app_set_decoration), 1); rb_define_alias(cApp, "decorated?", "decorated"); rb_define_method(cApp, "cache", CASTHOOK(shoes_app_get_cache), 0); rb_define_method(cApp, "cache=", CASTHOOK(shoes_app_set_cache), 1); rb_define_method(cApp, "cache_clear", CASTHOOK(shoes_app_clear_cache), 1); rb_define_method(cApp, "event=", CASTHOOK(shoes_app_set_event_handler), 1); rb_define_method(cApp, "replay_event", CASTHOOK(shoes_app_replay_event), 1); rb_define_method(cApp, "monitor", CASTHOOK(shoes_app_monitor_get), 0); rb_define_method(cApp, "monitor=", CASTHOOK(shoes_app_monitor_set), 1); rb_define_method(cApp, "id", CASTHOOK(shoes_app_id), 0); /* Settings holds global values, not per app values. Part of shoes_world_t */ cSettings = rb_define_class_under(cTypes, "Settings", rb_cObject); rb_define_alloc_func(cSettings, shoes_settings_alloc); rb_define_method(cSettings, "dbus", CASTHOOK(shoes_settings_dbus),0); rb_define_method(cSettings, "app_name", CASTHOOK(shoes_settings_app_name),0); rb_define_method(cSettings, "app_name=", CASTHOOK(shoes_settings_set_app_name),1); rb_define_method(cSettings, "icon_path", CASTHOOK(shoes_settings_app_icon),0); rb_define_method(cSettings, "icon_path=", CASTHOOK(shoes_settings_set_app_icon),1); rb_define_method(cSettings, "theme", CASTHOOK(shoes_settings_get_theme),0); rb_define_method(cSettings, "theme=", CASTHOOK(shoes_settings_set_theme),1); rb_define_method(cSettings, "mdi", CASTHOOK(shoes_settings_mdi),0); rb_define_method(cSettings, "use_menus", CASTHOOK(shoes_settings_menu),0); rb_define_method(cSettings, "rdomain", CASTHOOK(shoes_settings_rdomain),0); rb_define_method(cSettings, "rdomain=", CASTHOOK(shoes_settings_set_rdomain),1); rb_define_method(cSettings, "monitor_count", CASTHOOK(shoes_settings_monitor_count),0); rb_define_method(cSettings, "monitor_geometry", CASTHOOK(shoes_settings_monitor_geometry),1); rb_define_method(cSettings, "monitor_default", CASTHOOK(shoes_settings_monitor_default), 0); rb_define_method(cSettings, "extra1", CASTHOOK(shoes_setting_extra1), 0); rb_define_method(cSettings, "extra2", CASTHOOK(shoes_setting_extra2), 0); rb_define_method(cSettings, "wintmo", CASTHOOK(shoes_setting_get_wintmo), 0); rb_define_method(cSettings, "wintmo=", CASTHOOK(shoes_setting_set_wintmo), 1); rb_define_method(cSettings, "display_backend", CASTHOOK(shoes_setting_display_backend), 0); cDialog = rb_define_class_under(cTypes, "Dialog", cApp); eInvMode = rb_define_class_under(cTypes, "InvalidModeError", rb_eStandardError); eNotImpl = rb_define_class_under(cTypes, "NotImplementedError", rb_eStandardError); eImageError = rb_define_class_under(cTypes, "ImageError", rb_eStandardError); C(HEX_SOURCE, "/^(?:0x|#)?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i"); C(HEX3_SOURCE, "/^(?:0x|#)?([0-9A-F])([0-9A-F])([0-9A-F])$/i"); C(RGB_SOURCE, "/^rgb\\((\\d+), *(\\d+), *(\\d+)\\)$/i"); C(RGBA_SOURCE, "/^rgb\\((\\d+), *(\\d+), *(\\d+), *(\\d+)\\)$/i"); C(GRAY_SOURCE, "/^gray\\((\\d+)\\)$/i"); C(GRAYA_SOURCE, "/^gray\\((\\d+), *(\\d+)\\)$/i"); C(LF, "/\\r?\\n/"); rb_eval_string( "def Shoes.escape(string);" "string.gsub(/&/n, '&').gsub(/\\\"/n, '"').gsub(/>/n, '>').gsub(/</n, '<');" "end" ); rb_define_singleton_method(cShoes, "APPS", CASTHOOK(shoes_apps_get), 0); rb_define_singleton_method(cShoes, "app", CASTHOOK(shoes_app_main), -1); rb_define_singleton_method(cShoes, "p", CASTHOOK(shoes_p), 1); rb_define_singleton_method(cShoes, "log", CASTHOOK(shoes_log), 0); rb_define_singleton_method(cShoes, "show_console", CASTHOOK(shoes_app_console), 0); // New in 3.2.23 rb_define_singleton_method(cShoes, "terminal", CASTHOOK(shoes_app_terminal), -1); // New in 3.3.2 replaces console rb_define_singleton_method(cShoes, "quit", CASTHOOK(shoes_app_quit), 0); // Shoes 3.3.2 rb_define_singleton_method(cShoes, "settings", CASTHOOK(shoes_app_settings), 0); // Shoes 3.3.7 //rb_define_singleton_method(cShoes, "exit", CASTHOOK(shoes_app_quit), 0); // // Canvas methods // See ruby.h for the complete list of Canvas method signatures. // Macros are used to build App redirection methods, which should be // speedier than method_missing. // CANVAS_DEFS(RUBY_M); // // Shoes Kernel methods // //rb_define_method(rb_mKernel, "quit", CASTHOOK(shoes_app_quit), 0); //rb_define_method(rb_mKernel, "exit", CASTHOOK(shoes_app_quit), 0); rb_define_method(rb_mKernel, "secret_exit_hook", CASTHOOK(shoes_exit_setup),0); //unused? rb_define_method(rb_mKernel, "debug", CASTHOOK(shoes_canvas_debug), 1); rb_define_method(rb_mKernel, "info", CASTHOOK(shoes_canvas_info), 1); rb_define_method(rb_mKernel, "warn", CASTHOOK(shoes_canvas_warn), 1); rb_define_method(rb_mKernel, "error", CASTHOOK(shoes_canvas_error), 1); cFlow = rb_define_class_under(cTypes, "Flow", cShoes); cStack = rb_define_class_under(cTypes, "Stack", cShoes); cMask = rb_define_class_under(cTypes, "Mask", cShoes); cWidget = rb_define_class_under(cTypes, "Widget", cShoes); rb_define_method(cApp, "method_missing", CASTHOOK(shoes_app_method_missing), -1); rb_define_method(rb_mKernel, "alert", CASTHOOK(shoes_dialog_alert), -1); rb_define_method(rb_mKernel, "ask", CASTHOOK(shoes_dialog_ask), -1); rb_define_method(rb_mKernel, "confirm", CASTHOOK(shoes_dialog_confirm), -1); rb_define_method(rb_mKernel, "ask_color", CASTHOOK(shoes_dialog_color), 1); rb_define_method(rb_mKernel, "ask_open_file", CASTHOOK(shoes_dialog_open), -1); rb_define_method(rb_mKernel, "ask_save_file", CASTHOOK(shoes_dialog_save), -1); rb_define_method(rb_mKernel, "ask_open_folder", CASTHOOK(shoes_dialog_open_folder), -1); rb_define_method(rb_mKernel, "ask_save_folder", CASTHOOK(shoes_dialog_save_folder), -1); rb_define_method(rb_mKernel, "font", CASTHOOK(shoes_font), 1); SHOES_TYPES_INIT; }