URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6907
[ Назад ]

Исходное сообщение
"Опять Xlib"

Отправлено Kuper83 , 02-Ноя-07 16:23 
Народ, подскажите, возможно ли под Xlib создать окно(XCreateWindow) без стандартных трёх кнопочек сверху(закрыть,свернуть...). Что то типа полноэкранного режима , но не на весь экран.
Ну или хотябы на весь.Заранее благодарен.

Содержание

Сообщения в этом обсуждении
"Опять Xlib"
Отправлено jd , 04-Ноя-07 04:56 
Разумеется можно! Например, mplayer, xine и многие другие программы создают окна не только без рамки и стандартных кнопок, но и произвольной формы (панели управления этими плеерами). Окна-то, конечно, прямоугольные, но выглядят и ведут себя они как произвольной формы.

"Опять Xlib"
Отправлено Ан , 06-Ноя-07 09:10 
>Народ, подскажите, возможно ли под Xlib создать окно(XCreateWindow) без стандартных трёх кнопочек
>сверху(закрыть,свернуть...). Что то типа полноэкранного режима , но не на весь
>экран.
>Ну или хотябы на весь.Заранее благодарен.

XCreateSimpleWindow


"Опять Xlib"
Отправлено dimonna , 06-Ноя-07 10:04 
>>Народ, подскажите, возможно ли под Xlib создать окно(XCreateWindow) без стандартных трёх кнопочек
>>сверху(закрыть,свернуть...). Что то типа полноэкранного режима , но не на весь
>>экран.
>>Ну или хотябы на весь.Заранее благодарен.
>
>XCreateSimpleWindow

Так ведь кнопочки создает не Xlib а Ваш оконный менеджер - запустите Ваше приложение с CreateWindow без оконного менеджера и кнопочек разумеется не будет - только область окна


"Опять Xlib"
Отправлено Kuper83 , 06-Ноя-07 10:04 
Не хорошо - сделать можно , но как? Какие параметры должны подставляться в XCreateSimpleWindow или какие есть другие функции?



"Опять Xlib"
Отправлено dimonna , 06-Ноя-07 10:14 
>Не хорошо - сделать можно , но как? Какие параметры должны подставляться
>в XCreateSimpleWindow или какие есть другие функции?

Display *display=XOpenDisplay(getenv("DISPLAY"));

int screenNumber=DefaultScreen(display);

Window window=XCreateSimpleWindow(display, RootWindow(display, screenNumber),
1280-w-10, 1024-h-10, w, h, 1, BlackPixel(display, screenNumber),
WhitePixel(display, screenNumber));


"Опять Xlib"
Отправлено А , 06-Ноя-07 10:42 
>Не хорошо - сделать можно , но как? Какие параметры должны подставляться
>в XCreateSimpleWindow или какие есть другие функции?

Есть всякие стандарты для взаимодействия с оконным менеджером, типа ICCCM. Там всё прописано, как заставить оконный менеджер не приделывать кнопки. Но эти стандарты ОЧЕНЬ непонятные. Лучше взять какой-нибудь xmms и посмотреть, как это сделано в нём.

Кстати, в каких-то оконных менеджерах хmms тоже с офрмлением окон запускается... в twm чтоли... так-что может что-то другое взять за образец.


"Опять Xlib"
Отправлено Kuper83 , 06-Ноя-07 12:51 
Ну впринципе стратегию я понял - разберусь.
Тут у меня ещё один вопросик!
В приложении необходимо перерисовывать компоненты из разных потоков - поэтому вызываю XInitThreads. Но после закрытия приложения основной поток не выгружается и висит в процессах.



"Опять Xlib"
Отправлено dimonna , 06-Ноя-07 16:17 
>Ну впринципе стратегию я понял - разберусь.
>Тут у меня ещё один вопросик!
>В приложении необходимо перерисовывать компоненты из разных потоков - поэтому вызываю XInitThreads.
>Но после закрытия приложения основной поток не выгружается и висит в
>процессах.

можно на код взглянуть? - потоки должны (в идеале) определить что процесс завершается и завершиться, в противном случае потоки КИЛЯЮТСЯ. Может быть Вы создаете не потоки а процессы?


"Опять Xlib"
Отправлено jd , 06-Ноя-07 18:07 
Вот, сляпано из кода, выдранного из SDL: он, когда работает поверх иксов, тоже позволяет делать окна без рамки и кнопок.

/* Set no frame WM hint. From SDL sources. */
void SetNoBorder(Display *dpy, Window win, Window root)
{ int set = 0;
  Atom WM_HINTS;
  /* First try to set MWM hints */
  WM_HINTS = XInternAtom(dpy, "_MOTIF_WM_HINTS", True);
  if(WM_HINTS != None)
  { /* Hints used by Motif compliant window managers */
    struct
    { unsigned long flags;
      unsigned long functions;
      unsigned long decorations;
      long input_mode;
      unsigned long status;
    } MWMHints = { (1L << 1), 0, 0, 0, 0 };

    XChangeProperty(dpy, win, WM_HINTS, WM_HINTS, 32,
                    PropModeReplace, (unsigned char *)&MWMHints,
                    sizeof(MWMHints)/sizeof(long));
    set = 1;
  }

  /* Now try to set KWM hints */
  WM_HINTS = XInternAtom(dpy, "KWM_WIN_DECORATION", True);
  if(WM_HINTS != None)
  { long KWMHints = 0;

    XChangeProperty(dpy, win, WM_HINTS, WM_HINTS, 32,
                    PropModeReplace, (unsigned char *)&KWMHints,
                    sizeof(KWMHints)/sizeof(long));
    set = 1;
  }

  /* Now try to set GNOME hints */
  WM_HINTS = XInternAtom(dpy, "_WIN_HINTS", True);
  if(WM_HINTS != None)
  { long GNOMEHints = 0;

    XChangeProperty(dpy, win, WM_HINTS, WM_HINTS, 32,
                    PropModeReplace, (unsigned char *)&GNOMEHints,
                    sizeof(GNOMEHints)/sizeof(long));
    set = 1;
  }

  /* Finally set the transient hints if necessary */
  if(! set)
    XSetTransientForHint(dpy, win, root);
}

То есть, судя по всему, единого абсолютного способа нет и для разных window manager'ов метод может отличаться. Но приведённый вариант, видимо, работает в большинстве случаев (так как, видимо, большинство wm укладываются в рамки Motif/KDE/GNOME).

* Параметр 'root' - это корневое окно.


"Опять Xlib"
Отправлено dimonna , 06-Ноя-07 18:50 
>[оверквотинг удален]
>    XSetTransientForHint(dpy, win, root);
>}
>

>
>То есть, судя по всему, единого абсолютного способа нет и для разных
>window manager'ов метод может отличаться. Но приведённый вариант, видимо, работает в
>большинстве случаев (так как, видимо, большинство wm укладываются в рамки Motif/KDE/GNOME).
>
>
>* Параметр 'root' - это корневое окно.

Абсолютно верно - тут мы изменяем свойства воспринимаемые оконным менеджером, в то время как для окна xlib - это всего-лишь строка


"Опять Xlib"
Отправлено Kuper83 , 14-Ноя-07 10:44 
Спасибо, вроде с окнами получилось, но просто не знаю чё делать с XinitThreads().
Я даже не создаю других потоков - только родительский. И всё равно после закрытия окна он висит. Перепробовал всё - не убивает его. Код примерно такой:
main()
{
XInitThreads();
app Aplication();//открывает дисплей, создаёт окно и заходит в бесконечный цикл отловки событий
}



"Опять Xlib"
Отправлено dimonna , 14-Ноя-07 11:02 
>[оверквотинг удален]
>XinitThreads().
>Я даже не создаю других потоков - только родительский. И всё равно
>после закрытия окна он висит. Перепробовал всё - не убивает его.
>Код примерно такой:
>main()
>{
>XInitThreads();
>app Aplication();//открывает дисплей, создаёт окно и заходит в бесконечный цикл отловки событий
>
>}

Конечно посмотреть бы на код... Возможно XLockDisplay ?


"Опять Xlib"
Отправлено Kuper83 , 20-Ноя-07 17:19 
XLockDisplay я не вызываю.
А не закрывает он родительский поток:
Насчёт кода конечно как то можно но его впринципе очень много, но по сути у меня есть иерархия классов. Моё приложение является младшим наследником этой иерархии - так вот (при вызове XInitThreads) после закрытия приложения не вызываются деструкторы родителей??? Как только коментирую строчку с вызовом этой функции - все деструкторы последовательно вызываются и приложение закрывается корректно. Чё делать не знаю!!!



"Опять Xlib"
Отправлено dimonna , 23-Ноя-07 18:54 
>XLockDisplay я не вызываю.
>А не закрывает он родительский поток:
>Насчёт кода конечно как то можно но его впринципе очень много, но
>по сути у меня есть иерархия классов. Моё приложение является младшим
>наследником этой иерархии - так вот (при вызове XInitThreads) после закрытия
>приложения не вызываются деструкторы родителей??? Как только коментирую строчку с вызовом
>этой функции - все деструкторы последовательно вызываются и приложение закрывается корректно.
>Чё делать не знаю!!!

Надо смотреть код, sorry