|
1 To: [email protected] |
|
2 Subject: Patch 7.2.017 |
|
3 Fcc: outbox |
|
4 From: Bram Moolenaar <[email protected]> |
|
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 -- [email protected] -- 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 /// |