Народ, подскажите, возможно ли под Xlib создать окно(XCreateWindow) без стандартных трёх кнопочек сверху(закрыть,свернуть...). Что то типа полноэкранного режима , но не на весь экран.
Ну или хотябы на весь.Заранее благодарен.
Разумеется можно! Например, mplayer, xine и многие другие программы создают окна не только без рамки и стандартных кнопок, но и произвольной формы (панели управления этими плеерами). Окна-то, конечно, прямоугольные, но выглядят и ведут себя они как произвольной формы.
>Народ, подскажите, возможно ли под Xlib создать окно(XCreateWindow) без стандартных трёх кнопочек
>сверху(закрыть,свернуть...). Что то типа полноэкранного режима , но не на весь
>экран.
>Ну или хотябы на весь.Заранее благодарен.XCreateSimpleWindow
>>Народ, подскажите, возможно ли под Xlib создать окно(XCreateWindow) без стандартных трёх кнопочек
>>сверху(закрыть,свернуть...). Что то типа полноэкранного режима , но не на весь
>>экран.
>>Ну или хотябы на весь.Заранее благодарен.
>
>XCreateSimpleWindowТак ведь кнопочки создает не Xlib а Ваш оконный менеджер - запустите Ваше приложение с CreateWindow без оконного менеджера и кнопочек разумеется не будет - только область окна
Не хорошо - сделать можно , но как? Какие параметры должны подставляться в XCreateSimpleWindow или какие есть другие функции?
>Не хорошо - сделать можно , но как? Какие параметры должны подставляться
>в 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));
>Не хорошо - сделать можно , но как? Какие параметры должны подставляться
>в XCreateSimpleWindow или какие есть другие функции?Есть всякие стандарты для взаимодействия с оконным менеджером, типа ICCCM. Там всё прописано, как заставить оконный менеджер не приделывать кнопки. Но эти стандарты ОЧЕНЬ непонятные. Лучше взять какой-нибудь xmms и посмотреть, как это сделано в нём.
Кстати, в каких-то оконных менеджерах хmms тоже с офрмлением окон запускается... в twm чтоли... так-что может что-то другое взять за образец.
Ну впринципе стратегию я понял - разберусь.
Тут у меня ещё один вопросик!
В приложении необходимо перерисовывать компоненты из разных потоков - поэтому вызываю XInitThreads. Но после закрытия приложения основной поток не выгружается и висит в процессах.
>Ну впринципе стратегию я понял - разберусь.
>Тут у меня ещё один вопросик!
>В приложении необходимо перерисовывать компоненты из разных потоков - поэтому вызываю XInitThreads.
>Но после закрытия приложения основной поток не выгружается и висит в
>процессах.можно на код взглянуть? - потоки должны (в идеале) определить что процесс завершается и завершиться, в противном случае потоки КИЛЯЮТСЯ. Может быть Вы создаете не потоки а процессы?
Вот, сляпано из кода, выдранного из 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' - это корневое окно.
>[оверквотинг удален]
> XSetTransientForHint(dpy, win, root);
>}
>
Абсолютно верно - тут мы изменяем свойства воспринимаемые оконным менеджером, в то время как для окна xlib - это всего-лишь строка
Спасибо, вроде с окнами получилось, но просто не знаю чё делать с XinitThreads().
Я даже не создаю других потоков - только родительский. И всё равно после закрытия окна он висит. Перепробовал всё - не убивает его. Код примерно такой:
main()
{
XInitThreads();
app Aplication();//открывает дисплей, создаёт окно и заходит в бесконечный цикл отловки событий
}
>[оверквотинг удален]
>XinitThreads().
>Я даже не создаю других потоков - только родительский. И всё равно
>после закрытия окна он висит. Перепробовал всё - не убивает его.
>Код примерно такой:
>main()
>{
>XInitThreads();
>app Aplication();//открывает дисплей, создаёт окно и заходит в бесконечный цикл отловки событий
>
>}Конечно посмотреть бы на код... Возможно XLockDisplay ?
XLockDisplay я не вызываю.
А не закрывает он родительский поток:
Насчёт кода конечно как то можно но его впринципе очень много, но по сути у меня есть иерархия классов. Моё приложение является младшим наследником этой иерархии - так вот (при вызове XInitThreads) после закрытия приложения не вызываются деструкторы родителей??? Как только коментирую строчку с вызовом этой функции - все деструкторы последовательно вызываются и приложение закрывается корректно. Чё делать не знаю!!!
>XLockDisplay я не вызываю.
>А не закрывает он родительский поток:
>Насчёт кода конечно как то можно но его впринципе очень много, но
>по сути у меня есть иерархия классов. Моё приложение является младшим
>наследником этой иерархии - так вот (при вызове XInitThreads) после закрытия
>приложения не вызываются деструкторы родителей??? Как только коментирую строчку с вызовом
>этой функции - все деструкторы последовательно вызываются и приложение закрывается корректно.
>Чё делать не знаю!!!Надо смотреть код, sorry