Здравствуйте
Имеется окно, у которого нет заголовка и бордера. Всё изображение внутри окна рисуется через OpenGL, включая собственный заголовок и кнопки типа развернуть/свернуть. И всё вроде бы более-менее работает, но есть большая проблема с тем, чтобы поставить окно в нужное место на экране. В первую очередь это необходимо, чтобы тащить окно мышью за собственный заголовок, но не тут-то было. Окно при перетаскивании дребезжит по всему экрану, хотя и перемещается в нужную сторону. Само перемещение делается сейчас так:
// Изменение положения окна на рабочем столе
void GPlatformUnixOGL::SetWindowRect(CMagicRect* rect)
{
int wi=rect->Width();
int he=rect->Height();
XMoveResizeWindow(display, window, rect->left, rect->top, wi, he);
XFlush(display);
}
Попытки делать что-то типа override_redirect=True; приводят к тому, что окно нельзя свернуть, хотя дребезга и становится меньше.
Что я делаю не так ? Мне всего-то и надо, чтобы окно заняло то положение, которое я ему отправляю.
Само окно создается так:
int glxAttribs[]={
GLX_RGBA, // Используем режим RGBA
GLX_DOUBLEBUFFER, // Двойная буферизация
None // Завершаем список атрибутов
};
// Выбираем визуальный формат
XVisualInfo* visualInfo=glXChooseVisual(display, screen, glxAttribs);
Window rootWindow=RootWindow(display, screen);
XSetWindowAttributes windowAttributes;
windowAttributes.colormap=XCreateColormap(display, rootWindow, visualInfo->visual, AllocNone);
windowAttributes.background_pixmap=None; // ОТКЛЮЧАЕМ очистку фона!
windowAttributes.backing_store=Always; // Просим X11 сохранять буфер окна
window=XCreateWindow(
display,
rootWindow,
wx, wy, view_width, view_height, // Позиция и размер окна
0, // Без границы
visualInfo->depth, // Глубина цвета
InputOutput, // Тип окна
visualInfo->visual, // Визуальный формат
CWColormap | CWEventMask, // Устанавливаем атрибуты окна
&windowAttributes
);
// Указываем тип окна NORMAL
Atom wmWindowType = XInternAtom(display, "_NET_WM_WINDOW_TYPE", False);
Atom wmWindowNormal = XInternAtom(display, "_NET_WM_WINDOW_TYPE_NORMAL", False);
XChangeProperty(display, window, wmWindowType, XA_ATOM, 32, PropModeReplace, (unsigned char *)&wmWindowNormal, 1);
// Отключаем рамки и заголовок
Atom motifHints = XInternAtom(display, "_MOTIF_WM_HINTS", False);
struct {
long flags;
long functions;
long decorations;
long input_mode;
long status;
} hints = { 2, 0, 0, 0, 0 };
XChangeProperty(display, window, motifHints, motifHints, 32, PropModeReplace, (unsigned char *)&hints, 5);
XSizeHints *h = XAllocSizeHints();
h->flags = PPosition | PSize | PResizeInc | PBaseSize;
h->x = 100; // Координаты X
h->y = 100; // Координаты Y
h->width = 640; // Ширина окна
h->height = 480; // Высота окна
h->base_width = 640; // Базовая ширина
h->base_height = 480; // Базовая высота
XSetWMNormalHints(display, window, h);
XFree(h);