CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): touch (남 기 원)
날 짜 (Date): 1996년07월19일(금) 14시19분49초 KDT
제 목(Title): [A] X 프로그래밍에서...


앞에 대답이 있기는 하지만, 간단히 그려보고 싶은 것이 있는데

while loop을 돌리기 귀찮은 경우를 위해 다른 방법을 제시하고자 합니다.

다음과 같이 XIfEvent라는 함수를 이용하는 방법이 있습니다.

XIfEvent는 인자로 지정된 함수가 TRUE를 리턴할 때까지 이벤트를 읽어들입니다.

따라서 일반적으로 윈도우가 실제로 화면에 만들어질 때까지를 기다린다든가

할 때 많이 사용됩니다.

예: XIfEvent(d, &event, waitForMapNotify, (char *) w);

이것을 조금 변경하여 최초의 Expose 이벤트를 취하는 루틴을 만들 수 있습니다.

다음 예를 참고하십시요.

-------------------------------------------------------------------------------

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

Bool    waitForMapNotify(Display *, XEvent *, char *);
Bool    waitForExposure(Display *, XEvent *, char *);

void    main()
{
        Display         *d;
        Window          w;
        GC              gc;
        unsigned long   foreground, background;
        XEvent          event;

        d = XOpenDisplay(NULL);
        foreground = WhitePixel(d, 0);
        background = BlackPixel(d, 0);

        w = XCreateSimpleWindow(d, DefaultRootWindow(d),
                                0, 0, 100, 100, 5, foreground, background);
        XSelectInput(d, w, ExposureMask | StructureNotifyMask |
            KeyPressMask | KeyReleaseMask |
            ButtonPressMask | ButtonMotionMask | ButtonReleaseMask); /* 중요 */

        gc = XCreateGC(d, w, 0 ,0);
        XSetForeground(d, gc, foreground);

        XMapWindow(d, w);
        /* XIfEvent(d, &event, waitForMapNotify, (char *) w); */ /* <참고> */
        XIfEvent(d, &event, waitForExposure, (char *) w); /* 이것입니다 */

        XDrawLine(d, w, gc, 0, 0, 50, 50);
        XFlush(d);

        getchar();
}

Bool    waitForMapNotify(Display *dpy, XEvent *event, char *arg)
{
        return (event->type == MapNotify &&
                event->xmap.window == (Window) arg);
}

Bool    waitForExposure(Display *dpy, XEvent *event, char *arg)
{
        return (event->type == Expose &&
                event->xexpose.window == (Window) arg);
}

-------------------------------------------------------------------------------

XSelectInput에서 StructureNotifyMask를 선택한 이유는 만일 waitForMapNotify를

사용하고자 할 경우를 위한 것이니까 별로 신경쓰실 필요 없습니다.

여기서는 해줘도 그만이고 안해줘도 그만이거든요.

근데, 한번 Expose 이벤트를 읽어들인 후에는 더 이상 이벤트를 읽지 않으므로

그냥 그리라고만 해서는 그림이 제대로 그려지지 않습니다.

따라서 XFlush를 수행하여 큐에 들어간 것을 모두 flush하도록 해주어야 합니다.


[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.