Mercurial > MadButterfly
diff src/X_supp.c @ 77:a6763f080da5
-
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Wed, 20 Aug 2008 00:32:11 +0800 |
parents | |
children | 3645e29e4986 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/X_supp.c Wed Aug 20 00:32:11 2008 +0800 @@ -0,0 +1,107 @@ +#include <stdio.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include "redraw_man.h" +#include "mb_timer.h" + + +/*! \brief Dispatch all events in the queue. + */ +static void handle_x_event(Display *display, + redraw_man_t *rdman, + mb_tman_t *tman) { + XEvent evt; + XMotionEvent *mevt; + mouse_event_t mouse_event; + shape_t *shape; + subject_t *subject; + ob_factory_t *factory; + co_aix x, y; + int in_stroke; + int but; + int r; + + while(XEventsQueued(display, QueuedAfterReading) > 0) { + r = XNextEvent(display, &evt); + if(r == -1) + break; + + switch(evt.type) { + case MotionNotify: + mevt = (XMotionEvent *)&evt; + x = mevt->x; + y = mevt->y; + but = 0; + if(mevt->state & Button1Mask) + but |= MOUSE_BUT1; + if(mevt->state & Button2Mask) + but |= MOUSE_BUT2; + if(mevt->state & Button3Mask) + but |= MOUSE_BUT3; + + mouse_event.event.type = EVT_MOUSE_MOVE; + mouse_event.x = x; + mouse_event.y = y; + mouse_event.button = but; + + shape = find_shape_at_pos(rdman, x, y, + &in_stroke); + subject = sh_get_mouse_event_subject(shape); + factory = rdman_get_ob_factory(rdman); + + subject_notify(factory, subject, (event_t *)&mouse_event); + break; + + case Expose: + rdman_redraw_area(rdman, evt.xexpose.x, evt.xexpose.y, + evt.xexpose.width, evt.xexpose.height); + break; + } + } + rdman_redraw_changed(rdman); + XFlush(display); +} + +/*! \brief Handle connection coming data and timeout of timers. + */ +void X_handle_connection(Display *display, + redraw_man_t *rdman, + mb_tman_t *tman) { + int fd; + mb_timeval_t now, tmo; + struct timeval tv; + fd_set rfds; + int nfds; + int r; + + fd = XConnectionNumber(display); + nfds = fd + 1; + while(1) { + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + get_now(&now); + r = mb_tman_next_timeout(tman, &now, &tmo); + + if(r == 0) { + tv.tv_sec = MB_TIMEVAL_SEC(&tmo); + tv.tv_usec = MB_TIMEVAL_USEC(&tmo); + r = select(nfds, &rfds, NULL, NULL, &tv); + } else + r = select(nfds, &rfds, NULL, NULL, NULL); + + if(r == -1) { + perror("select"); + break; + } + + if(r == 0) { + get_now(&now); + mb_tman_handle_timeout(tman, &now); + rdman_redraw_changed(rdman); + XFlush(display); + } else if(FD_ISSET(fd, &rfds)){ + handle_x_event(display, rdman, tman); + } + } +}