Revision: 3454 http://geany.svn.sourceforge.net/geany/?rev=3454&view=rev Author: eht16 Date: 2009-01-09 18:21:12 +0000 (Fri, 09 Jan 2009)
Log Message: ----------- Add checks for GIO (GLib >= 2.16) support. Allow to specify files on the command line and from remote instances to be URIs (local and with GIO also remote URIs).
Modified Paths: -------------- trunk/ChangeLog trunk/configure.in trunk/src/main.c trunk/src/main.h trunk/src/utils.c trunk/src/utils.h trunk/win32-config.h trunk/wscript
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/ChangeLog 2009-01-09 18:21:12 UTC (rev 3454) @@ -1,3 +1,12 @@ +2009-01-09 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * configure.in, win32-config.h, wscript, src/main.c, src/main.h, + src/utils.c, src/utils.h: + Add checks for GIO (GLib >= 2.16) support. + Allow to specify files on the command line and from remote instances + to be URIs (local and with GIO also remote URIs). + + 2009-01-08 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/prefs.c, src/stash.c, src/keyfile.c:
Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/configure.in 2009-01-09 18:21:12 UTC (rev 3454) @@ -132,6 +132,10 @@ PKG_CHECK_MODULES(GTK, [$gtk_modules]) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) +# GIO checks +gio_modules="gio-2.0 >= 2.16" +PKG_CHECK_MODULES(GIO, [$gio_modules], have_gio=1, have_gio=0) +AC_DEFINE_UNQUOTED(HAVE_GIO, $have_gio, [Whether GIO is available])
# --disable-deprecated switch for GTK2 purification AC_ARG_ENABLE(deprecated, [ --disable-deprecated Disable deprecated GTK functions. ],
Modified: trunk/src/main.c =================================================================== --- trunk/src/main.c 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/src/main.c 2009-01-09 18:21:12 UTC (rev 3454) @@ -301,7 +301,7 @@ { gchar *result;
- if (g_path_is_absolute(filename)) + if (g_path_is_absolute(filename) || utils_is_uri(filename)) result = g_strdup(filename); else { @@ -717,37 +717,46 @@
/* Used for command-line arguments at startup or from socket. * this will strip any :line:col filename suffix from locale_filename */ -gboolean main_handle_filename(gchar *locale_filename) +gboolean main_handle_filename(const gchar *locale_filename) { GeanyDocument *doc; gint line = -1, column = -1; + gchar *filename;
g_return_val_if_fail(locale_filename, FALSE);
- get_line_and_column_from_filename(locale_filename, &line, &column); + /* check whether the passed filename is an URI */ + filename = utils_get_path_from_uri(locale_filename); + if (filename == NULL) + return FALSE; + + get_line_and_column_from_filename(filename, &line, &column); if (line >= 0) cl_options.goto_line = line; if (column >= 0) cl_options.goto_column = column;
- if (g_file_test(locale_filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) + if (g_file_test(filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK)) { - doc = document_open_file(locale_filename, FALSE, NULL, NULL); + doc = document_open_file(filename, FALSE, NULL, NULL); /* add recent file manually if opening_session_files is set */ if (doc != NULL && main_status.opening_session_files) ui_add_recent_file(doc->file_name); + g_free(filename); return TRUE; } else if (file_prefs.cmdline_new_files) { /* create new file with the given filename */ - gchar *utf8_filename = utils_get_utf8_from_locale(locale_filename); + gchar *utf8_filename = utils_get_utf8_from_locale(filename);
doc = document_new_file(utf8_filename, NULL, NULL); if (doc != NULL) ui_add_recent_file(doc->file_name); g_free(utf8_filename); + g_free(filename); return TRUE; } + g_free(filename); return FALSE; }
@@ -825,9 +834,18 @@ if (prefs.load_session) { if (load_project_from_cl) - project_load_file(argv[1]); - else - if (cl_options.load_session && !cl_options.new_instance) + { + gchar *pfile = argv[1]; + if (utils_is_uri(argv[1])) + pfile = utils_get_path_from_uri(argv[1]); + if (pfile != NULL) + { + project_load_file(pfile); + if (pfile != argv[1]) + g_free(pfile); + } + } + else if (cl_options.load_session && !cl_options.new_instance) load_session_project_file();
/* when we want a new instance, we still load project session files unless -s
Modified: trunk/src/main.h =================================================================== --- trunk/src/main.h 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/src/main.h 2009-01-09 18:21:12 UTC (rev 3454) @@ -57,7 +57,7 @@
void main_quit(void);
-gboolean main_handle_filename(gchar *locale_filename); +gboolean main_handle_filename(const gchar *locale_filename);
void main_reload_configuration(void);
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/src/utils.c 2009-01-09 18:21:12 UTC (rev 3454) @@ -1550,3 +1550,48 @@ }
+/* Retrieves the path for the given URI. + * It returns: + * - the path which was determined by g_filename_from_uri() or GIO + * - NULL if the URI is non-local and gvfs-fuse is not installed + * - a new copy of 'uri' if it is not an URI. */ +gchar *utils_get_path_from_uri(const gchar *uri) +{ + gchar *locale_filename; + + g_return_val_if_fail(uri != NULL, NULL); + + if (! utils_is_uri(uri)) + return g_strdup(uri); + + /* this will work only for 'file://' URIs */ + locale_filename = g_filename_from_uri(uri, NULL, NULL); +#ifdef HAVE_GIO + /* g_filename_from_uri() failed, so we probably have a non-local URI */ + if (locale_filename == NULL) + { + GFile *file = g_file_new_for_uri(uri); + locale_filename = g_file_get_path(file); + g_object_unref(file); + if (locale_filename == NULL) + { + geany_debug("The URI '%s' could not be resolved to a local path. This means " + "that the URI is invalid or that you don't have gvfs-fuse installed.", uri); + return NULL; + } + } +#endif + if (locale_filename == NULL) + geany_debug("The URI '%s' could not be resolved to a local path. This means that the " + "URI is invalid or that Geany can't use GVFS (maybe it is not installed).", uri); + + return locale_filename; +} + + +gboolean utils_is_uri(const gchar *uri) +{ + g_return_val_if_fail(uri != NULL, FALSE); + + return (strstr(uri, "://") != NULL); +}
Modified: trunk/src/utils.h =================================================================== --- trunk/src/utils.h 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/src/utils.h 2009-01-09 18:21:12 UTC (rev 3454) @@ -151,4 +151,8 @@
const gchar *utils_build_path(const gchar *first, ...) G_GNUC_NULL_TERMINATED;
+gchar *utils_get_path_from_uri(const gchar *uri); + +gboolean utils_is_uri(const gchar *uri); + #endif
Modified: trunk/win32-config.h =================================================================== --- trunk/win32-config.h 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/win32-config.h 2009-01-09 18:21:12 UTC (rev 3454) @@ -321,3 +321,6 @@ /* Define if you want to detect a running instance */ #define HAVE_SOCKET 1
+/* Define if GIO should be used, need GLib 2.16.x or newer */ +#define HAVE_GIO 1 +
Modified: trunk/wscript =================================================================== --- trunk/wscript 2009-01-08 17:27:57 UTC (rev 3453) +++ trunk/wscript 2009-01-09 18:21:12 UTC (rev 3454) @@ -184,6 +184,8 @@ have_gtk_210 = True else: gtk_version = 'Unknown' + # GIO check + conf.check_cfg(package='gio-2.0', uselib_store='GIO')
conf_define_from_opt('LIBDIR', Options.options.libdir, conf.env['PREFIX'] + '/lib') conf_define_from_opt('DOCDIR', Options.options.docdir, conf.env['DATADIR'] + '/doc/geany')
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.