246 lines
5.6 KiB
C
246 lines
5.6 KiB
C
#include <X11/XCB/xcb.h>
|
|
#include <X11/XCB/xcb_icccm.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <math.h>
|
|
#include <sys/time.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "Evas.h"
|
|
#include "Evas_Engine_Software_Xcb.h"
|
|
|
|
XCBConnection *c = NULL;
|
|
XCBDRAWABLE win;
|
|
|
|
Evas *evas = NULL;
|
|
|
|
int win_w = 240;
|
|
int win_h = 240;
|
|
|
|
XCBVISUALTYPE *
|
|
get_visual(XCBConnection *conn,
|
|
XCBSCREEN *root)
|
|
{
|
|
XCBDEPTH *d;
|
|
XCBVISUALTYPEIter iter;
|
|
int cur;
|
|
|
|
d = XCBSCREENAllowedDepthsIter(root).data;
|
|
if (!d) return NULL;
|
|
|
|
iter = XCBDEPTHVisualsIter(d);
|
|
for (cur = 0 ; cur < iter.rem ; XCBVISUALTYPENext(&iter), ++cur)
|
|
if (root->root_visual.id == iter.data->visual_id.id)
|
|
return iter.data;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int
|
|
get_depth(XCBConnection *conn,
|
|
XCBSCREEN *root)
|
|
{
|
|
XCBDRAWABLE drawable;
|
|
XCBGetGeometryRep *geom;
|
|
int depth;
|
|
|
|
drawable.window = root->root;
|
|
geom = XCBGetGeometryReply (conn, XCBGetGeometry(conn, drawable), 0);
|
|
|
|
if(!geom)
|
|
{
|
|
perror ("GetGeometry(root) failed");
|
|
exit (0);
|
|
}
|
|
|
|
depth = geom->depth;
|
|
free (geom);
|
|
|
|
return depth;
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
int exposed = 0;
|
|
|
|
XCBSCREEN *screen;
|
|
XCBGenericEvent *e;
|
|
CARD32 mask = 0;
|
|
CARD32 value[6];
|
|
/* XClassHint chint; */
|
|
SizeHints *szhints;
|
|
|
|
c = XCBConnectBasic ();
|
|
if (!c)
|
|
{
|
|
printf("Error: cannot open a connection.\n");
|
|
exit(-1);
|
|
}
|
|
|
|
screen = XCBConnSetupSuccessRepRootsIter (XCBGetSetup(c)).data;
|
|
|
|
mask = CWBackingStore | CWColormap |
|
|
CWBackPixmap | CWBorderPixel |
|
|
CWBitGravity | CWEventMask;
|
|
|
|
value[0] = None;
|
|
value[1] = 0;
|
|
value[2] = ForgetGravity;
|
|
value[3] = NotUseful;
|
|
value[4] = ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
|
|
value[5] = screen->default_colormap.xid;
|
|
|
|
win.window = XCBWINDOWNew(c);
|
|
XCBCreateWindow (c,
|
|
get_depth(c, screen),
|
|
win.window, screen->root,
|
|
0, 0,
|
|
win_w, win_h,
|
|
0,
|
|
InputOutput,
|
|
screen->root_visual,
|
|
mask, value);
|
|
|
|
/* XStoreName(disp, win, "Evas Performance Test"); */
|
|
/* chint.res_name = "Evas_Test"; */
|
|
/* chint.res_class = "Main"; */
|
|
/* XSetClassHint(disp, win, &chint); */
|
|
|
|
szhints = AllocSizeHints();
|
|
SizeHintsSetMinSize(szhints, win_w, win_h);
|
|
SizeHintsSetMaxSize(szhints, win_w, win_h);
|
|
SizeHintsSetSize(szhints, 0, win_w, win_h);
|
|
SetWMNormalHints(c, win.window, szhints);
|
|
FreeSizeHints(szhints);
|
|
|
|
XCBMapWindow (c, win.window);
|
|
|
|
evas = evas_new();
|
|
evas_output_method_set(evas, evas_render_method_lookup("software_xcb"));
|
|
evas_output_size_set(evas, win_w, win_h);
|
|
evas_output_viewport_set(evas, 0, 0, win_w, win_h);
|
|
{
|
|
Evas_Engine_Info_Software_Xcb *einfo;
|
|
|
|
einfo = (Evas_Engine_Info_Software_Xcb *) evas_engine_info_get(evas);
|
|
|
|
/* the following is specific to the engine */
|
|
einfo->info.conn = c;
|
|
einfo->info.visual = get_visual (c, screen);
|
|
einfo->info.colormap = screen->default_colormap;
|
|
einfo->info.drawable = win;
|
|
einfo->info.depth = get_depth(c, screen);
|
|
einfo->info.rotation = 0;
|
|
|
|
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
e = XCBPollForEvent(c, NULL);
|
|
|
|
if (e)
|
|
{
|
|
switch (e->response_type)
|
|
{
|
|
case ButtonPress: {
|
|
XCBButtonPressEvent *ev = (XCBButtonPressEvent *)e;
|
|
|
|
/* evas_event_button_down(evas, ev->event_x, ev->event_y, ev->detail.id);*/
|
|
break;
|
|
}
|
|
case ButtonRelease: {
|
|
XCBButtonReleaseEvent *ev = (XCBButtonReleaseEvent *)e;
|
|
|
|
/* evas_event_button_up(evas, ev->event_x, ev->event_y, ev->detail.id);*/
|
|
break;
|
|
}
|
|
case MotionNotify: {
|
|
XCBMotionNotifyEvent *ev = (XCBMotionNotifyEvent *)e;
|
|
|
|
/* evas_event_move(evas, ev->event_x, ev->event_y);*/
|
|
break;
|
|
}
|
|
case Expose: {
|
|
XCBExposeEvent *ev = (XCBExposeEvent *)e;
|
|
|
|
exposed = 1;
|
|
evas_damage_rectangle_add(evas,
|
|
ev->x,
|
|
ev->y,
|
|
ev->width,
|
|
ev->height);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
evas_render(evas);
|
|
XCBFlush(c);
|
|
|
|
if (exposed)
|
|
{
|
|
Evas_Engine_Info_Software_Xcb *einfo;
|
|
Evas_Performance *perf;
|
|
char buf[4096];
|
|
char *data, *key;
|
|
static mode_t default_mode =
|
|
S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH |
|
|
S_IXOTH;
|
|
FILE *f;
|
|
|
|
data = NULL;
|
|
einfo =
|
|
(Evas_Engine_Info_Software_Xcb *) evas_engine_info_get(evas);
|
|
perf =
|
|
einfo->func.performance_new(evas, c,
|
|
get_visual (c, screen),
|
|
screen->default_colormap,
|
|
win,
|
|
get_depth(c, screen));
|
|
key = einfo->func.performance_key_get(perf);
|
|
snprintf(buf, sizeof(buf), "%s/.evas/%s", getenv("HOME"), key);
|
|
free(key);
|
|
f = fopen(buf, "r");
|
|
if (f)
|
|
{
|
|
char buf[4096];
|
|
size_t sz;
|
|
|
|
sz = fread(buf, 1, 4000, f);
|
|
if (sz > 0)
|
|
{
|
|
data = malloc(sz + 1);
|
|
if (data)
|
|
{
|
|
strncpy(data, buf, sz);
|
|
data[sz] = 0;
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|
|
if (data)
|
|
{
|
|
einfo->func.performance_build(perf, data);
|
|
einfo->func.performance_device_store(perf);
|
|
free(data);
|
|
}
|
|
else
|
|
{
|
|
printf("No cached performance values for your display.\n");
|
|
printf("Please run evas_perf_test to generate them.\n");
|
|
einfo->func.performance_free(perf);
|
|
exit(-1);
|
|
}
|
|
einfo->func.performance_free(perf);
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|