LINUX.ORG.RU

[X Window] Как задать для окна цветную иконку с alpha прозрачность?


0

0

Есть функция XSetWMHints(). В неё передаётся структура XWMHints в которой есть поля:
Pixmap icon_pixmap;
Pixmap icon_mask;
Window icon_window;
Насколько я понял из man XWMHints - icon_pixmap должна быть bitmap'ом. А bitmap может быть только чёрно-белым. В том же мануале написано, что icon_mask'ом можно задать какие пиксели из icon_pixmap нужно использовать. Получается обычная не alpha прозрачность.
Поле icon_window позволяет задать окно которое будет использоватся как иконка. Не совсем понятно как это должно работать. Пробовал присваивать icon_window окно - иконкой стала стандартная иконка для X Window программ, а не то что нарисовано в окне.

Вопрос - как задать alpha-прозрачную цветную иконку для окна X Window программы?

Гуглить пробовал - ничего по теме не нашёл. Поидее иконку рисует менеджер окон. Может быть не все менеджеры могут работать с прозрачными иконками? Такое впечатление что программы на Qt и GTK используют какие-то секретные функции или способы KDE и GNOME для задания иконок окнам.

icon_pixmap - это Pixmap, а он может быть любой "глубины"(depth), 
до 32 bit. его можно создать из XImage 
(man XCreateImage, XPutImage)

code:
   XWMHints hints = XAllocWMHints(); 

   hints.flags = IconPixmapHint;
   hints.icon_pixmap = (Pixmap) pic;

   XSetWMHints(display, (Window) id, &hints);

icon_window:
   XWMHints hints = XAllocWMHints();

   hints.flags = IconWindowHint;
   hints.icon_window = (Window) win;

   XSetWMHints(display, (Window) id, &hints);

> Поидее, иконку рисует менеджер окон
да, это так

> Может быть не все менеджеры могут работать
 не все 

можно посмотреть XeviGetVisualInfo поддерживает ли сервер transparency


Valeriy_Onuchin ★★
()

Взять значение RGBx точки НА окне, взять RGBy значение точки, которую нужно поместить на окно, взять желаемую альфа (Alpha). Посчитать новое значение точки для окна по формуле:

a1 = Alpha / 255.0f;
a2 = 1.0f - a1;
Rz = a2 * Rx + a1 * Ry;
Gz = a2 * Gx + a1 * Gy;
Bz = a2 * Bx + a1 * By;

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Valeriy_Onuchin, спасибо.

Создал XImage с помощью XCreateImage. Формат ZPixmap, на один пиксель 32 бита (bitmap_pad), данные: char image_data[] = {255,0,0,0, 255,0,0,63, 255,0,0,127, 255,0,0,255};

Создал Pixmap с помощью XCreatePixmap. "Положил" на него картинку с помощью XPutImage. Присвоил этот Pixmap полю icon_pixmap структуры XWMHints.

Получил синюю иконку. Таким образом цветную иконку можно создать, это радует.

Но каждый четвёртый байт в image_data игнорируется. Как сделать так чтобы он отвечал за прозрачность?

andreyu, спасибо за идею, но то что ты предлагаешь будет работать когда картинка рисуется в окне. А нужно сделать иконку с alpha-прозрачностью. Иконку рисует менеджер окон. Как ему сказать чтоб он четвёртый байт использовал как alpha-канал?

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

Нашёл такое решение, хотя оно не идеальное:

Менеджер окон чаще всего использует иконки размером 16x16 пикселей. Поэтому надо ему подсунуть иконку большего размера, например 64x64 и маску icon_pixmap (в которой можно задавать не alpha-прозрачность) тоже размером 64x64. Менеджер окон их уменьшает до 16x16 и сам добавляет alpha-прозрачность.

Хотя это и работает, хотелось бы найти труЪ способ. Может всё-таки кто-нибуть знает как задать для окна иконку с alpha-прозрачностьЮ?

LinuxUser ★★★
() автор топика
Ответ на: комментарий от Valeriy_Onuchin

Valeriy_Onuchin, спасибо ещё раз :)

Хоть тут http://www.linux.org.ru/wiki/en/NETWM подробно не написано
про то как задать иконку, разобраться удалось.
Вот простой пример как задать иконку размером 2x2:

unsigned long icon_data[] =
{
	2, 2,
	0x80000000, 0xffff0000,
	0xff00ff00, 0xff0000ff
};
Atom a_net_wm_icon = XInternAtom(display, "_NET_WM_ICON", False);
Atom a_cardinal = XInternAtom(display, "CARDINAL", False);
XChangeProperty
(
	display,
	window,
	a_net_wm_icon,
	a_cardinal,
	32,
	PropModeReplace,
	(unsigned char *)icon_data,
	sizeof(icon_data)/sizeof(unsigned long)
);

LinuxUser ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.