| To: vim-dev@vim.org |
| Subject: Patch 7.2.442 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.2.442 (after 7.2.201) |
| Problem: Copy/paste with OpenOffice doesn't work. |
| Solution: Do not offer the HTML target when it is not supported. (James |
| Vega) |
| Files: src/gui_gtk_x11.c, src/option.c, src/proto/gui_gtk_x11.pro |
| |
| |
| |
| |
| |
| *** 1433,1438 **** |
| --- 1433,1442 ---- |
| } |
| #endif /* !HAVE_GTK2 */ |
| |
| + /* Chop off any traiing NUL bytes. OpenOffice sends these. */ |
| + while (len > 0 && text[len - 1] == NUL) |
| + --len; |
| + |
| clip_yank_selection(motion_type, text, (long)len, cbd); |
| received_selection = RS_OK; |
| vim_free(tmpbuf); |
| |
| *** 3463,3468 **** |
| --- 3467,3532 ---- |
| #endif /* FEAT_GUI_TABLINE */ |
| |
| /* |
| + * Add selection targets for PRIMARY and CLIPBOARD selections. |
| + */ |
| + void |
| + gui_gtk_set_selection_targets(void) |
| + { |
| + int i, j = 0; |
| + int n_targets = N_SELECTION_TARGETS; |
| + GtkTargetEntry targets[N_SELECTION_TARGETS]; |
| + |
| + for (i = 0; i < (int)N_SELECTION_TARGETS; ++i) |
| + { |
| + #ifdef FEAT_MBYTE |
| + /* OpenOffice tries to use TARGET_HTML and fails when it doesn't |
| + * return something, instead of trying another target. Therefore only |
| + * offer TARGET_HTML when it works. */ |
| + if (!clip_html && selection_targets[i].info == TARGET_HTML) |
| + n_targets--; |
| + else |
| + #endif |
| + targets[j++] = selection_targets[i]; |
| + } |
| + |
| + gtk_selection_clear_targets(gui.drawarea, (GdkAtom)GDK_SELECTION_PRIMARY); |
| + gtk_selection_clear_targets(gui.drawarea, (GdkAtom)clip_plus.gtk_sel_atom); |
| + gtk_selection_add_targets(gui.drawarea, |
| + (GdkAtom)GDK_SELECTION_PRIMARY, |
| + targets, n_targets); |
| + gtk_selection_add_targets(gui.drawarea, |
| + (GdkAtom)clip_plus.gtk_sel_atom, |
| + targets, n_targets); |
| + } |
| + |
| + /* |
| + * Set up for receiving DND items. |
| + */ |
| + void |
| + gui_gtk_set_dnd_targets(void) |
| + { |
| + int i, j = 0; |
| + int n_targets = N_DND_TARGETS; |
| + GtkTargetEntry targets[N_DND_TARGETS]; |
| + |
| + for (i = 0; i < (int)N_DND_TARGETS; ++i) |
| + { |
| + #ifdef FEAT_MBYTE |
| + if (!clip_html && selection_targets[i].info == TARGET_HTML) |
| + n_targets--; |
| + else |
| + #endif |
| + targets[j++] = dnd_targets[i]; |
| + } |
| + |
| + gtk_drag_dest_unset(gui.drawarea); |
| + gtk_drag_dest_set(gui.drawarea, |
| + GTK_DEST_DEFAULT_ALL, |
| + targets, n_targets, |
| + GDK_ACTION_COPY); |
| + } |
| + |
| + /* |
| * Initialize the GUI. Create all the windows, set up all the callbacks etc. |
| * Returns OK for success, FAIL when the GUI can't be started. |
| */ |
| |
| *** 3925,3939 **** |
| gtk_signal_connect(GTK_OBJECT(gui.drawarea), "selection_received", |
| GTK_SIGNAL_FUNC(selection_received_cb), NULL); |
| |
| ! /* |
| ! * Add selection targets for PRIMARY and CLIPBOARD selections. |
| ! */ |
| ! gtk_selection_add_targets(gui.drawarea, |
| ! (GdkAtom)GDK_SELECTION_PRIMARY, |
| ! selection_targets, N_SELECTION_TARGETS); |
| ! gtk_selection_add_targets(gui.drawarea, |
| ! (GdkAtom)clip_plus.gtk_sel_atom, |
| ! selection_targets, N_SELECTION_TARGETS); |
| |
| gtk_signal_connect(GTK_OBJECT(gui.drawarea), "selection_get", |
| GTK_SIGNAL_FUNC(selection_get_cb), NULL); |
| --- 3989,3995 ---- |
| gtk_signal_connect(GTK_OBJECT(gui.drawarea), "selection_received", |
| GTK_SIGNAL_FUNC(selection_received_cb), NULL); |
| |
| ! gui_gtk_set_selection_targets(); |
| |
| gtk_signal_connect(GTK_OBJECT(gui.drawarea), "selection_get", |
| GTK_SIGNAL_FUNC(selection_get_cb), NULL); |
| |
| *** 4057,4063 **** |
| return TRUE; |
| } |
| |
| - |
| /* |
| * Open the GUI window which was created by a call to gui_mch_init(). |
| */ |
| --- 4113,4118 ---- |
| |
| *** 4225,4237 **** |
| GTK_SIGNAL_FUNC(form_configure_event), NULL); |
| |
| #ifdef FEAT_DND |
| ! /* |
| ! * Set up for receiving DND items. |
| ! */ |
| ! gtk_drag_dest_set(gui.drawarea, |
| ! GTK_DEST_DEFAULT_ALL, |
| ! dnd_targets, N_DND_TARGETS, |
| ! GDK_ACTION_COPY); |
| |
| gtk_signal_connect(GTK_OBJECT(gui.drawarea), "drag_data_received", |
| GTK_SIGNAL_FUNC(drag_data_received_cb), NULL); |
| --- 4280,4287 ---- |
| GTK_SIGNAL_FUNC(form_configure_event), NULL); |
| |
| #ifdef FEAT_DND |
| ! /* Set up for receiving DND items. */ |
| ! gui_gtk_set_dnd_targets(); |
| |
| gtk_signal_connect(GTK_OBJECT(gui.drawarea), "drag_data_received", |
| GTK_SIGNAL_FUNC(drag_data_received_cb), NULL); |
| |
| *** 4428,4434 **** |
| /* this will cause the proper resizement to happen too */ |
| update_window_manager_hints(0, 0); |
| |
| ! #else /* HAVE_GTK2 */ |
| /* this will cause the proper resizement to happen too */ |
| if (gtk_socket_id == 0) |
| update_window_manager_hints(0, 0); |
| --- 4478,4484 ---- |
| /* this will cause the proper resizement to happen too */ |
| update_window_manager_hints(0, 0); |
| |
| ! #else |
| /* this will cause the proper resizement to happen too */ |
| if (gtk_socket_id == 0) |
| update_window_manager_hints(0, 0); |
| |
| *** 4444,4457 **** |
| else |
| update_window_manager_hints(width, height); |
| |
| ! #if 0 |
| if (!resize_idle_installed) |
| { |
| g_idle_add_full(GDK_PRIORITY_EVENTS + 10, |
| &force_shell_resize_idle, NULL, NULL); |
| resize_idle_installed = TRUE; |
| } |
| ! #endif |
| /* |
| * Wait until all events are processed to prevent a crash because the |
| * real size of the drawing area doesn't reflect Vim's internal ideas. |
| --- 4494,4507 ---- |
| else |
| update_window_manager_hints(width, height); |
| |
| ! # if 0 |
| if (!resize_idle_installed) |
| { |
| g_idle_add_full(GDK_PRIORITY_EVENTS + 10, |
| &force_shell_resize_idle, NULL, NULL); |
| resize_idle_installed = TRUE; |
| } |
| ! # endif |
| /* |
| * Wait until all events are processed to prevent a crash because the |
| * real size of the drawing area doesn't reflect Vim's internal ideas. |
| |
| |
| |
| *** 7112,7117 **** |
| --- 7112,7124 ---- |
| clip_html = new_html; |
| vim_free(clip_exclude_prog); |
| clip_exclude_prog = new_exclude_prog; |
| + #ifdef FEAT_GUI_GTK |
| + if (gui.in_use) |
| + { |
| + gui_gtk_set_selection_targets(); |
| + gui_gtk_set_dnd_targets(); |
| + } |
| + #endif |
| } |
| else |
| vim_free(new_exclude_prog); |
| |
| |
| |
| *** 9,14 **** |
| --- 9,16 ---- |
| int gui_mch_showing_tabline __ARGS((void)); |
| void gui_mch_update_tabline __ARGS((void)); |
| void gui_mch_set_curtab __ARGS((int nr)); |
| + void gui_gtk_set_selection_targets __ARGS((void)); |
| + void gui_gtk_set_dnd_targets __ARGS((void)); |
| int gui_mch_init __ARGS((void)); |
| void gui_mch_forked __ARGS((void)); |
| void gui_mch_new_colors __ARGS((void)); |
| |
| |
| |
| *** 683,684 **** |
| --- 683,686 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 442, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 158. You get a tuner card so you can watch TV while surfing. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |