2012-01-06 13 views
9

Tengo que controlar el Portapapeles X11.X11 Obtener texto del Portapapeles

Por el momento, solicito la selección de ClipBoard cada 5 segundos, luego selecciono el texto devuelto del portapapeles y lo comparo con el cálculo de hash de la última comprobación. Si el hash no es lo mismo, analizo el contenido del texto y hago algunas cosas ...

No me gusta mi método. Soy de Windows, y con el winapi, es el kernel el que notifica a tu programa cuando el portapapeles ha cambiado, ¡y es más eficiente!

Solo quiero saber si es posible que X11 pueda notificar a su programa como winapi cuando el portapapeles ha cambiado? ¿Cuál es la forma más eficiente de verificar las modificaciones del portapapeles con X11?

Respuesta

2
  1. ventana de búsqueda con selección utilizando GetSelectionOwner
  2. copia get de la selección mediante el envío de SelectionRequest (primario y el portapapeles), notifique a su aplicación
  3. reloj para SelectionClear caso
  4. ventana de actualización con selección usando id del evento SelectionClear, pase al paso 2
+0

¿Qué haces cuando el propietario de la selección está cerrado? – retroj

1

Use XFixesSelectSelectionInput() de Xfixes extensión y espere XFixesSelectionNotify evento.

Ejemplo:

// gcc -o xclipwatch xclipwatch.c -lX11 -lXfixes 
... 
#include <X11/extensions/Xfixes.h> 
... 
void WatchSelection(Display *display, Window window, const char *bufname) 
{ 
    int event_base, error_base; 
    XEvent event; 
    Atom bufid = XInternAtom(display, bufname, False); 

    assert(XFixesQueryExtension(display, &event_base, &error_base)); 
    XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid, XFixesSetSelectionOwnerNotifyMask); 

    while (True) 
    { 
    XNextEvent(display, &event); 

    if (event.type == event_base + XFixesSelectionNotify && 
     ((XFixesSelectionNotifyEvent*)&event)->selection == bufid) 
    { 
     if (!PrintSelection(display, window, bufname, "UTF8_STRING")) 
     PrintSelection(display, window, bufname, "STRING"); 

     fflush(stdout); 
    } 
    } 
} 
... 

Esto funciona tanto para bufname == "CLIPBOARD" y bufname == "PRIMARY" selección.

Ver también PrintSelection() función in this answer.

Cuestiones relacionadas