Код Xscreensaver выдает ошибку BadMatch

Я смог взломать Xscreensaver, чтобы получить желаемый вид (большое спасибо luser droog за его помощь). Я добавил немного кода Cairo, потому что было сложно реализовать то, что я хотел, только с помощью Xlib. Поскольку для меня это всего лишь хак, я не собираюсь его распространять.

В любом случае, когда я просматриваю Fuzzyflakes в окне, он выглядит нормально, но когда я просматриваю его в полноэкранном режиме (как и в любой хорошей заставке), я получаю эту ошибку:

X error in fuzzyflakes:
X Error of failed request: BadMatch (invalid parameter attribute)
  Major Optcode of failed request: 139 (RENDER)
  Minor optcode of failed request: 4 (RenderCreatePicture)
  Serial number of failed request: 528
  Current serial number in output stream: 1654

Вот дополнительная информация. Я использую Linux Mint 14, 64-битную версию. Я использую проприетарные драйверы nVidia версии 304.88. Мне пришлось взломать Makefile, сгенерированный сценарием настройки xscreensaver. Я изменил строку 800 Makefile на это:

fuzzyflakes:    fuzzyflakes.o   $(HACK_OBJS) 
    $(CC_HACK) `pkg-config --cflags cairo` -g -o $@ [email protected]    $(HACK_OBJS) $(HACK_LIBS) -lcairo -lm

Полный исходный код вы можете посмотреть здесь.


person Ertain    schedule 30.05.2013    source источник
comment
На этой странице есть несколько советов по отладке проблем X: rahul.net/kenton/perrors.html ; отладка может быть затруднена из-за асинхронного характера вызовов X, поэтому во время отладки помогает перевести X в синхронный режим.   -  person Multimedia Mike    schedule 30.05.2013
comment
Спасибо за подсказку, Мультимедиа Майк.   -  person Ertain    schedule 30.05.2013


Ответы (1)


На первый взгляд кажется, что вы кормите cairo недействительной информацией:


flake->Fluff.gradient_image_background =
               cairo_xlib_surface_create(flake->dpy,
               flake->DB.b, DefaultVisual(flake->dpy, 0),
               flake->XGWA.width, flake->XGWA.height);

Это утверждает, что drawable DB.p использует визуализацию по умолчанию для первого экрана дисплея. Однако фактическое окно кажется аргументом для fuzzyflakes_init() и, следовательно, может использовать другой визуал.

Из другого беглого взгляда попробуйте заменить DefaultVisual(flake->dpy, 0) на flake->XGWA.visual.

person Uli Schlachter    schedule 30.05.2013