124 lines
2.6 KiB
C
124 lines
2.6 KiB
C
#include "cltr-window.h"
|
|
#include "cltr-private.h"
|
|
|
|
static gboolean
|
|
cltr_window_handle_xevent (CltrWidget *widget, XEvent *xev);
|
|
|
|
static void
|
|
cltr_window_show(CltrWidget *widget);
|
|
|
|
static void
|
|
cltr_window_paint(CltrWidget *widget);
|
|
|
|
struct CltrWindow
|
|
{
|
|
CltrWidget widget;
|
|
Window xwin;
|
|
CltrWidget *focused_child;
|
|
};
|
|
|
|
CltrWidget*
|
|
cltr_window_new(int width, int height)
|
|
{
|
|
ClutterMainContext *ctx = CLTR_CONTEXT();
|
|
CltrWindow *win;
|
|
|
|
win = util_malloc0(sizeof(CltrWindow));
|
|
|
|
win->widget.width = width;
|
|
win->widget.height = height;
|
|
win->widget.show = cltr_window_show;
|
|
win->widget.paint = cltr_window_paint;
|
|
win->widget.xevent_handler = cltr_window_handle_xevent;
|
|
|
|
win->xwin = XCreateSimpleWindow(CltrCntx.xdpy,
|
|
CltrCntx.xwin_root,
|
|
0, 0,
|
|
width, height,
|
|
0, 0, WhitePixel(CltrCntx.xdpy,
|
|
CltrCntx.xscreen));
|
|
|
|
XSelectInput(CltrCntx.xdpy, win->xwin,
|
|
StructureNotifyMask|ExposureMask|
|
|
KeyPressMask|PropertyChangeMask);
|
|
|
|
glXMakeCurrent(CltrCntx.xdpy, win->xwin, CltrCntx.gl_context);
|
|
|
|
/* All likely better somewhere else */
|
|
|
|
/* view port */
|
|
glViewport (0, 0, width, height);
|
|
glMatrixMode (GL_PROJECTION);
|
|
glLoadIdentity ();
|
|
glOrtho (0, width, height, 0, -1, 1); /* 2d */
|
|
glMatrixMode (GL_MODELVIEW);
|
|
glLoadIdentity ();
|
|
|
|
ctx->window = CLTR_WIDGET(win);
|
|
|
|
return CLTR_WIDGET(win);
|
|
}
|
|
|
|
static void
|
|
cltr_window_show(CltrWidget *widget)
|
|
{
|
|
ClutterMainContext *ctx = CLTR_CONTEXT();
|
|
CltrWindow *win = CLTR_WINDOW(widget);
|
|
|
|
/* XXX set focused call */
|
|
if (widget->children)
|
|
{
|
|
if (win->focused_child == NULL)
|
|
win->focused_child = g_list_nth_data(widget->children, 0);
|
|
}
|
|
|
|
XMapWindow(ctx->xdpy, win->xwin);
|
|
}
|
|
|
|
static void
|
|
cltr_window_paint(CltrWidget *widget)
|
|
{
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
glClearColor( 0.0, 0.0, 0.0, 0.0 ); /* needed for saturate to work */
|
|
|
|
}
|
|
|
|
static gboolean
|
|
cltr_window_handle_xevent (CltrWidget *widget, XEvent *xev)
|
|
{
|
|
CltrWindow *win = CLTR_WINDOW(widget);
|
|
|
|
/* XXX handle exposes here too */
|
|
|
|
if (xev->type == Expose)
|
|
{
|
|
cltr_widget_queue_paint(widget);
|
|
}
|
|
|
|
/* XXX Very basic - assumes we are only interested in mouse clicks */
|
|
if (win->focused_child)
|
|
return cltr_widget_handle_xevent(win->focused_child, xev);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* window only methods */
|
|
|
|
Window
|
|
cltr_window_xwin(CltrWindow *win)
|
|
{
|
|
return win->xwin;
|
|
}
|
|
|
|
Window
|
|
cltr_window_focus_widget(CltrWindow *win, CltrWidget *widget)
|
|
{
|
|
/* XXX Should check widget is an actual child of the window */
|
|
|
|
ClutterMainContext *ctx = CLTR_CONTEXT();
|
|
|
|
win->focused_child = widget;
|
|
}
|
|
|
|
|