]> Pileus Git - ~andy/gtk/commitdiff
gdk.c: fixed bug in gdk_input_remove
authorDietmar Maurer <dietmar@src.gnome.org>
Mon, 17 Aug 1998 08:28:13 +0000 (08:28 +0000)
committerDietmar Maurer <dietmar@src.gnome.org>
Mon, 17 Aug 1998 08:28:13 +0000 (08:28 +0000)
gdk/gdk.c
gdk/x11/gdkmain-x11.c

index 603a77819cbc804b44cb1fb1aecee8c094c727b5..9dd96da9438f9450aa1c488047a0b95a49c60c4f 100644 (file)
--- 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
index 603a77819cbc804b44cb1fb1aecee8c094c727b5..9dd96da9438f9450aa1c488047a0b95a49c60c4f 100644 (file)
@@ -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