forked from enlightenment/efl
parent
581b0aa703
commit
772a1de220
|
@ -1,13 +1,18 @@
|
|||
#include <X11/XCB/xcb.h>
|
||||
#include <X11/XCB/xcb_icccm.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <math.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#define X_H /* make sure we aren't using symbols from X.h */
|
||||
|
||||
#include <X11/XCB/xcb.h>
|
||||
#include <X11/XCB/xcb_icccm.h>
|
||||
#include <X11/XCB/xcb_aux.h>
|
||||
|
||||
#include "Evas.h"
|
||||
#include "Evas_Engine_Software_Xcb.h"
|
||||
|
||||
|
@ -19,60 +24,86 @@ Evas *evas = NULL;
|
|||
int win_w = 240;
|
||||
int win_h = 240;
|
||||
|
||||
XCBSCREEN *
|
||||
get_screen (XCBConnection *c,
|
||||
int screen)
|
||||
|
||||
static void
|
||||
title_set (XCBConnection *c, XCBWINDOW win, const char *title)
|
||||
{
|
||||
XCBSCREENIter i;
|
||||
XCBInternAtomCookie cookie_encoding;
|
||||
XCBInternAtomCookie cookie_property;
|
||||
XCBInternAtomRep *rep;
|
||||
XCBATOM encoding;
|
||||
char *atom_name;
|
||||
|
||||
i = XCBConnSetupSuccessRepRootsIter(XCBGetSetup(c));
|
||||
for (; i.rem; --screen, XCBSCREENNext(&i))
|
||||
if (screen == 0)
|
||||
return i.data;
|
||||
atom_name = "UTF8_STRING";
|
||||
cookie_encoding = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name);
|
||||
atom_name = "_NET_WM_NAME";
|
||||
cookie_property = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name);
|
||||
|
||||
return NULL;
|
||||
rep = XCBInternAtomReply (c, cookie_encoding, NULL);
|
||||
encoding = rep->atom;
|
||||
free (rep);
|
||||
|
||||
rep = XCBInternAtomReply (c, cookie_property, NULL);
|
||||
|
||||
XCBChangeProperty(c, XCBPropModeReplace,
|
||||
win,
|
||||
rep->atom, encoding, 8, strlen (title), title);
|
||||
free (rep);
|
||||
}
|
||||
|
||||
XCBVISUALTYPE *
|
||||
get_visual(XCBConnection *conn,
|
||||
XCBSCREEN *root)
|
||||
static void
|
||||
class_set (XCBConnection *c, XCBWINDOW win, const char *name, const char *class)
|
||||
{
|
||||
XCBDEPTH *d;
|
||||
XCBVISUALTYPEIter iter;
|
||||
int cur;
|
||||
XCBInternAtomCookie cookie_encoding;
|
||||
XCBInternAtomCookie cookie_property;
|
||||
XCBInternAtomRep *rep;
|
||||
XCBATOM encoding;
|
||||
char *atom_name;
|
||||
char *class_str;
|
||||
char *s;
|
||||
int length_name;
|
||||
int length_class;
|
||||
|
||||
d = XCBSCREENAllowedDepthsIter(root).data;
|
||||
if (!d) return NULL;
|
||||
length_name = strlen (name);
|
||||
length_class = strlen (class);
|
||||
class_str = (char *)malloc (sizeof (char) * (length_name + length_class + 2));
|
||||
if (!class_str) return;
|
||||
s = class_str;
|
||||
memcpy (s, name, length_name);
|
||||
s += length_name;
|
||||
*s = '\0';
|
||||
s++;
|
||||
memcpy (s, class, length_class);
|
||||
s += length_class;
|
||||
*s = '\0';
|
||||
|
||||
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;
|
||||
atom_name = "UTF8_STRING";
|
||||
cookie_encoding = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name);
|
||||
atom_name = "_WM_CLASS";
|
||||
cookie_property = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
rep = XCBInternAtomReply (c, cookie_encoding, NULL);
|
||||
encoding = rep->atom;
|
||||
free (rep);
|
||||
|
||||
int
|
||||
get_depth(XCBConnection *conn,
|
||||
XCBSCREEN *root)
|
||||
{
|
||||
XCBDRAWABLE drawable;
|
||||
XCBGetGeometryRep *geom;
|
||||
int depth;
|
||||
rep = XCBInternAtomReply (c, cookie_property, NULL);
|
||||
|
||||
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;
|
||||
XCBChangeProperty(c, XCBPropModeReplace,
|
||||
win,
|
||||
rep->atom, encoding, 8, strlen (class_str), class_str);
|
||||
free (rep);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -84,7 +115,6 @@ main(int argc, char **argv)
|
|||
XCBGenericEvent *e;
|
||||
CARD32 mask = 0;
|
||||
CARD32 value[6];
|
||||
/* XClassHint chint; */
|
||||
SizeHints *szhints;
|
||||
int screen_nbr;
|
||||
|
||||
|
@ -95,34 +125,33 @@ main(int argc, char **argv)
|
|||
exit(-1);
|
||||
}
|
||||
|
||||
screen = get_screen (c, screen_nbr);
|
||||
screen = XCBAuxGetScreen (c, screen_nbr);
|
||||
|
||||
mask = CWBackingStore | CWColormap |
|
||||
CWBackPixmap | CWBorderPixel |
|
||||
CWBitGravity | CWEventMask;
|
||||
mask =
|
||||
XCBCWBackPixmap | XCBCWBorderPixel |
|
||||
XCBCWBitGravity | XCBCWBackingStore |
|
||||
XCBCWEventMask | XCBCWColormap;
|
||||
|
||||
value[0] = None;
|
||||
value[0] = XCBBackPixmapNone;
|
||||
value[1] = 0;
|
||||
value[2] = ForgetGravity;
|
||||
value[3] = NotUseful;
|
||||
value[4] = ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask;
|
||||
value[2] = XCBGravityBitForget;
|
||||
value[3] = XCBBackingStoreNotUseful;
|
||||
value[4] = XCBEventMaskExposure | XCBEventMaskButtonPress | XCBEventMaskButtonRelease | XCBEventMaskPointerMotion;
|
||||
value[5] = screen->default_colormap.xid;
|
||||
|
||||
win.window = XCBWINDOWNew(c);
|
||||
XCBCreateWindow (c,
|
||||
get_depth(c, screen),
|
||||
XCBAuxGetDepth(c, screen),
|
||||
win.window, screen->root,
|
||||
0, 0,
|
||||
win_w, win_h,
|
||||
0,
|
||||
InputOutput,
|
||||
XCBWindowClassInputOutput,
|
||||
screen->root_visual,
|
||||
mask, value);
|
||||
|
||||
/* XStoreName(disp, win, "Evas Performance Test"); */
|
||||
/* chint.res_name = "Evas_Test"; */
|
||||
/* chint.res_class = "Main"; */
|
||||
/* XSetClassHint(disp, win, &chint); */
|
||||
title_set (c, win.window, "Evas XCB Performance Test");
|
||||
class_set (c, win.window, "Evas_XCB_Perf_Test", "Main");
|
||||
|
||||
szhints = AllocSizeHints();
|
||||
SizeHintsSetMinSize(szhints, win_w, win_h);
|
||||
|
@ -145,10 +174,10 @@ main(int argc, char **argv)
|
|||
|
||||
/* the following is specific to the engine */
|
||||
einfo->info.conn = c;
|
||||
einfo->info.visual = get_visual (c, screen);
|
||||
einfo->info.visual = XCBAuxGetVisualtype(c, screen_nbr, screen->root_visual);
|
||||
einfo->info.colormap = screen->default_colormap;
|
||||
einfo->info.drawable = win;
|
||||
einfo->info.depth = get_depth(c, screen);
|
||||
einfo->info.depth = XCBAuxGetDepth(c, screen);
|
||||
einfo->info.rotation = 0;
|
||||
|
||||
evas_engine_info_set(evas, (Evas_Engine_Info *) einfo);
|
||||
|
@ -162,25 +191,25 @@ main(int argc, char **argv)
|
|||
{
|
||||
switch (e->response_type)
|
||||
{
|
||||
case ButtonPress: {
|
||||
case XCBButtonPress: {
|
||||
XCBButtonPressEvent *ev = (XCBButtonPressEvent *)e;
|
||||
|
||||
/* evas_event_button_down(evas, ev->event_x, ev->event_y, ev->detail.id);*/
|
||||
/* evas_event_button_down(evas, ev->event_x, ev->event_y, ev->detail.id);*/
|
||||
break;
|
||||
}
|
||||
case ButtonRelease: {
|
||||
case XCBButtonRelease: {
|
||||
XCBButtonReleaseEvent *ev = (XCBButtonReleaseEvent *)e;
|
||||
|
||||
/* evas_event_button_up(evas, ev->event_x, ev->event_y, ev->detail.id);*/
|
||||
break;
|
||||
}
|
||||
case MotionNotify: {
|
||||
case XCBMotionNotify: {
|
||||
XCBMotionNotifyEvent *ev = (XCBMotionNotifyEvent *)e;
|
||||
|
||||
/* evas_event_move(evas, ev->event_x, ev->event_y);*/
|
||||
/* evas_event_move(evas, ev->event_x, ev->event_y);*/
|
||||
break;
|
||||
}
|
||||
case Expose: {
|
||||
case XCBExpose: {
|
||||
XCBExposeEvent *ev = (XCBExposeEvent *)e;
|
||||
|
||||
exposed = 1;
|
||||
|
@ -214,10 +243,10 @@ main(int argc, char **argv)
|
|||
(Evas_Engine_Info_Software_Xcb *) evas_engine_info_get(evas);
|
||||
perf =
|
||||
einfo->func.performance_new(evas, c,
|
||||
get_visual (c, screen),
|
||||
XCBAuxGetVisualtype(c, screen_nbr, screen->root_visual),
|
||||
screen->default_colormap,
|
||||
win,
|
||||
get_depth(c, screen));
|
||||
XCBAuxGetDepth(c, screen));
|
||||
key = einfo->func.performance_key_get(perf);
|
||||
snprintf(buf, sizeof(buf), "%s/.evas/%s", getenv("HOME"), key);
|
||||
free(key);
|
||||
|
|
|
@ -1,80 +1,96 @@
|
|||
#include "evas_test_main.h"
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#define X_H /* make sure we aren't using symbols from X.h */
|
||||
|
||||
#include <X11/XCB/xcb.h>
|
||||
#include <X11/XCB/shm.h>
|
||||
#include <X11/XCB/render.h>
|
||||
#include <X11/XCB/xcb_aux.h>
|
||||
|
||||
#include "Evas.h"
|
||||
#include "Evas_Engine_XRender_Xcb.h"
|
||||
|
||||
|
||||
XCBSCREEN *
|
||||
get_screen (XCBConnection *c,
|
||||
int screen)
|
||||
{
|
||||
XCBSCREENIter iter;
|
||||
|
||||
iter = XCBConnSetupSuccessRepRootsIter (XCBGetSetup (c));
|
||||
for (; iter.rem; --screen, XCBSCREENNext (&iter))
|
||||
if (screen == 0)
|
||||
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;
|
||||
}
|
||||
|
||||
static void title_set (XCBConnection *conn, XCBWINDOW window, const char *title)
|
||||
static void
|
||||
title_set (XCBConnection *c, XCBWINDOW win, const char *title)
|
||||
{
|
||||
XCBInternAtomCookie cookie_encoding;
|
||||
XCBInternAtomCookie cookie_property;
|
||||
XCBInternAtomRep *rep;
|
||||
XCBATOM encoding;
|
||||
char *atom_name;
|
||||
|
||||
/* encoding */
|
||||
atom_name = "UTF8_STRING";
|
||||
rep = XCBInternAtomReply (conn,
|
||||
XCBInternAtom (conn,
|
||||
cookie_encoding = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name),
|
||||
NULL);
|
||||
atom_name);
|
||||
atom_name = "_NET_WM_NAME";
|
||||
cookie_property = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name);
|
||||
|
||||
rep = XCBInternAtomReply (c, cookie_encoding, NULL);
|
||||
encoding = rep->atom;
|
||||
free (rep);
|
||||
|
||||
/* ICCCM */
|
||||
/* SetWMName (f->xcb.c, f->xcb.draw.window, encoding, strlen (title), title); */
|
||||
rep = XCBInternAtomReply (c, cookie_property, NULL);
|
||||
|
||||
/* NETWM */
|
||||
atom_name = "_NET_WM_NAME";
|
||||
rep = XCBInternAtomReply (conn,
|
||||
XCBInternAtom (conn,
|
||||
XCBChangeProperty(c, XCBPropModeReplace,
|
||||
win,
|
||||
rep->atom, encoding, 8, strlen (title), title);
|
||||
free (rep);
|
||||
}
|
||||
|
||||
static void
|
||||
class_set (XCBConnection *c, XCBWINDOW win, const char *name, const char *class)
|
||||
{
|
||||
XCBInternAtomCookie cookie_encoding;
|
||||
XCBInternAtomCookie cookie_property;
|
||||
XCBInternAtomRep *rep;
|
||||
XCBATOM encoding;
|
||||
char *atom_name;
|
||||
char *class_str;
|
||||
char *s;
|
||||
int length_name;
|
||||
int length_class;
|
||||
|
||||
length_name = strlen (name);
|
||||
length_class = strlen (class);
|
||||
class_str = (char *)malloc (sizeof (char) * (length_name + length_class + 2));
|
||||
if (!class_str) return;
|
||||
s = class_str;
|
||||
memcpy (s, name, length_name);
|
||||
s += length_name;
|
||||
*s = '\0';
|
||||
s++;
|
||||
memcpy (s, class, length_class);
|
||||
s += length_class;
|
||||
*s = '\0';
|
||||
|
||||
atom_name = "UTF8_STRING";
|
||||
cookie_encoding = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name),
|
||||
NULL);
|
||||
XCBChangeProperty(conn, PropModeReplace,
|
||||
window,
|
||||
rep->atom, encoding, 8, strlen (title), title);
|
||||
atom_name);
|
||||
atom_name = "_WM_CLASS";
|
||||
cookie_property = XCBInternAtom (c,
|
||||
0,
|
||||
strlen (atom_name),
|
||||
atom_name);
|
||||
|
||||
rep = XCBInternAtomReply (c, cookie_encoding, NULL);
|
||||
encoding = rep->atom;
|
||||
free (rep);
|
||||
|
||||
rep = XCBInternAtomReply (c, cookie_property, NULL);
|
||||
|
||||
XCBChangeProperty(c, XCBPropModeReplace,
|
||||
win,
|
||||
rep->atom, encoding, 8, strlen (class_str), class_str);
|
||||
free (rep);
|
||||
}
|
||||
|
||||
|
@ -83,6 +99,8 @@ main(int argc, char **argv)
|
|||
{
|
||||
int pause_me = 0;
|
||||
XCBConnection *conn;
|
||||
const XCBQueryExtensionRep *rep_shm;
|
||||
const XCBQueryExtensionRep *rep_xrender;
|
||||
XCBSCREEN *screen;
|
||||
XCBDRAWABLE win;
|
||||
XCBGenericEvent *e;
|
||||
|
@ -97,31 +115,37 @@ main(int argc, char **argv)
|
|||
exit(-1);
|
||||
}
|
||||
|
||||
screen = get_screen (conn, screen_nbr);
|
||||
XCBPrefetchExtensionData (conn, &XCBShmId);
|
||||
XCBPrefetchExtensionData (conn, &XCBRenderId);
|
||||
rep_shm = XCBGetExtensionData(conn, &XCBShmId);
|
||||
rep_xrender = XCBGetExtensionData(conn, &XCBRenderId);
|
||||
|
||||
screen = XCBAuxGetScreen (conn, screen_nbr);
|
||||
|
||||
mask =
|
||||
XCBCWBackingStore | XCBCWColormap |
|
||||
XCBCWBackPixmap | XCBCWBorderPixel |
|
||||
XCBCWBitGravity | XCBCWEventMask;
|
||||
XCBCWBitGravity | XCBCWBackingStore |
|
||||
XCBCWEventMask | XCBCWColormap;
|
||||
|
||||
value[0] = None;
|
||||
value[0] = XCBBackPixmapNone;
|
||||
value[1] = 0;
|
||||
value[2] = ForgetGravity;
|
||||
value[3] = NotUseful;
|
||||
value[4] = ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask;
|
||||
value[2] = XCBGravityBitForget;
|
||||
value[3] = XCBBackingStoreNotUseful;
|
||||
value[4] = XCBEventMaskExposure | XCBEventMaskButtonPress | XCBEventMaskButtonRelease | XCBEventMaskPointerMotion | XCBEventMaskStructureNotify;
|
||||
value[5] = screen->default_colormap.xid;
|
||||
|
||||
win.window = XCBWINDOWNew(conn);
|
||||
XCBCreateWindow (conn,
|
||||
get_depth(conn, screen),
|
||||
XCBAuxGetDepth(conn, screen),
|
||||
win.window, screen->root,
|
||||
0, 0,
|
||||
win_w, win_h,
|
||||
0,
|
||||
InputOutput,
|
||||
XCBWindowClassInputOutput,
|
||||
screen->root_visual,
|
||||
mask, value);
|
||||
title_set (conn, win.window, "Evas XRender Xcb Test");
|
||||
class_set (conn, win.window, "Evas_XRender_XCB_Test", "Main");
|
||||
#if 0
|
||||
szhints.flags = PMinSize | PMaxSize | PSize | USSize;
|
||||
szhints.min_width = szhints.max_width = win_w;
|
||||
|
@ -196,7 +220,7 @@ main(int argc, char **argv)
|
|||
evas_event_feed_mouse_move(evas, ev->event_x, ev->event_y, 0, NULL);
|
||||
break;
|
||||
}
|
||||
case Expose: {
|
||||
case XCBExpose: {
|
||||
XCBExposeEvent *ev = (XCBExposeEvent *)e;
|
||||
|
||||
evas_damage_rectangle_add(evas,
|
||||
|
@ -206,7 +230,7 @@ main(int argc, char **argv)
|
|||
ev->height);
|
||||
break;
|
||||
}
|
||||
case ConfigureNotify: {
|
||||
case XCBConfigureNotify: {
|
||||
XCBConfigureNotifyEvent *ev = (XCBConfigureNotifyEvent *)e;
|
||||
|
||||
evas_output_size_set(evas,
|
||||
|
|
Loading…
Reference in New Issue