home *** CD-ROM | disk | FTP | other *** search
/ Geek 6 / Geek-006.iso / linux / video / xmovie-1.5.3.tar.gz / xmovie-1.5.3.tar / xmovie-1.5.3 / guicast / bcclipboard.C < prev    next >
C/C++ Source or Header  |  2000-11-29  |  3KB  |  159 lines

  1. #include "bcclipboard.h"
  2. #include "bcwindowbase.h"
  3. #include <string.h>
  4.  
  5. BC_Clipboard::BC_Clipboard(char *display_name) : Thread()
  6. {
  7.     XSetWindowAttributes attr;
  8.     unsigned long mask;
  9.  
  10.     Thread::synchronous = 1;
  11.     display = BC_WindowBase::init_display(display_name);
  12.     completion_atom = XInternAtom(display, "BC_CLOSE_EVENT", False);
  13.     primary_atom = XInternAtom(display, "PRIMARY", False);
  14.     secondary_atom = XInternAtom(display, "SECONDARY", False);
  15.     mask = 0;
  16.     win = XCreateWindow(display, 
  17.                 RootWindow(display, DefaultScreen(display)), 
  18.                 0, 
  19.                 0, 
  20.                 10, 
  21.                 10, 
  22.                 0, 
  23.                 DefaultDepth(display, DefaultScreen(display)), 
  24.                 InputOutput, 
  25.                 DefaultVisual(display, DefaultScreen(display)), 
  26.                 mask, 
  27.                 &attr);
  28.     data[0] = 0;
  29.     data[1] = 0;
  30. }
  31.  
  32. BC_Clipboard::~BC_Clipboard()
  33. {
  34.     if(data[0]) delete [] data[0];
  35.     if(data[1]) delete [] data[1];
  36.     XDestroyWindow(display, win);
  37.     XCloseDisplay(display);
  38. }
  39.  
  40. int BC_Clipboard::start_clipboard()
  41. {
  42.     Thread::start();
  43.     return 0;
  44. }
  45.  
  46. int BC_Clipboard::stop_clipboard()
  47. {
  48.     XEvent event;
  49.     XClientMessageEvent *ptr = (XClientMessageEvent*)&event;
  50.  
  51.     event.type = ClientMessage;
  52.     ptr->message_type = completion_atom;
  53.     ptr->format = 32;
  54.     XSendEvent(display, win, 0, 0, &event);
  55.     XFlush(display);
  56.     Thread::join();
  57.     return 0;
  58. }
  59.  
  60. void BC_Clipboard::run()
  61. {
  62.     XEvent event;
  63.     XClientMessageEvent *ptr;
  64.     int done = 0;
  65.  
  66.     while(!done)
  67.     {
  68.         XNextEvent(display, &event);
  69.  
  70.         switch(event.type)
  71.         {
  72.             case ClientMessage:
  73.                 ptr = (XClientMessageEvent*)&event;
  74.                 if(ptr->message_type == completion_atom)
  75.                 {
  76.                     done = 1;
  77.                 }
  78.                 else
  79.                 if(ptr->message_type == primary_atom)
  80.                 {
  81.                 }
  82.                 else
  83.                 if(ptr->message_type == secondary_atom)
  84.                 {
  85.                 }
  86. //printf("ClientMessage %x %x %d\n", ptr->message_type, ptr->data.l[0], primary_atom);
  87.                 break;
  88.  
  89.             case SelectionRequest:
  90.                 {
  91.                     XEvent new_event;
  92.                     XClientMessageEvent *ptr1 = (XClientMessageEvent*)&new_event;
  93.                     XSelectionRequestEvent *ptr2 = (XSelectionRequestEvent*)&event;
  94.  
  95.                     new_event.type = ClientMessage;
  96.                     ptr->message_type = ptr2->target;
  97.                     ptr->format = 32;
  98.                     XSendEvent(display, ptr2->requestor, 0, 0, &new_event);
  99.                     XFlush(display);
  100.                 }
  101. //printf("SelectionRequest\n");
  102.                 break;
  103.         }
  104.     }
  105. }
  106.  
  107. long BC_Clipboard::clipboard_len(int clipboard_num)
  108. {
  109.     int result = XConvertSelection(display, 
  110.         clipboard_num == PRIMARY_SELECTION ? primary_atom : secondary_atom, 
  111.         clipboard_num == PRIMARY_SELECTION ? primary_atom : secondary_atom, 
  112.         None,
  113.            win, 
  114.         CurrentTime);
  115.  
  116.     if(!result)
  117.     {
  118.         return 0;
  119.     }
  120.     return 0;
  121. }
  122.  
  123. int BC_Clipboard::to_clipboard(char *data, long len, int clipboard_num)
  124. {
  125.     if(this->data[clipboard_num] && length[clipboard_num] != len)
  126.     {
  127.         delete [] this->data[clipboard_num];
  128.         this->data[clipboard_num] = 0;
  129.     }
  130.  
  131.     if(!this->data[clipboard_num])
  132.     {
  133.         length[clipboard_num] = len;
  134.         this->data[clipboard_num] = new char[len];
  135.         strcpy(this->data[clipboard_num], data);
  136.     }
  137.  
  138.     XSetSelectionOwner(display, 
  139.         clipboard_num == PRIMARY_SELECTION ? primary_atom : secondary_atom, 
  140.         win, 
  141.         CurrentTime);
  142.     return 0;
  143. }
  144.  
  145. int BC_Clipboard::from_clipboard(char *data, long maxlen, int clipboard_num)
  146. {
  147.     int result = XConvertSelection(display, 
  148.         clipboard_num == PRIMARY_SELECTION ? primary_atom : secondary_atom, 
  149.         clipboard_num == PRIMARY_SELECTION ? primary_atom : secondary_atom, 
  150.         None,
  151.            win, 
  152.         CurrentTime);
  153.     if(!result)
  154.     {
  155.         data[0] = 0;
  156.     }
  157.     return 0;
  158. }
  159.