+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):
+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):
+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):
+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):
+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):
+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):
{
XFreeColors (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap,
&xcolor.pixel, 1, 0);
+ private->info[ret->pixel].ref_count++;
}
else
{
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;
}
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++)
{
}
}
+#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,
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)
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);
}
*/
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)
{
* 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;
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);
case NotifyNonlinear:
case NotifyVirtual:
case NotifyNonlinearVirtual:
+ window_impl->has_focus_window = FALSE;
if (xevent->xfocus.mode != NotifyWhileGrabbed)
window_impl->has_focus = FALSE;
break;
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.
*/