[PATCH 18/18] Make action strings configurable via synclient

walter harms wharms at bfs.de
Sat Oct 9 08:40:52 PDT 2010



Takashi Iwai schrieb:
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
>  include/synaptics-properties.h |   10 ++++++
>  src/keymap.c                   |   58 ++++++++++++++++++++++++++----------
>  src/properties.c               |   63 ++++++++++++++++++++++++++++++++++++++++
>  src/synaptics.c                |   60 ++++++++++++++++++-------------------
>  src/synapticsstr.h             |   28 +++++++++---------
>  tools/synclient.c              |   49 ++++++++++++++++++++++++++++--
>  6 files changed, 203 insertions(+), 65 deletions(-)
> 
> diff --git a/include/synaptics-properties.h b/include/synaptics-properties.h
> index c31c53c..7267669 100644
> --- a/include/synaptics-properties.h
> +++ b/include/synaptics-properties.h
> @@ -185,4 +185,14 @@
>  /* 32 bit, 2 values */
>  #define SYNAPTICS_PROP_THREEFINGER_DELTA "Synaptics Three-Finger Delta"
>  
> +/* STR */
> +#define SYNAPTICS_PROP_ZOOM_IN_ACTION "Synaptics Zoom-In Action"
> +#define SYNAPTICS_PROP_ZOOM_OUT_ACTION "Synaptics Zoom-Out Action"
> +
> +/* STR */
> +#define SYNAPTICS_PROP_3FINGER_LEFT_ACTION "Synaptics 3-Finger Left Action"
> +#define SYNAPTICS_PROP_3FINGER_RIGHT_ACTION "Synaptics 3-Finger Right Action"
> +#define SYNAPTICS_PROP_3FINGER_UP_ACTION "Synaptics 3-Finger Up Action"
> +#define SYNAPTICS_PROP_3FINGER_DOWN_ACTION "Synaptics 3-Finger Down Action"
> +
>  #endif /* _SYNAPTICS_PROPERTIES_H_ */
> diff --git a/src/keymap.c b/src/keymap.c
> index b1e7cc6..0c365a2 100644
> --- a/src/keymap.c
> +++ b/src/keymap.c
> @@ -142,15 +142,30 @@ static int string_to_keysym(const char *str)
>  }
>  
>  int SynapticsParseActionStr(LocalDevicePtr local, const char *_str,
> -			    int *action, int max_actions)
> +			    SynapticsAction *action)
>  {
>      char *item;
>      char *str, *next;
> -    int num_actions = 0;
>  
> -    str = xstrdup(_str);
> +    if (action->str) {
> +	if (_str && !strcmp(action->str, _str))
> +	    return TRUE;
> +	free(action->str);
> +	action->str = NULL;
> +    }
> +
> +    action->num_actions = 0;
> +    if (!_str)
> +	return TRUE;
> +
> +    str = strdup(_str);
>      if (!str)
> -	return 0;
> +	return FALSE;
> +    action->str = strdup(_str);
> +    if (!action->str) {
> +	free(str);
> +	return FALSE;
> +    }
>      for (item = str; item && *item; item = next) {
>  	int button, keysym, keycode;
>  
> @@ -160,7 +175,8 @@ int SynapticsParseActionStr(LocalDevicePtr local, const char *_str,
>  	if (!*item)
>  	    continue;
>  	if (sscanf(item, "Button%d", &button) == 1) {
> -	    action[num_actions++] = (ACTION_BUTTON << 16) | button;
> +	    action->action[action->num_actions++] =
> +		(ACTION_BUTTON << 16) | button;
>  	} else {
>  	    keysym = string_to_keysym(item);
>  	    if (keysym == NoSymbol) {
> @@ -175,15 +191,17 @@ int SynapticsParseActionStr(LocalDevicePtr local, const char *_str,
>  		continue;
>  	    }
>  	    if (get_modifier(keysym))
> -		action[num_actions++] = (ACTION_KEYMOD << 16) | keycode;
> +		action->action[action->num_actions++] =
> +		    (ACTION_KEYMOD << 16) | keycode;
>  	    else
> -		action[num_actions++] = (ACTION_KEY << 16) | keycode;
> +		action->action[action->num_actions++] =
> +		    (ACTION_KEY << 16) | keycode;
>  	}
> -	if (num_actions >= max_actions)
> +	if (action->num_actions >= MAX_ACTIONS)
>  	    break;
>      }
>      free(str);
> -    return num_actions;
> +    return TRUE;
>  }
>  
>  static void
> @@ -196,13 +214,13 @@ Bool SynapticsInitKeyboard(DeviceIntPtr dev)
>      return InitKeyboardDeviceStruct(dev, NULL, NULL, synaptics_kbdctrl);
>  }
>  
> -void SynapticsSendAction(LocalDevicePtr local, int num_actions, int *action)
> +void SynapticsSendAction(LocalDevicePtr local, SynapticsAction *action)
>  {
>      int n;
>  
> -    for (n = 0; n < num_actions; n++) {
> -	int val = action[n] & 0xffff;
> -	switch ((action[n] >> 16) & 0xf) {
> +    for (n = 0; n < action->num_actions; n++) {
> +	int val = action->action[n] & 0xffff;
> +	switch ((action->action[n] >> 16) & 0xf) {
>  	case ACTION_KEYMOD:
>  	    xf86PostKeyboardEvent(local->dev, val, TRUE);
>  	    break;
> @@ -216,12 +234,20 @@ void SynapticsSendAction(LocalDevicePtr local, int num_actions, int *action)
>  	    break;
>  	}
>      }
> -    for (n = num_actions - 1; n >= 0; n--) {
> -	int val = action[n] & 0xffff;
> -	switch ((action[n] >> 16) & 0xf) {
> +    for (n = action->num_actions - 1; n >= 0; n--) {
> +	int val = action->action[n] & 0xffff;
> +	switch ((action->action[n] >> 16) & 0xf) {
>  	case ACTION_KEYMOD:
>  	    xf86PostKeyboardEvent(local->dev, val, FALSE);
>  	    break;
>  	}
>      }
>  }
> +
> +void SynapticsFreeAction(SynapticsAction *action)
> +{
> +    if (action && action->str) {
> +	free(action->str);
> +	action->str = NULL;
> +    }
> +}
> diff --git a/src/properties.c b/src/properties.c
> index 9977b28..e694189 100644
> --- a/src/properties.c
> +++ b/src/properties.c
> @@ -92,6 +92,12 @@ Atom prop_multi_touch_pinch     = 0;
>  Atom prop_gesture_mode_notify   = 0;
>  Atom prop_gesture_mode          = 0;
>  Atom prop_threefinger           = 0;
> +Atom prop_zoom_in_action        = 0;
> +Atom prop_zoom_out_action       = 0;
> +Atom prop_3finger_left_action   = 0;
> +Atom prop_3finger_right_action  = 0;
> +Atom prop_3finger_up_action     = 0;
> +Atom prop_3finger_down_action   = 0;
>  
>  static Atom
>  InitAtom(DeviceIntPtr dev, char *name, int format, int nvalues, int *values)
> @@ -141,6 +147,38 @@ InitFloatAtom(DeviceIntPtr dev, char *name, int nvalues, float *values)
>      return atom;
>  }
>  
> +static Atom
> +InitStringAtom(DeviceIntPtr dev, char *name, char *val)
> +{
> +    Atom atom;
> +
> +    if (!val)
> +	val = "";
> +    atom = MakeAtom(name, strlen(name), TRUE);
> +    XIChangeDeviceProperty(dev, atom, XA_STRING, 8, PropModeReplace,
> +                           strlen(val), (unsigned char *)val, FALSE);
> +    XISetDevicePropertyDeletable(dev, atom, FALSE);
> +    return atom;
> +}
> +
> +static int
> +SetActionStr(LocalDevicePtr local, XIPropertyValuePtr prop,
> +	     SynapticsAction *action)
> +{
> +    if (prop->format != 8 || prop->type != XA_STRING)
> +	return BadMatch;
> +    if (prop->data && prop->size > 0) {
> +	char *str = calloc(1, prop->size + 1);
> +	if (!str)
> +	    return BadAlloc;
> +	memcpy(str, prop->data, prop->size);
> +	SynapticsParseActionStr(local, str, action);
> +	free(str);
> +    } else
> +	SynapticsParseActionStr(local, NULL, action);
> +    return Success;
> +}

i found this more easy to understand:

{
    char *str=NULL;
    if (prop->format != 8 || prop->type != XA_STRING)
	return BadMatch;

    if (prop->data && prop->size > 0) {
	char *str = calloc(1, prop->size + 1);
	if (!str)
	    return BadAlloc;
	memcpy(str, prop->data, prop->size);
    }

    SynapticsParseActionStr(local, NULL, action);
    free(str);
    return Success;
}



re,
 wh




More information about the xorg-devel mailing list