Linux — C ++ и Xlib — центральное окно

Я начал изучать программирование приложений GUI непосредственно на основе XLib и пытаюсь создать центрированное окно на экране. Я не знаю обычной техники, используемой для достижения этой цели. Мой код (который не работает) это (я использую CodeBlocks)

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <GL/glew.h>
#include <GL/freeglut.h>

int screen;
Display *display;
XSetWindowAttributes window_attributes;
Window mainwindow;
XEvent events;

int main(int argc, char** argv) {
display = XOpenDisplay(NULL);screen = DefaultScreen(display);
window_attributes.background_pixel = XWhitePixel(display, screen);
window_attributes.border_pixel = XBlackPixel(display, screen);
window_attributes.win_gravity = SouthWestGravity;

mainwindow = XCreateWindow(display,
RootWindow(display, screen),
1, 1,
600, 400,
0,
CopyFromParent,
InputOutput,
CopyFromParent,
CWBackPixel|CWBorderPixel,
&window_attributes
);
XMapWindow(display, mainwindow);
XFlush(display);
XSelectInput(display, mainwindow, ExposureMask|KeyPressMask|ButtonPressMask);
while (1)  {
XNextEvent(display, &events);
switch  (events.type) {
case Expose:
// Lots of code that doesn't matter for my problem
break;
}
}
return 0;
}

Итак, я думал, что window_attributes.win_gravity сделал бы уловку, но кажется, что я делаю что-то не так, или это должно быть связано с ОС.
Спасибо за вашу помощь!

ОБНОВИТЬ
Я изменил X (левая позиция) на 100 и y (верхняя позиция) на 100, но позиция окна не меняется. Итак, моя проблема в том, что положение окна не может быть изменено, независимо от того, что это.

0

Решение

  1. Гравитация применяется к собственному содержимому и дочерним элементам окна, а не к его положению в родительском окне.
  2. Оконные менеджеры могут переопределять запросы позиции окна верхнего уровня. использование XMoveWindow после XMapWindow вызов.
3

Другие решения

В вашей функции, где вы создаете окно, вы должны вычислить начальные координаты x, y вашего окна на экране:

XDisplayWidth(dpy, sreen); XDisplayHeight(dpy, sreen);

После этого вы должны сделать свой расчет (например … / 2 + win.size.x ….), чтобы центрировать ваше окно.

1