diff options
author | Owen Taylor <otaylor@redhat.com> | 1998-12-09 06:36:57 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1998-12-09 06:36:57 +0000 |
commit | 207757e70d8b2d9aa8335d968fd7ac79796264ab (patch) | |
tree | ae572a9674c8dc7b8a0ae7200e6d4e7c5c7632e8 /gdk/gdkfont.c | |
parent | af84227184f9cbe2c87f0aa09d5c93564150bb70 (diff) | |
download | gtk+-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.c | 106 |
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) { |