diff --git a/configure.ac b/configure.ac index 3419ee8b..3e4cee36 100644 --- a/configure.ac +++ b/configure.ac @@ -323,6 +323,25 @@ fi AM_CONDITIONAL(ENABLE_PYTHON, test x"$enable_python" = "xyes") +dnl check for native osx +gdk_targets=`$PKG_CONFIG --variable=targets gdk-3.0` +PLATFORM_NAME="other" + +for target in $gdk_targets; +do + case "$target" in + quartz) + PLATFORM_NAME=osx + ;; + win32) + PLATFORM_NAME=win32 + ;; + esac +done + +AC_SUBST(PLATFORM_NAME) +AM_CONDITIONAL(PLATFORM_OSX, test x"$PLATFORM_NAME" = "xosx") + dnl libgd LIBGD_INIT([ tagged-entry diff --git a/libgitg/Makefile.am b/libgitg/Makefile.am index 0dc0830c..a1f8e9cd 100644 --- a/libgitg/Makefile.am +++ b/libgitg/Makefile.am @@ -24,6 +24,7 @@ libgitg_libgitg_1_0_la_LIBADD = \ if GDK_WINDOWING_QUARTZ libgitg_libgitg_1_0_la_LIBADD += -lobjc libgitg_libgitg_1_0_la_CFLAGS += -xobjective-c +libgitg_libgitg_1_0_la_LDFLAGS += -framework Foundation endif libgitg_libgitg_1_0_la_VALAFLAGS = \ @@ -36,6 +37,7 @@ libgitg_libgitg_1_0_la_VALAFLAGS = \ --pkg gdesktop-enums-3.0 \ --pkg libsoup-2.4 \ --pkg gtksourceview-3.0 \ + --pkg gitg-platform-support \ $(GITG_VALAFLAGS) \ --vapidir $(top_srcdir)/vapi \ --includedir libgitg \ @@ -84,11 +86,17 @@ libgitg_libgitg_1_0_la_VALASOURCES = \ libgitg/gitg-utils.vala \ libgitg/gitg-when-mapped.vala -libgitg_libgitg_1_0_la_SOURCES = \ - $(libgitg_libgitg_1_0_la_VALASOURCES) \ - libgitg/gitg-platform-support.c \ +libgitg_libgitg_1_0_la_SOURCES = \ + $(libgitg_libgitg_1_0_la_VALASOURCES) \ libgitg/gitg-resources.c +if PLATFORM_OSX +libgitg_libgitg_1_0_la_SOURCES += libgitg/gitg-platform-support-osx.c +else +libgitg_libgitg_1_0_la_SOURCES += libgitg/gitg-platform-support.c +endif + + libgitg_libgitg_1_0_la_headerdir = $(prefix)/include/libgitg-1.0/libgitg libgitg_libgitg_1_0_la_header_HEADERS = libgitg/libgitg.h diff --git a/libgitg/gitg-avatar-cache.vala b/libgitg/gitg-avatar-cache.vala index 9134e6b6..bc38d895 100644 --- a/libgitg/gitg-avatar-cache.vala +++ b/libgitg/gitg-avatar-cache.vala @@ -71,7 +71,7 @@ public class Gitg.AvatarCache : Object try { - stream = yield file.read_async(Priority.LOW, cancellable); + stream = yield Gitg.PlatformSupport.http_get(file, cancellable); } catch { diff --git a/libgitg/gitg-platform-support-osx.c b/libgitg/gitg-platform-support-osx.c new file mode 100644 index 00000000..5774461f --- /dev/null +++ b/libgitg/gitg-platform-support-osx.c @@ -0,0 +1,67 @@ +#include "gitg-platform-support.h" + +#include + +gboolean +gitg_platform_support_use_native_window_controls (GdkDisplay *display) +{ + if (display == NULL) + { + display = gdk_display_get_default (); + } + + return GDK_IS_QUARTZ_DISPLAY (display); +} + +void +gitg_platform_support_http_get (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + NSURLSessionDataTask *downloadTask; + NSString *dataUrl; + NSURL *url; + GTask *task; + + dataUrl = [NSString stringWithUTF8String:g_file_get_uri (file)]; + url = [NSURL URLWithString:dataUrl]; + + task = g_task_new (file, cancellable, callback, user_data); + + downloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (g_task_return_error_if_cancelled (task)) + { + } + else if (error) + { + const gchar *message; + + message = [[error localizedDescription] UTF8String]; + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "%s", message); + } + else + { + GInputStream *stream; + GBytes *bytes; + + bytes = g_bytes_new ([data bytes], [data length]); + + stream = g_memory_input_stream_new_from_bytes (bytes); + g_bytes_unref (bytes); + + g_task_return_pointer (task, stream, NULL); + } + + g_object_unref (task); + }]; + + [downloadTask resume]; +} + +GInputStream * +gitg_platform_support_http_get_finish (GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} diff --git a/libgitg/gitg-platform-support.c b/libgitg/gitg-platform-support.c index bd043d24..5cbc6592 100644 --- a/libgitg/gitg-platform-support.c +++ b/libgitg/gitg-platform-support.c @@ -1,20 +1,23 @@ #include "gitg-platform-support.h" -#ifdef GDK_WINDOWING_QUARTZ -#include -#endif - gboolean gitg_platform_support_use_native_window_controls (GdkDisplay *display) { -#ifdef GDK_WINDOWING_QUARTZ - if (display == NULL) - { - display = gdk_display_get_default (); - } - - return GDK_IS_QUARTZ_DISPLAY (display); -#else return FALSE; -#endif +} + +void +gitg_platform_support_http_get (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_file_read_async (file, G_PRIORITY_DEFAULT, cancellable, callback, user_data); +} + +GInputStream * +gitg_platform_support_http_get_finish (GAsyncResult *result, + GError **error) +{ + return G_INPUT_STREAM (g_file_read_async_finish (g_async_result_get_source_object (result), result, error); } diff --git a/libgitg/gitg-platform-support.h b/libgitg/gitg-platform-support.h index a58c814d..ec6f70d2 100644 --- a/libgitg/gitg-platform-support.h +++ b/libgitg/gitg-platform-support.h @@ -5,5 +5,13 @@ gboolean gitg_platform_support_use_native_window_controls (GdkDisplay *display); +void gitg_platform_support_http_get (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GInputStream *gitg_platform_support_http_get_finish (GAsyncResult *result, + GError **error); + #endif /* __GITG_PLATFORM_SUPPORT_H__ */ diff --git a/vapi/gitg-platform-support.vapi b/vapi/gitg-platform-support.vapi index 22a61005..7f991035 100644 --- a/vapi/gitg-platform-support.vapi +++ b/vapi/gitg-platform-support.vapi @@ -4,5 +4,6 @@ namespace Gitg public class PlatformSupport { public static bool use_native_window_controls(Gdk.Display? display = null); + public static async GLib.InputStream http_get(GLib.File url, GLib.Cancellable? cancellable = null) throws GLib.IOError; } }