From: <enl...@li...> - 2004-02-21 20:56:44
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_window_prop.c Log Message: Fetch AnyPropertyType from application =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.36 retrieving revision 1.37 diff -u -3 -r1.36 -r1.37 --- Ecore_X.h 21 Feb 2004 08:58:20 -0000 1.36 +++ Ecore_X.h 21 Feb 2004 20:44:37 -0000 1.37 @@ -734,7 +734,8 @@ void ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h); void ecore_x_window_cursor_show(Ecore_X_Window win, int show); void ecore_x_window_defaults_set(Ecore_X_Window win); - + +Ecore_X_Atom ecore_x_window_prop_any_type(void); void ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number); int ecore_x_window_prop_property_get(Ecore_X_Window win, Ecore_X_Atom property, Ecore_X_Atom type, int size, unsigned char **data, int *num); void ecore_x_window_prop_property_del(Ecore_X_Window win, Ecore_X_Atom property); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window_prop.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -3 -r1.36 -r1.37 --- ecore_x_window_prop.c 20 Feb 2004 07:06:29 -0000 1.36 +++ ecore_x_window_prop.c 21 Feb 2004 20:44:37 -0000 1.37 @@ -6,6 +6,12 @@ static Ecore_X_Atom _ecore_x_window_prop_state_atom_get(Ecore_X_Window_State s); +Ecore_X_Atom +ecore_x_window_prop_any_type(void) +{ + return AnyPropertyType; +} + /** * To be documented. * |
From: <enl...@li...> - 2004-02-21 21:21:19
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_window.c Log Message: ecore_x_window_geometry_get() added =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.37 retrieving revision 1.38 diff -u -3 -r1.37 -r1.38 --- Ecore_X.h 21 Feb 2004 20:44:37 -0000 1.37 +++ Ecore_X.h 21 Feb 2004 21:09:12 -0000 1.38 @@ -732,6 +732,7 @@ void ecore_x_window_lower(Ecore_X_Window win); void ecore_x_window_reparent(Ecore_X_Window win, Ecore_X_Window new_parent, int x, int y); void ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h); +void ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h); void ecore_x_window_cursor_show(Ecore_X_Window win, int show); void ecore_x_window_defaults_set(Ecore_X_Window win); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- ecore_x_window.c 20 Feb 2004 07:06:29 -0000 1.12 +++ ecore_x_window.c 21 Feb 2004 21:09:13 -0000 1.13 @@ -389,6 +389,37 @@ * FIXME: To be fixed. */ void +ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h) +{ + Window dummy_win; + int ret_x, ret_y; + unsigned int ret_w, ret_h, dummy_border, dummy_depth; + + if (!win) + win = DefaultRootWindow(_ecore_x_disp); + ret_w = 0; + ret_h = 0; + if (!XGetGeometry(_ecore_x_disp, win, &dummy_win, &ret_x, &ret_y, + &ret_w, &ret_h, &dummy_border, &dummy_depth)) + { + ret_x = 0; + ret_y = 0; + ret_w = 0; + ret_h = 0; + } + + if (x) *x = ret_x; + if (y) *y = ret_y; + if (w) *w = (int) ret_w; + if (h) *h = (int) ret_h; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +void ecore_x_window_cursor_show(Ecore_X_Window win, int show) { if (win == 0) win = DefaultRootWindow(_ecore_x_disp); |
From: <enl...@li...> - 2004-02-21 21:56:59
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x.c ecore_x_pixmap.c ecore_x_window.c Log Message: Added generic functions to fetch geometry, border width and depth for a drawable, and wrapper functions for windows and pixmaps (overrides previous commit) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.38 retrieving revision 1.39 diff -u -3 -r1.38 -r1.39 --- Ecore_X.h 21 Feb 2004 21:09:12 -0000 1.38 +++ Ecore_X.h 21 Feb 2004 21:44:48 -0000 1.39 @@ -733,6 +733,8 @@ void ecore_x_window_reparent(Ecore_X_Window win, Ecore_X_Window new_parent, int x, int y); void ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h); void ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h); +int ecore_x_window_border_size_get(Ecore_X_Window win); +int ecore_x_window_depth_get(Ecore_X_Window win); void ecore_x_window_cursor_show(Ecore_X_Window win, int show); void ecore_x_window_defaults_set(Ecore_X_Window win); @@ -794,6 +796,8 @@ Ecore_X_Pixmap ecore_x_pixmap_new(Ecore_X_Window win, int w, int h, int dep); void ecore_x_pixmap_del(Ecore_X_Pixmap pmap); void ecore_x_pixmap_paste(Ecore_X_Pixmap pmap, Ecore_X_Drawable dest, Ecore_X_GC gc, int sx, int sy, int w, int h, int dx, int dy); +void ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h); +int ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap); Ecore_X_GC ecore_x_gc_new(Ecore_X_Drawable draw); void ecore_x_gc_del(Ecore_X_GC gc); @@ -801,7 +805,9 @@ /* FIXME: these funcs need categorising */ - + void ecore_x_drawable_geometry_get(Ecore_X_Drawable d, int *x, int *y, int *w, int *h); + int ecore_x_drawable_border_width_get(Ecore_X_Drawable d); + int ecore_x_drawable_depth_get(Ecore_X_Drawable d); Ecore_X_Window *ecore_x_window_root_list(int *num_ret); int ecore_x_window_manage(Ecore_X_Window win); void ecore_x_window_container_manage(Ecore_X_Window win); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- ecore_x.c 21 Feb 2004 08:58:20 -0000 1.30 +++ ecore_x.c 21 Feb 2004 21:44:48 -0000 1.31 @@ -746,6 +746,56 @@ /* FIXME: these funcs need categorising */ /*****************************************************************************/ +void +ecore_x_drawable_geometry_get(Ecore_X_Drawable d, int *x, int *y, int *w, int *h) +{ + Window dummy_win; + int ret_x, ret_y; + unsigned int ret_w, ret_h, dummy_border, dummy_depth; + + if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &ret_x, &ret_y, + &ret_w, &ret_h, &dummy_border, &dummy_depth)) + { + ret_x = 0; + ret_y = 0; + ret_w = 0; + ret_h = 0; + } + + if (x) *x = ret_x; + if (y) *y = ret_y; + if (w) *w = (int) ret_w; + if (h) *h = (int) ret_h; +} + +int +ecore_x_drawable_border_width_get(Ecore_X_Drawable d) +{ + Window dummy_win; + int dummy_x, dummy_y; + unsigned int dummy_w, dummy_h, border_ret, dummy_depth; + + if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &dummy_x, &dummy_y, + &dummy_w, &dummy_h, &border_ret, &dummy_depth)) + border_ret = 0; + + return (int) border_ret; +} + +int +ecore_x_drawable_depth_get(Ecore_X_Drawable d) +{ + Window dummy_win; + int dummy_x, dummy_y; + unsigned int dummy_w, dummy_h, dummy_border, depth_ret; + + if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &dummy_x, &dummy_y, + &dummy_w, &dummy_h, &dummy_border, &depth_ret)) + depth_ret = 0; + + return (int) depth_ret; +} + Ecore_X_Window * ecore_x_window_root_list(int *num_ret) { =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_pixmap.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore_x_pixmap.c 20 Feb 2004 07:06:29 -0000 1.3 +++ ecore_x_pixmap.c 21 Feb 2004 21:44:48 -0000 1.4 @@ -38,3 +38,27 @@ { XCopyArea(_ecore_x_disp, pmap, dest, gc, sx, sy, w, h, dx, dy); } + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +void +ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap, int *x, int *y, int *w, int *h) +{ + if (pmap) + ecore_x_drawable_geometry_get(pmap, x, y, w, h); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +int +ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap) +{ + return ecore_x_drawable_depth_get(pmap); +} + =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- ecore_x_window.c 21 Feb 2004 21:09:13 -0000 1.13 +++ ecore_x_window.c 21 Feb 2004 21:44:48 -0000 1.14 @@ -366,21 +366,12 @@ void ecore_x_window_size_get(Ecore_X_Window win, int *w, int *h) { - Window dummy_win; int dummy_x, dummy_y; - unsigned int ret_w, ret_h, dummy_border, dummy_depth; - if (win == 0) win = DefaultRootWindow(_ecore_x_disp); - ret_w = 0; - ret_h = 0; - if (!XGetGeometry(_ecore_x_disp, win, &dummy_win, &dummy_x, &dummy_y, - &ret_w, &ret_h, &dummy_border, &dummy_depth)) - { - ret_w = 0; - ret_h = 0; - } - if (w) *w = (int)ret_w; - if (h) *h = (int)ret_h; + if (win == 0) + win = DefaultRootWindow(_ecore_x_disp); + + ecore_x_drawable_geometry_get(win, &dummy_x, &dummy_y, w, h); } /** @@ -391,29 +382,34 @@ void ecore_x_window_geometry_get(Ecore_X_Window win, int *x, int *y, int *w, int *h) { - Window dummy_win; - int ret_x, ret_y; - unsigned int ret_w, ret_h, dummy_border, dummy_depth; - if (!win) win = DefaultRootWindow(_ecore_x_disp); - ret_w = 0; - ret_h = 0; - if (!XGetGeometry(_ecore_x_disp, win, &dummy_win, &ret_x, &ret_y, - &ret_w, &ret_h, &dummy_border, &dummy_depth)) - { - ret_x = 0; - ret_y = 0; - ret_w = 0; - ret_h = 0; - } - if (x) *x = ret_x; - if (y) *y = ret_y; - if (w) *w = (int) ret_w; - if (h) *h = (int) ret_h; + ecore_x_drawable_geometry_get(win, x, y, w, h); } - + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +int +ecore_x_window_border_width_get(Ecore_X_Window win) +{ + return ecore_x_drawable_border_width_get(win); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +int +ecore_x_window_depth_get(Ecore_X_Window win) +{ + return ecore_x_drawable_depth_get(win); +} + /** * To be documented. * |
From: <enl...@li...> - 2004-02-29 04:47:13
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x.c ecore_x_window.c Log Message: Implement more functions prerequisite to Xdnd - ecore_x_window_visible_get() <-- yeah, hard to believe it wasn't there - ecore_x_server_grab/ungrab <-- that too - ecore_x_window_at_xy_get() =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.39 retrieving revision 1.40 diff -u -3 -r1.39 -r1.40 --- Ecore_X.h 21 Feb 2004 21:44:48 -0000 1.39 +++ Ecore_X.h 29 Feb 2004 04:29:24 -0000 1.40 @@ -737,6 +737,8 @@ int ecore_x_window_depth_get(Ecore_X_Window win); void ecore_x_window_cursor_show(Ecore_X_Window win, int show); void ecore_x_window_defaults_set(Ecore_X_Window win); +int ecore_x_window_visible_get(Ecore_X_Window win); +Ecore_X_Window ecore_x_window_at_xy_get(int x, int y); Ecore_X_Atom ecore_x_window_prop_any_type(void); void ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number); @@ -866,6 +868,10 @@ ecore_x_keyboard_grab(Ecore_X_Window win); void ecore_x_keyboard_ungrab(void); + void + ecore_x_grab(void); + void + ecore_x_ungrab(void); #ifdef __cplusplus =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -3 -r1.31 -r1.32 --- ecore_x.c 21 Feb 2004 21:44:48 -0000 1.31 +++ ecore_x.c 29 Feb 2004 04:29:25 -0000 1.32 @@ -16,6 +16,7 @@ static void (**_ecore_x_event_handlers) (XEvent * event) = NULL; static int _ecore_x_init_count = 0; +static int _ecore_x_grab_count = 0; Display *_ecore_x_disp = NULL; double _ecore_x_double_click_time = 0.25; @@ -1161,12 +1162,34 @@ CurrentTime); } -void -ecore_x_keyboard_ungrab(void) +void ecore_x_keyboard_ungrab(void) { XUngrabKeyboard(_ecore_x_disp, CurrentTime); } +void +ecore_x_grab(void) +{ + _ecore_x_grab_count++; + + if (_ecore_x_grab_count == 1) + XGrabServer(_ecore_x_disp); +} + +void +ecore_x_ungrab(void) +{ + _ecore_x_grab_count--; + if (_ecore_x_grab_count < 0) + _ecore_x_grab_count = 0; + + if (_ecore_x_grab_count == 0) + { + XUngrabServer(_ecore_x_disp); + XSync(_ecore_x_disp, False); + } +} + /*****************************************************************************/ /*****************************************************************************/ /*****************************************************************************/ =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- ecore_x_window.c 21 Feb 2004 21:44:48 -0000 1.14 +++ ecore_x_window.c 29 Feb 2004 04:29:25 -0000 1.15 @@ -444,3 +444,73 @@ XDefineCursor(_ecore_x_disp, win, 0); } } + +/** + * To be documented. + * + * FIXME: To be fixed. + */ +int +ecore_x_window_visible_get(Ecore_X_Window win) +{ + XWindowAttributes attr; + + return (XGetWindowAttributes(_ecore_x_disp, win, &attr) && + (attr.map_state == IsViewable)); +} + +static Window +_ecore_x_window_at_xy_get(Window base, int bx, int by, int x, int y) +{ + Window *list = NULL; + Window parent_win = 0, child = 0, root_win = 0; + int i, wx, wy, ww, wh; + unsigned int num; + + if (!ecore_x_window_visible_get(base)) + return 0; + + ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh); + wx += bx; + wy += by; + + if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh)))) + return 0; + + if (!XQueryTree(_ecore_x_disp, base, &root_win, &parent_win, &list, &num)) + return base; + + if (list) + { + for (i = num - 1;; --i) + { + if ((child = _ecore_x_window_at_xy_get(list[i], wx, wy, x, y))) + { + XFree(list); + return child; + } + if (!i) + break; + } + XFree(list); + } + + return base; +} + +Ecore_X_Window +ecore_x_window_at_xy_get(int x, int y) +{ + Ecore_X_Window win, root; + + /* FIXME: Proper function to determine current root/virtual root + * window missing here */ + root = DefaultRootWindow(_ecore_x_disp); + + ecore_x_grab(); + win = _ecore_x_window_at_xy_get(root, 0, 0, x, y); + ecore_x_ungrab(); + + return win ? win : root; +} + |
From: <enl...@li...> - 2004-02-29 04:55:06
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_window.c Log Message: Add ecore_x_window_parent_get() =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.40 retrieving revision 1.41 diff -u -3 -r1.40 -r1.41 --- Ecore_X.h 29 Feb 2004 04:29:24 -0000 1.40 +++ Ecore_X.h 29 Feb 2004 04:37:18 -0000 1.41 @@ -739,6 +739,7 @@ void ecore_x_window_defaults_set(Ecore_X_Window win); int ecore_x_window_visible_get(Ecore_X_Window win); Ecore_X_Window ecore_x_window_at_xy_get(int x, int y); +Ecore_X_Window ecore_x_window_parent_get(Ecore_X_Window win); Ecore_X_Atom ecore_x_window_prop_any_type(void); void ecore_x_window_prop_property_set(Ecore_X_Window win, Ecore_X_Atom type, Ecore_X_Atom format, int size, void *data, int number); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- ecore_x_window.c 29 Feb 2004 04:29:25 -0000 1.15 +++ ecore_x_window.c 29 Feb 2004 04:37:18 -0000 1.16 @@ -514,3 +514,17 @@ return win ? win : root; } +Ecore_X_Window +ecore_x_window_parent_get(Ecore_X_Window win) +{ + Window root, parent, *children = NULL; + unsigned int num; + + if (!XQueryTree(_ecore_x_disp, win, &root, &parent, &children, &num)) + return 0; + if (children) + XFree(children); + + return parent; +} + |
From: <enl...@li...> - 2004-02-29 05:26:14
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore Modified Files: Ecore.h Log Message: Throw in a couple macros =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Ecore.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- Ecore.h 24 Feb 2004 19:45:01 -0000 1.5 +++ Ecore.h 29 Feb 2004 05:08:26 -0000 1.6 @@ -10,7 +10,11 @@ #ifdef __cplusplus extern "C" { #endif - + +/* Convenience macros */ +#define ECORE_MIN(x, y) (((x) > (y)) ? (y) : (x)) +#define ECORE_MAX(x, y) (((x) > (y)) ? (x) : (y)) + #define ECORE_EVENT_NONE 0 #define ECORE_EVENT_EXE_EXIT 1 /**< Spawned Exe has exit event */ #define ECORE_EVENT_SIGNAL_USER 2 /**< User signal event */ |
From: <enl...@li...> - 2004-02-29 08:33:41
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: ecore_x_dnd.c ecore_x_private.h ecore_x_window.c Log Message: Xdnd drag code... =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_dnd.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- ecore_x_dnd.c 21 Feb 2004 08:58:20 -0000 1.4 +++ ecore_x_dnd.c 29 Feb 2004 08:15:47 -0000 1.5 @@ -56,6 +56,7 @@ ecore_x_dnd_begin (Ecore_X_Window source, unsigned char *data, int size) { unsigned char *buf; + Atom _type_text_plain; /* FIXME: API-ize this stuff */ if (!ecore_x_dnd_version_get(source)) return 0; @@ -80,6 +81,11 @@ _xdnd->state = ECORE_X_DND_DRAGGING; _xdnd->time = _ecore_x_event_last_time; + /* TODO: Set supported data types in API */ + _type_text_plain = ecore_x_atom_get("text/plain"); + _xdnd->num_types = 1; + _xdnd->types = (Atom *) calloc(1, sizeof(Atom)); + _xdnd->types[0] = _type_text_plain; return 1; } @@ -134,3 +140,101 @@ XSendEvent(_ecore_x_disp, _xdnd->source, False, 0, &xev); } + +void +_ecore_x_dnd_drag(int x, int y) +{ + XEvent xev; + Ecore_X_Window win; + + /* Preinitialize XEvent struct */ + memset(&xev, 0, sizeof(XEvent)); + xev.xany.type = ClientMessage; + xev.xany.display = _ecore_x_disp; + xev.xclient.format = 32; + + /* Attempt to find a DND-capable window under the cursor */ + win = ecore_x_window_at_xy_get(x, y); + while ((win) && !(ecore_x_dnd_version_get(win))) + win = ecore_x_window_parent_get(win); + + /* Send XdndLeave to current destination window if we have left it */ + if ((win != _xdnd->dest) && (_xdnd->dest)) + { + xev.xclient.window = _xdnd->dest; + xev.xclient.message_type = _ecore_x_atom_xdnd_leave; + xev.xclient.data.l[0] = _xdnd->source; + + XSendEvent(_ecore_x_disp, _xdnd->dest, False, 0, &xev); + } + + if (win) + { + _xdnd->version = ECORE_MIN(ECORE_X_DND_VERSION, + ecore_x_dnd_version_get(win)); + if (win != _xdnd->dest) + { + int i; + + /* Entered new window, send XdndEnter */ + xev.xclient.window = win; + xev.xclient.message_type = _ecore_x_atom_xdnd_enter; + xev.xclient.data.l[0] = _xdnd->source; + if(_xdnd->num_types > 3) + xev.xclient.data.l[1] |= 0x1UL; + else + xev.xclient.data.l[1] &= 0xfffffffeUL; + xev.xclient.data.l[1] |= ((unsigned long) _xdnd->version) << 24; + + for (i = 0; i < ECORE_MIN(_xdnd->num_types, 3); ++i) + xev.xclient.data.l[i + 2] = _xdnd->types[i]; + XSendEvent(_ecore_x_disp, win, False, 0, &xev); + _xdnd->await_status = 0; + } + + /* FIXME: Handle box information */ + if (!_xdnd->await_status) + { + xev.xclient.window = win; + xev.xclient.message_type = _ecore_x_atom_xdnd_position; + xev.xclient.data.l[0] = _xdnd->source; + xev.xclient.data.l[1] = 0; /* Reserved */ + xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y * 0xffff); + xev.xclient.data.l[3] = CurrentTime; /* Version 1 */ + xev.xclient.data.l[4] = _xdnd->action; /* Version 2, Needs to be pre-set */ + XSendEvent(_ecore_x_disp, win, False, 0, &xev); + _xdnd->await_status = 1; + } + } + + if (_xdnd->state == ECORE_X_DND_DROPPED) + { + if (win) + { + if (_xdnd->will_accept) + { + xev.xclient.window = win; + xev.xclient.message_type = _ecore_x_atom_xdnd_drop; + xev.xclient.data.l[0] = _xdnd->source; + xev.xclient.data.l[1] = 0; + xev.xclient.data.l[2] = CurrentTime; + xev.xclient.data.l[3] = 0; + xev.xclient.data.l[4] = 0; + XSendEvent(_ecore_x_disp, win, False, 0, &xev); + } + else + { + xev.xclient.window = win; + xev.xclient.message_type = _ecore_x_atom_xdnd_leave; + xev.xclient.data.l[0] = _xdnd->source; + memset(xev.xclient.data.l + 1, 0, sizeof(long) * 3); /* Evil */ + XSendEvent(_ecore_x_disp, win, False, 0, &xev); + } + } + + _xdnd->will_accept = 0; + } + _xdnd->dest = win; +} + + =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_private.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- ecore_x_private.h 21 Feb 2004 08:58:20 -0000 1.23 +++ ecore_x_private.h 29 Feb 2004 08:15:47 -0000 1.24 @@ -63,6 +63,7 @@ enum { ECORE_X_DND_IDLE, ECORE_X_DND_DRAGGING, + ECORE_X_DND_DROPPED, ECORE_X_DND_ENTERED, ECORE_X_DND_TARGET_ENTERED, ECORE_X_DND_TARGET_CONVERTING, @@ -86,6 +87,8 @@ int will_accept; int suppress; + + int await_status; struct { Ecore_Event_Handler *mouse_move; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- ecore_x_window.c 29 Feb 2004 04:37:18 -0000 1.16 +++ ecore_x_window.c 29 Feb 2004 08:15:47 -0000 1.17 @@ -498,6 +498,11 @@ return base; } +/** + * To be documented. + * + * FIXME: To be fixed. + */ Ecore_X_Window ecore_x_window_at_xy_get(int x, int y) { @@ -514,6 +519,11 @@ return win ? win : root; } +/** + * To be documented. + * + * FIXME: To be fixed. + */ Ecore_X_Window ecore_x_window_parent_get(Ecore_X_Window win) { |
From: <enl...@li...> - 2004-03-01 23:27:55
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Makefile.am Log Message: Fix typo =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Makefile.am,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- Makefile.am 5 Feb 2004 07:14:55 -0000 1.8 +++ Makefile.am 1 Mar 2004 23:08:45 -0000 1.9 @@ -47,7 +47,7 @@ EXTRA_DIST = \ Ecore_X.h \ -Ecore_X_Cusor.h \ +Ecore_X_Cursor.h \ ecore_x.c \ ecore_x_dnd.c \ ecore_x_error.c \ |
From: <enl...@li...> - 2004-03-18 05:39:27
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore Modified Files: Ecore.h Makefile.am ecore_events.c ecore_exe.c ecore_idle_enterer.c ecore_idle_exiter.c ecore_idler.c ecore_list.c ecore_main.c ecore_private.h ecore_timer.c Added Files: Ecore_Data.h ecore_hash.c ecore_path.c ecore_plugin.c ecore_sheap.c ecore_strings.c ecore_tree.c ecore_value.c Log Message: Merge Ewd code into Ecore. The new functions (Ecore_Data.h) have not been tested yet, be warned! :) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Ecore.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- Ecore.h 17 Mar 2004 05:14:12 -0000 1.7 +++ Ecore.h 18 Mar 2004 05:29:54 -0000 1.8 @@ -6,12 +6,32 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <math.h> +#include <dlfcn.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <dirent.h> +#include <limits.h> + +#include <Ecore_Data.h> + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif #ifdef __cplusplus extern "C" { #endif -/* Convenience macros */ +/* FIXME: [deprecated] Convenience macros */ #define ECORE_MIN(x, y) (((x) > (y)) ? (y) : (x)) #define ECORE_MAX(x, y) (((x) > (y)) ? (x) : (y)) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- Makefile.am 17 Mar 2004 05:14:13 -0000 1.3 +++ Makefile.am 18 Mar 2004 05:29:54 -0000 1.4 @@ -4,22 +4,30 @@ lib_LTLIBRARIES = libecore.la include_HEADERS = \ -Ecore.h +Ecore.h \ +Ecore_Data.h libecore_la_SOURCES = \ ecore.c \ ecore_app.c \ ecore_events.c \ ecore_exe.c \ +ecore_hash.c \ ecore_idle_enterer.c \ ecore_idle_exiter.c \ ecore_idler.c \ ecore_list.c \ ecore_main.c \ +ecore_path.c \ +ecore_plugin.c \ +ecore_sheap.c \ ecore_signal.c \ +ecore_strings.c \ ecore_time.c \ ecore_timer.c \ +ecore_tree.c \ +ecore_value.c \ ecore_private.h -libecore_la_LIBADD = +libecore_la_LIBADD = -lm @dlopen_libs@ libecore_la_LDFLAGS = -version-info 1:0:0 =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_events.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- ecore_events.c 20 Feb 2004 07:06:25 -0000 1.7 +++ ecore_events.c 18 Mar 2004 05:29:54 -0000 1.8 @@ -353,20 +353,20 @@ void _ecore_event_call(void) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)event_filters; l; l = l->next) + for (l = (Ecore_Oldlist *)event_filters; l; l = l->next) { Ecore_Event_Filter *ef; ef = (Ecore_Event_Filter *)l; if (!ef->delete_me) { - Ecore_List *ll; + Ecore_Oldlist *ll; if (ef->func_start) ef->loop_data = ef->func_start(ef->data); - for (ll = (Ecore_List *)events; ll; ll = ll->next) + for (ll = (Ecore_Oldlist *)events; ll; ll = ll->next) { Ecore_Event *e; @@ -381,7 +381,7 @@ } if (event_filters_delete_me) { - for (l = (Ecore_List *)event_filters; l;) + for (l = (Ecore_Oldlist *)event_filters; l;) { Ecore_Event_Filter *ef; @@ -396,9 +396,9 @@ } event_filters_delete_me = 0; } - for (l = (Ecore_List *)events; l; l = l->next) + for (l = (Ecore_Oldlist *)events; l; l = l->next) { - Ecore_List *ll; + Ecore_Oldlist *ll; Ecore_Event *e; e = (Ecore_Event *)l; @@ -409,7 +409,7 @@ handle_count = 0; ecore_raw_event_type = e->type; ecore_raw_event_event = e->event; - for (ll = (Ecore_List *)event_handlers; ll; ll = ll->next) + for (ll = (Ecore_Oldlist *)event_handlers; ll; ll = ll->next) { Ecore_Event_Handler *eh; @@ -434,7 +434,7 @@ } while (events) _ecore_event_del(events); if (!event_handlers_delete_me) return; - for (l = (Ecore_List *)event_handlers; l;) + for (l = (Ecore_Oldlist *)event_handlers; l;) { Ecore_Event_Handler *eh; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_exe.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore_exe.c 20 Feb 2004 07:06:25 -0000 1.3 +++ ecore_exe.c 18 Mar 2004 05:29:54 -0000 1.4 @@ -237,9 +237,9 @@ Ecore_Exe * _ecore_exe_find(pid_t pid) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)exes; l; l = l->next) + for (l = (Ecore_Oldlist *)exes; l; l = l->next) { Ecore_Exe *exe; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_idle_enterer.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore_idle_enterer.c 20 Feb 2004 07:06:25 -0000 1.3 +++ ecore_idle_enterer.c 18 Mar 2004 05:29:54 -0000 1.4 @@ -75,9 +75,9 @@ void _ecore_idle_enterer_call(void) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)idle_enterers; l; l = l->next) + for (l = (Ecore_Oldlist *)idle_enterers; l; l = l->next) { Ecore_Idle_Enterer *ie; @@ -89,7 +89,7 @@ } if (idle_enterers_delete_me) { - for (l = (Ecore_List *)idle_enterers; l;) + for (l = (Ecore_Oldlist *)idle_enterers; l;) { Ecore_Idle_Enterer *ie; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_idle_exiter.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- ecore_idle_exiter.c 17 Mar 2004 05:44:17 -0000 1.1 +++ ecore_idle_exiter.c 18 Mar 2004 05:29:54 -0000 1.2 @@ -72,9 +72,9 @@ void _ecore_idle_exiter_call(void) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)idle_exiters; l; l = l->next) + for (l = (Ecore_Oldlist *)idle_exiters; l; l = l->next) { Ecore_Idle_Exiter *ie; @@ -86,7 +86,7 @@ } if (idle_exiters_delete_me) { - for (l = (Ecore_List *)idle_exiters; l;) + for (l = (Ecore_Oldlist *)idle_exiters; l;) { Ecore_Idle_Exiter *ie; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_idler.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ecore_idler.c 20 Feb 2004 07:06:25 -0000 1.3 +++ ecore_idler.c 18 Mar 2004 05:29:54 -0000 1.4 @@ -76,9 +76,9 @@ int _ecore_idler_call(void) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)idlers; l; l = l->next) + for (l = (Ecore_Oldlist *)idlers; l; l = l->next) { Ecore_Idler *ie; @@ -90,7 +90,7 @@ } if (idlers_delete_me) { - for (l = (Ecore_List *)idlers; l;) + for (l = (Ecore_Oldlist *)idlers; l;) { Ecore_Idler *ie; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_list.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- ecore_list.c 23 Sep 2003 08:09:29 -0000 1.2 +++ ecore_list.c 18 Mar 2004 05:29:54 -0000 1.3 @@ -1,11 +1,40 @@ #include "ecore_private.h" #include "Ecore.h" +/* Return information about the list */ +static void *_ecore_list_current(Ecore_List * list); + +/* Adding functions */ +static int _ecore_list_insert(Ecore_List * list, Ecore_List_Node *node); +static int _ecore_list_append_0(Ecore_List * list, Ecore_List_Node *node); +static int _ecore_list_prepend_0(Ecore_List * list, Ecore_List_Node *node); + +/* Remove functions */ +static void *_ecore_list_remove_0(Ecore_List * list); +static void *_ecore_list_remove_first(Ecore_List * list); +static void *_ecore_list_remove_last(Ecore_List * list); + +/* Basic traversal functions */ +static void *_ecore_list_next(Ecore_List * list); +static void *_ecore_list_goto_last(Ecore_List * list); +static void *_ecore_list_goto_first(Ecore_List * list); +static void *_ecore_list_goto(Ecore_List * list, void *data); +static void *_ecore_list_goto_index(Ecore_List *list, int index); + +/* Iterative function */ +static int _ecore_list_for_each(Ecore_List *list, Ecore_For_Each function); + +/* Private double linked list functions */ +static void *_ecore_dlist_previous(Ecore_DList * list); +static void *_ecore_dlist_remove_first(Ecore_DList *list); +static void *_ecore_dlist_goto_index(Ecore_DList *list, int index); + +/* XXX: Begin deprecated code */ void * _ecore_list_append(void *in_list, void *in_item) { - Ecore_List *l, *new_l; - Ecore_List *list, *item; + Ecore_Oldlist *l, *new_l; + Ecore_Oldlist *list, *item; list = in_list; item = in_item; @@ -28,8 +57,8 @@ void * _ecore_list_prepend(void *in_list, void *in_item) { - Ecore_List *new_l; - Ecore_List *list, *item; + Ecore_Oldlist *new_l; + Ecore_Oldlist *list, *item; list = in_list; item = in_item; @@ -51,8 +80,8 @@ void * _ecore_list_append_relative(void *in_list, void *in_item, void *in_relative) { - Ecore_List *l; - Ecore_List *list, *item, *relative; + Ecore_Oldlist *l; + Ecore_Oldlist *list, *item, *relative; list = in_list; item = in_item; @@ -61,7 +90,7 @@ { if (l == relative) { - Ecore_List *new_l; + Ecore_Oldlist *new_l; new_l = item; if (l->next) @@ -84,8 +113,8 @@ void * _ecore_list_prepend_relative(void *in_list, void *in_item, void *in_relative) { - Ecore_List *l; - Ecore_List *list, *item, *relative; + Ecore_Oldlist *l; + Ecore_Oldlist *list, *item, *relative; list = in_list; item = in_item; @@ -94,7 +123,7 @@ { if (l == relative) { - Ecore_List *new_l; + Ecore_Oldlist *new_l; new_l = item; new_l->prev = l->prev; @@ -126,8 +155,8 @@ void * _ecore_list_remove(void *in_list, void *in_item) { - Ecore_List *return_l; - Ecore_List *list, *item; + Ecore_Oldlist *return_l; + Ecore_Oldlist *list, *item; /* checkme */ if(!in_list) @@ -159,8 +188,8 @@ void * _ecore_list_find(void *in_list, void *in_item) { - Ecore_List *l; - Ecore_List *list, *item; + Ecore_Oldlist *l; + Ecore_Oldlist *list, *item; list = in_list; item = in_item; @@ -170,3 +199,1410 @@ } return NULL; } +/* XXX: End deprecated code */ + +/** + * ecore_list_new - create and initialize a new list. + * + * Returns a new initialized list on success, NULL on failure. + */ +Ecore_List *ecore_list_new() +{ + Ecore_List *list; + + list = (Ecore_List *)malloc(sizeof(Ecore_List)); + if (!list) + return NULL; + + if (!ecore_list_init(list)) { + FREE(list); + return NULL; + } + + return list; +} + +/** + * ecore_list_init - initialize a list to some sane starting values. + * @list: the list to initialize + * + * Returns FALSE if an error occurs, TRUE if successful + */ +int ecore_list_init(Ecore_List *list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + memset(list, 0, sizeof(Ecore_List)); + + ECORE_INIT_LOCKS(list); + + return TRUE; +} + +/** + * ecore_list_destroy - Free a list and all of it's nodes. + * @list: the list to be freed + * + * Returns no value + */ +void ecore_list_destroy(Ecore_List * list) +{ + void *data; + + CHECK_PARAM_POINTER("list", list); + + ECORE_WRITE_LOCK(list); + + while (list->first) { + data = _ecore_list_remove_first(list); + if (list->free_func) + list->free_func(data); + } + + ECORE_WRITE_UNLOCK(list); + ECORE_DESTROY_LOCKS(list); + + FREE(list); +} + +/** + * ecore_list_set_free_cb - set the function for freeing data + * @list: the list that will use this function when nodes are destroyed. + * @free_func: the function that will free the key data + * + * Returns TRUE on successful set, FALSE otherwise. + */ +int ecore_list_set_free_cb(Ecore_List * list, Ecore_Free_Cb free_func) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + list->free_func = free_func; + + ECORE_WRITE_UNLOCK(list); + + return TRUE; +} + +/** + * ecore_list_is_empty - checks the list for any nodes. + * @list: the list to check for nodes + * + * Returns TRUE if no nodes in list, FALSE if the list contains nodes + */ +int ecore_list_is_empty(Ecore_List * list) +{ + int ret = TRUE; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_READ_LOCK(list); + + if (list->nodes) + ret = FALSE; + + ECORE_READ_UNLOCK(list); + + return ret; +} + +/** + * ecore_list_index - returns the number of the current node + * @list: the list to return the number of the current node + * + * Returns the number of the current node in the list. + */ +int ecore_list_index(Ecore_List * list) +{ + int ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_READ_LOCK(list); + + ret = list->index; + + ECORE_READ_UNLOCK(list); + + return ret; +} + +/** + * ecore_list_nodes - find the number of nodes in the list. + * @list: the list to find the number of nodes + * + * Returns the number of nodes in the list. + */ +int ecore_list_nodes(Ecore_List * list) +{ + int ret = 0; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_READ_LOCK(list); + + ret = list->nodes; + + ECORE_READ_UNLOCK(list); + + return ret; +} + +/** + * ecore_list_append - append data to the list. + * @list: the list to append @data + * @data: the data to append to @list. + * + * Returns FALSE if an error occurs, TRUE if @data is appended successfully + */ +inline int ecore_list_append(Ecore_List * list, void *data) +{ + int ret; + Ecore_List_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + node = ecore_list_node_new(); + node->data = data; + + ECORE_WRITE_LOCK(list); + + ret = _ecore_list_append_0(list, node); + + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* For adding items to the end of the list */ +static int _ecore_list_append_0(Ecore_List * list, Ecore_List_Node *end) +{ + if (list->last) { + ECORE_WRITE_LOCK(list->last); + list->last->next = end; + ECORE_WRITE_UNLOCK(list->last); + } + + list->last = end; + + if (list->first == NULL) { + list->first = end; + list->index = 1; + } + + list->nodes++; + + return TRUE; +} + +/** + * ecore_list_prepend - prepend data to the beginning of the list + * @list: the list to prepend @data + * @data: the data to prepend to @list + * + * Returns FALSE if an error occurs, TRUE if data prepended successfully + */ +inline int ecore_list_prepend(Ecore_List * list, void *data) +{ + int ret; + Ecore_List_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + node = ecore_list_node_new(); + node->data = data; + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_prepend_0(list, node); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* For adding items to the beginning of the list */ +static int _ecore_list_prepend_0(Ecore_List * list, Ecore_List_Node *start) +{ + /* Put it at the beginning of the list */ + ECORE_WRITE_LOCK(start); + start->next = list->first; + ECORE_WRITE_UNLOCK(start); + + list->first = start; + + /* If no last node, then the first node is the last node */ + if (list->last == NULL) + list->last = list->first; + + list->nodes++; + list->index++; + + return TRUE; +} + +/** + * ecore_list_insert - insert data at the current point in the list + * @list: the list to hold the inserted @data + * @data: the data to insert into @list + * + * Returns FALSE on an error, TRUE on success + */ +inline int ecore_list_insert(Ecore_List * list, void *data) +{ + int ret; + Ecore_List_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + node = ecore_list_node_new(); + node->data = data; + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_insert(list, node); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* For adding items in front of the current position in the list */ +static int _ecore_list_insert(Ecore_List * list, Ecore_List_Node *new_node) +{ + /* + * If the current point is at the beginning of the list, then it's the + * same as prepending it to the list. + */ + if (list->current == list->first) + return _ecore_list_prepend_0(list, new_node); + + if (list->current == NULL) { + int ret_value; + + ret_value = _ecore_list_append_0(list, new_node); + list->current = list->last; + + return ret_value; + } + + /* Setup the fields of the new node */ + ECORE_WRITE_LOCK(new_node); + new_node->next = list->current; + ECORE_WRITE_UNLOCK(new_node); + + /* And hook the node into the list */ + _ecore_list_goto_index(list, ecore_list_index(list) - 1); + + ECORE_WRITE_LOCK(list->current); + list->current->next = new_node; + ECORE_WRITE_UNLOCK(list->current); + + /* Now move the current item to the inserted item */ + list->current = new_node; + list->index++; + list->nodes++; + + return TRUE; +} + +/** + * ecore_list_remove - remove the current item from the list. + * @list: the list to remove the current item + * + * Returns a pointer to the removed data on success, NULL on failure. + */ +inline void *ecore_list_remove(Ecore_List * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_remove_0(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* Remove the current item from the list */ +static void *_ecore_list_remove_0(Ecore_List * list) +{ + void *ret = NULL; + Ecore_List_Node *old; + + if (!list) + return FALSE; + + if (ecore_list_is_empty(list)) + return FALSE; + + if (!list->current) + return FALSE; + + if (list->current == list->first) + return _ecore_list_remove_first(list); + + if (list->current == list->last) + return _ecore_list_remove_last(list); + + old = list->current; + + _ecore_list_goto_index(list, list->index - 1); + + ECORE_WRITE_LOCK(list->current); + ECORE_WRITE_LOCK(old); + + list->current->next = old->next; + old->next = NULL; + ret = old->data; + old->data = NULL; + + _ecore_list_next(list); + + ECORE_WRITE_UNLOCK(old); + ECORE_WRITE_UNLOCK(list->current); + + ecore_list_node_destroy(old, NULL); + list->nodes--; + + return ret; +} + +/** + * ecore_list_remove_destroy - remove and free the data in lists current position + * @list: the list to remove and free the current item + * + * Returns TRUE on success, FALSE on error + */ +int ecore_list_remove_destroy(Ecore_List *list) +{ + void *data; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + data = _ecore_list_remove_0(list); + if (list->free_func) + list->free_func(data); + + ECORE_WRITE_UNLOCK(list); + + return TRUE; +} + +/** + * ecore_list_remove_first - remove the first item from the list. + * @list: the list to remove the current item + * + * Returns a pointer to the removed data on success, NULL on failure. + */ +inline void *ecore_list_remove_first(Ecore_List * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_remove_first(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* Remove the first item from the list */ +static void *_ecore_list_remove_first(Ecore_List * list) +{ + void *ret = NULL; + Ecore_List_Node *old; + + if (!list) + return FALSE; + + ECORE_WRITE_UNLOCK(list); + if (ecore_list_is_empty(list)) + return FALSE; + ECORE_WRITE_LOCK(list); + + if (!list->first) + return FALSE; + + old = list->first; + + list->first = list->first->next; + + if (list->current == old) + list->current = list->first; + else + list->index--; + + if (list->last == old) + list->last = list->first; + + ECORE_WRITE_LOCK(old); + ret = old->data; + old->data = NULL; + ECORE_WRITE_UNLOCK(old); + + ecore_list_node_destroy(old, NULL); + list->nodes--; + + return ret; +} + +/** + * ecore_list_remove_first - remove the last item from the list. + * @list: the list to remove the last node from + * + * Returns a pointer to the removed data on success, NULL on failure. + */ +inline void *ecore_list_remove_last(Ecore_List * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_remove_last(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* Remove the last item from the list */ +static void *_ecore_list_remove_last(Ecore_List * list) +{ + void *ret = NULL; + Ecore_List_Node *old, *prev; + + if (!list) + return FALSE; + + if (ecore_list_is_empty(list)) + return FALSE; + + if (!list->last) + return FALSE; + + old = list->last; + if (list->current == old) + list->current = NULL; + + if (list->first == old) + list->first = NULL; + for (prev = list->first; prev && prev->next != old; prev = prev->next); + if (prev) { + prev->next = NULL; + list->last = prev; + if (list->current == old) { + list->current = NULL; + } + } + + + ECORE_WRITE_LOCK(old); + if (old) { + old->next = NULL; + ret = old->data; + old->data = NULL; + } + ECORE_WRITE_UNLOCK(old); + + ecore_list_node_destroy(old, NULL); + list->nodes--; + + return ret; +} + +/** + * ecore_list_goto_index - move the current item to the index number + * @list: the list to move the current item + * @index: the position to move the current item + * + * Returns a pointer to the new current item on success, NULL on failure. + */ +inline void *ecore_list_goto_index(Ecore_List * list, int index) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_goto_index(list, index); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* This is the non-threadsafe version, use this inside internal functions that + * already lock the list */ +static void *_ecore_list_goto_index(Ecore_List *list, int index) +{ + int i; + + if (!list) + return FALSE; + + if (ecore_list_is_empty(list)) + return FALSE; + + if (index > ecore_list_nodes(list) || index < 0) + return FALSE; + + _ecore_list_goto_first(list); + + for (i = 1; i < index && _ecore_list_next(list); i++); + + list->index = i; + + return list->current->data; +} + +/** + * ecore_list_goto - move the current item to the node that contains data + * @list: the list to move the current item in + * @data: the data to find and set the current item to + * + * Returns a pointer to @data on success, NULL on failure. + */ +inline void *ecore_list_goto(Ecore_List * list, void *data) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_goto(list, data); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* Set the current position to the node containing data */ +static void *_ecore_list_goto(Ecore_List * list, void *data) +{ + int index; + Ecore_List_Node *node; + + if (!list) + return NULL; + + index = 1; + + node = list->first; + ECORE_READ_LOCK(node); + while (node && node->data) { + Ecore_List_Node *next; + + if (node->data == data) + break; + + next = node->next; + ECORE_READ_UNLOCK(node); + + node = next; + + ECORE_READ_LOCK(node); + index++; + } + + ECORE_READ_UNLOCK(node); + if (!node) + return NULL; + + list->current = node; + list->index = index; + + return list->current->data; +} + +/** + * ecore_list_goto_first - move the current pointer to the first item in the list + * @list: the list to move the current pointer in + * + * Returns a pointer to the first item on success, NULL on failure + */ +inline void *ecore_list_goto_first(Ecore_List *list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + ret = _ecore_list_goto_first(list); + + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* Set the current position to the start of the list */ +static void *_ecore_list_goto_first(Ecore_List * list) +{ + if (!list || !list->first) + return NULL; + + list->current = list->first; + list->index = 1; + + return list->current->data; +} + +/** + * ecore_list_goto_last - move the pointer to current to the last item in the list + * @list: the list to move the current pointer in + * + * Returns a pointer to the last item on success, NULL on failure. + */ +inline void *ecore_list_goto_last(Ecore_List * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_goto_last(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* Set the current position to the end of the list */ +static void *_ecore_list_goto_last(Ecore_List * list) +{ + if (!list || !list->last) + return NULL; + + list->current = list->last; + list->index = list->nodes; + + return list->current->data; +} + +/** + * ecore_list_current - retrieve the data in the current node + * @list: the list to retrieve the current data from + * + * Returns the data at the current position on success, NULL on failure or if + * no current item set. + */ +inline void *ecore_list_current(Ecore_List * list) +{ + void *ret; + + ECORE_READ_LOCK(list); + ret = _ecore_list_current(list); + ECORE_READ_UNLOCK(list); + + return ret; +} + +/* Return the data of the current node without incrementing */ +static void *_ecore_list_current(Ecore_List * list) +{ + void *ret; + + if (!list->current) + return NULL; + + ECORE_READ_LOCK(list->current); + ret = list->current->data; + ECORE_READ_UNLOCK(list->current); + + return ret; +} + +/** + * ecore_list_next - retrieve the data at the current node and move to the next + * @list: the list to move to the next item + * + * Returns the current item in the list on success, NULL on failure. + */ +inline void *ecore_list_next(Ecore_List * list) +{ + void *data; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + data = _ecore_list_next(list); + ECORE_WRITE_UNLOCK(list); + + return data; +} + +/* Return the data contained in the current node and go to the next node */ +static void *_ecore_list_next(Ecore_List * list) +{ + void *data; + Ecore_List_Node *ret; + Ecore_List_Node *next; + + if (!list->current) + return NULL; + + ECORE_READ_LOCK(list->current); + ret = list->current; + next = list->current->next; + ECORE_READ_UNLOCK(list->current); + + list->current = next; + list->index++; + + ECORE_READ_LOCK(ret); + data = ret->data; + ECORE_READ_UNLOCK(ret); + + return data; +} + +/** + * ecore_list_clear - remove all nodes from the list + * @list: the list that will have it's nodes removed + * + * Returns TRUE on success, FALSE on error. The data for each item on the list + * is not freed by ecore_list_clear. + */ +int ecore_list_clear(Ecore_List * list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + while (!ecore_list_is_empty(list)) + _ecore_list_remove_first(list); + + ECORE_WRITE_UNLOCK(list); + + return TRUE; +} + +/** + * ecore_list_for_each - execute function for each node in the list. + * @list: the list to retrieve nodes from. + * @function: The function to pass each node from the list to. + * + * Returns TRUE on success, FALSE on failure. + */ +int ecore_list_for_each(Ecore_List *list, Ecore_For_Each function) +{ + int ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_READ_LOCK(list); + ret = _ecore_list_for_each(list, function); + ECORE_READ_UNLOCK(list); + + return ret; +} + +/* The real meat of executing the function for each data node */ +static int _ecore_list_for_each(Ecore_List *list, Ecore_For_Each function) +{ + void *value; + + if (!list || !function) + return FALSE; + + _ecore_list_goto_first(list); + while ((value = _ecore_list_next(list)) != NULL) + function(value); + + return TRUE; +} + +/* Initialize a node to starting values */ +int ecore_list_node_init(Ecore_List_Node * node) +{ + + CHECK_PARAM_POINTER_RETURN("node", node, FALSE); + + node->next = NULL; + node->data = NULL; + + ECORE_INIT_LOCKS(node); + + return TRUE; +} + +/* Allocate and initialize a new list node */ +Ecore_List_Node *ecore_list_node_new() +{ + Ecore_List_Node *new_node; + + new_node = malloc(sizeof(Ecore_List_Node)); + + if (!ecore_list_node_init(new_node)) { + FREE(new_node); + return NULL; + } + + return new_node; +} + +/* Here we actually call the function to free the data and free the node */ +int ecore_list_node_destroy(Ecore_List_Node * node, Ecore_Free_Cb free_func) +{ + CHECK_PARAM_POINTER_RETURN("node", node, FALSE); + + ECORE_WRITE_LOCK(node); + + if (free_func && node->data) + free_func(node->data); + + ECORE_WRITE_UNLOCK(node); + ECORE_DESTROY_LOCKS(node); + + FREE(node); + + return TRUE; +} + +/** + * ecore_dlist_new - create and initialize a new list. + * + * Returns a new initialized list on success, NULL on failure. + */ +Ecore_DList *ecore_dlist_new() +{ + Ecore_DList *list = NULL; + + list = (Ecore_DList *)malloc(sizeof(Ecore_DList)); + if (!list) + return NULL; + + if (!ecore_dlist_init(list)) { + IF_FREE(list); + return NULL; + } + + return list; +} + +/** + * ecore_dlist_init - initialize a list to some sane starting values. + * @list: the list to initialize + * + * Returns FALSE if an error occurs, TRUE if successful + */ +int ecore_dlist_init(Ecore_DList *list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + memset(list, 0, sizeof(Ecore_DList)); + + ECORE_INIT_LOCKS(list); + + return TRUE; +} + +/** + * ecore_dlist_destroy - free a list and all of it's nodes. + * @list: the list to be freed + * + * Returns no value + */ +void ecore_dlist_destroy(Ecore_DList * list) +{ + void *data; + CHECK_PARAM_POINTER("list", list); + + ECORE_WRITE_LOCK(list); + + while (list->first) { + data = _ecore_dlist_remove_first(list); + if (list->free_func) + list->free_func(data); + } + + ECORE_WRITE_UNLOCK(list); + ECORE_DESTROY_LOCKS(list); + + FREE(list); +} + +/** + * ecore_dlist_set_free_cb - set the function for freeing data + * @list: the list that will use this function when nodes are destroyed. + * @free_func: the function that will free the key data + * + * Returns TRUE on success, FALSE on failure. + */ +int ecore_dlist_set_free_cb(Ecore_DList * list, Ecore_Free_Cb free_func) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + return ecore_list_set_free_cb(ECORE_LIST(list), free_func); +} + +/** + * ecore_dlist_is_empty - checks the list for any nodes. + * @list: the list to check for nodes + * + * Returns TRUE if no nodes in list, FALSE if the list contains nodes + */ +int ecore_dlist_is_empty(Ecore_DList * list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + return ecore_list_is_empty(ECORE_LIST(list)); +} + +/** + * ecore_dlist_index - returns the number of the current node + * @list: the list to return the number of the current node + * + * Returns the number of the current node in the list. + */ +inline int ecore_dlist_index(Ecore_DList * list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + return ecore_list_index(ECORE_LIST(list)); +} + +/** + * ecore_dlist_append - append data to the list. + * @list: the list to append @data + * @data: the data to append to @list + * + * Returns FALSE if an error occurs, TRUE if the data is appended successfully + */ +int ecore_dlist_append(Ecore_DList * list, void *data) +{ + int ret; + Ecore_DList_Node *prev; + Ecore_DList_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + node = ecore_dlist_node_new(); + ECORE_LIST_NODE(node)->data = data; + + prev = ECORE_DLIST_NODE(ECORE_LIST(list)->last); + ret = _ecore_list_append_0(ECORE_LIST(list), ECORE_LIST_NODE(node)); + if (ret) { + node->previous = prev; + } + + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_prepend - prepend data to the beginning of the list + * @list: the list to prepend @data + * @data: the data to prepend to @list + * + * Returns FALSE if an error occurs, TRUE if data prepended successfully + */ +int ecore_dlist_prepend(Ecore_DList * list, void *data) +{ + int ret; + Ecore_DList_Node *prev; + Ecore_DList_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + node = ecore_dlist_node_new(); + ECORE_LIST_NODE(node)->data = data; + + prev = ECORE_DLIST_NODE(ECORE_LIST(list)->first); + ret = _ecore_list_prepend_0(ECORE_LIST(list), ECORE_LIST_NODE(node)); + if (ret && prev) + prev->previous = node; + + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_insert - insert data at the current point in the list + * @list: the list to hold the inserted @data + * @data: the data to insert into @list + * + * Returns FALSE on an error, TRUE on success + */ +int ecore_dlist_insert(Ecore_DList * list, void *data) +{ + int ret; + Ecore_DList_Node *prev; + Ecore_DList_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + prev = ECORE_DLIST_NODE(ECORE_LIST(list)->current); + if (!prev) + prev = ECORE_DLIST_NODE(ECORE_LIST(list)->last); + + if (prev) + prev = prev->previous; + + node = ecore_dlist_node_new(); + ECORE_LIST_NODE(node)->data = data; + + ret = _ecore_list_insert(list, ECORE_LIST_NODE(node)); + if (!ret) { + ECORE_WRITE_UNLOCK(list); + return ret; + } + + if (ECORE_LIST_NODE(node)->next) + ECORE_DLIST_NODE(ECORE_LIST_NODE(node)->next)->previous = node; + + if (prev) + node->previous = prev; + + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_remove - remove the current item from the list. + * @list: the list to remove the current item + * + * Returns a pointer to the removed data on success, NULL on failure. + */ +void *ecore_dlist_remove(Ecore_DList * list) +{ + void *ret; + Ecore_List_Node *node; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + + if (list->current) { + node = list->current->next; + ECORE_DLIST_NODE(node)->previous = + ECORE_DLIST_NODE(ECORE_LIST(list)->current)->previous; + } + ret = _ecore_list_remove_0(list); + + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_remove_first - remove the first item from the list. + * @list: the list to remove the current item + * + * Returns a pointer to the removed data on success, NULL on failure. + */ +void *ecore_dlist_remove_first(Ecore_DList * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_dlist_remove_first(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_remove_destroy - remove and free the data at the current position + * @list: the list to remove the data from + * + * Returns TRUE on success, FALSE on error + */ +int ecore_dlist_remove_destroy(Ecore_DList *list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + return ecore_list_remove_destroy(list); +} + +static void *_ecore_dlist_remove_first(Ecore_DList *list) +{ + void *ret; + + if (!list) + return FALSE; + + ret = _ecore_list_remove_first(list); + if (ret && ECORE_LIST(list)->first) + ECORE_DLIST_NODE(ECORE_LIST(list)->first)->previous = NULL; + + return ret; +} + +/** + * ecore_dlist_remove_last - remove the last item from the list + * @list: the list to remove the last node from + * + * Returns a pointer to the removed data on success, NULL on failure. + */ +void *ecore_dlist_remove_last(Ecore_DList * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_remove_last(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_goto_index - move the current item to the index number + * @list: the list to move the current item + * @index: the position to move the current item + * + * Returns node at specified index on success, NULL on error + */ +void *ecore_dlist_goto_index(Ecore_DList * list, int index) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_dlist_goto_index(list, index); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/* This is the non-threadsafe version, use this inside internal functions that + * already lock the list */ +static void *_ecore_dlist_goto_index(Ecore_DList *list, int index) +{ + int i, increment; + + if (!list) + return FALSE; + + if (ecore_list_is_empty(ECORE_LIST(list))) + return FALSE; + + if (index > ecore_list_nodes(ECORE_LIST(list)) || index < 1) + return FALSE; + + if (ECORE_LIST(list)->index > ECORE_LIST(list)->nodes) + _ecore_list_goto_last(ECORE_LIST(list)); + + if (index < ECORE_LIST(list)->index) + increment = -1; + else + increment = 1; + + for (i = ECORE_LIST(list)->index; i != index; i += increment) { + if (increment > 0) + _ecore_list_next(list); + else + _ecore_dlist_previous(list); + } + + return _ecore_list_current(list); +} + +/** + * ecore_dlist_goto - move the current item to the node that contains data + * @list: the list to move the current item in + * @data: the data to find and set the current item to + * + * Returns specified data on success, NULL on error + */ +void *ecore_dlist_goto(Ecore_DList * list, void *data) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_goto(ECORE_LIST(list), data); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_goto_first - move the current pointer to the first item in the list + * @list: the list to change the current to the first item + * + * Returns a pointer to the first item on success, NULL on failure. + */ +void *ecore_dlist_goto_first(Ecore_DList *list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_goto_first(list); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_goto_last - move the pointer to the current item to the last item + * @list: the list to move the current item pointer to the last + * + * Returns a pointer to the last item in the list on success, NULL on failure. + */ +void *ecore_dlist_goto_last(Ecore_DList * list) +{ + void *ret; + + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ECORE_WRITE_LOCK(list); + ret = _ecore_list_goto_last(ECORE_LIST(list)); + ECORE_WRITE_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_current - return the data in the current list item + * @list: the list to the return the current data + * + * Returns value of the current data item, NULL if no current item + */ +void *ecore_dlist_current(Ecore_DList * list) +{ + void *ret; + + ECORE_READ_LOCK(list); + ret = _ecore_list_current(ECORE_LIST(list)); + ECORE_READ_UNLOCK(list); + + return ret; +} + +/** + * ecore_dlist_next - move to the next item in the list and return current item + * @list: the list to move to the next item in. + * + * Returns data in the current list node, or NULL on error + */ +void *ecore_dlist_next(Ecore_DList * list) +{ + void *data; + + ECORE_WRITE_LOCK(list); + data = _ecore_list_next(list); + ECORE_WRITE_UNLOCK(list); + + return data; +} + +/** + * ecore_dlist_previous - move to the previous item and return current item + * @list: the list to move to the previous item in. + * + * Returns data in the current list node, or NULL on error + */ +void *ecore_dlist_previous(Ecore_DList * list) +{ + void *data; + + ECORE_WRITE_LOCK(list); + data = _ecore_dlist_previous(list); + ECORE_WRITE_UNLOCK(list); + + return data; +} + +static void *_ecore_dlist_previous(Ecore_DList * list) +{ + void *data = NULL; + + if (!list) + return NULL; + + if (ECORE_LIST(list)->current) { + data = ECORE_LIST(list)->current->data; + ECORE_LIST(list)->current = ECORE_LIST_NODE(ECORE_DLIST_NODE( + ECORE_LIST(list)->current)->previous); + ECORE_LIST(list)->index--; + } + else + _ecore_list_goto_last(ECORE_LIST(list)); + + return data; +} + +/** + * ecore_dlist_clear - remove all nodes from the list. + * @list: the list to remove all nodes from + * + * Returns TRUE on success, FALSE on errors + */ +int ecore_dlist_clear(Ecore_DList * list) +{ + CHECK_PARAM_POINTER_RETURN("list", list, FALSE); + + ecore_list_clear(ECORE_LIST(list)); + + return TRUE; +} + +/* + * Description: Initialize a node to sane starting values + * Parameters: 1. node - the node to initialize + * Returns: TRUE on success, FALSE on errors + */ +int ecore_dlist_node_init(Ecore_DList_Node * node) +{ + int ret; + + CHECK_PARAM_POINTER_RETURN("node", node, FALSE); + + ret = ecore_list_node_init(ECORE_LIST_NODE(node)); + if (ret) + node->previous = NULL; + + return ret; +} + +/* + * Description: Allocate and initialize a new list node + * Parameters: None + * Returns: NULL on error, new list node on success + */ +Ecore_DList_Node *ecore_dlist_node_new() +{ + Ecore_DList_Node *new_node; + + new_node = malloc(sizeof(Ecore_DList_Node)); + + if (!new_node) + return NULL; + + if (!ecore_dlist_node_init(new_node)) { + FREE(new_node); + return NULL; + } + + return new_node; +} + +/* + * Description: Call the data's free callback function, then free the node + * Parameters: 1. node - the node to be freed + * 2. free_func - the callback function to execute on the data + * Returns: TRUE on success, FALSE on error + */ +int ecore_dlist_node_destroy(Ecore_DList_Node * node, Ecore_Free_Cb free_func) +{ + CHECK_PARAM_POINTER_RETURN("node", node, + FALSE); + + return ecore_list_node_destroy(ECORE_LIST_NODE(node), free_func); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_main.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- ecore_main.c 17 Mar 2004 05:14:13 -0000 1.7 +++ ecore_main.c 18 Mar 2004 05:29:54 -0000 1.8 @@ -239,7 +239,7 @@ fd_set rfds, wfds, exfds; int max_fd; int ret; - Ecore_List *l; + Ecore_Oldlist *l; t = NULL; if (timeout > 0.0) @@ -262,7 +262,7 @@ FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&exfds); - for (l = (Ecore_List *)fd_handlers; l; l = l->next) + for (l = (Ecore_Oldlist *)fd_handlers; l; l = l->next) { Ecore_Fd_Handler *fdh; @@ -291,7 +291,7 @@ } if (ret > 0) { - for (l = (Ecore_List *)fd_handlers; l; l = l->next) + for (l = (Ecore_Oldlist *)fd_handlers; l; l = l->next) { Ecore_Fd_Handler *fdh; @@ -315,10 +315,10 @@ static void _ecore_main_fd_handlers_cleanup(void) { - Ecore_List *l; + Ecore_Oldlist *l; if (!fd_handlers_delete_me) return; - for (l = (Ecore_List *)fd_handlers; l;) + for (l = (Ecore_Oldlist *)fd_handlers; l;) { Ecore_Fd_Handler *fdh; @@ -337,9 +337,9 @@ static void _ecore_main_fd_handlers_call(void) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)fd_handlers; l; l = l->next) + for (l = (Ecore_Oldlist *)fd_handlers; l; l = l->next) { Ecore_Fd_Handler *fdh; @@ -366,11 +366,11 @@ static int _ecore_main_fd_handlers_buf_call(void) { - Ecore_List *l; + Ecore_Oldlist *l; int ret; ret = 0; - for (l = (Ecore_List *)fd_handlers; l; l = l->next) + for (l = (Ecore_Oldlist *)fd_handlers; l; l = l->next) { Ecore_Fd_Handler *fdh; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_private.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecore_private.h 17 Mar 2004 05:14:13 -0000 1.5 +++ ecore_private.h 18 Mar 2004 05:29:54 -0000 1.6 @@ -31,12 +31,12 @@ typedef int Ecore_Magic; -typedef struct _Ecore_List Ecore_List; +typedef struct _Ecore_Oldlist Ecore_Oldlist; -struct _Ecore_List +struct _Ecore_Oldlist { - Ecore_List *next, *prev; - Ecore_List *last; + Ecore_Oldlist *next, *prev; + Ecore_Oldlist *last; }; #ifndef _ECORE_H @@ -60,7 +60,7 @@ struct _Ecore_Exe { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; pid_t pid; void *data; @@ -68,7 +68,7 @@ struct _Ecore_Timer { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; double in; double at; @@ -80,7 +80,7 @@ struct _Ecore_Idler { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int delete_me : 1; int (*func) (void *data); @@ -89,7 +89,7 @@ struct _Ecore_Idle_Enterer { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int delete_me : 1; int (*func) (void *data); @@ -98,7 +98,7 @@ struct _Ecore_Idle_Exiter { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int delete_me : 1; int (*func) (void *data); @@ -107,7 +107,7 @@ struct _Ecore_Fd_Handler { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int fd; Ecore_Fd_Handler_Flags flags; @@ -123,7 +123,7 @@ struct _Ecore_Event_Handler { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int type; int delete_me : 1; @@ -133,7 +133,7 @@ struct _Ecore_Event_Filter { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int delete_me : 1; void * (*func_start) (void *data); @@ -145,7 +145,7 @@ struct _Ecore_Event { - Ecore_List __list_data; + Ecore_Oldlist __list_data; ECORE_MAGIC; int type; void *event; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_timer.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- ecore_timer.c 20 Feb 2004 07:06:25 -0000 1.4 +++ ecore_timer.c 18 Mar 2004 05:29:54 -0000 1.5 @@ -124,10 +124,10 @@ void _ecore_timer_cleanup(void) { - Ecore_List *l; + Ecore_Oldlist *l; if (!timers_delete_me) return; - for (l = (Ecore_List *)timers; l;) + for (l = (Ecore_Oldlist *)timers; l;) { Ecore_Timer *timer; @@ -148,11 +148,11 @@ void _ecore_timer_enable_new(void) { - Ecore_List *l; + Ecore_Oldlist *l; if (!timers_added) return; timers_added = 0; - for (l = (Ecore_List *)timers; l; l = l->next) + for (l = (Ecore_Oldlist *)timers; l; l = l->next) { Ecore_Timer *timer; @@ -177,11 +177,11 @@ int _ecore_timer_call(double when) { - Ecore_List *l; + Ecore_Oldlist *l; Ecore_Timer *timer; if (!timers) return 0; - for (l = (Ecore_List *)timers; l; l = l->next) + for (l = (Ecore_Oldlist *)timers; l; l = l->next) { timer = (Ecore_Timer *)l; if ((timer->at <= when) && @@ -203,7 +203,7 @@ static void _ecore_timer_set(Ecore_Timer *timer, double at, double in, int (*func) (void *data), void *data) { - Ecore_List *l; + Ecore_Oldlist *l; timers_added = 1; timer->at = at; @@ -213,7 +213,7 @@ timer->just_added = 1; if (timers) { - for (l = ((Ecore_List *)(timers))->last; l; l = l->prev) + for (l = ((Ecore_Oldlist *)(timers))->last; l; l = l->prev) { Ecore_Timer *t2; |
From: <enl...@li...> - 2004-03-18 05:40:19
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore Modified Files: configure.in ecore.spec Log Message: - Merge Ewd functions into Ecore. - Version number bump =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/configure.in,v retrieving revision 1.42 retrieving revision 1.43 diff -u -3 -r1.42 -r1.43 --- configure.in 16 Mar 2004 23:52:45 -0000 1.42 +++ configure.in 18 Mar 2004 05:30:48 -0000 1.43 @@ -5,7 +5,7 @@ AC_CANONICAL_HOST AC_CANONICAL_TARGET AC_ISC_POSIX -AM_INIT_AUTOMAKE(ecore, 1.0.0_pre4) +AM_INIT_AUTOMAKE(ecore, 1.0.0_pre6) AM_CONFIG_HEADER(config.h) AC_C_BIGENDIAN @@ -556,6 +556,52 @@ AM_CONDITIONAL(BUILD_ECORE_CONFIG, false) fi +AC_ARG_ENABLE(pthreads, +[--disable-pthreads disable building with pthread support], +[ + if test x$enableval = xyes; then + pthreads=yes + else + pthreads=no + fi +] +) + +if test x$pthreads = xyes ; then +AC_CHECK_HEADERS(pthread.h,pthread_header_ok="yes", pthread_header_ok="no") + if test "$pthread_header_ok" = "yes"; then + AC_CHECK_LIB(pthread, main, PTHREAD_LIBS="-lpthread", PTHREAD_LIBS="error") + if test "$PTHREAD_LIBS" = "error"; then + AC_CHECK_LIB(c_r, main, PTHREAD_LIBS="-pthread", pthread_lib_ok="no") + fi + fi + if test "$pthread_header_ok" = "no" -o "$pthread_lib_ok" = "no"; then + HAVE_PTHREADS=0 + else + HAVE_PTHREADS=1 + fi + if test "$PTHREAD_LIBS" = "-pthread"; then + LIBS="$LIBS $PTHREAD_LIBS" + else + PTHREAD_CFLAGS="-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS" + LIBS="$LIBS $PTHREAD_LIBS" + fi +else + HAVE_PTHREADS=0 + PTHREAD_LIBS="" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(HAVE_PTHREADS) + +AC_CHECK_LIB(dl, dlopen, dlopen_libs=-ldl) +AC_SUBST(dlopen_libs) + +dnl Checking for Perl: +AC_PATH_PROG(PERL,perl,0) +AC_SUBST(PERL) + + AC_SUBST(ecore_config_cflags) AC_SUBST(ecore_config_libs) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/ecore.spec,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- ecore.spec 23 Dec 2003 11:41:17 -0000 1.9 +++ ecore.spec 18 Mar 2004 05:30:48 -0000 1.10 @@ -1,6 +1,6 @@ # this is NOT relocatable, unless you alter the patch! %define name ecore -%define ver 1.0.0_pre4 +%define ver 1.0.0_pre6 %define rel 1 %define prefix /usr |
From: <enl...@li...> - 2004-03-18 14:39:35
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_evas Modified Files: ecore_evas.c ecore_evas_fb.c ecore_evas_x.c Log Message: - Fix references to old Ecore_List structure (temporarily) - Fix warnings (bad raster!) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- ecore_evas.c 17 Mar 2004 05:14:13 -0000 1.10 +++ ecore_evas.c 18 Mar 2004 14:29:59 -0000 1.11 @@ -1444,7 +1444,7 @@ /* fps debug calls - for debugging how much time your app actually spends */ /* rendering graphics... :) */ -static _ecore_evas_fps_debug_init_count = 0; +static int _ecore_evas_fps_debug_init_count = 0; static int _ecore_evas_fps_debug_fd = -1; unsigned int *_ecore_evas_fps_rendertime_mmap = NULL; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_fb.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- ecore_evas_fb.c 17 Mar 2004 05:14:13 -0000 1.7 +++ ecore_evas_fb.c 18 Mar 2004 14:29:59 -0000 1.8 @@ -57,9 +57,9 @@ static Ecore_Evas * _ecore_evas_fb_match(void) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)ecore_evases; l; l = l->next) + for (l = (Ecore_Oldlist *)ecore_evases; l; l = l->next) { Ecore_Evas *ee; @@ -72,9 +72,9 @@ static void _ecore_evas_fb_lose(void *data) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)ecore_evases; l; l = l->next) + for (l = (Ecore_Oldlist *)ecore_evases; l; l = l->next) { Ecore_Evas *ee; @@ -86,9 +86,9 @@ static void _ecore_evas_fb_gain(void *data) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)ecore_evases; l; l = l->next) + for (l = (Ecore_Oldlist *)ecore_evases; l; l = l->next) { Ecore_Evas *ee; @@ -168,14 +168,15 @@ static int _ecore_evas_idle_enter(void *data) { - Ecore_List *l; - double t1, t2; + Ecore_Oldlist *l; + double t1 = 0.; + double t2 = 0.; if (_ecore_evas_fps_debug) { t1 = ecore_time_get(); } - for (l = (Ecore_List *)ecore_evases; l; l = l->next) + for (l = (Ecore_Oldlist *)ecore_evases; l; l = l->next) { Ecore_Evas *ee; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_evas/ecore_evas_x.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- ecore_evas_x.c 17 Mar 2004 05:14:13 -0000 1.12 +++ ecore_evas_x.c 18 Mar 2004 14:29:59 -0000 1.13 @@ -54,9 +54,9 @@ static Ecore_Evas * _ecore_evas_x_match(Ecore_X_Window win) { - Ecore_List *l; + Ecore_Oldlist *l; - for (l = (Ecore_List *)ecore_evases; l; l = l->next) + for (l = (Ecore_Oldlist *)ecore_evases; l; l = l->next) { Ecore_Evas *ee; @@ -433,14 +433,15 @@ static int _ecore_evas_idle_enter(void *data) { - Ecore_List *l; - double t1, t2; + Ecore_Oldlist *l; + double t1 = 0.; + double t2 = 0.; if (_ecore_evas_fps_debug) { t1 = ecore_time_get(); } - for (l = (Ecore_List *)ecore_evases; l; l = l->next) + for (l = (Ecore_Oldlist *)ecore_evases; l; l = l->next) { Ecore_Evas *ee; |
From: <enl...@li...> - 2004-03-28 04:37:04
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_con Modified Files: ecore_con.c Log Message: Permit explicit specification of socket path by using an absolute path in the service name. =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_con/ecore_con.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- ecore_con.c 20 Feb 2004 07:06:26 -0000 1.10 +++ ecore_con.c 28 Mar 2004 04:25:52 -0000 1.11 @@ -132,7 +132,10 @@ else if (type == ECORE_CON_LOCAL_SYSTEM) { mask = 0; - snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", name, port); + if (name[0] == '/') + snprintf(buf, sizeof(buf), "%s|%i", name, port); + else + snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", name, port); } pmode = umask(mask); start: @@ -286,7 +289,12 @@ snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, name, port); } else if (type == ECORE_CON_LOCAL_SYSTEM) - snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", name, port); + { + if (name[0] == '/') + snprintf(buf, sizeof(buf), "%s|%i", name, port); + else + snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", name, port); + } svr->fd = socket(AF_UNIX, SOCK_STREAM, 0); if (svr->fd < 0) goto error; if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) goto error; |
From: <enl...@li...> - 2004-04-23 22:17:08
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: ecore_x_dnd.c ecore_x_events.c ecore_x_private.h Log Message: Events: - Or the requested event mask with the current mask, instead of replacing it. DND: - Set default action on drop to Ask =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_dnd.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ecore_x_dnd.c 19 Mar 2004 18:40:09 -0000 1.6 +++ ecore_x_dnd.c 23 Apr 2004 22:17:00 -0000 1.7 @@ -81,6 +81,10 @@ _xdnd->state = ECORE_X_DND_DRAGGING; _xdnd->time = _ecore_x_event_last_time; + /* Default Accepted Action: ask */ + _xdnd->action = _ecore_x_atom_xdnd_action_ask; + _xdnd->accepted_action = None; + /* TODO: Set supported data types in API */ _type_text_plain = ecore_x_atom_get("text/plain"); _xdnd->num_types = 1; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- ecore_x_events.c 21 Feb 2004 08:58:20 -0000 1.25 +++ ecore_x_events.c 23 Apr 2004 22:17:01 -0000 1.26 @@ -18,7 +18,11 @@ void ecore_x_event_mask_set(Ecore_X_Window w, long mask) { - XSelectInput(_ecore_x_disp, w, mask); + XWindowAttributes attr; + + memset(&attr, 0, sizeof(XWindowAttributes)); + XGetWindowAttributes(_ecore_x_disp, w, &attr); + XSelectInput(_ecore_x_disp, w, mask | attr.your_event_mask); } static void =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_private.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- ecore_x_private.h 29 Mar 2004 21:10:48 -0000 1.25 +++ ecore_x_private.h 23 Apr 2004 22:17:01 -0000 1.26 @@ -248,9 +248,11 @@ void _ecore_x_selection_data_init(void); void _ecore_x_selection_shutdown(void); Atom _ecore_x_selection_target_atom_get(char *target); -char * _ecore_x_selection_target_get(Atom target); +char * + _ecore_x_selection_target_get(Atom target); void _ecore_x_selection_request_data_set(Ecore_X_Selection_Data data); -Ecore_X_Selection_Data * _ecore_x_selection_get(Atom selection); +Ecore_X_Selection_Data * + _ecore_x_selection_get(Atom selection); int _ecore_x_selection_set(Window w, unsigned char *data, int len, Atom selection); int _ecore_x_selection_convert(Atom selection, Atom target, void **data_ret); |
From: <enl...@li...> - 2004-04-23 22:48:29
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_events.c Log Message: - Use XChangeWindowAttributes() instead of XSelectInput() - Add event_mask_unset to allow deselecting events =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.43 retrieving revision 1.44 diff -u -3 -r1.43 -r1.44 --- Ecore_X.h 11 Apr 2004 21:09:12 -0000 1.43 +++ Ecore_X.h 23 Apr 2004 22:48:20 -0000 1.44 @@ -698,6 +698,7 @@ int ecore_x_error_code_get(void); void ecore_x_event_mask_set(Ecore_X_Window w, long mask); +void ecore_x_event_mask_unset(Ecore_X_Window w, long mask); int ecore_x_selection_primary_set(Ecore_X_Window w, unsigned char *data, int size); int ecore_x_selection_primary_clear(void); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -3 -r1.26 -r1.27 --- ecore_x_events.c 23 Apr 2004 22:17:01 -0000 1.26 +++ ecore_x_events.c 23 Apr 2004 22:48:21 -0000 1.27 @@ -19,10 +19,24 @@ ecore_x_event_mask_set(Ecore_X_Window w, long mask) { XWindowAttributes attr; + XSetWindowAttributes s_attr; memset(&attr, 0, sizeof(XWindowAttributes)); XGetWindowAttributes(_ecore_x_disp, w, &attr); - XSelectInput(_ecore_x_disp, w, mask | attr.your_event_mask); + s_attr.event_mask = mask | attr.your_event_mask; + XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr); +} + +void +ecore_x_event_mask_unset(Ecore_X_Window w, long mask) +{ + XWindowAttributes attr; + XSetWindowAttributes s_attr; + + memset(&attr, 0, sizeof(XWindowAttributes)); + XGetWindowAttributes(_ecore_x_disp, w, &attr); + s_attr.event_mask = attr.your_event_mask & ~mask; + XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr); } static void |
From: <enl...@li...> - 2004-04-24 05:49:53
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_events.c Log Message: Realign Ecore_X event masks with Xlib event masks. This fixes the bug causing some input select requests not to work. *API Change warning* =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.44 retrieving revision 1.45 diff -u -3 -r1.44 -r1.45 --- Ecore_X.h 23 Apr 2004 22:48:20 -0000 1.44 +++ Ecore_X.h 24 Apr 2004 05:49:46 -0000 1.45 @@ -69,25 +69,27 @@ typedef enum _Ecore_X_Event_Mask { - ECORE_X_EVENT_MASK_KEY_DOWN = (1 << 0), - ECORE_X_EVENT_MASK_KEY_UP = (1 << 1), - ECORE_X_EVENT_MASK_MOUSE_DOWN = (1 << 2), - ECORE_X_EVENT_MASK_MOUSE_UP = (1 << 3), - ECORE_X_EVENT_MASK_MOUSE_IN = (1 << 4), - ECORE_X_EVENT_MASK_MOUSE_OUT = (1 << 5), - ECORE_X_EVENT_MASK_MOUSE_MOVE = (1 << 6), - ECORE_X_EVENT_MASK_WINDOW_DAMAGE = (1 << 7), - ECORE_X_EVENT_MASK_WINDOW_VISIBILITY = (1 << 8), - ECORE_X_EVENT_MASK_WINDOW_CONFIGURE = (1 << 9), - ECORE_X_EVENT_MASK_WINDOW_MANAGE = (1 << 10), - ECORE_X_EVENT_MASK_WINDOW_RESIZE_MANAGE = (1 << 11), - ECORE_X_EVENT_MASK_WINDOW_CHILD_CONFIGURE = (1 << 13), - ECORE_X_EVENT_MASK_WINDOW_FOCUS_IN = (1 << 14), - ECORE_X_EVENT_MASK_WINDOW_FOCUS_OUT = (1 << 15), - ECORE_X_EVENT_MASK_WINDOW_PROPERTY = (1 << 16), - ECORE_X_EVENT_MASK_WINDOW_COLORMAP = (1 << 17), - ECORE_X_EVENT_MASK_WINDOW_GRAB = (1 << 18), - ECORE_X_EVENT_MASK_MOUSE_WHEEL = (1 << 19) + ECORE_X_EVENT_MASK_NONE = 0L, + ECORE_X_EVENT_MASK_KEY_DOWN = (1L << 0), + ECORE_X_EVENT_MASK_KEY_UP = (1L << 1), + ECORE_X_EVENT_MASK_MOUSE_DOWN = (1L << 2), + ECORE_X_EVENT_MASK_MOUSE_UP = (1L << 3), + ECORE_X_EVENT_MASK_MOUSE_IN = (1L << 4), + ECORE_X_EVENT_MASK_MOUSE_OUT = (1L << 5), + ECORE_X_EVENT_MASK_MOUSE_MOVE = (1L << 6), + ECORE_X_EVENT_MASK_WINDOW_DAMAGE = (1L << 15), + ECORE_X_EVENT_MASK_WINDOW_VISIBILITY = (1L << 16), + ECORE_X_EVENT_MASK_WINDOW_CONFIGURE = (1L << 17), + ECORE_X_EVENT_MASK_WINDOW_RESIZE_MANAGE = (1L << 18), + ECORE_X_EVENT_MASK_WINDOW_MANAGE = (1L << 19), + ECORE_X_EVENT_MASK_WINDOW_CHILD_CONFIGURE = (1L << 20), + ECORE_X_EVENT_MSAK_WINDOW_FOCUS_CHANGE = (1L << 21), + ECORE_X_EVENT_MASK_WINDOW_PROPERTY = (1L << 22), + ECORE_X_EVENT_MASK_WINDOW_COLORMAP = (1L << 23), + ECORE_X_EVENT_MASK_WINDOW_GRAB = (1L << 24), + ECORE_X_EVENT_MASK_MOUSE_WHEEL = (1L << 29), + ECORE_X_EVENT_MASK_WINDOW_FOCUS_IN = (1L << 30), + ECORE_X_EVENT_MASK_WINDOW_FOCUS_OUT = (1L << 31) } Ecore_X_Event_Mask; typedef struct _Ecore_X_Event_Key_Down Ecore_X_Event_Key_Down; @@ -697,8 +699,8 @@ int ecore_x_error_request_get(void); int ecore_x_error_code_get(void); -void ecore_x_event_mask_set(Ecore_X_Window w, long mask); -void ecore_x_event_mask_unset(Ecore_X_Window w, long mask); +void ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask); +void ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask); int ecore_x_selection_primary_set(Ecore_X_Window w, unsigned char *data, int size); int ecore_x_selection_primary_clear(void); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -3 -r1.27 -r1.28 --- ecore_x_events.c 23 Apr 2004 22:48:21 -0000 1.27 +++ ecore_x_events.c 24 Apr 2004 05:49:46 -0000 1.28 @@ -16,7 +16,7 @@ static void _ecore_x_event_free_generic(void *data, void *ev); void -ecore_x_event_mask_set(Ecore_X_Window w, long mask) +ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask) { XWindowAttributes attr; XSetWindowAttributes s_attr; @@ -28,7 +28,7 @@ } void -ecore_x_event_mask_unset(Ecore_X_Window w, long mask) +ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask) { XWindowAttributes attr; XSetWindowAttributes s_attr; |
From: <enl...@li...> - 2004-04-30 05:58:25
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore Modified Files: AUTHORS Log Message: OK, I'll toot my own horn, if you insist... =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/AUTHORS,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- AUTHORS 30 Apr 2004 04:40:41 -0000 1.8 +++ AUTHORS 30 Apr 2004 05:58:18 -0000 1.9 @@ -4,6 +4,7 @@ Chris Ross <ch...@da...> Term <te...@tw...> Tilman Sauerbeck <ti...@co...> +Ibukun Olumuyiwa <ib...@co...> Yuri <da...@ho...> Nicholas Curran <qu...@bi...> Howell Tam <pi...@pi...> |
From: <enl...@li...> - 2004-04-30 17:29:00
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_events.c Log Message: Pass unhandled ClientMessages to application as an event. (Thanks, Gen Zhang) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- Ecore_X.h 30 Apr 2004 03:10:16 -0000 1.46 +++ Ecore_X.h 30 Apr 2004 17:28:53 -0000 1.47 @@ -452,8 +452,15 @@ struct _Ecore_X_Event_Client_Message { - Ecore_X_Window win; - Ecore_X_Time time; + Ecore_X_Window win; + Ecore_X_Atom message_type; + int format; + union { + char b[20]; + short s[10]; + long l[5]; + } data; + Ecore_X_Time time; }; struct _Ecore_X_Event_Window_Shape =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -3 -r1.28 -r1.29 --- ecore_x_events.c 24 Apr 2004 05:49:46 -0000 1.28 +++ ecore_x_events.c 30 Apr 2004 17:28:53 -0000 1.29 @@ -153,6 +153,14 @@ } static void +_ecore_x_event_free_client_message(void *data, void *ev) +{ + Ecore_X_Event_Client_Message *e; + e = ev; + free(e); +} + +static void _ecore_x_event_free_generic(void *data, void *ev) { free(ev); @@ -1285,7 +1293,18 @@ } else { - /* FIXME: handle this event type */ + Ecore_X_Event_Client_Message *e; + int i; + + e = (Ecore_X_Event_Client_Message *) calloc(1, sizeof(Ecore_X_Event_Client_Message)); + e->win = xevent->xclient.window; + e->message_type = xevent->xclient.message_type; + e->format = xevent->xclient.format; + for(i = 0; i < 5; i++) + e->data.l[i] = xevent->xclient.data.l[i]; + + ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, + _ecore_x_event_free_client_message, NULL); } } |
From: <enl...@li...> - 2004-08-20 22:37:16
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: ecore_x_events.c Log Message: Patch from Tilman for root window fallback in ecore_x_event_mask_set(). =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -3 -r1.31 -r1.32 --- ecore_x_events.c 17 Aug 2004 20:10:28 -0000 1.31 +++ ecore_x_events.c 20 Aug 2004 22:37:10 -0000 1.32 @@ -18,6 +18,9 @@ XWindowAttributes attr; XSetWindowAttributes s_attr; + if (!w) + w = DefaultRootWindow(_ecore_x_disp); + memset(&attr, 0, sizeof(XWindowAttributes)); XGetWindowAttributes(_ecore_x_disp, w, &attr); s_attr.event_mask = mask | attr.your_event_mask; @@ -30,6 +33,9 @@ XWindowAttributes attr; XSetWindowAttributes s_attr; + if (!w) + w = DefaultRootWindow(_ecore_x_disp); + memset(&attr, 0, sizeof(XWindowAttributes)); XGetWindowAttributes(_ecore_x_disp, w, &attr); s_attr.event_mask = attr.your_event_mask & ~mask; |
From: <enl...@li...> - 2004-09-15 05:14:53
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_config Modified Files: Ecore_Config.h Log Message: Begone, ye foul C# comments! =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/Ecore_Config.h,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- Ecore_Config.h 27 Jul 2004 21:27:25 -0000 1.34 +++ Ecore_Config.h 15 Sep 2004 05:14:43 -0000 1.35 @@ -29,12 +29,13 @@ */ typedef enum Ecore_Config_Type { - PT_NIL = 0, ///< Property with no value. - PT_INT = 1, ///< Integer property type. - PT_FLT = 2, ///< Float property type. - PT_STR = 3, ///< String property type. - PT_RGB = 4, ///< Colour property type. - PT_THM = 5 ///< Theme property type. + PT_NIL = 0, /* Property with no value. */ + PT_INT = 1, /* Integer property type. */ + PT_FLT = 2, /* Float property type. */ + PT_STR = 3, /* String property type. */ + PT_RGB = 4, /* Colour property type. */ + PT_THM = 5, /* Theme property type. */ + PT_BLN = 6, /// } Ecore_Config_Type; typedef enum Ecore_Config_Flag @@ -66,20 +67,20 @@ */ typedef struct Ecore_Config_Prop { - char *key; ///< Property key. - char *description; ///< Description set by ecore_config_descibe. - char short_opt; ///< short identifier on command line (-f) - char *long_opt; ///< long identifier on command line (--foo) - char *ptr; ///< Used as the value when the property is a string or theme. - Ecore_Config_Type type; ///< Property type. - long val; ///< Used as the value when the property is an integer, float or colour. - long lo; ///< Lower bound for the value when the property is an integer or float. - long hi; ///< Higher bound for the value when the property is an integer or float. - long step; ///< Increment for the value when the property is an integer or float. + char *key; /* Property key. */ + char *description; /* Description set by ecore_config_descibe. */ + char short_opt; /* short identifier on command line (-f) */ + char *long_opt; /* long identifier on command line (--foo) */ + char *ptr; /* Used as the value when the property is a string or theme. */ + Ecore_Config_Type type; /* Property type. */ + long val; /* Used as the value when the property is an integer, float or colour. */ + long lo; /* Lower bound for the value when the property is an integer or float. */ + long hi; /* Higher bound for the value when the property is an integer or float. */ + long step; /* Increment for the value when the property is an integer or float. */ Ecore_Config_Flag flags; /// < Configuration flags. - Ecore_Config_Listener_List *listeners; ///< List of change listeners. + Ecore_Config_Listener_List *listeners; /* List of change listeners. */ void *data; /// < Stores extra data for the property. - struct Ecore_Config_Prop *next; ///< Pointer to the next property in the list. + struct Ecore_Config_Prop *next; /* Pointer to the next property in the list. */ } Ecore_Config_Prop; /* @@ -89,12 +90,12 @@ */ typedef struct Ecore_Config_Bundle { - char *identifier; ///< Identifier for this set of properties (window ID for example) - char *owner; ///< This is used to store the application name related to the bundle - long serial; ///< Unique identifier to identify bundle - Ecore_Config_Prop *data; ///< Pointer to root of property list - void *user_data; ///< App specific pointer to "other data" - struct Ecore_Config_Bundle *next; ///< Pointer to next bundle in this application + char *identifier; /* Identifier for this set of properties (window ID for example) */ + char *owner; /* This is used to store the application name related to the bundle */ + long serial; /* Unique identifier to identify bundle */ + Ecore_Config_Prop *data; /* Pointer to root of property list */ + void *user_data; /* App specific pointer to "other data" */ + struct Ecore_Config_Bundle *next; /* Pointer to next bundle in this application */ } Ecore_Config_Bundle; typedef struct Ecore_Config_Server @@ -207,16 +208,16 @@ # define ECORE_CONFIG_ERR_PATHEX (-8) # define ECORE_CONFIG_ERR_TYPEMISMATCH (-7) # define ECORE_CONFIG_ERR_MUTEX (-6) -# define ECORE_CONFIG_ERR_NOTFOUND (-5) ///< Error indicating that the item searched for could not be found. -# define ECORE_CONFIG_ERR_OOM (-4) ///< Error given when the program runs out of memory. -# define ECORE_CONFIG_ERR_IGNORED (-3) ///< Error occurred, but was ignored. -# define ECORE_CONFIG_ERR_NODATA (-2) ///< Error given when necessary data is not provided. -# define ECORE_CONFIG_ERR_FAIL (-1) ///< Failure result. -# define ECORE_CONFIG_ERR_SUCC (0) ///< Success result. - -# define ECORE_CONFIG_PARSE_HELP (-2) ///< Help was displayed -# define ECORE_CONFIG_PARSE_EXIT (-1) ///< An error occurred -# define ECORE_CONFIG_PARSE_CONTINUE (0) ///< Arguments parsed successfully +# define ECORE_CONFIG_ERR_NOTFOUND (-5) /* Error indicating that the item searched for could not be found. */ +# define ECORE_CONFIG_ERR_OOM (-4) /* Error given when the program runs out of memory. */ +# define ECORE_CONFIG_ERR_IGNORED (-3) /* Error occurred, but was ignored. */ +# define ECORE_CONFIG_ERR_NODATA (-2) /* Error given when necessary data is not provided. */ +# define ECORE_CONFIG_ERR_FAIL (-1) /* Failure result. */ +# define ECORE_CONFIG_ERR_SUCC (0) /* Success result. */ + +# define ECORE_CONFIG_PARSE_HELP (-2) /* Help was displayed */ +# define ECORE_CONFIG_PARSE_EXIT (-1) /* An error occurred */ +# define ECORE_CONFIG_PARSE_CONTINUE (0) /* Arguments parsed successfully */ /* convenience mathods in convenience.c */ /* FIXME: this should only be included if evas is present */ |
From: <enl...@li...> - 2004-09-15 05:44:31
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_config Modified Files: Ecore_Config.h Log Message: Doxygen, the right way (thanks raster) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/Ecore_Config.h,v retrieving revision 1.35 retrieving revision 1.36 diff -u -3 -r1.35 -r1.36 --- Ecore_Config.h 15 Sep 2004 05:14:43 -0000 1.35 +++ Ecore_Config.h 15 Sep 2004 05:44:24 -0000 1.36 @@ -29,13 +29,13 @@ */ typedef enum Ecore_Config_Type { - PT_NIL = 0, /* Property with no value. */ - PT_INT = 1, /* Integer property type. */ - PT_FLT = 2, /* Float property type. */ - PT_STR = 3, /* String property type. */ - PT_RGB = 4, /* Colour property type. */ - PT_THM = 5, /* Theme property type. */ - PT_BLN = 6, /// + PT_NIL = 0, /**< Property with no value. */ + PT_INT = 1, /**< Integer property type. */ + PT_FLT = 2, /**< Float property type. */ + PT_STR = 3, /**< String property type. */ + PT_RGB = 4, /**< Colour property type. */ + PT_THM = 5, /**< Theme property type. */ + PT_BLN = 6, /**< Boolean property type. */ } Ecore_Config_Type; typedef enum Ecore_Config_Flag |
From: <enl...@li...> - 2004-09-23 01:56:16
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_config Modified Files: Ecore_Config.h convenience.c ecore_config.c Log Message: Add boolean type. It's essentially the same as an INT, but at least we have a boolean property API, and the ability to store bools if the backend supports it (which edb doesn't). =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/Ecore_Config.h,v retrieving revision 1.36 retrieving revision 1.37 diff -u -3 -r1.36 -r1.37 --- Ecore_Config.h 15 Sep 2004 05:44:24 -0000 1.36 +++ Ecore_Config.h 23 Sep 2004 01:56:09 -0000 1.37 @@ -119,6 +119,7 @@ Ecore_Config_Prop *ecore_config_get(const char *key); const char *ecore_config_type_get(const Ecore_Config_Prop * e); + int ecore_config_boolean_get(const char *key); void *ecore_config_data_get(const char *key); char *ecore_config_string_get(const char *key); long ecore_config_int_get(const char *key); @@ -139,6 +140,7 @@ int ecore_config_set(const char *key, char *val); int ecore_config_typed_set(const char *key, void *val, int type); + int ecore_config_boolean_set(const char *key, int val); int ecore_config_string_set(const char *key, char *val); int ecore_config_int_set(const char *key, int val); int ecore_config_rgb_set(const char *key, char *val); @@ -153,6 +155,7 @@ float lo, float hi, float step); int ecore_config_typed_default(const char *key, void *val, int type); + int ecore_config_boolean_default(const char *key, int val); int ecore_config_int_default(const char *key, int val); int ecore_config_int_default_bound(const char *key, int val, int lo, int hi, int step); @@ -236,6 +239,9 @@ int ecore_config_typed_create(const char *key, void *val, int type, char short_opt, char *long_opt, char *desc); + int ecore_config_boolean_create(const char *key, int val, + char short_opt, char *long_opt, + char *desc); int ecore_config_int_create(const char *key, int val, char short_opt, char *long_opt, char *desc); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/convenience.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- convenience.c 30 Jul 2004 12:28:29 -0000 1.21 +++ convenience.c 23 Sep 2004 01:56:09 -0000 1.22 @@ -75,6 +75,27 @@ } /** + * Creates a new boolean property, if it does not already exist, and sets its + * attributes to those given. + * @param key The property key. + * @param val Default boolean value of key. + * @param short_opt Short option used to set the property from command + * line. + * @param long_opt Long option used to set the property from command line. + * @param desc String description of property. + * @return @c ECORE_CONFIG_ERR_SUCC on success. + * @ingroup Ecore_Config_Create_Group + */ +int +ecore_config_boolean_create(const char *key, int val, char short_opt, + char *long_opt, char *desc) +{ + return + ecore_config_typed_create(key, (void *)&val, PT_BLN, short_opt, long_opt, + desc); +} + +/** * Creates a new integer property, if it does not already exist, and sets its * attributes to those given. * @param key The property key. =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_config/ecore_config.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- ecore_config.c 1 Sep 2004 20:55:23 -0000 1.46 +++ ecore_config.c 23 Sep 2004 01:56:09 -0000 1.47 @@ -28,7 +28,7 @@ static int _ecore_config_system_load(void); static char *_ecore_config_type[] = - { "undefined", "integer", "float", "string", "colour", "theme" }; + { "undefined", "integer", "float", "string", "colour", "theme", "boolean" }; /** * @defgroup Ecore_Config_Property_Group Ecore Config Property Functions @@ -172,6 +172,22 @@ } /** + * Returns the specified property as an integer. + * @param key The property key. + * @return The value of the property. The function returns -1 if the + * property is not an integer or is not set. + * @ingroup Ecore_Config_Get_Group + */ +int +ecore_config_boolean_get(const char *key) +{ + Ecore_Config_Prop *e; + + e = ecore_config_get(key); + return (e && ((e->type == PT_INT) || (e->type == PT_BLN))) ? (e->val != 0) : -1; +} + +/** * Returns the specified property as a long integer. * @param key The property key. * @return The integer value of the property. The function returns 0 if the @@ -330,6 +346,9 @@ case PT_INT: esprintf(&r, "%s:%s=%ld", key, type, ecore_config_int_get(key)); break; + case PT_BLN: + esprintf(&r, "%s:%s=%ld", key, type, ecore_config_boolean_get(key)); + break; case PT_FLT: esprintf(&r, "%s:%s=%lf", key, type, ecore_config_float_get(key)); break; @@ -468,6 +487,12 @@ e->val = (long)*i; e->type = PT_INT; } + else if (type == PT_BLN ) + { + i = (int *)val; + e->val = (long)*i; + e->type = PT_BLN; + } else if (type == PT_STR || type == PT_THM) { if (!(e->ptr = strdup(val))) @@ -719,6 +744,20 @@ } /** + * Sets the indicated property to the given boolean. + * @param key The property key. + * @param val Boolean integer to set the property to. + * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully. + * @ingroup Ecore_Config_Set_Group + */ +int +ecore_config_boolean_set(const char *key, int val) +{ + val = val ? 1 : 0; + return ecore_config_typed_set(key, (void *)&val, PT_BLN); +} + +/** * Sets the indicated property to the given integer. * @param key The property key. * @param val Integer to set the property to. @@ -919,6 +958,21 @@ } /** + * Sets the indicated property to the given boolean if the property has not yet + * been set. + * @param key The property key. + * @param val Boolean Integer to set the value to. + * @return @c ECORE_CONFIG_ERR_SUCC if there are no problems. + * @ingroup Ecore_Config_Default_Group + */ +int +ecore_config_boolean_default(const char *key, int val) +{ + val = val ? 1 : 0; + return ecore_config_typed_default(key, (void *)&val, PT_BLN); +} + +/** * Sets the indicated property to the given integer if the property has not yet * been set. * @param key The property key. |
From: <enl...@li...> - 2004-10-24 03:58:18
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: ecore_x.c ecore_x_dnd.c ecore_x_selection.c Log Message: Flesh out a little more Xdnd code =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -3 -r1.46 -r1.47 --- ecore_x.c 23 Oct 2004 02:19:19 -0000 1.46 +++ ecore_x.c 24 Oct 2004 03:58:10 -0000 1.47 @@ -400,7 +400,7 @@ _ecore_x_atom_selection_prop_primary = XInternAtom(_ecore_x_disp, "_ECORE_SELECTION_PRIMARY", False); _ecore_x_atom_selection_prop_secondary = XInternAtom(_ecore_x_disp, "_ECORE_SELECTION_SECONDARY", False); _ecore_x_atom_selection_prop_clipboard = XInternAtom(_ecore_x_disp, "_ECORE_SELECTION_CLIPBOARD", False); - _ecore_x_atom_selection_prop_xdnd = XInternAtom(_ecore_x_disp, "_ECORE_SELECTION_XDND", False); + _ecore_x_atom_selection_prop_xdnd = XInternAtom(_ecore_x_disp, "JXSelectionWindowProperty", False); _ecore_x_atom_selection_xdnd = XInternAtom(_ecore_x_disp, "XdndSelection", False); _ecore_x_atom_xdnd_aware = XInternAtom(_ecore_x_disp, "XdndAware", False); _ecore_x_atom_xdnd_type_list = XInternAtom(_ecore_x_disp, "XdndTypeList", False); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_dnd.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- ecore_x_dnd.c 23 Apr 2004 22:17:00 -0000 1.7 +++ ecore_x_dnd.c 24 Oct 2004 03:58:11 -0000 1.8 @@ -203,7 +203,7 @@ xev.xclient.message_type = _ecore_x_atom_xdnd_position; xev.xclient.data.l[0] = _xdnd->source; xev.xclient.data.l[1] = 0; /* Reserved */ - xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y * 0xffff); + xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y & 0xffff); xev.xclient.data.l[3] = CurrentTime; /* Version 1 */ xev.xclient.data.l[4] = _xdnd->action; /* Version 2, Needs to be pre-set */ XSendEvent(_ecore_x_disp, win, False, 0, &xev); @@ -241,4 +241,26 @@ _xdnd->dest = win; } +void +_ecore_x_dnd_send_finished(void) +{ + XEvent xev; + + xev.xany.type = ClientMessage; + xev.xany.display = _ecore_x_disp; + xev.xclient.window = _xdnd->source; + xev.xclient.message_type = _ecore_x_atom_xdnd_finished; + xev.xclient.format = 32; + + xev.xclient.data.l[0] = _xdnd->dest; + memset(xev.xclient.data.l + 1, 0, sizeof(long) * 3); + XSendEvent(_ecore_x_disp, _xdnd->source, False, 0, &xev); +} + +int +_ecore_x_dnd_own_selection(void) +{ + return (!XSetSelectionOwner(_ecore_x_disp, _ecore_x_atom_selection_xdnd, + _xdnd->source, CurrentTime)); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_selection.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- ecore_x_selection.c 20 Feb 2004 07:06:29 -0000 1.14 +++ ecore_x_selection.c 24 Oct 2004 03:58:11 -0000 1.15 @@ -325,6 +325,8 @@ prop = _ecore_x_atom_selection_prop_primary; else if (selection == _ecore_x_atom_selection_secondary) prop = _ecore_x_atom_selection_prop_secondary; + else if (selection == _ecore_x_atom_selection_xdnd) + prop = _ecore_x_atom_selection_prop_xdnd; else prop = _ecore_x_atom_selection_prop_clipboard; @@ -523,3 +525,4 @@ } } + |
From: <enl...@li...> - 2004-10-24 05:52:29
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: ecore_x_dnd.c ecore_x_events.c ecore_x_private.h Log Message: Xdnd: Handle drag motion events and check that status rectangle =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_dnd.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- ecore_x_dnd.c 24 Oct 2004 03:58:11 -0000 1.8 +++ ecore_x_dnd.c 24 Oct 2004 05:52:07 -0000 1.9 @@ -197,8 +197,8 @@ } /* FIXME: Handle box information */ - if (!_xdnd->await_status) - { + /*if (!_xdnd->await_status) + {*/ xev.xclient.window = win; xev.xclient.message_type = _ecore_x_atom_xdnd_position; xev.xclient.data.l[0] = _xdnd->source; @@ -208,7 +208,7 @@ xev.xclient.data.l[4] = _xdnd->action; /* Version 2, Needs to be pre-set */ XSendEvent(_ecore_x_disp, win, False, 0, &xev); _xdnd->await_status = 1; - } + /*}*/ } if (_xdnd->state == ECORE_X_DND_DROPPED) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_events.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- ecore_x_events.c 19 Oct 2004 16:50:02 -0000 1.34 +++ ecore_x_events.c 24 Oct 2004 05:52:07 -0000 1.35 @@ -419,7 +419,9 @@ void _ecore_x_event_handle_motion_notify(XEvent *xevent) { - Ecore_X_Event_Mouse_Move *e; + Ecore_X_Event_Mouse_Move *e; + int x1, x2, y1, y2; + Ecore_X_DND_Protocol *_xdnd; e = calloc(1, sizeof(Ecore_X_Event_Mouse_Move)); if (!e) return; @@ -436,6 +438,23 @@ _ecore_x_event_last_win = e->win; _ecore_x_event_last_root_x = e->root.x; _ecore_x_event_last_root_y = e->root.y; + + /* Xdnd handling */ + _xdnd = _ecore_x_dnd_protocol_get(); + if (_xdnd->state == ECORE_X_DND_DRAGGING) + { + /* Determine if we're still in the rectangle from the last status */ + x1 = _xdnd->rectangle.x; + x2 = _xdnd->rectangle.x + _xdnd->rectangle.width; + y1 = _xdnd->rectangle.y; + y2 = _xdnd->rectangle.y + _xdnd->rectangle.height; + if (e->win != _xdnd->dest || e->root.x < x1 || e->root.x > x2 + || e->root.y < y1 || e->root.y > y2) + { + _ecore_x_dnd_drag(e->root.x, e->root.y); + } + } + ecore_event_add(ECORE_X_EVENT_MOUSE_MOVE, e, NULL, NULL); } =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_private.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- ecore_x_private.h 23 Oct 2004 14:26:25 -0000 1.29 +++ ecore_x_private.h 24 Oct 2004 05:52:07 -0000 1.30 @@ -277,4 +277,6 @@ void _ecore_x_dnd_init(void); Ecore_X_DND_Protocol * _ecore_x_dnd_protocol_get(void); +void _ecore_x_dnd_drag(int x, int y); + #endif |
From: <enl...@li...> - 2004-11-26 05:58:37
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: ecore_x_mwm.c Log Message: It's MWM, not ICCCM. :) =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_mwm.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- ecore_x_mwm.c 25 Nov 2004 14:09:24 -0000 1.1 +++ ecore_x_mwm.c 26 Nov 2004 05:58:28 -0000 1.2 @@ -1,7 +1,7 @@ /* - * Various ICCCM related functions. + * Various MWM related functions. * - * This is ALL the code involving anything ICCCM related. for both WM and + * This is ALL the code involving anything MWM related. for both WM and * client. */ #include "Ecore.h" |
From: <enl...@li...> - 2004-11-26 06:42:34
|
Enlightenment CVS committal Author : xcomputerman Project : e17 Module : libs/ecore Dir : e17/libs/ecore/src/lib/ecore_x Modified Files: Ecore_X.h ecore_x_icccm.c ecore_x_window_prop.c Log Message: More ICCCM code, replicated from window_prop*. Corresponding functions are deprecated and will be removed in the future. =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/Ecore_X.h,v retrieving revision 1.76 retrieving revision 1.77 diff -u -3 -r1.76 -r1.77 --- Ecore_X.h 25 Nov 2004 14:09:23 -0000 1.76 +++ Ecore_X.h 26 Nov 2004 06:42:24 -0000 1.77 @@ -995,6 +995,24 @@ ecore_x_icccm_title_set(Ecore_X_Window win, const char *t); EAPI char * ecore_x_icccm_title_get(Ecore_X_Window win); + EAPI void + ecore_x_icccm_protocol_set(Ecore_X_Window win, + Ecore_X_WM_Protocol protocol, + int on); + EAPI int + ecore_x_icccm_protocol_isset(Ecore_X_Window win, + Ecore_X_WM_Protocol protocol); + EAPI void + ecore_x_icccm_name_class_set(Ecore_X_Window win, + const char *n, + const char *c); + EAPI char * + ecore_x_icccm_client_machine_get(Ecore_X_Window win); + EAPI void + ecore_x_icccm_command_set(Ecore_X_Window win, int argc, char **argv); + EAPI void + ecore_x_icccm_command_get(Ecore_X_Window win, int *argc, char ***argv); + typedef enum _Ecore_X_MWM_Hint_Func { =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_icccm.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- ecore_x_icccm.c 24 Nov 2004 07:27:58 -0000 1.7 +++ ecore_x_icccm.c 26 Nov 2004 06:42:24 -0000 1.8 @@ -409,6 +409,191 @@ return NULL; } +/** + * Set or unset a wm protocol property. + * @param win The Window + * @param protocol The protocol to enable/disable + * @param on On/Off + */ +void +ecore_x_icccm_protocol_set(Ecore_X_Window win, + Ecore_X_WM_Protocol protocol, + int on) +{ + Atom *protos = NULL; + Atom proto; + int protos_count = 0; + int already_set = 0; + int i; + + /* Check for invalid values */ + if (protocol < 0 || protocol >= ECORE_X_WM_PROTOCOL_NUM) + return; + + proto = _ecore_x_atoms_wm_protocols[protocol]; + + if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count)) + { + protos = NULL; + protos_count = 0; + } + + for (i = 0; i < protos_count; i++) + { + if (protos[i] == proto) + { + already_set = 1; + break; + } + } + + if (on) + { + Atom *new_protos = NULL; + + if (already_set) goto leave; + new_protos = malloc((protos_count + 1) * sizeof(Atom)); + if (!new_protos) goto leave; + for (i = 0; i < protos_count; i++) + new_protos[i] = protos[i]; + new_protos[protos_count] = proto; + XSetWMProtocols(_ecore_x_disp, win, new_protos, protos_count + 1); + free(new_protos); + } + else + { + if (!already_set) goto leave; + for (i = 0; i < protos_count; i++) + { + if (protos[i] == proto) + { + int j; + + for (j = i + 1; j < protos_count; j++) + protos[j-1] = protos[j]; + if (protos_count > 1) + XSetWMProtocols(_ecore_x_disp, win, protos, + protos_count - 1); + else + XDeleteProperty(_ecore_x_disp, win, + _ecore_x_atom_wm_protocols); + goto leave; + } + } + } + + leave: + if (protos) + XFree(protos); + +} + + +/** + * Determines whether a protocol is set for a window. + * @param win The Window + * @param protocol The protocol to query + * @return 1 if the protocol is set, else 0. + */ +int +ecore_x_icccm_protocol_isset(Ecore_X_Window win, + Ecore_X_WM_Protocol protocol) +{ + Atom proto, *protos = NULL; + int i, ret = 0, protos_count = 0; + + /* check for invalid values */ + if (protocol < 0 || protocol >= ECORE_X_WM_PROTOCOL_NUM) + return 0; + + proto = _ecore_x_atoms_wm_protocols[protocol]; + + if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count)) + return 0; + + for (i = 0; i < protos_count; i++) + if (protos[i] == proto) + { + ret = 1; + break; + } + + XFree(protos); + return ret; + +} + +/** + * Set a window name & class. + * @param win The window + * @param n The name string + * @param c The class string + * + * Set a window name * class + */ +void +ecore_x_icccm_name_class_set(Ecore_X_Window win, + const char *n, + const char *c) +{ + XClassHint *xch; + + xch = XAllocClassHint(); + if (!xch) + return; + xch->res_name = (char *)n; + xch->res_class = (char *)c; + XSetClassHint(_ecore_x_disp, win, xch); + XFree(xch); +} + +/** + * Get a window client machine string. + * @param win The window + * @return The windows client machine string + * + * Return the client machine of a window. String must be free'd when done with. + */ +char * +ecore_x_icccm_client_machine_get(Ecore_X_Window win) +{ + char *name; + + name = ecore_x_window_prop_string_get(win, _ecore_x_atom_wm_client_machine); + return name; +} + +/** + * Sets the WM_COMMAND property for @a win. + * + * @param win The window. + * @param argc Number of arguments. + * @param argv Arguments. + */ +void +ecore_x_icccm_command_set(Ecore_X_Window win, int argc, char **argv) +{ + XSetCommand(_ecore_x_disp, win, argv, argc); +} + +/** + * Get the WM_COMMAND property for @a win. + * + * Return the command of a window. String must be free'd when done with. + * + * @param win The window. + * @param argc Number of arguments. + * @param argv Arguments. + */ +void +ecore_x_window_icccm_command_get(Ecore_X_Window win, int *argc, char ***argv) +{ + XGetCommand(_ecore_x_disp, win, argv, argc); +} + + + + /* FIXME: move these things in here as they are icccm related */ /* get/set wm protocols */ /* get/set name/class */ =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore_x/ecore_x_window_prop.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -3 -r1.53 -r1.54 --- ecore_x_window_prop.c 25 Nov 2004 14:09:24 -0000 1.53 +++ ecore_x_window_prop.c 26 Nov 2004 06:42:24 -0000 1.54 @@ -260,6 +260,8 @@ * @param win The window. * @param argc Number of arguments. * @param argv Arguments. + * + * DEPRECATED. Please use ecore_x_icccm_command_set() instead. */ void ecore_x_window_prop_command_set(Ecore_X_Window win, int argc, char **argv) @@ -275,6 +277,8 @@ * @param win The window. * @param argc Number of arguments. * @param argv Arguments. + * + * DEPRECATED. Please use ecore_x_icccm_command_get() instead. */ void ecore_x_window_prop_command_get(Ecore_X_Window win, int *argc, char ***argv) @@ -382,6 +386,7 @@ * @return The windows client machine string * * Return the client machine of a window. String must be free'd when done with. + * DEPRECATED. Please use ecore_x_icccm_client_machine_get() instead. */ char * ecore_x_window_prop_client_machine_get(Ecore_X_Window win) @@ -423,6 +428,7 @@ * @param c The class string * * Set a window name * class + * DEPRECATED. Please use ecore_x_icccm_name_class_set() instead. */ void ecore_x_window_prop_name_class_set(Ecore_X_Window win, const char *n, const char *c) @@ -473,7 +479,8 @@ * @param win The Window * @param protocol The protocol to enable/disable * @param on On/Off - * + * + * DEPRECATED. Please use ecore_x_icccm_protocol_set() instead. */ void ecore_x_window_prop_protocol_set(Ecore_X_Window win, @@ -547,6 +554,8 @@ * @param win The Window * @param protocol The protocol to query * @return 1 if the protocol is set, else 0. + * + * DEPRECATED. Please use ecore_x_icccm_protocol_isset() instead. */ int ecore_x_window_prop_protocol_isset(Ecore_X_Window win, |