]> Pileus Git - ~andy/gtk/commitdiff
Fix a lost refcount in the case where we get a duplicate back from the X
authorOwen Taylor <otaylor@redhat.com>
Mon, 9 Dec 2002 02:41:51 +0000 (02:41 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Mon, 9 Dec 2002 02:41:51 +0000 (02:41 +0000)
Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>

        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
        a lost refcount in the case where we get a duplicate
        back from the X server.

        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
        Set success[] for all colors when allocation of colors
        cells via XAllocColorCells succeeds.

        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
        Don't match against colors cells allocated writeable.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/x11/gdkcolor-x11.c
gdk/x11/gdkevents-x11.c
gdk/x11/gdkwindow-x11.h

index bc8d3c8767cecf61e5c57bdb75eb0b41330fb01c..a3881df714f410344a687a6aa3f6f3669146238e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
+       a lost refcount in the case where we get a duplicate
+       back from the X server.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
+       Set success[] for all colors when allocation of colors
+       cells via XAllocColorCells succeeds.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
+       Don't match against colors cells allocated writeable.
+
 Sun Dec  8 21:22:46 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private): 
index bc8d3c8767cecf61e5c57bdb75eb0b41330fb01c..a3881df714f410344a687a6aa3f6f3669146238e 100644 (file)
@@ -1,3 +1,16 @@
+Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
+       a lost refcount in the case where we get a duplicate
+       back from the X server.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
+       Set success[] for all colors when allocation of colors
+       cells via XAllocColorCells succeeds.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
+       Don't match against colors cells allocated writeable.
+
 Sun Dec  8 21:22:46 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private): 
index bc8d3c8767cecf61e5c57bdb75eb0b41330fb01c..a3881df714f410344a687a6aa3f6f3669146238e 100644 (file)
@@ -1,3 +1,16 @@
+Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
+       a lost refcount in the case where we get a duplicate
+       back from the X server.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
+       Set success[] for all colors when allocation of colors
+       cells via XAllocColorCells succeeds.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
+       Don't match against colors cells allocated writeable.
+
 Sun Dec  8 21:22:46 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private): 
index bc8d3c8767cecf61e5c57bdb75eb0b41330fb01c..a3881df714f410344a687a6aa3f6f3669146238e 100644 (file)
@@ -1,3 +1,16 @@
+Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
+       a lost refcount in the case where we get a duplicate
+       back from the X server.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
+       Set success[] for all colors when allocation of colors
+       cells via XAllocColorCells succeeds.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
+       Don't match against colors cells allocated writeable.
+
 Sun Dec  8 21:22:46 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private): 
index bc8d3c8767cecf61e5c57bdb75eb0b41330fb01c..a3881df714f410344a687a6aa3f6f3669146238e 100644 (file)
@@ -1,3 +1,16 @@
+Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
+       a lost refcount in the case where we get a duplicate
+       back from the X server.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
+       Set success[] for all colors when allocation of colors
+       cells via XAllocColorCells succeeds.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
+       Don't match against colors cells allocated writeable.
+
 Sun Dec  8 21:22:46 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private): 
index bc8d3c8767cecf61e5c57bdb75eb0b41330fb01c..a3881df714f410344a687a6aa3f6f3669146238e 100644 (file)
@@ -1,3 +1,16 @@
+Sun Dec  8 21:29:10 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc1): Fix
+       a lost refcount in the case where we get a duplicate
+       back from the X server.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_writeable):
+       Set success[] for all colors when allocation of colors
+       cells via XAllocColorCells succeeds.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private):
+       Don't match against colors cells allocated writeable.
+
 Sun Dec  8 21:22:46 2002  Owen Taylor  <otaylor@redhat.com>
 
        * gdk/x11/gdkcolor-x11.c (gdk_colormap_alloc_colors_private): 
index 53d53cce35ab8c278b145c501d4cf01970280bca..7fa8cc044ea4ca4f2f3160dd8d1810b9ead3d7bd 100644 (file)
@@ -758,6 +758,7 @@ gdk_colormap_alloc1 (GdkColormap *colormap,
            {
              XFreeColors (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap,
                           &xcolor.pixel, 1, 0);
+             private->info[ret->pixel].ref_count++;
            }
          else
            {
@@ -825,6 +826,7 @@ gdk_colormap_alloc_colors_writeable (GdkColormap *colormap,
          for (i=0; i<ncolors; i++)
            {
              colors[i].pixel = pixels[i];
+             success[i] = TRUE;
              private->info[pixels[i]].ref_count++;
              private->info[pixels[i]].flags |= GDK_COLOR_WRITEABLE;
            }
@@ -896,7 +898,7 @@ gdk_colormap_alloc_colors_private (GdkColormap *colormap,
 
       gchar *available = g_new (gchar, colormap->size);
       for (i = 0; i < colormap->size; i++)
-       available[i] = TRUE;
+       available[i] = !(private->info[i].flags & GDK_COLOR_WRITEABLE);
 
       for (i=0; i<ncolors; i++)
        {
index a97e204e95c1b8b67d216d81dd627ff19cb7cd90..9cce1afc437f6cd692a6a48090492cf9cac4381e 100644 (file)
@@ -659,6 +659,26 @@ get_real_window (XEvent *event)
     }
 }
 
+#ifdef G_ENABLE_DEBUG
+static const char notify_modes[][18] = {
+  "NotifyNormal",
+  "NotifyGrab",
+  "NotifyUngrab",
+  "NotifyWhileGrabbed"
+};
+
+static const char notify_details[][22] = {
+  "NotifyAncestor",
+  "NotifyVirtual",
+  "NotifyInferior",
+  "NotifyNonlinear",
+  "NotifyNonlinearVirtual",
+  "NotifyPointer",
+  "NotifyPointerRoot",
+  "NotifyDetailNone"
+};
+#endif
+
 static gboolean
 gdk_event_translate (GdkDisplay *display,
                     GdkEvent   *event,
@@ -1034,10 +1054,10 @@ gdk_event_translate (GdkDisplay *display,
       if (window &&
          GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
          xevent->xcrossing.detail != NotifyInferior &&
-         xevent->xcrossing.focus && !window_impl->has_focus)
+         xevent->xcrossing.focus && !window_impl->has_focus_window)
        {
          gboolean had_focus = HAS_FOCUS (window_impl);
-         
+
          window_impl->has_pointer_focus = TRUE;
 
          if (HAS_FOCUS (window_impl) != had_focus)
@@ -1129,12 +1149,12 @@ gdk_event_translate (GdkDisplay *display,
       if (window &&
          GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&
          xevent->xcrossing.detail != NotifyInferior &&
-         xevent->xcrossing.focus && !window_impl->has_focus)
+         xevent->xcrossing.focus && !window_impl->has_focus_window)
        {
          gboolean had_focus = HAS_FOCUS (window_impl);
          
          window_impl->has_pointer_focus = FALSE;
-
+         
          if (HAS_FOCUS (window_impl) != had_focus)
            generate_focus_event (window, FALSE);
        }
@@ -1207,7 +1227,10 @@ gdk_event_translate (GdkDisplay *display,
        */
     case FocusIn:
       GDK_NOTE (EVENTS,
-               g_message ("focus in:\t\twindow: %ld", xevent->xfocus.window));
+               g_message ("focus in:\t\twindow: %ld, detail: %s, mode: %s",
+                          xevent->xfocus.window,
+                          notify_details[xevent->xfocus.detail],
+                          notify_modes[xevent->xfocus.mode]));
       
       if (window && GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD)
        {
@@ -1223,6 +1246,7 @@ gdk_event_translate (GdkDisplay *display,
               * window, so we pay attention to NotifyGrab
               * NotifyUngrab, and ignore NotifyWhileGrabbed
               */
+             window_impl->has_focus_window = TRUE;
              if (xevent->xfocus.mode != NotifyWhileGrabbed)
                window_impl->has_focus = TRUE;
              break;
@@ -1246,8 +1270,11 @@ gdk_event_translate (GdkDisplay *display,
       break;
     case FocusOut:
       GDK_NOTE (EVENTS,
-               g_message ("focus out:\t\twindow: %ld", xevent->xfocus.window));
-
+               g_message ("focus out:\t\twindow: %ld, detail: %s, mode: %s",
+                          xevent->xfocus.window,
+                          notify_details[xevent->xfocus.detail],
+                          notify_modes[xevent->xfocus.mode]));
+      
       if (window && GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD)
        {
          gboolean had_focus = HAS_FOCUS (window_impl);
@@ -1258,6 +1285,7 @@ gdk_event_translate (GdkDisplay *display,
            case NotifyNonlinear:
            case NotifyVirtual:
            case NotifyNonlinearVirtual:
+             window_impl->has_focus_window = FALSE;
              if (xevent->xfocus.mode != NotifyWhileGrabbed)
                window_impl->has_focus = FALSE;
              break;
index 75556e00cb957b7e2d2aad6b87780e09b6feaf12..ccf10dde9d787786b6b37f8925d612f7474731ca 100644 (file)
@@ -73,11 +73,15 @@ struct _GdkWindowImplX11
   
   GdkXPositionInfo position_info;
 
-  /* Set if the window, or any descendent of it, has the focus
+  /* Set if the window, or any descendent of it, is the focus window
+   */
+  guint has_focus_window : 1;
+
+  /* Set if has_focus_window and the focus isn't grabbed elsewhere.
    */
   guint has_focus : 1;
 
-  /* Set if !window_has_focus, but events are being sent to the
+  /* Set if !window->has_focus_window, but events are being sent to the
    * window because the pointer is in it. (Typically, no window
    * manager is running.
    */