LINUX.ORG.RU

Copy Paste в Иксах


0

0

Проблема в том, что не могу отследить событие выделения текста в Иксах.
Найденный пример (ниже) работает (отслеживает выделение) только в xterm и qt-приложениях. Сам работаю в Gnome и gtk-приложениях.
Требуется отслеживать выделение и содержимое выделеного фрагмента в любом окне, независимо ото всего.
Перерыл пол-инета, пока ничего не нашел. Может, кто подскажет по каким словам искать?

#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

main()
{
Display *dpy = XOpenDisplay(NULL);
assert(dpy);
Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0,
200, 100, 0, 0, 0);
XSelectInput(dpy, w, StructureNotifyMask);
XMapWindow(dpy, w);
XEvent e;
for(;;) {
XNextEvent(dpy, &e);
if (e.type == MapNotify) break;
}
XFlush(dpy);
// Copy from application
Atom a1, a2, type;
XSelectInput(dpy, w, StructureNotifyMask+ExposureMask);
int format, result;
unsigned long len, bytes_left, dummy;
unsigned char *data;
Window Sown;
for (int ii = 0; ii < 50; ii++) {
Sown = XGetSelectionOwner (dpy, XA_PRIMARY);
printf ("Selection owner%i\n", (int)Sown);
if (Sown != None) {
XConvertSelection (dpy, XA_PRIMARY, XA_STRING, None,
Sown, CurrentTime);
XFlush (dpy);
//
// Do not get any data, see how much data is there
//
XGetWindowProperty (dpy, Sown,
XA_STRING, // Tricky..
0, 0, // offset - len
0, // Delete 0==FALSE
AnyPropertyType, //flag
&type, // return type
&format, // return format
&len, &bytes_left, //that
&data);
printf ("type:%i len:%i format:%i byte_left:%i\n",
(int)type, len, format, bytes_left);
// DATA is There
if (bytes_left > 0)
{
result = XGetWindowProperty (dpy, Sown,
XA_STRING, 0,bytes_left,0,
AnyPropertyType, &type,&format,
&len, &dummy, &data);
if (result == Success)
printf ("DATA IS HERE!!```%s'''\n",
data);
else printf ("FAIL\n");
XFree (data);
}
}
sleep(2);
}
}

anonymous

Ответ на: комментарий от fghj

Посмотреть исходники всегда успею. А вот почему не работает классический код, вот это интересно.

Crew
()

Нет предела совершенству. :)
Вот это близко к желаемому.
Близко только потому, что мне очень невнятным кажутся некие атомы 228 и 81. Не нашел их текстовые описания, подобрал самостоятельно. Как будет работать не в UTF8 системах - не знаю. Может понадобится комбинировать первый и второй вариант.
В остальном - все работает.
На поиск инфы убил 2 дня. Надеюсь, другие смогут воспользоваться готовым. :)

#include <X11/Xlib.h> 
#include <X11/Xatom.h>
#include <X11/Xmu/Atoms.h>
#include <assert.h>   
#include <unistd.h>   
#include <stdio.h>
#include <stdlib.h>

main()
{
   Display *dpy = XOpenDisplay(NULL);
   assert(dpy);
   Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 
                 200, 100, 0, 0, 0);
   XSelectInput(dpy, w, StructureNotifyMask);
   XMapWindow(dpy, w);
   XEvent e;
   for(;;) {
      XNextEvent(dpy, &e);
      if (e.type == MapNotify) break;
   }
   XFlush(dpy);
   // Copy from application
   Atom a1, a2, type, target;
   target = XA_UTF8_STRING (dpy);
   XSelectInput(dpy, w, StructureNotifyMask+ExposureMask);
   int format, result;
   unsigned long len, bytes_left, dummy;
   unsigned char *data;
   Window Sown;
   int ii;
   for (ii = 0; ii < 50; ii++) {
      Sown = XGetSelectionOwner (dpy, XA_PRIMARY);
      printf ("Selection owner%i\n", (int)Sown);
      if (Sown != None) {
         XConvertSelection (dpy, XA_PRIMARY, target, None,
         w, CurrentTime);  // w == our window's ID
         XFlush (dpy);
         XNextEvent (dpy, &e);
         if (e.type == SelectionNotify)
         {
            printf ("Notified about XConvertSelection With Property %d\n", (int) e.xselection.property);
            if ((e.xselection.property == 228)||(e.xselection.property == 81))
            printf ("It is not 'None' so it is Ok\n");
         }
         //
         // Do not get any data, see how much data is there
         //
         XGetWindowProperty (dpy, w, e.xselection.property, 0, 0, 0, AnyPropertyType,
               &type, &format,   &len, &bytes_left, &data);
      
         printf ("type:%i len:%i format:%i byte_left:%i\n", 
            (int)type, len, format, bytes_left);
   
         // DATA is There
         if (bytes_left > 0)
         {
            result = XGetWindowProperty (dpy, w, e.xselection.property, 0,bytes_left,0,
               AnyPropertyType, &type,&format,  &len, &dummy, &data);
               if (result == Success)
               printf ("DATA IS HERE!!```%s'''\n", data);
            else printf ("FAIL\n");
            if (data != NULL) 
               XFree (data);
         }
      }
      sleep(2);
   }
}

Crew
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.