Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
DISCONTINUED:openSUSE:11.2:Update
x11-input-evtouch
evtouch-misc-fixes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File evtouch-misc-fixes.patch of Package x11-input-evtouch
# # This patch is from http://www.postnuklear.de/xorg-patches/ # # Description: This is a patch for the evtouch input driver ( # http://stz-softwaretechnik.com/~ke/touchscreen/evtouch.html). # Changes (for full description see ChangeLog file after patching (-: ): # o Changed code to compile a working driver for both XInput ABI 0.x and 2.0 (Xorg 1.4.0) # o changed rotation (due to segfault on xorg + fbdev) # o drag support # o tap "tolerance" # o added generic ts-adc touchscreen device to udev rules file # # Feel free to send comments, critics, suggestions to harryrat@postnuklear.de # To apply simply change into the toplevel directory of the source to be modified and enter: # patch -p1 < <PATH_TO_PATCH> # # All patches are available under the GNU GPL, I hope they might be useful for you (-: # - Harald Radke # Index: xserver-xorg-input-evtouch/69-touchscreen.rules =================================================================== --- xserver-xorg-input-evtouch.orig/69-touchscreen.rules 2008-02-02 21:49:20.783972805 +0900 +++ xserver-xorg-input-evtouch/69-touchscreen.rules 2008-02-02 21:49:39.730979724 +0900 @@ -7,8 +7,11 @@ # Name can be found in /proc/bus/input/devices ('cat /proc/bus/input/devices') # -# These are the touchscreens supported by kernel's "usbtouchscreen" module +# Generic ts-adc touchscreen modules +KERNEL=="event*", SUBSYSTEM=="input", ATTRS{name}=="ts-adc", SYMLINK+="input/evtouch_event" + +# These are the touchscreens supported by kernel's "usbtouchscreen" module # eGalax Inc. USB TouchController) KERNEL=="event*", SUBSYSTEM=="input", ATTRS{idVendor}=="3823", ATTRS{idProduct}=="0001", SYMLINK+="input/evtouch_event" # eGalax Inc. USB TouchController) Index: xserver-xorg-input-evtouch/ChangeLog =================================================================== --- xserver-xorg-input-evtouch.orig/ChangeLog 2008-02-02 21:49:20.795972782 +0900 +++ xserver-xorg-input-evtouch/ChangeLog 2008-02-02 21:49:39.730979724 +0900 @@ -1,3 +1,61 @@ +0.8.7-HR *** Note this is not an official release but an "unauthorized + *** fix version by me (Harald Radke - harryrat@postnuklear.de) + -> Changed code to compile a working driver for both + XInput ABI 0.x and 2.0 (Xorg 1.4.0) + (test compile for 0.x still needs to be done) + - evtouch.c: + * capsulated xf86Post*Events and xf86InputSetScreen + in functions where depending on the XINPUT ABI conversion + is done or xf86 functions are directly called + * xf86InitValuatorAxisStruct and xf86AlwaysCore() depending + on ABI done + - libtouch.h: passing xf86PostButtonEvent capsulation function + to init function (same as in evtouch.c) to do proper button + triggering + -> Rotation: + - added support for Option "Rotate" "UD" (upside down) + in evtouch input section of xorg.conf + - due to Segfault with (at least) fbdev video device, only + evtouch "Rotate" option is taken into calculations for coords, + meaning to get proper touchscreen behaviour on rotated X screens. + same Rotate option as in video device section of xorg.conf has + to be set in the evtouch section + -> Drag support: + Option "<STATE>_drag" "<BUTTON_ID>" has been added. When set, + the handle_<STATE>() function triggers BUTTON_DOWN for Button <BUTTON_ID> + before changing into S_MOVE state. Note that actually only + Option "touched_drag" "<BUTTON_ID>" is implemented, rest is dummy + (and doesn't make too much sense I guess) (-; + -> tap "tolerance": + introduce move_limit to evtouch.c as it is in libtouch.c, using it + to discard ABS_X/Y position changes if they are inside move_limit + around cur_x/y. this way pointer hopping can be avoided as well as + proper touched_drag established + - changes of cur_x/y are reported on EV_SYN in evtouch.c ReadInput() instead + on EV_ABS + -> added generic ts-adc touchscreen device to udev rules file + + => Example for a Loox720 PDA setup in input section of xorg.conf: + Section "InputDevice" + Identifier "touchscreen" + Driver "evtouch" + Option "Device" "/dev/input/evtouch_event" + Option "MinX" "434" + Option "MinY" "333" + Option "MaxX" "3643" + Option "MaxY" "3804" + Option "SwapX" "true" + Option "longtouched_action" "down" + Option "longtouched_button" "3" + Option "maybetapped_action" "click" + Option "maybetapped_button" "1" + Option "touched_drag" "1" + Option "oneandahalftap_button" "0" + Option "TapTimer" "30" + Option "LongtouchTimer" "500" + Option "MoveLimit" "18" + EndSection + 0.8.7 - Added Elo Touchscreen to udev-rules (Stephen Webb) - Added "fix" for AMD64-crashes on touch (Martin Letenay) Index: xserver-xorg-input-evtouch/evtouch.c =================================================================== --- xserver-xorg-input-evtouch.orig/evtouch.c 2008-02-02 21:49:20.811973497 +0900 +++ xserver-xorg-input-evtouch/evtouch.c 2008-02-02 21:49:39.734971242 +0900 @@ -182,6 +182,20 @@ static const char *default_options[] = static int ControlProc(LocalDevicePtr device, xDeviceCtl *ctrl); +static void +PostMotionEvent(LocalDevicePtr local); + +static void +PostProximityEvent(LocalDevicePtr local,int is_in); + +static void +PostButtonEvent(LocalDevicePtr local, int button, + int is_down, int x,int y); + +static void +InputSetScreen(LocalDevicePtr local); + + /***************************************************************************** * Function Definitions ****************************************************************************/ @@ -197,11 +211,10 @@ emulate3Timer(OsTimerPtr timer, CARD32 n LocalDevicePtr local = (LocalDevicePtr)_local; EVTouchPrivatePtr priv = (EVTouchPrivatePtr) local->private; + sigstate = xf86BlockSIGIO(); - xf86PostMotionEvent(local->dev, TRUE, 0, 2, - priv->cur_x, - priv->cur_y); + PostMotionEvent(local); /* * Emit a button press -- release is handled in EVTouchLBRBEvent @@ -209,31 +222,21 @@ emulate3Timer(OsTimerPtr timer, CARD32 n if ( ( priv->touch_flags & LB_STAT ) && !( priv->touch_flags & RB_STAT ) ) { DBGOUT(2, "EVTouch: Left Press\n"); - xf86PostButtonEvent (local->dev, TRUE, - 1, 1, 0, 2, - priv->cur_x, - priv->cur_y); + PostButtonEvent (local, 1, 1,priv->cur_x,priv->cur_y); } if ( ( priv->touch_flags & RB_STAT ) && !( priv->touch_flags & LB_STAT ) ) { DBGOUT(2, "EVTouch: Right Press\n"); - xf86PostButtonEvent (local->dev, TRUE, - 3, 1, 0, 2, - priv->cur_x, - priv->cur_y); - } - + PostButtonEvent (local, 3, 1,priv->cur_x,priv->cur_y); + } /* Handling "middle" button press */ if ( ( priv->touch_flags & RB_STAT ) && ( priv->touch_flags & LB_STAT ) ) { DBGOUT(2, "EVTouch: Middle Press\n"); - xf86PostButtonEvent (local->dev, TRUE, - 2, 1, 0, 2, - priv->cur_x, - priv->cur_y); + PostButtonEvent (local, 2, 1,priv->cur_x,priv->cur_y); } priv->emulate3_timer_expired = TRUE; @@ -246,6 +249,7 @@ static void DoBtnAction(EVTouchPrivatePt { int btn = 0; LocalDevicePtr local = priv->local; + DBGOUT(2, "EVTouch: %s btn_count=%d\n", __FUNCTION__, priv->btn_count); for (btn = 0; btn < priv->btn_count; btn++) { @@ -262,12 +266,7 @@ static void DoBtnAction(EVTouchPrivatePt DBGOUT(2, "EVTouch: %s btn = %d action = %d\n", __FUNCTION__, btn, priv->btn_actions[btn].action); - - xf86PostButtonEvent (local->dev, TRUE, btn, - priv->btn_actions[btn].action, - 0, 2, - priv->cur_x, - priv->cur_y); + PostButtonEvent (local, btn, priv->btn_actions[btn].action,priv->cur_x,priv->cur_y); priv->btn_actions[btn].do_it = 0; priv->btn_actions[btn].action = 0; @@ -292,39 +291,32 @@ void EVTouchProcessAbs(EVTouchPrivatePtr ev = &priv->ev; if ( (ev->code == ABS_X) || (ev->code == ABS_Z) ) { + if ((priv->cur_x - ev->value < priv->move_limit) + && (priv->cur_x - ev->value > -priv->move_limit)) + return; priv->cur_x = ev->value; - libtouchSetXPos(priv->libtouch, priv->cur_x); +// libtouchSetXPos(priv->libtouch, priv->cur_x); } if ( (ev->code == ABS_Y) || (ev->code == ABS_RX) ) { + if ((priv->cur_y - ev->value < priv->move_limit) + && (priv->cur_y - ev->value > -priv->move_limit)) + return; priv->cur_y = ev->value; - libtouchSetYPos(priv->libtouch, priv->cur_y); +// libtouchSetYPos(priv->libtouch, priv->cur_y); } if (ev->code == ABS_WHEEL) { LocalDevicePtr local = priv->local; - if (ev->value > 0) { for (; ev->value > 0; ev->value--) { - xf86PostButtonEvent (local->dev, TRUE, - 4, 1, 0, 2, - priv->cur_x, - priv->cur_y); - xf86PostButtonEvent (local->dev, TRUE, - 4, 0, 0, 2, - priv->cur_x, - priv->cur_y); + PostButtonEvent (local, 4,1,priv->cur_x,priv->cur_y); + PostButtonEvent (local, 4,0,priv->cur_x,priv->cur_y); } } else if (ev->value < 0) { for (ev->value = -ev->value; ev->value > 0; ev->value--) { - xf86PostButtonEvent (local->dev, TRUE, - 5, 1, 0, 2, - priv->cur_x, - priv->cur_y); - xf86PostButtonEvent (local->dev, TRUE, - 5, 0, 0, 2, - priv->cur_x, - priv->cur_y); + PostButtonEvent (local, 5,1,priv->cur_x,priv->cur_y); + PostButtonEvent (local, 5,0,priv->cur_x,priv->cur_y); } } } @@ -451,10 +443,7 @@ void EVTouchProcessKey(EVTouchPrivatePtr default: return; } - xf86PostButtonEvent(local->dev, TRUE, - btn, ev->value, 0, 2, - priv->cur_x, - priv->cur_y); + PostButtonEvent (local, btn, ev->value,priv->cur_x,priv->cur_y); #endif return; @@ -492,8 +481,8 @@ DeviceOn (DeviceIntPtr dev) priv->buffer = XisbNew(local->fd, 64); - DBG (9, XisbTrace (priv->buffer, 1)); - +// breaks compilation +// DBG (9, XisbTrace (priv->buffer, 1)); if (!priv->buffer) { @@ -637,8 +626,19 @@ DeviceInit (DeviceIntPtr dev) ErrorF ("Unable to allocate EVTouch touchscreen ValuatorClassDeviceStruct\n"); return !Success; } - - xf86InitValuatorAxisStruct(dev, 0, priv->min_x, priv->max_x, +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 2 + xf86InitValuatorAxisStruct(dev, 0, 0, priv->screen_width, + 1024, + EV_AXIS_MIN_RES /* min_res */ , + EV_AXIS_MAX_RES /* max_res */ ); + xf86InitValuatorDefaults(dev, 0); + xf86InitValuatorAxisStruct(dev, 1, 0, priv->screen_height, + 1024, + EV_AXIS_MIN_RES /* min_res */ , + EV_AXIS_MAX_RES /* max_res */ ); + xf86InitValuatorDefaults(dev, 1); +#else + xf86InitValuatorAxisStruct(dev, 0, priv->min_x, priv->max_x, 1024, EV_AXIS_MIN_RES /* min_res */ , EV_AXIS_MAX_RES /* max_res */ ); @@ -648,7 +648,7 @@ DeviceInit (DeviceIntPtr dev) EV_AXIS_MIN_RES /* min_res */ , EV_AXIS_MAX_RES /* max_res */ ); xf86InitValuatorDefaults(dev, 1); - +#endif /* Initial position of pointer on screen: Centered */ priv->cur_x=(priv->max_x - priv->min_x)/2; priv->cur_y=(priv->max_y - priv->min_y)/2; @@ -777,14 +777,8 @@ static void ReadInput (LocalDevicePtr lo DBGOUT(2, "EVTouch: %s type:%0.2x code: 0x%0.4x value:%d\n", __FUNCTION__, ev->type, ev->code, ev->value); - xf86XInputSetScreen(local, - priv->screen_num, - priv->cur_x, - priv->cur_y); - - xf86PostProximityEvent(local->dev, 1, 0, 2, - priv->cur_x, - priv->cur_y); + InputSetScreen(local); + PostProximityEvent (local,1); switch (ev->type) { case EV_ABS: @@ -794,9 +788,7 @@ static void ReadInput (LocalDevicePtr lo EVTouchProcessRel(priv); break; case EV_KEY: - xf86PostMotionEvent (local->dev, TRUE, 0, 2, - priv->cur_x, - priv->cur_y); + PostMotionEvent (local); if (priv->ev.code == BTN_TOUCH) { if (priv->ev.value == 1) { @@ -811,9 +803,8 @@ static void ReadInput (LocalDevicePtr lo EVTouchProcessKey(priv); break; case EV_SYN: - xf86PostMotionEvent (local->dev, TRUE, 0, 2, - priv->cur_x, - priv->cur_y); + libtouchSetPos(priv->libtouch, priv->cur_x,priv->cur_y); + PostMotionEvent (local); if ( priv->touch_flags & TOUCHED ) libtouchTriggerSM(priv->libtouch, PEN_TOUCHED); @@ -902,7 +893,9 @@ ConvertProc ( LocalDevicePtr local, EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private); ScrnInfoPtr pScrn = xf86Screens[priv->screen_num]; - Rotation rotation = RRGetRotation(pScrn->pScreen); + +// X Segfaults +// Rotation rotation = RRGetRotation(pScrn->pScreen); DBGOUT(2, "EVTouch: FIRST: v0=%d v1=%d\n", v0, v1); @@ -921,15 +914,17 @@ ConvertProc ( LocalDevicePtr local, max_x = priv->max_x - priv->min_x; max_y = priv->max_y - priv->min_y; - if (priv->rotate == EV_ROTATE_NONE) { + +// if (priv->rotate == EV_ROTATE_NONE) { screen_width = pScrn->currentMode->HDisplay; screen_height = pScrn->currentMode->VDisplay; +/* Swapping is done below in Coords! Leave those to be able to calc correct mapping } else { screen_width = pScrn->currentMode->VDisplay; screen_height = pScrn->currentMode->HDisplay; } - +*/ if (xc < (max_x / 2)) { /* left @@ -1042,45 +1037,57 @@ ConvertProc ( LocalDevicePtr local, int tmp = 0; /* rotation mixes x and y up a bit */ - if (priv->rotate == EV_ROTATE_CW) { + switch(priv->rotate) { + case EV_ROTATE_CW: tmp = xc; xc = yc; yc = screen_width - tmp; - } else if (priv->rotate == EV_ROTATE_CCW) { + break; + case EV_ROTATE_CCW: tmp = xc; xc = screen_height - yc; yc = tmp; + break; + case EV_ROTATE_UD: + xc = screen_width - xc; + yc = screen_height - yc; + break; + default: + break; } - switch (rotation) { - case RR_Rotate_0: +/* X Segfaults on rotation setting + switch (rotation) { + case RR_Rotate_0: v0 = xc; v1 = yc; - break; - case RR_Rotate_180: - v0 = screen_width - xc; - v1 = screen_height - yc; - break; - case RR_Rotate_90: + break; + case RR_Rotate_180: + v0 = screen_width - xc; + v1 = screen_height - yc; + break; + case RR_Rotate_90: tmp = xc; - v0 = screen_height - yc; + v0 = screen_height - yc; v1 = tmp; - break; - case RR_Rotate_270: + break; + case RR_Rotate_270: tmp = xc; - v0 = yc; - v1 = screen_width - tmp; - break; - default: - break; - } + v0 = yc; + v1 = screen_width - tmp; + break; + default: + break; + } + + +*/ } DBGOUT(2, "EVTouch: FINAL: v0=%d v1=%d\n", v0, v1); - *x = v0; - *y = v1; - + *x = xc; + *y = yc; return (TRUE); } @@ -1133,8 +1140,9 @@ EVTouchPreInit(InputDriverPtr drv, IDevP xf86OptionListReport(local->options); + priv->libtouch = xcalloc(1, sizeof(LibTouchRec)); - libtouchInit(priv->libtouch, local); + libtouchInit(priv->libtouch, local,PostButtonEvent); priv->screen_num = xf86SetIntOption(local->options, "ScreenNumber", 0 ); @@ -1164,9 +1172,9 @@ EVTouchPreInit(InputDriverPtr drv, IDevP timeo = xf86SetIntOption(local->options, "LongtouchTimer", 160); libtouchSetLongtouchTimeo(priv->libtouch, timeo); - libtouchSetMoveLimit(priv->libtouch, - xf86SetIntOption( local->options, - "MoveLimit", 180 )); + priv->move_limit = xf86SetIntOption( local->options, + "MoveLimit", 180 ); + libtouchSetMoveLimit(priv->libtouch, priv->move_limit); priv->rotate = EV_ROTATE_NONE; s = xf86FindOptionValue(local->options, "Rotate"); @@ -1175,7 +1183,11 @@ EVTouchPreInit(InputDriverPtr drv, IDevP priv->rotate = EV_ROTATE_CW; } else if (xf86NameCmp(s, "CCW") == 0 ) { priv->rotate = EV_ROTATE_CCW; - } + } else if (xf86NameCmp(s, "UD") == 0 ) { + priv->rotate = EV_ROTATE_UD; + } + + } if (priv->rotate == EV_ROTATE_NONE) { @@ -1207,9 +1219,10 @@ EVTouchPreInit(InputDriverPtr drv, IDevP priv->diff[i][0], priv->diff[i][1]); } +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0 xf86AlwaysCore(local, TRUE); +#endif priv->touch_flags = 0; - local->history_size = xf86SetIntOption( local->options, "HistorySize", 0 ); /* prepare to process touch packets */ @@ -1232,6 +1245,7 @@ EVTouchPreInit(InputDriverPtr drv, IDevP xf86CloseSerial(local->fd); local->fd = -1; + return (local); } @@ -1243,3 +1257,58 @@ EVTouchPtrCtrl(DeviceIntPtr device, PtrC Ho Hum. */ } + + +static void +PostMotionEvent(LocalDevicePtr local) { +int cur_x, cur_y; +EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private); + + cur_x = priv->cur_x; + cur_y = priv->cur_y; +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 2 + ConvertProc(local,0,2,priv->cur_x,priv->cur_y,0,0,0,0,&cur_x,&cur_y); +#endif + +xf86PostMotionEvent (local->dev, TRUE, 0, 2, cur_x, cur_y); +} + +static void +PostProximityEvent(LocalDevicePtr local, int is_in) { +int cur_x, cur_y; +EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private); + + cur_x = priv->cur_x; + cur_y = priv->cur_y; +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 2 + ConvertProc(local,0,2,priv->cur_x,priv->cur_y,0,0,0,0,&cur_x,&cur_y); +#endif + +xf86PostProximityEvent(local->dev, is_in, 0, 2, cur_x,cur_y); +} + +static void +PostButtonEvent(LocalDevicePtr local, int button, int is_down,int x, int y) { +EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private); + +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 2 + ConvertProc(local,0,2,x,y,0,0,0,0,&x,&y); +#endif + +xf86PostButtonEvent (local->dev, TRUE, button, is_down, 0, 2, x, y); +} + + +static void InputSetScreen(LocalDevicePtr local) { +int cur_x, cur_y; +EVTouchPrivatePtr priv = (EVTouchPrivatePtr) (local->private); + + cur_x = priv->cur_x; + cur_y = priv->cur_y; +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 2 + ConvertProc(local,0,2,priv->cur_x,priv->cur_y,0,0,0,0,&cur_x,&cur_y); +#endif + +xf86XInputSetScreen(local,priv->screen_num,cur_x,cur_y); +} + Index: xserver-xorg-input-evtouch/evtouch.h =================================================================== --- xserver-xorg-input-evtouch.orig/evtouch.h 2008-02-02 21:49:20.823984091 +0900 +++ xserver-xorg-input-evtouch/evtouch.h 2008-02-02 21:49:39.734971242 +0900 @@ -42,6 +42,7 @@ #define EV_ROTATE_NONE 0 #define EV_ROTATE_CW 1 #define EV_ROTATE_CCW 2 +#define EV_ROTATE_UD 3 #define EV_AXIS_MIN_RES 0 #define EV_AXIS_MAX_RES 1024 @@ -80,6 +81,7 @@ typedef struct _EVTouchPrivateRec int max_rel_y; /* Maximum y */ int drag_timer; + int move_limit; Bool emulate3; int emulate3_timeout; OsTimerPtr emulate3_timer; @@ -138,6 +140,7 @@ typedef struct _EVTouchPrivateRec LibTouchRecPtr libtouch; LocalDevicePtr local; + } EVTouchPrivateRec, *EVTouchPrivatePtr; Index: xserver-xorg-input-evtouch/libtouch.c =================================================================== --- xserver-xorg-input-evtouch.orig/libtouch.c 2008-02-02 21:49:36.899983517 +0900 +++ xserver-xorg-input-evtouch/libtouch.c 2008-02-02 21:49:39.734971242 +0900 @@ -52,6 +52,7 @@ typedef struct state { int (*handle_state)(LibTouchRecPtr priv); void (*action)(LibTouchRecPtr priv, int btn, int x, int y); int btn; + int drag_btn; } state_t; @@ -68,16 +69,14 @@ typedef enum states { static void btn_down_action(LibTouchRecPtr priv, int btn, int x, int y) { DBG(4, ErrorF("LibTouch: Issuing Button %d down\n", btn)); - xf86PostButtonEvent(priv->local->dev, TRUE, - btn, 1, 0, 2, x, y); + priv->post_button_proc(priv->local,btn, 1,x,y); priv->pressed_btn_stat |= 1 << btn; } static void btn_up_action(LibTouchRecPtr priv, int btn, int x, int y) { DBG(4, ErrorF("LibTouch: Issuing Button %d up\n", btn)); - xf86PostButtonEvent(priv->local->dev, TRUE, - btn, 0, 0, 2, x, y); + priv->post_button_proc(priv->local,btn, 0,x,y); priv->pressed_btn_stat &= ~(1 << btn); } @@ -103,13 +102,13 @@ static int handle_oneandahalftap(LibTouc static void dump_configuration(); state_t state_ar[] = { - {enter_untouched, handle_untouched, NULL, 0}, - {enter_touched, handle_touched, NULL, 0}, - {enter_longtouched, handle_longtouched, btn_down_action, 1}, - {enter_moving, handle_moving, NULL, 0}, - {enter_maybetap, handle_maybetap, btn_click_action, 1}, - {enter_oneandahalftap, handle_oneandahalftap, btn_down_action, 3}, - {NULL, NULL, NULL, -1}, + {enter_untouched, handle_untouched, NULL, 0,-1}, + {enter_touched, handle_touched, NULL, 0,-1}, + {enter_longtouched, handle_longtouched, btn_down_action, 1,-1}, + {enter_moving, handle_moving, NULL, 0,-1}, + {enter_maybetap, handle_maybetap, btn_click_action, 1,-1}, + {enter_oneandahalftap, handle_oneandahalftap, btn_down_action, 3,-1}, + {NULL, NULL, NULL, -1,-1}, }; char *state_str[] = { @@ -142,6 +141,16 @@ char *state_button_str[] = { NULL, }; +char *state_drag_str[] = { + "untouched_drag", + "touched_drag", + "longtouched_drag", + "moving_drag", + "maybetapped_drag", + "oneandahalftap_drag", + NULL, +}; + char *action_str[] = { "down", "up", @@ -177,13 +186,13 @@ void libtouchSetMoveLimit(LibTouchRecPtr } -void libtouchInit(LibTouchRecPtr libtouch, LocalDevicePtr local) +void libtouchInit(LibTouchRecPtr libtouch, LocalDevicePtr local,pointer post_button_proc) { int state_action_idx = 0; int state_button_idx = 0; + int state_drag_idx = 0; int action_idx = 0; int btn; - char *str; xf86memset(libtouch, 0, sizeof(LibTouchRec)); @@ -193,6 +202,7 @@ void libtouchInit(LibTouchRecPtr libtouc libtouch->local = local; libtouch->move_limit = 30; + libtouch->post_button_proc = post_button_proc; /* Actions: up, down, click @@ -228,6 +238,11 @@ void libtouchInit(LibTouchRecPtr libtouc } } + /* parse dragging for the states, that is which button sent to be as down, when in state and about to change to MOVING state */ + for (state_drag_idx = 0; state_drag_str[state_drag_idx] != NULL; state_drag_idx++) { + btn = xf86SetIntOption(local->options, state_drag_str[state_drag_idx], -1); + if (btn != -1) state_ar[state_drag_idx].drag_btn = btn; + } dump_configuration(); } @@ -359,10 +374,7 @@ static void enter_untouched(LibTouchRecP for (i = 0; i < bit_size; i++) if (priv->pressed_btn_stat & (1 << i)) { DBG(4, ErrorF("LibTouch: Issuing Button-release %d\n", i)); - xf86PostButtonEvent(priv->local->dev, TRUE, - i, 0, 0, 2, - priv->cur_x, - priv->cur_y); + priv->post_button_proc(priv->local,i, 0,priv->cur_x,priv->cur_y); } priv->pressed_btn_stat = 0; @@ -445,6 +457,10 @@ static int handle_touched(LibTouchRecPtr if (priv->cur_x != priv->old_x) { dx = delta(priv->touch_x, priv->cur_x); if (dx > priv->move_limit) { + if((state_ar[S_TOUCHED].drag_btn != -1) && (priv->touch_time != priv->now)){ + libtouchSetTime(priv, GetTimeInMillis()); + btn_down_action(priv, state_ar[S_TOUCHED].drag_btn, priv->cur_x,priv->cur_y); + } return S_MOVING; } } @@ -454,7 +470,10 @@ static int handle_touched(LibTouchRecPtr if (priv->cur_y != priv->old_y) { dy = delta(priv->touch_y, priv->cur_y); if (dy > priv->move_limit) { - return S_MOVING; + if((state_ar[S_TOUCHED].drag_btn != -1) && (priv->touch_time != priv->now)){ + libtouchSetTime(priv, GetTimeInMillis()); + btn_down_action(priv, state_ar[S_TOUCHED].drag_btn, priv->cur_x,priv->cur_y); +} return S_MOVING; } } } @@ -500,7 +519,7 @@ static int handle_longtouched(LibTouchRe } else { if (priv->cur_x != priv->old_x) { dx = delta(priv->touch_x, priv->cur_x); - if (dx > priv->move_limit) + if (dx > priv->move_limit) rc = S_MOVING; } Index: xserver-xorg-input-evtouch/libtouch.h =================================================================== --- xserver-xorg-input-evtouch.orig/libtouch.h 2008-02-02 21:49:36.899983517 +0900 +++ xserver-xorg-input-evtouch/libtouch.h 2008-02-02 21:49:39.734971242 +0900 @@ -50,6 +50,7 @@ typedef struct _libtouch { CARD32 past; CARD32 now; LocalDevicePtr local; + void (*post_button_proc)(LocalDevicePtr local,int button, int is_down,int x,int y); } LibTouchRec, *LibTouchRecPtr; void libtouchSetDebugLevel(int level); @@ -59,7 +60,7 @@ void libtouchSetOneandahalftapTimeo(LibT void libtouchSetTime(LibTouchRecPtr libtouch, CARD32 now); void libtouchSetMoveLimit(LibTouchRecPtr libtouch, int move_limit); -void libtouchInit(LibTouchRecPtr libtouch, LocalDevicePtr local); +void libtouchInit(LibTouchRecPtr libtouch, LocalDevicePtr local,pointer post_button_proc); void libtouchSetPos(LibTouchRecPtr libtouch, int x, int y); void libtouchTriggerSM(LibTouchRecPtr libtouch, LibTouchState_t touch);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor