/[rdesktop]/sourceforge.net/trunk/rdesktop/xclip.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/xclip.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 435 by astrand, Wed Jul 9 09:18:20 2003 UTC revision 465 by astrand, Fri Sep 5 08:41:21 2003 UTC
# Line 25  Line 25 
25    
26  #define NUM_TARGETS 6  #define NUM_TARGETS 6
27    
28  extern Display *display;  extern Display *g_display;
29  extern Window wnd;  extern Window g_wnd;
30  extern Time last_gesturetime;  extern Time g_last_gesturetime;
31    
32  static Atom clipboard_atom, primary_atom, targets_atom, timestamp_atom;  static Atom clipboard_atom, primary_atom, targets_atom, timestamp_atom;
33  static Atom rdesktop_clipboard_target_atom, rdesktop_clipboard_formats_atom, incr_atom;  static Atom rdesktop_clipboard_target_atom, rdesktop_clipboard_formats_atom, incr_atom;
# Line 42  xclip_provide_selection(XSelectionReques Line 42  xclip_provide_selection(XSelectionReques
42  {  {
43          XEvent xev;          XEvent xev;
44    
45          XChangeProperty(display, req->requestor, req->property,          XChangeProperty(g_display, req->requestor, req->property,
46                          type, format, PropModeReplace, data, length);                          type, format, PropModeReplace, data, length);
47    
48          xev.xselection.type = SelectionNotify;          xev.xselection.type = SelectionNotify;
# Line 53  xclip_provide_selection(XSelectionReques Line 53  xclip_provide_selection(XSelectionReques
53          xev.xselection.target = req->target;          xev.xselection.target = req->target;
54          xev.xselection.property = req->property;          xev.xselection.property = req->property;
55          xev.xselection.time = req->time;          xev.xselection.time = req->time;
56          XSendEvent(display, req->requestor, False, NoEventMask, &xev);          XSendEvent(g_display, req->requestor, False, NoEventMask, &xev);
57  }  }
58    
59  void  void
# Line 69  xclip_handle_SelectionNotify(XSelectionE Line 69  xclip_handle_SelectionNotify(XSelectionE
69                  goto fail;                  goto fail;
70    
71          DEBUG_CLIPBOARD(("xclip_handle_SelectionNotify: selection=%s, target=%s, property=%s\n",          DEBUG_CLIPBOARD(("xclip_handle_SelectionNotify: selection=%s, target=%s, property=%s\n",
72                           XGetAtomName(display, event->selection),                           XGetAtomName(g_display, event->selection),
73                           XGetAtomName(display, event->target),                           XGetAtomName(g_display, event->target),
74                           XGetAtomName(display, event->property)));                           XGetAtomName(g_display, event->property)));
75    
76          if (event->property == None)          if (event->property == None)
77                  goto fail;                  goto fail;
78    
79          res = XGetWindowProperty(display, wnd, rdesktop_clipboard_target_atom,          res = XGetWindowProperty(g_display, g_wnd, rdesktop_clipboard_target_atom,
80                                   0, XMaxRequestSize(display), True, AnyPropertyType,                                   0, XMaxRequestSize(g_display), True, AnyPropertyType,
81                                   &type, &format, &nitems, &bytes_left, &data);                                   &type, &format, &nitems, &bytes_left, &data);
82    
83          if (res != Success)          if (res != Success)
# Line 93  xclip_handle_SelectionNotify(XSelectionE Line 93  xclip_handle_SelectionNotify(XSelectionE
93                  if (type != None)                  if (type != None)
94                  {                  {
95                          supported_targets = (Atom *) data;                          supported_targets = (Atom *) data;
96                          text_target = XInternAtom(display, "TEXT", False);                          text_target = XInternAtom(g_display, "TEXT", False);
97                          for (i = 0; i < nitems; i++)                          for (i = 0; i < nitems; i++)
98                          {                          {
99                                  DEBUG_CLIPBOARD(("Target %d: %s\n", i,                                  DEBUG_CLIPBOARD(("Target %d: %s\n", i,
100                                                   XGetAtomName(display, supported_targets[i])));                                                   XGetAtomName(g_display, supported_targets[i])));
101                                  if (supported_targets[i] == text_target)                                  if (supported_targets[i] == text_target)
102                                  {                                  {
103                                          DEBUG_CLIPBOARD(("Other party supports TEXT, choosing that as best_target\n"));                                          DEBUG_CLIPBOARD(("Other party supports TEXT, choosing that as best_target\n"));
# Line 107  xclip_handle_SelectionNotify(XSelectionE Line 107  xclip_handle_SelectionNotify(XSelectionE
107                          XFree(data);                          XFree(data);
108                  }                  }
109    
110                  XConvertSelection(display, primary_atom, best_target,                  XConvertSelection(g_display, primary_atom, best_target,
111                                    rdesktop_clipboard_target_atom, wnd, event->time);                                    rdesktop_clipboard_target_atom, g_wnd, event->time);
112                  return;                  return;
113          }          }
114    
# Line 133  void Line 133  void
133  xclip_handle_SelectionRequest(XSelectionRequestEvent * event)  xclip_handle_SelectionRequest(XSelectionRequestEvent * event)
134  {  {
135          unsigned long nitems, bytes_left;          unsigned long nitems, bytes_left;
136            unsigned char *prop_return;
137          uint32 *wanted_format;          uint32 *wanted_format;
138          int format, res;          int format, res;
139          Atom type;          Atom type;
140    
141          DEBUG_CLIPBOARD(("xclip_handle_SelectionRequest: selection=%s, target=%s, property=%s\n",          DEBUG_CLIPBOARD(("xclip_handle_SelectionRequest: selection=%s, target=%s, property=%s\n",
142                           XGetAtomName(display, event->selection),                           XGetAtomName(g_display, event->selection),
143                           XGetAtomName(display, event->target),                           XGetAtomName(g_display, event->target),
144                           XGetAtomName(display, event->property)));                           XGetAtomName(g_display, event->property)));
145    
146          if (event->target == targets_atom)          if (event->target == targets_atom)
147          {          {
# Line 149  xclip_handle_SelectionRequest(XSelection Line 150  xclip_handle_SelectionRequest(XSelection
150          }          }
151          else if (event->target == timestamp_atom)          else if (event->target == timestamp_atom)
152          {          {
153                  xclip_provide_selection(event, XA_INTEGER, 32, (uint8 *) & last_gesturetime, 1);                  xclip_provide_selection(event, XA_INTEGER, 32, (uint8 *) & g_last_gesturetime, 1);
154                  return;                  return;
155          }          }
156          else if (event->target == rdesktop_clipboard_formats_atom)          else if (event->target == rdesktop_clipboard_formats_atom)
157          {          {
158                  res = XGetWindowProperty(display, event->requestor,                  res = XGetWindowProperty(g_display, event->requestor,
159                                           rdesktop_clipboard_target_atom, 0, 1, True, XA_INTEGER,                                           rdesktop_clipboard_target_atom, 0, 1, True, XA_INTEGER,
160                                           &type, &format, &nitems, &bytes_left,                                           &type, &format, &nitems, &bytes_left,
161                                           (unsigned char **) &wanted_format);                                           &prop_return);
162                    wanted_format = (uint32 *) prop_return;
163                  format = (res == Success) ? *wanted_format : CF_TEXT;                  format = (res == Success) ? *wanted_format : CF_TEXT;
164                    /* FIXME: Need to free returned data? */
165          }          }
166          else          else
167          {          {
# Line 175  xclip_handle_SelectionClear(void) Line 178  xclip_handle_SelectionClear(void)
178  {  {
179          DEBUG_CLIPBOARD(("xclip_handle_SelectionClear\n"));          DEBUG_CLIPBOARD(("xclip_handle_SelectionClear\n"));
180          have_primary = 0;          have_primary = 0;
181          XDeleteProperty(display, DefaultRootWindow(display), rdesktop_clipboard_formats_atom);          XDeleteProperty(g_display, DefaultRootWindow(g_display), rdesktop_clipboard_formats_atom);
182          cliprdr_send_text_format_announce();          cliprdr_send_text_format_announce();
183  }  }
184    
# Line 195  xclip_handle_PropertyNotify(XPropertyEve Line 198  xclip_handle_PropertyNotify(XPropertyEve
198    
199          if (event->state == PropertyNewValue)          if (event->state == PropertyNewValue)
200          {          {
201                  res = XGetWindowProperty(display, DefaultRootWindow(display),                  res = XGetWindowProperty(g_display, DefaultRootWindow(g_display),
202                                           rdesktop_clipboard_formats_atom, 0,                                           rdesktop_clipboard_formats_atom, 0,
203                                           XMaxRequestSize(display), False, XA_STRING, &type, &format,                                           XMaxRequestSize(g_display), False, XA_STRING, &type,
204                                           &nitems, &bytes_left, &data);                                           &format, &nitems, &bytes_left, &data);
205    
206                  if ((res == Success) && (nitems > 0))                  if ((res == Success) && (nitems > 0))
207                  {                  {
# Line 217  xclip_handle_PropertyNotify(XPropertyEve Line 220  xclip_handle_PropertyNotify(XPropertyEve
220  void  void
221  ui_clip_format_announce(char *data, uint32 length)  ui_clip_format_announce(char *data, uint32 length)
222  {  {
223          XSetSelectionOwner(display, primary_atom, wnd, last_gesturetime);          XSetSelectionOwner(g_display, primary_atom, g_wnd, g_last_gesturetime);
224          if (XGetSelectionOwner(display, primary_atom) != wnd)          if (XGetSelectionOwner(g_display, primary_atom) != g_wnd)
225          {          {
226                  warning("Failed to aquire ownership of PRIMARY clipboard\n");                  warning("Failed to aquire ownership of PRIMARY clipboard\n");
227                  return;                  return;
228          }          }
229    
230          have_primary = 1;          have_primary = 1;
231          XChangeProperty(display, DefaultRootWindow(display),          XChangeProperty(g_display, DefaultRootWindow(g_display),
232                          rdesktop_clipboard_formats_atom, XA_STRING, 8, PropModeReplace, data,                          rdesktop_clipboard_formats_atom, XA_STRING, 8, PropModeReplace, data,
233                          length);                          length);
234    
235          XSetSelectionOwner(display, clipboard_atom, wnd, last_gesturetime);          XSetSelectionOwner(g_display, clipboard_atom, g_wnd, g_last_gesturetime);
236          if (XGetSelectionOwner(display, clipboard_atom) != wnd)          if (XGetSelectionOwner(g_display, clipboard_atom) != g_wnd)
237                  warning("Failed to aquire ownership of CLIPBOARD clipboard\n");                  warning("Failed to aquire ownership of CLIPBOARD clipboard\n");
238  }  }
239    
# Line 250  ui_clip_request_data(uint32 format) Line 253  ui_clip_request_data(uint32 format)
253    
254          if (rdesktop_is_selection_owner)          if (rdesktop_is_selection_owner)
255          {          {
256                  XChangeProperty(display, wnd, rdesktop_clipboard_target_atom,                  XChangeProperty(g_display, g_wnd, rdesktop_clipboard_target_atom,
257                                  XA_INTEGER, 32, PropModeReplace, (unsigned char *) &format, 1);                                  XA_INTEGER, 32, PropModeReplace, (unsigned char *) &format, 1);
258    
259                  XConvertSelection(display, primary_atom, rdesktop_clipboard_formats_atom,                  XConvertSelection(g_display, primary_atom, rdesktop_clipboard_formats_atom,
260                                    rdesktop_clipboard_target_atom, wnd, CurrentTime);                                    rdesktop_clipboard_target_atom, g_wnd, CurrentTime);
261                  return;                  return;
262          }          }
263    
264          selectionowner = XGetSelectionOwner(display, primary_atom);          selectionowner = XGetSelectionOwner(g_display, primary_atom);
265          if (selectionowner != None)          if (selectionowner != None)
266          {          {
267                  XConvertSelection(display, primary_atom, targets_atom,                  XConvertSelection(g_display, primary_atom, targets_atom,
268                                    rdesktop_clipboard_target_atom, wnd, CurrentTime);                                    rdesktop_clipboard_target_atom, g_wnd, CurrentTime);
269                  return;                  return;
270          }          }
271    
272          /* No PRIMARY, try CLIPBOARD */          /* No PRIMARY, try CLIPBOARD */
273          selectionowner = XGetSelectionOwner(display, clipboard_atom);          selectionowner = XGetSelectionOwner(g_display, clipboard_atom);
274          if (selectionowner != None)          if (selectionowner != None)
275          {          {
276                  XConvertSelection(display, clipboard_atom, targets_atom,                  XConvertSelection(g_display, clipboard_atom, targets_atom,
277                                    rdesktop_clipboard_target_atom, wnd, CurrentTime);                                    rdesktop_clipboard_target_atom, g_wnd, CurrentTime);
278                  return;                  return;
279          }          }
280    
# Line 292  xclip_init(void) Line 295  xclip_init(void)
295          if (!cliprdr_init())          if (!cliprdr_init())
296                  return;                  return;
297    
298          primary_atom = XInternAtom(display, "PRIMARY", False);          primary_atom = XInternAtom(g_display, "PRIMARY", False);
299          clipboard_atom = XInternAtom(display, "CLIPBOARD", False);          clipboard_atom = XInternAtom(g_display, "CLIPBOARD", False);
300          targets_atom = XInternAtom(display, "TARGETS", False);          targets_atom = XInternAtom(g_display, "TARGETS", False);
301          timestamp_atom = XInternAtom(display, "TIMESTAMP", False);          timestamp_atom = XInternAtom(g_display, "TIMESTAMP", False);
302          rdesktop_clipboard_target_atom = XInternAtom(display, "_RDESKTOP_CLIPBOARD_TARGET", False);          rdesktop_clipboard_target_atom =
303          incr_atom = XInternAtom(display, "INCR", False);                  XInternAtom(g_display, "_RDESKTOP_CLIPBOARD_TARGET", False);
304            incr_atom = XInternAtom(g_display, "INCR", False);
305          targets[0] = targets_atom;          targets[0] = targets_atom;
306          targets[1] = XInternAtom(display, "TEXT", False);          targets[1] = XInternAtom(g_display, "TEXT", False);
307          targets[2] = XInternAtom(display, "UTF8_STRING", False);          targets[2] = XInternAtom(g_display, "UTF8_STRING", False);
308          targets[3] = XInternAtom(display, "text/unicode", False);          targets[3] = XInternAtom(g_display, "text/unicode", False);
309          targets[4] = XInternAtom(display, "TIMESTAMP", False);          targets[4] = XInternAtom(g_display, "TIMESTAMP", False);
310          targets[5] = XA_STRING;          targets[5] = XA_STRING;
311    
312          /* rdesktop sets _RDESKTOP_CLIPBOARD_FORMATS on the root window when acquiring the clipboard.          /* rdesktop sets _RDESKTOP_CLIPBOARD_FORMATS on the root window when acquiring the clipboard.
313             Other interested rdesktops can use this to notify their server of the available formats. */             Other interested rdesktops can use this to notify their server of the available formats. */
314          rdesktop_clipboard_formats_atom =          rdesktop_clipboard_formats_atom =
315                  XInternAtom(display, "_RDESKTOP_CLIPBOARD_FORMATS", False);                  XInternAtom(g_display, "_RDESKTOP_CLIPBOARD_FORMATS", False);
316          XSelectInput(display, DefaultRootWindow(display), PropertyChangeMask);          XSelectInput(g_display, DefaultRootWindow(g_display), PropertyChangeMask);
317  }  }

Legend:
Removed from v.435  
changed lines
  Added in v.465

  ViewVC Help
Powered by ViewVC 1.1.26