summaryrefslogtreecommitdiff
path: root/gdk/gdkfont.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>1998-12-09 06:36:57 +0000
committerOwen Taylor <otaylor@src.gnome.org>1998-12-09 06:36:57 +0000
commit207757e70d8b2d9aa8335d968fd7ac79796264ab (patch)
treeae572a9674c8dc7b8a0ae7200e6d4e7c5c7632e8 /gdk/gdkfont.c
parentaf84227184f9cbe2c87f0aa09d5c93564150bb70 (diff)
downloadgtk+-207757e70d8b2d9aa8335d968fd7ac79796264ab.tar.gz
Destroy widgets _after_ propagating unrealize signals through the widget
Mon Dec 7 10:27:09 1998 Owen Taylor <otaylor@redhat.com> * gtk/gtkwidget.c: Destroy widgets _after_ propagating unrealize signals through the widget heirarchy. This is unpleasant, as it causes more X traffic, but is necessary, because we have to clean up our Input Contexts before destroying the X windows. (from matsu-981109-0.patch) Mon Dec 7 10:18:18 1998 Owen Taylor <otaylor@redhat.com> Applied gtk-a-higuti-981202-0 : [ a-higuti@math.sci.hokudai.ac.jp (Akira Higuchi) ] * gdk/gdk.h gdk/gdk.c (gdk_mbstowcs): New function. Nearly equals to mbstowcs, but implemented by a combination of Xlib functions, so it works even with X_LOCALE. (gdk_wcstombs): New function. (g_mbtowc): Removed. No longer needed. * gdk/gdk.h gdk/gdkfont.c gdk/gdkdraw.c: Added _wc() variants to gdk_text_width(), gdk_char_width(), gdk_draw_text(), * gdk/gdki18n.h (mblen, mbtowc, wctomb, mbstowcs, wcstombs, wcslen, wcscpy, wcsncpy): Removed. No longer needed. (iswalnum): Removed. (gdk_iswalnum): New macro. (gdk_iswspace): New macro. * gdk/gdktype.h (GdkWChar): New typedef. * gtk/gtkentry.h, gtk/gtkentry.c There are many changes according to the change of the internal representation of text, from multibyte string to wide characters. * gtk/gtkprivate.h, gtk/gtkmain.c Removed the variable gtk_use_mb and related codes. * gtk/gtkspinbutton.c Some changes according to the change of type of entry->text. * gtk/gtktext.h, gtk/gtktext.c Changed the internal representation of text. We use GdkWchar if a fontset is supplied. If not, we use guchar to save memory.
Diffstat (limited to 'gdk/gdkfont.c')
-rw-r--r--gdk/gdkfont.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/gdk/gdkfont.c b/gdk/gdkfont.c
index cc1274a0d6..0308fa8e0d 100644
--- a/gdk/gdkfont.c
+++ b/gdk/gdkfont.c
@@ -271,6 +271,62 @@ gdk_text_width (GdkFont *font,
return width;
}
+gint
+gdk_text_width_wc (GdkFont *font,
+ const GdkWChar *text,
+ gint text_length)
+{
+ GdkFontPrivate *private;
+ gint width;
+ XFontStruct *xfont;
+ XFontSet fontset;
+
+ g_return_val_if_fail (font != NULL, -1);
+ g_return_val_if_fail (text != NULL, -1);
+
+ private = (GdkFontPrivate*) font;
+
+ switch (font->type)
+ {
+ case GDK_FONT_FONT:
+ xfont = (XFontStruct *) private->xfont;
+ if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0))
+ {
+ gchar *text_8bit;
+ gint i;
+ text_8bit = g_new (gchar, text_length);
+ for (i=0; i<text_length; i++) text_8bit[i] = text[i];
+ width = XTextWidth (xfont, text_8bit, text_length);
+ g_free (text_8bit);
+ }
+ else
+ {
+ width = 0;
+ }
+ break;
+ case GDK_FONT_FONTSET:
+ if (sizeof(GdkWChar) == sizeof(wchar_t))
+ {
+ fontset = (XFontSet) private->xfont;
+ width = XwcTextEscapement (fontset, (wchar_t *)text, text_length);
+ }
+ else
+ {
+ wchar_t *text_wchar;
+ gint i;
+ fontset = (XFontSet) private->xfont;
+ text_wchar = g_new(wchar_t, text_length);
+ for (i=0; i<text_length; i++) text_wchar[i] = text[i];
+ width = XwcTextEscapement (fontset, text_wchar, text_length);
+ g_free (text_wchar);
+ }
+ break;
+ default:
+ width = 0;
+ }
+ return width;
+}
+
/* Problem: What if a character is a 16 bits character ?? */
gint
gdk_char_width (GdkFont *font,
@@ -319,6 +375,56 @@ gdk_char_width (GdkFont *font,
}
gint
+gdk_char_width_wc (GdkFont *font,
+ GdkWChar character)
+{
+ GdkFontPrivate *private;
+ XCharStruct *chars;
+ gint width;
+ guint ch = character & 0xff; /* get rid of sign-extension */
+ XFontStruct *xfont;
+ XFontSet fontset;
+
+ g_return_val_if_fail (font != NULL, -1);
+
+ private = (GdkFontPrivate*) font;
+
+ switch (font->type)
+ {
+ case GDK_FONT_FONT:
+ /* only 8 bits characters are considered here */
+ xfont = (XFontStruct *) private->xfont;
+ if ((xfont->min_byte1 == 0) &&
+ (xfont->max_byte1 == 0) &&
+ (ch >= xfont->min_char_or_byte2) &&
+ (ch <= xfont->max_char_or_byte2))
+ {
+ chars = xfont->per_char;
+ if (chars)
+ width = chars[ch - xfont->min_char_or_byte2].width;
+ else
+ width = xfont->min_bounds.width;
+ }
+ else
+ {
+ char ch2 = character;
+ width = XTextWidth (xfont, &ch2, 1);
+ }
+ break;
+ case GDK_FONT_FONTSET:
+ fontset = (XFontSet) private->xfont;
+ {
+ wchar_t char_wc = character;
+ width = XwcTextEscapement (fontset, &char_wc, 1) ;
+ }
+ break;
+ default:
+ width = 0;
+ }
+ return width;
+}
+
+gint
gdk_string_measure (GdkFont *font,
const gchar *string)
{