diff options
author | Dietmar Maurer <dietmar@src.gnome.org> | 1998-08-17 08:28:13 +0000 |
---|---|---|
committer | Dietmar Maurer <dietmar@src.gnome.org> | 1998-08-17 08:28:13 +0000 |
commit | 690a18f03288d8053a6c3f32f38b288ade30cde9 (patch) | |
tree | cbd20ea1072e71149252873d7a672a5354715f95 /gdk | |
parent | d2716f8bfd67459633f9a64e2ab1658290ee0bc0 (diff) | |
download | gtk+-690a18f03288d8053a6c3f32f38b288ade30cde9.tar.gz |
gdk.c: fixed bug in gdk_input_remove
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdk.c | 55 | ||||
-rw-r--r-- | gdk/x11/gdkmain-x11.c | 55 |
2 files changed, 66 insertions, 44 deletions
@@ -1214,7 +1214,6 @@ void gdk_input_remove (gint tag) { GList *list; - GList *temp_list; GdkInput *input; list = inputs; @@ -1227,20 +1226,9 @@ gdk_input_remove (gint tag) if (input->destroy) (input->destroy) (input->data); - temp_list = list; - - if (list->next) - list->next->prev = list->prev; - if (list->prev) - list->prev->next = list->next; - if (inputs == list) - inputs = list->next; + input->tag = 0; /* do not free it here */ + input->condition = 0; /* it's done in gdk_event_wait */ - temp_list->next = NULL; - temp_list->prev = NULL; - - g_free (temp_list->data); - g_list_free (temp_list); break; } @@ -1628,6 +1616,7 @@ static gint gdk_event_wait (void) { GList *list; + GList *temp_list; GdkInput *input; GdkInputCondition condition; SELECT_MASK readfds; @@ -1657,16 +1646,38 @@ gdk_event_wait (void) while (list) { input = list->data; - list = list->next; - if (input->condition & GDK_INPUT_READ) - FD_SET (input->source, &readfds); - if (input->condition & GDK_INPUT_WRITE) - FD_SET (input->source, &writefds); - if (input->condition & GDK_INPUT_EXCEPTION) - FD_SET (input->source, &exceptfds); + if (input->tag) + { + if (input->condition & GDK_INPUT_READ) + FD_SET (input->source, &readfds); + if (input->condition & GDK_INPUT_WRITE) + FD_SET (input->source, &writefds); + if (input->condition & GDK_INPUT_EXCEPTION) + FD_SET (input->source, &exceptfds); + + max_input = MAX (max_input, input->source); + list = list->next; + } + else /* free removed inputs */ + { + temp_list = list; + + if (list->next) + list->next->prev = list->prev; + if (list->prev) + list->prev->next = list->next; + if (inputs == list) + inputs = list->next; + + list = list->next; - max_input = MAX (max_input, input->source); + temp_list->next = NULL; + temp_list->prev = NULL; + + g_free (temp_list->data); + g_list_free (temp_list); + } } #ifdef USE_PTHREADS diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 603a77819c..9dd96da943 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -1214,7 +1214,6 @@ void gdk_input_remove (gint tag) { GList *list; - GList *temp_list; GdkInput *input; list = inputs; @@ -1227,20 +1226,9 @@ gdk_input_remove (gint tag) if (input->destroy) (input->destroy) (input->data); - temp_list = list; - - if (list->next) - list->next->prev = list->prev; - if (list->prev) - list->prev->next = list->next; - if (inputs == list) - inputs = list->next; + input->tag = 0; /* do not free it here */ + input->condition = 0; /* it's done in gdk_event_wait */ - temp_list->next = NULL; - temp_list->prev = NULL; - - g_free (temp_list->data); - g_list_free (temp_list); break; } @@ -1628,6 +1616,7 @@ static gint gdk_event_wait (void) { GList *list; + GList *temp_list; GdkInput *input; GdkInputCondition condition; SELECT_MASK readfds; @@ -1657,16 +1646,38 @@ gdk_event_wait (void) while (list) { input = list->data; - list = list->next; - if (input->condition & GDK_INPUT_READ) - FD_SET (input->source, &readfds); - if (input->condition & GDK_INPUT_WRITE) - FD_SET (input->source, &writefds); - if (input->condition & GDK_INPUT_EXCEPTION) - FD_SET (input->source, &exceptfds); + if (input->tag) + { + if (input->condition & GDK_INPUT_READ) + FD_SET (input->source, &readfds); + if (input->condition & GDK_INPUT_WRITE) + FD_SET (input->source, &writefds); + if (input->condition & GDK_INPUT_EXCEPTION) + FD_SET (input->source, &exceptfds); + + max_input = MAX (max_input, input->source); + list = list->next; + } + else /* free removed inputs */ + { + temp_list = list; + + if (list->next) + list->next->prev = list->prev; + if (list->prev) + list->prev->next = list->next; + if (inputs == list) + inputs = list->next; + + list = list->next; - max_input = MAX (max_input, input->source); + temp_list->next = NULL; + temp_list->prev = NULL; + + g_free (temp_list->data); + g_list_free (temp_list); + } } #ifdef USE_PTHREADS |