mirror of
https://github.com/brl/mutter.git
synced 2025-05-29 01:50:02 +00:00
Add glib event loop
This commit is contained in:
parent
aa2146acd3
commit
0809a5eb5c
9
ChangeLog
Normal file
9
ChangeLog
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
2005-03-22 mallum,,, <mallum@openedhand.com>
|
||||||
|
|
||||||
|
* cltr.c: (x_event_prepare), (x_event_check), (x_event_dispatch),
|
||||||
|
(cltr_dispatch_x_event), (cltr_init), (cltr_window_new),
|
||||||
|
(cltr_photo_grid_append_cell), (cltr_photo_grid_populate),
|
||||||
|
(cltr_photo_grid_redraw), (cltr_photo_grid_new),
|
||||||
|
(idle_cb), (main):
|
||||||
|
* cltr.h:
|
||||||
|
Add glib event loop
|
201
cltr.c
201
cltr.c
@ -24,6 +24,89 @@ struct ClutterWindow
|
|||||||
|
|
||||||
ClutterMainContext CltrCntx;
|
ClutterMainContext CltrCntx;
|
||||||
|
|
||||||
|
/* Event Loop Integration */
|
||||||
|
|
||||||
|
typedef void (*CltrXEventFunc) (XEvent *xev, gpointer user_data);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GSource source;
|
||||||
|
Display *display;
|
||||||
|
GPollFD event_poll_fd;
|
||||||
|
}
|
||||||
|
CltrXEventSource;
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
x_event_prepare (GSource *source,
|
||||||
|
gint *timeout)
|
||||||
|
{
|
||||||
|
Display *display = ((CltrXEventSource*)source)->display;
|
||||||
|
|
||||||
|
*timeout = -1;
|
||||||
|
|
||||||
|
return XPending (display);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
x_event_check (GSource *source)
|
||||||
|
{
|
||||||
|
CltrXEventSource *display_source = (CltrXEventSource*)source;
|
||||||
|
gboolean retval;
|
||||||
|
|
||||||
|
if (display_source->event_poll_fd.revents & G_IO_IN)
|
||||||
|
retval = XPending (display_source->display);
|
||||||
|
else
|
||||||
|
retval = FALSE;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
x_event_dispatch (GSource *source,
|
||||||
|
GSourceFunc callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
Display *display = ((CltrXEventSource*)source)->display;
|
||||||
|
CltrXEventFunc event_func = (CltrXEventFunc) callback;
|
||||||
|
|
||||||
|
XEvent xev;
|
||||||
|
|
||||||
|
if (XPending (display))
|
||||||
|
{
|
||||||
|
XNextEvent (display, &xev);
|
||||||
|
|
||||||
|
if (event_func)
|
||||||
|
(*event_func) (&xev, user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const GSourceFuncs x_event_funcs = {
|
||||||
|
x_event_prepare,
|
||||||
|
x_event_check,
|
||||||
|
x_event_dispatch,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
cltr_dispatch_x_event (XEvent *xevent,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
switch (xevent->type)
|
||||||
|
{
|
||||||
|
case MapNotify:
|
||||||
|
CLTR_DBG("Map Notify Event");
|
||||||
|
break;
|
||||||
|
case Expose:
|
||||||
|
CLTR_DBG("Expose");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
cltr_init(int *argc, char ***argv)
|
cltr_init(int *argc, char ***argv)
|
||||||
{
|
{
|
||||||
@ -39,6 +122,16 @@ cltr_init(int *argc, char ***argv)
|
|||||||
|
|
||||||
XVisualInfo *vinfo;
|
XVisualInfo *vinfo;
|
||||||
|
|
||||||
|
GMainContext *gmain_context;
|
||||||
|
int connection_number;
|
||||||
|
GSource *source;
|
||||||
|
CltrXEventSource *display_source;
|
||||||
|
|
||||||
|
/* Not just yet ..
|
||||||
|
g_thread_init (NULL);
|
||||||
|
XInitThreads ();
|
||||||
|
*/
|
||||||
|
|
||||||
if ((CltrCntx.xdpy = XOpenDisplay(getenv("DISPLAY"))) == NULL)
|
if ((CltrCntx.xdpy = XOpenDisplay(getenv("DISPLAY"))) == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -57,6 +150,33 @@ cltr_init(int *argc, char ***argv)
|
|||||||
|
|
||||||
CltrCntx.gl_context = glXCreateContext(CltrCntx.xdpy, vinfo, 0, True);
|
CltrCntx.gl_context = glXCreateContext(CltrCntx.xdpy, vinfo, 0, True);
|
||||||
|
|
||||||
|
/* g_main loop stuff */
|
||||||
|
|
||||||
|
gmain_context = g_main_context_default ();
|
||||||
|
|
||||||
|
g_main_context_ref (gmain_context);
|
||||||
|
|
||||||
|
connection_number = ConnectionNumber (CltrCntx.xdpy);
|
||||||
|
|
||||||
|
source = g_source_new ((GSourceFuncs *)&x_event_funcs,
|
||||||
|
sizeof (CltrXEventSource));
|
||||||
|
|
||||||
|
display_source = (CltrXEventSource *)source;
|
||||||
|
|
||||||
|
display_source->event_poll_fd.fd = connection_number;
|
||||||
|
display_source->event_poll_fd.events = G_IO_IN;
|
||||||
|
display_source->display = CltrCntx.xdpy;
|
||||||
|
|
||||||
|
g_source_add_poll (source, &display_source->event_poll_fd);
|
||||||
|
g_source_set_can_recurse (source, TRUE);
|
||||||
|
|
||||||
|
g_source_set_callback (source,
|
||||||
|
(GSourceFunc) cltr_dispatch_x_event,
|
||||||
|
NULL /* no userdata */, NULL);
|
||||||
|
|
||||||
|
g_source_attach (source, gmain_context);
|
||||||
|
g_source_unref (source);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +198,11 @@ cltr_window_new(int width, int height)
|
|||||||
0, 0, WhitePixel(CltrCntx.xdpy,
|
0, 0, WhitePixel(CltrCntx.xdpy,
|
||||||
CltrCntx.xscreen));
|
CltrCntx.xscreen));
|
||||||
|
|
||||||
|
XSelectInput(CltrCntx.xdpy, win->xwin,
|
||||||
|
StructureNotifyMask|ExposureMask|
|
||||||
|
ButtonPressMask|ButtonReleaseMask|PointerMotionMask|
|
||||||
|
PropertyChangeMask);
|
||||||
|
|
||||||
glXMakeCurrent(CltrCntx.xdpy, win->xwin, CltrCntx.gl_context);
|
glXMakeCurrent(CltrCntx.xdpy, win->xwin, CltrCntx.gl_context);
|
||||||
|
|
||||||
glViewport (0, 0, width, height);
|
glViewport (0, 0, width, height);
|
||||||
@ -95,7 +220,6 @@ cltr_window_new(int width, int height)
|
|||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
|
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
glOrtho (0, width, height, 0, -1, 1);
|
glOrtho (0, width, height, 0, -1, 1);
|
||||||
|
|
||||||
@ -114,12 +238,14 @@ cltr_window_new(int width, int height)
|
|||||||
void
|
void
|
||||||
cltr_main_loop()
|
cltr_main_loop()
|
||||||
{
|
{
|
||||||
XEvent xev;
|
GMainLoop *loop;
|
||||||
|
|
||||||
|
loop = g_main_loop_new (g_main_context_default (), FALSE);
|
||||||
|
|
||||||
|
CLTR_MARK();
|
||||||
|
|
||||||
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
XNextEvent(CltrCntx.xdpy, &xev);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* xxxxxxxxxxxxx */
|
/* xxxxxxxxxxxxx */
|
||||||
@ -296,10 +422,13 @@ cltr_photo_grid_redraw(ClutterPhotoGrid *grid)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
// glTranslatef( -2.5, 2.0, 0.0);
|
||||||
glScalef( Zoom, Zoom, Zoom);
|
glScalef( Zoom, Zoom, Zoom);
|
||||||
|
|
||||||
Zoom += 0.01;
|
Zoom += 0.01;
|
||||||
|
|
||||||
|
if (Zoom > 4.0) Zoom = 0.0;
|
||||||
|
|
||||||
cell = g_list_first(grid->cells_tail);
|
cell = g_list_first(grid->cells_tail);
|
||||||
|
|
||||||
while (rows--)
|
while (rows--)
|
||||||
@ -318,8 +447,8 @@ cltr_photo_grid_redraw(ClutterPhotoGrid *grid)
|
|||||||
thumb_w = (pixb->width / grid->n_cols);
|
thumb_w = (pixb->width / grid->n_cols);
|
||||||
thumb_h = (pixb->height / grid->n_rows);
|
thumb_h = (pixb->height / grid->n_rows);
|
||||||
|
|
||||||
ew_border = thumb_w/4;
|
ew_border = thumb_w/8;
|
||||||
ns_border = thumb_h/4;
|
ns_border = thumb_h/8;
|
||||||
|
|
||||||
thumb_w -= (2 * ew_border);
|
thumb_w -= (2 * ew_border);
|
||||||
thumb_h -= (2 * ns_border);
|
thumb_h -= (2 * ns_border);
|
||||||
@ -330,18 +459,11 @@ cltr_photo_grid_redraw(ClutterPhotoGrid *grid)
|
|||||||
x2 = x1 + thumb_w;
|
x2 = x1 + thumb_w;
|
||||||
y2 = y1 + thumb_h;
|
y2 = y1 + thumb_h;
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, grid->texs[i]);
|
|
||||||
|
|
||||||
/*
|
|
||||||
glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0,
|
|
||||||
(GLsizei)pixb->width,
|
|
||||||
(GLsizei)pixb->height,
|
|
||||||
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8,
|
|
||||||
pixb->data);
|
|
||||||
*/
|
|
||||||
tx = (float) pixb->width / grid->tex_w;
|
tx = (float) pixb->width / grid->tex_w;
|
||||||
ty = (float) pixb->height / grid->tex_h;
|
ty = (float) pixb->height / grid->tex_h;
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, grid->texs[i]);
|
||||||
|
|
||||||
glBegin (GL_QUADS);
|
glBegin (GL_QUADS);
|
||||||
glTexCoord2f (tx, ty); glVertex2i (x2, y2);
|
glTexCoord2f (tx, ty); glVertex2i (x2, y2);
|
||||||
glTexCoord2f (0, ty); glVertex2i (x1, y2);
|
glTexCoord2f (0, ty); glVertex2i (x1, y2);
|
||||||
@ -405,58 +527,42 @@ cltr_photo_grid_new(ClutterWindow *win,
|
|||||||
return grid;
|
return grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Bool
|
gboolean
|
||||||
get_xevent_timed(Display *dpy,
|
idle_cb(gpointer data)
|
||||||
XEvent *event_return,
|
|
||||||
struct timeval *tv)
|
|
||||||
{
|
{
|
||||||
if (tv->tv_usec == 0 && tv->tv_sec == 0)
|
ClutterPhotoGrid *grid = (ClutterPhotoGrid *)data;
|
||||||
{
|
|
||||||
XNextEvent(dpy, event_return);
|
|
||||||
return True;
|
|
||||||
}
|
|
||||||
|
|
||||||
XFlush(dpy);
|
cltr_photo_grid_redraw(grid);
|
||||||
|
|
||||||
if (XPending(dpy) == 0)
|
return TRUE;
|
||||||
{
|
|
||||||
int fd = ConnectionNumber(dpy);
|
|
||||||
fd_set readset;
|
|
||||||
FD_ZERO(&readset);
|
|
||||||
FD_SET(fd, &readset);
|
|
||||||
|
|
||||||
if (select(fd+1, &readset, NULL, NULL, tv) == 0)
|
|
||||||
return False;
|
|
||||||
else {
|
|
||||||
XNextEvent(dpy, event_return);
|
|
||||||
return True;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
XNextEvent(dpy, event_return);
|
|
||||||
return True;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
ClutterPhotoGrid *grid = NULL;
|
ClutterPhotoGrid *grid = NULL;
|
||||||
ClutterWindow *win = NULL;
|
ClutterWindow *win = NULL;
|
||||||
|
|
||||||
|
|
||||||
cltr_init(&argc, &argv);
|
cltr_init(&argc, &argv);
|
||||||
|
|
||||||
win = cltr_window_new(640, 480);
|
win = cltr_window_new(640, 480);
|
||||||
|
|
||||||
grid = cltr_photo_grid_new(win, 3, 3, argv[1]);
|
grid = cltr_photo_grid_new(win, 4, 4, argv[1]);
|
||||||
|
|
||||||
cltr_photo_grid_redraw(grid);
|
cltr_photo_grid_redraw(grid);
|
||||||
|
|
||||||
|
g_idle_add(idle_cb, grid);
|
||||||
|
|
||||||
XFlush(CltrCntx.xdpy);
|
XFlush(CltrCntx.xdpy);
|
||||||
|
|
||||||
XMapWindow(CltrCntx.xdpy, grid->parent->xwin);
|
XMapWindow(CltrCntx.xdpy, grid->parent->xwin);
|
||||||
|
|
||||||
|
XFlush(CltrCntx.xdpy);
|
||||||
|
|
||||||
|
cltr_main_loop();
|
||||||
|
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -464,6 +570,7 @@ main(int argc, char **argv)
|
|||||||
XFlush(CltrCntx.xdpy);
|
XFlush(CltrCntx.xdpy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user