116116 TARGET_TEXT ,
117117 TARGET_TEXT_URI_LIST ,
118118 TARGET_TEXT_PLAIN ,
119+ TARGET_TEXT_PLAIN_UTF8 ,
119120 TARGET_VIM ,
120121 TARGET_VIMENC
121122};
@@ -132,7 +133,9 @@ static const GtkTargetEntry selection_targets[] =
132133 {"UTF8_STRING" , 0 , TARGET_UTF8_STRING },
133134 {"COMPOUND_TEXT" , 0 , TARGET_COMPOUND_TEXT },
134135 {"TEXT" , 0 , TARGET_TEXT },
135- {"STRING" , 0 , TARGET_STRING }
136+ {"STRING" , 0 , TARGET_STRING },
137+ {"text/plain;charset=utf-8" , 0 , TARGET_TEXT_PLAIN_UTF8 },
138+ {"text/plain" , 0 , TARGET_TEXT_PLAIN }
136139};
137140#define N_SELECTION_TARGETS ARRAY_LENGTH(selection_targets)
138141
@@ -1531,6 +1534,8 @@ selection_get_cb(GtkWidget *widget UNUSED,
15311534 && info != (guint )TARGET_VIMENC
15321535 && info != (guint )TARGET_VIM
15331536 && info != (guint )TARGET_COMPOUND_TEXT
1537+ && info != (guint )TARGET_TEXT_PLAIN
1538+ && info != (guint )TARGET_TEXT_PLAIN_UTF8
15341539 && info != (guint )TARGET_TEXT )
15351540 return ;
15361541
@@ -3536,30 +3541,28 @@ gui_mch_set_curtab(int nr)
35363541 * Add selection targets for PRIMARY and CLIPBOARD selections.
35373542 */
35383543 void
3539- gui_gtk_set_selection_targets (void )
3544+ gui_gtk_set_selection_targets (GdkAtom selection )
35403545{
35413546 int i , j = 0 ;
3542- int n_targets = N_SELECTION_TARGETS ;
3543- GtkTargetEntry targets [N_SELECTION_TARGETS ];
3547+ static int n_targets = N_SELECTION_TARGETS ;
3548+ static GtkTargetEntry targets [N_SELECTION_TARGETS ];
35443549
3545- for ( i = 0 ; i < ( int ) N_SELECTION_TARGETS ; ++ i )
3550+ if ( targets [ 0 ]. target == NULL )
35463551 {
3547- // OpenOffice tries to use TARGET_HTML and fails when we don't
3548- // return something, instead of trying another target. Therefore only
3549- // offer TARGET_HTML when it works.
3550- if (!clip_html && selection_targets [i ].info == TARGET_HTML )
3551- n_targets -- ;
3552- else
3553- targets [j ++ ] = selection_targets [i ];
3552+ for (i = 0 ; i < (int )N_SELECTION_TARGETS ; ++ i )
3553+ {
3554+ // OpenOffice tries to use TARGET_HTML and fails when we don't
3555+ // return something, instead of trying another target. Therefore only
3556+ // offer TARGET_HTML when it works.
3557+ if (!clip_html && selection_targets [i ].info == TARGET_HTML )
3558+ n_targets -- ;
3559+ else
3560+ targets [j ++ ] = selection_targets [i ];
3561+ }
35543562 }
35553563
3556- gtk_selection_clear_targets (gui .drawarea , (GdkAtom )GDK_SELECTION_PRIMARY );
3557- gtk_selection_clear_targets (gui .drawarea , (GdkAtom )clip_plus .gtk_sel_atom );
3558- gtk_selection_add_targets (gui .drawarea ,
3559- (GdkAtom )GDK_SELECTION_PRIMARY ,
3560- targets , n_targets );
3561- gtk_selection_add_targets (gui .drawarea ,
3562- (GdkAtom )clip_plus .gtk_sel_atom ,
3564+ gtk_selection_clear_targets (gui .drawarea , selection );
3565+ gtk_selection_add_targets (gui .drawarea , selection ,
35633566 targets , n_targets );
35643567}
35653568
@@ -4035,20 +4038,7 @@ gui_mch_init(void)
40354038 g_signal_connect (G_OBJECT (gui .drawarea ), "button-release-event" ,
40364039 G_CALLBACK (button_release_event ), NULL );
40374040 g_signal_connect (G_OBJECT (gui .drawarea ), "scroll-event" ,
4038- G_CALLBACK (& scroll_event ), NULL );
4039-
4040- /*
4041- * Add selection handler functions.
4042- */
4043- g_signal_connect (G_OBJECT (gui .drawarea ), "selection-clear-event" ,
4044- G_CALLBACK (selection_clear_event ), NULL );
4045- g_signal_connect (G_OBJECT (gui .drawarea ), "selection-received" ,
4046- G_CALLBACK (selection_received_cb ), NULL );
4047-
4048- gui_gtk_set_selection_targets ();
4049-
4050- g_signal_connect (G_OBJECT (gui .drawarea ), "selection-get" ,
4051- G_CALLBACK (selection_get_cb ), NULL );
4041+ G_CALLBACK (scroll_event ), NULL );
40524042
40534043 // Pretend we don't have input focus, we will get an event if we do.
40544044 gui .in_focus = FALSE;
@@ -4582,6 +4572,17 @@ gui_mch_open(void)
45824572#endif
45834573 }
45844574
4575+ /*
4576+ * Add selection handler functions.
4577+ */
4578+ g_signal_connect (G_OBJECT (gui .drawarea ), "selection-clear-event" ,
4579+ G_CALLBACK (selection_clear_event ), NULL );
4580+ g_signal_connect (G_OBJECT (gui .drawarea ), "selection-received" ,
4581+ G_CALLBACK (selection_received_cb ), NULL );
4582+
4583+ g_signal_connect (G_OBJECT (gui .drawarea ), "selection-get" ,
4584+ G_CALLBACK (selection_get_cb ), NULL );
4585+
45854586 return OK ;
45864587}
45874588
@@ -6938,10 +6939,18 @@ clip_mch_lose_selection(Clipboard_T *cbd UNUSED)
69386939 int
69396940clip_mch_own_selection (Clipboard_T * cbd )
69406941{
6942+ // If we're blocking autocmds, we are filling the register to offer the
6943+ // selection (inside selection-get)
6944+ if (is_autocmd_blocked ())
6945+ return OK ;
6946+
69416947 int success ;
69426948
69436949 success = gtk_selection_owner_set (gui .drawarea , cbd -> gtk_sel_atom ,
69446950 gui .event_time );
6951+ // don't update on every visual selection change
6952+ if (!(cbd -> owned && VIsual_active ))
6953+ gui_gtk_set_selection_targets (cbd -> gtk_sel_atom );
69456954 gui_mch_update ();
69466955 return (success ) ? OK : FAIL ;
69476956}
0 commit comments