LinuxForum.Fans
Тема

Что за поведение? Иксы

Автор: vovanus 8 сообщений 1917 просмотров
#183817

Написал простенькую программку:

Показать
text

#include <stdio.h>
#include <stdlib.h>

#include <X11/Xlib.h> #include <X11/Xutil.h>

int main() { Display *display; Window w1,w2; XEvent report; int screen_number; display = XOpenDisplay(NULL); if (!display) { printf("Невозможно установить соединение с X-сервером!\n"); exit(1); } screen_number = DefaultScreen(display); w1 = XCreateSimpleWindow(display, RootWindow(display, screen_number), 0,0,640,480,0, WhitePixel(display, screen_number), BlackPixel(display, screen_number)); w2 = XCreateSimpleWindow(display, RootWindow(display, screen_number), 0,0,640,480,0, WhitePixel(display, screen_number), BlackPixel(display, screen_number)); XStoreName(display, w1, "Window 1"); XStoreName(display, w2, "Window 2"); XMapWindow(display, w1); XMapWindow(display, w2); while (1) { XNextEvent(display, &report); } return 0; }

Откомпилировал, запускаю - всё ok, но когда я закрываю одно из окон (w1 или w2) почему-то закрываются сразу оба
и программа вылетает с ошибкой :(

Помогите понять в чём дело

#183860

поидее при закрытии окна по крестику считается, что связь с иксами потеряна и наступает ахтунг...
это отдельно обрабатывается... гуглите в сторону обработки закрытия окна...

#183883

А похоже на то, что связь не теряется: если вместо XNextEvent написать что-нибудь типа XWhitePixel,
то программа будет продолжать работать, безо всяких вылетов.

А может это поведение зависит от оконного менеджера?

#183930
vovanus написал:
если вместо XNextEvent написать что-нибудь типа XWhitePixel

я с утра туго соображаю... а с какого перепугу мы должны писать там XWhitePixel?

#183940

Для проверки соединения можно использовать любую функцию которая посылает запросы серверу,
ну вот что первое в голову пришло то и написал. Конечно XWhitePixel очень глупо смотрится там, но
это же только для теста..

Вообще эту программку я написал для того чтобы разобраться с ошибкой:
[console]
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 1181 requests (1181 known processed) with 0 events remaining.
[/console]

которая возникает при закрытии окна, если не маяться с WM_PROTOCOLS при написании кода в Xlib.
Эта же ошибка, я заметил, также возникает при закрытии окна glxgears

#184065
vovanus написал:
которая возникает при закрытии окна, если не маяться с WM_PROTOCOLS при написании кода в Xlib.

а собственно почему не помаятся бы?
если от ошибки избавится, то как-то так:

Показать
text
#include <stdio.h>
#include <stdlib.h>

#include <X11/Xlib.h> #include <X11/Xutil.h>

int main() { Display *d; Window w; XEvent report;

int s; Atom atom1, atom2;

d = XOpenDisplay(NULL); if (!d) { printf("52>7<>6=> CAB0=>28BL A>548=5=85 A X-A5@25@><!\n"); exit(1); }

s = DefaultScreen(d);

w = XCreateSimpleWindow(d, RootWindow(d, s), 0,0,640,480,0, WhitePixel(d, s), BlackPixel(d, s));

XStoreName(d, w, "Window 1"); XMapWindow(d, w);

atom1 = XInternAtom(d, "WM_PROTOCOLS", 0); atom2 = XInternAtom(d, "WM_DELETE_WINDOW", 0);

XSetWMProtocols(d, w, &atom2, 1);

while (1) { XNextEvent(d, &report); switch(report.type) { case ClientMessage: if (report.xclient.message_type == atom1 && report.xclient.data.l[0] == atom2) { XDestroyWindow(d, w); } case DestroyNotify: XCloseDisplay (d); return 0; } } return 1; }

#184149

А без перехватывания закрытия (WM_DELETE_WINDOW) ошибку никак не исправить?

#184170
vovanus написал:
А без перехватывания закрытия (WM_DELETE_WINDOW) ошибку никак не исправить?

я не знаю такого способа... но с иксами практически не работал... может ещё-кто расскажет... если найдёте способ, то отпишитесь...

Войдите или зарегистрируйтесь, чтобы ответить.