#include "cstrdup.h"
#include "file.h"
#include "guicast.h"
+#include "keys.h"
#include "linklist.h"
#include "loadfile.h"
#include "mainmenu.h"
}
KeySymMapping KeySymMapping::key_sym_mapping[] = {
+// button keycodes
{ "XK_Button_1", XK_Button_1 },
{ "XK_Button_2", XK_Button_2 },
{ "XK_Button_3", XK_Button_3 },
KeySym KeySymMapping::to_keysym(const char *str)
{
+ if( !strncmp("FWD_",str, 4) ) {
+ float speed = atof(str+4) / SHUTTLE_MAX_SPEED;
+ if( speed > SHUTTLE_MAX_SPEED ) return 0;
+ int key_code = (SKEY_MAX+SKEY_MIN)/2. +
+ (SKEY_MAX-SKEY_MIN)/2. * speed;
+ if( key_code > SKEY_MAX ) key_code = SKEY_MAX;
+ return key_code;
+ }
+ if( !strncmp("REV_",str, 4) ) {
+ float speed = atof(str+4) / SHUTTLE_MAX_SPEED;
+ if( speed > SHUTTLE_MAX_SPEED ) return 0;
+ int key_code = (SKEY_MAX+SKEY_MIN)/2. -
+ (SKEY_MAX-SKEY_MIN)/2. * speed;
+ if( key_code < SKEY_MIN ) key_code = SKEY_MIN;
+ return key_code;
+ }
for( KeySymMapping *ksp = &key_sym_mapping[0]; ksp->str; ++ksp )
if( !strcmp(str, ksp->str) ) return ksp->sym;
return 0;
{
for( KeySymMapping *ksp = &key_sym_mapping[0]; ksp->sym; ++ksp )
if( ksp->sym == ks ) return ksp->str;
+ if( ks >= SKEY_MIN && ks <= SKEY_MAX ) {
+ double speed = SHUTTLE_MAX_SPEED *
+ (ks-(SKEY_MAX+SKEY_MIN)/2.) / ((SKEY_MAX-SKEY_MIN)/2.);
+ static char text[BCSTRLEN];
+ sprintf(text, "%s_%0.3f", speed>=0 ? "FWD" : "REV", fabs(speed));
+ char *bp = strchr(text,'.');
+ if( bp ) {
+ char *cp = bp+strlen(bp);
+ while( --cp>bp && *cp=='0' ) *cp=0;
+ if( cp == bp ) *cp = 0;
+ }
+ return text;
+ }
return 0;
}
{
this->cin = cin;
this->name = cstrdup(nm);
- this->err = regcomp(&this->regex, re, REG_NOSUB);
- if( err ) {
- fprintf(stderr, "error compiling regex for [%s]: %s\n", name, re);
- char emsg[BCTEXTLEN];
- regerror(err, ®ex, emsg, sizeof(emsg));
- fprintf(stderr, "regerror: %s\n", emsg);
- }
}
TransName::~TransName()
{
delete [] name;
- regfree(®ex);
}
void Translation::init(int def)
wx = wy = 0;
jogvalue = 0xffff;
shuttlevalue = 0xffff;
- last_shuttle.tv_sec = 0;
- last_shuttle.tv_usec = 0;
- need_synthetic_shuttle = 0;
dev_name = 0;
done = -1;
memset(b, 0, sizeof(*b));
b->type = press ? ButtonPress : ButtonRelease;
b->time = milliTimeClock();
+ b->send_event = 1;
b->display = wdw->top_level->display;
b->root = wdw->top_level->rootwin;
b->window = win;
wdw->top_level->put_event((XEvent *) b);
return 0;
}
-int Shuttle::send_key(KeySym keysym, int press)
+int Shuttle::send_keycode(unsigned int keycode, int press, int send)
{
- KeyCode keycode = XKeysymToKeycode(wdw->top_level->display, keysym);
- if( debug )
- printf("key: %04x %d\n", (unsigned)keycode, press);
+ if( debug ) {
+ const char *cp = !send ? 0 :
+ KeySymMapping::to_string(keycode);
+ if( cp )
+ printf("key: %s %d\n", cp, press);
+ else
+ printf("key: %04x %d\n", keycode, press);
+ }
XKeyEvent *k = new XKeyEvent();
memset(k, 0, sizeof(*k));
k->type = press ? KeyPress : KeyRelease;
k->time = milliTimeClock();
+ k->send_event = send;
k->display = wdw->top_level->display;
k->root = wdw->top_level->rootwin;
k->window = win;
{
return keysym >= XK_Button_1 && keysym <= XK_Scroll_Down ?
send_button((unsigned int)keysym - XK_Button_0, press) :
- send_key(keysym, press ? True : False);
+ send_keycode((unsigned int)keysym, press, 1);
+// unsigned int keycode = XKeysymToKeycode(wdw->top_level->display, keysym);
+// return send_keycode(keycode, press, 0);
}
if( translation ) {
switch( kjs ) {
default:
- case KJS_KEY_DOWN: ret = translation->key_down[index].first; break;
- case KJS_KEY_UP: ret = translation->key_up[index].first; break;
- case KJS_JOG: ret = translation->jog[index].first; break;
- case KJS_SHUTTLE: ret = translation->shuttles[index].first; break;
+ case KJS_KEY_DOWN: ret = translation->key_down[index].first; break;
+ case KJS_KEY_UP: ret = translation->key_up[index].first; break;
+ case KJS_JOG: ret = translation->jog[index].first; break;
+ case KJS_SHUTTLE: ret = translation->shuttles[index-S_7].first; break;
}
}
return ret;
}
-void Shuttle:: shuttle(int value)
+void Shuttle::shuttle(int value)
{
if( value < S_7 || value > S7 ) {
fprintf(stderr, "shuttle(%d) out of range\n", value);
return;
}
- gettimeofday(&last_shuttle, 0);
- need_synthetic_shuttle = value != 0;
- if( value != shuttlevalue ) {
+ if( value != (int)shuttlevalue ) {
shuttlevalue = value;
- send_stroke_sequence(KJS_SHUTTLE, value+7);
+ send_stroke_sequence(KJS_SHUTTLE, value);
}
}
// event either!
void Shuttle::jog(unsigned int value)
{
- int direction;
- struct timeval now;
- struct timeval delta;
-
- // We should generate a synthetic event for the shuttle going
- // to the home position if we have not seen one recently
- if( need_synthetic_shuttle ) {
- gettimeofday( &now, 0 );
- timersub( &now, &last_shuttle, &delta );
-
- if( delta.tv_sec >= 1 || delta.tv_usec >= 5000 ) {
- shuttle(0);
- need_synthetic_shuttle = 0;
- }
- }
-
if( jogvalue != 0xffff ) {
value = value & 0xff;
- direction = ((value - jogvalue) & 0x80) ? -1 : 1;
+ int direction = ((value - jogvalue) & 0x80) ? -1 : 1;
+ int index = direction > 0 ? 1 : 0;
while( jogvalue != value ) {
// driver fails to send an event when jogvalue == 0
if( jogvalue != 0 ) {
- send_stroke_sequence(KJS_JOG, direction > 0 ? 1 : 0);
+ send_stroke_sequence(KJS_JOG, index);
}
jogvalue = (jogvalue + direction) & 0xff;
}
Display *dpy = gui->display;
Window focus = 0;
int ret = 0, revert = 0;
- char win_title[BCTEXTLEN];
+ char win_title[BCTEXTLEN]; win_title[0] = 0;
gui->lock_window("Shuttle::get_focused_window_translation");
XGetInputFocus(dpy, &focus, &revert);
if( last_focused != focus ) {
win_title[len] = 0;
XFree(list);
if( debug )
- printf("new focus: %08x\n", (unsigned)focus);
+ printf("new focus: %08x %s\n", (unsigned)focus, win_title);
}
else {
last_focused = 0;
wdw = mwindow->cwindow->gui->canvas->get_canvas();
cin = FOCUS_CWINDOW;
}
- else if( (wdw=mwindow->gui->mainmenu->load_file->thread->window) != 0 &&
+ else if( mwindow->gui->mainmenu->load_file->thread->running() &&
+ (wdw=mwindow->gui->mainmenu->load_file->thread->window) != 0 &&
wdw->win == focus )
cin = FOCUS_LOAD;
else {
if( tr->is_default ) return 1;
for( int i=0; i<tr->names.size(); ++i ) {
TransName *name = tr->names[i];
- if( name->cin != cin ) continue;
- if( regexec(&name->regex, win_title, 0, NULL, 0) )
- return 1;
+ if( name->cin == cin ) return 1;
}
}
tr = default_translation;
if( debug )
printf("new translation: %s\n", tr->name);
}
-//fprintf(stderr, "event: (%d, %d, 0x%x)\n", ev.type, ev.code, ev.value);
+// if( debug )
+// printf("event: (%d, %d, 0x%x)\n", ev.type, ev.code, ev.value);
switch( ev.type ) {
case EVENT_TYPE_DONE:
case EVENT_TYPE_ACTIVE_KEY:
}
}
while( ws(*cp) ) ++cp;
-// regex in TransName constructor
trans->names.append(new TransName(cin, name, cp));
- if( trans->names.last()->err ) { ret = 1; break; }
ret = fgets(cp=line,sizeof(line),fp) ? 0 : 1;
if( ret ) {
fprintf(stderr, "hit eof, no translation def for: %s\n",