]> git.pld-linux.org Git - packages/vim.git/blob - 7.2.017
- new
[packages/vim.git] / 7.2.017
1 To: vim-dev@vim.org
2 Subject: Patch 7.2.017
3 Fcc: outbox
4 From: Bram Moolenaar <Bram@moolenaar.net>
5 Mime-Version: 1.0
6 Content-Type: text/plain; charset=ISO-8859-1
7 Content-Transfer-Encoding: 8bit
8 ------------
9
10 Patch 7.2.017
11 Problem:    strlen() used on text that may not end in a NUL. (Dominique Pelle)
12             Pasting a very big selection doesn't work.
13 Solution:   Use the length passed to the XtSelectionCallbackProc() function.
14             After getting the SelectionNotify event continue dispatching
15             events until the callback is actually called.  Also dispatch the
16             PropertyNotify event.
17 Files:      src/ui.c
18
19
20 *** ../vim-7.2.016/src/ui.c     Sun Sep  7 21:47:51 2008
21 --- src/ui.c    Sun Sep 14 15:52:19 2008
22 ***************
23 *** 2020,2026 ****
24   
25       if (value == NULL || *length == 0)
26       {
27 !       clip_free_selection(cbd);       /* ???  [what's the query?] */
28         *(int *)success = FALSE;
29         return;
30       }
31 --- 2020,2026 ----
32   
33       if (value == NULL || *length == 0)
34       {
35 !       clip_free_selection(cbd);       /* nothing received, clear register */
36         *(int *)success = FALSE;
37         return;
38       }
39 ***************
40 *** 2076,2082 ****
41         text_prop.value = (unsigned char *)value;
42         text_prop.encoding = *type;
43         text_prop.format = *format;
44 !       text_prop.nitems = STRLEN(value);
45         status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
46                                                          &text_list, &n_text);
47         if (status != Success || n_text < 1)
48 --- 2076,2082 ----
49         text_prop.value = (unsigned char *)value;
50         text_prop.encoding = *type;
51         text_prop.format = *format;
52 !       text_prop.nitems = len;
53         status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
54                                                          &text_list, &n_text);
55         if (status != Success || n_text < 1)
56 ***************
57 *** 2131,2137 ****
58             case 3:  type = text_atom;          break;
59             default: type = XA_STRING;
60         }
61 !       success = FALSE;
62         XtGetSelectionValue(myShell, cbd->sel_atom, type,
63             clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
64   
65 --- 2131,2137 ----
66             case 3:  type = text_atom;          break;
67             default: type = XA_STRING;
68         }
69 !       success = MAYBE;
70         XtGetSelectionValue(myShell, cbd->sel_atom, type,
71             clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
72   
73 ***************
74 *** 2145,2169 ****
75          * paste!  Don't worry, we will catch up with any other events later.
76          */
77         start_time = time(NULL);
78 !       for (;;)
79         {
80 !           if (XCheckTypedEvent(dpy, SelectionNotify, &event))
81             {
82 !               /* this is where clip_x11_request_selection_cb() is actually
83 !                * called */
84                 XtDispatchEvent(&event);
85 !               break;
86             }
87 -           if (XCheckTypedEvent(dpy, SelectionRequest, &event))
88 -               /* We may get a SelectionRequest here and if we don't handle
89 -                * it we hang.  KDE klipper does this, for example. */
90 -               XtDispatchEvent(&event);
91   
92             /* Time out after 2 to 3 seconds to avoid that we hang when the
93              * other process doesn't respond.  Note that the SelectionNotify
94              * event may still come later when the selection owner comes back
95 !            * to life and the text gets inserted unexpectedly (by xterm).
96 !            * Don't know how to avoid that :-(. */
97             if (time(NULL) > start_time + 2)
98             {
99                 timed_out = TRUE;
100 --- 2145,2171 ----
101          * paste!  Don't worry, we will catch up with any other events later.
102          */
103         start_time = time(NULL);
104 !       while (success == MAYBE)
105         {
106 !           if (XCheckTypedEvent(dpy, SelectionNotify, &event)
107 !                   || XCheckTypedEvent(dpy, SelectionRequest, &event)
108 !                   || XCheckTypedEvent(dpy, PropertyNotify, &event))
109             {
110 !               /* This is where clip_x11_request_selection_cb() should be
111 !                * called.  It may actually happen a bit later, so we loop
112 !                * until "success" changes.
113 !                * We may get a SelectionRequest here and if we don't handle
114 !                * it we hang.  KDE klipper does this, for example.
115 !                * We need to handle a PropertyNotify for large selections. */
116                 XtDispatchEvent(&event);
117 !               continue;
118             }
119   
120             /* Time out after 2 to 3 seconds to avoid that we hang when the
121              * other process doesn't respond.  Note that the SelectionNotify
122              * event may still come later when the selection owner comes back
123 !            * to life and the text gets inserted unexpectedly.  Don't know
124 !            * why that happens or how to avoid that :-(. */
125             if (time(NULL) > start_time + 2)
126             {
127                 timed_out = TRUE;
128 ***************
129 *** 2177,2183 ****
130             ui_delay(1L, TRUE);
131         }
132   
133 !       if (success)
134             return;
135   
136         /* don't do a retry with another type after timing out, otherwise we
137 --- 2179,2185 ----
138             ui_delay(1L, TRUE);
139         }
140   
141 !       if (success == TRUE)
142             return;
143   
144         /* don't do a retry with another type after timing out, otherwise we
145 *** ../vim-7.2.016/src/version.c        Sun Sep 14 14:41:44 2008
146 --- src/version.c       Sun Sep 14 15:55:34 2008
147 ***************
148 *** 678,679 ****
149 --- 678,681 ----
150   {   /* Add new patch number below this line */
151 + /**/
152 +     17,
153   /**/
154
155 -- 
156 hundred-and-one symptoms of being an internet addict:
157 54. You start tilting your head sideways to smile. :-)
158
159  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
160 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
161 \\\        download, build and distribute -- http://www.A-A-P.org        ///
162  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
This page took 0.050678 seconds and 3 git commands to generate.