Changeset 186
- Timestamp:
- 09/21/2007 02:44:26 (12 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 14 modified
-
bin/main.skel (modified) (2 diffs)
-
samples/book.rb (modified) (2 diffs)
-
samples/bounce.rb (modified) (2 diffs)
-
samples/form.rb (modified) (2 diffs)
-
samples/rect.rb (modified) (1 diff)
-
samples/timer.rb (modified) (1 diff)
-
shoes/app.c (modified) (39 diffs)
-
shoes/app.h (modified) (3 diffs)
-
shoes/canvas.c (modified) (11 diffs)
-
shoes/canvas.h (modified) (3 diffs)
-
shoes/config.h (modified) (7 diffs)
-
shoes/dialogs.c (modified) (13 diffs)
-
shoes/ruby.c (modified) (8 diffs)
-
shoes/ruby.h (modified) (2 diffs)
-
shoes/world.c (added)
-
shoes/world.h (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/bin/main.skel
r176 r186 17 17 #endif 18 18 { 19 shoes_code code; 20 char *path = NULL; 19 21 #ifdef SHOES_WIN32 20 22 int argc; … … 23 25 #endif 24 26 %DEFAULTS% 25 shoes_init(); 26 shoes_app *app = shoes_app_new(); 27 code = shoes_init(); 28 if (code != SHOES_OK) 29 goto done; 30 27 31 #ifdef SHOES_WIN32 28 app->kit.instance = inst;29 app->kit.style = style;30 app->path = SHOE_ALLOC_N(char, SHOES_BUFSIZE);31 GetModuleFileName(NULL, (LPSTR) app->path, SHOES_BUFSIZE);32 world->instance = inst; 33 world->style = style; 34 path = SHOE_ALLOC_N(char, SHOES_BUFSIZE); 35 GetModuleFileName(NULL, (LPSTR)world->path, SHOES_BUFSIZE); 32 36 #else 33 app->path = argv[0];37 path = argv[0]; 34 38 #endif 35 39 ruby_set_argv(argc - 1, &argv[1]); 36 if (shoes_app_load(app) != SHOES_QUIT) 37 { 38 shoes_app_open(app); 39 shoes_app_loop(app, "/"); 40 shoes_app_close(app); 41 } 40 code = shoes_load(path); 41 if (code != SHOES_OK) 42 goto done; 43 44 code = shoes_start("/"); 45 if (code != SHOES_OK) 46 goto done; 47 48 done: 42 49 #ifdef SHOES_WIN32 43 SHOE_FREE(app->path); 50 if (path != NULL) 51 SHOE_FREE(path); 44 52 #endif 45 shoes_ app_free(app);53 shoes_final(); 46 54 return 0; 47 55 } -
trunk/samples/book.rb
r145 r186 19 19 def incident(num) 20 20 num = num.to_i 21 toc = table_of_contents22 21 flow :margin => 10, :margin_left => 200, :margin_top => 20 do 23 22 text "<span font_desc='Arial 46px'>Incident</span>\n" + … … 25 24 end 26 25 flow :width => 180, :margin_left => 10 do 27 text t oc26 text table_of_contents 28 27 end 29 28 flow :width => -250, :margin_left => 10 do -
trunk/samples/bounce.rb
r163 r186 3 3 4 4 Shoes.app do 5 background "#DFA" .."#F90", :angle => 455 background "#DFA" 6 6 border black, :strokewidth => 6 7 7 8 8 nostroke 9 icon = image "static/shoes-icon.png", :left => 100, :top => 1009 @icon = image "static/shoes-icon.png", :left => 100, :top => 100 10 10 11 11 x, y = self.width / 2, self.height / 2 12 size = icon.size12 size = @icon.size 13 13 animate(30) do 14 14 x += xspeed * xdir … … 18 18 ydir *= -1 if y > self.height - size[1] or y < 0 19 19 20 icon.move x.to_i, y.to_i20 @icon.move x.to_i, y.to_i 21 21 end 22 22 end -
trunk/samples/form.rb
r84 r186 1 name, phone, address = nil2 1 Shoes.app :width => 320, :height => 350 do 3 2 background "static/menu-gray.png" … … 11 10 stack :margin => 10 do 12 11 text "Name" 13 name = list_box :items => ["Yes, please!", "NO. No thankyou."]12 @name = list_box :items => ["Yes, please!", "NO. No thankyou."] 14 13 end 15 14 stack :margin => 10 do 16 15 text "Address" 17 address = edit_line16 @address = edit_line 18 17 end 19 18 stack :margin => 10 do 20 19 text "Phone" 21 phone = edit_line20 @phone = edit_line 22 21 end 23 22 stack :margin => 10 do 24 23 button "Save" do 25 Shoes.p [ name.text, address.text,phone.text]24 Shoes.p [@name.text, @address.text, @phone.text] 26 25 end 27 26 end -
trunk/samples/rect.rb
r123 r186 1 rectangles = proc do 2 20.times do 3 nostroke 4 fill rgb((0.6..1.0).rand, (0.1..1.0).rand, (0.2..1.0).rand, (0.4..1.0).rand) 5 r = rand(300) + 60 6 rect :left => (10..100).rand, :top => (10..200).rand, :width => r, :height => r 1 Shoes.app :width => 400, :height => 500 do 2 rectangles = proc do 3 20.times do 4 nostroke 5 fill rgb((0.6..1.0).rand, (0.1..1.0).rand, (0.2..1.0).rand, (0.4..1.0).rand) 6 r = rand(300) + 60 7 rect :left => (10..100).rand, :top => (10..200).rand, :width => r, :height => r 8 end 9 button "OK", :left => 300, :top => 400 do 10 clear &rectangles 11 end 7 12 end 8 button "OK", :left => 300, :top => 400 do 9 clear &rectangles 10 end 13 14 rectangles[] 11 15 end 12 13 Shoes.app :width => 400, :height => 500, &rectangles -
trunk/samples/timer.rb
r120 r186 1 label, time = nil, Time.now2 1 Shoes.app :height => 150, :width => 250 do 3 2 background rgb(240, 250, 208) 4 3 stack :margin => 10 do 5 4 button "Start" do 6 time = Time.now7 label.replace "Stop watch started at #{time}"5 @time = Time.now 6 @label.replace "Stop watch started at #@time" 8 7 end 9 8 button "Stop" do 10 label.replace "Stopped, #{Time.now -time} seconds elapsed."9 @label.replace "Stopped, #{Time.now - @time} seconds elapsed." 11 10 end 12 label = text "Press start to begin timing."11 @label = text "Press start to begin timing." 13 12 end 14 13 end -
trunk/shoes/app.c
r183 r186 7 7 #include "shoes/ruby.h" 8 8 #include "shoes/canvas.h" 9 #include "shoes/world.h" 9 10 #include "node.h" 10 11 11 shoes_app *global_app = NULL; 12 13 shoes_app * 14 shoes_app_new() 12 static void 13 shoes_app_mark(shoes_app *app) 14 { 15 #ifndef SHOES_GTK 16 rb_gc_mark_maybe(app->slot.controls); 17 #endif 18 rb_gc_mark_maybe(app->canvas); 19 rb_gc_mark_maybe(app->nesting); 20 rb_gc_mark_maybe(app->timers); 21 } 22 23 static void 24 shoes_app_free(shoes_app *app) 25 { 26 free(app); 27 } 28 29 VALUE 30 shoes_app_alloc(VALUE klass) 15 31 { 16 32 shoes_app *app = SHOE_ALLOC(shoes_app); 33 SHOE_MEMZERO(app, shoes_app, 1); 17 34 app->canvas = shoes_canvas_new(cShoes, app); 18 rb_gc_register_address(&app->canvas);35 app->nesting = rb_ary_new(); 19 36 app->timers = rb_ary_new(); 20 rb_gc_register_address(&app->timers);21 37 app->title = Qnil; 22 38 app->width = SHOES_APP_WIDTH; … … 26 42 app->slot.window = NULL; 27 43 #else 28 app->kit.window = NULL; 29 #endif 30 return app; 31 } 32 33 void 34 shoes_app_free(shoes_app *app) 35 { 36 #ifdef SHOES_QUARTZ 37 CFRelease(app->kit.clip); 38 TECDisposeConverter(app->kit.converter); 39 #endif 40 #ifndef SHOES_GTK 41 if (!NIL_P(app->slot.controls)) 42 rb_gc_unregister_address(&app->slot.controls); 43 #endif 44 rb_gc_unregister_address(&app->canvas); 45 rb_gc_unregister_address(&app->timers); 46 if (app != NULL) 47 SHOE_FREE(app); 44 app->os.window = NULL; 45 #endif 46 app->self = Data_Wrap_Struct(klass, shoes_app_mark, shoes_app_free, app); 47 return app->self; 48 } 49 50 VALUE 51 shoes_app_new() 52 { 53 return shoes_app_alloc(cApp); 48 54 } 49 55 … … 88 94 { 89 95 shoes_app *app = (shoes_app *)data; 90 gtk_container_propagate_expose(GTK_CONTAINER(app-> kit.window), widget, app->slot.expose);96 gtk_container_propagate_expose(GTK_CONTAINER(app->os.window), widget, app->slot.expose); 91 97 } 92 98 … … 95 101 { 96 102 shoes_app *app = (shoes_app *)data; 97 gtk_window_get_size(GTK_WINDOW(app-> kit.window), &app->width, &app->height);103 gtk_window_get_size(GTK_WINDOW(app->os.window), &app->width, &app->height); 98 104 shoes_canvas_size(app->canvas, app->width, app->height); 99 105 app->slot.expose = event; 100 gtk_container_forall(GTK_CONTAINER(app-> kit.window), shoes_app_gtk_paint_children, app);106 gtk_container_forall(GTK_CONTAINER(app->os.window), shoes_app_gtk_paint_children, app); 101 107 app->slot.expose = NULL; 102 108 } … … 383 389 384 390 OSStatus 385 shoes_slot_quartz_create(VALUE self, APPSLOT*parent, int w, int h)391 shoes_slot_quartz_create(VALUE self, SHOES_SLOT_OS *parent, int w, int h) 386 392 { 387 393 HIRect rect; … … 389 395 EventRef event; 390 396 shoes_canvas *canvas; 391 APPSLOT*slot;397 SHOES_SLOT_OS *slot; 392 398 Data_Get_Struct(self, shoes_canvas, canvas); 393 399 slot = &canvas->slot; … … 458 464 if (modifier & controlKey) \ 459 465 KEY_STATE(control); \ 460 shoes_app_keypress( global_app, v); \466 shoes_app_keypress(app, v); \ 461 467 } else 462 468 … … 569 575 570 576 text8 = SHOE_ALLOC_N(char, len); 571 status = TECConvertText(app-> kit.converter, text, len, &nread, text8, len, &nwrite);577 status = TECConvertText(app->os.converter, text, len, &nread, text8, len, &nwrite); 572 578 573 579 if (nwrite == 1 && text8[0] == '\r') … … 594 600 INFO("kEventClassMouse\n", 0); 595 601 GetMouse(&mouseLoc); 596 GetWindowBounds(app-> kit.window, kWindowContentRgn, &bounds);602 GetWindowBounds(app->os.window, kWindowContentRgn, &bounds); 597 603 if (mouseLoc.h < bounds.left || mouseLoc.v < bounds.top) break; 598 604 GetEventParameter(inEvent, kEventParamMouseButton, typeMouseButton, 0, sizeof(EventMouseButton), 0, &button); … … 628 634 629 635 SetRect(&windowRect, 0, 0, app->width, app->height); 630 InvalWindowRect(app-> kit.window, &windowRect);636 InvalWindowRect(app->os.window, &windowRect); 631 637 } 632 638 … … 647 653 y = HIWORD(l) 648 654 649 #define KEY_SYM(sym) shoes_app_keypress( global_app, ID2SYM(rb_intern("" # sym)))655 #define KEY_SYM(sym) shoes_app_keypress(app, ID2SYM(rb_intern("" # sym))) 650 656 #define KEYPRESS(name, sym) \ 651 657 else if (w == VK_##name) { \ 652 658 VALUE v = ID2SYM(rb_intern("" # sym)); \ 653 if ( global_app->kit.altkey) \659 if (app->os.altkey) \ 654 660 KEY_STATE(alt); \ 655 if ( global_app->kit.shiftkey) \661 if (app->os.shiftkey) \ 656 662 KEY_STATE(shift); \ 657 if ( global_app->kit.ctrlkey) \663 if (app->os.ctrlkey) \ 658 664 KEY_STATE(control); \ 659 shoes_app_keypress( global_app, v); \665 shoes_app_keypress(app, v); \ 660 666 } 661 667 … … 678 684 { 679 685 RECT rect; 680 GetClientRect( global_app->slot.window, &rect);681 global_app->width = rect.right;682 global_app->height = rect.bottom;683 shoes_canvas_size( global_app->canvas, global_app->width, global_app->height);684 shoes_app_paint( global_app);686 GetClientRect(app->slot.window, &rect); 687 app->width = rect.right; 688 app->height = rect.bottom; 689 shoes_canvas_size(app->canvas, app->width, app->height); 690 shoes_app_paint(app); 685 691 } 686 692 break; … … 688 694 case WM_LBUTTONDOWN: 689 695 WM_POINTS(); 690 shoes_app_click( global_app, 1, x, y);696 shoes_app_click(app, 1, x, y); 691 697 break; 692 698 693 699 case WM_RBUTTONDOWN: 694 700 WM_POINTS(); 695 shoes_app_click( global_app, 2, x, y);701 shoes_app_click(app, 2, x, y); 696 702 break; 697 703 698 704 case WM_MBUTTONDOWN: 699 705 WM_POINTS(); 700 shoes_app_click( global_app, 3, x, y);706 shoes_app_click(app, 3, x, y); 701 707 break; 702 708 703 709 case WM_LBUTTONUP: 704 710 WM_POINTS(); 705 shoes_app_release( global_app, 1, x, y);711 shoes_app_release(app, 1, x, y); 706 712 break; 707 713 708 714 case WM_RBUTTONUP: 709 715 WM_POINTS(); 710 shoes_app_release( global_app, 2, x, y);716 shoes_app_release(app, 2, x, y); 711 717 break; 712 718 713 719 case WM_MBUTTONUP: 714 720 WM_POINTS(); 715 shoes_app_release( global_app, 3, x, y);721 shoes_app_release(app, 3, x, y); 716 722 break; 717 723 718 724 case WM_MOUSEMOVE: 719 725 WM_POINTS(); 720 shoes_app_motion( global_app, x, y);726 shoes_app_motion(app, x, y); 721 727 break; 722 728 … … 733 739 734 740 case 0x0D: 735 shoes_app_keypress( global_app, rb_str_new2("\n"));741 shoes_app_keypress(app, rb_str_new2("\n")); 736 742 break; 737 743 … … 744 750 str[len] = '\0'; 745 751 v = rb_str_new(str, len); 746 shoes_app_keypress( global_app, v);752 shoes_app_keypress(app, v); 747 753 } 748 754 } … … 752 758 case WM_KEYDOWN: 753 759 if (w == VK_CONTROL) 754 global_app->kit.ctrlkey = true;760 app->os.ctrlkey = true; 755 761 else if (w == VK_MENU) 756 global_app->kit.altkey = true;762 app->os.altkey = true; 757 763 else if (w == VK_SHIFT) 758 global_app->kit.shiftkey = true;764 app->os.shiftkey = true; 759 765 KEYPRESS(PRIOR, page_up) 760 766 KEYPRESS(NEXT, page_down) … … 781 787 char letter = w + 32; 782 788 v = rb_str_new(&letter, 1); 783 if ( global_app->kit.altkey) {789 if (app->os.altkey) { 784 790 KEY_STATE(alt); 785 shoes_app_keypress( global_app, v);791 shoes_app_keypress(app, v); 786 792 } 787 793 } … … 791 797 case WM_KEYUP: 792 798 if (w == VK_CONTROL) 793 global_app->kit.ctrlkey = false;799 app->os.ctrlkey = false; 794 800 else if (w == VK_MENU) 795 global_app->kit.altkey = false;801 app->os.altkey = false; 796 802 else if (w == VK_SHIFT) 797 global_app->kit.shiftkey = false;803 app->os.shiftkey = false; 798 804 break; 799 805 … … 801 807 { 802 808 int id = LOWORD(w); 803 VALUE timer = rb_ary_entry( global_app->timers, id - SHOES_CONTROL1);809 VALUE timer = rb_ary_entry(app->timers, id - SHOES_CONTROL1); 804 810 if (!NIL_P(timer)) 805 811 shoes_anim_call(timer); … … 811 817 { 812 818 int id = LOWORD(w); 813 VALUE control = rb_ary_entry( global_app->slot.controls, id - SHOES_CONTROL1);819 VALUE control = rb_ary_entry(app->slot.controls, id - SHOES_CONTROL1); 814 820 if (!NIL_P(control)) 815 821 shoes_control_send(control, s_click); … … 822 828 823 829 shoes_code 824 shoes_app_load(shoes_app *app)825 {826 char bootup[512];827 if (global_app == NULL)828 global_app = app;829 830 sprintf(bootup,831 "begin;"832 "DIR = File.expand_path(File.dirname(%%q<%s>));"833 "$:.replace([DIR+'/ruby/lib/'+PLATFORM, DIR+'/ruby/lib', DIR+'/lib']);"834 "require 'shoes';"835 "'OK';"836 "rescue Object => e;"837 SHOES_META838 "define_method :load do |path|; end;"839 EXC_RUN840 "end;"841 "e.message;"842 "end",843 app->path);844 VALUE str = rb_eval_string(bootup);845 StringValue(str);846 INFO("Bootup: %s\n", RSTRING(str)->ptr);847 848 VALUE uri = rb_eval_string("$SHOES_URI = Shoes.args!");849 if (!RTEST(uri))850 return SHOES_QUIT;851 852 sprintf(bootup,853 "begin;"854 "Shoes.load($SHOES_URI) if $SHOES_URI.is_a?(String);"855 "rescue Object => e;"856 SHOES_META857 EXC_RUN858 "end;"859 "end;");860 rb_eval_string(bootup);861 862 return SHOES_OK;863 }864 865 shoes_code866 830 shoes_app_cursor(shoes_app *app, ID cursor) 867 831 { 868 832 #ifdef SHOES_GTK 869 if (app-> kit.window == NULL || app->kit.window->window == NULL || app->cursor == cursor)833 if (app->os.window == NULL || app->os.window->window == NULL || app->cursor == cursor) 870 834 goto done; 871 835 … … 882 846 goto done; 883 847 884 gdk_window_set_cursor(app-> kit.window->window, c);848 gdk_window_set_cursor(app->os.window->window, c); 885 849 #endif 886 850 887 851 #ifdef SHOES_QUARTZ 888 if (app-> kit.window == NULL || app->cursor == cursor)852 if (app->os.window == NULL || app->cursor == cursor) 889 853 goto done; 890 854 … … 931 895 932 896 #ifdef SHOES_GTK 933 if (app-> kit.window != NULL)934 gtk_widget_set_size_request(app-> kit.window, app->width, app->height);897 if (app->os.window != NULL) 898 gtk_widget_set_size_request(app->os.window, app->width, app->height); 935 899 #endif 936 900 … … 955 919 int width, height; 956 920 VALUE attr, block; 921 GLOBAL_APP(app); 922 957 923 rb_scan_args(argc, argv, "01&", &attr, &block); 958 924 rb_iv_set(self, "@main_app", block); 959 global_app->title = ATTR(attr, title); 960 global_app->resizable = (ATTR(attr, resizable) != Qfalse); 961 shoes_app_resize(global_app, ATTR2(int, attr, width, SHOES_APP_WIDTH), ATTR2(int, attr, height, SHOES_APP_HEIGHT)); 962 shoes_canvas_init(global_app->canvas, global_app->slot, attr, global_app->width, global_app->height); 925 926 app->title = ATTR(attr, title); 927 app->resizable = (ATTR(attr, resizable) != Qfalse); 928 shoes_app_resize(app, ATTR2(int, attr, width, SHOES_APP_WIDTH), ATTR2(int, attr, height, SHOES_APP_HEIGHT)); 929 shoes_canvas_init(app->canvas, app->slot, attr, app->width, app->height); 963 930 return self; 964 931 } … … 978 945 979 946 #ifdef SHOES_GTK 980 gtk_window_set_title(GTK_WINDOW(app-> kit.window), _(msg));947 gtk_window_set_title(GTK_WINDOW(app->os.window), _(msg)); 981 948 #endif 982 949 983 950 #ifdef SHOES_QUARTZ 984 951 CFStringRef cfmsg = CFStringCreateWithCString(NULL, msg, kCFStringEncodingUTF8); 985 OSStatus err = SetWindowTitleWithCFString(app-> kit.window, cfmsg);952 OSStatus err = SetWindowTitleWithCFString(app->os.window, cfmsg); 986 953 #endif 987 954 … … 992 959 993 960 shoes_code 961 shoes_app_start(VALUE appobj, char *uri) 962 { 963 shoes_code code; 964 shoes_app *app; 965 Data_Get_Struct(appobj, shoes_app, app); 966 967 code = shoes_app_open(app); 968 if (code != SHOES_OK) 969 return code; 970 971 code = shoes_app_loop(app, uri); 972 if (code != SHOES_OK) 973 return code; 974 975 return shoes_app_close(app); 976 } 977 978 shoes_code 994 979 shoes_app_open(shoes_app *app) 995 980 { … … 997 982 998 983 #ifdef SHOES_GTK 999 shoes_app_gtk *gk = &app-> kit;984 shoes_app_gtk *gk = &app->os; 1000 985 shoes_slot_gtk *gs = &app->slot; 1001 986 … … 1049 1034 ^ (app->resizable ? kWindowResizableAttribute : 0), 1050 1035 &gRect, 1051 &app-> kit.window);1036 &app->os.window); 1052 1037 1053 1038 if (err != noErr) … … 1072 1057 1073 1058 INFO("Event handler.\n", 0); 1074 err = InstallWindowEventHandler(app-> kit.window,1059 err = InstallWindowEventHandler(app->os.window, 1075 1060 gTestWindowEventProc, GetEventTypeCount(windowEvents), 1076 1061 windowEvents, app, NULL); 1077 1062 1078 HIViewFindByID(HIViewGetRoot(app-> kit.window), kHIViewWindowContentID, &app->slot.view);1079 1080 if (PasteboardCreate(kPasteboardClipboard, & app->kit.clip) != noErr) {1063 HIViewFindByID(HIViewGetRoot(app->os.window), kHIViewWindowContentID, &app->slot.view); 1
