LINUX.ORG.RU

Xlib etc.


0

0

Господа повелители кодинга! Помогите разобраться. Вот написал я программу, выводящую окошко и закрывающее его при нажатии кнопки "q". Всё работало. Потом дописал (причём позже переставлял эти строки и по всей программе их тыкал) XDrawString и ещё нарисовать прямоугольник. Всё компилируется, segmentation fault нет, программа работает, но ничего, связанного с графикой (прямоугольник и строка) не рисует. Сначала я думал, что неправильно проставил цвет фона\шрифта, но и тут я уже всё перепробовал, объявлял, переобъявлял. Теперь вот не знаю, где порылся пёс. Если кто-то имеет возможность, прочитайте пожалуйста прогу и зацените на ошибки! И куда вам её слать?

anonymous

На сколько я знаю (я знаю я мало). Мне кажется что косяк у тебя вот где. В перерисовке. Т.е. Надо вешаться на expose_event. И там отрисовывать всякий раз одно и тоже что там тебе нужно.

P.s. Поправте меня если я не прав.

tugrik ★★
()

Скорее всего, ты не делаешь ни XNextEvent, ни XFlush. Xlib кэширует твои запросы серверу. Кэш сбрасывается в сокет вызовом XFlush. Функция XNextEvent, перед переходом к ожиданию события, вызывает XFlush.

А программу свою можешь сюда запостить -- хотя бы ту ее часть, где идет ожидание событий.

nobody ★★
()

прога вот она (прошу прощения если слишком большая):

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xos.h> #include <X11/Xatom.h> #include <X11/keysym.h>

Display *dis; Window win; int scr;

GC gggg;

XEvent event;

int exit_=0;

int main() {

//Creating window dis=XOpenDisplay(NULL); win=XCreateSimpleWindow(dis, RootWindow(dis,0), 1, 1, 640, 480, 1, black, black/*WhitePixel(dis,0), WhitePixel(dis,0)*/);

//Creating graphical context gggg = XCreateGC(dis, win, 0, 0);

scr=DefaultScreen(dis); unsigned long black, white; black = BlackPixel (dis, scr); white = WhitePixel (dis,scr);

//Choosing types of events to process XSelectInput(dis, win, ExposureMask | KeyPressMask | ButtonPressMask);

//Infinite loop (displaying the window on the screen forever) while(!exit_) { //Displaying the window XMapWindow(dis,win);

XFlush(dis);

XSetForeground (dis, gggg, black); XSetBackground (dis, gggg, black);

XDrawString(dis, win, gggg, 5, 5, "Q", 1); XDrawRectangle(dis, win, gggg, 20, 20, 10, 10); XDrawLine (dis, win, gggg, 0,0,10,10);

//Processing the events (window resized, button pressed, mouse button pressed) XNextEvent(dis, &event); switch (event.type) { case Expose: XDrawString(dis, win, gggg, 50, 50 , "Exposed!!", 4); sleep(2); XClearWindow(dis, win); case KeyPress: if(XLookupKeysym(&event.xkey, 0) == XK_q) { XDrawString(dis, win, gggg, 300, 200, "QPressed!!", 10); sleep(2); XClearWindow(dis, win); exit_=1; } break; } }

return 1; }

anonymous
()

блин, сорри, красные строки куда то похерились, надеюсь разберётесь.

anonymous
()

> На сколько я знаю (я знаю я мало). Мне кажется что косяк у тебя вот 
> где. В перерисовке. Т.е. Надо вешаться на expose_event. И там 
> отрисовывать всякий раз одно и тоже что там тебе нужно.

это если нужен перманентный контент.

вообще _перед первым рисованием в окне надо дождаться ExposeEvent_

то есть что то типа:

MapWindow(..);
/* Wait for exposure */
while (NextEvent(&event) && event.type != ExposeEvent)
  ;
DrawString(...);

lg ★★
()
Ответ на: комментарий от AVI

Gartner: Windows на ПК обходится дешевле, чем Linux

2AVI
>Глупое наверно замечание, но почему в GC и Foreground и Background черные?

Дык "темнота - друг молодежи" ;)))

sS ★★★★★
()

То что в GC фон черный -- хрен с ним. Главное здесь -- фон для окна. Черный текст на черном фоне -- вот это интересно. А вообще-то оно даже компилиться не должно.

Сначала:
win = XCreateSimpleWindow(dis, RootWindow(dis,0), 1, 1, 640, 480, 1, black, black);

А уже потом:
unsigned long black, white;
black = BlackPixel (dis, scr);
white = WhitePixel (dis,scr);

То есть на момент создания окна символ black в программе вообще не определен. Как компилятор может передать функции переменную, которой нет?

nobody ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.