Package: gtk-theme-switch
Followup-For: Bug #229384

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I'm not sure whether all of this applies to bug #229384, but some of
it does, so here goes.

switch (i.e. switch for gtk 1.x) wouldn't change themes for me at
all. (Actually, it's more complex than that: it works on one of my
Debian boxes, but not the rest). In addition, I'd get a few
Gtk-CRITICAL errors when I tried to change themes, including the

> Gtk-CRITICAL **: file gtkentry.c: line 440 (gtk_entry_set_text):
> assertion `text != NULL' failed.

   reported by the originator of this bug.

I've found several problems. The major one for me (which caused the
non-changing theme fault) was in the get_dirs() function when adding
the theme and its directory into the hash table (two places; around
lines 77 and 100 in switch.c):

> g_hash_table_insert (hash, dent->d_name, dirname);

dirname is an automatic variable, which means that it'll be gone once
the function ends. In fact, it's changed in the function anyway. dent,
for its part, is an iteration variable which will change as we go
through the loop. In both cases, the solution is to make a copy with
g_strdup() and put the copy in the hash instead.

I also removed the two warnings about not freeing dirname, which only
confused the issue.

I have no idea how this ever worked: a lot depends, I suppose, on the
contents of memory when you run switch. On my machine, my ~/.gtkrc had
something like

> include "(null)/Smooth-Sea-Ice/gtk/gtkrc"

   instead of

> include "/usr/share/themes/Smooth-Sea-Ice/gtk/gtkrc"

   after I ran switch, and that's why the theme didn't change.

   Now to the other problem. My ~/.gtkrc doesn't have any font
specified, which may explain the GTK-CRITICAL errors. They occur in
two places in switch.c, around line 189 and line 413. If
style->rc_style->font_name is null (as it was on my boxes),
gtk_entry_set_text() throws the error noted above. The fix is to add a
check for font_name being null before calling gtk_entry_set_text().

   These problems may be related to other bugs, too (perhaps #244968
and #255723). I should note that I've been getting the occasional
segfault, which I can't reliably reproduce (even when I repeat the
actions that caused it), so there may be other dangling pointers
around. I'll keep looking as time permits.

Patch attached.

 .....Ron

P.S. Ignore the "2.0.4rjmx3" version number. It's just  2.0.4 with the
attached patch.


- -- System Information:
Debian Release: lenny/sid
  APT prefers testing
  APT policy: (500, 'testing'), (500, 'stable')
Architecture: i386 (i686)

Kernel: Linux 2.6.21.1-khufu-0
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/bash

Versions of packages gtk-theme-switch depends on:
ii  libatk1.0-0                 1.12.4-3     The ATK accessibility toolkit
ii  libc6                       2.3.6.ds1-13 GNU C Library: Shared libraries
ii  libcairo2                   1.2.4-4      The Cairo 2D vector graphics libra
ii  libfontconfig1              2.4.2-1.2    generic font configuration library
ii  libglib1.2                  1.2.10-17    The GLib library of C routines
ii  libglib2.0-0                2.12.4-2     The GLib library of C routines
ii  libgtk1.2                   1.2.10-18    The GIMP Toolkit set of widgets fo
ii  libgtk2.0-0                 2.8.20-7     The GTK+ graphical user interface 
ii  libpango1.0-0               1.14.8-5     Layout and rendering of internatio
ii  libx11-6                    2:1.0.3-7    X11 client-side library
ii  libxcursor1                 1.1.7-4      X cursor management library
ii  libxext6                    1:1.0.1-2    X11 miscellaneous extension librar
ii  libxfixes3                  1:4.0.1-5    X11 miscellaneous 'fixes' extensio
ii  libxi6                      1:1.0.1-4    X11 Input extension library
ii  libxinerama1                1:1.0.1-4.1  X11 Xinerama extension library
ii  libxrandr2                  2:1.1.0.2-5  X11 RandR extension library
ii  libxrender1                 1:0.9.1-3    X Rendering Extension client libra

Versions of packages gtk-theme-switch recommends:
ii  gtk-engines-pixmap            0.12-8.1   Pixmap-based theme for GTK+ 1.2

- -- debconf-show failed

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFGUmtMitqjxNhsdN4RAjoVAJsGsnmFe6zVkwYXCqYOpVjeMB6RPwCfSEiu
5EmBIr8TS8pmIg808PDeKoE=
=3HSf
-----END PGP SIGNATURE-----
*** switch.c.orig	Sat Apr 30 20:28:31 2005
--- switch.c	Mon May 21 22:54:03 2007
***************
*** 68,112 ****
  	{
  		while ((dent = readdir (dir)))
  		{
!                         gchar* gtkrc_path = g_strconcat(dent->d_name, "/gtk/gtkrc", NULL);
  			stat(dent->d_name,&stats);
  			if (!S_ISDIR(stats.st_mode)) continue;
  			if (strcmp(dent->d_name,"." ) == 0) continue;
  			if (strcmp(dent->d_name,"..") == 0) continue;
!                         if (access(gtkrc_path, R_OK) == -1) continue;
! 			g_hash_table_insert (hash, dent->d_name, dirname);
! 			list = g_list_insert_sorted(list, g_strdup(dent->d_name), (GCompareFunc)strcmp);
                          g_free(gtkrc_path);
  		}
  	}
-  
- 	/* DO NOT FREE dirname!! */
- 	/* We are supposed to. */
- 	/* But we need our own copy anyway, to store in the hash table */
  
! 	dirname = gtk_rc_get_theme_dir();
  	chdir (dirname);
  	dir = opendir (dirname);
  	if (dir)
  	{
  		while ((dent = readdir (dir)))
  		{
!                         gchar* gtkrc_path = g_strconcat(dent->d_name, "/gtk/gtkrc", NULL);
  			stat(dent->d_name,&stats);
  			if (!S_ISDIR(stats.st_mode)) continue;
  			if (strcmp(dent->d_name, "." ) == 0) continue;
  			if (strcmp(dent->d_name, "..") == 0) continue;
                          if (access(gtkrc_path, R_OK) == -1) continue;
! 			g_hash_table_insert (hash, dent->d_name, dirname);
! 			list =  g_list_insert_sorted(list, g_strdup(dent->d_name), (GCompareFunc)strcmp);
!                         g_free(gtkrc_path);
  		}
  	}
- 	
- 	/* DO NOT FREE dirname!! */
- 	/* We are supposed to. */
- 	/* But we need our own copy anyway, to store in the hash table */
  
  	chdir(origdir); /* Go back to where we were */
  	g_free(origdir); /* Now go play like a good little program */
  
--- 68,112 ----
  	{
  		while ((dent = readdir (dir)))
  		{
!             gchar* gtkrc_path = g_strconcat(dent->d_name, "/gtk/gtkrc", NULL);
  			stat(dent->d_name,&stats);
  			if (!S_ISDIR(stats.st_mode)) continue;
  			if (strcmp(dent->d_name,"." ) == 0) continue;
  			if (strcmp(dent->d_name,"..") == 0) continue;
! 			if (access(gtkrc_path, R_OK) == -1) continue;
! 			g_hash_table_insert (hash, g_strdup(dent->d_name),
! 								 g_strdup(dirname));
! 			list = g_list_insert_sorted(list, g_strdup(dent->d_name), 
! 										(GCompareFunc)strcmp);
                          g_free(gtkrc_path);
  		}
  	}
  
! 	g_free(dirname);
! 
!  	dirname = gtk_rc_get_theme_dir();
  	chdir (dirname);
  	dir = opendir (dirname);
  	if (dir)
  	{
  		while ((dent = readdir (dir)))
  		{
! 			gchar* gtkrc_path = g_strconcat(dent->d_name, "/gtk/gtkrc", NULL);
  			stat(dent->d_name,&stats);
  			if (!S_ISDIR(stats.st_mode)) continue;
  			if (strcmp(dent->d_name, "." ) == 0) continue;
  			if (strcmp(dent->d_name, "..") == 0) continue;
                          if (access(gtkrc_path, R_OK) == -1) continue;
! 			g_hash_table_insert (hash, g_strdup(dent->d_name),
! 								 g_strdup(dirname));
! 			list =  g_list_insert_sorted(list, g_strdup(dent->d_name),
! 										 (GCompareFunc)strcmp);
!             g_free(gtkrc_path);
  		}
  	}
  
+ 	g_free(dirname);
+ 	
  	chdir(origdir); /* Go back to where we were */
  	g_free(origdir); /* Now go play like a good little program */
  
***************
*** 173,181 ****
  	gchar *dir = g_hash_table_lookup(hash,entry);
  	gchar *name = g_strdup_printf ("%s/%s/gtk/gtkrc", dir, entry);
  	GtkStyle *style;
- 
  	update_newfont ();
! 
  	ok_clicked(name);
  	g_free(name);
  
--- 173,180 ----
  	gchar *dir = g_hash_table_lookup(hash,entry);
  	gchar *name = g_strdup_printf ("%s/%s/gtk/gtkrc", dir, entry);
  	GtkStyle *style;
  	update_newfont ();
! 	
  	ok_clicked(name);
  	g_free(name);
  
***************
*** 185,191 ****
  
  	/* sync the font field with the GTK font */
  	style = gtk_rc_get_style (font_entry);
! 	if (style && style->rc_style)
  		gtk_entry_set_text (GTK_ENTRY(font_entry), style->rc_style->font_name);
  }
  
--- 184,190 ----
  
  	/* sync the font field with the GTK font */
  	style = gtk_rc_get_style (font_entry);
! 	if (style && style->rc_style && style->rc_style->font_name)
  		gtk_entry_set_text (GTK_ENTRY(font_entry), style->rc_style->font_name);
  }
  
***************
*** 388,394 ****
       
       	gtk_container_add(GTK_CONTAINER(evbox), pixmap);
       	gtk_box_pack_start(GTK_BOX(box),evbox,FALSE,FALSE,FALSE);
! 	gtk_widget_show_all(box);
       
       	box = gtk_hbox_new(FALSE, 0);
  	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dockwin)->vbox), box, FALSE, FALSE, 0);
--- 387,393 ----
       
       	gtk_container_add(GTK_CONTAINER(evbox), pixmap);
       	gtk_box_pack_start(GTK_BOX(box),evbox,FALSE,FALSE,FALSE);
!         gtk_widget_show_all(box);
       
       	box = gtk_hbox_new(FALSE, 0);
  	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dockwin)->vbox), box, FALSE, FALSE, 0);
***************
*** 409,415 ****
  	else
  	{
  		GtkStyle *style = gtk_rc_get_style (font_entry);
! 		if (style && style->rc_style)
  			gtk_entry_set_text (GTK_ENTRY(font_entry), style->rc_style->font_name);
  	}
  	
--- 408,414 ----
  	else
  	{
  		GtkStyle *style = gtk_rc_get_style (font_entry);
! 		if (style && style->rc_style && style->rc_style->font_name)
  			gtk_entry_set_text (GTK_ENTRY(font_entry), style->rc_style->font_name);
  	}
  	

Reply via email to