www.pudn.com > xvoice-0.8.1.rar > EventStream.cc


/**
* EventStream.cc
*
* Description: implementation of an ordered list of X events
*
* Copyright (c) 1999, David Z. Creemer.
* See the LICENSE file. All rights not granted therein are reserved.
*
* @author David Z. Creemer
* @version 1.0
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

#include "x.h"

#include "MainWin.h"
#include "Error.h"
#include "BuildEvent.h"
#include "EventStream.h"

struct sKeyValue {
char *name;
int value;
};

static struct sKeyValue skeys[] = {
"page up", 127,
"page down", 128,
"right arrow", 129,
"left arrow", 130,
"up arrow", 131,
"down arrow", 132,
"escape", 133,
NULL, -1
};

static sKeyValue* specialKey(const char *string)
{
int i = 0;
while (skeys[i].name != NULL)
{
if (!strcasecmp(string, skeys[i].name)) return &amt;skeys[i];
++i;
}
return NULL;
}

//Parse a single key in an event stream
bool EventStream::parseKeyEvent( const char** a )
{
const char** attrs;
int c = '\0';
bool alt = false, ctrl = false, shift = false;

attrs = a;
while ( *attrs )
{
const char* key = *attrs++;
const char* value = *attrs++;

if ( strcasecmp( key, "alt" ) == 0 )
{
alt = ( strcasecmp( value, "true" ) == 0 );
}
else if ( strcasecmp( key, "control" ) == 0 )
{
ctrl = ( strcasecmp( value, "true" ) == 0 );
}
else if ( strcasecmp( key, "shift" ) == 0 )
{
shift = ( strcasecmp( value, "true" ) == 0 );
}
}

attrs = a;
while ( *attrs )
{
const char* key = *attrs++;
const char* value = *attrs++;
sKeyValue *sk;
if ( strcasecmp( key, "char" ) == 0 )
{
while (*value) {
c = *value;
//need to handle \t, \n \r explicitly:
if(c=='\\'){
if(value[1] == 't'){
c=9;
} else if(value[1]=='r'){
c=13;
} else if(value[1]=='b'){
c=8;
} else {
c=value[1];
}
value+=2;
} else if ((sk=specialKey(value))!=NULL) {
dbgprintf(("name >s, value >d\n",sk->name,sk->value));
c = sk->value;
value+=strlen(sk->name);
} else {
++value;
}
Event ev(alt, ctrl, shift, c);
push_back(ev);
}
}
}

return true;
}

bool EventStream::parseMouseEvent( const char** attrs )
{
char down = true;
int button =1 ;
int x = 0, y = 0;
bool alt = false, ctrl = false, shift = false;

while ( *attrs )
{
const char* key = *attrs++;
const char* value = *attrs++;

if ( strcasecmp( key, "button" ) == 0 )
{
button = atoi( value );
}
else if ( strcasecmp( key, "x" ) == 0 )
{
x = atoi( value );
}
else if ( strcasecmp( key, "y" ) == 0 )
{
y = atoi( value );
}
else if ( strcasecmp( key, "down" ) == 0 )
{
down = ( strcasecmp( value, "true" ) == 0 );
}
else if ( strcasecmp( key, "alt" ) == 0 )
{
alt = ( strcasecmp( value, "true" ) == 0 );
}
else if ( strcasecmp( key, "control" ) == 0 )
{
ctrl = ( strcasecmp( value, "true" ) == 0 );
}
else if ( strcasecmp( key, "shift" ) == 0 )
{
shift = ( strcasecmp( value, "true" ) == 0 );
}
else
{
fprintf( stderr, "Unknown attribute: >s\n", key );
return false;
}
}

Event ev( button, down, x, y, alt, ctrl, shift );
push_back(ev);
return true;
}


bool EventStream::parseGrammarEvent( const char** attrs )
{
const char *name = NULL;
bool enable = true;

while ( *attrs )
{
const char* key = *attrs++;
const char* value = *attrs++;

if ( strcasecmp( key, "name" ) == 0 )
{
name = value;
}
else if ( strcasecmp( key, "action" ) == 0 )
{
enable = ( strcasecmp( value, "on" ) == 0 );
dbgprintf(("action >d\n", enable));
}
}
if (name == NULL) return false;
Event ev( enable, name );
push_back(ev);
return true;
}