[Glade-devel] win32 patch for glade-2.5.1 cvs

Ivan Wong email@ivanwong.info
Mon, 12 Apr 2004 13:44:09 +0800


Link with MSVCRT.dll (release, multithreaded), passing file pointer across
different M$VC runtime will crash.
I believe that patching 2.5.1 for win32 is more or less the same as patching
2.0.1 (though I haven't really tried), may be this's useful:

http://gladewin32.sf.net

----- Original Message ----- 
From: "todd" <taf2@lehigh.edu>
Cc: <glade-devel@ximian.com>
Sent: Monday, April 12, 2004 09:36
Subject: [Glade-devel] win32 patch for glade-2.5.1 cvs


> Hi,
>     I've recently spent some getting gtk+ 2.4 working win32 for me.  The
> one last thing I'd like to get working is glade.  Everything for me is
> working
> except for the save functionality.   Attached is the set of patches I
> made to the source to get the properties dialog box to open as well as a
> fix for a invalid
> write for both linux and win32 that I found using valgrind.
>
> On my build save is crashing in save.c in the function
> save_project_file_internal when it hits the fprintf, which for me is on
> line 179.
>
> I was hoping to get some feed back on some ideas about why it might be
> crashing on the fprintf, because if i replace the fprintf with an fwrite
> the call works and the file I can see is written to just fine.  It feels
> like some how the call stack is getting corrupted.  In my patch there is
> a fix
> for a win32 #define that sets a pointer to memory on the stack and then
> in other platforms allocates memory for the pointer on the stack but for
> all platforms frees that memory.  So, i'm worried that the call stack
> might be getting corrupted because of other areas that are like this.
>
> The other related bug fix for the file open dialog box is a fix in glib,
> which i reported here in bugzilla:
> http://bugzilla.gnome.org/show_bug.cgi?id=139423
> I'd really like to get glade 2.5.x working in win32, and think that I'm
> really close with this patch but would like some more help in figuring
> out why the save
> function is dieing on fprintf.  I hope this patch can be helpful
>
> -todd
>


----------------------------------------------------------------------------
----


> ? fogb.h
> ? fogbframe.c
> ? foogbwindow.c
> ? mypatches.patch
> ? win32fix.patch
> Index: glade/glade_menu_editor.c
> ===================================================================
> RCS file: /cvs/gnome/glade/glade/glade_menu_editor.c,v
> retrieving revision 1.22
> diff -u -r1.22 glade_menu_editor.c
> --- glade/glade_menu_editor.c 5 Apr 2004 23:18:08 -0000 1.22
> +++ glade/glade_menu_editor.c 12 Apr 2004 01:23:04 -0000
> @@ -25,6 +25,7 @@
>  #include <string.h>
>  #include <time.h>
>
> +#include <gtk/gtkmain.h>
>  #include <gdk/gdkkeysyms.h>
>  #include <gtk/gtkarrow.h>
>  #include <gtk/gtkaccellabel.h>
> Index: glade/glade_project_options.c
> ===================================================================
> RCS file: /cvs/gnome/glade/glade/glade_project_options.c,v
> retrieving revision 1.24
> diff -u -r1.24 glade_project_options.c
> --- glade/glade_project_options.c 5 Apr 2004 23:18:08 -0000 1.24
> +++ glade/glade_project_options.c 12 Apr 2004 01:23:04 -0000
> @@ -19,6 +19,7 @@
>  #include <ctype.h>
>  #include <string.h>
>
> +#include <gtk/gtkmain.h>
>  #include <gtk/gtkalignment.h>
>  #include <gtk/gtkentry.h>
>  #include <gtk/gtkeventbox.h>
> Index: glade/glade_project_window.c
> ===================================================================
> RCS file: /cvs/gnome/glade/glade/glade_project_window.c,v
> retrieving revision 1.27
> diff -u -r1.27 glade_project_window.c
> --- glade/glade_project_window.c 23 Mar 2004 17:41:29 -0000 1.27
> +++ glade/glade_project_window.c 12 Apr 2004 01:23:06 -0000
> @@ -1408,7 +1408,7 @@
>    glade_project_window_update_title (project_window);
>    glade_project_window_setup_interface (project_window);
>
> -  gtk_widget_destroy (GTK_WIDGET (options));
> +  gtk_widget_hide (GTK_WIDGET (options));
>
>    switch (action)
>      {
> @@ -1424,6 +1424,7 @@
>   glade_project_window_real_write_source (project_window);
>        break;
>      }
> +    gtk_widget_destroy (GTK_WIDGET (options));
>  }
>
>
> Index: glade/main.c
> ===================================================================
> RCS file: /cvs/gnome/glade/glade/main.c,v
> retrieving revision 1.15
> diff -u -r1.15 main.c
> --- glade/main.c 25 Mar 2004 14:57:21 -0000 1.15
> +++ glade/main.c 12 Apr 2004 01:23:06 -0000
> @@ -23,7 +23,9 @@
>  #include <string.h>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> +#ifdef G_OS_UNIX
>  #include <unistd.h>
> +#endif
>
>  #include <gtk/gtkmain.h>
>  #include <gtk/gtkrc.h>
> @@ -105,7 +107,7 @@
>  int
>  main (int argc, char *argv[])
>  {
> -  gchar *home_dir, *rc_path, *modules, *modules_needed, *new_modules;
> +  gchar *home_dir = 0, *rc_path = 0, *modules = 0, *modules_needed = 0,
*new_modules = 0;
>  #ifdef USE_GNOME
>    GnomeProgram *program;
>    char *icon;
> @@ -195,6 +197,8 @@
>  #else
>    gtk_main ();
>  #endif
> +
> +  g_free( new_modules );
>    return 0;
>  }
>
> Index: glade/property.c
> ===================================================================
> RCS file: /cvs/gnome/glade/glade/property.c,v
> retrieving revision 1.35
> diff -u -r1.35 property.c
> --- glade/property.c 23 Mar 2004 17:41:30 -0000 1.35
> +++ glade/property.c 12 Apr 2004 01:23:09 -0000
> @@ -988,59 +988,63 @@
>      lang_specific_properties[i] = NULL;
>
>    /* Create table for C-specific properties. */
> -  table = gtk_table_new (3, 3, FALSE);
> -  gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> -  if (property_language == GLADE_LANGUAGE_C)
> -    gtk_widget_show (table);
> -  lang_specific_properties[GLADE_LANGUAGE_C] = table;
> -  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> -
> -  property_set_table_position (table, 0);
> -  property_add_filename (GbCSourceFile, _("Source File:"),
> - _("The file to write source code into"));
> -  property_add_bool (GbCPublic, _("Public:"),
> -      _("If the widget is added to the component's data structure"));
> -
> -  /* Create table for C++-specific properties. */
> -  table = gtk_table_new (3, 3, FALSE);
> -  gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> -  if (property_language == GLADE_LANGUAGE_CPP)
> -    gtk_widget_show (table);
> -  lang_specific_properties[GLADE_LANGUAGE_CPP] = table;
> -  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> -
> -  property_set_table_position (table, 0);
> -  property_add_bool (GbCxxSeparateClass, _("Separate Class:"),
> -      _("Put this widget's subtree in a separate class"));
> -  property_add_bool (GbCxxSeparateFile, _("Separate File:"),
> -      _("Put this widget in a separate source file"));
> -  property_add_choice (GbCxxVisibility, _("Visibility:"),
> -        _("Visibility of widgets. Public widgets are exported to a global
map."),
> -        GbCxxVisibilityChoices);
> -
> -  /* Create table for Ada95-specific properties. */
> -  table = gtk_table_new (3, 3, FALSE);
> -  gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> -  if (property_language == GLADE_LANGUAGE_ADA95)
> -    gtk_widget_show (table);
> -  lang_specific_properties[GLADE_LANGUAGE_ADA95] = table;
> -  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> -
> -  property_set_table_position (table, 0);
> -  /* No properties yet. */
> -
> -
> -  /* Create table for Perl-specific properties. */
> -  table = gtk_table_new (3, 3, FALSE);
> -  gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> -  if (property_language == GLADE_LANGUAGE_PERL)
> -    gtk_widget_show (table);
> -  lang_specific_properties[GLADE_LANGUAGE_PERL] = table;
> -  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> -
> -  property_set_table_position (table, 0);
> -  /* No properties yet. */
> -
> +  if( GLADE_LANGUAGE_C < GladeNumLanguages ){
> +    table = gtk_table_new (3, 3, FALSE);
> +    gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> +    if (property_language == GLADE_LANGUAGE_C)
> +      gtk_widget_show (table);
> +    lang_specific_properties[GLADE_LANGUAGE_C] = table;
> +    gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> +
> +    property_set_table_position (table, 0);
> +    property_add_filename (GbCSourceFile, _("Source File:"),
> +  _("The file to write source code into"));
> +    property_add_bool (GbCPublic, _("Public:"),
> +       _("If the widget is added to the component's data structure"));
> +  }
> +  if( GLADE_LANGUAGE_CPP < GladeNumLanguages ){
> + /* Create table for C++-specific properties. */
> + table = gtk_table_new (3, 3, FALSE);
> + gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> + if (property_language == GLADE_LANGUAGE_CPP)
> + gtk_widget_show (table);
> + lang_specific_properties[GLADE_LANGUAGE_CPP] = table;
> + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> +
> + property_set_table_position (table, 0);
> + property_add_bool (GbCxxSeparateClass, _("Separate Class:"),
> + _("Put this widget's subtree in a separate class"));
> + property_add_bool (GbCxxSeparateFile, _("Separate File:"),
> + _("Put this widget in a separate source file"));
> + property_add_choice (GbCxxVisibility, _("Visibility:"),
> + _("Visibility of widgets. Public widgets are exported to a global
map."),
> + GbCxxVisibilityChoices);
> +  }
> +  if( GLADE_LANGUAGE_ADA95 < GladeNumLanguages ){
> + /* Create table for Ada95-specific properties. */
> + table = gtk_table_new (3, 3, FALSE);
> + gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> + if (property_language == GLADE_LANGUAGE_ADA95)
> + gtk_widget_show (table);
> + lang_specific_properties[GLADE_LANGUAGE_ADA95] = table;
> + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> +
> + property_set_table_position (table, 0);
> + /* No properties yet. */
> +
> +  }
> +  if( GLADE_LANGUAGE_PERL < GladeNumLanguages ){
> + /* Create table for Perl-specific properties. */
> + table = gtk_table_new (3, 3, FALSE);
> + gtk_table_set_row_spacings (GTK_TABLE (table), 1);
> + if (property_language == GLADE_LANGUAGE_PERL)
> + gtk_widget_show (table);
> + lang_specific_properties[GLADE_LANGUAGE_PERL] = table;
> + gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
> +
> + property_set_table_position (table, 0);
> + /* No properties yet. */
> +  }
>  }
>
>
> Index: glade/utils.c
> ===================================================================
> RCS file: /cvs/gnome/glade/glade/utils.c,v
> retrieving revision 1.30
> diff -u -r1.30 utils.c
> --- glade/utils.c 23 Mar 2004 17:41:30 -0000 1.30
> +++ glade/utils.c 12 Apr 2004 01:23:11 -0000
> @@ -21,7 +21,9 @@
>  #include <string.h>
>  #include <sys/types.h>
>  #include <sys/stat.h>
> +#ifdef G_OS_UNIX
>  #include <unistd.h>
> +#endif
>  #include <dirent.h>
>  #include <errno.h>
>
> @@ -1331,7 +1333,10 @@
>    if (dir_pos > root_pos)
>      dir_pos++;
>    len = dir_pos + 1 + (strlen (file) - file_pos) + 1;
> -  path = g_malloc (len);
> +  path = g_try_malloc (len);
> +  if( path == NULL ){
> +    return NULL;
> +  }
>    strncpy (path, dir, dir_pos);
>    path[dir_pos] = G_DIR_SEPARATOR;
>    strcpy (path + dir_pos + 1, file + file_pos);
> @@ -1602,11 +1607,13 @@
>    gint project_num, max_project_num, project_string_len;
>    gint num_matched, chars_matched;
>
> -#ifdef _WIN32
> -  projects_dir = "C:\\Projects";
> -#else
> +
>    projects_dir = glade_util_make_absolute_path (g_get_home_dir (),
>   _("Projects"));
> +#ifdef _WIN32
> +  if( projects_dir == NULL ){
> +    projects_dir = g_strdup( "C:\\Projects" );
> +  }
>  #endif
>
>    /* Step through the 'Projects' directory, if it exists, to find
>