169 lines
3.6 KiB
C
169 lines
3.6 KiB
C
#include "xgl.h"
|
|
#include "xegl.h"
|
|
|
|
KdOsFuncs *kdOsFuncs;
|
|
Bool kdEmulateMiddleButton;
|
|
Bool kdRawPointerCoordinates;
|
|
Bool kdDontZap;
|
|
Bool kdDisableZaphod;
|
|
int kdScreenPrivateIndex;
|
|
|
|
static char *
|
|
KdParseFindNext (char *cur, char *delim, char *save, char *last)
|
|
{
|
|
while (*cur && !strchr (delim, *cur))
|
|
{
|
|
*save++ = *cur++;
|
|
}
|
|
*save = 0;
|
|
*last = *cur;
|
|
if (*cur)
|
|
cur++;
|
|
return cur;
|
|
}
|
|
|
|
/*
|
|
* Mouse argument syntax:
|
|
*
|
|
* device,protocol,options...
|
|
*
|
|
* Options are any of:
|
|
* 1-5 n button mouse
|
|
* 2button emulate middle button
|
|
* {NMO} Reorder buttons
|
|
*/
|
|
char *
|
|
KdSaveString (char *str)
|
|
{
|
|
char *n = (char *) xalloc (strlen (str) + 1);
|
|
|
|
if (!n)
|
|
return 0;
|
|
strcpy (n, str);
|
|
return n;
|
|
}
|
|
|
|
/*
|
|
* Parse mouse information. Syntax:
|
|
*
|
|
* <device>,<nbutton>,<protocol>{,<option>}...
|
|
*
|
|
* options: {nmo} pointer mapping (e.g. {321})
|
|
* 2button emulate middle button
|
|
* 3button dont emulate middle button
|
|
*/
|
|
void
|
|
KdParseMouse (char *arg)
|
|
{
|
|
char save[1024];
|
|
char delim;
|
|
KdMouseInfo *mi;
|
|
int i;
|
|
|
|
mi = KdMouseInfoAdd ();
|
|
if (!mi)
|
|
return;
|
|
mi->name = 0;
|
|
mi->prot = 0;
|
|
mi->emulateMiddleButton = kdEmulateMiddleButton;
|
|
mi->transformCoordinates = !kdRawPointerCoordinates;
|
|
mi->nbutton = 3;
|
|
for (i = 0; i < KD_MAX_BUTTON; i++)
|
|
mi->map[i] = i + 1;
|
|
|
|
if (!arg)
|
|
return;
|
|
if (strlen (arg) >= sizeof (save))
|
|
return;
|
|
arg = KdParseFindNext (arg, ",", save, &delim);
|
|
if (!save[0])
|
|
return;
|
|
mi->name = KdSaveString (save);
|
|
if (delim != ',')
|
|
return;
|
|
|
|
arg = KdParseFindNext (arg, ",", save, &delim);
|
|
if (!save[0])
|
|
return;
|
|
|
|
if ('1' <= save[0] && save[0] <= '0' + KD_MAX_BUTTON && save[1] == '\0')
|
|
{
|
|
mi->nbutton = save[0] - '0';
|
|
if (mi->nbutton > KD_MAX_BUTTON)
|
|
{
|
|
UseMsg ();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!delim != ',')
|
|
return;
|
|
|
|
arg = KdParseFindNext (arg, ",", save, &delim);
|
|
|
|
if (save[0])
|
|
mi->prot = KdSaveString (save);
|
|
|
|
while (delim == ',')
|
|
{
|
|
arg = KdParseFindNext (arg, ",", save, &delim);
|
|
if (save[0] == '{')
|
|
{
|
|
char *s = save + 1;
|
|
i = 0;
|
|
while (*s && *s != '}')
|
|
{
|
|
if ('1' <= *s && *s <= '0' + mi->nbutton)
|
|
mi->map[i] = *s - '0';
|
|
else
|
|
UseMsg ();
|
|
s++;
|
|
}
|
|
}
|
|
else if (!strcmp (save, "2button"))
|
|
mi->emulateMiddleButton = TRUE;
|
|
else if (!strcmp (save, "3button"))
|
|
mi->emulateMiddleButton = FALSE;
|
|
else if (!strcmp (save, "rawcoord"))
|
|
mi->transformCoordinates = FALSE;
|
|
else if (!strcmp (save, "transform"))
|
|
mi->transformCoordinates = TRUE;
|
|
else
|
|
UseMsg ();
|
|
}
|
|
}
|
|
|
|
KdMouseInfo *kdMouseInfo;
|
|
|
|
KdMouseInfo *
|
|
KdMouseInfoAdd (void)
|
|
{
|
|
KdMouseInfo *mi, **prev;
|
|
|
|
mi = (KdMouseInfo *) xalloc (sizeof (KdMouseInfo));
|
|
if (!mi)
|
|
return 0;
|
|
bzero (mi, sizeof (KdMouseInfo));
|
|
for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next);
|
|
*prev = mi;
|
|
return mi;
|
|
}
|
|
|
|
void
|
|
KdMouseInfoDispose (KdMouseInfo *mi)
|
|
{
|
|
KdMouseInfo **prev;
|
|
|
|
for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next)
|
|
if (*prev == mi)
|
|
{
|
|
*prev = mi->next;
|
|
if (mi->name)
|
|
xfree (mi->name);
|
|
if (mi->prot)
|
|
xfree (mi->prot);
|
|
xfree (mi);
|
|
break;
|
|
}
|
|
}
|