All pastes #274199 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-12-10 14:47 UTC
rendered paste body
Index: 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