From 5ded9cba8563f336939400303d6a841d5089b107 Mon Sep 17 00:00:00 2001 From: Perberos Date: Mon, 7 Nov 2011 19:52:18 -0300 Subject: renaming from gedit to pluma --- plugins/checkupdate/Makefile.am | 20 +- .../checkupdate.gedit-plugin.desktop.in | 9 - .../checkupdate.pluma-plugin.desktop.in | 9 + plugins/checkupdate/gedit-check-update-plugin.c | 697 --------------------- plugins/checkupdate/gedit-check-update-plugin.h | 74 --- plugins/checkupdate/gedit-check-update.schemas.in | 13 - plugins/checkupdate/pluma-check-update-plugin.c | 697 +++++++++++++++++++++ plugins/checkupdate/pluma-check-update-plugin.h | 74 +++ plugins/checkupdate/pluma-check-update.schemas.in | 13 + 9 files changed, 803 insertions(+), 803 deletions(-) delete mode 100755 plugins/checkupdate/checkupdate.gedit-plugin.desktop.in create mode 100755 plugins/checkupdate/checkupdate.pluma-plugin.desktop.in delete mode 100755 plugins/checkupdate/gedit-check-update-plugin.c delete mode 100755 plugins/checkupdate/gedit-check-update-plugin.h delete mode 100755 plugins/checkupdate/gedit-check-update.schemas.in create mode 100755 plugins/checkupdate/pluma-check-update-plugin.c create mode 100755 plugins/checkupdate/pluma-check-update-plugin.h create mode 100755 plugins/checkupdate/pluma-check-update.schemas.in (limited to 'plugins/checkupdate') diff --git a/plugins/checkupdate/Makefile.am b/plugins/checkupdate/Makefile.am index 551b7eee..a49666ca 100755 --- a/plugins/checkupdate/Makefile.am +++ b/plugins/checkupdate/Makefile.am @@ -1,10 +1,10 @@ -# gedit win32 updater +# pluma win32 updater -plugindir = $(GEDIT_PLUGINS_LIBS_DIR) +plugindir = $(PLUMA_PLUGINS_LIBS_DIR) INCLUDES = \ -I$(top_srcdir) \ - $(GEDIT_CFLAGS) \ + $(PLUMA_CFLAGS) \ $(LIBSOUP_CFLAGS) \ $(WARN_CFLAGS) \ $(DISABLE_DEPRECATED_CFLAGS) @@ -12,20 +12,20 @@ INCLUDES = \ plugin_LTLIBRARIES = libcheckupdate.la libcheckupdate_la_SOURCES = \ - gedit-check-update-plugin.h \ - gedit-check-update-plugin.c + pluma-check-update-plugin.h \ + pluma-check-update-plugin.c libcheckupdate_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS) -libcheckupdate_la_LIBADD = $(GEDIT_LIBS) $(LIBSOUP_LIBS) +libcheckupdate_la_LIBADD = $(PLUMA_LIBS) $(LIBSOUP_LIBS) -plugin_in_files = checkupdate.gedit-plugin.desktop.in +plugin_in_files = checkupdate.pluma-plugin.desktop.in -%.gedit-plugin: %.gedit-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache +%.pluma-plugin: %.pluma-plugin.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*po) ; $(INTLTOOL_MERGE) $(top_srcdir)/po $< $@ -d -u -c $(top_builddir)/po/.intltool-merge-cache -plugin_DATA = $(plugin_in_files:.gedit-plugin.desktop.in=.gedit-plugin) +plugin_DATA = $(plugin_in_files:.pluma-plugin.desktop.in=.pluma-plugin) schemasdir = $(MATECONF_SCHEMA_FILE_DIR) -schemas_in_files = gedit-check-update.schemas.in +schemas_in_files = pluma-check-update.schemas.in schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) @INTLTOOL_SCHEMAS_RULE@ diff --git a/plugins/checkupdate/checkupdate.gedit-plugin.desktop.in b/plugins/checkupdate/checkupdate.gedit-plugin.desktop.in deleted file mode 100755 index 4699b6a2..00000000 --- a/plugins/checkupdate/checkupdate.gedit-plugin.desktop.in +++ /dev/null @@ -1,9 +0,0 @@ -[Gedit Plugin] -Module=checkupdate -IAge=2 -_Name=Check update -_Description=Check for latest version of gedit -Icon=gedit-plugin -Authors=Ignacio Casal Quinteiro -Copyright=Copyright © 2009 Ignacio Casal Quinteiro -Website=http://www.gedit.org diff --git a/plugins/checkupdate/checkupdate.pluma-plugin.desktop.in b/plugins/checkupdate/checkupdate.pluma-plugin.desktop.in new file mode 100755 index 00000000..9373ee47 --- /dev/null +++ b/plugins/checkupdate/checkupdate.pluma-plugin.desktop.in @@ -0,0 +1,9 @@ +[Pluma Plugin] +Module=checkupdate +IAge=2 +_Name=Check update +_Description=Check for latest version of pluma +Icon=pluma-plugin +Authors=Ignacio Casal Quinteiro +Copyright=Copyright © 2009 Ignacio Casal Quinteiro +Website=http://www.pluma.org diff --git a/plugins/checkupdate/gedit-check-update-plugin.c b/plugins/checkupdate/gedit-check-update-plugin.c deleted file mode 100755 index aa9f7a5e..00000000 --- a/plugins/checkupdate/gedit-check-update-plugin.c +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Copyright (C) 2009 - Ignacio Casal Quinteiro - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "gedit-check-update-plugin.h" - -#include -#include -#include -#include -#include -#include - -#include - -#if !GTK_CHECK_VERSION(2, 17, 1) -#include -#endif - -#define MATECONF_KEY_BASE "/apps/gedit-2/plugins/checkupdate" -#define MATECONF_KEY_IGNORE_VERSION MATECONF_KEY_BASE "/ignore_version" - -#define WINDOW_DATA_KEY "GeditCheckUpdatePluginWindowData" - -#define VERSION_PLACE "" - -#ifdef G_OS_WIN32 -#define GEDIT_URL "http://ftp.acc.umu.se/pub/mate/binaries/win32/gedit/" -#define FILE_REGEX "gedit\\-setup\\-[0-9]+\\.[0-9]+\\.[0-9]+(\\-[0-9]+)?\\.exe" -#else -#define GEDIT_URL "http://ftp.acc.umu.se/pub/mate/binaries/mac/gedit/" -#define FILE_REGEX "gedit\\-[0-9]+\\.[0-9]+\\.[0-9]+(\\-[0-9]+)?\\.dmg" -#endif - -#ifdef OS_OSX -#include "gedit/osx/gedit-osx.h" -#endif - -#define GEDIT_CHECK_UPDATE_PLUGIN_GET_PRIVATE(object) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((object), \ - GEDIT_TYPE_CHECK_UPDATE_PLUGIN, \ - GeditCheckUpdatePluginPrivate)) - -GEDIT_PLUGIN_REGISTER_TYPE (GeditCheckUpdatePlugin, gedit_check_update_plugin) - -struct _GeditCheckUpdatePluginPrivate -{ - SoupSession *session; - - MateConfClient *mateconf_client; -}; - -typedef struct -{ - GeditCheckUpdatePlugin *plugin; - - gchar *url; - gchar *version; -} WindowData; - -static void -free_window_data (gpointer data) -{ - WindowData *window_data; - - if (data == NULL) - return; - - window_data = (WindowData *)data; - - g_free (window_data->url); - g_free (window_data->version); - g_slice_free (WindowData, data); -} - -static void -gedit_check_update_plugin_init (GeditCheckUpdatePlugin *plugin) -{ - plugin->priv = GEDIT_CHECK_UPDATE_PLUGIN_GET_PRIVATE (plugin); - - gedit_debug_message (DEBUG_PLUGINS, - "GeditCheckUpdatePlugin initializing"); - - plugin->priv->session = soup_session_async_new (); - - plugin->priv->mateconf_client = mateconf_client_get_default (); - - mateconf_client_add_dir (plugin->priv->mateconf_client, - MATECONF_KEY_BASE, - MATECONF_CLIENT_PRELOAD_ONELEVEL, - NULL); -} - -static void -gedit_check_update_plugin_dispose (GObject *object) -{ - GeditCheckUpdatePlugin *plugin = GEDIT_CHECK_UPDATE_PLUGIN (object); - - if (plugin->priv->session != NULL) - { - g_object_unref (plugin->priv->session); - plugin->priv->session = NULL; - } - - if (plugin->priv->mateconf_client != NULL) - { - mateconf_client_suggest_sync (plugin->priv->mateconf_client, NULL); - - g_object_unref (G_OBJECT (plugin->priv->mateconf_client)); - - plugin->priv->mateconf_client = NULL; - } - - gedit_debug_message (DEBUG_PLUGINS, - "GeditCheckUpdatePlugin disposing"); - - G_OBJECT_CLASS (gedit_check_update_plugin_parent_class)->dispose (object); -} - -static void -gedit_check_update_plugin_finalize (GObject *object) -{ - gedit_debug_message (DEBUG_PLUGINS, - "GeditCheckUpdatePlugin finalizing"); - - G_OBJECT_CLASS (gedit_check_update_plugin_parent_class)->finalize (object); -} - -static void -set_contents (GtkWidget *infobar, - GtkWidget *contents) -{ -#if !GTK_CHECK_VERSION (2, 17, 1) - gedit_message_area_set_contents (GEDIT_MESSAGE_AREA (infobar), - contents); -#else - GtkWidget *content_area; - - content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar)); - gtk_container_add (GTK_CONTAINER (content_area), contents); -#endif -} - -static void -set_message_area_text_and_icon (GtkWidget *message_area, - const gchar *icon_stock_id, - const gchar *primary_text, - const gchar *secondary_text) -{ - GtkWidget *hbox_content; - GtkWidget *image; - GtkWidget *vbox; - gchar *primary_markup; - gchar *secondary_markup; - GtkWidget *primary_label; - GtkWidget *secondary_label; - - hbox_content = gtk_hbox_new (FALSE, 8); - gtk_widget_show (hbox_content); - - image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG); - gtk_widget_show (image); - gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0); - - vbox = gtk_vbox_new (FALSE, 6); - gtk_widget_show (vbox); - gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0); - - primary_markup = g_strdup_printf ("%s", primary_text); - primary_label = gtk_label_new (primary_markup); - g_free (primary_markup); - gtk_widget_show (primary_label); - gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0); - gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE); - gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE); - gtk_misc_set_alignment (GTK_MISC (primary_label), 0, 0.5); - GTK_WIDGET_SET_FLAGS (primary_label, GTK_CAN_FOCUS); - gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE); - - if (secondary_text != NULL) - { - secondary_markup = g_strdup_printf ("%s", - secondary_text); - secondary_label = gtk_label_new (secondary_markup); - g_free (secondary_markup); - gtk_widget_show (secondary_label); - gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0); - GTK_WIDGET_SET_FLAGS (secondary_label, GTK_CAN_FOCUS); - gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE); - gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE); - gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE); - gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5); - } - - set_contents (message_area, hbox_content); -} - -static void -on_response_cb (GtkWidget *infobar, - gint response_id, - GeditWindow *window) -{ - if (response_id == GTK_RESPONSE_YES) - { - GError *error = NULL; - WindowData *data; - - data = g_object_get_data (G_OBJECT (window), - WINDOW_DATA_KEY); - -#ifdef OS_OSX - gedit_osx_show_url (data->url); -#else - gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (window)), - data->url, - GDK_CURRENT_TIME, - &error); -#endif - if (error != NULL) - { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (window), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _("There was an error displaying the URI.")); - - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - "%s", error->message); - - g_signal_connect (G_OBJECT (dialog), - "response", - G_CALLBACK (gtk_widget_destroy), - NULL); - - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - - gtk_widget_show (dialog); - - g_error_free (error); - } - } - else if (response_id == GTK_RESPONSE_NO) - { - WindowData *data; - - data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); - - mateconf_client_set_string (data->plugin->priv->mateconf_client, - MATECONF_KEY_IGNORE_VERSION, - data->version, - NULL); - } - - g_object_set_data (G_OBJECT (window), - WINDOW_DATA_KEY, - NULL); - - gtk_widget_destroy (infobar); -} - -static GtkWidget * -create_infobar (GeditWindow *window, - const gchar *version) -{ - GtkWidget *infobar; - gchar *message; - -#if !GTK_CHECK_VERSION (2, 17, 1) - infobar = gedit_message_area_new (); - - gedit_message_area_add_stock_button_with_text (GEDIT_MESSAGE_AREA (infobar), - _("_Download"), - GTK_STOCK_SAVE, - GTK_RESPONSE_YES); - gedit_message_area_add_stock_button_with_text (GEDIT_MESSAGE_AREA (infobar), - _("_Ignore Version"), - GTK_STOCK_DISCARD, - GTK_RESPONSE_NO); - gedit_message_area_add_button (GEDIT_MESSAGE_AREA (infobar), - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL); -#else - GtkWidget *button; - - infobar = gtk_info_bar_new (); - - button = gedit_gtk_button_new_with_stock_icon (_("_Download"), - GTK_STOCK_SAVE); - gtk_widget_show (button); - - gtk_info_bar_add_action_widget (GTK_INFO_BAR (infobar), - button, - GTK_RESPONSE_YES); - - button = gedit_gtk_button_new_with_stock_icon (_("_Ignore Version"), - GTK_STOCK_DISCARD); - gtk_widget_show (button); - - gtk_info_bar_add_action_widget (GTK_INFO_BAR (infobar), - button, - GTK_RESPONSE_NO); - - gtk_info_bar_add_button (GTK_INFO_BAR (infobar), - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL); - - gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), - GTK_MESSAGE_INFO); -#endif - - message = g_strdup_printf ("%s (%s)", _("There is a new version of gedit"), version); - set_message_area_text_and_icon (infobar, - "gtk-dialog-info", - message, - _("You can download the new version of gedit" - " by clicking on the download button or" - " ignore that version and wait for a new one")); - - g_free (message); - - g_signal_connect (infobar, "response", - G_CALLBACK (on_response_cb), - window); - - return infobar; -} - -static void -pack_infobar (GtkWidget *window, - GtkWidget *infobar) -{ - GtkWidget *vbox; - - vbox = gtk_bin_get_child (GTK_BIN (window)); - - gtk_box_pack_start (GTK_BOX (vbox), infobar, FALSE, FALSE, 0); - gtk_box_reorder_child (GTK_BOX (vbox), infobar, 2); -} - -static gchar * -get_file (const gchar *text, - const gchar *regex_place) -{ - GRegex *regex; - GMatchInfo *match_info; - gchar *word = NULL; - - regex = g_regex_new (regex_place, 0, 0, NULL); - g_regex_match (regex, text, 0, &match_info); - while (g_match_info_matches (match_info)) - { - g_free (word); - - word = g_match_info_fetch (match_info, 0); - - g_match_info_next (match_info, NULL); - } - g_match_info_free (match_info); - g_regex_unref (regex); - - return word; -} - -static void -get_numbers (const gchar *version, - gint *major, - gint *minor, - gint *micro) -{ - gchar **split; - gint num = 2; - - if (micro != NULL) - num = 3; - - split = g_strsplit (version, ".", num); - *major = atoi (split[0]); - *minor = atoi (split[1]); - if (micro != NULL) - *micro = atoi (split[2]); - - g_strfreev (split); -} - -static gboolean -newer_version (const gchar *v1, - const gchar *v2, - gboolean with_micro) -{ - gboolean newer = FALSE; - gint major1, minor1, micro1; - gint major2, minor2, micro2; - - if (v1 == NULL || v2 == NULL) - return FALSE; - - if (with_micro) - { - get_numbers (v1, &major1, &minor1, µ1); - get_numbers (v2, &major2, &minor2, µ2); - } - else - { - get_numbers (v1, &major1, &minor1, NULL); - get_numbers (v2, &major2, &minor2, NULL); - } - - if (major1 > major2) - { - newer = TRUE; - } - else if (minor1 > minor2 && major1 == major2) - { - newer = TRUE; - } - else if (with_micro && micro1 > micro2 && minor1 == minor2) - { - newer = TRUE; - } - - return newer; -} - -static gchar * -parse_file_version (const gchar *file) -{ - gchar *p, *aux; - - p = (gchar *)file; - - while (*p != '\0' && !g_ascii_isdigit (*p)) - { - p++; - } - - if (*p == '\0') - return NULL; - - aux = g_strrstr (p, "-"); - if (aux == NULL) - aux = g_strrstr (p, "."); - - return g_strndup (p, aux - p); -} - -static gchar * -get_ignore_version (GeditCheckUpdatePlugin *plugin) -{ - return mateconf_client_get_string (plugin->priv->mateconf_client, - MATECONF_KEY_IGNORE_VERSION, - NULL); -} - -static void -parse_page_file (SoupSession *session, - SoupMessage *msg, - GeditWindow *window) -{ - if (msg->status_code == SOUP_STATUS_OK) - { - gchar *file; - gchar *file_version; - gchar *ignore_version; - WindowData *data; - - data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); - - file = get_file (msg->response_body->data, FILE_REGEX); - file_version = parse_file_version (file); - ignore_version = get_ignore_version (data->plugin); - - if (newer_version (file_version, VERSION, TRUE) && - (ignore_version == NULL || *ignore_version == '\0' || - newer_version (file_version, ignore_version, TRUE))) - { - GtkWidget *infobar; - WindowData *data; - gchar *file_url; - - data = g_object_get_data (G_OBJECT (window), - WINDOW_DATA_KEY); - - file_url = g_strconcat (data->url, file, NULL); - - g_free (data->url); - data->url = file_url; - data->version = g_strdup (file_version); - - infobar = create_infobar (window, file_version); - pack_infobar (GTK_WIDGET (window), infobar); - gtk_widget_show (infobar); - } - - g_free (ignore_version); - g_free (file_version); - g_free (file); - } - else - { - g_object_set_data (G_OBJECT (window), - WINDOW_DATA_KEY, - NULL); - } -} - -static gboolean -is_unstable (const gchar *version) -{ - gchar **split; - gint minor; - gboolean unstable = TRUE;; - - split = g_strsplit (version, ".", 2); - minor = atoi (split[1]); - g_strfreev (split); - - if ((minor % 2) == 0) - unstable = FALSE; - - return unstable; -} - -static gchar * -get_file_page_version (const gchar *text, - const gchar *regex_place) -{ - GRegex *regex; - GMatchInfo *match_info; - GString *string = NULL; - gchar *unstable = NULL; - gchar *stable = NULL; - - regex = g_regex_new (regex_place, 0, 0, NULL); - g_regex_match (regex, text, 0, &match_info); - while (g_match_info_matches (match_info)) - { - gint end; - gint i; - - g_match_info_fetch_pos (match_info, 0, NULL, &end); - - string = g_string_new (""); - - i = end; - while (text[i] != '/') - { - string = g_string_append_c (string, text[i]); - i++; - } - - if (is_unstable (string->str)) - { - g_free (unstable); - unstable = g_string_free (string, FALSE); - } - else - { - g_free (stable); - stable = g_string_free (string, FALSE); - } - - g_match_info_next (match_info, NULL); - } - g_match_info_free (match_info); - g_regex_unref (regex); - - if ((GEDIT_MINOR_VERSION % 2) == 0) - { - g_free (unstable); - - return stable; - } - else - { - /* We need to check that stable isn't newer than unstable */ - if (newer_version (stable, unstable, FALSE)) - { - g_free (unstable); - - return stable; - } - else - { - g_free (stable); - - return unstable; - } - } -} - -static void -parse_page_version (SoupSession *session, - SoupMessage *msg, - GeditWindow *window) -{ - if (msg->status_code == SOUP_STATUS_OK) - { - gchar *version; - SoupMessage *msg2; - WindowData *data; - - data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); - - version = get_file_page_version (msg->response_body->data, - VERSION_PLACE); - - data->url = g_strconcat (GEDIT_URL, version, "/", NULL); - g_free (version); - msg2 = soup_message_new ("GET", data->url); - - soup_session_queue_message (session, msg2, - (SoupSessionCallback)parse_page_file, - window); - } - else - { - g_object_set_data (G_OBJECT (window), - WINDOW_DATA_KEY, - NULL); - } -} - -static void -impl_activate (GeditPlugin *plugin, - GeditWindow *window) -{ - SoupMessage *msg; - WindowData *data; - - gedit_debug (DEBUG_PLUGINS); - - data = g_slice_new (WindowData); - data->plugin = GEDIT_CHECK_UPDATE_PLUGIN (plugin); - data->url = NULL; - data->version = NULL; - - g_object_set_data_full (G_OBJECT (window), - WINDOW_DATA_KEY, - data, - free_window_data); - - msg = soup_message_new ("GET", GEDIT_URL); - - soup_session_queue_message (GEDIT_CHECK_UPDATE_PLUGIN (plugin)->priv->session, msg, - (SoupSessionCallback)parse_page_version, - window); -} - -static void -impl_deactivate (GeditPlugin *plugin, - GeditWindow *window) -{ - - gedit_debug (DEBUG_PLUGINS); - - soup_session_abort (GEDIT_CHECK_UPDATE_PLUGIN (plugin)->priv->session); - - g_object_set_data (G_OBJECT (window), - WINDOW_DATA_KEY, - NULL); -} - -static void -gedit_check_update_plugin_class_init (GeditCheckUpdatePluginClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GeditPluginClass *plugin_class = GEDIT_PLUGIN_CLASS (klass); - - g_type_class_add_private (object_class, sizeof (GeditCheckUpdatePluginPrivate)); - - object_class->finalize = gedit_check_update_plugin_finalize; - object_class->dispose = gedit_check_update_plugin_dispose; - - plugin_class->activate = impl_activate; - plugin_class->deactivate = impl_deactivate; -} diff --git a/plugins/checkupdate/gedit-check-update-plugin.h b/plugins/checkupdate/gedit-check-update-plugin.h deleted file mode 100755 index 68dc7f97..00000000 --- a/plugins/checkupdate/gedit-check-update-plugin.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2009 - Ignacio Casal Quinteiro - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __GEDIT_CHECK_UPDATE_PLUGIN_H__ -#define __GEDIT_CHECK_UPDATE_PLUGIN_H__ - -#include -#include -#include - -G_BEGIN_DECLS - -/* - * Type checking and casting macros - */ -#define GEDIT_TYPE_CHECK_UPDATE_PLUGIN (gedit_check_update_plugin_get_type ()) -#define GEDIT_CHECK_UPDATE_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GEDIT_TYPE_CHECK_UPDATE_PLUGIN, GeditCheckUpdatePlugin)) -#define GEDIT_CHECK_UPDATE_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GEDIT_TYPE_CHECK_UPDATE_PLUGIN, GeditCheckUpdatePluginClass)) -#define IS_GEDIT_CHECK_UPDATE_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GEDIT_TYPE_CHECK_UPDATE_PLUGIN)) -#define IS_GEDIT_CHECK_UPDATE_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GEDIT_TYPE_CHECK_UPDATE_PLUGIN)) -#define GEDIT_CHECK_UPDATE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GEDIT_TYPE_CHECK_UPDATE_PLUGIN, GeditCheckUpdatePluginClass)) - -/* Private structure type */ -typedef struct _GeditCheckUpdatePluginPrivate GeditCheckUpdatePluginPrivate; - -/* - * Main object structure - */ -typedef struct _GeditCheckUpdatePlugin GeditCheckUpdatePlugin; - -struct _GeditCheckUpdatePlugin -{ - GeditPlugin parent_instance; - - /*< private >*/ - GeditCheckUpdatePluginPrivate *priv; -}; - -/* - * Class definition - */ -typedef struct _GeditCheckUpdatePluginClass GeditCheckUpdatePluginClass; - -struct _GeditCheckUpdatePluginClass -{ - GeditPluginClass parent_class; -}; - -/* - * Public methods - */ -GType gedit_check_update_plugin_get_type (void) G_GNUC_CONST; - -/* All the plugins must implement this function */ -G_MODULE_EXPORT GType register_gedit_plugin (GTypeModule *module); - -G_END_DECLS - -#endif /* __GEDIT_CHECK_UPDATE_PLUGIN_H__ */ diff --git a/plugins/checkupdate/gedit-check-update.schemas.in b/plugins/checkupdate/gedit-check-update.schemas.in deleted file mode 100755 index 67bc892b..00000000 --- a/plugins/checkupdate/gedit-check-update.schemas.in +++ /dev/null @@ -1,13 +0,0 @@ - - - - /schemas/apps/gedit-2/plugins/checkupdate/ignore_version - /apps/gedit-2/plugins/checkupdate/ignore_version - gedit - string - - Version to ignore until the next version is released - - - - diff --git a/plugins/checkupdate/pluma-check-update-plugin.c b/plugins/checkupdate/pluma-check-update-plugin.c new file mode 100755 index 00000000..bf30181c --- /dev/null +++ b/plugins/checkupdate/pluma-check-update-plugin.c @@ -0,0 +1,697 @@ +/* + * Copyright (C) 2009 - Ignacio Casal Quinteiro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "pluma-check-update-plugin.h" + +#include +#include +#include +#include +#include +#include + +#include + +#if !GTK_CHECK_VERSION(2, 17, 1) +#include +#endif + +#define MATECONF_KEY_BASE "/apps/pluma-2/plugins/checkupdate" +#define MATECONF_KEY_IGNORE_VERSION MATECONF_KEY_BASE "/ignore_version" + +#define WINDOW_DATA_KEY "PlumaCheckUpdatePluginWindowData" + +#define VERSION_PLACE "" + +#ifdef G_OS_WIN32 +#define PLUMA_URL "http://ftp.acc.umu.se/pub/mate/binaries/win32/pluma/" +#define FILE_REGEX "pluma\\-setup\\-[0-9]+\\.[0-9]+\\.[0-9]+(\\-[0-9]+)?\\.exe" +#else +#define PLUMA_URL "http://ftp.acc.umu.se/pub/mate/binaries/mac/pluma/" +#define FILE_REGEX "pluma\\-[0-9]+\\.[0-9]+\\.[0-9]+(\\-[0-9]+)?\\.dmg" +#endif + +#ifdef OS_OSX +#include "pluma/osx/pluma-osx.h" +#endif + +#define PLUMA_CHECK_UPDATE_PLUGIN_GET_PRIVATE(object) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((object), \ + PLUMA_TYPE_CHECK_UPDATE_PLUGIN, \ + PlumaCheckUpdatePluginPrivate)) + +PLUMA_PLUGIN_REGISTER_TYPE (PlumaCheckUpdatePlugin, pluma_check_update_plugin) + +struct _PlumaCheckUpdatePluginPrivate +{ + SoupSession *session; + + MateConfClient *mateconf_client; +}; + +typedef struct +{ + PlumaCheckUpdatePlugin *plugin; + + gchar *url; + gchar *version; +} WindowData; + +static void +free_window_data (gpointer data) +{ + WindowData *window_data; + + if (data == NULL) + return; + + window_data = (WindowData *)data; + + g_free (window_data->url); + g_free (window_data->version); + g_slice_free (WindowData, data); +} + +static void +pluma_check_update_plugin_init (PlumaCheckUpdatePlugin *plugin) +{ + plugin->priv = PLUMA_CHECK_UPDATE_PLUGIN_GET_PRIVATE (plugin); + + pluma_debug_message (DEBUG_PLUGINS, + "PlumaCheckUpdatePlugin initializing"); + + plugin->priv->session = soup_session_async_new (); + + plugin->priv->mateconf_client = mateconf_client_get_default (); + + mateconf_client_add_dir (plugin->priv->mateconf_client, + MATECONF_KEY_BASE, + MATECONF_CLIENT_PRELOAD_ONELEVEL, + NULL); +} + +static void +pluma_check_update_plugin_dispose (GObject *object) +{ + PlumaCheckUpdatePlugin *plugin = PLUMA_CHECK_UPDATE_PLUGIN (object); + + if (plugin->priv->session != NULL) + { + g_object_unref (plugin->priv->session); + plugin->priv->session = NULL; + } + + if (plugin->priv->mateconf_client != NULL) + { + mateconf_client_suggest_sync (plugin->priv->mateconf_client, NULL); + + g_object_unref (G_OBJECT (plugin->priv->mateconf_client)); + + plugin->priv->mateconf_client = NULL; + } + + pluma_debug_message (DEBUG_PLUGINS, + "PlumaCheckUpdatePlugin disposing"); + + G_OBJECT_CLASS (pluma_check_update_plugin_parent_class)->dispose (object); +} + +static void +pluma_check_update_plugin_finalize (GObject *object) +{ + pluma_debug_message (DEBUG_PLUGINS, + "PlumaCheckUpdatePlugin finalizing"); + + G_OBJECT_CLASS (pluma_check_update_plugin_parent_class)->finalize (object); +} + +static void +set_contents (GtkWidget *infobar, + GtkWidget *contents) +{ +#if !GTK_CHECK_VERSION (2, 17, 1) + pluma_message_area_set_contents (PLUMA_MESSAGE_AREA (infobar), + contents); +#else + GtkWidget *content_area; + + content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar)); + gtk_container_add (GTK_CONTAINER (content_area), contents); +#endif +} + +static void +set_message_area_text_and_icon (GtkWidget *message_area, + const gchar *icon_stock_id, + const gchar *primary_text, + const gchar *secondary_text) +{ + GtkWidget *hbox_content; + GtkWidget *image; + GtkWidget *vbox; + gchar *primary_markup; + gchar *secondary_markup; + GtkWidget *primary_label; + GtkWidget *secondary_label; + + hbox_content = gtk_hbox_new (FALSE, 8); + gtk_widget_show (hbox_content); + + image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG); + gtk_widget_show (image); + gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0); + gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0); + + vbox = gtk_vbox_new (FALSE, 6); + gtk_widget_show (vbox); + gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0); + + primary_markup = g_strdup_printf ("%s", primary_text); + primary_label = gtk_label_new (primary_markup); + g_free (primary_markup); + gtk_widget_show (primary_label); + gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0); + gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE); + gtk_misc_set_alignment (GTK_MISC (primary_label), 0, 0.5); + GTK_WIDGET_SET_FLAGS (primary_label, GTK_CAN_FOCUS); + gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE); + + if (secondary_text != NULL) + { + secondary_markup = g_strdup_printf ("%s", + secondary_text); + secondary_label = gtk_label_new (secondary_markup); + g_free (secondary_markup); + gtk_widget_show (secondary_label); + gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0); + GTK_WIDGET_SET_FLAGS (secondary_label, GTK_CAN_FOCUS); + gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE); + gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE); + gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE); + gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5); + } + + set_contents (message_area, hbox_content); +} + +static void +on_response_cb (GtkWidget *infobar, + gint response_id, + PlumaWindow *window) +{ + if (response_id == GTK_RESPONSE_YES) + { + GError *error = NULL; + WindowData *data; + + data = g_object_get_data (G_OBJECT (window), + WINDOW_DATA_KEY); + +#ifdef OS_OSX + pluma_osx_show_url (data->url); +#else + gtk_show_uri (gtk_widget_get_screen (GTK_WIDGET (window)), + data->url, + GDK_CURRENT_TIME, + &error); +#endif + if (error != NULL) + { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("There was an error displaying the URI.")); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", error->message); + + g_signal_connect (G_OBJECT (dialog), + "response", + G_CALLBACK (gtk_widget_destroy), + NULL); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + + gtk_widget_show (dialog); + + g_error_free (error); + } + } + else if (response_id == GTK_RESPONSE_NO) + { + WindowData *data; + + data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); + + mateconf_client_set_string (data->plugin->priv->mateconf_client, + MATECONF_KEY_IGNORE_VERSION, + data->version, + NULL); + } + + g_object_set_data (G_OBJECT (window), + WINDOW_DATA_KEY, + NULL); + + gtk_widget_destroy (infobar); +} + +static GtkWidget * +create_infobar (PlumaWindow *window, + const gchar *version) +{ + GtkWidget *infobar; + gchar *message; + +#if !GTK_CHECK_VERSION (2, 17, 1) + infobar = pluma_message_area_new (); + + pluma_message_area_add_stock_button_with_text (PLUMA_MESSAGE_AREA (infobar), + _("_Download"), + GTK_STOCK_SAVE, + GTK_RESPONSE_YES); + pluma_message_area_add_stock_button_with_text (PLUMA_MESSAGE_AREA (infobar), + _("_Ignore Version"), + GTK_STOCK_DISCARD, + GTK_RESPONSE_NO); + pluma_message_area_add_button (PLUMA_MESSAGE_AREA (infobar), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); +#else + GtkWidget *button; + + infobar = gtk_info_bar_new (); + + button = pluma_gtk_button_new_with_stock_icon (_("_Download"), + GTK_STOCK_SAVE); + gtk_widget_show (button); + + gtk_info_bar_add_action_widget (GTK_INFO_BAR (infobar), + button, + GTK_RESPONSE_YES); + + button = pluma_gtk_button_new_with_stock_icon (_("_Ignore Version"), + GTK_STOCK_DISCARD); + gtk_widget_show (button); + + gtk_info_bar_add_action_widget (GTK_INFO_BAR (infobar), + button, + GTK_RESPONSE_NO); + + gtk_info_bar_add_button (GTK_INFO_BAR (infobar), + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL); + + gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), + GTK_MESSAGE_INFO); +#endif + + message = g_strdup_printf ("%s (%s)", _("There is a new version of pluma"), version); + set_message_area_text_and_icon (infobar, + "gtk-dialog-info", + message, + _("You can download the new version of pluma" + " by clicking on the download button or" + " ignore that version and wait for a new one")); + + g_free (message); + + g_signal_connect (infobar, "response", + G_CALLBACK (on_response_cb), + window); + + return infobar; +} + +static void +pack_infobar (GtkWidget *window, + GtkWidget *infobar) +{ + GtkWidget *vbox; + + vbox = gtk_bin_get_child (GTK_BIN (window)); + + gtk_box_pack_start (GTK_BOX (vbox), infobar, FALSE, FALSE, 0); + gtk_box_reorder_child (GTK_BOX (vbox), infobar, 2); +} + +static gchar * +get_file (const gchar *text, + const gchar *regex_place) +{ + GRegex *regex; + GMatchInfo *match_info; + gchar *word = NULL; + + regex = g_regex_new (regex_place, 0, 0, NULL); + g_regex_match (regex, text, 0, &match_info); + while (g_match_info_matches (match_info)) + { + g_free (word); + + word = g_match_info_fetch (match_info, 0); + + g_match_info_next (match_info, NULL); + } + g_match_info_free (match_info); + g_regex_unref (regex); + + return word; +} + +static void +get_numbers (const gchar *version, + gint *major, + gint *minor, + gint *micro) +{ + gchar **split; + gint num = 2; + + if (micro != NULL) + num = 3; + + split = g_strsplit (version, ".", num); + *major = atoi (split[0]); + *minor = atoi (split[1]); + if (micro != NULL) + *micro = atoi (split[2]); + + g_strfreev (split); +} + +static gboolean +newer_version (const gchar *v1, + const gchar *v2, + gboolean with_micro) +{ + gboolean newer = FALSE; + gint major1, minor1, micro1; + gint major2, minor2, micro2; + + if (v1 == NULL || v2 == NULL) + return FALSE; + + if (with_micro) + { + get_numbers (v1, &major1, &minor1, µ1); + get_numbers (v2, &major2, &minor2, µ2); + } + else + { + get_numbers (v1, &major1, &minor1, NULL); + get_numbers (v2, &major2, &minor2, NULL); + } + + if (major1 > major2) + { + newer = TRUE; + } + else if (minor1 > minor2 && major1 == major2) + { + newer = TRUE; + } + else if (with_micro && micro1 > micro2 && minor1 == minor2) + { + newer = TRUE; + } + + return newer; +} + +static gchar * +parse_file_version (const gchar *file) +{ + gchar *p, *aux; + + p = (gchar *)file; + + while (*p != '\0' && !g_ascii_isdigit (*p)) + { + p++; + } + + if (*p == '\0') + return NULL; + + aux = g_strrstr (p, "-"); + if (aux == NULL) + aux = g_strrstr (p, "."); + + return g_strndup (p, aux - p); +} + +static gchar * +get_ignore_version (PlumaCheckUpdatePlugin *plugin) +{ + return mateconf_client_get_string (plugin->priv->mateconf_client, + MATECONF_KEY_IGNORE_VERSION, + NULL); +} + +static void +parse_page_file (SoupSession *session, + SoupMessage *msg, + PlumaWindow *window) +{ + if (msg->status_code == SOUP_STATUS_OK) + { + gchar *file; + gchar *file_version; + gchar *ignore_version; + WindowData *data; + + data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); + + file = get_file (msg->response_body->data, FILE_REGEX); + file_version = parse_file_version (file); + ignore_version = get_ignore_version (data->plugin); + + if (newer_version (file_version, VERSION, TRUE) && + (ignore_version == NULL || *ignore_version == '\0' || + newer_version (file_version, ignore_version, TRUE))) + { + GtkWidget *infobar; + WindowData *data; + gchar *file_url; + + data = g_object_get_data (G_OBJECT (window), + WINDOW_DATA_KEY); + + file_url = g_strconcat (data->url, file, NULL); + + g_free (data->url); + data->url = file_url; + data->version = g_strdup (file_version); + + infobar = create_infobar (window, file_version); + pack_infobar (GTK_WIDGET (window), infobar); + gtk_widget_show (infobar); + } + + g_free (ignore_version); + g_free (file_version); + g_free (file); + } + else + { + g_object_set_data (G_OBJECT (window), + WINDOW_DATA_KEY, + NULL); + } +} + +static gboolean +is_unstable (const gchar *version) +{ + gchar **split; + gint minor; + gboolean unstable = TRUE;; + + split = g_strsplit (version, ".", 2); + minor = atoi (split[1]); + g_strfreev (split); + + if ((minor % 2) == 0) + unstable = FALSE; + + return unstable; +} + +static gchar * +get_file_page_version (const gchar *text, + const gchar *regex_place) +{ + GRegex *regex; + GMatchInfo *match_info; + GString *string = NULL; + gchar *unstable = NULL; + gchar *stable = NULL; + + regex = g_regex_new (regex_place, 0, 0, NULL); + g_regex_match (regex, text, 0, &match_info); + while (g_match_info_matches (match_info)) + { + gint end; + gint i; + + g_match_info_fetch_pos (match_info, 0, NULL, &end); + + string = g_string_new (""); + + i = end; + while (text[i] != '/') + { + string = g_string_append_c (string, text[i]); + i++; + } + + if (is_unstable (string->str)) + { + g_free (unstable); + unstable = g_string_free (string, FALSE); + } + else + { + g_free (stable); + stable = g_string_free (string, FALSE); + } + + g_match_info_next (match_info, NULL); + } + g_match_info_free (match_info); + g_regex_unref (regex); + + if ((PLUMA_MINOR_VERSION % 2) == 0) + { + g_free (unstable); + + return stable; + } + else + { + /* We need to check that stable isn't newer than unstable */ + if (newer_version (stable, unstable, FALSE)) + { + g_free (unstable); + + return stable; + } + else + { + g_free (stable); + + return unstable; + } + } +} + +static void +parse_page_version (SoupSession *session, + SoupMessage *msg, + PlumaWindow *window) +{ + if (msg->status_code == SOUP_STATUS_OK) + { + gchar *version; + SoupMessage *msg2; + WindowData *data; + + data = g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY); + + version = get_file_page_version (msg->response_body->data, + VERSION_PLACE); + + data->url = g_strconcat (PLUMA_URL, version, "/", NULL); + g_free (version); + msg2 = soup_message_new ("GET", data->url); + + soup_session_queue_message (session, msg2, + (SoupSessionCallback)parse_page_file, + window); + } + else + { + g_object_set_data (G_OBJECT (window), + WINDOW_DATA_KEY, + NULL); + } +} + +static void +impl_activate (PlumaPlugin *plugin, + PlumaWindow *window) +{ + SoupMessage *msg; + WindowData *data; + + pluma_debug (DEBUG_PLUGINS); + + data = g_slice_new (WindowData); + data->plugin = PLUMA_CHECK_UPDATE_PLUGIN (plugin); + data->url = NULL; + data->version = NULL; + + g_object_set_data_full (G_OBJECT (window), + WINDOW_DATA_KEY, + data, + free_window_data); + + msg = soup_message_new ("GET", PLUMA_URL); + + soup_session_queue_message (PLUMA_CHECK_UPDATE_PLUGIN (plugin)->priv->session, msg, + (SoupSessionCallback)parse_page_version, + window); +} + +static void +impl_deactivate (PlumaPlugin *plugin, + PlumaWindow *window) +{ + + pluma_debug (DEBUG_PLUGINS); + + soup_session_abort (PLUMA_CHECK_UPDATE_PLUGIN (plugin)->priv->session); + + g_object_set_data (G_OBJECT (window), + WINDOW_DATA_KEY, + NULL); +} + +static void +pluma_check_update_plugin_class_init (PlumaCheckUpdatePluginClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + PlumaPluginClass *plugin_class = PLUMA_PLUGIN_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (PlumaCheckUpdatePluginPrivate)); + + object_class->finalize = pluma_check_update_plugin_finalize; + object_class->dispose = pluma_check_update_plugin_dispose; + + plugin_class->activate = impl_activate; + plugin_class->deactivate = impl_deactivate; +} diff --git a/plugins/checkupdate/pluma-check-update-plugin.h b/plugins/checkupdate/pluma-check-update-plugin.h new file mode 100755 index 00000000..6742d2d4 --- /dev/null +++ b/plugins/checkupdate/pluma-check-update-plugin.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2009 - Ignacio Casal Quinteiro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __PLUMA_CHECK_UPDATE_PLUGIN_H__ +#define __PLUMA_CHECK_UPDATE_PLUGIN_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +/* + * Type checking and casting macros + */ +#define PLUMA_TYPE_CHECK_UPDATE_PLUGIN (pluma_check_update_plugin_get_type ()) +#define PLUMA_CHECK_UPDATE_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PLUMA_TYPE_CHECK_UPDATE_PLUGIN, PlumaCheckUpdatePlugin)) +#define PLUMA_CHECK_UPDATE_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), PLUMA_TYPE_CHECK_UPDATE_PLUGIN, PlumaCheckUpdatePluginClass)) +#define IS_PLUMA_CHECK_UPDATE_PLUGIN(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PLUMA_TYPE_CHECK_UPDATE_PLUGIN)) +#define IS_PLUMA_CHECK_UPDATE_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), PLUMA_TYPE_CHECK_UPDATE_PLUGIN)) +#define PLUMA_CHECK_UPDATE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), PLUMA_TYPE_CHECK_UPDATE_PLUGIN, PlumaCheckUpdatePluginClass)) + +/* Private structure type */ +typedef struct _PlumaCheckUpdatePluginPrivate PlumaCheckUpdatePluginPrivate; + +/* + * Main object structure + */ +typedef struct _PlumaCheckUpdatePlugin PlumaCheckUpdatePlugin; + +struct _PlumaCheckUpdatePlugin +{ + PlumaPlugin parent_instance; + + /*< private >*/ + PlumaCheckUpdatePluginPrivate *priv; +}; + +/* + * Class definition + */ +typedef struct _PlumaCheckUpdatePluginClass PlumaCheckUpdatePluginClass; + +struct _PlumaCheckUpdatePluginClass +{ + PlumaPluginClass parent_class; +}; + +/* + * Public methods + */ +GType pluma_check_update_plugin_get_type (void) G_GNUC_CONST; + +/* All the plugins must implement this function */ +G_MODULE_EXPORT GType register_pluma_plugin (GTypeModule *module); + +G_END_DECLS + +#endif /* __PLUMA_CHECK_UPDATE_PLUGIN_H__ */ diff --git a/plugins/checkupdate/pluma-check-update.schemas.in b/plugins/checkupdate/pluma-check-update.schemas.in new file mode 100755 index 00000000..5d4d009a --- /dev/null +++ b/plugins/checkupdate/pluma-check-update.schemas.in @@ -0,0 +1,13 @@ + + + + /schemas/apps/pluma-2/plugins/checkupdate/ignore_version + /apps/pluma-2/plugins/checkupdate/ignore_version + pluma + string + + Version to ignore until the next version is released + + + + -- cgit v1.2.1