mirror of
https://github.com/netsurf-browser/netsurf
synced 2025-01-11 13:29:21 +03:00
[project @ 2006-02-01 17:34:36 by adrianl]
Use hash table for faster access to event_windows svn path=/import/netsurf/; revision=2051
This commit is contained in:
parent
2e7b32ea5a
commit
158b6e1835
@ -23,6 +23,9 @@
|
||||
#include "netsurf/utils/log.h"
|
||||
#include "netsurf/utils/utils.h"
|
||||
|
||||
#define WIN_HASH_SIZE 32
|
||||
#define WIN_HASH(w) (((unsigned)(w) >> 5) % WIN_HASH_SIZE)
|
||||
|
||||
typedef enum {
|
||||
EVENT_NUMERIC_FIELD,
|
||||
EVENT_TEXT_FIELD,
|
||||
@ -89,8 +92,9 @@ static struct event_window *ro_gui_wimp_event_find_window(wimp_w w);
|
||||
static struct icon_event *ro_gui_wimp_event_get_event(wimp_w w, wimp_i i,
|
||||
event_type type);
|
||||
static void ro_gui_wimp_event_prepare_menu(wimp_w w, struct icon_event *event);
|
||||
static struct event_window *ro_gui_wimp_event_remove_window(wimp_w w);
|
||||
|
||||
static struct event_window *ro_gui_wimp_event_windows;
|
||||
static struct event_window *ro_gui_wimp_event_windows[WIN_HASH_SIZE];
|
||||
|
||||
|
||||
/**
|
||||
@ -217,24 +221,12 @@ bool ro_gui_wimp_event_validate(wimp_w w) {
|
||||
*/
|
||||
void ro_gui_wimp_event_finalise(wimp_w w) {
|
||||
struct event_window *window;
|
||||
struct event_window *link;
|
||||
struct icon_event *event;
|
||||
|
||||
window = ro_gui_wimp_event_find_window(w);
|
||||
window = ro_gui_wimp_event_remove_window(w);
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
if (window == ro_gui_wimp_event_windows) {
|
||||
ro_gui_wimp_event_windows = window->next;
|
||||
} else {
|
||||
for (link = ro_gui_wimp_event_windows; link; link = link->next) {
|
||||
if (link->next == window) {
|
||||
link->next = window->next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (window->first) {
|
||||
event = window->first;
|
||||
window->first = event->next;
|
||||
@ -967,6 +959,7 @@ bool ro_gui_wimp_event_register_menu_selection(wimp_w w,
|
||||
*/
|
||||
struct event_window *ro_gui_wimp_event_get_window(wimp_w w) {
|
||||
struct event_window *window;
|
||||
int h;
|
||||
|
||||
window = ro_gui_wimp_event_find_window(w);
|
||||
if (window)
|
||||
@ -975,13 +968,44 @@ struct event_window *ro_gui_wimp_event_get_window(wimp_w w) {
|
||||
window = calloc(1, sizeof(struct event_window));
|
||||
if (!window)
|
||||
return NULL;
|
||||
|
||||
h = WIN_HASH(w);
|
||||
window->w = w;
|
||||
window->next = ro_gui_wimp_event_windows;
|
||||
ro_gui_wimp_event_windows = window;
|
||||
window->next = ro_gui_wimp_event_windows[h];
|
||||
ro_gui_wimp_event_windows[h] = window;
|
||||
return window;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Removes the event data associated with a given handle from the hash tables,
|
||||
* but does not delete it.
|
||||
*
|
||||
* \param w the window to be removed
|
||||
* \return pointer to the event data or NULL if not found
|
||||
*/
|
||||
|
||||
struct event_window *ro_gui_wimp_event_remove_window(wimp_w w) {
|
||||
struct event_window **prev;
|
||||
int h = WIN_HASH(w);
|
||||
|
||||
/* search hash chain for the window */
|
||||
prev = &ro_gui_wimp_event_windows[h];
|
||||
while (*prev) {
|
||||
struct event_window *window = *prev;
|
||||
|
||||
if (window->w == w) {
|
||||
/* remove from chain */
|
||||
*prev = window->next;
|
||||
return window;
|
||||
}
|
||||
prev = &window->next;
|
||||
}
|
||||
|
||||
/* not found */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the event data associated with a given window handle
|
||||
*
|
||||
@ -989,8 +1013,10 @@ struct event_window *ro_gui_wimp_event_get_window(wimp_w w) {
|
||||
*/
|
||||
struct event_window *ro_gui_wimp_event_find_window(wimp_w w) {
|
||||
struct event_window *window;
|
||||
int h = WIN_HASH(w);
|
||||
|
||||
for (window = ro_gui_wimp_event_windows; window; window = window->next) {
|
||||
/* search hash chain for window */
|
||||
for (window = ro_gui_wimp_event_windows[h]; window; window = window->next) {
|
||||
if (window->w == w)
|
||||
return window;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user