Ну, кстати, в пакете xcursor-themes (в Debian) если установить тему whiteglass, то курсор будет полупрозрачным.
XCF-изображение (X11 cursor) отображается с прозрачностью без композитора.
Я полагаю, что механизм тот же самый (псевдопрозрачность). Так как курсор - самая верхняя картинка, то просто фотографируется экран в этом месте и накладывается курсор в пределах выделенной для него области. Поэтому и работает.
Может можно как-то выводить XCF в месте клика с задержкой в пару секунд?
Посмотри xcursorgen. Это в стандартных утилитах идет к иксам. Там можно из серии картинок png сделать анимированный курсор. Но я не смотрел, можно ли сделать, как ты хочешь. Вроде как нет. Там можно только задать интервал между кадрами. Надо подумать: можно отследить событие и что-то сотворить по нему (по сути - сменить курсор на анимированный с кружком только).
Можно сделать как еще. Не курсор мучить, а создать по клику окно поверх всех (я думаю, что курсоры с кружочками так и делают), сфотографировать картинку под ним, делать анимацию. Так примерно работает aosd-cat (посмотри). Он поддерживает прозрачность верхнего текста и исчезновение текста.
Я сейчас глянул его исходник - он тоже фотографирует область под собой.
Pixmap
take_snapshot(Aosd* aosd)
{
Display* dsp = aosd->display;
Window root_win = aosd->root_win, win = aosd->win;
int width = aosd->width, height = aosd->height;
int scr = aosd->screen_num;
Pixmap pixmap;
GC gc;
/* create a pixmap to hold the screenshot */
pixmap = XCreatePixmap(dsp, win, width, height, DefaultDepth(dsp, scr));
/* then copy the screen into the pixmap */
gc = XCreateGC(dsp, pixmap, 0, NULL);
XSetSubwindowMode(dsp, gc, IncludeInferiors);
XCopyArea(dsp, root_win, pixmap, gc, aosd->x, aosd->y, width, height, 0, 0);
XSetSubwindowMode(dsp, gc, ClipByChildren);
XFreeGC(dsp, gc);
return pixmap;
}
Нашел какое-то key-mon. Посмотри, что он умеет. У меня только кружок показывает красный. opacity там есть вроде, но я вот к моменту, как пишу, не увидел прозрачности. Да и как-то с артефактами он в среде без композитинга работает, кажется.
В принципе, можно ведь не полупрозрачный круг показывать, а вместо этого показать «кольцо». В Unicode есть несколько подобных символов и если можно показать текст без фона то это бы тоже сгодилось.
Ну вот key-mon показывает кольцо как раз. Но насколько я понял, они через питон дергают xlib и делают фигурное окно, то есть вырезанное по кольцу (расширение X Shape Extension). Полупрозрачность не умеет, соответственно, но это не означает, что это нельзя сделать.
А вот aosd_cat умеет, буквы полупрозрачные рисует поверх окон. Но там видно, что скриншот под надписями он делает один раз в начале. Если успеть сдвинуть окно, пока горит надпись, то можно увидеть под ней старый фон, который был на этом месте. Ну, собственно, чудес тут ожидать не надо. Можно, конечно, в цикле снимок делать, но это загрузка процессора может быть, артефакты все равно будут видны, но если картинку не дергать, то будет ок. Хотя... надо подумать, не поможет ли тут X Damage Extension (не факт).
UPD: Да, а курсор рисует свою полупрозрачность на X-сервере, поэтому там не видно артефактов.
Как бы если тебе решение выше не подходит, а оно, ИМХО, достаточно простое в использовании, то я тебя не понял, и слушать тебе меня не надо. К этому решению, собственно, мне добавить нечего.
то есть вырезанное по кольцу (расширение X Shape Extension).
А, нет, Shape Extension они используют для окна с модификаторами (Ctrl, Alt,...) отображать (опция --backgroundless). А кольцо просто на прозрачном окне рисуется
В иксах же можно иметь два курсора мыши. Вот добавить второй от виртуальной мыши, выставить ему свою картинку и показывать/скрывать. Прозрачность кусора иксы умеют сами.
Это ни то ни другое. Это единственно возможный вариант. Если нарисуешь на каком-то другом фоне, то на экране будет просто цветной квадрат с кольцом. :)
Как это использовать для реализации сабжа?
Если чуть дописать, то можно, как и выше обсуждалось, сделать псевдопрозрачностью. Вместо того чтобы просто показывать кружок, создаем Pixmap и GC на X-сервере, делаем XCopyArea прямоугольной области, где будем рисовать окно с кружком в этот Pixmap (фотографируем). Дальше при помощи X Render Extension делаем композитинг скриншота и изображения круга, чтобы была полупрозрачность, далее копируем полученное изображение в окно как его фон, например, ждем секунду-две и убираем все. Отдельная проблема - сглаженный кружок - его придется на трапезоиды разрезать и ими рисовать или, что будет проще, использовать для рисования cairo, а не X Render напрямую. На самом деле, тут совсем мало писанины. Если с cairo, то вообще быстро. Если сойдет пока несглаженный круг, то можно прямо xlib круг нарисовать вообще одной командой и не связываться с трапезоидами и cairo. Я это оцениваю ну максимум в 20 строк.
Да можно вообще их кружок оставить, а только фотографирование и композитинг сделать на XRender. Будешь заниматься? Если в Питон умеешь, то можно подправить key-mon и глянуть, что получается. На день работы. Или, вон, можешь в пример на Си выше вставить эту всю процедуру вместо просто отрисовки XDrawArc.
Вот примерно так это будет выглядеть. Только (сорри) я очень быстро накидал этот примерчик на Emacs Lisp на своей библиотеке x11-el, так как у меня там легкий задел был Идеологически все примерно так получается, как я и сказал. :)
Окно просто больше и декорации убрать и поднять его наверх. Таким образом можно сделать полупрозрачный кружок под курсором без композитного менеджера. Но если изображение под кружком изменится, пока он горит, то фон под кружком не поменяется.
Чем это отличается от примера (см. выше) на основе aosd_cat?
А ничем. То же самое.
Но я тут решение нащупал, кажется, но ты сам у себя проверь с aosd_cat. В своем оконном менеджере запусти xcompmgr (это демонстрационная реализация композитного менеджера, которую Кит Паккард написал - крошечный совсем). И вот когда ты его запустил, то aosd_cat начинает работать с включенным композитингом и уже всем делом занимается xcompmgr. При этом работает полупрозрачность, фон не перерисовывается. У меня в IceWM работает!
Ставь xcompmgr и ставь vokoscreen (я реально больше ничего подходящего не нашел! Удивительно!). Там есть в настройках showclick полупрозрачным кружком (но только будет при xcompmgr). У меня работает!
Поставил. Работает, но это не то решение которое я бы хотел. Возможно, есть таки способ как реализовать сабж БЕЗ композитора.
Нет, нет такого способа, кроме указанного выше. Он работает только при определенных условиях (в первом моем ответе ссылка на википедию — https://en.wikipedia.org/wiki/Pseudo-transparency). Я использовал XCopyArea. Да и вот тоже самое говорят:
Еще были упомянуты курсоры ранее. Так вот есть тема: DMZ-Highlight. Там есть курсоры с заготовленным полупрозрачным кружком. Но ясно, что он все время будет, а не при клике. Конечно, курсоры можно менять, но я предвижу конфликты с приложениями, которые тоже будут менять курсор.Да и оставить кружок на месте нажатия и двигаться дальше нельзя — он с курсором съедет.
Чем обусловлено желание именно без композитора? Дело в том, что xcompmgr работает прозрачно для твоего оконного менеджера. Я почему вдруг вспомнил про xcompmgr? Я когда сделал примеры выше, то сразу подумал, что в теории можно было бы сделать редирект всех окон во внеэкранную область (то есть врубить XCompositeRedirectSubwindows). При этом редирект сразу же работает и для уже открытых окон. Можно композитить. Вот я и подумал, что можно было бы написать такое простое приложение с кружком, чтобы оно композитило все, а оконный менеджер не страдает при этом. Сразу же вспомнил про xcompmgr. Он у меня уже много лет назад побыл на постоянной основе в IceWM, чтобы простые fade in/fade out effects были, но я быстро понял, что это все баловство (как и куб). В итоге мне композитный менеджер ни разу не пригодился.
Но вот задача с полупрозрачным курсором в общем случае без композитинга не решается красиво. Но так как задача редкая, то в чем проблема все же включить крошечный композитор. Считай. то это часть программы работы полупрозрачной подсветки курсора во враждебной композитингу среде. :)
да и оставить кружок на месте нажатия и двигаться дальше нельзя — он с курсором съедет.
Хотя вот выше упомянули возможность multi-pointer. Может быть, можно присвоить двум разным курсорам разные темы. Второй — просто кружок, а первый просто стрелка. По нажатию клика появляется второй курсор, а потом исчезает. Главное, чтобы им никто не управлял кроме тебя.
vokoscreen 2.5.0 давно уже установлен ;-)
Ну вот его можно пропатчить с псевдопрозрачностью, а то он без композитинга просто черный квадрат с непрозрачным кружком рисует.
Надо делать скринкасты OpenGL-программы на старом ПК. Соответственно, нужно минимизировать использование ресурсов ПК, кроме того когда ранее пробовал делать скринкаст с включенным композитором (compton) то появлялся тиринг.