summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorDietmar Maurer <dietmar@src.gnome.org>1998-08-17 08:28:13 +0000
committerDietmar Maurer <dietmar@src.gnome.org>1998-08-17 08:28:13 +0000
commit690a18f03288d8053a6c3f32f38b288ade30cde9 (patch)
treecbd20ea1072e71149252873d7a672a5354715f95 /gdk
parentd2716f8bfd67459633f9a64e2ab1658290ee0bc0 (diff)
downloadgtk+-690a18f03288d8053a6c3f32f38b288ade30cde9.tar.gz
gdk.c: fixed bug in gdk_input_remove
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdk.c55
-rw-r--r--gdk/x11/gdkmain-x11.c55
2 files changed, 66 insertions, 44 deletions
diff --git a/gdk/gdk.c b/gdk/gdk.c
index 603a77819c..9dd96da943 100644
--- a/gdk/gdk.c
+++ b/gdk/gdk.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
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