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