From a0ca2a7b0d905c7aa4eba64d213853afa3e87e33 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Fri, 13 Nov 1998 21:28:36 +0000 Subject: [PATCH] New function gdk_pixmap_foreign_new(). (gtk-blizzard-981005-0. Christopher Fri Nov 13 11:22:38 1998 Owen Taylor * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). (gtk-blizzard-981005-0. Christopher Blizzard * gtk/Makefile.am: Added rules to generate an empty GTK+ theme called "Default" upon installation. * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance of fonts and fontsets. (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) * gtk/gtkmain.c: Change test to detect glibc's utf8 based mb* functions to be more specific. * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation cleanups. --- ChangeLog | 24 +++++++++++++++++++++ ChangeLog.pre-2-0 | 24 +++++++++++++++++++++ ChangeLog.pre-2-10 | 24 +++++++++++++++++++++ ChangeLog.pre-2-2 | 24 +++++++++++++++++++++ ChangeLog.pre-2-4 | 24 +++++++++++++++++++++ ChangeLog.pre-2-6 | 24 +++++++++++++++++++++ ChangeLog.pre-2-8 | 24 +++++++++++++++++++++ gdk/gdk.h | 1 - gdk/gdkpixmap.c | 47 +++++++++++++++++++++++++++++++++++++++++ gdk/gdktypes.h | 1 + gdk/gdkx.h | 3 +++ gdk/x11/gdkpixmap-x11.c | 47 +++++++++++++++++++++++++++++++++++++++++ gdk/x11/gdkx.h | 3 +++ gtk/Makefile.am | 10 +++++++++ gtk/gtkmain.c | 27 ++++++++++++++++------- gtk/gtkrc.c | 10 +++++---- gtk/testgtkrc | 4 ++-- tests/testgtkrc | 4 ++-- 18 files changed, 308 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index e918ae30e..4e6e0e9b7 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,27 @@ +Fri Nov 13 11:22:38 1998 Owen Taylor + + * gdk/gdkpixmap.c: New function gdk_pixmap_foreign_new(). + (gtk-blizzard-981005-0. + Christopher Blizzard + + * gtk/Makefile.am: Added rules to generate an empty + GTK+ theme called "Default" upon installation. + + * gtk/gtkrc.c (gtk_rc_parse_style): Fix inheritance + of fonts and fontsets. + (gtk-matsu-980924. Takashi Matsuda matsu@arch.comp.kyutech.ac.jp) + + * gtk/gtkmain.c: Change test to detect glibc's + utf8 based mb* functions to be more specific. + + * gtk/gtkwindow.[ch] gtk/gtkfixed.c: Indentation + cleanups. + Fri Nov 13 16:43:36 1998 Lars Hamann * gtk/gtktogglebutton.c (gtk_toggle_button_realize): don't diff --git a/gdk/gdk.h b/gdk/gdk.h index 5ee53061b..84563cf8f 100644 --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -126,7 +126,6 @@ GdkWindow* gdk_window_new (GdkWindow *parent, GdkWindowAttr *attributes, gint attributes_mask); -GdkWindow* gdk_window_foreign_new (guint32 anid); void gdk_window_destroy (GdkWindow *window); GdkWindow* gdk_window_ref (GdkWindow *window); void gdk_window_unref (GdkWindow *window); diff --git a/gdk/gdkpixmap.c b/gdk/gdkpixmap.c index dfaf4822c..291c8d774 100644 --- a/gdk/gdkpixmap.c +++ b/gdk/gdkpixmap.c @@ -748,6 +748,53 @@ gdk_pixmap_create_from_xpm_d (GdkWindow *window, transparent_color, data); } +GdkPixmap* +gdk_pixmap_foreign_new (guint32 anid) +{ + GdkPixmap *pixmap; + GdkWindowPrivate *window_private; + GdkWindowPrivate *private; + Pixmap xpixmap; + Window root_return; + unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret; + + /* check to make sure we were passed something at + least a little sane */ + g_return_val_if_fail((anid != 0), NULL); + + /* set the pixmap to the passed in value */ + xpixmap = anid; + /* get the root window */ + window_private = &gdk_root_parent; + + /* get information about the Pixmap to fill in the structure for + the gdk window */ + if (!XGetGeometry(window_private->xdisplay, xpixmap, &root_return, + &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret)) + return NULL; + + /* allocate a new gdk pixmap */ + private = g_new(GdkWindowPrivate, 1); + pixmap = (GdkPixmap *)private; + + private->xdisplay = window_private->xdisplay; + private->window_type = GDK_WINDOW_PIXMAP; + private->xwindow = xpixmap; + private->colormap = NULL; + private->parent = NULL; + private->x = 0; + private->y = 0; + private->width = w_ret; + private->height = h_ret; + private->resize_count = 0; + private->ref_count = 1; + private->destroyed = 0; + + gdk_xid_table_insert(&private->xwindow, pixmap); + + return pixmap; +} + GdkPixmap* gdk_pixmap_ref (GdkPixmap *pixmap) { diff --git a/gdk/gdktypes.h b/gdk/gdktypes.h index 964095b4c..26527b45f 100644 --- a/gdk/gdktypes.h +++ b/gdk/gdktypes.h @@ -847,6 +847,7 @@ struct _GdkCursor GdkCursorType type; }; + struct _GdkColorContextDither { gint fast_rgb[32][32][32]; /* quick look-up table for faster rendering */ diff --git a/gdk/gdkx.h b/gdk/gdkx.h index fbe655d2e..306f03d09 100644 --- a/gdk/gdkx.h +++ b/gdk/gdkx.h @@ -47,5 +47,8 @@ GdkColormap* gdkx_colormap_get (Colormap xcolormap); Window gdk_get_client_window (Display *dpy, Window win); +/* Functions to create pixmaps and windows from their X equivalents */ +GdkPixmap *gdk_pixmap_foreign_new (guint32 anid); +GdkWindow *gdk_window_foreign_new (guint32 anid); #endif /* __GDK_X_H__ */ diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c index dfaf4822c..291c8d774 100644 --- a/gdk/x11/gdkpixmap-x11.c +++ b/gdk/x11/gdkpixmap-x11.c @@ -748,6 +748,53 @@ gdk_pixmap_create_from_xpm_d (GdkWindow *window, transparent_color, data); } +GdkPixmap* +gdk_pixmap_foreign_new (guint32 anid) +{ + GdkPixmap *pixmap; + GdkWindowPrivate *window_private; + GdkWindowPrivate *private; + Pixmap xpixmap; + Window root_return; + unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret; + + /* check to make sure we were passed something at + least a little sane */ + g_return_val_if_fail((anid != 0), NULL); + + /* set the pixmap to the passed in value */ + xpixmap = anid; + /* get the root window */ + window_private = &gdk_root_parent; + + /* get information about the Pixmap to fill in the structure for + the gdk window */ + if (!XGetGeometry(window_private->xdisplay, xpixmap, &root_return, + &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret)) + return NULL; + + /* allocate a new gdk pixmap */ + private = g_new(GdkWindowPrivate, 1); + pixmap = (GdkPixmap *)private; + + private->xdisplay = window_private->xdisplay; + private->window_type = GDK_WINDOW_PIXMAP; + private->xwindow = xpixmap; + private->colormap = NULL; + private->parent = NULL; + private->x = 0; + private->y = 0; + private->width = w_ret; + private->height = h_ret; + private->resize_count = 0; + private->ref_count = 1; + private->destroyed = 0; + + gdk_xid_table_insert(&private->xwindow, pixmap); + + return pixmap; +} + GdkPixmap* gdk_pixmap_ref (GdkPixmap *pixmap) { diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h index fbe655d2e..306f03d09 100644 --- a/gdk/x11/gdkx.h +++ b/gdk/x11/gdkx.h @@ -47,5 +47,8 @@ GdkColormap* gdkx_colormap_get (Colormap xcolormap); Window gdk_get_client_window (Display *dpy, Window win); +/* Functions to create pixmaps and windows from their X equivalents */ +GdkPixmap *gdk_pixmap_foreign_new (guint32 anid); +GdkWindow *gdk_window_foreign_new (guint32 anid); #endif /* __GDK_X_H__ */ diff --git a/gtk/Makefile.am b/gtk/Makefile.am index d2802d55e..ddada2835 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -284,6 +284,16 @@ gtkmarshal.c gtkmarshal.h: @REBUILD@ gtkmarshal.list genmarshal.pl libgtk_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -release $(LT_RELEASE) +# We create a dummy theme for the default GTK+ theme + +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(datadir)/themes/Default/gtk + echo "# Empty gtkrc for default theme" > \ + $(DESTDIR)$(datadir)/themes/Default/gtk/gtkrc + +uninstall-local: + rm -f $(DESTDIR)$(datadir)/themes/Default/gtkrc + EXTRA_DIST = \ line-arrow.xbm \ line-wrap.xbm \ diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index e362c5874..f78d2beef 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -401,22 +401,33 @@ gtk_init (int *argc, * correctly - set if either mblen("\xc0", MB_CUR_MAX) == 1 in the * C locale, or we're using X's mb functions. (-DX_LOCALE && locale != C) */ - - current_locale = g_strdup (setlocale (LC_CTYPE, NULL)); + + current_locale = setlocale (LC_CTYPE, NULL); #ifdef X_LOCALE if ((strcmp (current_locale, "C")) && (strcmp (current_locale, "POSIX"))) gtk_use_mb = TRUE; else -#endif +#endif /* X_LOCALE */ { - setlocale (LC_CTYPE, "C"); - gtk_use_mb = (mblen ("\xc0", MB_CUR_MAX) == 1); - setlocale (LC_CTYPE, current_locale); + /* Detect GNU libc, where mb == UTF8. Not useful unless it's + * really a UTF8 locale. The below still probably will + * screw up on Greek, Cyrillic, etc, encoded as UTF8. + */ + + wchar_t result; + gtk_use_mb = TRUE; + + if ((MB_CUR_MAX == 2) && + (mbstowcs (&result, "\xdd\xa5", 1) > 0) && + result == 0x765) + { + if ((strlen (current_locale) < 4) || + g_strcasecmp (current_locale + strlen(current_locale) - 4, "utf8")) + gtk_use_mb = FALSE; + } } - g_free (current_locale); - GTK_NOTE (MISC, g_message ("%s multi-byte string functions.", gtk_use_mb ? "Using" : "Not using")); diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c index fb006fb24..59dc6f481 100644 --- a/gtk/gtkrc.c +++ b/gtk/gtkrc.c @@ -1117,14 +1117,16 @@ gtk_rc_parse_style (GScanner *scanner) rc_style->base[i] = parent_style->base[i]; } - if (rc_style->fontset_name) + if (parent_style->fontset_name) { - g_free (rc_style->fontset_name); + if (rc_style->fontset_name) + g_free (rc_style->fontset_name); rc_style->fontset_name = g_strdup (parent_style->fontset_name); } - else if (rc_style->font_name) + else if (parent_style->font_name) { - g_free (rc_style->font_name); + if (rc_style->font_name) + g_free (rc_style->font_name); rc_style->font_name = g_strdup (parent_style->font_name); } diff --git a/gtk/testgtkrc b/gtk/testgtkrc index 36bb12464..da81deb22 100644 --- a/gtk/testgtkrc +++ b/gtk/testgtkrc @@ -10,11 +10,11 @@ # widget style # widget_class style -include "/opt/themes/share/themes/Metal/gtk/gtkrc" +#include "/opt/themes/share/themes/W/gtk/gtkrc" #include "/home/otaylor/.themes/Ignorant/gtk/gtkrc" style "defaultfont" { -# font = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*" + font = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*" # fontset = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*" } diff --git a/tests/testgtkrc b/tests/testgtkrc index 36bb12464..da81deb22 100644 --- a/tests/testgtkrc +++ b/tests/testgtkrc @@ -10,11 +10,11 @@ # widget style # widget_class style -include "/opt/themes/share/themes/Metal/gtk/gtkrc" +#include "/opt/themes/share/themes/W/gtk/gtkrc" #include "/home/otaylor/.themes/Ignorant/gtk/gtkrc" style "defaultfont" { -# font = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*" + font = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*" # fontset = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*" }