Wie funktionieren CLIPBOARD Selection und Atoms in X11/XLib?Linux

Linux verstehen
Anonymous
 Wie funktionieren CLIPBOARD Selection und Atoms in X11/XLib?

Post by Anonymous »

Ich versuche zu verstehen, wie Selektionen tatsächlich in Gnome oder KDE.
Was ich jetzt wissen möchte ist,

- Wie kopieren Anwendungen wie Firefox und andere GUI-basierte Apps Text in die X11-Zwischenablage? Wie ich weiß, verwenden sie ihren eigenen internen Puffer zum Kopieren von Text, aber übernehmen sie auch den Besitz der CLIPBOARD-Auswahl und kopieren den Text ins CLIPBOARD?

- Und wenn sie nicht den Besitz von CLIPBOARD übernehmen, wie legen sie dann kopierte Daten im X11-Zwischenablagepuffer ab? Wenn sie kopierte Daten nicht einmal in der X11-Zwischenablage ablegen, wie können dann Tools wie Xclip, die mit X11-Auswahlen arbeiten, an diese kopierten Daten gelangen? weil ich Text, den ich aus Firefox kopiert habe, auf dem Terminal mit dem Befehl „xclip -selection clipboard -o“ drucken kann.
Das Nächste, was ich wissen möchte, ist:

- Wir können Atome und Funktionen wie XConvertSelection und „XGetWindowProperty“ verwenden, um Daten aus CLIPBOARD abzurufen. Hier ist ein Beispiel dafür -

Code: Select all

Display *d = XOpenDisplay(NULL);
if (d == NULL) return 1;
Window w = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, 100, 100, 0, 0, 0);

Atom clip = XInternAtom(d, "CLIPBOARD", True);
Atom target = XInternAtom(d, "UTF8_STRING", True);
Atom prop = XInternAtom(d, "MY_PROP", True);

XConvertSelection(d, clip, str, prop, w, CurrentTime);

XEvent ev;
int quit = 0;
while (!quit) {
XNextEvent(d, &ev);
if (ev.type == SelectionNotify) {
if (ev.xselection.property) {
Atom type;
int fmt;
unsigned long nitmes, bytes_rem;
unsigned char *data;
XGetWindowProperty(d, w, prop, 0, ~0, False, AnyPropertyType,
&type, &fmt, &nitmes, &bytes_rem, &data);

printf("%s\n", data);
quit = 1;
}
}
}

XDestroyWindow(d, w);
XCloseDisplay(d);
Dadurch wird nur der zuletzt kopierte Text auf dem Terminal gedruckt. Aber ich weiß nicht, warum wir all diese Atome in Ziele und Eigenschaften umwandeln müssen.

Code: Select all

Atom clip = XInternAtom(d, "CLIPBOARD", True);
Atom target = XInternAtom(d, "slajdfas", True);
Atom prop = XInternAtom(d, "MY_PROP", True);
Sie können sehen, dass ich eine zufällige Zeichenfolge in das Zielatom geschrieben habe, aber es wird perfekt funktionieren. Selbst wenn ich eine zufällige Zeichenfolge in Prop-Atom schreibe, wird es funktionieren. Aber warum?
Es tut mir leid, dass ich dumm bin und die Dinge nicht perfekt erklärt habe. Ich hoffe, jemand korrigiert meine Grammatik.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post