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