305 lines
8.2 KiB
C
305 lines
8.2 KiB
C
|
#include "evas_test_main.h"
|
||
|
|
||
|
#include <X11/XCB/xcb.h>
|
||
|
#include <X11/XCB/xcb_icccm.h>
|
||
|
|
||
|
#include "Evas.h"
|
||
|
#include "Evas_Engine_Software_Xcb.h"
|
||
|
|
||
|
|
||
|
|
||
|
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 pause_me = 0;
|
||
|
XCBConnection *conn;
|
||
|
XCBDRAWABLE win;
|
||
|
XCBSCREEN *screen;
|
||
|
XCBGenericEvent *e;
|
||
|
CARD32 mask;
|
||
|
CARD32 value[6];
|
||
|
/* XClassHint chint; */
|
||
|
SizeHints *szhints;
|
||
|
|
||
|
conn = XCBConnectBasic ();
|
||
|
if (!conn)
|
||
|
{
|
||
|
printf("Error: cannot open a connection.\n");
|
||
|
exit(-1);
|
||
|
}
|
||
|
|
||
|
screen = XCBConnSetupSuccessRepRootsIter (XCBGetSetup(conn)).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 | StructureNotifyMask;
|
||
|
value[5] = screen->default_colormap.xid;
|
||
|
|
||
|
win.window = XCBWINDOWNew(conn);
|
||
|
XCBCreateWindow (conn,
|
||
|
get_depth(conn, screen),
|
||
|
win.window, screen->root,
|
||
|
0, 0,
|
||
|
win_w, win_h,
|
||
|
0,
|
||
|
InputOutput,
|
||
|
screen->root_visual,
|
||
|
mask, value);
|
||
|
|
||
|
/* XStoreName(disp, win, "Evas Software X11 Test"); */
|
||
|
/* chint.res_name = "Evas_Software_X11_Test"; */
|
||
|
/* chint.res_class = "Main"; */
|
||
|
/* SetClassHint(disp, win, &chint); */
|
||
|
#if 0
|
||
|
szhints = AllocSizeHints();
|
||
|
SizeHintsSetMinSize(szhints, win_w, win_h);
|
||
|
SizeHintsSetMaxSize(szhints, win_w, win_h);
|
||
|
SizeHintsSetSize(szhints, 0, win_w, win_h);
|
||
|
SetWMNormalHints(conn, win.window, szhints);
|
||
|
FreeSizeHints(szhints);
|
||
|
#endif
|
||
|
XCBMapWindow (conn, win.window);
|
||
|
XCBSync(conn, 0);
|
||
|
|
||
|
/* test evas_free.... :) */
|
||
|
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 = conn;
|
||
|
einfo->info.visual = get_visual (conn, screen);
|
||
|
einfo->info.colormap = screen->default_colormap;
|
||
|
einfo->info.drawable = win;
|
||
|
einfo->info.depth = get_depth(conn, screen);
|
||
|
einfo->info.rotation = 0;
|
||
|
einfo->info.debug = 0;
|
||
|
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
||
|
}
|
||
|
setup();
|
||
|
printf("################ evas free\n");
|
||
|
evas_free(evas);
|
||
|
printf("evas freed. DONE\n");
|
||
|
|
||
|
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 = conn;
|
||
|
einfo->info.visual = get_visual (conn, screen);
|
||
|
einfo->info.colormap = screen->default_colormap;
|
||
|
einfo->info.drawable = win;
|
||
|
einfo->info.depth = get_depth(conn, screen);
|
||
|
einfo->info.rotation = 0;
|
||
|
einfo->info.debug = 0;
|
||
|
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
||
|
}
|
||
|
setup();
|
||
|
printf("################ evas free\n");
|
||
|
evas_free(evas);
|
||
|
printf("evas freed. DONE\n");
|
||
|
|
||
|
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 = conn;
|
||
|
einfo->info.visual = get_visual (conn, screen);
|
||
|
einfo->info.colormap = screen->default_colormap;
|
||
|
einfo->info.drawable = win;
|
||
|
einfo->info.depth = get_depth(conn, screen);
|
||
|
einfo->info.rotation = 0;
|
||
|
einfo->info.debug = 0;
|
||
|
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
||
|
}
|
||
|
setup();
|
||
|
printf("################ evas free\n");
|
||
|
evas_free(evas);
|
||
|
printf("evas freed. DONE\n");
|
||
|
|
||
|
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 = conn;
|
||
|
einfo->info.visual = get_visual (conn, screen);
|
||
|
einfo->info.colormap = screen->default_colormap;
|
||
|
einfo->info.drawable = win;
|
||
|
einfo->info.depth = get_depth(conn, screen);
|
||
|
einfo->info.rotation = 0;
|
||
|
einfo->info.debug = 0;
|
||
|
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
||
|
}
|
||
|
setup();
|
||
|
printf("################ evas free\n");
|
||
|
evas_free(evas);
|
||
|
printf("evas freed. DONE\n");
|
||
|
|
||
|
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 = conn;
|
||
|
einfo->info.visual = get_visual (conn, screen);
|
||
|
einfo->info.colormap = screen->default_colormap;
|
||
|
einfo->info.drawable = win;
|
||
|
einfo->info.depth = get_depth(conn, screen);
|
||
|
einfo->info.rotation = 0;
|
||
|
einfo->info.debug = 0;
|
||
|
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
||
|
}
|
||
|
setup();
|
||
|
orig_start_time = start_time = get_time();
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
e = XCBPollForEvent(conn, NULL);
|
||
|
|
||
|
if (e) {
|
||
|
switch (e->response_type)
|
||
|
{
|
||
|
case XCBButtonPress: {
|
||
|
XCBButtonPressEvent *ev = (XCBButtonPressEvent *)e;
|
||
|
|
||
|
if ((ev->state | Button3Mask) == Button3Mask)
|
||
|
exit(0);
|
||
|
#if 0
|
||
|
if (!pause_me)
|
||
|
pause_me = 1;
|
||
|
else if (pause_me == 1)
|
||
|
pause_me = 2;
|
||
|
else
|
||
|
pause_me = 1;
|
||
|
#endif
|
||
|
evas_event_feed_mouse_move(evas, ev->event_x, ev->event_y, NULL);
|
||
|
evas_event_feed_mouse_down(evas, ev->state, EVAS_BUTTON_NONE, NULL);
|
||
|
break;
|
||
|
}
|
||
|
case XCBButtonRelease: {
|
||
|
XCBButtonReleaseEvent *ev = (XCBButtonReleaseEvent *)e;
|
||
|
|
||
|
evas_event_feed_mouse_move(evas, ev->event_x, ev->event_y, NULL);
|
||
|
evas_event_feed_mouse_up(evas, ev->state, EVAS_BUTTON_NONE, NULL);
|
||
|
break;
|
||
|
}
|
||
|
case XCBMotionNotify: {
|
||
|
XCBMotionNotifyEvent *ev = (XCBMotionNotifyEvent *)e;
|
||
|
|
||
|
evas_event_feed_mouse_move(evas, ev->event_x, ev->event_y, NULL);
|
||
|
break;
|
||
|
}
|
||
|
case Expose: {
|
||
|
XCBExposeEvent *ev = (XCBExposeEvent *)e;
|
||
|
|
||
|
evas_damage_rectangle_add(evas,
|
||
|
ev->x,
|
||
|
ev->y,
|
||
|
ev->width,
|
||
|
ev->height);
|
||
|
break;
|
||
|
}
|
||
|
case ConfigureNotify: {
|
||
|
XCBConfigureNotifyEvent *ev = (XCBConfigureNotifyEvent *)e;
|
||
|
|
||
|
evas_output_size_set(evas,
|
||
|
ev->width,
|
||
|
ev->height);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
free (e);
|
||
|
}
|
||
|
if (!(pause_me == 1))
|
||
|
{
|
||
|
loop();
|
||
|
evas_render(evas);
|
||
|
XCBFlush(conn);
|
||
|
}
|
||
|
if (pause_me == 2)
|
||
|
usleep(100000);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|