Changeset 868
- Timestamp:
- 04/29/08 22:21:49 (3 months ago)
- Files:
-
- trunk/src/ui-event.c (modified) (5 diffs)
- trunk/src/ui-event.h (modified) (3 diffs)
- trunk/src/ui-menu.c (modified) (6 diffs)
- trunk/src/ui-menu.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/ui-event.c
r542 r868 36 36 * The event_listener observer for key events 37 37 * 38 * The event_ targetThe registrar for event_listeners.38 * The event_listener The registrar for event_listeners. 39 39 * For convenience, the event target is also an event_listener. 40 40 */ 41 41 42 /* List of event listeners--Helper class for event_target and the event loop */43 struct listener_list44 {45 event_listener *listener;46 struct listener_list *next;47 };48 42 49 43 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 }57 44 58 45 /* … … 69 56 * The first unhandled event - forever is false. 70 57 */ 71 ui_event_data run_event_loop(event_ target*target, bool forever, const ui_event_data *start)58 ui_event_data run_event_loop(event_listener *target, bool forever, const ui_event_data *start) 72 59 { 73 60 ui_event_data ke = EVENT_EMPTY; … … 76 63 while (forever || handled) 77 64 { 78 listener_list *list = target->observers;79 65 handled = FALSE; 80 66 … … 85 71 break; 86 72 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); 100 75 101 76 if (handled) start = NULL; … … 110 85 return ke; 111 86 } 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 13 13 14 14 /* The various UI events that can occur */ 15 typedef enum 15 typedef enum 16 16 { 17 17 EVT_NONE = 0x0, … … 33 33 } ui_event_type; 34 34 35 typedef struct ui_event_data ui_event_data; 36 37 struct ui_event_data 35 typedef struct 38 36 { 39 37 ui_event_type type; 40 38 byte mousex, mousey; 41 char key; 39 char key; 42 40 short index; 43 } ;41 } ui_event_data; 44 42 45 43 #define EVENT_EMPTY { EVT_NONE, 0, 0, 0, 0 } 46 44 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 */52 45 53 46 /* An event handler member function */ … … 57 50 typedef void (*release_f)(void *object); 58 51 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 };64 52 65 53 /* Base class for event listener */ 66 struct event_listener 54 typedef struct 67 55 { 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; 76 62 77 63 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); 64 ui_event_data run_event_loop(event_listener *parent, bool forever, const ui_event_data *start); 92 65 93 66 trunk/src/ui-menu.c
r867 r868 58 58 byte color = curs_attrs[CURS_KNOWN][0 != cursor]; 59 59 60 display_action_aux(&acts[oid], menu->target. self.object_id, color,60 display_action_aux(&acts[oid], menu->target.object_id, color, 61 61 row, col, width); 62 62 } … … 116 116 byte color = curs_attrs[!(items[oid].flags & (MN_GRAYED))][0 != cursor]; 117 117 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, 119 119 row, col, width); 120 120 } … … 486 486 487 487 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 }508 488 509 489 switch (in->type) … … 858 838 void menu_set_id(menu_type *menu, int id) 859 839 { 860 menu->target. self.object_id = id;840 menu->target.object_id = id; 861 841 } 862 842 … … 924 904 925 905 /* 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); 934 911 935 912 /* Menu-specific initialisation */ … … 941 918 /* We rely on filter_count containing the number of items we're 942 919 selecting from. */ 943 if (menu->count && !menu->filter_list) 920 if (menu->count && !menu->filter_list) 944 921 menu->filter_count = menu->count; 945 922 trunk/src/ui-menu.h
r867 r868 39 39 typedef struct menu_iter menu_iter; 40 40 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 event48 * listeners, and responsible for maintaining its own internal layout and49 * dispatching. A Panel has ownership of a Region, is a Container for50 * Event Listeners, and an Event Target for mouse events).51 * Potential examples include:52 * - menu53 * - window54 * - map55 */56 struct panel_type57 {58 event_target target;59 void (*refresh)(menu_type *);60 region boundary;61 };62 41 63 42 /* ================== MENUS ================= */ … … 207 186 { 208 187 /* menu inherits from panel */ 209 event_ targettarget;188 event_listener target; 210 189 void (*refresh)(); 211 190 region boundary;
