#x11
Вопрос:
Итак, я понимаю, что XWindow меняет строку заголовка, основываясь на том, что это дочернее окно. Могу ли я отменить это? Пример программы:
/*
* Study for child windows.
*/
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Display* d;
int main(void) {
Window w, w2;
XEvent e;
const char* msg = "Hello, window 1";
const char* msg2 = "Hello, window 2";
int s;
int x;
GC gracxt;
d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "Cannot open displayn");
exit(1);
}
s = DefaultScreen(d);
gracxt = XDefaultGC(d, s);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 640, 480, 5,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w, ExposureMask|KeyPressMask|PointerMotionMask|StructureNotifyMask);
XMapWindow(d, w);
w2 = XCreateSimpleWindow(d, w, 100, 100, 100, 100, 5,
BlackPixel(d, s), WhitePixel(d, s));
XSelectInput(d, w2, ExposureMask|KeyPressMask|PointerMotionMask|StructureNotifyMask);
XMapWindow(d, w2);
while (1) {
XNextEvent(d, amp;e);
if (e.type == Expose) {
if (e.xany.window == w) XDrawString(d, e.xany.window, gracxt, 10, 50, msg, strlen(msg));
else XDrawString(d, e.xany.window, gracxt, 10, 50, msg2, strlen(msg2));
}
if (e.type == KeyPress) break; /* exit on any key */
}
XCloseDisplay(d);
return 0;
}
В результате дочернее окно теряет строку заголовка, но приобретает черную рамку контура. То, что я хочу в этом случае, — это просто окно в окне, т. Е. С рамкой заголовка, полосами размеров и т. Д.
Есть ли способ получить такое поведение?
Какова цель этого? Это для интерфейсов типа «несколько документов», где пользователь получает несколько документов, содержащихся в родительском окне, но может перемещать и изменять размер каждого из них в окне.
ОС-Ubuntu 20.04, оконный менеджер-Gnome/GDM3.
Спасибо.
Скотт Франко Сан-Хосе, Калифорния
Комментарии:
1. Строка заголовка и украшения принадлежат оконному менеджеру. Это не часть X. Вам нужно будет зарегистрироваться в используемом вами оконном менеджере.
2. Итак, чтобы просто закрепить это на земле, мне нужно будет нарисовать свои собственные рамки на дочерних окнах и обработать размер/перемещение с помощью мыши? Я могу это сделать, но самая большая проблема тогда заключалась бы в том, что если бы использовался другой оконный менеджер, то дочерние окна с рамками выглядели бы иначе, чем другие окна.
3. Дочерние окна обычно не имеют заголовков. Дочерние окна используются для кнопок и текстовых полей и тому подобного, а не для окон верхнего уровня.
4. В Windows режим используется для «интерфейса с несколькими документами», в нем у вас есть несколько подокон внутри родительского окна, каждое из которых является позиционным и значительным. docs.microsoft.com/en-us/windows/win32/winmsg/. …
5. Да, но даже Microsoft перестала рекомендовать MDI 20 лет назад, потому что это было слишком запутанно для пользователей. В любом случае, это не часть X. Большинство приложений X используют некоторые дополнительные рамки (Qt, wxWidgets), которые могут предоставить вам некоторые украшения.