QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1989|回复: 4

XNextEvent的使用?

[复制链接]
发表于 2006-5-23 11:02:04 | 显示全部楼层 |阅读模式
XNextEvent使用没有效果,或者说它任何事件读不出来,总是阻塞.
请各位帮助!
发表于 2006-5-23 11:27:13 | 显示全部楼层
XNextEvent阻塞型的,有事件才下去。
[code:1]
#include <stdio.h>
#include <X11/Xlib.h>

create_win(Display *dpy,Window *win,int x, int y, int w, int h)
{
    int screen;
    screen=DefaultScreen(dpy);
    *win = XCreateSimpleWindow(dpy, RootWindow(dpy, screen),
            x, y, w, h, 2,BlackPixel(dpy, screen),WhitePixel(dpy, screen));

    XSelectInput(dpy,*win,KeyPressMask | KeyReleaseMask | ButtonPressMask
            | ButtonReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask
            | ButtonMotionMask | ExposureMask | StructureNotifyMask | ResizeRedirectMask
            | FocusChangeMask |OwnerGrabButtonMask);
    XMapWindow(dpy, *win);
    XMoveWindow(dpy,*win,x,y);
}

main()
{
    Display *dpy;
    XImage *image;
    Window win;
    XEvent event;
    int i;
    char c;

    dpy=XOpenDisplay(NULL);
    if(!dpy)
    {
                        printf("XOpenDisplay error\n");
                        return;
    }
    create_win(dpy,&win,200,200,400,300);
    while(1)
    {
                        XNextEvent(dpy, &event);
                        switch (event.type)
                        {
                    case KeyPress :                //按下键盘按键
                                i = XLookupString(&(event.xkey), &c, 1, NULL, NULL);
                                printf("KeyPress: %c\n",c);
                                if(c == 'q')
                            return;
                                break;
                    case  KeyRelease :                //释放键盘按键
                                i = XLookupString(&(event.xkey), &c, 1, NULL, NULL);
                                printf("KeyRelease: %c\n",c);
                                        break;
                    case  ButtonPress:                //按下鼠标键
                                        printf("ButtonPress\n");
                                        break;
                    case  ButtonRelease :        //释放鼠标键
                                        printf("ButtonRelease\n");
                                        break;
                    case MotionNotify:        //鼠标在窗口上移动
                                        printf("MotionNotify\n");
                                        break;
                    case EnterNotify:        //指针进入窗口
                                        printf("EnterNotify\n");
                                        break;
                    case LeaveNotify:        //指针离开窗口
                                        printf("LeaveNotify\n");
                                        break;
                    case FocusIn:        //窗口得到焦点
                                        printf("FocusIn\n");
                                        break;
                    case FocusOut:        //窗口失去焦点
                                        printf("FocusOut\n");
                                        break;
                    case ResizeRequest:        //窗口大小改变
                                        printf("ResizeRequest\n");
                                        break;
                    case ConfigureNotify:        //窗口移动
                                        printf("ConfigureNotify\n");
                                        break;
                    default:
                                        printf("%d\n",event.type);
                                        break;
                        }
        }
}
[/code:1]
回复

使用道具 举报

发表于 2006-5-23 17:20:34 | 显示全部楼层
我记得使用前要出册观测什么Event,否则任何Event都不会传过来。
回复

使用道具 举报

发表于 2006-5-23 21:14:06 | 显示全部楼层
相当于Win32中的GetMessage(),PeekMessage()之类的函数。
回复

使用道具 举报

发表于 2006-5-24 09:15:08 | 显示全部楼层
XCheckEvents好像是不阻塞的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 16:26 , Processed in 0.043220 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表