rendered paste bodyIndex: gedit/gedit-window.c
===================================================================
RCS file: /cvs/gnome/gedit/gedit/gedit-window.c,v
retrieving revision 1.46
diff -u -p -u -p -r1.46 gedit-window.c
--- gedit/gedit-window.c 7 Dec 2006 16:24:14 -0000 1.46
+++ gedit/gedit-window.c 10 Dec 2006 14:46:29 -0000
@@ -579,6 +579,69 @@ update_next_prev_doc_sensitivity_per_win
}
static void
+received_clipboard_contents (GtkClipboard *clipboard,
+ GtkSelectionData *selection_data,
+ GeditWindow *window)
+{
+ gboolean sens;
+ GtkAction *action;
+
+ /* getting clipboard contents is async, so we need to
+ * get the current tab and its state */
+
+ if (window->priv->active_tab != NULL)
+ {
+ GeditTabState state;
+ gboolean state_normal;
+
+ state = gedit_tab_get_state (window->priv->active_tab);
+ state_normal = (state == GEDIT_TAB_STATE_NORMAL);
+
+ sens = state_normal &&
+ gtk_selection_data_targets_include_text (selection_data);
+ }
+ else
+ {
+ sens = FALSE;
+ }
+
+ action = gtk_action_group_get_action (window->priv->action_group,
+ "EditPaste");
+
+ gtk_action_set_sensitive (action, sens);
+
+ g_object_unref (window);
+}
+
+static void
+set_paste_sensitivity_according_to_clipboard (GeditWindow *window,
+ GtkClipboard *clipboard)
+{
+ GdkDisplay *display;
+
+ display = gtk_clipboard_get_display (clipboard);
+
+ if (gdk_display_supports_selection_notification (display))
+ {
+ gtk_clipboard_request_contents (clipboard,
+ gdk_atom_intern ("TARGETS", FALSE),
+ (GtkClipboardReceivedFunc) received_clipboard_contents,
+ g_object_ref (window));
+ }
+ else
+ {
+ GtkAction *action;
+
+ action = gtk_action_group_get_action (window->priv->action_group,
+ "EditPaste");
+
+ /* XFIXES extension not availbale, make
+ * Paste always sensitive */
+ gtk_action_set_sensitive (action, TRUE);
+ }
+}
+
+static void
set_sensitivity_according_to_tab (GeditWindow *window,
GeditTab *tab)
{
@@ -588,6 +651,7 @@ set_sensitivity_according_to_tab (GeditW
gboolean b;
gboolean state_normal;
GeditTabState state;
+ GtkClipboard *clipboard;
GeditLockdownMask lockdown;
g_return_if_fail (GEDIT_TAB (tab));
@@ -602,6 +666,9 @@ set_sensitivity_according_to_tab (GeditW
view = gedit_tab_get_view (tab);
doc = GEDIT_DOCUMENT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
+ clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window),
+ GDK_SELECTION_CLIPBOARD);
+
action = gtk_action_group_get_action (window->priv->action_group,
"FileSave");
gtk_action_set_sensitive (action,
@@ -671,8 +738,15 @@ set_sensitivity_according_to_tab (GeditW
action = gtk_action_group_get_action (window->priv->action_group,
"EditPaste");
- gtk_action_set_sensitive (action,
- state_normal);
+ if (state_normal)
+ {
+ set_paste_sensitivity_according_to_clipboard (window,
+ clipboard);
+ }
+ else
+ {
+ gtk_action_set_sensitive (action, FALSE);
+ }
action = gtk_action_group_get_action (window->priv->action_group,
"EditDelete");
@@ -2853,6 +2927,14 @@ notebook_popup_menu (GtkNotebook *notebo
}
static void
+owner_change_callback (GtkClipboard *clipboard,
+ GdkEventOwnerChange *event,
+ GeditWindow *window)
+{
+ set_paste_sensitivity_according_to_clipboard (window, clipboard);
+}
+
+static void
hpaned_restore_position (GtkWidget *widget,
GeditWindow *window)
{
@@ -3213,6 +3295,14 @@ gedit_window_init (GeditWindow *window)
g_signal_connect (window->priv->notebook,
"popup-menu",
G_CALLBACK (notebook_popup_menu),
+ window);
+
+ /* FIXME: we should get the clipboard for the right display,
+ * but so this signal has to be connected elsewhere, when
+ * the toplevel has been shown */
+ g_signal_connect (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD),
+ "owner_change",
+ G_CALLBACK (owner_change_callback),
window);
/* connect instead of override, so that we can