LINUX.ORG.RU

Сообщения serg_orl

 

Достать выделенный текст с помощью X11

С помощью https://stackoverflow.com/questions/27378318/c-get-string-from-clipboard-on-l... я создал прототип, который достаёт мне выделенный мышкой текст:

Bool PrintSelection(Display *display, Window window, const char *bufname, const char *fmtname)
{
    char *result;
    unsigned long ressize, restail;
    int resbits;
    Atom bufid  = XInternAtom(display, bufname, False),
         fmtid  = XInternAtom(display, fmtname, False),
         propid = XInternAtom(display, "XSEL_DATA", False),
         incrid = XInternAtom(display, "INCR", False);
    XEvent event;

    XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);
    do {

        XNextEvent(display, &event);

        if (event.type == SelectionNotify && event.xselection.selection == bufid)
        {
            if  (event.xselection.property) {
                XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, False, AnyPropertyType,
                  &fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);

                if (fmtid == incrid) {
                    printf("Buffer is too large and INCR reading is not implemented yet.\n");
                } else {
                    printf("%s\n", result);
                    XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);
                }

                XFree(result);
            }
        }

    } while (1);

}

Но код выше не работает по событию «выделил текст - достал актуальный текст», вместо этого в переменной result всегда лежит текст последнего выделения. То есть XNextEvent всегда ловит последнее событие «выделение», даже когда оно уже случилось. Я же хочу:

  • 1. Выделить текст
  • 2. Достать выделенный текст и сделать
    result = NULL
  • 3. Когда нет выделений, то
    result = NULL

Как это можно сделать на базе X11?

 

serg_orl
()

Узнать имя окна в фокусе (текущего окна) через X11lib

Пытаюсь узнать имя текущего окна в фокусе пользователя. Когда запускаю программу в IDE, то в консоль выводится актуальное имя текущего окна, но когда переключаюсь на любое другое окно, в котором запущена другая программа, функция XFetchName() отрабатывает со статусом ошибки:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include <X11/Xlib.h>
#include <X11/Xatom.h>
 
int main(int argc, char** argv)
{
 
    char* display_name = ":0";
    Display* display = XOpenDisplay(display_name);
 
    if (display == NULL) {
        fprintf(stderr, "Unable to open display '%s'\n", XDisplayName(display_name));
    }
 
    Window* win;
    int revert_to_return;
    char* name = NULL;
 
    while(1) {
        XGetInputFocus(display, win, &revert_to_return);
        if (XFetchName(display, *win, &name) > 0) {
            printf("%s\n", name);
        } else {
            printf("bad status\n");
        }
 
        XFree(name);
 
    }
 
    XCloseDisplay(display);
    return 0;
}


Почему так происходит? Возможно ли вообще получать имя окна в фокусе без сотен строчек кода?

P.S.: Вообще моя цель: достать текст, который выделяется двумя щелчками левой кнопки мышки, в произвольном текущем окне, где это возможно. Но я начал с освоения возможности поработать с текущим окном в фокусе.

 

serg_orl
()

RSS подписка на новые темы