LINUX.ORG.RU

Сообщения Alexey104

 

XLib - не могу отправить клиенту список selection TARGETS

Всех с Новым Годом!

У меня тут возникли некоторые трудности с использованием библиотеки XLib в Linux:
Есть С++ программа, содержащая строку с UTF8 текстом. Я хочу посредством XLib объявить эту программу как selection owner, чтобы все selection реквесты от клиентов поступали в программу. Программа должна предоставить клиентам текст из строки в ответ на selection request. Некоторые клиенты, отправляя selection request, сначала запрашивают у владельца лист атомов, описывающих типы данных, которые владелец может предоставить(selection TARGETS), и, если находят в этом списке интересующий их тип данных(строка, картинка…), запрашивают у владельца данные этого типа. Программа должна при запросе клиента предоставить ему список торгетов, состоящий из единственного атома «UTF8_STRING», и, если клиент пожелает запросить данные типа «UTF8_STRING», нужно ему эти данные любезно предоставить. Если вкратце, то что-то типа этого:

#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
 
int selectionRequested(Display*, XEvent* event, XPointer arg)
{
    return event->type == SelectionRequest;
}
 
int main()
{
    // ...
    Display* display = XOpenDisplay(NULL);
    int screen = XDefaultScreen(display);
    Window rootWindow = XRootWindow(display, screen);
    Atom selection = XInternAtom(display, "CLIPBOARD", false);
    Atom selectionType = XInternAtom(display, "UTF8_STRING", false);
    Atom targets = XInternAtom(display, "TARGETS", false);
    Window owner = XCreateSimpleWindow(display, rootWindow,
            -10, -10, 1, 1, 0, 0, 0);
    XSetSelectionOwner(display, selection, owner, CurrentTime);
    XEvent event;
    while (true)
    {
        XIfEvent(display, &event, selectionRequested, NULL);
        XEvent selectionResponse;
        selectionResponse.type = SelectionNotify;
        selectionResponse.xselection.send_event = true;
        selectionResponse.xselection.requestor =
            event.xselectionrequest.requestor;
        selectionResponse.xselection.property =
            event.xselectionrequest.property;
        selectionResponse.xselection.display =
            event.xselectionrequest.display;
        selectionResponse.xselection.selection =
            event.xselectionrequest.selection;
        selectionResponse.xselection.target =
            event.xselectionrequest.target;
        selectionResponse.xselection.time =
            event.xselectionrequest.time;
        Atom targetRequsted = event.xselectionrequest.target;
        std::cout << "REQUESTED TARGET \"" <<
            XGetAtomName(display, targetRequsted) << "\"" << '\n';
        if (targetRequsted == targets)
        {
            XChangeProperty(selectionResponse.xselection.display,
                    selectionResponse.xselection.requestor,
                    selectionResponse.xselection.property,
                    XA_ATOM, 32, PropModeReplace,
                    reinterpret_cast<unsigned char*>(&selectionType), 1);
            XSendEvent(selectionResponse.xselection.display,
                    selectionResponse.xselection.requestor, 0,
                    0, &selectionResponse);
        }
        else if (targetRequsted == selectionType)
        {
            // Code for sending data to the requestor...
        }
        else
        {
            // ...
        }
    }
    return 0;
}

Здесь я, судя по всему, как-то некорректно использую XChangeProperty() в условном блоке if (targetRequested == targets), поскольку при попытке вставить строку в окно клиента, клиент продолжает многократно запрашивать selection targets после того, как я ему отвечаю, и, не добившись ответа, запрашивает типы, которые я не объявлял. Например, вот что я вижу, когда пытаюсь вставить текст в Firefox:

REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "TARGETS"
REQUESTED TARGET "text/plain;charset=utf-8"
REQUESTED TARGET "text/plain;charset=utf-8"
REQUESTED TARGET "text/x-moz-text-internal"

Клиенты по какой-то причине не воспринимают атом, который я им отправляю в ответ на запрос торгетов, и, соответственно, не видят тип «UTF8_STRING», который я им предоставляю. Если же клиент не запрашивает сначала тип «TARGETS», а сразу запрашивает тип «UTF8_STRING», то дальнейший код(я его здесь опустил) работает прекрасно, и строка из программы успешно вставляется в окно клиента.

Я, если честно, только начал разбираться с XLib. Читал вот это - там всё, вроде бы, и расписано, но совсем нет даже элементарных примеров использования, одна сухая теория.

Может кто опытный подсказать, что я делаю не так?

 , , ,

Alexey104
()

Не работает сглаживание окон в compiz 0.9(manjaro)

Здрасьте!

Я на линухе не так давно, опыта ещё маловато, поэтому нужна помощь. В общем, сидел я около года на минт-кде, но под конец нервы сдали, ибо долбаная плазма падает по 20 раз в день от малейшего прикосновения к ней. Закрытие окна, вызов контекстного меню, добавление апплета и ковыряние в панели задач, - все эти незначительные действия способны уронить плазму. Несколько раз даже пустой рабочий стол умудрялся падать, пока я отходил заварить кофейку. Решил я соскочить с кде на xfce, наткнулся в сети на манжаро, поставил. Дистр великолепный, уже 2 недели его ковыряю, за это время ещё ни разу ничего не упало и не заглючило, а с помощью компиза удалось вытянуть функционал xfce до уровня кде и красивостей добавить. Но есть некоторые проблемы с компизом:

1) Никак не могу задействовать сглаживание для рамок окон со включенным эффектом «Wobbly Windows». Видео - Gigabyte gtx770 4Gb. Драйвер пробовал как открытый(nouveau), так и проприетарный(349.16). Проприетарный драйвер настраивал по этой интрукции - https://wiki.manjaro.org/index.php?title=Configure_NVIDIA_(non-free)_settings... В Nvidia X Server Settings во вкладке Antialiasing Settings сглаживание включено, и активирована опция «Override application settings» - эффект нулевой. При этом VSync работает отлично.

2)Возможно, вторая проблема вытекает из первой, но я не уверен. Суть в том, что при перемещении окна с активированным эффектом «Wobbly Windows» между заголовком окна и самим окном возникает разрыв в виде ступенчатой белой полоски(см. скрин - http://s017.radikal.ru/i432/1506/d3/7f88d0e7f7b7.png). Пробовал использовать Emerald вместо GTK Decorator - ситуация аналогичная.

Есть ли способ если не сгладить окна полностью, то хотя бы убрать разрыв между окном и заголовком?

Спасибо!

 , ,

Alexey104
()

Просмотр изображений с цифровой камеры

Здравствуйте!

У меня минт 17 кде. При открытии изображений с камеры любой программой (GwenView, Okular и т.д.) изображение сначала куда-то копируется (появляется уведомление о копировании изображения в системном лотке), а только потом открывается. Это вымораживает, когда нужно пролистать кучу фоток с камеры, а каждая из них грузится по 5 сек. Изображения с жёсткого диска открываются и листаются моментально. Может кто-нибудь объяснить, куда копируются фотки с камеры и можно ли это копирование отключить?

Alexey104
()

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