[solved] Пара нубских вопросов по Xlib

Добро пожаловать!

Moderator: Blaze

User avatar
sabir
White ninja
White ninja
Posts: 12
Joined: 14 May 2014, 19:54
Distribution: Porteus LXDE 32
Location: Russia

[solved] Пара нубских вопросов по Xlib

Post#1 by sabir » 20 May 2014, 07:43

Привет всем!
Этот вопрос было бы лучше задать в ветке "Programming", но с моим английским это несколько ..., мне и по русски то трудно сформулировать, т.к. я нуб :)
Вопрос очень простой, где храниться содержимое "Pixmap" в памяти компа или на сервере Х и все действия над "Pixmap" они прямо в памяти клиента производятся или через протокол Х11 на сервере? Уточнение XFlush(dsp) еще не было, если что.

Например:
//Я создаю pixmap
Pixmap pixmap = XCreatePixmap(dsp, win, width, height, depth);
//Затем что то там рисую
XDrawPoint(dsp, pixmap, gc, 0, y);
XDrawLine(dsp, pixmap, gc, 0, y, width-1, y);

Pixmap в это время висит на сервере или в памяти локального клиента и функции рисования идут через протокол Х11, т.е. на стороне сервера или все таки рисует сам клиент, а потом сливает уже нарисованный pixmap на сервер. Вопрос о скорости работы, если это делается в памяти локального клиента, то в чем тогда смысл XImage формата, который стопудово обрабатывается только в памяти клиента.

Ну и второй еще более нубский вопрос: в чем, в двух словах, разница между XShmCreateImage и XCreateImage, я имею ввиду не сами функции, а формат имиджа, зачем нужен XShmImage и чем он лучше XImage?

Ну и до кучи совсем простой вопрос, есть некая функция: Pixmap img_set_wallpaper(char *wallpaper), она принимает в качестве аргумента jpg, а возвращает Pixmap. Далее я делаю:

XSetWindowAttributes attr;
attr.background_pixmap = img_set_wallpaper(wallpaper);
...
XChangeWindowAttributes(dsp, root, CWEventMask|CWBackPixmap, &attr);

ну грубо говоря меняю background корневого окна, тупо смена обоев, так вопрос в том кто должен освобождать ресурс, память то выделена при создании Pixmap, т.е. мной и кто ее должен освободить XFreePixmap(dsp, pixmap); я или некие не известные силы при вызове XChangeWindowAttributes?

Или более правильно будет сделать так:

Pixmap pixmap = img_set_wallpaper(wallpaper);
XSetWindowAttributes attr;
attr.background_pixmap = pixmap;
...
XChangeWindowAttributes(dsp, root, CWEventMask|CWBackPixmap, &attr);
XFreePixmap(dsp, pixmap);
Last edited by sabir on 20 May 2014, 12:43, edited 1 time in total.

User avatar
sabir
White ninja
White ninja
Posts: 12
Joined: 14 May 2014, 19:54
Distribution: Porteus LXDE 32
Location: Russia

Re: Пара нубских вопросов по Xlib

Post#2 by sabir » 20 May 2014, 12:42

Нашел ответ сам, если кому интересно, что вряд ли форум не кодерский, то всякие XDraw... и прочие рисуются на стороне сервера, через протокол Х11, если клиент и сервер на одном компе, то через сокет (относительно быстро), а если на разных компах, то через сетевой протокол => очень медленно, поэтому если надо что то быстро нарисовать на стороне клиента, то нужно юзать XImage, т.к. он существует только в памяти клиента, но в отличие от Pixmap и Window не может быть Drawable. В общем быстро и качественно рисуем все что надо в XImage, а затем копирует в Pixmap функцией XPutImage(), а уже Pixmap юзаем как бакграунд окна. Отличие XImage от XShmImage(или как его) не знаю, да в общем то не особо хотел знать, и так все работает :)

Post Reply