From 406473f25e5282340bfc1a0057561f1f3922b08a Mon Sep 17 00:00:00 2001 From: Stefano Karapetsas Date: Sun, 19 Jan 2014 20:39:10 +0100 Subject: drivemount: Add GTK3 support --- drivemount/drive-button.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++- drivemount/drive-list.c | 17 +++++++++++ drivemount/drivemount.c | 4 +++ 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/drivemount/drive-button.c b/drivemount/drive-button.c index bd738fb5..1ff9c7cb 100644 --- a/drivemount/drive-button.c +++ b/drivemount/drive-button.c @@ -29,6 +29,10 @@ #include "drive-button.h" #include #include +#if GTK_CHECK_VERSION (3, 0, 0) +#include +#include +#endif #include @@ -49,7 +53,11 @@ static void drive_button_set_mount (DriveButton *self, static void drive_button_reset_popup (DriveButton *self); static void drive_button_ensure_popup (DriveButton *self); +#if GTK_CHECK_VERSION (3, 0, 0) +static void drive_button_dispose (GObject *object); +#else static void drive_button_destroy (GtkObject *object); +#endif #if 0 static void drive_button_unrealize (GtkWidget *widget); #endif /* 0 */ @@ -63,7 +71,11 @@ static void drive_button_theme_change (GtkIconTheme *icon_theme, static void drive_button_class_init (DriveButtonClass *class) { +#if GTK_CHECK_VERSION (3, 0, 0) + G_OBJECT_CLASS(class)->dispose = drive_button_dispose; +#else GTK_OBJECT_CLASS(class)->destroy = drive_button_destroy; +#endif GTK_WIDGET_CLASS(class)->button_press_event = drive_button_button_press; GTK_WIDGET_CLASS(class)->key_press_event = drive_button_key_press; @@ -130,7 +142,11 @@ drive_button_new_from_mount (GMount *mount) } static void +#if GTK_CHECK_VERSION (3, 0, 0) +drive_button_dispose (GObject *object) +#else drive_button_destroy (GtkObject *object) +#endif { DriveButton *self = DRIVE_BUTTON (object); @@ -142,8 +158,13 @@ drive_button_destroy (GtkObject *object) drive_button_reset_popup (self); +#if GTK_CHECK_VERSION (3, 0, 0) + if (G_OBJECT_CLASS (drive_button_parent_class)->dispose) + (* G_OBJECT_CLASS (drive_button_parent_class)->dispose) (object); +#else if (GTK_OBJECT_CLASS (drive_button_parent_class)->destroy) (* GTK_OBJECT_CLASS (drive_button_parent_class)->destroy) (object); +#endif } #if 0 @@ -455,7 +476,11 @@ static void drive_button_reset_popup (DriveButton *self) { if (self->popup_menu) +#if GTK_CHECK_VERSION (3, 0, 0) + gtk_widget_destroy (GTK_WIDGET (self->popup_menu)); +#else gtk_object_destroy (GTK_OBJECT (self->popup_menu)); +#endif self->popup_menu = NULL; } @@ -516,49 +541,99 @@ open_drive (DriveButton *self, GtkWidget *item) GdkScreen *screen; GtkWidget *dialog; GError *error = NULL; +#if GTK_CHECK_VERSION (3, 0, 0) + GFile *file = NULL; + GList *files = NULL; + GdkAppLaunchContext *launch_context; + GDesktopAppInfo *app_info; +#else char *argv[3] = { "caja", NULL, NULL }; screen = gtk_widget_get_screen (GTK_WIDGET (self)); +#endif if (self->volume) { GMount *mount; mount = g_volume_get_mount (self->volume); if (mount) { +#if !GTK_CHECK_VERSION (3, 0, 0) GFile *file; +#endif file = g_mount_get_root (mount); +#if !GTK_CHECK_VERSION (3, 0, 0) argv[1] = g_file_get_uri (file); g_object_unref(file); +#endif g_object_unref(mount); } } else if (self->mount) { +#if !GTK_CHECK_VERSION (3, 0, 0) GFile *file; +#endif file = g_mount_get_root (self->mount); +#if !GTK_CHECK_VERSION (3, 0, 0) argv[1] = g_file_get_uri (file); g_object_unref(file); +#endif } else g_return_if_reached(); +#if GTK_CHECK_VERSION (3, 0, 0) + app_info = g_desktop_app_info_new ("caja.desktop"); + + if (app_info) { + launch_context = gdk_app_launch_context_new (); + screen = gtk_widget_get_screen (GTK_WIDGET (self)); + gdk_app_launch_context_set_screen (launch_context, screen); + files = g_list_prepend (files, file); + g_app_info_launch (G_APP_INFO (app_info), + files, + G_APP_LAUNCH_CONTEXT (launch_context), + &error); + + g_object_unref (launch_context); + g_list_free (files); + } + + if (!app_info || error) { +#else if (!gdk_spawn_on_screen (screen, NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) { +#endif dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, +#if GTK_CHECK_VERSION (3, 0, 0) + _("Cannot execute Caja")); +#else _("Cannot execute '%s'"), argv[0]); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), error->message, NULL); +#endif + if (error) + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), error->message, NULL); + else + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "Could not find Caja", NULL); g_signal_connect (dialog, "response", +#if GTK_CHECK_VERSION (3, 0, 0) + G_CALLBACK (gtk_widget_destroy), NULL); +#else G_CALLBACK (gtk_object_destroy), NULL); +#endif gtk_widget_show (dialog); g_error_free (error); } +#if GTK_CHECK_VERSION (3, 0, 0) + g_object_unref(file); +#else g_free (argv[1]); +#endif } /* copied from mate-volume-manager/src/manager.c maybe there is a better way than diff --git a/drivemount/drive-list.c b/drivemount/drive-list.c index 03dbd8d2..26163160 100644 --- a/drivemount/drive-list.c +++ b/drivemount/drive-list.c @@ -35,7 +35,11 @@ G_DEFINE_TYPE (DriveList, drive_list, GTK_TYPE_TABLE); static GVolumeMonitor *volume_monitor = NULL; static void drive_list_finalize (GObject *object); +#if GTK_CHECK_VERSION (3, 0, 0) +static void drive_list_dispose (GObject *object); +#else static void drive_list_destroy (GtkObject *object); +#endif static void drive_list_add (GtkContainer *container, GtkWidget *child); static void drive_list_remove (GtkContainer *container, GtkWidget *child); @@ -70,7 +74,11 @@ static void drive_list_class_init (DriveListClass *class) { G_OBJECT_CLASS (class)->finalize = drive_list_finalize; +#if GTK_CHECK_VERSION (3, 0, 0) + G_OBJECT_CLASS (class)->dispose = drive_list_dispose; +#else GTK_OBJECT_CLASS (class)->destroy = drive_list_destroy; +#endif GTK_CONTAINER_CLASS (class)->add = drive_list_add; GTK_CONTAINER_CLASS (class)->remove = drive_list_remove; } @@ -144,7 +152,11 @@ drive_list_finalize (GObject *object) } static void +#if GTK_CHECK_VERSION (3, 0, 0) +drive_list_dispose (GObject *object) +#else drive_list_destroy (GtkObject *object) +#endif { DriveList *self = DRIVE_LIST (object); @@ -165,8 +177,13 @@ drive_list_destroy (GtkObject *object) g_source_remove (self->layout_tag); self->layout_tag = 0; +#if GTK_CHECK_VERSION (3, 0, 0) + if (G_OBJECT_CLASS (drive_list_parent_class)->dispose) + (* G_OBJECT_CLASS (drive_list_parent_class)->dispose) (object); +#else if (GTK_OBJECT_CLASS (drive_list_parent_class)->destroy) (* GTK_OBJECT_CLASS (drive_list_parent_class)->destroy) (object); +#endif } static void diff --git a/drivemount/drivemount.c b/drivemount/drivemount.c index 4d8e217b..04d7d06f 100644 --- a/drivemount/drivemount.c +++ b/drivemount/drivemount.c @@ -79,7 +79,11 @@ static void change_background (MatePanelApplet *applet, MatePanelAppletBackgroundType type, GdkColor *colour, +#if GTK_CHECK_VERSION (3, 0, 0) + cairo_pattern_t *pattern, +#else GdkPixmap *pixmap, +#endif DriveList *drivelist) { switch (type) { -- cgit v1.2.1