LINUX.ORG.RU

Был один эксперт по рисованию кругов на ЛОРе, но я забыл его никнейм.

Deleted
()
Ответ на: комментарий от Zubok

XCF-изображение (X11 cursor) отображается с прозрачностью без композитора.

Может можно как-то выводить XCF в месте клика с задержкой в пару секунд?

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

Ну, кстати, в пакете xcursor-themes (в Debian) если установить тему whiteglass, то курсор будет полупрозрачным.

XCF-изображение (X11 cursor) отображается с прозрачностью без композитора.

Я полагаю, что механизм тот же самый (псевдопрозрачность). Так как курсор - самая верхняя картинка, то просто фотографируется экран в этом месте и накладывается курсор в пределах выделенной для него области. Поэтому и работает.

Может можно как-то выводить XCF в месте клика с задержкой в пару секунд?

А вот надо подумать.

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

Посмотри xcursorgen. Это в стандартных утилитах идет к иксам. Там можно из серии картинок png сделать анимированный курсор. Но я не смотрел, можно ли сделать, как ты хочешь. Вроде как нет. Там можно только задать интервал между кадрами. Надо подумать: можно отследить событие и что-то сотворить по нему (по сути - сменить курсор на анимированный с кружком только).

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)

Разве что вместе с видео сохранять все события кликов мыши с координатами, чтобы потом по ним накладывать эффекты на снятое видео.

i-rinat ★★★★★
()
Ответ на: комментарий от atsym

Можно сделать как еще. Не курсор мучить, а создать по клику окно поверх всех (я думаю, что курсоры с кружочками так и делают), сфотографировать картинку под ним, делать анимацию. Так примерно работает 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;
}
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от atsym

Но сначала хочу убедиться что нет других решений.

Нашел какое-то key-mon. Посмотри, что он умеет. У меня только кружок показывает красный. opacity там есть вроде, но я вот к моменту, как пишу, не увидел прозрачности. Да и как-то с артефактами он в среде без композитинга работает, кажется.

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

В принципе, можно ведь не полупрозрачный круг показывать, а вместо этого показать «кольцо». В Unicode есть несколько подобных символов и если можно показать текст без фона то это бы тоже сгодилось.

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

Ну вот key-mon показывает кольцо как раз. Но насколько я понял, они через питон дергают xlib и делают фигурное окно, то есть вырезанное по кольцу (расширение X Shape Extension). Полупрозрачность не умеет, соответственно, но это не означает, что это нельзя сделать.

А вот aosd_cat умеет, буквы полупрозрачные рисует поверх окон. Но там видно, что скриншот под надписями он делает один раз в начале. Если успеть сдвинуть окно, пока горит надпись, то можно увидеть под ней старый фон, который был на этом месте. Ну, собственно, чудес тут ожидать не надо. Можно, конечно, в цикле снимок делать, но это загрузка процессора может быть, артефакты все равно будут видны, но если картинку не дергать, то будет ок. Хотя... надо подумать, не поможет ли тут X Damage Extension (не факт).

UPD: Да, а курсор рисует свою полупрозрачность на X-сервере, поэтому там не видно артефактов.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

Посмотрел пример скрипта для aosd_cat

Вот что у меня получилось

#bin/bash
echo "@" | aosd_cat -n "Symbola Bold 36" -R "#ffff00" -B None -S None -t 2 -f 400 -u 500 -o 500 -p 6 -l 0 -s 0 -r 125

Как прикрутить к этому скрипту координаты клика ЛКМ/ПКМ?

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

курсор рисует свою полупрозрачность на X-сервере

Можно-ли как-то использовать этот метод для отрисовки кастомного XCF-изображения?

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

Как бы если тебе решение выше не подходит, а оно, ИМХО, достаточно простое в использовании, то я тебя не понял, и слушать тебе меня не надо. К этому решению, собственно, мне добавить нечего.

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

Сделаю дубль, пожалуй. На будущее.

#include <stdio.h>
#include <unistd.h>
#include <string.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>


// Some variables you can play with :-)
int size = 220;
int step = 40;
int speed = 400;
int line_width = 2;
char color_name[] = "black";


int main(int argc, char* argv[]) {
    // Setup display and such
    char *display_name = getenv("DISPLAY");
    if (!display_name) {
        fprintf(stderr, "%s: cannot connect to X server '%s'\n", argv[0], display_name);
        exit(1);
    }

    Display *display = XOpenDisplay(display_name);
    int screen = DefaultScreen(display);

    // Get the mouse cursor position
    int win_x, win_y, root_x, root_y = 0;
    unsigned int mask = 0;
    Window child_win, root_win;
    XQueryPointer(display, XRootWindow(display, screen),
        &child_win, &root_win,
        &root_x, &root_y, &win_x, &win_y, &mask);

    // Create a window at the mouse position
    XSetWindowAttributes window_attr;
    window_attr.override_redirect = 1;
    Window window = XCreateWindow(display, XRootWindow(display, screen),
        root_x - size/2, root_y - size/2,   // x, y position
        size, size,                         // width, height
        0,                                  // border width
        DefaultDepth(display, screen),      // depth
        CopyFromParent,                     // class
        DefaultVisual(display, screen),     // visual
        CWOverrideRedirect,                 // valuemask
        &window_attr                        // attributes
    );
    XMapWindow(display, window);
    XStoreName(display, window, "find-cursor");

    XClassHint *class = XAllocClassHint();
    class->res_name = "find-cursor";
    class->res_class = "find-cursor";
    XSetClassHint(display, window, class);
    XFree(class);

    // Keep the window on top
    XEvent e;
    memset(&e, 0, sizeof(e));
    e.xclient.type = ClientMessage;
    e.xclient.message_type = XInternAtom(display, "_NET_WM_STATE", False);
    e.xclient.display = display;
    e.xclient.window = window;
    e.xclient.format = 32;
    e.xclient.data.l[0] = 1;
    e.xclient.data.l[1] = XInternAtom(display, "_NET_WM_STATE_STAYS_ON_TOP", False);
    XSendEvent(display, XRootWindow(display, screen), False, SubstructureRedirectMask, &e);

    XRaiseWindow(display, window);
    XFlush(display);

    // Prepare to draw on this window
    XGCValues values = { .graphics_exposures = False };
    unsigned long valuemask = 0;
    GC gc = XCreateGC(display, window, valuemask, &values);

    Colormap colormap = DefaultColormap(display, screen);
    XColor color;
    XAllocNamedColor(display, colormap, color_name, &color, &color);
    XSetForeground(display, gc, color.pixel);
    XSetLineAttributes(display, gc, line_width, LineSolid, CapButt, JoinBevel);

    // Draw the circles
    for (int i=1; i<=size; i+=step) { 
        XDrawArc(display, window, gc,
            size/2 - i/2, size/2 - i/2,   // x, y position
            i, i,                         // Size
            0, 360 * 64);                 // Make it a full circle

        XSync(display, False);
        usleep(speed * 100);
    }
    XFreeGC(display, gc);
    XCloseDisplay(display);
}
anonymous
()
Ответ на: комментарий от Zubok

то есть вырезанное по кольцу (расширение X Shape Extension).

А, нет, Shape Extension они используют для окна с модификаторами (Ctrl, Alt,...) отображать (опция --backgroundless). А кольцо просто на прозрачном окне рисуется

Zubok ★★★★★
()

В иксах же можно иметь два курсора мыши. Вот добавить второй от виртуальной мыши, выставить ему свою картинку и показывать/скрывать. Прозрачность кусора иксы умеют сами.

legolegs ★★★★★
()

Если в Xorg выделить картинку или текст и потом выделенное потащить мышкой оно тащится в полупрозрачном виде, может в эту сторону копнуть.

Deleted
()
Ответ на: комментарий от Zubok

А кольцо просто на прозрачном окне рисуется

Это хорошо или плохо? Как это использовать для реализации сабжа?

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

В иксах же можно иметь два курсора мыши. Вот добавить второй от виртуальной мыши

Это План «Г» ;-)

Но сам такой скрипт написать не смогу. Есть готовое решение или хотя бы пример?

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

Это хорошо или плохо?

Это ни то ни другое. Это единственно возможный вариант. Если нарисуешь на каком-то другом фоне, то на экране будет просто цветной квадрат с кольцом. :)

Как это использовать для реализации сабжа?

Если чуть дописать, то можно, как и выше обсуждалось, сделать псевдопрозрачностью. Вместо того чтобы просто показывать кружок, создаем Pixmap и GC на X-сервере, делаем XCopyArea прямоугольной области, где будем рисовать окно с кружком в этот Pixmap (фотографируем). Дальше при помощи X Render Extension делаем композитинг скриншота и изображения круга, чтобы была полупрозрачность, далее копируем полученное изображение в окно как его фон, например, ждем секунду-две и убираем все. Отдельная проблема - сглаженный кружок - его придется на трапезоиды разрезать и ими рисовать или, что будет проще, использовать для рисования cairo, а не X Render напрямую. На самом деле, тут совсем мало писанины. Если с cairo, то вообще быстро. Если сойдет пока несглаженный круг, то можно прямо xlib круг нарисовать вообще одной командой и не связываться с трапезоидами и cairo. Я это оцениваю ну максимум в 20 строк.

Да можно вообще их кружок оставить, а только фотографирование и композитинг сделать на XRender. Будешь заниматься? Если в Питон умеешь, то можно подправить key-mon и глянуть, что получается. На день работы. Или, вон, можешь в пример на Си выше вставить эту всю процедуру вместо просто отрисовки XDrawArc.

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

Вот примерно так это будет выглядеть. Только (сорри) я очень быстро накидал этот примерчик на Emacs Lisp на своей библиотеке x11-el, так как у меня там легкий задел был Идеологически все примерно так получается, как я и сказал. :)

Окно просто больше и декорации убрать и поднять его наверх. Таким образом можно сделать полупрозрачный кружок под курсором без композитного менеджера. Но если изображение под кружком изменится, пока он горит, то фон под кружком не поменяется.

https://imgur.com/a/aelgatb

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

Но если изображение под кружком изменится, пока он горит, то фон под кружком не поменяется.

Чем это отличается от примера (см. выше) на основе aosd_cat?

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

Чем это отличается от примера (см. выше) на основе aosd_cat?

А ничем. То же самое.

Но я тут решение нащупал, кажется, но ты сам у себя проверь с aosd_cat. В своем оконном менеджере запусти xcompmgr (это демонстрационная реализация композитного менеджера, которую Кит Паккард написал - крошечный совсем). И вот когда ты его запустил, то aosd_cat начинает работать с включенным композитингом и уже всем делом занимается xcompmgr. При этом работает полупрозрачность, фон не перерисовывается. У меня в IceWM работает!

$ echo "TEST" | aosd_cat -n "Sans 80" -r 40 -u 10000
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от atsym

Ставь xcompmgr и ставь vokoscreen (я реально больше ничего подходящего не нашел! Удивительно!). Там есть в настройках showclick полупрозрачным кружком (но только будет при xcompmgr). У меня работает!

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

ставь vokoscreen

vokoscreen 2.5.0 давно уже установлен ;-) Собственно из-за невозможности полноценно использовать vokoscreen без композитора и был создан этот трэд.

Ставь xcompmgr

Поставил. Работает, но это не то решение которое я бы хотел. Возможно, есть таки способ как реализовать сабж БЕЗ композитора.

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

Поставил. Работает, но это не то решение которое я бы хотел. Возможно, есть таки способ как реализовать сабж БЕЗ композитора.

Нет, нет такого способа, кроме указанного выше. Он работает только при определенных условиях (в первом моем ответе ссылка на википедию — https://en.wikipedia.org/wiki/Pseudo-transparency). Я использовал XCopyArea. Да и вот тоже самое говорят:

https://stackoverflow.com/questions/4965219/gtk-x11-semitransparent-windows-w...

Еще были упомянуты курсоры ранее. Так вот есть тема: DMZ-Highlight. Там есть курсоры с заготовленным полупрозрачным кружком. Но ясно, что он все время будет, а не при клике. Конечно, курсоры можно менять, но я предвижу конфликты с приложениями, которые тоже будут менять курсор.Да и оставить кружок на месте нажатия и двигаться дальше нельзя — он с курсором съедет.

Чем обусловлено желание именно без композитора? Дело в том, что xcompmgr работает прозрачно для твоего оконного менеджера. Я почему вдруг вспомнил про xcompmgr? Я когда сделал примеры выше, то сразу подумал, что в теории можно было бы сделать редирект всех окон во внеэкранную область (то есть врубить XCompositeRedirectSubwindows). При этом редирект сразу же работает и для уже открытых окон. Можно композитить. Вот я и подумал, что можно было бы написать такое простое приложение с кружком, чтобы оно композитило все, а оконный менеджер не страдает при этом. Сразу же вспомнил про xcompmgr. Он у меня уже много лет назад побыл на постоянной основе в IceWM, чтобы простые fade in/fade out effects были, но я быстро понял, что это все баловство (как и куб). В итоге мне композитный менеджер ни разу не пригодился.

Но вот задача с полупрозрачным курсором в общем случае без композитинга не решается красиво. Но так как задача редкая, то в чем проблема все же включить крошечный композитор. Считай. то это часть программы работы полупрозрачной подсветки курсора во враждебной композитингу среде. :)

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

да и оставить кружок на месте нажатия и двигаться дальше нельзя — он с курсором съедет.

Хотя вот выше упомянули возможность multi-pointer. Может быть, можно присвоить двум разным курсорам разные темы. Второй — просто кружок, а первый просто стрелка. По нажатию клика появляется второй курсор, а потом исчезает. Главное, чтобы им никто не управлял кроме тебя.

vokoscreen 2.5.0 давно уже установлен ;-)

Ну вот его можно пропатчить с псевдопрозрачностью, а то он без композитинга просто черный квадрат с непрозрачным кружком рисует.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Чем обусловлено желание именно без композитора?

Надо делать скринкасты OpenGL-программы на старом ПК. Соответственно, нужно минимизировать использование ресурсов ПК, кроме того когда ранее пробовал делать скринкаст с включенным композитором (compton) то появлялся тиринг.

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

UPD: Сейчас заметил что и включив xcompmgr тоже иногда виден тиринг :-/

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

с включенным композитором (compton) то появлялся тиринг.

compton — это по сути форк форка xcompmgr. А крутить настройки видеокарты пробовалось?

UPD. А это пробовалось?

https://wiki.archlinux.org/index.php/compton#Fullscreen_tearing

https://wiki.archlinux.org/index.php/compton#Screentearing_with_NVIDIA's_prop...

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.