Как мне поместить обычную строку заголовка в это дочернее окно?

#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), которые могут предоставить вам некоторые украшения.