[gedit/wip/gtkapp: 2/3] Use GtkApplication inhibit api
- From: Ignacio Casal Quinteiro <icq src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit/wip/gtkapp: 2/3] Use GtkApplication inhibit api
- Date: Fri, 28 Dec 2012 17:11:24 +0000 (UTC)
commit b5176e2817bbfdd1e067867b1d13a91deba566a8
Author: Paolo Borelli <pborelli gnome org>
Date: Sat Dec 22 20:59:33 2012 +0100
Use GtkApplication inhibit api
Introduce a can-save property on GeditTab in order to bubble up this
information to GeditWindow... GtkApplication api requires us
to inhibit session shutdown preemptively instead of checking lazily
when shutdown is requested.
gedit/gedit-commands-file.c | 4 +-
gedit/gedit-tab.c | 41 ++++++++++++++++++++++-----
gedit/gedit-tab.h | 2 +-
gedit/gedit-window-private.h | 2 +
gedit/gedit-window.c | 62 +++++++++++++++++++++++++++++++++++++++--
5 files changed, 97 insertions(+), 14 deletions(-)
---
diff --git a/gedit/gedit-commands-file.c b/gedit/gedit-commands-file.c
index 23ba108..a316bd0 100644
--- a/gedit/gedit-commands-file.c
+++ b/gedit/gedit-commands-file.c
@@ -1335,7 +1335,7 @@ _gedit_cmd_file_revert (GtkAction *action,
* if the document has not been modified, do
* not bug the user further */
if (gedit_tab_get_state (tab) == GEDIT_TAB_STATE_EXTERNALLY_MODIFIED_NOTIFICATION ||
- _gedit_tab_can_close (tab))
+ _gedit_tab_get_can_close (tab))
{
do_revert (window, tab);
return;
@@ -1766,7 +1766,7 @@ tab_can_close (GeditTab *tab,
doc = gedit_tab_get_document (tab);
- if (!_gedit_tab_can_close (tab))
+ if (!_gedit_tab_get_can_close (tab))
{
GtkWidget *dlg;
diff --git a/gedit/gedit-tab.c b/gedit/gedit-tab.c
index 2440d45..9438773 100644
--- a/gedit/gedit-tab.c
+++ b/gedit/gedit-tab.c
@@ -92,7 +92,8 @@ enum
PROP_NAME,
PROP_STATE,
PROP_AUTO_SAVE,
- PROP_AUTO_SAVE_INTERVAL
+ PROP_AUTO_SAVE_INTERVAL,
+ PROP_CAN_CLOSE
};
/* Signals */
@@ -206,6 +207,10 @@ gedit_tab_get_property (GObject *object,
g_value_set_int (value,
gedit_tab_get_auto_save_interval (tab));
break;
+ case PROP_CAN_CLOSE:
+ g_value_set_boolean (value,
+ _gedit_tab_get_can_close (tab));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -339,6 +344,15 @@ gedit_tab_class_init (GeditTabClass *klass)
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_CAN_CLOSE,
+ g_param_spec_boolean ("can-close",
+ "Can close",
+ "Whether the tab can be closed",
+ TRUE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
signals[DROP_URIS] =
g_signal_new ("drop-uris",
G_TYPE_FROM_CLASS (object_class),
@@ -477,6 +491,7 @@ gedit_tab_set_state (GeditTab *tab,
state);
g_object_notify (G_OBJECT (tab), "state");
+ g_object_notify (G_OBJECT (tab), "can-close");
}
static void
@@ -506,6 +521,7 @@ document_modified_changed (GtkTextBuffer *document,
GeditTab *tab)
{
g_object_notify (G_OBJECT (tab), "name");
+ g_object_notify (G_OBJECT (tab), "can-close");
}
static void
@@ -2204,7 +2220,6 @@ _gedit_tab_load_stream (GeditTab *tab,
encoding,
line_pos,
column_pos);
-
}
void
@@ -2825,7 +2840,7 @@ _gedit_tab_mark_for_closing (GeditTab *tab)
}
gboolean
-_gedit_tab_can_close (GeditTab *tab)
+_gedit_tab_get_can_close (GeditTab *tab)
{
GeditDocument *doc;
GeditTabState ts;
@@ -2845,15 +2860,25 @@ _gedit_tab_can_close (GeditTab *tab)
/* Do not close tab with saving errors */
if (ts == GEDIT_TAB_STATE_SAVING_ERROR)
+ {
return FALSE;
-
+ }
+
doc = gedit_tab_get_document (tab);
- /* TODO: we need to save the file also if it has been externally
- modified - Paolo (Oct 10, 2005) */
+ if (gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (doc)))
+ {
+ return FALSE;
+ }
+
+ if (gedit_document_is_local (doc) &&
+ (gedit_document_get_deleted (doc) ||
+ _gedit_document_check_externally_modified (doc)))
+ {
+ return FALSE;
+ }
- return (!gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (doc)) &&
- !gedit_document_get_deleted (doc));
+ return TRUE;
}
/**
diff --git a/gedit/gedit-tab.h b/gedit/gedit-tab.h
index ee20bc1..ac924fc 100644
--- a/gedit/gedit-tab.h
+++ b/gedit/gedit-tab.h
@@ -173,7 +173,7 @@ void _gedit_tab_print_preview (GeditTab *tab);
void _gedit_tab_mark_for_closing (GeditTab *tab);
-gboolean _gedit_tab_can_close (GeditTab *tab);
+gboolean _gedit_tab_get_can_close (GeditTab *tab);
GtkWidget *_gedit_tab_get_view_frame (GeditTab *tab);
diff --git a/gedit/gedit-window-private.h b/gedit/gedit-window-private.h
index 8ea3b5c..e6a7f54 100644
--- a/gedit/gedit-window-private.h
+++ b/gedit/gedit-window-private.h
@@ -113,6 +113,8 @@ struct _GeditWindowPrivate
GeditWindowState state;
+ guint inhibition_cookie;
+
gint bottom_panel_item_removed_handler_id;
GtkWindowGroup *window_group;
diff --git a/gedit/gedit-window.c b/gedit/gedit-window.c
index 32919ad..7fc5ccf 100644
--- a/gedit/gedit-window.c
+++ b/gedit/gedit-window.c
@@ -114,7 +114,7 @@ gedit_window_get_property (GObject *object,
case PROP_STATE:
g_value_set_enum (value,
gedit_window_get_state (window));
- break;
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2803,6 +2803,44 @@ update_window_state (GeditWindow *window)
}
static void
+update_can_close (GeditWindow *window)
+{
+ GeditWindowPrivate *priv = window->priv;
+ GList *tabs;
+ GList *l;
+ gboolean can_close = TRUE;
+
+ gedit_debug (DEBUG_WINDOW);
+
+ tabs = gedit_multi_notebook_get_all_tabs (priv->multi_notebook);
+
+ for (l = tabs; l != NULL; l = g_list_next (l))
+ {
+ GeditTab *tab = l->data;
+
+ if (!_gedit_tab_get_can_close (tab))
+ {
+ can_close = FALSE;
+ break;
+ }
+ }
+
+ if (can_close && (priv->inhibition_cookie != 0))
+ {
+ gtk_application_uninhibit (GTK_APPLICATION (g_application_get_default ()),
+ priv->inhibition_cookie);
+ priv->inhibition_cookie = 0;
+ }
+ else if (!can_close && (priv->inhibition_cookie == 0))
+ {
+ priv->inhibition_cookie = gtk_application_inhibit (GTK_APPLICATION (g_application_get_default ()),
+ GTK_WINDOW (window),
+ GTK_APPLICATION_INHIBIT_LOGOUT,
+ _("There are unsaved documents"));
+ }
+}
+
+static void
sync_state (GeditTab *tab,
GParamSpec *pspec,
GeditWindow *window)
@@ -2890,6 +2928,14 @@ sync_name (GeditTab *tab,
window);
}
+static void
+sync_can_close (GeditTab *tab,
+ GParamSpec *pspec,
+ GeditWindow *window)
+{
+ update_can_close (window);
+}
+
static GeditWindow *
get_drop_window (GtkWidget *widget)
{
@@ -3380,10 +3426,13 @@ on_tab_added (GeditMultiNotebook *multi,
G_CALLBACK (sync_state),
window);
g_signal_connect (tab,
+ "notify::can-close",
+ G_CALLBACK (sync_can_close),
+ window);
+ g_signal_connect (tab,
"drop_uris",
G_CALLBACK (drop_uris_cb),
window);
-
g_signal_connect (doc,
"bracket-matched",
G_CALLBACK (bracket_matched_cb),
@@ -3428,6 +3477,7 @@ on_tab_added (GeditMultiNotebook *multi,
update_documents_list_menu (window);
update_window_state (window);
+ update_can_close (window);
g_signal_emit (G_OBJECT (window), signals[TAB_ADDED], 0, tab);
}
@@ -3458,6 +3508,9 @@ on_tab_removed (GeditMultiNotebook *multi,
G_CALLBACK (sync_state),
window);
g_signal_handlers_disconnect_by_func (tab,
+ G_CALLBACK (sync_can_close),
+ window);
+ g_signal_handlers_disconnect_by_func (tab,
G_CALLBACK (drop_uris_cb),
window);
g_signal_handlers_disconnect_by_func (doc,
@@ -3550,6 +3603,7 @@ on_tab_removed (GeditMultiNotebook *multi,
}
update_window_state (window);
+ update_can_close (window);
g_signal_emit (G_OBJECT (window), signals[TAB_REMOVED], 0, tab);
}
@@ -3985,8 +4039,10 @@ gedit_window_init (GeditWindow *window)
gedit_debug (DEBUG_WINDOW);
window->priv = GEDIT_WINDOW_GET_PRIVATE (window);
+
window->priv->removing_tabs = FALSE;
window->priv->state = GEDIT_WINDOW_STATE_NORMAL;
+ window->priv->inhibition_cookie = 0;
window->priv->dispose_has_run = FALSE;
window->priv->fullscreen_controls = NULL;
window->priv->fullscreen_animation_timeout_id = 0;
@@ -4713,7 +4769,7 @@ static void
add_unsaved_doc (GeditTab *tab,
GList **res)
{
- if (!_gedit_tab_can_close (tab))
+ if (!_gedit_tab_get_can_close (tab))
{
GeditDocument *doc;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]