]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.856 v7.3.856
authorBram Moolenaar <Bram@vim.org>
Wed, 13 Mar 2013 16:50:25 +0000 (17:50 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 13 Mar 2013 16:50:25 +0000 (17:50 +0100)
Problem:    When calling system() multi-byte clipboard contents is garbled.
Solution:   Save and restore the clipboard contents.  (Yukihiro Nakadaira)

src/gui_gtk_x11.c
src/ops.c
src/os_unix.c
src/proto/gui_gtk_x11.pro
src/proto/ops.pro
src/proto/ui.pro
src/ui.c
src/version.c

index d0eebf371f75db00c598de31da8cf573e3d23c82..61432a20d92e36695f749dc64a209f6f3e41a33f 100644 (file)
@@ -5674,12 +5674,8 @@ clip_mch_request_selection(VimClipboard *cbd)
     void
 clip_mch_lose_selection(VimClipboard *cbd UNUSED)
 {
-    /* WEIRD: when using NULL to actually disown the selection, we lose the
-     * selection the first time we own it. */
-    /*
-    gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, (guint32)GDK_CURRENT_TIME);
+    gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, gui.event_time);
     gui_mch_update();
-     */
 }
 
 /*
@@ -5705,6 +5701,12 @@ clip_mch_set_selection(VimClipboard *cbd UNUSED)
 {
 }
 
+    int
+clip_gtk_owner_exists(VimClipboard *cbd)
+{
+    return gdk_selection_owner_get(cbd->gtk_sel_atom) != NULL;
+}
+
 
 #if defined(FEAT_MENU) || defined(PROTO)
 /*
index f3a26da44a175a6ee471de2a62394401cec560e3..2ab90444346d17ff77f690e56dc9fc0fff80cbc4 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -1016,6 +1016,19 @@ put_register(name, reg)
     /* Send text written to clipboard register to the clipboard. */
     may_set_selection();
 # endif
+}
+
+    void
+free_register(reg)
+    void       *reg;
+{
+    struct yankreg tmp;
+
+    tmp = *y_current;
+    *y_current = *(struct yankreg *)reg;
+    free_yank_all();
+    vim_free(reg);
+    *y_current = tmp;
 }
 #endif
 
index bb97bbe6b19519173d2e8c2eff5d88073198cc99..9d9483261909294eb6bf2108dc4c230599dca438 100644 (file)
@@ -1138,6 +1138,11 @@ sigcont_handler SIGDEFARG(sigarg)
 
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
 static void loose_clipboard __ARGS((void));
+static void save_clipboard __ARGS((void));
+static void restore_clipboard __ARGS((void));
+
+static void *clip_star_save = NULL;
+static void *clip_plus_save = NULL;
 
 /*
  * Called when Vim is going to sleep or execute a shell command.
@@ -1158,6 +1163,42 @@ loose_clipboard()
            XFlush(x11_display);
     }
 }
+
+/*
+ * Save clipboard text to restore later.
+ */
+    static void
+save_clipboard()
+{
+    if (clip_star.owned)
+       clip_star_save = get_register('*', TRUE);
+    if (clip_plus.owned)
+       clip_plus_save = get_register('+', TRUE);
+}
+
+/*
+ * Restore clipboard text if no one own the X selection.
+ */
+    static void
+restore_clipboard()
+{
+    if (clip_star_save != NULL)
+    {
+       if (!clip_gen_owner_exists(&clip_star))
+           put_register('*', clip_star_save);
+       else
+           free_register(clip_star_save);
+       clip_star_save = NULL;
+    }
+    if (clip_plus_save != NULL)
+    {
+       if (!clip_gen_owner_exists(&clip_plus))
+           put_register('+', clip_plus_save);
+       else
+           free_register(clip_plus_save);
+       clip_plus_save = NULL;
+    }
+}
 #endif
 
 /*
@@ -3844,6 +3885,7 @@ mch_call_shell(cmd, options)
        settmode(TMODE_COOK);       /* set to normal mode */
 
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+    save_clipboard();
     loose_clipboard();
 # endif
 
@@ -3916,6 +3958,9 @@ mch_call_shell(cmd, options)
        settmode(TMODE_RAW);    /* set to raw mode */
 # ifdef FEAT_TITLE
     resettitle();
+# endif
+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+    restore_clipboard();
 # endif
     return x;
 
@@ -3965,6 +4010,9 @@ mch_call_shell(cmd, options)
        settmode(TMODE_COOK);           /* set to normal mode */
 
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+    /* Disown the clipboard, because is the executed command tries to obtain a
+     * selection and we own it we get a deadlock. */
+    save_clipboard();
     loose_clipboard();
 # endif
 
@@ -4835,6 +4883,9 @@ error:
            settmode(TMODE_RAW);        /* set to raw mode */
 # ifdef FEAT_TITLE
     resettitle();
+# endif
+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+    restore_clipboard();
 # endif
     vim_free(newcmd);
 
index 56a779b49f38d734de0dbaa909307cfacae9e812..e4b21113cce7042c2c7ca9a5927254cb420bc8b4 100644 (file)
@@ -59,6 +59,7 @@ void clip_mch_request_selection __ARGS((VimClipboard *cbd));
 void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
 int clip_mch_own_selection __ARGS((VimClipboard *cbd));
 void clip_mch_set_selection __ARGS((VimClipboard *cbd));
+int clip_gtk_owner_exists __ARGS((VimClipboard *cbd));
 void gui_mch_menu_grey __ARGS((vimmenu_T *menu, int grey));
 void gui_mch_menu_hidden __ARGS((vimmenu_T *menu, int hidden));
 void gui_mch_draw_menubar __ARGS((void));
index 85fb9835d9a488de1eb2f04188900539ec461cef..a8c144ea8a73407b76c0e118ae643d3b2fb55dde 100644 (file)
@@ -15,6 +15,7 @@ void get_yank_register __ARGS((int regname, int writing));
 int may_get_selection __ARGS((int regname));
 void *get_register __ARGS((int name, int copy));
 void put_register __ARGS((int name, void *reg));
+void free_register __ARGS((void *reg));
 int yank_register_mline __ARGS((int regname));
 int do_record __ARGS((int c));
 int do_execreg __ARGS((int regname, int colon, int addcr, int silent));
index 813d496ada001568736a545a901e007f24b81f97..234e99fd7e3c38fe11d7f0ce35bdd6f302d7c37e 100644 (file)
@@ -29,6 +29,7 @@ int clip_gen_own_selection __ARGS((VimClipboard *cbd));
 void clip_gen_lose_selection __ARGS((VimClipboard *cbd));
 void clip_gen_set_selection __ARGS((VimClipboard *cbd));
 void clip_gen_request_selection __ARGS((VimClipboard *cbd));
+int clip_gen_owner_exists __ARGS((VimClipboard *cbd));
 int vim_is_input_buf_full __ARGS((void));
 int vim_is_input_buf_empty __ARGS((void));
 int vim_free_in_input_buf __ARGS((void));
@@ -52,6 +53,7 @@ void clip_x11_request_selection __ARGS((Widget myShell, Display *dpy, VimClipboa
 void clip_x11_lose_selection __ARGS((Widget myShell, VimClipboard *cbd));
 int clip_x11_own_selection __ARGS((Widget myShell, VimClipboard *cbd));
 void clip_x11_set_selection __ARGS((VimClipboard *cbd));
+int clip_x11_owner_exists __ARGS((VimClipboard *cbd));
 void yank_cut_buffer0 __ARGS((Display *dpy, VimClipboard *cbd));
 int jump_to_mouse __ARGS((int flags, int *inclusive, int which_button));
 int mouse_comp_pos __ARGS((win_T *win, int *rowp, int *colp, linenr_T *lnump));
index 4a4506efc9ec7321f06ec2d3bb786d1f7d57bd80..c83530587490dde9eb9793cbfc73dccee28225df 100644 (file)
--- a/src/ui.c
+++ b/src/ui.c
@@ -1456,6 +1456,21 @@ clip_gen_request_selection(cbd)
 #endif
 }
 
+    int
+clip_gen_owner_exists(cbd)
+    VimClipboard       *cbd;
+{
+#ifdef FEAT_XCLIPBOARD
+# ifdef FEAT_GUI_GTK
+    if (gui.in_use)
+       return clip_gtk_owner_exists(cbd);
+    else
+# endif
+       return clip_x11_owner_exists(cbd);
+#endif
+    return TRUE;
+}
+
 #endif /* FEAT_CLIPBOARD */
 
 /*****************************************************************************
@@ -2398,7 +2413,8 @@ clip_x11_lose_selection(myShell, cbd)
     Widget             myShell;
     VimClipboard       *cbd;
 {
-    XtDisownSelection(myShell, cbd->sel_atom, CurrentTime);
+    XtDisownSelection(myShell, cbd->sel_atom,
+                               XtLastTimestampProcessed(XtDisplay(myShell)));
 }
 
     int
@@ -2439,6 +2455,13 @@ clip_x11_own_selection(myShell, cbd)
 clip_x11_set_selection(cbd)
     VimClipboard *cbd UNUSED;
 {
+}
+
+    int
+clip_x11_owner_exists(cbd)
+    VimClipboard       *cbd;
+{
+    return XGetSelectionOwner(X_DISPLAY, cbd->sel_atom) != None;
 }
 #endif
 
index 504ba7f1c35ac020f5a6d960b9648de62ef2003a..90d7a4a26328bee1bf72d9ddbe6e70d554eefad9 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    856,
 /**/
     855,
 /**/