Changeset 438

Show
Ignore:
Timestamp:
02/29/2008 10:30:02 (6 months ago)
Author:
why
Message:
  • shoes/app.c: okay, so, now there is no master window. the app is closed when the last window is closed. eventually, we'll track the focused window for dialogs. and maybe there will be a need for setting which window is the master.
Location:
trunk/shoes
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/shoes/app.c

    r437 r438  
    6363  rb_ary_push(shoes_world->apps, app); 
    6464  return app; 
     65} 
     66 
     67// 
     68// When a window is finished, call this to delete it from the master 
     69// list.  Returns 1 if all windows are gone. 
     70// 
     71static int 
     72shoes_app_remove(shoes_app *app) 
     73{ 
     74  rb_ary_delete(shoes_world->apps, app->self); 
     75  return (RARRAY_LEN(shoes_world->apps) == 0); 
    6576} 
    6677 
     
    212223  if (v != Qnil) 
    213224    shoes_app_keypress(app, v); 
     225  return FALSE; 
     226} 
     227 
     228static gboolean 
     229shoes_app_gtk_quit(GtkWidget *widget, GdkEvent *event, gpointer data) 
     230{ 
     231  shoes_app *app = (shoes_app *)data; 
     232  if (shoes_app_remove(app)) 
     233    gtk_main_quit(); 
    214234  return FALSE; 
    215235} 
     
    940960  { 
    941961    case WM_DESTROY: 
    942       PostQuitMessage(0); 
     962      if (shoes_app_remove(app)) 
     963        PostQuitMessage(0); 
    943964    return 0;  
    944965 
     
    13191340  Data_Get_Struct(app, shoes_app, app_t); 
    13201341 
    1321   if (NIL_P(shoes_world->app)) 
    1322     shoes_world->app = app; 
    1323  
    13241342  rb_scan_args(argc, argv, "01&", &attr, &block); 
    13251343  rb_iv_set(app, "@main_app", block); 
     
    13591377 
    13601378shoes_code 
    1361 shoes_app_start(VALUE appobj, VALUE allapps, char *uri) 
     1379shoes_app_start(VALUE allapps, char *uri) 
    13621380{ 
    13631381  int i; 
     
    13701388    Data_Get_Struct(appobj2, shoes_app, app); 
    13711389 
    1372     code = shoes_app_open(app, uri, appobj2 == appobj); 
     1390    code = shoes_app_open(app, uri); 
    13731391    if (code != SHOES_OK) 
    13741392      return code; 
    13751393  } 
    13761394 
    1377   Data_Get_Struct(appobj, shoes_app, app); 
    1378   code = shoes_app_loop(app); 
     1395  code = shoes_app_loop(); 
    13791396  if (code != SHOES_OK) 
    13801397    return code; 
     
    14411458 
    14421459shoes_code 
    1443 shoes_app_open(shoes_app *app, char *path, unsigned char is_main) 
     1460shoes_app_open(shoes_app *app, char *path) 
    14441461{ 
    14451462  shoes_code code = SHOES_OK; 
     
    14611478  g_signal_connect(G_OBJECT(gk->window), "key-press-event", 
    14621479                   G_CALLBACK(shoes_app_gtk_keypress), app); 
    1463   if (is_main) 
    1464   { 
    1465     g_signal_connect(G_OBJECT(gk->window), "delete-event", 
    1466                      G_CALLBACK(gtk_main_quit), NULL); 
    1467   } 
     1480  g_signal_connect(G_OBJECT(gk->window), "delete-event", 
     1481                   G_CALLBACK(shoes_app_gtk_quit), app); 
    14681482  app->slot.canvas = gk->window; 
    14691483#endif 
     
    15061520  InitCursor(); 
    15071521 
    1508   if (is_main) 
    1509   { 
    1510     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,  
    1511       NewAEEventHandlerUPP(shoes_app_quartz_quit), 0, false); 
    1512     if (err != noErr) 
    1513     { 
    1514       QUIT("Out of memory.", 0); 
    1515     } 
     1522  err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,  
     1523    NewAEEventHandlerUPP(shoes_app_quartz_quit), 0, false); 
     1524  if (err != noErr) 
     1525  { 
     1526    QUIT("Out of memory.", 0); 
    15161527  } 
    15171528 
     
    16101621 
    16111622shoes_code 
    1612 shoes_app_loop(shoes_app *app) 
     1623shoes_app_loop() 
    16131624{ 
    16141625  shoes_code code = SHOES_OK; 
     
    16581669      if (msgs.message == WM_KEYDOWN || msgs.message == WM_KEYUP) 
    16591670      { 
    1660         VALUE appw = (VALUE)GetWindowLong(msgs.hwnd, GWL_USERDATA); 
    1661         shoes_app *appk; 
    1662         Data_Get_Struct(appw, shoes_app, appk); 
    1663  
     1671        shoes_app *appk = (shoes_app *)GetWindowLong(msgs.hwnd, GWL_USERDATA); 
    16641672        if (RARRAY_LEN(appk->slot.controls) > 0) 
    16651673        { 
     
    16781686        msg = false; 
    16791687      if (msg) 
    1680         msg = IsDialogMessage(app->slot.window, &msgs); 
     1688        msg = IsDialogMessage(msgs.hwnd, &msgs); 
    16811689 
    16821690      if (!msg) 
  • trunk/shoes/app.h

    r437 r438  
    5050shoes_code shoes_classex_init(); 
    5151#endif 
    52 shoes_code shoes_app_start(VALUE, VALUE, char *); 
    53 shoes_code shoes_app_open(shoes_app *, char *, unsigned char); 
    54 shoes_code shoes_app_loop(shoes_app *); 
     52shoes_code shoes_app_start(VALUE, char *); 
     53shoes_code shoes_app_open(shoes_app *, char *); 
     54shoes_code shoes_app_loop(); 
    5555shoes_code shoes_app_visit(shoes_app *, char *); 
    5656shoes_code shoes_app_paint(shoes_app *); 
  • trunk/shoes/canvas.c

    r433 r438  
    21972197    shoes_load(RSTRING_PTR(uri), "/"); 
    21982198 
    2199   return shoes_world->app; 
    2200 } 
    2201  
     2199  // TODO: do I send back an array of created App objects I guess? 
     2200  return Qnil; 
     2201} 
     2202 
  • trunk/shoes/world.c

    r437 r438  
    1616  shoes_world_t *world = SHOE_ALLOC(shoes_world_t); 
    1717  SHOE_MEMZERO(world, shoes_world_t, 1); 
    18   world->app = Qnil; 
    1918  world->apps = rb_ary_new(); 
    2019  rb_gc_register_address(&world->apps); 
     
    8685  } 
    8786 
    88   if (!NIL_P(shoes_world->app)) 
    89     return shoes_app_start(shoes_world->app, shoes_world->apps, uri); 
    90  
    91   return SHOES_QUIT; 
     87  return shoes_app_start(shoes_world->apps, uri); 
    9288} 
    9389 
  • trunk/shoes/world.h

    r437 r438  
    1515  SHOES_WORLD_OS os; 
    1616  char path[SHOES_BUFSIZE]; 
    17   VALUE app, apps; 
     17  VALUE apps; 
    1818} shoes_world_t; 
    1919 
    2020SHOES_EXTERN_VAR shoes_world_t *shoes_world; 
    2121 
     22// TODO: allow a window to be chosen as the main window 
    2223#define GLOBAL_APP(appvar) \ 
    2324  shoes_app *appvar; \ 
    24   Data_Get_Struct(shoes_world->app, shoes_app, appvar) 
     25  Data_Get_Struct(rb_ary_entry(shoes_world->apps, 0), shoes_app, appvar) 
    2526 
    2627//