Не в том месте создаётся окно (библиотека Xlib)

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 658
ОС: астралинукс

Не в том месте создаётся окно (библиотека Xlib)

Сообщение жучара »

Друзья!
Вот этот код:
https://linuxgazette.net/78/misc/tougher/example1.cpp.txt
https://linuxgazette.net/78/tougher.html

Должен создать окно в левом верхнем углу, тут по-моему двух мнений быть не может. А он у меня создаёт в центре. И как ни меняй параметры x и y, бесполезно, только в центре. ЧЯДНТ? Спасибо, кто откликнется.

Debian 9 MATE

...Так оно и принудительно не движется, и ошибку не выдаёт. Кошмар какой.

Код: Выделить всё

//
// example1.cpp
//

#include <X11/Xlib.h>
#include <unistd.h>
#include <stdio.h>


main()
{
  // Open a display.
  Display *d = XOpenDisplay(0);

    int error;
  
  if ( d )
    {
      // Create the window
      Window w = XCreateWindow(d, DefaultRootWindow(d), 200, 200, 400,
			       300, 0, CopyFromParent, CopyFromParent,
			       CopyFromParent, 0, 0);

      error = XMoveWindow(d, w, 0, 0);
      if (error == BadWindow)
        printf ("всё плохо\n");
      
      // Show the window
      XMapWindow(d, w);
      XFlush(d);

      // Sleep long enough to see the window.
      sleep(10);
    }
  return 0;
}
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Не в том месте создаётся окно (библиотека Xlib)

Сообщение Hephaestus »

Зависит от DE/оконного менеджера.
Данный пример (который по ссылке) в разных DE ведет себя по-разному:
В LXDE окно по вертикали находится сверху, по горизонтали - в центре.
В Awesome по вертикали - сверху, по горизонтали - слева (верхний левый угол).
В XFCE по вертикали - в центре, по горизонтали - в центре (самый центр экрана).
В голых иксах (без DE и WM) окно не видно вообще, потому что заголовки окон не отображаются, а у этого окна, кроме заголовка ничего нет.

Так что это вопросы к настройкам Вашей оболочки (каким манером она там новые окна размещает).

P. S. В голых иксах окно, вероятно, размещается там, где Вы ожидаете. Если окошко нарисуете видимым (с каким-нибудь фоном, например), сможете проверить.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
s.xbatob
Сообщения: 1137
ОС: Fedora

Re: Не в том месте создаётся окно (библиотека Xlib)

Сообщение s.xbatob »

жучара писал(а):
18.07.2020 04:11
Должен создать окно в левом верхнем углу, тут по-моему двух мнений быть не может
А у оконного менеджера на этот счёт своё мнение. ;) Более того, бороться с его мнением считается неприличным.
А ещё в былые времена WM создавал своё окно с фреймом и делал окнам приложений reparent туда.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 658
ОС: астралинукс

Re: Не в том месте создаётся окно (библиотека Xlib)

Сообщение жучара »

s.xbatob писал:
18.07.2020 11:20
жучара писал(а):
18.07.2020 04:11
Должен создать окно в левом верхнем углу, тут по-моему двух мнений быть не может
А у оконного менеджера на этот счёт своё мнение. ;) Более того, бороться с его мнением считается неприличным.
А ещё в былые времена WM создавал своё окно с фреймом и делал окнам приложений reparent туда.
так он даже перемещать не даёт.
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5102
ОС: Gentoo

Re: Не в том месте создаётся окно (библиотека Xlib)

Сообщение /dev/random »

жучара писал(а):
18.07.2020 13:20
так он даже перемещать не даёт.
Разумеется. Позиционирование окна - задача оконного менеджера, и если вы влезете туда грязными руками (что вы и пытаетесь сделать), в лучшем случае ничего не произойдёт, а в худшем - весь интерфейс затрещит по швам.

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

Аватара пользователя
жучара
Сообщения: 658
ОС: астралинукс

Re: Не в том месте создаётся окно (библиотека Xlib)

Сообщение жучара »

/dev/random писал:
18.07.2020 13:44
жучара писал(а):
18.07.2020 13:20
так он даже перемещать не даёт.
Разумеется. Позиционирование окна - задача оконного менеджера, и если вы влезете туда грязными руками (что вы и пытаетесь сделать), в лучшем случае ничего не произойдёт, а в худшем - весь интерфейс затрещит по швам.
прикольно, а вариант аккуратненько передвинуть окошко даже не рассматривается?
...В другой плохой системе, про которую из каждого утюга не орут, что она полностью под контролем и прочую такую муть, я рисовал окна как хотел, они у меня по экрану туда-сюда лётали, даже людей заставлял по ним клацать (типа игры было.)
Я просто читаю маны.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 5102
ОС: Gentoo

Re: Не в том месте создаётся окно (библиотека Xlib)

Сообщение /dev/random »

жучара писал(а):
18.07.2020 15:00
прикольно, а вариант аккуратненько передвинуть окошко даже не рассматривается?
Функция, которую вы вызываете, позиционирует дочернее окно на родительском (в зависимости от используемого тулкита, кнопки и прочие виджеты могут быть отдельными дочерними окнами). В древности диалоговые и прочие "окна в привычном смысле" были просто дочерними окнами корневого (полноэкранного) окна. Не было заголовков и прочих декораций, а возможность перемещения окна пользователем каждое приложение должно было писать само. Позже появились оконные менеджеры, берущие всё это на себя. Они действуют по-разному. Например, некоторые создают окно, внутри которого отрисовывается заголовок, и делают его родителем "окна в привычном смысле", и если вы попытаетесь переместить окно относительно родителя, то оно переместится относительно своего заголовка. Другие создают нового родителя не для декораций, а наоборот, чтобы подавить "перемещение относительно декораций". Третьи создают одно новое полноэкранное окно, закрывающее все остальные, и сами отрисовывают на нём копии "окон в привычном смысле", подрисовывая заголовки и прочее, а сами окна пользователю не видны, и их координаты относительно родителя не имеют значения; в этом случае никто, кроме оконного менеджера не знает (и знать не может), где окно будет отрисовано, не говоря уже о том, что оно может быть отрисовано в нескольких местах одновременно. Есть и ещё куча различных вариантов того, как могут работать оконные менеджеры. Есть среди них и такие, в которых ваш способ сработает, но они встречаются редко. В любом случае, не пытайтесь использовать функции позиционирования дочернего окна относительно родителя для перемещения "окон в привычном смысле". Связывайтесь с оконным менеджером через NetWM и просите его переместить окно.
Спасибо сказали: