Changeset 868

Show
Ignore:
Timestamp:
04/29/08 22:21:49 (3 months ago)
Author:
takkaria
Message:
  • Remove a layer of unused complexity in ui-event.c; the "observers" model never actually got used, and without it, various types can be removed.
  • This means a level of indirection can be removed (instead of referring to menu_target::self, it's just an event_listener now)
  • Remove the never-used panel_type type.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/ui-event.c

    r542 r868  
    3636 * The event_listener observer for key events 
    3737 * 
    38  * The event_target   The registrar for event_listeners. 
     38 * The event_listener   The registrar for event_listeners. 
    3939 * For convenience, the event target is also an event_listener. 
    4040 */ 
    4141 
    42 /* List of event listeners--Helper class for event_target and the event loop */ 
    43 struct listener_list 
    44 { 
    45         event_listener *listener; 
    46         struct listener_list *next; 
    47 }; 
    4842 
    4943 
    50 void stop_event_loop() 
    51 { 
    52         ui_event_data stop = { EVT_STOP, 0, 0, 0, 0 }; 
    53  
    54         /* Stop right away! */ 
    55         Term_event_push(&stop); 
    56 } 
    5744 
    5845/* 
     
    6956 *    The first unhandled event - forever is false. 
    7057 */ 
    71 ui_event_data run_event_loop(event_target *target, bool forever, const ui_event_data *start) 
     58ui_event_data run_event_loop(event_listener *target, bool forever, const ui_event_data *start) 
    7259{ 
    7360        ui_event_data ke = EVENT_EMPTY; 
     
    7663        while (forever || handled) 
    7764        { 
    78                 listener_list *list = target->observers; 
    7965                handled = FALSE; 
    8066 
     
    8571                        break; 
    8672 
    87                 if (ke.type & target->self.events.evt_flags) 
    88                         handled = target->self.handler(target->self.object, &ke); 
    89  
    90                 if (!target->is_modal) 
    91                 { 
    92                         while (list && !handled) 
    93                         { 
    94                                 if (ke.type & list->listener->events.evt_flags) 
    95                                         handled = list->listener->handler(list->listener->object, &ke); 
    96  
    97                                 list = list->next; 
    98                         } 
    99                 } 
     73                if (ke.type & target->event_flags) 
     74                        handled = target->handler(target->object, &ke); 
    10075 
    10176                if (handled) start = NULL; 
     
    11085        return ke; 
    11186} 
    112  
    113 void add_listener(event_target *target, event_listener *observer) 
    114 { 
    115         listener_list *link; 
    116  
    117         link = ZNEW(listener_list); 
    118         link->listener = observer; 
    119         link->next = target->observers; 
    120         target->observers = link; 
    121 } 
    122  
    123 void remove_listener(event_target *target, event_listener *observer) 
    124 { 
    125         listener_list *cur = target->observers; 
    126         listener_list **prev = &target->observers; 
    127  
    128         while (cur) 
    129         { 
    130                 if (cur->listener == observer) 
    131                 { 
    132                         *prev = cur->next; 
    133                         FREE(cur); 
    134                         break; 
    135                 } 
    136         } 
    137  
    138         bell("remove_listener: no such observer"); 
    139 } 
    140  
    141  
  • trunk/src/ui-event.h

    r542 r868  
    1313 
    1414/* The various UI events that can occur */ 
    15 typedef enum  
     15typedef enum 
    1616{ 
    1717        EVT_NONE        = 0x0, 
     
    3333} ui_event_type; 
    3434 
    35 typedef struct ui_event_data ui_event_data; 
    36  
    37 struct ui_event_data 
     35typedef struct 
    3836{ 
    3937        ui_event_type type; 
    4038        byte mousex, mousey; 
    41         char key;  
     39        char key; 
    4240        short index; 
    43 }
     41} ui_event_data
    4442 
    4543#define EVENT_EMPTY             { EVT_NONE, 0, 0, 0, 0 } 
    4644 
    47  
    48 typedef struct event_target event_target; 
    49 typedef struct event_listener event_listener; 
    50 typedef struct event_set event_set; 
    51 typedef struct listener_list listener_list; /* Opaque */ 
    5245 
    5346/* An event handler member function */ 
     
    5750typedef void (*release_f)(void *object); 
    5851 
    59 /* Set of event types to which a particular listener has subscribed */ 
    60 struct event_set { 
    61         int evt_flags;          /* OR'ed together set of events */ 
    62         /* anything else? */ 
    63 }; 
    6452 
    6553/* Base class for event listener */ 
    66 struct event_listener 
     54typedef struct 
    6755{ 
    68         int object_id;                  /* Identifier used for macros, etc */ 
    69         handler_f handler;              /* The handler function to call */ 
    70         release_f release;              /* Frees any owned resources */ 
    71         void *object;                   /* Self-pointer */ 
    72  
    73         /* properly, this belongs in the listener_list */ 
    74         event_set events;               /* Set of events to which this listener has subscribed */ 
    75 }; 
     56        int object_id;      /* Identifier used for macros, etc */ 
     57        handler_f handler;  /* The handler function to call */ 
     58        release_f release;  /* Frees any owned resources */ 
     59        void *object;       /* Self-pointer */ 
     60        int event_flags;    /* Set of events to which this listener has subscribed */ 
     61} event_listener; 
    7662 
    7763 
    78 /* Event target -- the owner for a list of event listeners */ 
    79 /* Examples include Windows, Panels (menus), application */ 
    80 struct event_target { 
    81         /* Allow a target to be a listener as well */ 
    82         event_listener self; 
    83         bool is_modal; 
    84         listener_list *observers; 
    85 }; 
    86  
    87 void add_listener (event_target *parent, event_listener *child); 
    88 void add_target(event_target *parent, event_target *child); 
    89  
    90 void remove_listener (event_target *parent, event_listener *child); 
    91 ui_event_data run_event_loop(event_target *parent, bool forever, const ui_event_data *start); 
     64ui_event_data run_event_loop(event_listener *parent, bool forever, const ui_event_data *start); 
    9265 
    9366 
  • trunk/src/ui-menu.c

    r867 r868  
    5858        byte color = curs_attrs[CURS_KNOWN][0 != cursor]; 
    5959 
    60         display_action_aux(&acts[oid], menu->target.self.object_id, color,  
     60        display_action_aux(&acts[oid], menu->target.object_id, color,  
    6161                           row, col, width); 
    6262} 
     
    116116        byte color = curs_attrs[!(items[oid].flags & (MN_GRAYED))][0 != cursor]; 
    117117 
    118         display_action_aux(&items[oid].act, menu->target.self.object_id, color, 
     118        display_action_aux(&items[oid].act, menu->target.object_id, color, 
    119119                           row, col, width); 
    120120} 
     
    486486 
    487487        out.key = '\xff'; 
    488  
    489         if (menu->target.observers) 
    490         { 
    491                 /* TODO: need a panel dispatcher here, not a generic target */ 
    492                 event_target t = { { 0, 0, 0, 0, { 0 } }, FALSE, 0 /* menu->target.observers */}; 
    493                 t.observers = menu->target.observers; 
    494                 out = run_event_loop(&t, FALSE, in); 
    495  
    496                 if (out.type != EVT_AGAIN) 
    497                 { 
    498                         if (out.type == EVT_SELECT) 
    499                         { 
    500                                 /* HACK: can't return selection event from submenu (no ID) */ 
    501                                 out.type = EVT_REFRESH; 
    502                                 Term_event_push(&out); 
    503                         } 
    504  
    505                         return TRUE; 
    506                 } 
    507         } 
    508488 
    509489        switch (in->type) 
     
    858838void menu_set_id(menu_type *menu, int id) 
    859839{ 
    860         menu->target.self.object_id = id; 
     840        menu->target.object_id = id; 
    861841} 
    862842 
     
    924904 
    925905        /* Stuff for the event listener (see ui-event.h) */ 
    926         menu->target.self.object_id = 0; 
    927         menu->target.self.handler = menu_handle_event; 
    928         menu->target.self.release = NULL; 
    929         menu->target.self.object = menu; 
    930         menu->target.self.events.evt_flags = (EVT_KBRD | EVT_MOUSE | EVT_REFRESH); 
    931  
    932         /* "Panel" stuff. */ 
    933         menu->target.is_modal = TRUE; 
     906        menu->target.object_id = 0; 
     907        menu->target.handler = menu_handle_event; 
     908        menu->target.release = NULL; 
     909        menu->target.object = menu; 
     910        menu->target.event_flags = (EVT_KBRD | EVT_MOUSE | EVT_REFRESH); 
    934911 
    935912        /* Menu-specific initialisation */ 
     
    941918        /* We rely on filter_count containing the number of items we're 
    942919           selecting from. */ 
    943         if (menu->count && !menu->filter_list)  
     920        if (menu->count && !menu->filter_list) 
    944921                menu->filter_count = menu->count; 
    945922 
  • trunk/src/ui-menu.h

    r867 r868  
    3939typedef struct menu_iter menu_iter; 
    4040 
    41  
    42 /* ================= PANEL ============ */ 
    43 typedef struct panel_type panel_type; 
    44  
    45 /* 
    46  * An event target bound to a particular screen area. 
    47  * A Panel is a (rectangular) (sub)region, possibly containing a set of event 
    48  * listeners, and responsible for maintaining its own internal layout and 
    49  * dispatching.  A Panel has ownership of a Region, is a Container for  
    50  * Event Listeners, and an Event Target for mouse events). 
    51  * Potential examples include:  
    52  *  - menu 
    53  *  - window 
    54  *  - map 
    55  */ 
    56 struct panel_type 
    57 { 
    58         event_target target; 
    59         void (*refresh)(menu_type *); 
    60         region boundary; 
    61 }; 
    6241 
    6342/* ================== MENUS ================= */ 
     
    207186{ 
    208187        /* menu inherits from panel */ 
    209         event_target target; 
     188        event_listener target; 
    210189        void (*refresh)(); 
    211190        region boundary;