[gtranslator] Manage po files correctly, and disconnect signal when needed.
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtranslator] Manage po files correctly, and disconnect signal when needed.
- Date: Fri, 12 Feb 2010 16:18:21 +0000 (UTC)
commit 1bb001e61312eb078f970985cdc8f2ceedc2ed18
Author: Ignacio Casal Quinteiro <icq gnome org>
Date: Fri Feb 12 17:03:58 2010 +0100
Manage po files correctly, and disconnect signal when needed.
.../gtr-alternate-language-panel.c | 137 ++++++++++++--------
.../gtr-alternate-language-plugin.c | 13 +-
2 files changed, 87 insertions(+), 63 deletions(-)
---
diff --git a/plugins/alternate-language/gtr-alternate-language-panel.c b/plugins/alternate-language/gtr-alternate-language-panel.c
index ae951bf..4031a35 100644
--- a/plugins/alternate-language/gtr-alternate-language-panel.c
+++ b/plugins/alternate-language/gtr-alternate-language-panel.c
@@ -26,6 +26,7 @@
#include "gtr-po.h"
#include "gtr-tab.h"
#include "gtr-view.h"
+#include "gtr-debug.h"
#include <string.h>
#include <glib.h>
@@ -43,22 +44,24 @@
GTR_PLUGIN_DEFINE_TYPE (GtrAlternateLangPanel,
gtr_alternate_lang_panel, GTK_TYPE_VBOX)
- struct _GtrAlternateLangPanelPrivate
- {
- GtkWidget *open_button;
- GtkWidget *close_button;
- GtkWidget *textview;
-
- GtkWidget *status;
-
- GtrPo *po;
- GtrMsg *first;
- GtrTab *tab;
- };
-
- static void
- gtr_alternate_lang_panel_set_text
- (GtrAlternateLangPanel * panel, const gchar * text)
+
+struct _GtrAlternateLangPanelPrivate
+{
+ GtkWidget *open_button;
+ GtkWidget *close_button;
+ GtkWidget *textview;
+
+ GtkWidget *status;
+
+ GtrPo *po;
+ GtrTab *tab;
+
+ gulong showed_message_id;
+};
+
+static void
+gtr_alternate_lang_panel_set_text (GtrAlternateLangPanel *panel,
+ const gchar *text)
{
GtkTextBuffer *buf;
@@ -68,19 +71,23 @@ GTR_PLUGIN_DEFINE_TYPE (GtrAlternateLangPanel,
}
static void
-search_message (GtrAlternateLangPanel * panel, GtrMsg * msg)
+showed_message_cb (GtrTab * tab, GtrMsg * msg, GtrAlternateLangPanel * panel)
{
GList *messages;
GList *l;
- const gchar *msgid = gtr_msg_get_msgid (msg);
+ const gchar *msgid;
gchar *msgid_collate;
const gchar *string;
gchar *string_collate;
GtrMsgStatus status;
+ g_return_if_fail (GTR_IS_MSG (msg));
+
+ msgid = gtr_msg_get_msgid (msg);
msgid_collate = g_utf8_collate_key (msgid, -1);
messages = gtr_po_get_messages (panel->priv->po);
l = messages;
+
do
{
string = gtr_msg_get_msgid (l->data);
@@ -115,34 +122,27 @@ search_message (GtrAlternateLangPanel * panel, GtrMsg * msg)
g_free (msgid_collate);
gtr_alternate_lang_panel_set_text (panel, _("Message not found"));
- /*
- * If we are here the status is untranslated
- */
+ /* If we are here the status is untranslated */
gtk_image_set_from_stock (GTK_IMAGE (panel->priv->status),
UNTRANSLATED_ICON, GTK_ICON_SIZE_SMALL_TOOLBAR);
}
static void
-showed_message_cb (GtrTab * tab, GtrMsg * msg, GtrAlternateLangPanel * panel)
+open_file (GtkWidget *dialog, GtrAlternateLangPanel *panel)
{
- if (panel->priv->po == NULL)
- {
- panel->priv->first = msg;
- return;
- }
- search_message (panel, msg);
-}
-
-static void
-open_file (GtkWidget * dialog, GtrAlternateLangPanel * panel)
-{
- GError *error = NULL;
GFile *file;
- gchar *po_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ gchar *po_file;
+ GtrMsg *current;
+ GtrPo *current_po;
+ GList *l;
+ GError *error = NULL;
+ po_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
file = g_file_new_for_path (po_file);
g_free (po_file);
+ if (panel->priv->po != NULL)
+ g_object_unref (panel->priv->po);
panel->priv->po = gtr_po_new ();
gtr_po_parse (panel->priv->po, file, &error);
@@ -162,9 +162,18 @@ open_file (GtkWidget * dialog, GtrAlternateLangPanel * panel)
gtk_dialog_run (GTK_DIALOG (erdialog));
gtk_widget_destroy (erdialog);
g_error_free (error);
+ return;
}
- search_message (panel, panel->priv->first);
+ panel->priv->showed_message_id =
+ g_signal_connect (panel->priv->tab, "showed-message",
+ G_CALLBACK (showed_message_cb), panel);
+
+ current_po = gtr_tab_get_po (panel->priv->tab);
+ l = gtr_po_get_current_message (current_po);
+ current = GTR_MSG (l->data);
+
+ showed_message_cb (panel->priv->tab, current, panel);
gtk_widget_set_sensitive (panel->priv->textview, TRUE);
gtk_widget_destroy (dialog);
@@ -245,6 +254,13 @@ close_button_clicked_cb (GtkWidget * close_button,
panel->priv->po = NULL;
}
+
+ if (panel->priv->showed_message_id)
+ {
+ g_signal_handler_disconnect (panel->priv->tab,
+ panel->priv->showed_message_id);
+ panel->priv->showed_message_id = 0;
+ }
}
static void
@@ -254,16 +270,12 @@ gtr_alternate_lang_panel_draw (GtrAlternateLangPanel * panel)
GtkWidget *buttonbox;
GtkWidget *scroll;
- /*
- * Hbox
- */
+ /* Hbox */
hbox = gtk_hbox_new (FALSE, 6);
gtk_widget_show (hbox);
gtk_box_pack_start (GTK_BOX (panel), hbox, FALSE, TRUE, 0);
- /*
- * Button box
- */
+ /* Button box */
buttonbox = gtk_hbutton_box_new ();
gtk_button_box_set_layout (GTK_BUTTON_BOX (buttonbox), GTK_BUTTONBOX_START);
gtk_widget_show (buttonbox);
@@ -285,17 +297,13 @@ gtr_alternate_lang_panel_draw (GtrAlternateLangPanel * panel)
gtk_box_pack_start (GTK_BOX (hbox), buttonbox, FALSE, TRUE, 0);
- /*
- * Radio buttons
- */
+ /* Status image */
panel->priv->status = gtk_image_new ();
gtk_widget_show (panel->priv->status);
gtk_box_pack_start (GTK_BOX (hbox), panel->priv->status, FALSE, FALSE, 0);
- /*
- * Text view
- */
+ /* Text view */
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (scroll);
@@ -323,25 +331,43 @@ gtr_alternate_lang_panel_init (GtrAlternateLangPanel * panel)
{
panel->priv = GTR_ALTERNATE_LANG_PANEL_GET_PRIVATE (panel);
- gtr_alternate_lang_panel_draw (panel);
-
+ panel->priv->showed_message_id = 0;
panel->priv->po = NULL;
+
+ gtr_alternate_lang_panel_draw (panel);
}
static void
-gtr_alternate_lang_panel_finalize (GObject * object)
+gtr_alternate_lang_panel_dispose (GObject *object)
{
- G_OBJECT_CLASS (gtr_alternate_lang_panel_parent_class)->finalize (object);
+ GtrAlternateLangPanel *panel = GTR_ALTERNATE_LANG_PANEL (object);
+
+ DEBUG_PRINT ("Disposing alternate lang panel");
+
+ if (panel->priv->showed_message_id != 0)
+ {
+ g_signal_handler_disconnect (panel->priv->tab,
+ panel->priv->showed_message_id);
+ panel->priv->showed_message_id = 0;
+ }
+
+ if (panel->priv->po != NULL)
+ {
+ g_object_unref (panel->priv->po);
+ panel->priv->po = NULL;
+ }
+
+ G_OBJECT_CLASS (gtr_alternate_lang_panel_parent_class)->dispose (object);
}
static void
- gtr_alternate_lang_panel_class_init (GtrAlternateLangPanelClass * klass)
+gtr_alternate_lang_panel_class_init (GtrAlternateLangPanelClass * klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (GtrAlternateLangPanelPrivate));
- object_class->finalize = gtr_alternate_lang_panel_finalize;
+ object_class->dispose = gtr_alternate_lang_panel_dispose;
}
/***************************** Public funcs ***********************************/
@@ -354,8 +380,5 @@ gtr_alternate_lang_panel_new (GtkWidget * tab)
panel->priv->tab = GTR_TAB (tab);
- g_signal_connect (tab, "showed-message",
- G_CALLBACK (showed_message_cb), panel);
-
return GTK_WIDGET (panel);
}
diff --git a/plugins/alternate-language/gtr-alternate-language-plugin.c b/plugins/alternate-language/gtr-alternate-language-plugin.c
index 4b810c1..4b2ece3 100644
--- a/plugins/alternate-language/gtr-alternate-language-plugin.c
+++ b/plugins/alternate-language/gtr-alternate-language-plugin.c
@@ -39,10 +39,11 @@
GTR_PLUGIN_REGISTER_TYPE_WITH_CODE (GtrAlternateLangPlugin,
gtr_alternate_lang_plugin,
gtr_alternate_lang_panel_register_type
- (module);
- )
- static void on_alternate_lang_activated (GtkAction * action,
- GtrWindow * window)
+ (module);)
+
+static void
+on_alternate_lang_activated (GtkAction *action,
+ GtrWindow * window)
{
GtrTab *tab;
GtkWidget *alternatelang;
@@ -70,7 +71,7 @@ free_window_data (WindowData * data)
{
g_return_if_fail (data != NULL);
- g_free (data);
+ g_slice_free (WindowData, data);
}
static void
@@ -127,7 +128,7 @@ impl_activate (GtrPlugin * plugin, GtrWindow * window)
GtkUIManager *manager;
WindowData *data;
- data = g_new (WindowData, 1);
+ data = g_slice_new (WindowData);
manager = gtr_window_get_ui_manager (window);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]