summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2004-12-12 21:09:13 +0000
committerTor Lillqvist <tml@src.gnome.org>2004-12-12 21:09:13 +0000
commitf3da17053918abe78db5f75e7d008e4c84c09570 (patch)
tree8ec4255ddb86a9d13de0e6012246a64f4cc671e3
parentf821217218c60a96cda40844fbef300b4b3d143b (diff)
downloadgtk+-f3da17053918abe78db5f75e7d008e4c84c09570.tar.gz
gtk/gtkaccelmap.[ch] gtk/gtkfilechooser.[ch] gtk/gtkfilesel.c
2004-12-12 Tor Lillqvist <tml@iki.fi> * gtk/gtkaccelmap.[ch] * gtk/gtkfilechooser.[ch] * gtk/gtkfilesel.c * gtk/gtkfilesystemwin32.c * gtk/gtkiconfactory.[ch] * gtk/gtkicontheme.[ch] * gtk/gtkimage.[ch] * gtk/gtkimmodule.c * gtk/gtkmodules.c * gtk/gtkrc.[ch] * gtk/gtkuimanager.[ch] * gtk/gtkwindow.[ch] * gtk/updateiconcache.c * gtk/gtk.symbols: Use gstdio wrappers. On Windows, convert environment variables referring to pathnames from locale encoding to UTF-8. As in GLib, in order to preserve Windows DLL ABI stability, add binary compatibility versions of functions that take file names as arguments, or return file names. Add a _utf8 suffix to the "real" such functions on Windows. The ABI compatibility versions keep the old name. * gtk/Makefile.am: Strip PRIVATE symbols from the GNU import library. * gtk/gtkiconcache.c (_gtk_icon_cache_new_for_path): Implement file mapping on Win32. * gtk/updateiconcache.c: Don't crash if invoked without argument. Use binary mode when opening file. * modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am: Install gtkrc in correct place, in <datadir>/themes/MS-Windows/gtk-2.0.
-rw-r--r--ChangeLog35
-rw-r--r--ChangeLog.pre-2-1035
-rw-r--r--ChangeLog.pre-2-635
-rw-r--r--ChangeLog.pre-2-835
-rw-r--r--gtk/Makefile.am4
-rw-r--r--gtk/gtk.symbols155
-rw-r--r--gtk/gtkaccelmap.c40
-rw-r--r--gtk/gtkaccelmap.h7
-rw-r--r--gtk/gtkfilechooser.c169
-rw-r--r--gtk/gtkfilechooser.h15
-rw-r--r--gtk/gtkfilesel.c97
-rw-r--r--gtk/gtkfilesel.h13
-rw-r--r--gtk/gtkfilesystemwin32.c132
-rw-r--r--gtk/gtkiconcache.c67
-rw-r--r--gtk/gtkiconfactory.c51
-rw-r--r--gtk/gtkiconfactory.h6
-rw-r--r--gtk/gtkicontheme.c119
-rw-r--r--gtk/gtkicontheme.h9
-rw-r--r--gtk/gtkimage.c32
-rw-r--r--gtk/gtkimage.h6
-rw-r--r--gtk/gtkimmodule.c9
-rw-r--r--gtk/gtkmodules.c14
-rw-r--r--gtk/gtkrc.c119
-rw-r--r--gtk/gtkrc.h7
-rw-r--r--gtk/gtkuimanager.c23
-rw-r--r--gtk/gtkuimanager.h5
-rw-r--r--gtk/gtkwindow.c43
-rw-r--r--gtk/gtkwindow.h6
-rw-r--r--gtk/updateiconcache.c25
-rw-r--r--modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am2
30 files changed, 1143 insertions, 172 deletions
diff --git a/ChangeLog b/ChangeLog
index f28efb01cc..f2b8fa4e32 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2004-12-11 Tor Lillqvist <tml@iki.fi>
+
+ * gtk/gtkaccelmap.[ch]
+ * gtk/gtkfilechooser.[ch]
+ * gtk/gtkfilesel.c
+ * gtk/gtkfilesystemwin32.c
+ * gtk/gtkiconfactory.[ch]
+ * gtk/gtkicontheme.[ch]
+ * gtk/gtkimage.[ch]
+ * gtk/gtkimmodule.c
+ * gtk/gtkmodules.c
+ * gtk/gtkrc.[ch]
+ * gtk/gtkuimanager.[ch]
+ * gtk/gtkwindow.[ch]
+ * gtk/updateiconcache.c
+ * gtk/gtk.symbols: Use gstdio wrappers. On Windows, convert
+ environment variables referring to pathnames from locale encoding
+ to UTF-8. As in GLib, in order to preserve Windows DLL ABI
+ stability, add binary compatibility versions of functions that
+ take file names as arguments, or return file names. Add a _utf8
+ suffix to the "real" such functions on Windows. The ABI
+ compatibility versions keep the old name.
+
+ * gtk/Makefile.am: Strip PRIVATE symbols from the GNU import
+ library.
+
+ * gtk/gtkiconcache.c (_gtk_icon_cache_new_for_path): Implement
+ file mapping on Win32.
+
+ * gtk/updateiconcache.c: Don't crash if invoked without
+ argument. Use binary mode when opening file.
+
+ * modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am: Install
+ gtkrc in correct place, in <datadir>/themes/MS-Windows/gtk-2.0.
+
2004-12-12 Matthias Clasen <mclasen@redhat.com>
* gtk/gtklabel.c (gtk_label_setup_mnemonic): Fix a
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index f28efb01cc..f2b8fa4e32 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,38 @@
+2004-12-11 Tor Lillqvist <tml@iki.fi>
+
+ * gtk/gtkaccelmap.[ch]
+ * gtk/gtkfilechooser.[ch]
+ * gtk/gtkfilesel.c
+ * gtk/gtkfilesystemwin32.c
+ * gtk/gtkiconfactory.[ch]
+ * gtk/gtkicontheme.[ch]
+ * gtk/gtkimage.[ch]
+ * gtk/gtkimmodule.c
+ * gtk/gtkmodules.c
+ * gtk/gtkrc.[ch]
+ * gtk/gtkuimanager.[ch]
+ * gtk/gtkwindow.[ch]
+ * gtk/updateiconcache.c
+ * gtk/gtk.symbols: Use gstdio wrappers. On Windows, convert
+ environment variables referring to pathnames from locale encoding
+ to UTF-8. As in GLib, in order to preserve Windows DLL ABI
+ stability, add binary compatibility versions of functions that
+ take file names as arguments, or return file names. Add a _utf8
+ suffix to the "real" such functions on Windows. The ABI
+ compatibility versions keep the old name.
+
+ * gtk/Makefile.am: Strip PRIVATE symbols from the GNU import
+ library.
+
+ * gtk/gtkiconcache.c (_gtk_icon_cache_new_for_path): Implement
+ file mapping on Win32.
+
+ * gtk/updateiconcache.c: Don't crash if invoked without
+ argument. Use binary mode when opening file.
+
+ * modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am: Install
+ gtkrc in correct place, in <datadir>/themes/MS-Windows/gtk-2.0.
+
2004-12-12 Matthias Clasen <mclasen@redhat.com>
* gtk/gtklabel.c (gtk_label_setup_mnemonic): Fix a
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index f28efb01cc..f2b8fa4e32 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,38 @@
+2004-12-11 Tor Lillqvist <tml@iki.fi>
+
+ * gtk/gtkaccelmap.[ch]
+ * gtk/gtkfilechooser.[ch]
+ * gtk/gtkfilesel.c
+ * gtk/gtkfilesystemwin32.c
+ * gtk/gtkiconfactory.[ch]
+ * gtk/gtkicontheme.[ch]
+ * gtk/gtkimage.[ch]
+ * gtk/gtkimmodule.c
+ * gtk/gtkmodules.c
+ * gtk/gtkrc.[ch]
+ * gtk/gtkuimanager.[ch]
+ * gtk/gtkwindow.[ch]
+ * gtk/updateiconcache.c
+ * gtk/gtk.symbols: Use gstdio wrappers. On Windows, convert
+ environment variables referring to pathnames from locale encoding
+ to UTF-8. As in GLib, in order to preserve Windows DLL ABI
+ stability, add binary compatibility versions of functions that
+ take file names as arguments, or return file names. Add a _utf8
+ suffix to the "real" such functions on Windows. The ABI
+ compatibility versions keep the old name.
+
+ * gtk/Makefile.am: Strip PRIVATE symbols from the GNU import
+ library.
+
+ * gtk/gtkiconcache.c (_gtk_icon_cache_new_for_path): Implement
+ file mapping on Win32.
+
+ * gtk/updateiconcache.c: Don't crash if invoked without
+ argument. Use binary mode when opening file.
+
+ * modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am: Install
+ gtkrc in correct place, in <datadir>/themes/MS-Windows/gtk-2.0.
+
2004-12-12 Matthias Clasen <mclasen@redhat.com>
* gtk/gtklabel.c (gtk_label_setup_mnemonic): Fix a
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index f28efb01cc..f2b8fa4e32 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,38 @@
+2004-12-11 Tor Lillqvist <tml@iki.fi>
+
+ * gtk/gtkaccelmap.[ch]
+ * gtk/gtkfilechooser.[ch]
+ * gtk/gtkfilesel.c
+ * gtk/gtkfilesystemwin32.c
+ * gtk/gtkiconfactory.[ch]
+ * gtk/gtkicontheme.[ch]
+ * gtk/gtkimage.[ch]
+ * gtk/gtkimmodule.c
+ * gtk/gtkmodules.c
+ * gtk/gtkrc.[ch]
+ * gtk/gtkuimanager.[ch]
+ * gtk/gtkwindow.[ch]
+ * gtk/updateiconcache.c
+ * gtk/gtk.symbols: Use gstdio wrappers. On Windows, convert
+ environment variables referring to pathnames from locale encoding
+ to UTF-8. As in GLib, in order to preserve Windows DLL ABI
+ stability, add binary compatibility versions of functions that
+ take file names as arguments, or return file names. Add a _utf8
+ suffix to the "real" such functions on Windows. The ABI
+ compatibility versions keep the old name.
+
+ * gtk/Makefile.am: Strip PRIVATE symbols from the GNU import
+ library.
+
+ * gtk/gtkiconcache.c (_gtk_icon_cache_new_for_path): Implement
+ file mapping on Win32.
+
+ * gtk/updateiconcache.c: Don't crash if invoked without
+ argument. Use binary mode when opening file.
+
+ * modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am: Install
+ gtkrc in correct place, in <datadir>/themes/MS-Windows/gtk-2.0.
+
2004-12-12 Matthias Clasen <mclasen@redhat.com>
* gtk/gtklabel.c (gtk_label_setup_mnemonic): Fix a
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index d4fdb05332..6cb2e7108f 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -46,6 +46,10 @@ gtk-win32res.lo : gtk-win32.rc
$(top_srcdir)/build/win32/lt-compile-resource gtk-win32.rc gtk-win32res.lo
install-libtool-import-lib:
+ for entry in `grep PRIVATE gtk.def | sed -e 's/PRIVATE//'`; do \
+ file=`nm -A .libs/libgtk-win32-$(GTK_API_VERSION).dll.a | tr -d '\r' | grep -m 1 -E $$entry'$$' | cut -d: -f2`; \
+ ar d .libs/libgtk-win32-$(GTK_API_VERSION).dll.a $$file; \
+ done
$(INSTALL) .libs/libgtk-win32-$(GTK_API_VERSION).dll.a $(DESTDIR)$(libdir)
uninstall-libtool-import-lib:
-rm $(DESTDIR)$(libdir)/libtk-win32-$(GTK_API_VERSION).dll.a
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 11b5c42fe3..da2c2d44c4 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -72,12 +72,18 @@ gtk_accel_map_foreach
gtk_accel_map_foreach_unfiltered
gtk_accel_map_get
gtk_accel_map_get_type G_GNUC_CONST
-gtk_accel_map_load
+gtk_accel_map_load PRIVATE
+#ifdef G_OS_WIN32
+gtk_accel_map_load_utf8
+#endif
gtk_accel_map_load_fd
gtk_accel_map_load_scanner
gtk_accel_map_lock_path
gtk_accel_map_lookup_entry
-gtk_accel_map_save
+gtk_accel_map_save PRIVATE
+#ifdef G_OS_WIN32
+gtk_accel_map_save_utf8
+#endif
gtk_accel_map_save_fd
gtk_accel_map_unlock_path
gtk_accessible_connect_widget_destroyed
@@ -772,7 +778,10 @@ gtk_expander_style_get_type G_GNUC_CONST
gtk_false G_GNUC_CONST
gtk_file_chooser_action_get_type G_GNUC_CONST
gtk_file_chooser_add_filter
-gtk_file_chooser_add_shortcut_folder
+gtk_file_chooser_add_shortcut_folder PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_add_shortcut_folder_utf8
+#endif
gtk_file_chooser_add_shortcut_folder_uri
gtk_file_chooser_button_get_title
gtk_file_chooser_button_get_type G_GNUC_CONST
@@ -788,14 +797,26 @@ gtk_file_chooser_dialog_new_with_backend
gtk_file_chooser_error_get_type
gtk_file_chooser_error_quark
gtk_file_chooser_get_action
-gtk_file_chooser_get_current_folder
+gtk_file_chooser_get_current_folder PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_get_current_folder_utf8
+#endif
gtk_file_chooser_get_current_folder_uri
gtk_file_chooser_get_extra_widget
-gtk_file_chooser_get_filename
-gtk_file_chooser_get_filenames
+gtk_file_chooser_get_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_get_filename_utf8
+#endif
+gtk_file_chooser_get_filenames PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_get_filenames_utf8
+#endif
gtk_file_chooser_get_filter
gtk_file_chooser_get_local_only
-gtk_file_chooser_get_preview_filename
+gtk_file_chooser_get_preview_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_get_preview_filename_utf8
+#endif
gtk_file_chooser_get_preview_uri
gtk_file_chooser_get_preview_widget
gtk_file_chooser_get_preview_widget_active
@@ -806,20 +827,35 @@ gtk_file_chooser_get_uri
gtk_file_chooser_get_uris
gtk_file_chooser_get_use_preview_label
gtk_file_chooser_list_filters
-gtk_file_chooser_list_shortcut_folders
+gtk_file_chooser_list_shortcut_folders PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_list_shortcut_folders_utf8
+#endif
gtk_file_chooser_list_shortcut_folder_uris
gtk_file_chooser_remove_filter
-gtk_file_chooser_remove_shortcut_folder
+gtk_file_chooser_remove_shortcut_folder PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_remove_shortcut_folder_utf8
+#endif
gtk_file_chooser_remove_shortcut_folder_uri
gtk_file_chooser_select_all
-gtk_file_chooser_select_filename
+gtk_file_chooser_select_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_select_filename_utf8
+#endif
gtk_file_chooser_select_uri
gtk_file_chooser_set_action
-gtk_file_chooser_set_current_folder
+gtk_file_chooser_set_current_folder PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_set_current_folder_utf8
+#endif
gtk_file_chooser_set_current_folder_uri
gtk_file_chooser_set_current_name
gtk_file_chooser_set_extra_widget
-gtk_file_chooser_set_filename
+gtk_file_chooser_set_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_set_filename_utf8
+#endif
gtk_file_chooser_set_filter
gtk_file_chooser_set_local_only
gtk_file_chooser_set_preview_widget
@@ -829,7 +865,10 @@ gtk_file_chooser_set_show_hidden
gtk_file_chooser_set_uri
gtk_file_chooser_set_use_preview_label
gtk_file_chooser_unselect_all
-gtk_file_chooser_unselect_filename
+gtk_file_chooser_unselect_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_chooser_unselect_filename_utf8
+#endif
gtk_file_chooser_unselect_uri
gtk_file_chooser_widget_get_type G_GNUC_CONST
gtk_file_chooser_widget_new
@@ -871,13 +910,22 @@ gtk_file_paths_copy
gtk_file_paths_free
gtk_file_paths_sort
gtk_file_selection_complete
-gtk_file_selection_get_filename
-gtk_file_selection_get_selections
+gtk_file_selection_get_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_selection_get_filename_utf8
+#endif
+gtk_file_selection_get_selections PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_selection_get_selections_utf8
+#endif
gtk_file_selection_get_select_multiple
gtk_file_selection_get_type G_GNUC_CONST
gtk_file_selection_hide_fileop_buttons
gtk_file_selection_new
-gtk_file_selection_set_filename
+gtk_file_selection_set_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_file_selection_set_filename_utf8
+#endif
gtk_file_selection_set_select_multiple
gtk_file_selection_show_fileop_buttons
gtk_file_system_create_folder
@@ -1019,7 +1067,10 @@ gtk_icon_info_get_base_size
gtk_icon_info_get_builtin_pixbuf
gtk_icon_info_get_display_name
gtk_icon_info_get_embedded_rect
-gtk_icon_info_get_filename
+gtk_icon_info_get_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_info_get_filename_utf8
+#endif
gtk_icon_info_get_type G_GNUC_CONST
gtk_icon_info_load_icon
gtk_icon_info_set_raw_coordinates
@@ -1044,7 +1095,10 @@ gtk_icon_source_copy
gtk_icon_source_free
gtk_icon_source_get_direction
gtk_icon_source_get_direction_wildcarded
-gtk_icon_source_get_filename
+gtk_icon_source_get_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_source_get_filename_utf8
+#endif
gtk_icon_source_get_icon_name
gtk_icon_source_get_pixbuf
gtk_icon_source_get_size
@@ -1055,7 +1109,10 @@ gtk_icon_source_get_type G_GNUC_CONST
gtk_icon_source_new
gtk_icon_source_set_direction
gtk_icon_source_set_direction_wildcarded
-gtk_icon_source_set_filename
+gtk_icon_source_set_filename PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_source_set_filename_utf8
+#endif
gtk_icon_source_set_icon_name
gtk_icon_source_set_pixbuf
gtk_icon_source_set_size
@@ -1063,25 +1120,37 @@ gtk_icon_source_set_size_wildcarded
gtk_icon_source_set_state
gtk_icon_source_set_state_wildcarded
gtk_icon_theme_add_builtin_icon
-gtk_icon_theme_append_search_path
+gtk_icon_theme_append_search_path PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_theme_append_search_path_utf8
+#endif
gtk_icon_theme_error_get_type
gtk_icon_theme_error_quark
gtk_icon_theme_get_default
gtk_icon_theme_get_example_icon_name
gtk_icon_theme_get_for_screen
gtk_icon_theme_get_icon_sizes
-gtk_icon_theme_get_search_path
+gtk_icon_theme_get_search_path PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_theme_get_search_path_utf8
+#endif
gtk_icon_theme_get_type G_GNUC_CONST
gtk_icon_theme_has_icon
gtk_icon_theme_list_icons
gtk_icon_theme_load_icon
gtk_icon_theme_lookup_icon
gtk_icon_theme_new
-gtk_icon_theme_prepend_search_path
+gtk_icon_theme_prepend_search_path PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_theme_prepend_search_path_utf8
+#endif
gtk_icon_theme_rescan_if_needed
gtk_icon_theme_set_custom_theme
gtk_icon_theme_set_screen
-gtk_icon_theme_set_search_path
+gtk_icon_theme_set_search_path PRIVATE
+#ifdef G_OS_WIN32
+gtk_icon_theme_set_search_path_utf8
+#endif
gtk_icon_view_get_markup_column
gtk_icon_view_get_model
gtk_icon_view_get_orientation
@@ -1132,7 +1201,10 @@ gtk_image_menu_item_new_with_mnemonic
gtk_image_menu_item_set_image
gtk_image_new
gtk_image_new_from_animation
-gtk_image_new_from_file
+gtk_image_new_from_file PRIVATE
+#ifdef G_OS_WIN32
+gtk_image_new_from_file_utf8
+#endif
gtk_image_new_from_icon_name
gtk_image_new_from_icon_set
gtk_image_new_from_image
@@ -1141,7 +1213,10 @@ gtk_image_new_from_pixmap
gtk_image_new_from_stock
gtk_image_set
gtk_image_set_from_animation
-gtk_image_set_from_file
+gtk_image_set_from_file PRIVATE
+#ifdef G_OS_WIN32
+gtk_image_set_from_file_utf8
+#endif
gtk_image_set_from_icon_name
gtk_image_set_from_icon_set
gtk_image_set_from_image
@@ -1666,7 +1741,10 @@ gtk_range_set_range
gtk_range_set_update_policy
gtk_range_set_value
gtk_rc_add_class_style
-gtk_rc_add_default_file
+gtk_rc_add_default_file PRIVATE
+#ifdef G_OS_WIN32
+gtk_rc_add_default_file_utf8
+#endif
gtk_rc_add_widget_class_style
gtk_rc_add_widget_name_style
gtk_rc_find_module_in_path
@@ -1679,7 +1757,10 @@ gtk_rc_get_module_dir
gtk_rc_get_style
gtk_rc_get_style_by_paths
gtk_rc_get_theme_dir
-gtk_rc_parse
+gtk_rc_parse PRIVATE
+#ifdef G_OS_WIN32
+gtk_rc_parse_utf8
+#endif
gtk_rc_parse_color
gtk_rc_parse_priority
gtk_rc_parse_state
@@ -1693,7 +1774,10 @@ gtk_rc_reparse_all
gtk_rc_reparse_all_for_settings
gtk_rc_reset_styles
gtk_rc_scanner_new
-gtk_rc_set_default_files
+gtk_rc_set_default_files PRIVATE
+#ifdef G_OS_WIN32
+gtk_rc_set_default_files_utf8
+#endif
gtk_rc_style_copy
gtk_rc_style_get_type G_GNUC_CONST
gtk_rc_style_new
@@ -2627,7 +2711,10 @@ gtk_type_init
gtk_type_new
gtk_type_unique
gtk_ui_manager_add_ui
-gtk_ui_manager_add_ui_from_file
+gtk_ui_manager_add_ui_from_file PRIVATE
+#ifdef G_OS_WIN32
+gtk_ui_manager_add_ui_from_file_utf8
+#endif
gtk_ui_manager_add_ui_from_string
gtk_ui_manager_ensure_update
gtk_ui_manager_get_accel_group
@@ -2868,7 +2955,10 @@ gtk_window_set_auto_startup_notification
gtk_window_set_decorated
gtk_window_set_default
gtk_window_set_default_icon
-gtk_window_set_default_icon_from_file
+gtk_window_set_default_icon_from_file PRIVATE
+#ifdef G_OS_WIN32
+gtk_window_set_default_icon_from_file_utf8
+#endif
gtk_window_set_default_icon_list
gtk_window_set_default_icon_name
gtk_window_set_default_size
@@ -2880,7 +2970,10 @@ gtk_window_set_geometry_hints
gtk_window_set_gravity
gtk_window_set_has_frame
gtk_window_set_icon
-gtk_window_set_icon_from_file
+gtk_window_set_icon_from_file PRIVATE
+#ifdef G_OS_WIN32
+gtk_window_set_icon_from_file_utf8
+#endif
gtk_window_set_icon_list
gtk_window_set_icon_name
gtk_window_set_keep_above
diff --git a/gtk/gtkaccelmap.c b/gtk/gtkaccelmap.c
index 647aa70d45..c4cd681dd3 100644
--- a/gtk/gtkaccelmap.c
+++ b/gtk/gtkaccelmap.c
@@ -25,6 +25,8 @@
#include "gtkmarshalers.h"
#include "gtkwindow.h" /* in lack of GtkAcceleratable */
+#include <glib/gstdio.h>
+
#include <string.h>
#include <errno.h>
#include <fcntl.h>
@@ -603,7 +605,8 @@ gtk_accel_map_load_fd (gint fd)
/**
* gtk_accel_map_load:
- * @file_name: a file containing accelerator specifications
+ * @file_name: a file containing accelerator specifications,
+ * in the GLib file name encoding
*
* Parses a file previously saved with gtk_accel_map_save() for
* accelerator specifications, and propagates them accordingly.
@@ -618,7 +621,7 @@ gtk_accel_map_load (const gchar *file_name)
if (!g_file_test (file_name, G_FILE_TEST_IS_REGULAR))
return;
- fd = open (file_name, O_RDONLY);
+ fd = g_open (file_name, O_RDONLY, 0);
if (fd < 0)
return;
@@ -713,7 +716,8 @@ gtk_accel_map_save_fd (gint fd)
/**
* gtk_accel_map_save:
- * @file_name: the file to contain accelerator specifications
+ * @file_name: the name of the file to contain accelerator specifications,
+ * in the GLib file name encoding
*
* Saves current accelerator specifications (accelerator path, key
* and modifiers) to @file_name.
@@ -727,7 +731,7 @@ gtk_accel_map_save (const gchar *file_name)
g_return_if_fail (file_name != NULL);
- fd = open (file_name, O_CREAT | O_TRUNC | O_WRONLY, 0644);
+ fd = g_open (file_name, O_CREAT | O_TRUNC | O_WRONLY, 0644);
if (fd < 0)
return;
@@ -996,3 +1000,31 @@ do_accel_map_changed (AccelEntry *entry)
entry->accel_key,
entry->accel_mods);
}
+
+#ifdef G_OS_WIN32
+
+#undef gtk_accel_map_load
+
+void
+gtk_accel_map_load (const gchar *file_name)
+{
+ gchar *utf8_file_name = g_locale_to_utf8 (file_name, -1, NULL, NULL, NULL);
+
+ gtk_accel_map_load_utf8 (utf8_file_name);
+
+ g_free (utf8_file_name);
+}
+
+#undef gtk_accel_map_save
+
+void
+gtk_accel_map_save (const gchar *file_name)
+{
+ gchar *utf8_file_name = g_locale_to_utf8 (file_name, -1, NULL, NULL, NULL);
+
+ gtk_accel_map_save_utf8 (utf8_file_name);
+
+ g_free (utf8_file_name);
+}
+
+#endif
diff --git a/gtk/gtkaccelmap.h b/gtk/gtkaccelmap.h
index 934b2374a8..932c893ab3 100644
--- a/gtk/gtkaccelmap.h
+++ b/gtk/gtkaccelmap.h
@@ -44,6 +44,13 @@ typedef void (*GtkAccelMapForeach) (gpointer data,
/* --- public API --- */
+
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_accel_map_load gtk_accel_map_load_utf8
+#define gtk_accel_map_save gtk_accel_map_save_utf8
+#endif
+
void gtk_accel_map_add_entry (const gchar *accel_path,
guint accel_key,
GdkModifierType accel_mods);
diff --git a/gtk/gtkfilechooser.c b/gtk/gtkfilechooser.c
index 59fe7b1b9d..377838809a 100644
--- a/gtk/gtkfilechooser.c
+++ b/gtk/gtkfilechooser.c
@@ -1827,3 +1827,172 @@ gtk_file_chooser_get_show_hidden (GtkFileChooser *chooser)
return show_hidden;
}
+
+#ifdef G_OS_WIN32
+
+/* DLL ABI stability backward compatibility versions */
+
+#undef gtk_file_chooser_get_filename
+
+gchar *
+gtk_file_chooser_get_filename (GtkFileChooser *chooser)
+{
+ gchar *utf8_filename = gtk_file_chooser_get_filename_utf8 (chooser);
+ gchar *retval = g_locale_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_set_filename
+
+gboolean
+gtk_file_chooser_set_filename (GtkFileChooser *chooser,
+ const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gboolean retval = gtk_file_chooser_set_filename_utf8 (chooser, utf8_filename);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_select_filename
+
+gboolean
+gtk_file_chooser_select_filename (GtkFileChooser *chooser,
+ const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gboolean retval = gtk_file_chooser_select_filename_utf8 (chooser, utf8_filename);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_unselect_filename
+
+void
+gtk_file_chooser_unselect_filename (GtkFileChooser *chooser,
+ const char *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+
+ gtk_file_chooser_unselect_filename_utf8 (chooser, utf8_filename);
+ g_free (utf8_filename);
+}
+
+#undef gtk_file_chooser_get_filenames
+
+GSList *
+gtk_file_chooser_get_filenames (GtkFileChooser *chooser)
+{
+ GSList *list = gtk_file_chooser_get_filenames_utf8 (chooser);
+ GSList *rover = list;
+
+ while (rover)
+ {
+ gchar *tem = (gchar *) rover->data;
+ rover->data = g_locale_from_utf8 ((gchar *) rover->data, -1, NULL, NULL, NULL);
+ g_free (tem);
+ rover = rover->next;
+ }
+
+ return list;
+}
+
+#undef gtk_file_chooser_set_current_folder
+
+gboolean
+gtk_file_chooser_set_current_folder (GtkFileChooser *chooser,
+ const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gboolean retval = gtk_file_chooser_set_current_folder_utf8 (chooser, utf8_filename);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_get_current_folder
+
+gchar *
+gtk_file_chooser_get_current_folder (GtkFileChooser *chooser)
+{
+ gchar *utf8_folder = gtk_file_chooser_get_current_folder_utf8 (chooser);
+ gchar *retval = g_locale_from_utf8 (utf8_folder, -1, NULL, NULL, NULL);
+
+ g_free (utf8_folder);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_get_preview_filename
+
+char *
+gtk_file_chooser_get_preview_filename (GtkFileChooser *chooser)
+{
+ char *utf8_filename = gtk_file_chooser_get_preview_filename_utf8 (chooser);
+ char *retval = g_locale_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_add_shortcut_folder
+
+gboolean
+gtk_file_chooser_add_shortcut_folder (GtkFileChooser *chooser,
+ const char *folder,
+ GError **error)
+{
+ char *utf8_folder = g_locale_to_utf8 (folder, -1, NULL, NULL, NULL);
+ gboolean retval =
+ gtk_file_chooser_add_shortcut_folder_utf8 (chooser, utf8_folder, error);
+
+ g_free (utf8_folder);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_remove_shortcut_folder
+
+gboolean
+gtk_file_chooser_remove_shortcut_folder (GtkFileChooser *chooser,
+ const char *folder,
+ GError **error)
+{
+ char *utf8_folder = g_locale_to_utf8 (folder, -1, NULL, NULL, NULL);
+ gboolean retval =
+ gtk_file_chooser_remove_shortcut_folder_utf8 (chooser, utf8_folder, error);
+
+ g_free (utf8_folder);
+
+ return retval;
+}
+
+#undef gtk_file_chooser_list_shortcut_folders
+
+GSList *
+gtk_file_chooser_list_shortcut_folders (GtkFileChooser *chooser)
+{
+ GSList *list = gtk_file_chooser_list_shortcut_folders_utf8 (chooser);
+ GSList *rover = list;
+
+ while (rover)
+ {
+ gchar *tem = (gchar *) rover->data;
+ rover->data = g_locale_from_utf8 ((gchar *) rover->data, -1, NULL, NULL, NULL);
+ g_free (tem);
+ rover = rover->next;
+ }
+
+ return list;
+}
+
+#endif
diff --git a/gtk/gtkfilechooser.h b/gtk/gtkfilechooser.h
index 1078f53a77..57ccbc4fc0 100644
--- a/gtk/gtkfilechooser.h
+++ b/gtk/gtkfilechooser.h
@@ -75,6 +75,21 @@ void gtk_file_chooser_set_current_name (GtkFileChooser *chooser,
/* Filename manipulation
*/
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_file_chooser_get_filename gtk_file_chooser_get_filename_utf8
+#define gtk_file_chooser_set_filename gtk_file_chooser_set_filename_utf8
+#define gtk_file_chooser_select_filename gtk_file_chooser_select_filename_utf8
+#define gtk_file_chooser_unselect_filename gtk_file_chooser_unselect_filename_utf8
+#define gtk_file_chooser_get_filenames gtk_file_chooser_get_filenames_utf8
+#define gtk_file_chooser_set_current_folder gtk_file_chooser_set_current_folder_utf8
+#define gtk_file_chooser_get_current_folder gtk_file_chooser_get_current_folder_utf8
+#define gtk_file_chooser_get_preview_filename gtk_file_chooser_get_preview_filename_utf8
+#define gtk_file_chooser_add_shortcut_folder gtk_file_chooser_add_shortcut_folder_utf8
+#define gtk_file_chooser_remove_shortcut_folder gtk_file_chooser_remove_shortcut_folder_utf8
+#define gtk_file_chooser_list_shortcut_folders gtk_file_chooser_list_shortcut_folders_utf8
+#endif
+
gchar * gtk_file_chooser_get_filename (GtkFileChooser *chooser);
gboolean gtk_file_chooser_set_filename (GtkFileChooser *chooser,
const char *filename);
diff --git a/gtk/gtkfilesel.c b/gtk/gtkfilesel.c
index e75c96e55c..5ab0abda8b 100644
--- a/gtk/gtkfilesel.c
+++ b/gtk/gtkfilesel.c
@@ -43,6 +43,7 @@
#endif
#include <glib.h> /* Include early to get G_OS_WIN32 etc */
+#include <glib/gstdio.h>
#if defined(G_PLATFORM_WIN32)
#include <ctype.h>
@@ -89,7 +90,6 @@
#ifdef G_OS_WIN32
#include <direct.h>
#include <io.h>
-#define mkdir(p,m) _mkdir(p)
#ifndef S_ISDIR
#define S_ISDIR(mode) ((mode)&_S_IFDIR)
#endif
@@ -1194,7 +1194,7 @@ gtk_file_selection_hide_fileop_buttons (GtkFileSelection *filesel)
* working directory and an empty filename, @filename must have a trailing
* directory separator.
*
- * The encoding of @filename is the on-disk encoding, which
+ * The encoding of @filename is preferred GLib file name encoding, which
* may not be UTF-8. See g_filename_from_utf8().
**/
void
@@ -1239,11 +1239,10 @@ gtk_file_selection_set_filename (GtkFileSelection *filesel,
* gtk_file_selection_get_filename:
* @filesel: a #GtkFileSelection
*
- * This function returns the selected filename in the on-disk encoding
- * (see g_filename_from_utf8()), which may or may not be the same as that
- * used by GTK+ (UTF-8). To convert to UTF-8, call g_filename_to_utf8().
- * The returned string points to a statically allocated buffer and
- * should be copied if you plan to keep it around.
+ * This function returns the selected filename in the GLib file name
+ * encoding. To convert to UTF-8, call g_filename_to_utf8(). The
+ * returned string points to a statically allocated buffer and should
+ * be copied if you plan to keep it around.
*
* If no file is selected then the selected directory path is returned.
*
@@ -1253,7 +1252,7 @@ G_CONST_RETURN gchar*
gtk_file_selection_get_filename (GtkFileSelection *filesel)
{
static const gchar nothing[2] = "";
- static gchar something[MAXPATHLEN*2];
+ static gchar something[MAXPATHLEN*2+1];
char *sys_filename;
const char *text;
@@ -1270,7 +1269,8 @@ gtk_file_selection_get_filename (GtkFileSelection *filesel)
g_free (fullname);
if (!sys_filename)
return nothing;
- strncpy (something, sys_filename, sizeof (something));
+ strncpy (something, sys_filename, sizeof (something) - 1);
+ something[sizeof (something) - 1] = '\0';
g_free (sys_filename);
return something;
}
@@ -1451,7 +1451,7 @@ gtk_file_selection_create_dir_confirmed (GtkWidget *widget,
goto out;
}
- if (mkdir (sys_full_path, 0777) < 0)
+ if (g_mkdir (sys_full_path, 0777) < 0)
{
buf = g_strdup_printf (_("Error creating folder \"%s\": %s\n"), dirname,
g_strerror (errno));
@@ -1581,7 +1581,7 @@ gtk_file_selection_delete_file_response (GtkDialog *dialog,
goto out;
}
- if (unlink (sys_full_path) < 0)
+ if (g_unlink (sys_full_path) < 0)
{
buf = g_strdup_printf (_("Error deleting file \"%s\": %s"),
fs->fileop_file, g_strerror (errno));
@@ -1701,7 +1701,7 @@ gtk_file_selection_rename_file_confirmed (GtkWidget *widget,
goto out2;
}
- if (rename (sys_old_filename, sys_new_filename) < 0)
+ if (g_rename (sys_old_filename, sys_new_filename) < 0)
{
buf = g_strdup_printf (_("Error renaming file \"%s\" to \"%s\": %s"),
sys_old_filename, sys_new_filename,
@@ -2458,9 +2458,8 @@ maybe_clear_entry:
* This function is intended for use when the user can select multiple files
* in the file list.
*
- * The filenames are in the encoding of g_filename_from_utf8(), which may or
- * may not be the same as that used by GTK+ (UTF-8). To convert to UTF-8, call
- * g_filename_to_utf8() on each string.
+ * The filenames are in the GLib file name encoding. To convert to
+ * UTF-8, call g_filename_to_utf8() on each string.
*
* Return value: a newly-allocated %NULL-terminated array of strings. Use
* g_strfreev() to free it.
@@ -3172,7 +3171,7 @@ open_new_dir (gchar *dir_name,
if (stat_subdirs)
{
/* Here we know path->str is a "system charset" string */
- if (stat (path->str, &ent_sbuf) >= 0 && S_ISDIR (ent_sbuf.st_mode))
+ if (g_stat (path->str, &ent_sbuf) >= 0 && S_ISDIR (ent_sbuf.st_mode))
sent->entries[n_entries].is_dir = TRUE;
else
/* stat may fail, and we don't mind, since it could be a
@@ -3226,7 +3225,7 @@ check_dir (gchar *dir_name,
initialized = TRUE;
for (i = 0; i < n_no_stat_dirs; i++)
{
- if (stat (no_stat_dirs[i].name, &no_stat_dirs[i].statbuf) == 0)
+ if (g_stat (no_stat_dirs[i].name, &no_stat_dirs[i].statbuf) == 0)
no_stat_dirs[i].present = TRUE;
}
}
@@ -3238,7 +3237,7 @@ check_dir (gchar *dir_name,
return FALSE;
}
- if (stat (sys_dir_name, result) < 0)
+ if (g_stat (sys_dir_name, result) < 0)
{
g_free (sys_dir_name);
cmpl_errno = errno;
@@ -3380,7 +3379,7 @@ correct_dir_fullname (CompletionDir* cmpl_dir)
return FALSE;
}
- if (stat (sys_filename, &sbuf) < 0)
+ if (g_stat (sys_filename, &sbuf) < 0)
{
g_free (sys_filename);
cmpl_errno = errno;
@@ -3414,7 +3413,7 @@ correct_dir_fullname (CompletionDir* cmpl_dir)
return FALSE;
}
- if (stat (sys_filename, &sbuf) < 0)
+ if (g_stat (sys_filename, &sbuf) < 0)
{
g_free (sys_filename);
cmpl_errno = errno;
@@ -3472,7 +3471,7 @@ correct_parent (CompletionDir *cmpl_dir,
return FALSE;
}
- if (stat (sys_filename, &parbuf) < 0)
+ if (g_stat (sys_filename, &parbuf) < 0)
{
g_free (sys_filename);
cmpl_errno = errno;
@@ -4036,3 +4035,59 @@ cmpl_strerror (gint err)
else
return g_strerror (err);
}
+
+#ifdef G_OS_WIN32
+
+/* DLL ABI stability backward compatibility versions */
+
+#undef gtk_file_selection_get_filename
+
+G_CONST_RETURN gchar*
+gtk_file_selection_get_filename (GtkFileSelection *filesel)
+{
+ static gchar retval[MAXPATHLEN*2+1];
+ gchar *tem;
+
+ tem = g_locale_from_utf8 (gtk_file_selection_get_filename_utf8 (filesel),
+ -1, NULL, NULL, NULL);
+
+ strncpy (retval, tem, sizeof (retval) - 1);
+ retval[sizeof (retval) - 1] = '\0';
+ g_free (tem);
+
+ return retval;
+}
+
+#undef gtk_file_selection_set_filename
+
+void
+gtk_file_selection_set_filename (GtkFileSelection *filesel,
+ const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gtk_file_selection_set_filename_utf8 (filesel, utf8_filename);
+ g_free (utf8_filename);
+}
+
+#undef gtk_file_selection_get_selections
+
+gchar **
+gtk_file_selection_get_selections (GtkFileSelection *filesel)
+{
+ int i = 0;
+ gchar **selections = gtk_file_selection_get_selections_utf8 (filesel);
+
+ if (selections != NULL)
+ while (selections[i] != NULL)
+ {
+ gchar *tem = selections[i];
+ selections[i] = g_locale_from_utf8 (selections[i],
+ -1, NULL, NULL, NULL);
+ g_free (tem);
+ i++;
+ }
+
+ return selections;
+}
+
+#endif /* G_OS_WIN32 */
diff --git a/gtk/gtkfilesel.h b/gtk/gtkfilesel.h
index 9f819a17f8..7595095d66 100644
--- a/gtk/gtkfilesel.h
+++ b/gtk/gtkfilesel.h
@@ -94,16 +94,17 @@ struct _GtkFileSelectionClass
};
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_file_selection_get_filename gtk_file_selection_get_filename_utf8
+#define gtk_file_selection_set_filename gtk_file_selection_set_filename_utf8
+#define gtk_file_selection_get_selections gtk_file_selection_get_selections_utf8
+#endif
+
GType gtk_file_selection_get_type (void) G_GNUC_CONST;
GtkWidget* gtk_file_selection_new (const gchar *title);
void gtk_file_selection_set_filename (GtkFileSelection *filesel,
const gchar *filename);
-/* This function returns the selected filename in the C runtime's
- * multibyte string encoding, which may or may not be the same as that
- * used by GDK (UTF-8). To convert to UTF-8, call g_filename_to_utf8().
- * The returned string points to a statically allocated buffer and
- * should be copied away.
- */
G_CONST_RETURN gchar* gtk_file_selection_get_filename (GtkFileSelection *filesel);
void gtk_file_selection_complete (GtkFileSelection *filesel,
diff --git a/gtk/gtkfilesystemwin32.c b/gtk/gtkfilesystemwin32.c
index f70fee98b2..8687a9e08a 100644
--- a/gtk/gtkfilesystemwin32.c
+++ b/gtk/gtkfilesystemwin32.c
@@ -27,6 +27,8 @@
#include "gtkstock.h"
#include "gtkiconfactory.h"
+#include <glib/gstdio.h>
+
#include <errno.h>
#include <stdio.h>
#include <string.h>
@@ -39,7 +41,6 @@
#include <shellapi.h> /* ExtractAssociatedIcon */
#include <direct.h>
#include <io.h>
-#define mkdir(p,m) _mkdir(p)
#include <gdk/win32/gdkwin32.h> /* gdk_win32_hdc_get */
#else
#error "The implementation is win32 only."
@@ -371,10 +372,10 @@ gtk_file_system_win32_get_volume_for_path (GtkFileSystem *file_system,
}
static GtkFileFolder *
-gtk_file_system_win32_get_folder (GtkFileSystem *file_system,
- const GtkFilePath *path,
- GtkFileInfoType types,
- GError **error)
+gtk_file_system_win32_get_folder (GtkFileSystem *file_system,
+ const GtkFilePath *path,
+ GtkFileInfoType types,
+ GError **error)
{
GtkFileSystemWin32 *system_win32;
GtkFileFolderWin32 *folder_win32;
@@ -393,7 +394,7 @@ gtk_file_system_win32_get_folder (GtkFileSystem *file_system,
if (!g_file_test (filename, G_FILE_TEST_IS_DIR))
{
int save_errno = errno;
- gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gchar *display_filename = g_filename_display_name (filename);
/* If g_file_test() returned FALSE but not due to an error, it means
* that the filename is not a directory.
@@ -404,17 +405,17 @@ gtk_file_system_win32_get_folder (GtkFileSystem *file_system,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NOT_FOLDER,
_("%s: %s"),
- filename_utf8 ? filename_utf8 : "???",
+ display_filename,
g_strerror (ENOTDIR));
else
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NONEXISTENT,
_("error getting information for '%s': %s"),
- filename_utf8 ? filename_utf8 : "???",
+ display_filename,
g_strerror (save_errno));
- g_free (filename_utf8);
+ g_free (display_filename);
return NULL;
}
@@ -443,18 +444,18 @@ gtk_file_system_win32_create_folder (GtkFileSystem *file_system,
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, FALSE);
- result = mkdir (filename, 0777) == 0;
+ result = g_mkdir (filename, 0777) == 0;
if (!result)
{
- gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
+ gchar *display_filename = g_filename_display_name (filename);
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NONEXISTENT,
_("error creating directory '%s': %s"),
- filename_utf8 ? filename_utf8 : "???",
+ display_filename,
g_strerror (errno));
- g_free (filename_utf8);
+ g_free (display_filename);
}
else if (!filename_is_drive_root (filename))
{
@@ -517,7 +518,7 @@ gtk_file_system_win32_volume_mount (GtkFileSystem *file_system,
static gchar *
gtk_file_system_win32_volume_get_display_name (GtkFileSystem *file_system,
- GtkFileSystemVolume *volume)
+ GtkFileSystemVolume *volume)
{
gchar *real_display_name;
gunichar2 *wdrive = g_utf8_to_utf16 (volume->drive, -1, NULL, NULL, NULL);
@@ -526,12 +527,12 @@ gtk_file_system_win32_volume_get_display_name (GtkFileSystem *file_system,
g_return_val_if_fail (wdrive != NULL, NULL);
if (GetVolumeInformationW (wdrive,
- wname, G_N_ELEMENTS(wname),
- NULL, /* serial number */
- NULL, /* max. component length */
- NULL, /* fs flags */
- NULL, 0) /* fs type like FAT, NTFS */
- && wname[0])
+ wname, G_N_ELEMENTS(wname),
+ NULL, /* serial number */
+ NULL, /* max. component length */
+ NULL, /* fs flags */
+ NULL, 0) /* fs type like FAT, NTFS */
+ && wname[0])
{
gchar *name = g_utf16_to_utf8 (wname, -1, NULL, NULL, NULL);
real_display_name = g_strconcat (name, " (", volume->drive, ")", NULL);
@@ -547,10 +548,10 @@ gtk_file_system_win32_volume_get_display_name (GtkFileSystem *file_system,
static GdkPixbuf *
gtk_file_system_win32_volume_render_icon (GtkFileSystem *file_system,
- GtkFileSystemVolume *volume,
- GtkWidget *widget,
- gint pixel_size,
- GError **error)
+ GtkFileSystemVolume *volume,
+ GtkWidget *widget,
+ gint pixel_size,
+ GError **error)
{
GtkIconSet *icon_set = NULL;
DWORD dt = GetDriveType (volume->drive);
@@ -618,32 +619,15 @@ gtk_file_system_win32_make_path (GtkFileSystem *file_system,
GError **error)
{
const char *base_filename;
- gchar *filename;
gchar *full_filename;
- GError *tmp_error = NULL;
GtkFilePath *result;
base_filename = gtk_file_path_get_string (base_path);
g_return_val_if_fail (base_filename != NULL, NULL);
g_return_val_if_fail (g_path_is_absolute (base_filename), NULL);
- filename = g_filename_from_utf8 (display_name, -1, NULL, NULL, &tmp_error);
- if (!filename)
- {
- g_set_error (error,
- GTK_FILE_SYSTEM_ERROR,
- GTK_FILE_SYSTEM_ERROR_BAD_FILENAME,
- "%s",
- tmp_error->message);
-
- g_error_free (tmp_error);
-
- return NULL;
- }
-
- full_filename = g_build_filename (base_filename, filename, NULL);
+ full_filename = g_build_filename (base_filename, display_name, NULL);
result = filename_to_path (full_filename);
- g_free (filename);
g_free (full_filename);
return result;
@@ -780,19 +764,16 @@ gtk_file_system_win32_parse (GtkFileSystem *file_system,
{
if (g_ascii_isalpha (base_filename[0]) &&
base_filename[1] == ':')
- folder_part = g_strdup_printf ("%c:%c", base_filename[0],
- G_DIR_SEPARATOR);
+ folder_part = g_strdup_printf ("%c:" G_DIR_SEPARATOR_S, base_filename[0]);
else
folder_part = g_strdup (G_DIR_SEPARATOR_S);
}
else if (g_ascii_isalpha (str[0]) &&
str[1] == ':' &&
G_IS_DIR_SEPARATOR (str[2]))
- folder_part = g_filename_from_utf8 (str, last_slash - str + 1,
- NULL, NULL, &tmp_error);
+ folder_part = g_strdup_printf ("%c:" G_DIR_SEPARATOR_S, str[0]);
else
- folder_part = g_filename_from_utf8 (str, last_slash - str,
- NULL, NULL, &tmp_error);
+ folder_part = g_strndup (str, last_slash - str);
if (!folder_part)
{
@@ -904,7 +885,7 @@ bookmarks_serialize (GSList **bookmarks,
else
ok = FALSE;
}
- if (ok && (f = fopen (filename, "wb")) != NULL)
+ if (ok && (f = g_fopen (filename, "wb")) != NULL)
{
entry = g_slist_find_custom (list, uri, (GCompareFunc) strcmp);
if (add)
@@ -1294,7 +1275,6 @@ gtk_file_folder_win32_get_info (GtkFileFolder *folder,
{
GtkFileFolderWin32 *folder_win32 = GTK_FILE_FOLDER_WIN32 (folder);
GtkFileInfo *info;
- gchar *dirname;
gchar *filename;
if (!path)
@@ -1310,12 +1290,6 @@ gtk_file_folder_win32_get_info (GtkFileFolder *folder,
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, NULL);
-#if 0
- dirname = g_path_get_dirname (filename);
- g_return_val_if_fail (strcmp (dirname, folder_win32->filename) == 0, NULL);
- g_free (dirname);
-#endif
-
info = filename_get_info (filename, folder_win32->types, error);
g_free (filename);
@@ -1378,17 +1352,39 @@ filename_get_info (const gchar *filename,
GtkFileIconType icon_type = GTK_FILE_ICON_REGULAR;
#endif
WIN32_FILE_ATTRIBUTE_DATA wfad;
+ int rc = 0;
- if (!GetFileAttributesEx (filename, GetFileExInfoStandard, &wfad))
+ if (G_WIN32_HAVE_WIDECHAR_API ())
{
- gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, error);
+
+ if (!wfilename)
+ return NULL;
+
+ rc = GetFileAttributesExW (wfilename, GetFileExInfoStandard, &wfad);
+ g_free (wfilename);
+ }
+ else
+ {
+ char *cpfilename = g_locale_from_utf8 (filename, -1, NULL, NULL, error);
+
+ if (!cpfilename)
+ return NULL;
+
+ rc = GetFileAttributesExA (cpfilename, GetFileExInfoStandard, &wfad);
+ g_free (cpfilename);
+ }
+
+ if (!rc)
+ {
+ gchar *display_filename = g_filename_display_name (filename);
g_set_error (error,
GTK_FILE_SYSTEM_ERROR,
GTK_FILE_SYSTEM_ERROR_NONEXISTENT,
_("error getting information for '%s': %s"),
- filename_utf8 ? filename_utf8 : "???",
+ display_filename,
g_win32_error_message (GetLastError ()));
- g_free (filename_utf8);
+ g_free (display_filename);
return NULL;
}
@@ -1409,21 +1405,17 @@ filename_get_info (const gchar *filename,
if (types & GTK_FILE_INFO_DISPLAY_NAME)
{
- gchar *display_name = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
- if (!display_name)
- display_name = g_strescape (basename, NULL);
-
- gtk_file_info_set_display_name (info, display_name);
+ gchar *display_basename = g_filename_display_name (basename);
- g_free (display_name);
+ gtk_file_info_set_display_name (info, display_basename);
+ g_free (display_basename);
}
if (types & GTK_FILE_INFO_IS_HIDDEN)
{
- /* win32 convention ... */
- gboolean is_hidden = basename[0] == '.';
- /* ... _and_ windoze attribute */
- is_hidden = is_hidden || !!(wfad.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN);
+ /* Unix dot convention or the Windows hidden attribute */
+ gboolean is_hidden = basename[0] == '.' ||
+ !!(wfad.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN);
gtk_file_info_set_is_hidden (info, is_hidden);
}
diff --git a/gtk/gtkiconcache.c b/gtk/gtkiconcache.c
index 03f6f3bf44..fc44d036de 100644
--- a/gtk/gtkiconcache.c
+++ b/gtk/gtkiconcache.c
@@ -20,11 +20,13 @@
#include <config.h>
#include "gtkdebug.h"
#include "gtkiconcache.h"
+#include <glib/gstdio.h>
#ifdef HAVE_MMAP
#include <sys/mman.h>
#endif
#ifdef G_OS_WIN32
+#include <windows.h>
#include <io.h>
#endif
#include <sys/types.h>
@@ -35,6 +37,10 @@
#include <fcntl.h>
#include <string.h>
+#ifndef _O_BINARY
+#define _O_BINARY 0
+#endif
+
#define MAJOR_VERSION 1
#define MINOR_VERSION 0
@@ -46,6 +52,9 @@ struct _GtkIconCache {
gsize size;
gchar *buffer;
+#ifdef G_OS_WIN32
+ HANDLE handle;
+#endif
};
GtkIconCache *
@@ -67,6 +76,10 @@ _gtk_icon_cache_unref (GtkIconCache *cache)
#ifdef HAVE_MMAP
munmap (cache->buffer, cache->size);
#endif
+#ifdef G_OS_WIN32
+ UnmapViewOfFile (cache->buffer);
+ CloseHandle (cache->handle);
+#endif
g_free (cache);
}
}
@@ -75,12 +88,16 @@ GtkIconCache *
_gtk_icon_cache_new_for_path (const gchar *path)
{
GtkIconCache *cache = NULL;
-#ifdef HAVE_MMAP
+
+#if defined(HAVE_MMAP) || defined(G_OS_WIN32)
gchar *cache_filename;
- gint fd;
+ gint fd = -1;
struct stat st;
struct stat path_st;
- gchar *buffer;
+ gchar *buffer = NULL;
+#ifdef G_OS_WIN32
+ HANDLE handle = NULL;
+#endif
if (g_getenv ("GTK_NO_ICON_CACHE"))
return NULL;
@@ -91,8 +108,14 @@ _gtk_icon_cache_new_for_path (const gchar *path)
GTK_NOTE (ICONTHEME,
g_print ("look for cache in %s\n", path));
- /* Open the file and mmap it */
- fd = open (cache_filename, O_RDONLY);
+ if (!g_file_test (cache_filename, G_FILE_TEST_IS_REGULAR))
+ goto done;
+
+ if (g_stat (path, &path_st) < 0)
+ goto done;
+
+ /* Open the file and map it into memory */
+ fd = g_open (cache_filename, O_RDONLY|_O_BINARY, 0);
if (fd < 0)
{
@@ -100,15 +123,9 @@ _gtk_icon_cache_new_for_path (const gchar *path)
return NULL;
}
- if (!g_file_test (cache_filename, G_FILE_TEST_IS_REGULAR))
- goto done;
-
if (fstat (fd, &st) < 0 || st.st_size < 4)
goto done;
- if (stat (path, &path_st) < 0)
- goto done;
-
/* Verify cache is uptodate */
if (st.st_mtime < path_st.st_mtime)
{
@@ -117,16 +134,36 @@ _gtk_icon_cache_new_for_path (const gchar *path)
goto done;
}
+#ifndef G_OS_WIN32
buffer = (gchar *) mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (buffer == MAP_FAILED)
goto done;
+#else
+ handle = CreateFileMapping (_get_osfhandle (fd), NULL, PAGE_READONLY,
+ 0, 0, NULL);
+ if (handle == NULL)
+ goto done;
+
+ buffer = MapViewOfFile (handle, FILE_MAP_READ, 0, 0, 0);
+
+ if (buffer == NULL)
+ {
+ CloseHandle (handle);
+ goto done;
+ }
+#endif
/* Verify version */
if (GET_UINT16 (buffer, 0) != MAJOR_VERSION ||
GET_UINT16 (buffer, 2) != MINOR_VERSION)
{
+#ifndef G_OS_WIN32
munmap (buffer, st.st_size);
+#else
+ UnmapViewOfFile (buffer);
+ CloseHandle (handle);
+#endif
GTK_NOTE (ICONTHEME,
g_print ("wrong cache version\n"));
goto done;
@@ -138,12 +175,16 @@ _gtk_icon_cache_new_for_path (const gchar *path)
cache = g_new0 (GtkIconCache, 1);
cache->ref_count = 1;
cache->buffer = buffer;
+#ifdef G_OS_WIN32
+ cache->handle = handle;
+#endif
cache->size = st.st_size;
done:
g_free (cache_filename);
- close (fd);
+ if (fd != -1)
+ close (fd);
-#endif /* HAVE_MMAP */
+#endif /* HAVE_MMAP || G_OS_WIN32 */
return cache;
}
diff --git a/gtk/gtkiconfactory.c b/gtk/gtkiconfactory.c
index daa68c63cb..ceec68cb50 100644
--- a/gtk/gtkiconfactory.c
+++ b/gtk/gtkiconfactory.c
@@ -58,7 +58,7 @@ struct _GtkIconSource
gchar *filename;
GdkPixbuf *pixbuf;
} source;
-
+
GdkPixbuf *filename_pixbuf;
GtkTextDirection direction;
@@ -72,6 +72,13 @@ struct _GtkIconSource
guint any_direction : 1;
guint any_state : 1;
guint any_size : 1;
+
+#ifdef G_OS_WIN32
+ /* System codepage version of filename, for DLL ABI backward
+ * compatibility functions.
+ */
+ gchar *cp_filename;
+#endif
};
static gpointer parent_class = NULL;
@@ -2131,6 +2138,9 @@ gtk_icon_source_copy (const GtkIconSource *source)
break;
case GTK_ICON_SOURCE_FILENAME:
copy->source.filename = g_strdup (copy->source.filename);
+#ifdef G_OS_WIN32
+ copy->cp_filename = g_strdup (copy->cp_filename);
+#endif
if (copy->filename_pixbuf)
g_object_ref (copy->filename_pixbuf);
break;
@@ -2187,6 +2197,10 @@ icon_source_clear (GtkIconSource *source)
case GTK_ICON_SOURCE_FILENAME:
g_free (source->source.filename);
source->source.filename = NULL;
+#ifdef G_OS_WIN32
+ g_free (source->cp_filename);
+ source->cp_filename = NULL;
+#endif
if (source->filename_pixbuf)
g_object_unref (source->filename_pixbuf);
source->filename_pixbuf = NULL;
@@ -2227,6 +2241,9 @@ gtk_icon_source_set_filename (GtkIconSource *source,
{
source->type = GTK_ICON_SOURCE_FILENAME;
source->source.filename = g_strdup (filename);
+#ifdef G_OS_WIN32
+ source->cp_filename = g_locale_from_utf8 (filename, -1, NULL, NULL, NULL);
+#endif
}
}
@@ -2939,3 +2956,35 @@ _gtk_icon_factory_list_ids (void)
return ids;
}
+
+#ifdef G_OS_WIN32
+
+/* DLL ABI stability backward compatibility versions */
+
+#undef gtk_icon_source_set_filename
+
+void
+gtk_icon_source_set_filename (GtkIconSource *source,
+ const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+
+ gtk_icon_source_set_filename_utf8 (source, utf8_filename);
+
+ g_free (utf8_filename);
+}
+
+#undef gtk_icon_source_get_filename
+
+G_CONST_RETURN gchar*
+gtk_icon_source_get_filename (const GtkIconSource *source)
+{
+ g_return_val_if_fail (source != NULL, NULL);
+
+ if (source->type == GTK_ICON_SOURCE_FILENAME)
+ return source->cp_filename;
+ else
+ return NULL;
+}
+
+#endif
diff --git a/gtk/gtkiconfactory.h b/gtk/gtkiconfactory.h
index fd22b8db54..43c90a30bc 100644
--- a/gtk/gtkiconfactory.h
+++ b/gtk/gtkiconfactory.h
@@ -63,6 +63,12 @@ struct _GtkIconFactoryClass
void (*_gtk_reserved4) (void);
};
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_icon_source_set_filename gtk_icon_source_set_filename_utf8
+#define gtk_icon_source_get_filename gtk_icon_source_get_filename_utf8
+#endif
+
GType gtk_icon_factory_get_type (void) G_GNUC_CONST;
GtkIconFactory* gtk_icon_factory_new (void);
void gtk_icon_factory_add (GtkIconFactory *factory,
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index e5fa201066..09336f6678 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -27,6 +27,7 @@
#include <string.h>
#include <stdlib.h>
#include <glib.h>
+#include <glib/gstdio.h>
#include "gtkalias.h"
#ifdef G_OS_WIN32
@@ -103,6 +104,12 @@ struct _GtkIconInfo
/* Information about the source
*/
gchar *filename;
+#ifdef G_OS_WIN32
+ /* System codepage version of filename, for DLL ABI backward
+ * compatibility functions.
+ */
+ gchar *cp_filename;
+#endif
GdkPixbuf *builtin_pixbuf;
GtkIconData *data;
@@ -885,7 +892,7 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name)
NULL);
dir_mtime = g_new (IconThemeDirMtime, 1);
dir_mtime->dir = path;
- if (stat (path, &stat_buf) == 0 && S_ISDIR (stat_buf.st_mode))
+ if (g_stat (path, &stat_buf) == 0 && S_ISDIR (stat_buf.st_mode))
dir_mtime->mtime = stat_buf.st_mtime;
else
dir_mtime->mtime = 0;
@@ -1214,6 +1221,10 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
icon_info->filename = g_strdup (unthemed_icon->svg_filename);
else if (unthemed_icon->no_svg_filename)
icon_info->filename = g_strdup (unthemed_icon->no_svg_filename);
+#ifdef G_OS_WIN32
+ icon_info->cp_filename = g_locale_from_utf8 (icon_info->filename,
+ -1, NULL, NULL, NULL);
+#endif
icon_info->dir_type = ICON_THEME_DIR_UNTHEMED;
}
@@ -1629,7 +1640,7 @@ gtk_icon_theme_rescan_if_needed (GtkIconTheme *icon_theme)
{
dir_mtime = d->data;
- stat_res = stat (dir_mtime->dir, &stat_buf);
+ stat_res = g_stat (dir_mtime->dir, &stat_buf);
/* dir mtime didn't change */
if (stat_res == 0 &&
@@ -1880,7 +1891,10 @@ theme_lookup_icon (IconTheme *theme,
file = g_strconcat (icon_name, string_from_suffix (suffix), NULL);
icon_info->filename = g_build_filename (min_dir->dir, file, NULL);
g_free (file);
-
+#ifdef G_OS_WIN32
+ icon_info->cp_filename = g_locale_from_utf8 (icon_info->filename,
+ -1, NULL, NULL, NULL);
+#endif
if (min_dir->cache && has_icon_file)
{
gchar *icon_file_name, *icon_file_path;
@@ -2282,6 +2296,10 @@ gtk_icon_info_copy (GtkIconInfo *icon_info)
copy->load_error = g_error_copy (copy->load_error);
if (copy->filename)
copy->filename = g_strdup (copy->filename);
+#ifdef G_OS_WIN32
+ if (copy->cp_filename)
+ copy->cp_filename = g_strdup (copy->cp_filename);
+#endif
return copy;
}
@@ -2301,6 +2319,10 @@ gtk_icon_info_free (GtkIconInfo *icon_info)
if (icon_info->filename)
g_free (icon_info->filename);
+#ifdef G_OS_WIN32
+ if (icon_info->cp_filename)
+ g_free (icon_info->cp_filename);
+#endif
if (icon_info->builtin_pixbuf)
g_object_unref (icon_info->builtin_pixbuf);
if (icon_info->pixbuf)
@@ -2900,3 +2922,94 @@ find_builtin_icon (const gchar *icon_name,
return min_icon;
}
+
+#ifdef G_OS_WIN32
+
+/* DLL ABI stability backward compatibility versions */
+
+#undef gtk_icon_theme_set_search_path
+
+void
+gtk_icon_theme_set_search_path (GtkIconTheme *icon_theme,
+ const gchar *path[],
+ gint n_elements)
+{
+ const gchar **utf8_path;
+ gint i;
+
+ utf8_path = g_new (const gchar *, n_elements);
+
+ for (i = 0; i < n_elements; i++)
+ utf8_path[i] = g_locale_to_utf8 (path[i], -1, NULL, NULL, NULL);
+
+ gtk_icon_theme_set_search_path_utf8 (icon_theme, utf8_path, n_elements);
+
+ for (i = 0; i < n_elements; i++)
+ g_free ((gchar *) utf8_path[i]);
+
+ g_free (utf8_path);
+}
+
+#undef gtk_icon_theme_get_search_path
+
+void
+gtk_icon_theme_get_search_path (GtkIconTheme *icon_theme,
+ gchar **path[],
+ gint *n_elements)
+{
+ gint i, n;
+
+ gtk_icon_theme_get_search_path_utf8 (icon_theme, path, &n);
+
+ if (n_elements)
+ *n_elements = n;
+
+ if (path)
+ {
+ for (i = 0; i < n; i++)
+ {
+ gchar *tem = (*path)[i];
+
+ (*path)[i] = g_locale_from_utf8 ((*path)[i], -1, NULL, NULL, NULL);
+ g_free (tem);
+ }
+ }
+}
+
+#undef gtk_icon_theme_append_search_path
+
+void
+gtk_icon_theme_append_search_path (GtkIconTheme *icon_theme,
+ const gchar *path)
+{
+ gchar *utf8_path = g_locale_from_utf8 (path, -1, NULL, NULL, NULL);
+
+ gtk_icon_theme_append_search_path_utf8 (icon_theme, utf8_path);
+
+ g_free (utf8_path);
+}
+
+#undef gtk_icon_theme_prepend_search_path
+
+void
+gtk_icon_theme_prepend_search_path (GtkIconTheme *icon_theme,
+ const gchar *path)
+{
+ gchar *utf8_path = g_locale_from_utf8 (path, -1, NULL, NULL, NULL);
+
+ gtk_icon_theme_prepend_search_path_utf8 (icon_theme, utf8_path);
+
+ g_free (utf8_path);
+}
+
+#undef gtk_icon_info_get_filename
+
+G_CONST_RETURN gchar *
+gtk_icon_info_get_filename (GtkIconInfo *icon_info)
+{
+ g_return_val_if_fail (icon_info != NULL, NULL);
+
+ return icon_info->cp_filename;
+}
+
+#endif
diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h
index 7b7f2b1fc3..7b8bef1f89 100644
--- a/gtk/gtkicontheme.h
+++ b/gtk/gtkicontheme.h
@@ -92,6 +92,15 @@ typedef enum {
GQuark gtk_icon_theme_error_quark (void);
+#ifdef G_OS_WIN32
+/* Reserve old name for DLL ABI backward compatibility */
+#define gtk_icon_theme_set_search_path gtk_icon_theme_set_search_path_utf8
+#define gtk_icon_theme_get_search_path gtk_icon_theme_get_search_path_utf8
+#define gtk_icon_theme_append_search_path gtk_icon_theme_append_search_path_utf8
+#define gtk_icon_theme_prepend_search_path gtk_icon_theme_prepend_search_path_utf8
+#define gtk_icon_info_get_filename gtk_icon_info_get_filename_utf8
+#endif
+
GType gtk_icon_theme_get_type (void) G_GNUC_CONST;
GtkIconTheme *gtk_icon_theme_new (void);
diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c
index de530f08d4..577f483106 100644
--- a/gtk/gtkimage.c
+++ b/gtk/gtkimage.c
@@ -2106,3 +2106,35 @@ gtk_image_get_pixel_size (GtkImage *image)
return priv->pixel_size;
}
+
+#ifdef G_OS_WIN32
+
+#undef gtk_image_new_from_file
+
+GtkWidget*
+gtk_image_new_from_file (const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+ GtkWidget *retval;
+
+ retval = gtk_image_new_from_file_utf8 (utf8_filename);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_image_set_from_file
+
+void
+gtk_image_set_from_file (GtkImage *image,
+ const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+
+ gtk_image_set_from_file_utf8 (image, utf8_filename);
+
+ g_free (utf8_filename);
+}
+
+#endif
diff --git a/gtk/gtkimage.h b/gtk/gtkimage.h
index a84928d037..829666220b 100644
--- a/gtk/gtkimage.h
+++ b/gtk/gtkimage.h
@@ -141,6 +141,12 @@ struct _GtkImageClass
void (*_gtk_reserved4) (void);
};
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_image_new_from_file gtk_image_new_from_file_utf8
+#define gtk_image_set_from_file gtk_image_set_from_file_utf8
+#endif
+
GType gtk_image_get_type (void) G_GNUC_CONST;
GtkWidget* gtk_image_new (void);
diff --git a/gtk/gtkimmodule.c b/gtk/gtkimmodule.c
index 8043d2cca6..7de9133f7e 100644
--- a/gtk/gtkimmodule.c
+++ b/gtk/gtkimmodule.c
@@ -32,6 +32,7 @@
#include <stdlib.h>
#include <string.h>
+#include <glib/gstdio.h>
#include <gmodule.h>
#include <pango/pango-utils.h>
#include "gtkalias.h"
@@ -45,6 +46,10 @@
* else.
*/
+#ifdef __GTK_PRIVATE_H__
+#error gtkprivate.h should not be included in this file
+#endif
+
#define SIMPLE_ID "gtk-im-context-simple"
typedef struct _GtkIMModule GtkIMModule;
@@ -279,7 +284,7 @@ gtk_im_module_init (void)
contexts_hash = g_hash_table_new (g_str_hash, g_str_equal);
- file = fopen (filename, "r");
+ file = g_fopen (filename, "r");
if (!file)
{
/* In case someone wants only the default input method,
@@ -353,7 +358,7 @@ gtk_im_module_init (void)
goto context_error;
info->domain_dirname = g_strdup (tmp_buf->str);
#ifdef DO_CORRECT_LIBDIR_PREFIX
- correct_libdir_prefix (&info->domain_dirname);
+ correct_libdir_prefix ((char **) &info->domain_dirname);
#endif
if (!pango_scan_string (&p, tmp_buf))
diff --git a/gtk/gtkmodules.c b/gtk/gtkmodules.c
index 0bec50a574..2e73f1bfed 100644
--- a/gtk/gtkmodules.c
+++ b/gtk/gtkmodules.c
@@ -70,6 +70,13 @@ get_module_path (void)
module_path_env = g_getenv ("GTK_PATH");
exe_prefix = g_getenv ("GTK_EXE_PREFIX");
+#ifdef G_OS_WIN32
+ if (module_path_env)
+ module_path_env = g_locale_to_utf8 (module_path_env, -1, NULL, NULL, NULL);
+ if (exe_prefix)
+ exe_prefix = g_locale_to_utf8 (exe_prefix, -1, NULL, NULL, NULL);
+#endif
+
if (exe_prefix)
default_dir = g_build_filename (exe_prefix, "lib", "gtk-2.0", NULL);
else
@@ -88,6 +95,13 @@ get_module_path (void)
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
default_dir, NULL);
+#ifdef G_OS_WIN32
+ if (module_path_env)
+ g_free ((void *) module_path_env);
+ if (exe_prefix)
+ g_free ((void *) exe_prefix);
+#endif
+
g_free (home_gtk_dir);
g_free (default_dir);
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index 69b429e7d0..ccbe5b4cba 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -41,11 +41,8 @@
#include "gtkalias.h"
-#ifndef HAVE_LSTAT
-#define lstat stat
-#endif
-
#include <glib.h>
+#include <glib/gstdio.h>
#include "gdkconfig.h"
#include "gtkversion.h"
@@ -313,11 +310,21 @@ gtk_rc_make_default_dir (const gchar *type)
gchar *path;
var = g_getenv ("GTK_EXE_PREFIX");
+
+#ifdef G_OS_WIN32
+ if (var)
+ var = g_locale_to_utf8 (var, -1, NULL, NULL, NULL);
+#endif
+
if (var)
path = g_build_filename (var, "lib", "gtk-2.0", GTK_BINARY_VERSION, type, NULL);
else
path = g_build_filename (GTK_LIBDIR, "gtk-2.0", GTK_BINARY_VERSION, type, NULL);
+#ifdef G_OS_WIN32
+ g_free ((void *) var);
+#endif
+
return path;
}
@@ -354,7 +361,16 @@ gtk_rc_get_im_module_path (void)
gchar *
gtk_rc_get_im_module_file (void)
{
- gchar *result = g_strdup (g_getenv ("GTK_IM_MODULE_FILE"));
+ const gchar *var = g_getenv ("GTK_IM_MODULE_FILE");
+ gchar *result = NULL;
+
+#ifdef G_OS_WIN32
+ if (var)
+ var = g_locale_to_utf8 (var, -1, NULL, NULL, NULL);
+#endif
+
+ if (var)
+ result = g_strdup (var);
if (!result)
{
@@ -364,6 +380,11 @@ gtk_rc_get_im_module_file (void)
result = g_build_filename (GTK_SYSCONFDIR, "gtk-2.0", "gtk.immodules", NULL);
}
+#ifdef G_OS_WIN32
+ if (var)
+ g_free ((void *) var);
+#endif
+
return result;
}
@@ -374,11 +395,22 @@ gtk_rc_get_theme_dir (void)
gchar *path;
var = g_getenv ("GTK_DATA_PREFIX");
+
+#ifdef G_OS_WIN32
+ if (var)
+ var = g_locale_to_utf8 (var, -1, NULL, NULL, NULL);
+#endif
+
if (var)
path = g_build_filename (var, "share", "themes", NULL);
else
path = g_build_filename (GTK_DATA_PREFIX, "share", "themes", NULL);
+#ifdef G_OS_WIN32
+ if (var)
+ g_free ((void *) var);
+#endif
+
return path;
}
@@ -414,6 +446,12 @@ gtk_rc_add_initial_default_files (void)
init = TRUE;
var = g_getenv ("GTK2_RC_FILES");
+
+#ifdef G_OS_WIN32
+ if (var)
+ var = g_locale_to_utf8 (var, -1, NULL, NULL, NULL);
+#endif
+
if (var)
{
files = g_strsplit (var, G_SEARCHPATH_SEPARATOR_S, 128);
@@ -427,19 +465,25 @@ gtk_rc_add_initial_default_files (void)
}
else
{
+ const gchar *home;
str = g_build_filename (GTK_SYSCONFDIR, "gtk-2.0", "gtkrc", NULL);
gtk_rc_add_default_file (str);
g_free (str);
- var = g_get_home_dir ();
- if (var)
+ home = g_get_home_dir ();
+ if (home)
{
- str = g_build_filename (var, ".gtkrc-2.0", NULL);
+ str = g_build_filename (home, ".gtkrc-2.0", NULL);
gtk_rc_add_default_file (str);
g_free (str);
}
}
+
+#ifdef G_OS_WIN32
+ if (var)
+ g_free ((void *) var);
+#endif
}
/**
@@ -805,13 +849,13 @@ gtk_rc_context_parse_one_file (GtkRcContext *context,
if (g_slist_find (current_files_stack, rc_file))
return;
- if (!lstat (rc_file->canonical_name, &statbuf))
+ if (!g_lstat (rc_file->canonical_name, &statbuf))
{
gint fd;
rc_file->mtime = statbuf.st_mtime;
- fd = open (rc_file->canonical_name, O_RDONLY);
+ fd = g_open (rc_file->canonical_name, O_RDONLY, 0);
if (fd < 0)
goto out;
@@ -1457,7 +1501,7 @@ gtk_rc_reparse_all_for_settings (GtkSettings *settings,
if (!rc_file->is_string)
{
- if (!lstat (rc_file->name, &statbuf) &&
+ if (!g_lstat (rc_file->name, &statbuf) &&
(statbuf.st_mtime > rc_file->mtime))
{
mtime_modified = TRUE;
@@ -3907,3 +3951,56 @@ gtk_rc_parse_stock (GtkRcContext *context,
return G_TOKEN_NONE;
}
+
+#ifdef G_OS_WIN32
+
+/* DLL ABI stability backward compatibility versions */
+
+#undef gtk_rc_add_default_file
+
+void
+gtk_rc_add_default_file (const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+
+ gtk_rc_add_default_file_utf8 (utf8_filename);
+
+ g_free (utf8_filename);
+}
+
+#undef gtk_rc_set_default_files
+
+void
+gtk_rc_set_default_files (gchar **filenames)
+{
+ gchar **utf8_filenames;
+ int n = 0, i;
+
+ while (filenames[n++] != NULL)
+ ;
+
+ utf8_filenames = g_new (gchar *, n + 1);
+
+ for (i = 0; i < n; i++)
+ utf8_filenames[i] = g_locale_to_utf8 (filenames[i], -1, NULL, NULL, NULL);
+
+ utf8_filenames[n] = NULL;
+
+ gtk_rc_set_default_files_utf8 (utf8_filenames);
+
+ g_strfreev (utf8_filenames);
+}
+
+#undef gtk_rc_parse
+
+void
+gtk_rc_parse (const gchar *filename)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL);
+
+ gtk_rc_parse_utf8 (utf8_filename);
+
+ g_free (utf8_filename);
+}
+
+#endif
diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h
index 426937bf7e..037eb92775 100644
--- a/gtk/gtkrc.h
+++ b/gtk/gtkrc.h
@@ -121,6 +121,13 @@ struct _GtkRcStyleClass
void (*_gtk_reserved4) (void);
};
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_rc_add_default_file gtk_rc_add_default_file_utf8
+#define gtk_rc_set_default_files gtk_rc_set_default_files_utf8
+#define gtk_rc_parse gtk_rc_parse_utf8
+#endif
+
void _gtk_rc_init (void);
void gtk_rc_add_default_file (const gchar *filename);
void gtk_rc_set_default_files (gchar **filenames);
diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c
index 75a1f86af8..b5c9379cca 100644
--- a/gtk/gtkuimanager.c
+++ b/gtk/gtkuimanager.c
@@ -2752,3 +2752,26 @@ gtk_ui_manager_get_ui (GtkUIManager *self)
return g_string_free (buffer, FALSE);
}
+#ifdef G_OS_WIN32
+
+#undef gtk_ui_manager_add_ui_from_file
+
+guint
+gtk_ui_manager_add_ui_from_file (GtkUIManager *self,
+ const gchar *filename,
+ GError **error)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error);
+ guint retval;
+
+ if (utf8_filename == NULL)
+ return 0;
+
+ retval = gtk_ui_manager_add_ui_from_file_utf8 (self, utf8_filename, error);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#endif
diff --git a/gtk/gtkuimanager.h b/gtk/gtkuimanager.h
index 931925f71c..7e1e6ead68 100644
--- a/gtk/gtkuimanager.h
+++ b/gtk/gtkuimanager.h
@@ -102,6 +102,11 @@ typedef enum {
GTK_UI_MANAGER_ACCELERATOR = 1 << 8
} GtkUIManagerItemType;
+#ifdef G_OS_WIN32
+/* Reserve old name for DLL ABI backward compatibility */
+#define gtk_ui_manager_add_ui_from_file gtk_ui_manager_add_ui_from_file_utf8
+#endif
+
GType gtk_ui_manager_get_type (void) G_GNUC_CONST;
GtkUIManager *gtk_ui_manager_new (void);
void gtk_ui_manager_set_add_tearoffs (GtkUIManager *self,
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index d54e417c29..3fbf1716c9 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -7451,3 +7451,46 @@ gtk_window_set_auto_startup_notification (gboolean setting)
{
disable_startup_notification = !setting;
}
+
+#ifdef G_OS_WIN32
+
+#undef gtk_window_set_icon_from_file
+
+gboolean
+gtk_window_set_icon_from_file (GtkWindow *window,
+ const gchar *filename,
+ GError **err)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, err);
+ gboolean retval;
+
+ if (utf8_filename == NULL)
+ return FALSE;
+
+ retval = gtk_window_set_icon_from_file_utf8 (window, utf8_filename, err);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#undef gtk_window_set_default_icon_from_file
+
+gboolean
+gtk_window_set_default_icon_from_file (const gchar *filename,
+ GError **err)
+{
+ gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, err);
+ gboolean retval;
+
+ if (utf8_filename == NULL)
+ return FALSE;
+
+ retval = gtk_window_set_default_icon_from_file_utf8 (utf8_filename, err);
+
+ g_free (utf8_filename);
+
+ return retval;
+}
+
+#endif
diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h
index a52d675c0a..54d1388bde 100644
--- a/gtk/gtkwindow.h
+++ b/gtk/gtkwindow.h
@@ -164,6 +164,12 @@ struct _GtkWindowGroupClass
void (*_gtk_reserved4) (void);
};
+#ifdef G_OS_WIN32
+/* Reserve old names for DLL ABI backward compatibility */
+#define gtk_window_set_icon_from_file gtk_window_set_icon_from_file_utf8
+#define gtk_window_set_default_icon_from_file gtk_window_set_default_icon_from_file_utf8
+#endif
+
GType gtk_window_get_type (void) G_GNUC_CONST;
GtkWidget* gtk_window_new (GtkWindowType type);
void gtk_window_set_title (GtkWindow *window,
diff --git a/gtk/updateiconcache.c b/gtk/updateiconcache.c
index 4bf31ec656..5231a064b6 100644
--- a/gtk/updateiconcache.c
+++ b/gtk/updateiconcache.c
@@ -27,6 +27,7 @@
#include <utime.h>
#include <glib.h>
+#include <glib/gstdio.h>
#define CACHE_NAME "icon-theme.cache"
@@ -49,7 +50,7 @@ is_cache_up_to_date (const gchar *path)
gchar *cache_path;
int retval;
- retval = stat (path, &path_stat);
+ retval = g_stat (path, &path_stat);
if (retval < 0)
{
@@ -59,7 +60,7 @@ is_cache_up_to_date (const gchar *path)
}
cache_path = g_build_filename (path, CACHE_NAME, NULL);
- retval = stat (cache_path, &cache_stat);
+ retval = g_stat (cache_path, &cache_stat);
g_free (cache_path);
if (retval < 0 && errno == ENOENT)
@@ -554,7 +555,7 @@ build_cache (const gchar *path)
GList *directories = NULL;
tmp_cache_path = g_build_filename (path, "."CACHE_NAME, NULL);
- cache = fopen (tmp_cache_path, "w");
+ cache = g_fopen (tmp_cache_path, "wb");
if (!cache)
{
@@ -571,7 +572,7 @@ build_cache (const gchar *path)
/* Empty table, just close and remove the file */
fclose (cache);
- unlink (tmp_cache_path);
+ g_unlink (tmp_cache_path);
exit (0);
}
@@ -584,22 +585,22 @@ build_cache (const gchar *path)
if (!retval)
{
- unlink (tmp_cache_path);
+ g_unlink (tmp_cache_path);
exit (1);
}
cache_path = g_build_filename (path, CACHE_NAME, NULL);
- if (rename (tmp_cache_path, cache_path) == -1)
+ if (g_rename (tmp_cache_path, cache_path) == -1)
{
- unlink (tmp_cache_path);
+ g_unlink (tmp_cache_path);
exit (1);
}
/* Update time */
/* FIXME: What do do if an error occurs here? */
- stat (path, &path_stat);
- stat (cache_path, &cache_stat);
+ g_stat (path, &path_stat);
+ g_stat (cache_path, &cache_stat);
utime_buf.actime = path_stat.st_atime;
utime_buf.modtime = cache_stat.st_mtime;
@@ -621,12 +622,18 @@ main (int argc, char **argv)
gchar *path;
GOptionContext *context;
+ if (argc < 2)
+ return 0;
+
context = g_option_context_new ("ICONPATH");
g_option_context_add_main_entries (context, args, NULL);
g_option_context_parse (context, &argc, &argv, NULL);
path = argv[1];
+#ifdef G_OS_WIN32
+ path = g_locale_to_utf8 (path, -1, NULL, NULL, NULL);
+#endif
if (!force_update && is_cache_up_to_date (path))
return 0;
diff --git a/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am b/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am
index b50f7107cb..8b690f9936 100644
--- a/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am
+++ b/modules/engines/ms-windows/Theme/gtk-2.0/Makefile.am
@@ -1,4 +1,4 @@
-themedir = $(datadir)/themes/gtk-2.0
+themedir = $(datadir)/themes/MS-Windows/gtk-2.0
theme_DATA=gtkrc
EXTRA_DIST=$(theme_DATA)