Add two virtualized functions gdk_drawable_get_clip_region - to get the

Thu Dec 14 20:22:31 2000  Owen Taylor  <otaylor@redhat.com>

        * gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
	Add two virtualized functions gdk_drawable_get_clip_region - to
	get the clip region when drawing.

	* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
	use invalidate_region.

	* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
	region.

	* acconfig.h configure.in: Check for Xft. For now, assume
	that if Xft is found, Pango was compiled with Xft support
	as well.

	* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
	gdk_colormap_query_color().

	* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
	with Xft if appropriate.

	* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
	a pangoxft context if we have XFT and the environment
	variable GD_USE_XFT is set.

	* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
	and also possibly an XftDraw structure.

        * gtk/gtkfontsel.c: Handle the case where the font from the
	style doesn't match any of the fonts a bit better.

	* gtk/testgtk.c: Add tabs between directional segments for
	hebrew/arabic test. (Not really necessary, just a little
	prettier.)
This commit is contained in:
Owen Taylor 2000-12-15 01:46:41 +00:00 • committed by Owen Taylor
commit 6e5a269f38
26 changed files with 649 additions and 128 deletions

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -1,3 +1,39 @@
Thu Dec 14 20:22:31 2000 Owen Taylor <otaylor@redhat.com>
* gdk/{gdkdrawable.[ch],gdkpixmap.c,gdkwindow.c,x11/gdkwindow.c}:
Add two virtualized functions gdk_drawable_get_clip_region - to
get the clip region when drawing.
* gdk/gdkwindow.c (gdk_window_invalidate_rect): Rewrite to simple
use invalidate_region.
* gdk/gdkwindow.c (gdk_window_invalidate_region): Clip to visible
region.
* acconfig.h configure.in: Check for Xft. For now, assume
that if Xft is found, Pango was compiled with Xft support
as well.
* gdk/gdkcolor.h gdk/x11/gdkcolor-x11.c: Add
gdk_colormap_query_color().
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_glyphs): Draw
with Xft if appropriate.
* gdk/x11/gdkpango-x11.c (gdk_pango_context_get): Create
a pangoxft context if we have XFT and the environment
variable GD_USE_XFT is set.
* gdk/x11/gdkx.h (struct _GdkGCX11): Cache the fg_pixel
and also possibly an XftDraw structure.
* gtk/gtkfontsel.c: Handle the case where the font from the
style doesn't match any of the fonts a bit better.
* gtk/testgtk.c: Add tabs between directional segments for
hebrew/arabic test. (Not really necessary, just a little
prettier.)
2000-12-14 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c (fill_file_buffer): fix unicode validation when

View file

@ -32,6 +32,7 @@
#undef HAVE_SYS_SELECT_H
#undef HAVE_SYS_TIME_H
#undef HAVE_XCONVERTCASE
#undef HAVE_XFT
#undef NO_FD_SET

View file

@ -398,6 +398,22 @@ if test "x$gdktarget" = "xx11"; then
,
$x_libs)
#
# Checks for Xft/XRender
#
have_xft=false
XFT_LIBS=""
AC_CHECK_LIB(Xrender, XRenderFindFormat,
AC_CHECK_LIB(Xft, XftFontOpen, have_xft=true, :, -lXrender $X_LIBS)
,:,-lXext $X_LIBS)
if $have_xft = 'true' ; then
X_LIBS="-lXft -lXrender -lXext $X_LIBS"
fi
AC_DEFINE(HAVE_XFT)
AM_CONDITIONAL(HAVE_XFT, $have_xft)
# Check for XIM support.
AC_CHECK_LIB(X11, XUnregisterIMInstantiateCallback,
@ -562,6 +578,9 @@ fi
if test "x$gdktarget" = "xx11"; then
PANGO_CFLAGS="`$PANGO_CONFIG --cflags pangox`"
PANGO_LIBS="`$PANGO_CONFIG --libs pangox`"
if $have_xft = true ; then
PANGO_LIBS="$PANGO_LIBS -lpangoxft"
fi
else
PANGO_CFLAGS="`$PANGO_CONFIG --cflags pango`"
PANGO_LIBS="`$PANGO_CONFIG --libs pango`"

View file

@ -82,6 +82,9 @@ gboolean gdk_colormap_alloc_color (GdkColormap *colormap,
void gdk_colormap_free_colors (GdkColormap *colormap,
GdkColor *colors,
gint ncolors);
void gdk_colormap_query_color (GdkColormap *colormap,
gulong pixel,
GdkColor *result);
GdkVisual *gdk_colormap_get_visual (GdkColormap *colormap);

View file

@ -29,12 +29,13 @@
#include "gdkwindow.h"
static GdkDrawable* gdk_drawable_real_get_composite_drawable (GdkDrawable *drawable,
gint x,
gint y,
gint width,
gint height,
gint *composite_x_offset,
gint *composite_y_offset);
gint x,
gint y,
gint width,
gint height,
gint *composite_x_offset,
gint *composite_y_offset);
static GdkRegion * gdk_drawable_real_get_visible_region (GdkDrawable *drawable);
static void gdk_drawable_class_init (GdkDrawableClass *klass);
@ -70,6 +71,9 @@ static void
gdk_drawable_class_init (GdkDrawableClass *klass)
{
klass->get_composite_drawable = gdk_drawable_real_get_composite_drawable;
/* Default implementation for clip and visible region is the same */
klass->get_clip_region = gdk_drawable_real_get_visible_region;
klass->get_visible_region = gdk_drawable_real_get_visible_region;
}
/* Manipulation of drawables
@ -525,3 +529,58 @@ gdk_drawable_real_get_composite_drawable (GdkDrawable *drawable,
return GDK_DRAWABLE (g_object_ref (G_OBJECT (drawable)));
}
/**
* gdk_drawable_get_clip_region:
* @drawable: a #GdkDrawable
*
* Computes the region of a drawable that potentially can be written
* to by drawing primitives. This region will not take into account
* the clip region for the GC, and may also not take into account
* other factors such as if the window is obscured by other windows,
* but no area outside of this region will be affected by drawing
* primitives.
*
* Return value: a #GdkRegion. This must be freed with gdk_region_destroy()
* when you are done.
**/
GdkRegion *
gdk_drawable_get_clip_region (GdkDrawable *drawable)
{
g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
return GDK_DRAWABLE_GET_CLASS (drawable)->get_clip_region (drawable);
}
/**
* gdk_drawable_get_visible_region:
* @drawable:
*
* Computes the region of a drawable that is potentially visible.
* This does not necessarily take into account if the window is
* obscured by other windows, but no area outside of this region
* is visible.
*
* Return value: a #GdkRegion. This must be freed with gdk_region_destroy()
* when you are done.
**/
GdkRegion *
gdk_drawable_get_visible_region (GdkDrawable *drawable)
{
g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL);
return GDK_DRAWABLE_GET_CLASS (drawable)->get_visible_region (drawable);
}
static GdkRegion *
gdk_drawable_real_get_visible_region (GdkDrawable *drawable)
{
GdkRectangle rect;
rect.x = 0;
rect.y = 0;
gdk_drawable_get_size (drawable, &rect.width, &rect.height);
return gdk_region_rectangle (&rect);
}

View file

@ -120,6 +120,9 @@ struct _GdkDrawableClass
gint width,
gint height);
GdkRegion* (*get_clip_region) (GdkDrawable *drawable);
GdkRegion* (*get_visible_region) (GdkDrawable *drawable);
GdkDrawable* (*get_composite_drawable) (GdkDrawable *drawable,
gint x,
gint y,
@ -260,6 +263,9 @@ GdkImage* gdk_drawable_get_image (GdkDrawable *drawable,
gint width,
gint height);
GdkRegion *gdk_drawable_get_clip_region (GdkDrawable *drawable);
GdkRegion *gdk_drawable_get_visible_region (GdkDrawable *drawable);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View file

@ -107,12 +107,11 @@ static void gdk_pixmap_real_get_size (GdkDrawable *drawable,
gint *width,
gint *height);
static GdkImage* gdk_pixmap_get_image (GdkDrawable *drawable,
gint x,
gint y,
gint width,
gint height);
static GdkImage* gdk_pixmap_get_image (GdkDrawable *drawable,
gint x,
gint y,
gint width,
gint height);
static GdkVisual* gdk_pixmap_real_get_visual (GdkDrawable *drawable);
static gint gdk_pixmap_real_get_depth (GdkDrawable *drawable);

View file

@ -136,12 +136,14 @@ static void gdk_window_real_set_colormap (GdkDrawable *drawable,
static GdkColormap* gdk_window_real_get_colormap (GdkDrawable *drawable);
static GdkDrawable* gdk_window_get_composite_drawable (GdkDrawable *drawable,
gint x,
gint y,
gint width,
gint height,
gint *composite_x_offset,
gint *composite_y_offset);
gint x,
gint y,
gint width,
gint height,
gint *composite_x_offset,
gint *composite_y_offset);
static GdkRegion* gdk_window_get_clip_region (GdkDrawable *drawable);
static GdkRegion* gdk_window_get_visible_region (GdkDrawable *drawable);
static void gdk_window_free_paint_stack (GdkWindow *window);
@ -217,6 +219,8 @@ gdk_window_class_init (GdkWindowObjectClass *klass)
drawable_class->get_colormap = gdk_window_real_get_colormap;
drawable_class->get_visual = gdk_window_real_get_visual;
drawable_class->get_image = gdk_window_get_image;
drawable_class->get_clip_region = gdk_window_get_clip_region;
drawable_class->get_visible_region = gdk_window_get_visible_region;
drawable_class->get_composite_drawable = gdk_window_get_composite_drawable;
}
@ -1207,6 +1211,41 @@ gdk_window_get_composite_drawable (GdkDrawable *window,
return tmp_pixmap;
}
static GdkRegion*
gdk_window_get_clip_region (GdkDrawable *drawable)
{
GdkWindowObject *private = (GdkWindowObject *)drawable;
GdkRegion *result;
result = gdk_drawable_get_clip_region (private->impl);
if (private->paint_stack)
{
GdkRegion *paint_region = gdk_region_new ();
GSList *tmp_list = private->paint_stack;
while (tmp_list)
{
GdkWindowPaint *paint = tmp_list->data;
gdk_region_union (paint_region, paint->region);
}
gdk_region_intersect (result, paint_region);
gdk_region_destroy (paint_region);
}
return result;
}
static GdkRegion*
gdk_window_get_visible_region (GdkDrawable *drawable)
{
GdkWindowObject *private = (GdkWindowObject*) drawable;
return gdk_drawable_get_visible_region (private->impl);
}
static void
gdk_window_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
@ -1710,6 +1749,7 @@ gdk_window_invalidate_rect (GdkWindow *window,
gboolean invalidate_children)
{
GdkRectangle window_rect;
GdkRegion *region;
GdkWindowObject *private = (GdkWindowObject *)window;
g_return_if_fail (window != NULL);
@ -1730,55 +1770,10 @@ gdk_window_invalidate_rect (GdkWindow *window,
&window_rect.height);
rect = &window_rect;
}
if (private->update_area)
{
gdk_region_union_with_rect (private->update_area, rect);
}
else
{
update_windows = g_slist_prepend (update_windows, window);
private->update_area = gdk_region_rectangle (rect);
if (!private->update_freeze_count && !update_idle)
update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
gdk_window_update_idle, NULL, NULL);
}
if (invalidate_children)
{
GList *tmp_list;
GdkRectangle child_rect, new_rect;
tmp_list = private->children;
while (tmp_list)
{
GdkWindowObject *child = tmp_list->data;
tmp_list = tmp_list->next;
if (!child->input_only)
{
gint width, height;
gdk_drawable_get_size (GDK_DRAWABLE (child),
&width, &height);
child_rect.x = child->x;
child_rect.y = child->y;
child_rect.width = width;
child_rect.height = height;
if (gdk_rectangle_intersect (rect, &child_rect, &new_rect))
{
new_rect.x -= child_rect.x;
new_rect.y -= child_rect.y;
gdk_window_invalidate_rect ((GdkWindow *)child, &new_rect, TRUE);
}
}
}
}
region = gdk_region_rectangle (rect);
gdk_window_invalidate_region (window, region, invalidate_children);
gdk_region_destroy (region);
}
void
@ -1787,6 +1782,7 @@ gdk_window_invalidate_region (GdkWindow *window,
gboolean invalidate_children)
{
GdkWindowObject *private = (GdkWindowObject *)window;
GdkRegion *visible_region;
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
@ -1796,55 +1792,51 @@ gdk_window_invalidate_region (GdkWindow *window,
if (private->input_only || !private->mapped)
return;
if (private->update_area)
{
gdk_region_union (private->update_area, region);
}
else
{
update_windows = g_slist_prepend (update_windows, window);
private->update_area = gdk_region_copy (region);
if (!private->update_freeze_count && !update_idle)
update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
gdk_window_update_idle, NULL, NULL);
}
visible_region = gdk_drawable_get_visible_region (window);
gdk_region_intersect (visible_region, region);
if (invalidate_children)
if (!gdk_region_empty (region))
{
GList *tmp_list;
GdkRectangle child_rect;
GdkRegion *child_region;
tmp_list = private->children;
while (tmp_list)
if (private->update_area)
{
GdkWindowObject *child = tmp_list->data;
tmp_list = tmp_list->next;
if (!child->input_only)
gdk_region_union (private->update_area, region);
}
else
{
update_windows = g_slist_prepend (update_windows, window);
private->update_area = gdk_region_copy (region);
if (!private->update_freeze_count && !update_idle)
update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
gdk_window_update_idle, NULL, NULL);
}
if (invalidate_children)
{
GList *tmp_list;
tmp_list = private->children;
while (tmp_list)
{
gint width, height;
gdk_drawable_get_size (GDK_DRAWABLE (child),
&width, &height);
child_rect.x = child->x;
child_rect.y = child->y;
child_rect.width = width;
child_rect.height = height;
GdkWindowObject *child = tmp_list->data;
tmp_list = tmp_list->next;
child_region = gdk_region_rectangle (&child_rect);
gdk_region_intersect (child_region, region);
if (!gdk_region_empty (child_region))
if (!child->input_only)
{
gdk_region_offset (child_region, - child_rect.x, - child_rect.y);
GdkRegion *child_region;
gint x, y;
gdk_window_get_position ((GdkWindow *)child, &x, &y);
/* This copy could be saved with a little more complexity */
child_region = gdk_region_copy (region);
gdk_region_offset (child_region, -x, -y);
gdk_window_invalidate_region ((GdkWindow *)child, child_region, TRUE);
gdk_region_destroy (child_region);
}
gdk_region_destroy (child_region);
}
}
}

View file

@ -963,6 +963,47 @@ gdk_colormap_alloc_colors (GdkColormap *colormap,
return nremaining;
}
void
gdk_colormap_query_color (GdkColormap *colormap,
gulong pixel,
GdkColor *result)
{
XColor xcolor;
GdkVisual *visual;
g_return_if_fail (GDK_IS_COLORMAP (colormap));
visual = gdk_colormap_get_visual (colormap);
switch (visual->type) {
case GDK_VISUAL_DIRECT_COLOR:
case GDK_VISUAL_TRUE_COLOR:
result->red = 65535. * (double)((pixel & visual->red_mask) >> visual->red_shift) / ((1 << visual->red_prec) - 1);
result->green = 65535. * (double)((pixel & visual->green_mask) >> visual->green_shift) / ((1 << visual->green_prec) - 1);
result->blue = 65535. * (double)((pixel & visual->blue_mask) >> visual->blue_shift) / ((1 << visual->blue_prec) - 1);
break;
case GDK_VISUAL_STATIC_GRAY:
case GDK_VISUAL_GRAYSCALE:
result->red = result->green = result->blue = 65535. * (double)pixel/((1<<visual->depth) - 1);
break;
case GDK_VISUAL_STATIC_COLOR:
xcolor.pixel = pixel;
XQueryColor (GDK_DISPLAY (), GDK_COLORMAP_XCOLORMAP (colormap), &xcolor);
result->red = xcolor.red;
result->green = xcolor.green;
result->blue = xcolor.blue;
break;
case GDK_VISUAL_PSEUDO_COLOR:
result->red = colormap->colors[pixel].red;
result->green = colormap->colors[pixel].green;
result->blue = colormap->colors[pixel].blue;
break;
default:
g_assert_not_reached ();
break;
}
}
gboolean
gdk_color_change (GdkColormap *colormap,
GdkColor *color)

View file

@ -25,9 +25,15 @@
*/
#include "gdkprivate-x11.h"
#include "gdkregion-generic.h"
#include <pango/pangox.h>
#include <config.h>
#if HAVE_XFT
#include <pango/pangoxft.h>
#endif
#include <stdlib.h>
#if defined (HAVE_IPC_H) && defined (HAVE_SHM_H) && defined (HAVE_XSHM_H)
@ -564,6 +570,40 @@ gdk_x11_draw_lines (GdkDrawable *drawable,
g_free (tmp_points);
}
#if HAVE_XFT
static void
update_xft_draw_clip (GdkGC *gc)
{
GdkGCX11 *private = GDK_GC_X11 (gc);
int i;
if (private->xft_draw)
{
if (private->clip_region)
{
GdkRegionBox *boxes = private->clip_region->rects;
Region region = XCreateRegion ();
for (i=0; i<private->clip_region->numRects; i++)
{
XRectangle rect;
rect.x = CLAMP (boxes[i].x1 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT);
rect.y = CLAMP (boxes[i].y1 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT);
rect.width = CLAMP (boxes[i].x2 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT) - rect.x;
rect.height = CLAMP (boxes[i].y2 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT) - rect.y;
XUnionRectWithRegion (&rect, region, region);
}
XftDrawSetClip (private->xft_draw, region);
XDestroyRegion (region);
}
else
XftDrawSetClip (private->xft_draw, NULL);
}
}
#endif
static void
gdk_x11_draw_glyphs (GdkDrawable *drawable,
GdkGC *gc,
@ -576,10 +616,49 @@ gdk_x11_draw_glyphs (GdkDrawable *drawable,
impl = GDK_DRAWABLE_IMPL_X11 (drawable);
pango_x_render (impl->xdisplay,
impl->xid,
GDK_GC_GET_XGC (gc),
font, glyphs, x, y);
#if HAVE_XFT
if (PANGO_XFT_IS_FONT (font))
{
GdkGCX11 *gc_x11 = GDK_GC_X11 (gc);
XftColor xft_color;
GdkColormap *cmap;
GdkColor color;
cmap = gdk_gc_get_colormap (gc);
_gdk_x11_gc_flush (gc);
if (!gc_x11->xft_draw)
{
gc_x11->xft_draw = XftDrawCreate (impl->xdisplay,
impl->xid,
GDK_VISUAL_XVISUAL (gdk_colormap_get_visual (cmap)),
GDK_COLORMAP_XCOLORMAP (cmap));
update_xft_draw_clip (gc);
}
else
{
XftDrawChange (gc_x11->xft_draw, impl->xid);
update_xft_draw_clip (gc);
}
gdk_colormap_query_color (cmap, gc_x11->fg_pixel, &color);
xft_color.color.red = color.red;
xft_color.color.green = color.green;
xft_color.color.blue = color.blue;
xft_color.color.alpha = 0xffff;
pango_xft_render (gc_x11->xft_draw, &xft_color,
font, glyphs, x, y);
}
else
#endif /* !HAVE_XFT */
pango_x_render (impl->xdisplay,
impl->xid,
GDK_GC_GET_XGC (gc),
font, glyphs, x, y);
}
static void

View file

@ -24,8 +24,14 @@
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include <config.h>
#if HAVE_XFT
#include <pango/pangoxft.h>
#endif
#include "gdkgc.h"
#include "gdkx.h"
#include "gdkprivate-x11.h"
#include "gdkregion-generic.h"
#include <string.h>
@ -107,6 +113,11 @@ gdk_gc_x11_finalize (GObject *object)
gdk_region_destroy (x11_gc->clip_region);
XFreeGC (GDK_GC_XDISPLAY (x11_gc), GDK_GC_XGC (x11_gc));
#if HAVE_XFT
if (x11_gc->xft_draw)
XftDrawDestroy (x11_gc->xft_draw);
#endif
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -148,6 +159,9 @@ _gdk_x11_gc_new (GdkDrawable *drawable,
private->dirty_mask |= GDK_GC_DIRTY_TS;
}
if (values_mask & GDK_GC_FOREGROUND)
private->fg_pixel = values->foreground.pixel;
xvalues.function = GXcopy;
xvalues.fill_style = FillSolid;
xvalues.arc_mode = ArcPieSlice;
@ -386,6 +400,9 @@ gdk_x11_gc_set_values (GdkGC *gc,
}
}
if (values_mask & GDK_GC_FOREGROUND)
x11_gc->fg_pixel = values->foreground.pixel;
gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask);
XChangeGC (GDK_GC_XDISPLAY (gc),
@ -717,4 +734,5 @@ gdk_gc_copy (GdkGC *dst_gc, GdkGC *src_gc)
x11_dst_gc->clip_region = NULL;
x11_dst_gc->dirty_mask = x11_src_gc->dirty_mask;
x11_dst_gc->fg_pixel = x11_src_gc->fg_pixel;
}

View file

@ -382,7 +382,7 @@ _gdk_window_move_resize_child (GdkWindow *window,
}
static void
gdk_window_compute_position (GdkWindowImplX11 *window,
gdk_window_compute_position (GdkWindowImplX11 *window,
GdkWindowParentPos *parent_pos,
GdkXPositionInfo *info)
{

View file

@ -257,6 +257,8 @@ gdk_x11_convert_grab_status (gint status)
}
g_assert_not_reached();
return 0;
}
/*

View file

@ -17,12 +17,31 @@
* Boston, MA 02111-1307, USA.
*/
#include <config.h>
#include <stdlib.h>
#include "gdkprivate-x11.h"
#include "gdkpango.h"
#include <pango/pangox.h>
#ifdef HAVE_XFT
#include <pango/pangoxft.h>
#endif
PangoContext *
gdk_pango_context_get (void)
{
return pango_x_get_context (GDK_DISPLAY ());
#ifdef HAVE_XFT
static gint use_xft = -1;
if (use_xft == -1)
{
char *val = g_getenv ("GDK_USE_XFT");
use_xft = val && (atoi (val) != 0);
}
if (use_xft)
return pango_xft_get_context (GDK_DISPLAY (), DefaultScreen (GDK_DISPLAY ()));
else
#endif /* HAVE_XFT */
return pango_x_get_context (GDK_DISPLAY ());
}

View file

@ -43,9 +43,11 @@ gint gdk_send_xevent (Window window,
gboolean propagate,
glong event_mask,
XEvent *event_send);
GdkGC * _gdk_x11_gc_new (GdkDrawable *drawable,
GdkGCValues *values,
GdkGCValuesMask values_mask);
GdkGC *_gdk_x11_gc_new (GdkDrawable *drawable,
GdkGCValues *values,
GdkGCValuesMask values_mask);
GdkColormap * gdk_colormap_lookup (Colormap xcolormap);
GdkVisual * gdk_visual_lookup (Visual *xvisual);

View file

@ -83,10 +83,11 @@ static gboolean gdk_window_icon_name_set (GdkWindow *window);
static GdkColormap* gdk_window_impl_x11_get_colormap (GdkDrawable *drawable);
static void gdk_window_impl_x11_set_colormap (GdkDrawable *drawable,
GdkColormap *cmap);
static void gdk_window_impl_x11_get_size (GdkDrawable *drawable,
gint *width,
gint *height);
GdkColormap *cmap);
static void gdk_window_impl_x11_get_size (GdkDrawable *drawable,
gint *width,
gint *height);
static GdkRegion* gdk_window_impl_x11_get_visible_region (GdkDrawable *drawable);
static void gdk_window_impl_x11_init (GdkWindowImplX11 *window);
static void gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass);
static void gdk_window_impl_x11_finalize (GObject *object);
@ -147,6 +148,10 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
drawable_class->set_colormap = gdk_window_impl_x11_set_colormap;
drawable_class->get_colormap = gdk_window_impl_x11_get_colormap;
drawable_class->get_size = gdk_window_impl_x11_get_size;
/* Visible and clip regions are the same */
drawable_class->get_clip_region = gdk_window_impl_x11_get_visible_region;
drawable_class->get_visible_region = gdk_window_impl_x11_get_visible_region;
}
static void
@ -235,6 +240,22 @@ gdk_window_impl_x11_get_size (GdkDrawable *drawable,
*height = GDK_WINDOW_IMPL_X11 (drawable)->height;
}
static GdkRegion*
gdk_window_impl_x11_get_visible_region (GdkDrawable *drawable)
{
GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (drawable);
GdkRectangle result_rect;
result_rect.x = 0;
result_rect.y = 0;
result_rect.width = impl->width;
result_rect.height = impl->height;
gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
return gdk_region_rectangle (&result_rect);
}
void
_gdk_windowing_window_init (void)
{

View file

@ -36,7 +36,6 @@
#include <gdk/x11/gdkwindow-x11.h>
#include <gdk/x11/gdkpixmap-x11.h>
typedef struct _GdkGCXData GdkGCXData;
typedef struct _GdkColormapPrivateX11 GdkColormapPrivateX11;
typedef struct _GdkCursorPrivate GdkCursorPrivate;
typedef struct _GdkFontPrivateX GdkFontPrivateX;
@ -120,6 +119,12 @@ struct _GdkGCX11
Display *xdisplay;
GdkRegion *clip_region;
guint dirty_mask;
/* We can't conditionalize on HAVE_XFT here, so we simply always
* have this here as a gpointer.
*/
gpointer xft_draw;
gulong fg_pixel;
};
struct _GdkGCX11Class

View file

@ -559,7 +559,7 @@ gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
{
PangoFontDescription **descs;
int n_descs, i;
gint match_row = 0;
gint match_row = -1;
gchar *str;
pango_context_list_fonts (gtk_widget_get_pango_context (GTK_WIDGET (fontsel)),
@ -590,8 +590,11 @@ gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
}
gtk_clist_select_row (GTK_CLIST (fontsel->font_style_clist), match_row, 0);
gtk_clist_get_text (GTK_CLIST (fontsel->font_style_clist), match_row, 0, &str);
gtk_entry_set_text (GTK_ENTRY (fontsel->font_style_entry), str);
if (match_row >= 0)
{
gtk_clist_get_text (GTK_CLIST (fontsel->font_style_clist), match_row, 0, &str);
gtk_entry_set_text (GTK_ENTRY (fontsel->font_style_entry), str);
}
gtk_clist_thaw (GTK_CLIST(fontsel->font_style_clist));

View file

@ -2057,8 +2057,8 @@ void create_labels (void)
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
frame = gtk_frame_new ("Bidirection Label");
label = gtk_label_new ("Arabic السلام عليكم\n"
"Hebrew שלום");
label = gtk_label_new ("Arabic السلام عليكم\n"
"Hebrew שלום");
gtk_widget_set_direction (label, GTK_TEXT_DIR_RTL);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
gtk_container_add (GTK_CONTAINER (frame), label);

View file

@ -2057,8 +2057,8 @@ void create_labels (void)
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
frame = gtk_frame_new ("Bidirection Label");
label = gtk_label_new ("Arabic السلام عليكم\n"
"Hebrew שלום");
label = gtk_label_new ("Arabic السلام عليكم\n"
"Hebrew שלום");
gtk_widget_set_direction (label, GTK_TEXT_DIR_RTL);
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
gtk_container_add (GTK_CONTAINER (frame), label);