|
From: <mla...@us...> - 2007-01-06 07:16:24
|
Revision: 250
http://svn.sourceforge.net/g15daemon/?rev=250&view=rev
Author: mlampard
Date: 2007-01-05 23:16:25 -0800 (Fri, 05 Jan 2007)
Log Message:
-----------
Use XSendEvent to emulate keypresses if XTEST is unavailable.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/configure.in
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2007-01-06 02:15:52 UTC (rev 249)
+++ trunk/g15daemon-clients/g15macro/configure.in 2007-01-06 07:16:25 UTC (rev 250)
@@ -17,7 +17,7 @@
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(g15daemon_client.h libg15render.h,,AC_MSG_ERROR(["libg15daemon_client (or its devel package) could not be found. please install it"]))
AC_CHECK_HEADERS(X11/Xlib.h X11/XF86keysym.h,,AC_MSG_ERROR(["Xorg development files could not be found. please install the devel package"]))
-AC_CHECK_HEADERS(X11/extensions/XTest.h,,AC_MSG_ERROR(["Xorg XTEST Extension devel headers could not be found. please install the devel package"]))
+AC_CHECK_HEADERS(X11/extensions/XTest.h,,AC_MSG_WARN(["Xorg XTEST Extension devel headers could not be found. Reverting to XSendEvent()"]))
AC_PATH_X
CPPFLAGS="$CPPFLAGS "'-DDATADIR="\"$(datadir)\""'
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-01-06 02:15:52 UTC (rev 249)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-01-06 07:16:25 UTC (rev 250)
@@ -39,8 +39,11 @@
#include <pthread.h>
#include <sys/time.h>
+#include <config.h>
#include <X11/Xlib.h>
+#ifdef HAVE_X11_EXTENSIONS_XTEST_H
#include <X11/extensions/XTest.h>
+#endif
#include <X11/XF86keysym.h>
#include <g15daemon_client.h>
@@ -63,6 +66,7 @@
int leaving = 0;
int display_timeout=500;
+int have_xtest = False;
unsigned char recstring[1024];
@@ -74,6 +78,7 @@
unsigned long keycode;
unsigned long time_ms;
unsigned char pressed;
+ unsigned long modifiers;
unsigned int mouse_x;
unsigned int mouse_y;
unsigned int buttons;
@@ -100,6 +105,7 @@
}current_recording;
unsigned int rec_index=0;
+
const char *gkeystring[] = { "G1","G2","G3","G4","G5","G6","G7","G8","G9","G10","G11","G12","G13","G14","G15","G16","G17","G18","Unknown" };
const int gkeycodes[] = { 177,152,190,208,129,130,231,209,210,136,220,143,246,251,137,138,133,183 };
@@ -200,7 +206,42 @@
return retval;
}
+void fake_keyevent(int keycode,int keydown,unsigned long modifiers){
+ if(have_xtest) {
+ #ifdef HAVE_X11_EXTENSIONS_XTEST_H
+ pthread_mutex_lock(&x11mutex);
+ XTestFakeKeyEvent(dpy, keycode,keydown, CurrentTime);
+ pthread_mutex_unlock(&x11mutex);
+ #endif
+ } else {
+ XKeyEvent event;
+ Window current_focus;
+ int dummy = 0;
+ int key = 0;
+ pthread_mutex_lock(&x11mutex);
+ XGetInputFocus(dpy,¤t_focus, &dummy);
+ key = XKeycodeToKeysym(dpy,keycode,0);
+ if(keydown)
+ event.type=KeyPress;
+ else
+ event.type=KeyRelease;
+ event.keycode = keycode;
+ event.serial = 0;
+ event.send_event = False;
+ event.display = dpy;
+ event.x = event.y = event.x_root = event.y_root = 0;
+ event.time = CurrentTime;
+ event.same_screen = True;
+ event.subwindow = None;
+ event.window = current_focus;
+ event.root = root_win;
+ event.state = modifiers;
+ XSendEvent(dpy,current_focus,False,0xfff,(XEvent*)&event);
+ pthread_mutex_unlock(&x11mutex);
+ }
+}
+
void record_complete(unsigned long keystate)
{
char tmpstr[1024];
@@ -258,19 +299,16 @@
default:
mkey_offset=0;
}
- pthread_mutex_lock(&x11mutex);
- XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]),True, CurrentTime);
- XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]),False, CurrentTime);
- pthread_mutex_unlock(&x11mutex);
+ fake_keyevent(XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]),True,None);
+ fake_keyevent(XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]),False,None);
return;
}
- pthread_mutex_lock(&x11mutex);
for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
- XTestFakeKeyEvent(dpy, mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].keycode,
- mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].pressed, CurrentTime);
+
+ fake_keyevent(mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].keycode,
+ mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].pressed,
+ mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].modifiers);
}
- pthread_mutex_unlock(&x11mutex);
-
}
void change_keymap(int offset){
@@ -429,10 +467,11 @@
}
press = False;
- }
+ }
if(recording){
current_recording.recorded_keypress[rec_index].keycode = keycode;
current_recording.recorded_keypress[rec_index].pressed = press;
+ current_recording.recorded_keypress[rec_index].modifiers = event->xkey.state;
if(rec_index==0)
current_recording.recorded_keypress[rec_index].time_ms=0;
else
@@ -442,7 +481,11 @@
/* now the default stuff */
pthread_mutex_lock(&x11mutex);
XUngrabKeyboard(dpy,CurrentTime);
- XTestFakeKeyEvent(dpy, keycode, press, CurrentTime);
+ pthread_mutex_unlock(&x11mutex);
+
+ fake_keyevent(keycode,press,event->xkey.state);
+
+ pthread_mutex_lock(&x11mutex);
XGrabKeyboard(dpy, root_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
XFlush(dpy);
strcpy((char*)keytext,XKeysymToString(XKeycodeToKeysym(dpy, keycode, 0)));
@@ -534,8 +577,6 @@
char configpath[1024];
char splashpath[1024];
- int have_xtest = 0;
-
if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){
printf("Sorry, cant connect to the G15daemon\n");
return 1;
@@ -585,11 +626,12 @@
printf("Cant find root window\n");
return 1;
}
-
+#ifdef HAVE_X11_EXTENSIONS_XTEST_H
have_xtest = XTestQueryExtension(dpy, &dummy, &dummy, &xtest_major_version, &xtest_minor_version);
+#endif
if(have_xtest == False || xtest_major_version < 2 || (xtest_major_version <= 2 && xtest_minor_version < 2))
{
- printf("XTEST extension not supported\n\nExiting\n");
+ printf("XTEST extension not supported\nReverting to XSendEvent for keypress emulation\n");
}
/* completely ignore errors and carry on */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-09-08 10:35:10
|
Revision: 291
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=291&view=rev
Author: mlampard
Date: 2007-09-08 03:35:13 -0700 (Sat, 08 Sep 2007)
Log Message:
-----------
Improve reliability, resolve occasional lockups. XSendEvent is the default again.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/configure.in
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-09-08 06:50:33 UTC (rev 290)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-09-08 10:35:13 UTC (rev 291)
@@ -1,6 +1,9 @@
1.0 29/12/06
- Initial release
SVN
-- added ability to scroll through playlist and play selected songs with the
-volume control/play button.
- best used with g15daemon wip
+- disable XTest extension by default, run configure with --enable-xtest to
+ enable. The default is now to use XSendEvent.
+- Improve reliability - the lockups occasionally seen in version 1.0 should
+ be resolved.
+- g15macro will now wait for g15daemon to start.
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2007-09-08 06:50:33 UTC (rev 290)
+++ trunk/g15daemon-clients/g15macro/configure.in 2007-09-08 10:35:13 UTC (rev 291)
@@ -20,6 +20,11 @@
AC_CHECK_HEADERS(X11/extensions/XTest.h,,AC_MSG_WARN(["Xorg XTEST Extension devel headers could not be found. Reverting to XSendEvent()"]))
AC_PATH_X
+AC_ARG_ENABLE([xtest],AS_HELP_STRING([--enable-xtest],[enable use of the XTest extension]))
+if test "x$enable_xtest" = "xyes"; then
+ AC_DEFINE([USE_XTEST],[1],[Enable this to use the XTest extension if available])
+fi
+
CPPFLAGS="$CPPFLAGS "'-DDATADIR="\"$(datadir)\""'
AC_OUTPUT(Makefile)
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-09-08 06:50:33 UTC (rev 290)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-09-08 10:35:13 UTC (rev 291)
@@ -36,7 +36,7 @@
#include <poll.h>
#include <arpa/inet.h>
#include <signal.h>
-
+#include <pwd.h>
#include <pthread.h>
#include <sys/time.h>
#include <config.h>
@@ -212,7 +212,9 @@
#ifdef HAVE_X11_EXTENSIONS_XTEST_H
pthread_mutex_lock(&x11mutex);
XTestFakeKeyEvent(dpy, keycode,keydown, CurrentTime);
+ XFlush(dpy);
pthread_mutex_unlock(&x11mutex);
+ usleep(2500);
#endif
} else {
XKeyEvent event;
@@ -220,24 +222,25 @@
int dummy = 0;
int key = 0;
pthread_mutex_lock(&x11mutex);
- XGetInputFocus(dpy,¤t_focus, &dummy);
- key = XKeycodeToKeysym(dpy,keycode,0);
- if(keydown)
- event.type=KeyPress;
- else
- event.type=KeyRelease;
- event.keycode = keycode;
- event.serial = 0;
- event.send_event = False;
- event.display = dpy;
- event.x = event.y = event.x_root = event.y_root = 0;
- event.time = CurrentTime;
- event.same_screen = True;
- event.subwindow = None;
- event.window = current_focus;
- event.root = root_win;
- event.state = modifiers;
- XSendEvent(dpy,current_focus,False,0xfff,(XEvent*)&event);
+ XGetInputFocus(dpy,¤t_focus, &dummy);
+ key = XKeycodeToKeysym(dpy,keycode,0);
+ if(keydown)
+ event.type=KeyPress;
+ else
+ event.type=KeyRelease;
+ event.keycode = keycode;
+ event.serial = 0;
+ event.send_event = False;
+ event.display = dpy;
+ event.x = event.y = event.x_root = event.y_root = 0;
+ event.time = CurrentTime;
+ event.same_screen = True;
+ event.subwindow = None;
+ event.window = current_focus;
+ event.root = root_win;
+ event.state = modifiers;
+ XSendEvent(dpy,current_focus,False,0xfff,(XEvent*)&event);
+ XSync(dpy,False);
pthread_mutex_unlock(&x11mutex);
}
}
@@ -281,6 +284,7 @@
{
int i = 0;
KeySym key;
+ int keyevent;
int gkey = map_gkey(keystate);
if(gkey<0)
return;
@@ -301,8 +305,12 @@
default:
mkey_offset=0;
}
- fake_keyevent(XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]),True,None);
- fake_keyevent(XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]),False,None);
+ pthread_mutex_lock(&x11mutex);
+ keyevent=XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]);
+ pthread_mutex_unlock(&x11mutex);
+
+ fake_keyevent(keyevent,True,None);
+ fake_keyevent(keyevent,False,None);
return;
}
for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
@@ -327,7 +335,10 @@
case XK_Hyper_L:
case XK_Hyper_R:
usleep(mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].time_ms*1000);
- break;
+ break;
+ default:
+ usleep(1000);
+
}
}
@@ -406,7 +417,9 @@
g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
recording = 1;
+ pthread_mutex_lock(&x11mutex);
XGrabKeyboard(dpy, root_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ pthread_mutex_unlock(&x11mutex);
memset(¤t_recording,0,sizeof(current_recording));
break;
case G15_KEY_M1:
@@ -466,7 +479,7 @@
if(event->type==KeyRelease){ // we only do keyreleases for some keys
pthread_mutex_lock(&x11mutex);
- KeySym key = XKeycodeToKeysym(dpy, keycode, 0);
+ KeySym key = XKeycodeToKeysym(dpy, keycode, 0);
pthread_mutex_unlock(&x11mutex);
switch (key) {
case XK_Shift_L:
@@ -485,10 +498,11 @@
case XK_Hyper_R:
break;
default:
- return;
+ press = False;
+
+ // return;
}
- press = False;
}
if(recording){
current_recording.recorded_keypress[rec_index].keycode = keycode;
@@ -500,12 +514,13 @@
current_recording.recorded_keypress[rec_index].time_ms=g15daemon_gettime_ms() - lasttime;
rec_index++;
+ fake_keyevent(keycode,press,event->xkey.state);
+
/* now the default stuff */
pthread_mutex_lock(&x11mutex);
- XUngrabKeyboard(dpy,CurrentTime);
+ XUngrabKeyboard(dpy,CurrentTime);
pthread_mutex_unlock(&x11mutex);
- fake_keyevent(keycode,press,event->xkey.state);
pthread_mutex_lock(&x11mutex);
XGrabKeyboard(dpy, root_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
@@ -514,10 +529,11 @@
pthread_mutex_unlock(&x11mutex);
if(0==strcmp((char*)keytext,"space"))
strcpy((char*)keytext," ");
- strcat((char*)recstring,(char*)keytext);
- g15r_renderString (canvas, (unsigned char *)recstring, 0, G15_TEXT_MED, 80-((strlen((char*)recstring)/2)*5), 22);
- g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
-
+ if(press==True){
+ strcat((char*)recstring,(char*)keytext);
+ g15r_renderString (canvas, (unsigned char *)recstring, 0, G15_TEXT_MED, 80-((strlen((char*)recstring)/2)*5), 22);
+ g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
+ }
}else
rec_index=0;
@@ -595,16 +611,56 @@
int xtest_major_version = 0;
int xtest_minor_version = 0;
struct sigaction new_action;
- int dummy;
+ int dummy,i;
+ unsigned char user[256];
+ struct passwd *username;
char configpath[1024];
char splashpath[1024];
- if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){
- printf("Sorry, cant connect to the G15daemon\n");
- return 1;
+ do {
+ dpy = XOpenDisplay(getenv("DISPLAY"));
+ if (!dpy) {
+ printf("Unable to open display %s - retrying\n",getenv("DISPLAY"));
+ sleep(2);
+ }
+ }while(!dpy);
+
+ do {
+ if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){
+ printf("Sorry, cant connect to the G15daemon - retrying\n");
+ sleep(2);
+ }
+ }while(g15screen_fd<0);
+
+ memset(user,0,256);
+ for(i=0;i<argc;i++){
+ if (!strncmp(argv[i], "-u",2) || !strncmp(argv[i], "--user",7)) {
+ if(argv[i+1]!=NULL){
+ strncpy((char*)user,argv[i+1],128);
+ i++;
+ }
+ }
}
strncpy(configpath,getenv("HOME"),1024);
+
+ if(strlen(user)){
+ username = getpwnam((char*)user);
+ if (username==NULL) {
+ username = getpwuid(geteuid());
+ printf("BEWARE: running as effective uid %i\n",username->pw_uid);
+ }
+ else {
+ if(0==setuid(username->pw_uid)) {
+ setgid(username->pw_gid);
+ strncpy(configpath,username->pw_dir,1024);
+ printf("running as user %s\n",username->pw_name);
+ }
+ else
+ printf("Unable to run as user \"%s\" - you dont have permissions for that.\nRunning as \"%s\"\n",username->pw_name,getenv("USER"));
+ }
+ }
+
strncat(configpath,"/.g15macro",1024-strlen(configpath));
mkdir(configpath,0777);
strncat(configpath,"/g15macro-data",1024-strlen(configpath));
@@ -637,20 +693,20 @@
return 1;
}
- dpy = XOpenDisplay(getenv("DISPLAY"));
- if (!dpy) {
- printf("Can't open display\n");
- return 1;
- }
root_win = DefaultRootWindow(dpy);
if (!root_win) {
printf("Cant find root window\n");
return 1;
}
+
+ have_xtest = False;
+#ifdef USE_XTEST
#ifdef HAVE_X11_EXTENSIONS_XTEST_H
have_xtest = XTestQueryExtension(dpy, &dummy, &dummy, &xtest_major_version, &xtest_minor_version);
#endif
+#endif
+
if(have_xtest == False || xtest_major_version < 2 || (xtest_major_version <= 2 && xtest_minor_version < 2))
{
printf("XTEST extension not supported\nReverting to XSendEvent for keypress emulation\n");
@@ -674,6 +730,8 @@
pthread_mutex_init(&x11mutex,NULL);
pthread_attr_t attr;
pthread_attr_init(&attr);
+ int thread_policy=SCHED_FIFO;
+ pthread_attr_setschedpolicy(&attr,thread_policy);
pthread_attr_setstacksize(&attr,32*1024); /* set stack to 64k - dont need 8Mb !! */
pthread_create(&Xkeys, &attr, xevent_thread, NULL);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-13 08:00:23
|
Revision: 336
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=336&view=rev
Author: mlampard
Date: 2007-12-13 00:00:21 -0800 (Thu, 13 Dec 2007)
Log Message:
-----------
fix processing of key-up events, should resolve previous issues. Catch signals and leave quietly.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-07 14:10:42 UTC (rev 335)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-13 08:00:21 UTC (rev 336)
@@ -7,3 +7,5 @@
- Improve reliability - the lockups occasionally seen in version 1.0 should
be resolved.
- g15macro will now wait for g15daemon to start.
+- fix processing of key-up events.
+- ensure safe exit on receipt of signal
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-07 14:10:42 UTC (rev 335)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-13 08:00:21 UTC (rev 336)
@@ -70,7 +70,7 @@
unsigned char recstring[1024];
-static int mled_state = G15_LED_M1;
+static unsigned int mled_state = G15_LED_M1;
static int mkey_state = 0;
static int recording = 0;
@@ -100,8 +100,10 @@
mstates_t *mstates[3];
+#define MAX_KEYSTEPS 1024
+
struct current_recording {
- keypress_t recorded_keypress[128];
+ keypress_t recorded_keypress[MAX_KEYSTEPS];
}current_recording;
unsigned int rec_index=0;
@@ -207,7 +209,6 @@
}
void fake_keyevent(int keycode,int keydown,unsigned long modifiers){
-
if(have_xtest) {
#ifdef HAVE_X11_EXTENSIONS_XTEST_H
pthread_mutex_lock(&x11mutex);
@@ -221,6 +222,7 @@
Window current_focus;
int dummy = 0;
int key = 0;
+
pthread_mutex_lock(&x11mutex);
XGetInputFocus(dpy,¤t_focus, &dummy);
key = XKeycodeToKeysym(dpy,keycode,0);
@@ -228,6 +230,7 @@
event.type=KeyPress;
else
event.type=KeyRelease;
+
event.keycode = keycode;
event.serial = 0;
event.send_event = False;
@@ -280,17 +283,7 @@
rec_index = 0;
}
-void macro_playback(unsigned long keystate)
-{
- int i = 0;
- KeySym key;
- int keyevent;
- int gkey = map_gkey(keystate);
- if(gkey<0)
- return;
-
- /* if no macro has been recorded for this key, send the g15daemon default keycode */
- if(mstates[mkey_state]->gkeys[gkey].keysequence.record_steps==0){
+int calc_mkey_offset(mkey_state) {
int mkey_offset=0;
switch(mkey_state){
case 0:
@@ -305,12 +298,29 @@
default:
mkey_offset=0;
}
+ return mkey_offset;
+}
+void macro_playback(unsigned long keystate)
+{
+ int i = 0;
+ KeySym key;
+ int keyevent;
+ int gkey = map_gkey(keystate);
+ if(gkey<0)
+ return;
+
+ /* if no macro has been recorded for this key, send the g15daemon default keycode */
+ if(mstates[mkey_state]->gkeys[gkey].keysequence.record_steps==0){
+ int mkey_offset=0;
+
+ mkey_offset = calc_mkey_offset(mkey_state);
+
pthread_mutex_lock(&x11mutex);
keyevent=XKeysymToKeycode(dpy, gkeydefaults[gkey+mkey_offset]);
pthread_mutex_unlock(&x11mutex);
- fake_keyevent(keyevent,True,None);
- fake_keyevent(keyevent,False,None);
+ fake_keyevent(keyevent,1,None);
+ fake_keyevent(keyevent,0,None);
return;
}
for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
@@ -373,8 +383,28 @@
}
+void handle_mkey_switch(unsigned int mkey) {
+ int mkey_offset = 0;
+ switch(mkey) {
+ case G15_KEY_M1:
+ mled_state=G15_LED_M1;
+ break;
+ case G15_KEY_M2:
+ mled_state=G15_LED_M2;
+ break;
+ case G15_KEY_M3:
+ mled_state=G15_LED_M3;
+ break;
+ }
+ mkey_offset = calc_mkey_offset(mled_state);
+ mkey_state = mled_state;
+ recording = 0;
+ g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
+ change_keymap(mkey_offset);
+}
+
void *Lkeys_thread() {
- int keystate = 0;
+ unsigned long keystate = 0;
struct pollfd fds;
char ver[5];
int foo = 0;
@@ -425,25 +455,13 @@
memset(¤t_recording,0,sizeof(current_recording));
break;
case G15_KEY_M1:
- mkey_state = 0;
- mled_state = G15_LED_M1;
- recording = 0;
- g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,G15_LED_M1);
- change_keymap(0);
+ handle_mkey_switch(G15_KEY_M1);
break;
case G15_KEY_M2:
- mkey_state = 1;
- mled_state = G15_LED_M2;
- recording = 0;
- g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,G15_LED_M2);
- change_keymap(18);
+ handle_mkey_switch(G15_KEY_M2);
break;
case G15_KEY_M3:
- mkey_state = 2;
- mled_state = G15_LED_M3;
- recording = 0;
- g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,G15_LED_M3);
- change_keymap(36);
+ handle_mkey_switch(G15_KEY_M3);
break;
default:
if(keystate >=G15_KEY_G1 && keystate <=G15_KEY_G18){
@@ -498,13 +516,10 @@
case XK_Super_R:
case XK_Hyper_L:
case XK_Hyper_R:
- break;
+// break;
default:
press = False;
-
- // return;
}
-
}
if(recording){
current_recording.recorded_keypress[rec_index].keycode = keycode;
@@ -597,9 +612,8 @@
void g15macro_sighandler(int sig) {
switch(sig){
case SIGINT:
+ case SIGTERM:
case SIGQUIT:
- leaving = 1;
- break;
case SIGPIPE:
leaving = 1;
break;
@@ -646,7 +660,7 @@
strncpy(configpath,getenv("HOME"),1024);
- if(strlen(user)){
+ if(strlen((char*)user)){
username = getpwnam((char*)user);
if (username==NULL) {
username = getpwuid(geteuid());
@@ -724,6 +738,8 @@
new_action.sa_flags = 0;
sigaction(SIGINT, &new_action, NULL);
sigaction(SIGQUIT, &new_action, NULL);
+ sigaction(SIGTERM, &new_action, NULL);
+ sigaction(SIGPIPE, &new_action, NULL);
snprintf((char*)splashpath,1024,"%s/%s",DATADIR,"g15macro/splash/g15macro.wbmp");
g15r_loadWbmpSplash(canvas, splashpath);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-23 08:24:48
|
Revision: 350
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=350&view=rev
Author: mlampard
Date: 2007-12-23 00:24:53 -0800 (Sun, 23 Dec 2007)
Log Message:
-----------
Prepare for new release
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/configure.in
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-20 05:12:32 UTC (rev 349)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-23 08:24:53 UTC (rev 350)
@@ -1,14 +1,14 @@
1.0 29/12/06
- Initial release
-SVN
+1.0.1
- best used with g15daemon wip
- disable XTest extension by default, run configure with --enable-xtest to
enable. The default is now to use XSendEvent.
- Improve reliability - the lockups occasionally seen in version 1.0 should
be resolved.
-- g15macro will now wait for g15daemon to start.
- fix processing of key-up events.
- ensure safe exit on receipt of signal
- Fix XTest event output
- Fix order of events, release was being sent before press.
- increase max number of key up/down events recorded to 1024
+
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2007-12-20 05:12:32 UTC (rev 349)
+++ trunk/g15daemon-clients/g15macro/configure.in 2007-12-23 08:24:53 UTC (rev 350)
@@ -1,7 +1,7 @@
AC_INIT(g15macro.c,[1.0svn], [mla...@us...])
PACKAGE=g15macro
-VERSION=1.0.0
+VERSION=1.0.1
AC_PREFIX_DEFAULT(/usr)
AC_CONFIG_AUX_DIR(config)
AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-26 05:27:36
|
Revision: 354
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=354&view=rev
Author: mlampard
Date: 2007-12-25 21:27:40 -0800 (Tue, 25 Dec 2007)
Log Message:
-----------
Add --dump option to dump recorded macros in an almost human-readable format to stdout. Add --version option, update configure.in to reflect true version.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/configure.in
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2007-12-23 09:04:32 UTC (rev 353)
+++ trunk/g15daemon-clients/g15macro/configure.in 2007-12-26 05:27:40 UTC (rev 354)
@@ -1,4 +1,4 @@
-AC_INIT(g15macro.c,[1.0svn], [mla...@us...])
+AC_INIT(g15macro,[1.0.1svn], [mla...@us...])
PACKAGE=g15macro
VERSION=1.0.1
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-23 09:04:32 UTC (rev 353)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-26 05:27:40 UTC (rev 354)
@@ -49,6 +49,7 @@
#include <g15daemon_client.h>
#include <libg15.h>
#include <libg15render.h>
+#include "config.h"
#define XK_MISCELLANY
#define XK_LATIN1
@@ -300,6 +301,7 @@
}
return mkey_offset;
}
+
void macro_playback(unsigned long keystate)
{
int i = 0;
@@ -349,10 +351,30 @@
break;
default:
usleep(1000);
-
}
+ }
+}
+/* WARNING: uses global mkey state */
+void dump_macro(unsigned int gkey)
+{
+ int i = 0;
+ KeySym key;
+ if(gkey>17)
+ return;
+ printf("Key %s: ",gkeystring[gkey]);
+ /* if no macro has been recorded for this key, dump the g15daemon default keycode */
+ if(mstates[mkey_state]->gkeys[gkey].keysequence.record_steps==0){
+ int mkey_offset=0;
+ mkey_offset = calc_mkey_offset();
+ printf("\t%s\n",XKeysymToString(gkeydefaults[gkey+mkey_offset]));
+ return;
}
+ printf("\n");
+ for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
+ key = XKeycodeToKeysym(dpy,mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].keycode,0);
+ printf("\t%s %s\n",XKeysymToString(key),mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].pressed?"Down":"Up");
+ }
}
void change_keymap(int offset){
@@ -646,34 +668,29 @@
struct passwd *username;
char configpath[1024];
char splashpath[1024];
+ unsigned int dump = 0;
+
+ strncpy(configpath,getenv("HOME"),1024);
- do {
- dpy = XOpenDisplay(getenv("DISPLAY"));
- if (!dpy) {
- printf("Unable to open display %s - retrying\n",getenv("DISPLAY"));
- sleep(2);
- }
- }while(!dpy);
-
- do {
- if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){
- printf("Sorry, cant connect to the G15daemon - retrying\n");
- sleep(2);
- }
- }while(g15screen_fd<0);
-
memset(user,0,256);
for(i=0;i<argc;i++){
- if (!strncmp(argv[i], "-u",2) || !strncmp(argv[i], "--user",7)) {
+ if (!strncmp(argv[i], "-u",2) || !strncmp(argv[i], "--user",6)) {
if(argv[i+1]!=NULL){
strncpy((char*)user,argv[i+1],128);
i++;
}
}
+
+ if (!strncmp(argv[i], "-d",2) || !strncmp(argv[i], "--dump",6)) {
+ dump = 1;
+ }
+
+ if (!strncmp(argv[i], "-v",2) || !strncmp(argv[i], "--version",9)) {
+ printf("G15Macro version %s\n\n",PACKAGE_VERSION);
+ exit(0);
+ }
}
- strncpy(configpath,getenv("HOME"),1024);
-
if(strlen((char*)user)){
username = getpwnam((char*)user);
if (username==NULL) {
@@ -711,6 +728,34 @@
memset(mstates[1],0,sizeof(mstates));
memset(mstates[2],0,sizeof(mstates));
}
+
+ do {
+ dpy = XOpenDisplay(getenv("DISPLAY"));
+ if (!dpy) {
+ printf("Unable to open display %s - retrying\n",getenv("DISPLAY"));
+ sleep(2);
+ }
+ }while(!dpy);
+
+ do {
+ if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){
+ printf("Sorry, cant connect to the G15daemon - retrying\n");
+ sleep(2);
+ }
+ }while(g15screen_fd<0);
+
+ if(dump){
+ int n;
+ printf("G15Macro Dumping Codes...");
+ for(n=0;n<3;n++){
+ mkey_state=n;
+ printf("\n\nCodes for MKey %i\n",n+1);
+ for(i=0;i<18;i++)
+ dump_macro(i);
+ }
+ exit(0);
+ }
+
g15_send_cmd (g15screen_fd,G15DAEMON_KEY_HANDLER, dummy);
usleep(1000);
g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-26 06:17:50
|
Revision: 355
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=355&view=rev
Author: mlampard
Date: 2007-12-25 22:17:55 -0800 (Tue, 25 Dec 2007)
Log Message:
-----------
add some minor debugging aids\n
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-26 05:27:40 UTC (rev 354)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-26 06:17:55 UTC (rev 355)
@@ -11,4 +11,7 @@
- Fix XTest event output
- Fix order of events, release was being sent before press.
- increase max number of key up/down events recorded to 1024
-
+SVN:
+- Add --dump (-d) option to dump recorded macros in human-readable format
+- Add --version (-v)
+- Add --debug (-g) to add some debugging
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-26 05:27:40 UTC (rev 354)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-26 06:17:55 UTC (rev 355)
@@ -68,6 +68,7 @@
int leaving = 0;
int display_timeout=500;
int have_xtest = False;
+int debug = 0;
unsigned char recstring[1024];
@@ -437,6 +438,9 @@
float g15v;
sscanf(ver,"%f",&g15v);
+ if(debug)
+ printf("Using version %.2f as keypress protocol\n",g15v);
+
while(!leaving){
/* g15daemon series 1.2 need key request packets */
@@ -454,6 +458,9 @@
if (keystate!=0)
{
+ if(debug)
+ printf("Received Keystate == %lu\n",keystate);
+
switch (keystate)
{
case G15_KEY_L5:{
@@ -685,6 +692,11 @@
dump = 1;
}
+ if (!strncmp(argv[i], "-g",2) || !strncmp(argv[i], "--debug",7)) {
+ printf("Debugging Enabled\n");
+ debug = 1;
+ }
+
if (!strncmp(argv[i], "-v",2) || !strncmp(argv[i], "--version",9)) {
printf("G15Macro version %s\n\n",PACKAGE_VERSION);
exit(0);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-26 13:39:08
|
Revision: 360
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=360&view=rev
Author: mlampard
Date: 2007-12-26 05:39:10 -0800 (Wed, 26 Dec 2007)
Log Message:
-----------
switch to a textual configfile. rudimentary, and currently has no error checking, but it's better than the binary dump we had before.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-26 09:18:11 UTC (rev 359)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-26 13:39:10 UTC (rev 360)
@@ -15,3 +15,5 @@
- Add --dump (-d) option to dump recorded macros in human-readable format
- Add --version (-v)
- Add --debug (-g) to add some debugging
+- Switch to a textual configuration file. Auto-converts to new format from binary
+ config if it exists. Only Semi-readable, but better than a binary dump.
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-26 09:18:11 UTC (rev 359)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-26 13:39:10 UTC (rev 360)
@@ -377,25 +377,79 @@
}
/* WARNING: uses global mkey state */
-void dump_macro(unsigned int gkey)
+void dump_config(FILE *configfile)
{
- int i = 0;
+ int i=0,gkey=0;
KeySym key;
- if(gkey>17)
- return;
- printf("Key %s: ",gkeystring[gkey]);
- /* if no macro has been recorded for this key, dump the g15daemon default keycode */
- if(mstates[mkey_state]->gkeys[gkey].keysequence.record_steps==0){
- int mkey_offset=0;
- mkey_offset = calc_mkey_offset();
- printf("\t%s\n",XKeysymToString(gkeydefaults[gkey+mkey_offset]));
- return;
+ int orig_mkeystate=mkey_state;
+
+ for(mkey_state=0;mkey_state<3;mkey_state++){
+ fprintf(configfile,"\n\nCodes for MKey %i\n",mkey_state+1);
+ for(gkey=0;gkey<18;gkey++){
+ fprintf(configfile,"Key %s:",gkeystring[gkey]);
+ /* if no macro has been recorded for this key, dump the g15daemon default keycode */
+ if(mstates[mkey_state]->gkeys[gkey].keysequence.record_steps==0){
+ int mkey_offset=0;
+ mkey_offset = calc_mkey_offset();
+ fprintf(configfile,"\t%s\n",XKeysymToString(gkeydefaults[gkey+mkey_offset]));
+ }else{
+ fprintf(configfile,"\n");
+ for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
+ key = XKeycodeToKeysym(dpy,mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].keycode,0);
+ fprintf(configfile,"\t%s %s %u\n",XKeysymToString(key),mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].pressed?"Down":"Up",(unsigned int)mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].modifiers);
+ }
+ }
+ }
}
- printf("\n");
- for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
- key = XKeycodeToKeysym(dpy,mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].keycode,0);
- printf("\t%s %s\n",XKeysymToString(key),mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].pressed?"Down":"Up");
+
+ mkey_state=orig_mkeystate;
+}
+
+void save_macros(char *filename){
+ FILE *configfile;
+ configfile=fopen(filename,"w");
+
+ dump_config(configfile);
+
+ fclose(configfile);
+}
+
+void restore_config(char *filename) {
+ FILE *f;
+ char tmpstring[1024];
+ unsigned int key=0;
+ unsigned int mkey=0;
+ unsigned int i=0;
+ unsigned int keycode;
+ f=fopen(filename,"r");
+ printf("restoring codes\n");
+do{
+ memset(tmpstring,0,1024);
+ fgets(tmpstring,1024,f);
+
+ if(tmpstring[0]=='C'){
+ sscanf(tmpstring,"Codes for MKey %i\n",&mkey);
+ mkey--;
+ i=0;
}
+ if(tmpstring[0]=='K'){
+ sscanf(tmpstring,"Key G%i:",&key);
+ key--;
+ i=0;
+ }
+ if(tmpstring[0]=='\t'){
+ char codestr[64];
+ char pressed[20];
+ unsigned int modifiers = 0;
+ sscanf(tmpstring,"\t%s %s %i\n",(char*)&codestr,(char*)&pressed,&modifiers);
+ keycode = XKeysymToKeycode(dpy,XStringToKeysym(codestr));
+ mstates[mkey]->gkeys[key].keysequence.recorded_keypress[i].keycode = keycode;
+ mstates[mkey]->gkeys[key].keysequence.recorded_keypress[i].pressed = strncmp(pressed,"Up",2)?1:0;
+ mstates[mkey]->gkeys[key].keysequence.recorded_keypress[i].modifiers = modifiers;
+ mstates[mkey]->gkeys[key].keysequence.record_steps=++i;
+ }
+ } while(!feof(f));
+ fclose(f);
}
void change_keymap(int offset){
@@ -698,7 +752,8 @@
char configpath[1024];
char splashpath[1024];
unsigned int dump = 0;
-
+ FILE *config;
+ unsigned int convert = 0;
strncpy(configpath,getenv("HOME"),1024);
memset(user,0,256);
@@ -741,27 +796,41 @@
printf("Unable to run as user \"%s\" - you dont have permissions for that.\nRunning as \"%s\"\n",username->pw_name,getenv("USER"));
}
}
-
+ /* old binary config format */
strncat(configpath,"/.g15macro",1024-strlen(configpath));
- mkdir(configpath,0777);
strncat(configpath,"/g15macro-data",1024-strlen(configpath));
-
config_fd = open(configpath,O_RDONLY|O_SYNC);
-
+
mstates[0] = malloc(sizeof(mstates_t));
mstates[1] = (mstates_t*)malloc(sizeof(mstates_t));
mstates[2] = (mstates_t*)malloc(sizeof(mstates_t));
-
- if(config_fd) {
- read(config_fd,mstates[0],sizeof(mstates_t));
- read(config_fd,mstates[1],sizeof(mstates_t));
- read(config_fd,mstates[2],sizeof(mstates_t));
- close(config_fd);
+
+ if(config_fd>0) {
+ printf("Converting old data\n");
+ read(config_fd,mstates[0],sizeof(mstates_t));
+ read(config_fd,mstates[1],sizeof(mstates_t));
+ read(config_fd,mstates[2],sizeof(mstates_t));
+ close(config_fd);
+ strncpy(configpath,getenv("HOME"),1024);
+ strncat(configpath,"/.g15macro",1024-strlen(configpath));
+ char configbak[1024];
+ strcpy(configbak,configpath);
+ strncat(configpath,"/g15macro-data",1024-strlen(configpath));
+ strncat(configbak,"/g15macro-data.old",1024-strlen(configpath));
+ rename(configpath,configbak);
+ convert = 1;
}else {
memset(mstates[0],0,sizeof(mstates));
memset(mstates[1],0,sizeof(mstates));
memset(mstates[2],0,sizeof(mstates));
}
+ /* new format */
+ strncpy(configpath,getenv("HOME"),1024);
+ strncat(configpath,"/.g15macro",1024-strlen(configpath));
+ mkdir(configpath,0777);
+ strncat(configpath,"/g15macro.conf",1024-strlen(configpath));
+ config=fopen(configpath,"a");
+ fclose(config);
do {
dpy = XOpenDisplay(getenv("DISPLAY"));
@@ -778,23 +847,21 @@
}
}while(g15screen_fd<0);
+ if(!convert)
+ restore_config(configpath);
+
if(dump){
- int n;
printf("G15Macro Dumping Codes...");
- for(n=0;n<3;n++){
- mkey_state=n;
- printf("\n\nCodes for MKey %i\n",n+1);
- for(i=0;i<18;i++)
- dump_macro(i);
- }
- exit(0);
+ dump_config(stderr);
+ exit(0);
}
-
+
g15_send_cmd (g15screen_fd,G15DAEMON_KEY_HANDLER, dummy);
usleep(1000);
g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
usleep(1000);
canvas = (g15canvas *) malloc (sizeof (g15canvas));
+
if (canvas != NULL) {
g15r_initCanvas(canvas);
} else {
@@ -802,7 +869,6 @@
return 1;
}
-
root_win = DefaultRootWindow(dpy);
if (!root_win) {
printf("Cant find root window\n");
@@ -865,18 +931,15 @@
usleep(500*1000);
}
}while(!usleep(1000) && !leaving);
- g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,0);
- usleep(1000);
+
if(recording){
recording = 0;
XUngrabKeyboard(dpy,CurrentTime);
}
- config_fd = open(configpath,O_CREAT|O_WRONLY|O_SYNC,0600);
- write(config_fd,mstates[0],sizeof(mstates_t));
- write(config_fd,mstates[1],sizeof(mstates_t));
- write(config_fd,mstates[2],sizeof(mstates_t));
- close(config_fd);
+ save_macros(configpath);
+ g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,0);
+
pthread_join(Xkeys,NULL);
pthread_join(Lkeys,NULL);
pthread_mutex_destroy(&x11mutex);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-27 06:03:55
|
Revision: 362
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=362&view=rev
Author: mlampard
Date: 2007-12-26 22:04:00 -0800 (Wed, 26 Dec 2007)
Log Message:
-----------
Use XSync when sending key events
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-27 04:24:05 UTC (rev 361)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-27 06:04:00 UTC (rev 362)
@@ -17,3 +17,4 @@
- Add --debug (-g) to add some debugging
- Switch to a textual configuration file. Auto-converts to new format from binary
config if it exists. Only Semi-readable, but better than a binary dump.
+- Ensure each keypress is received by X11 in sequence.
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-27 04:24:05 UTC (rev 361)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-27 06:04:00 UTC (rev 362)
@@ -231,6 +231,7 @@
#ifdef HAVE_X11_EXTENSIONS_XTEST_H
pthread_mutex_lock(&x11mutex);
XTestFakeKeyEvent(dpy, keycode,keydown, CurrentTime);
+ XSync(dpy,False);
pthread_mutex_unlock(&x11mutex);
usleep(1500);
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2007-12-27 06:29:09
|
Revision: 363
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=363&view=rev
Author: mlampard
Date: 2007-12-26 22:29:14 -0800 (Wed, 26 Dec 2007)
Log Message:
-----------
Add mutexes where appropriate.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-27 06:04:00 UTC (rev 362)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2007-12-27 06:29:14 UTC (rev 363)
@@ -18,3 +18,4 @@
- Switch to a textual configuration file. Auto-converts to new format from binary
config if it exists. Only Semi-readable, but better than a binary dump.
- Ensure each keypress is received by X11 in sequence.
+- Add mutexes where appropriate.
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-27 06:04:00 UTC (rev 362)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2007-12-27 06:29:14 UTC (rev 363)
@@ -65,6 +65,7 @@
static Window root_win;
pthread_mutex_t x11mutex;
+pthread_mutex_t config_mutex;
int leaving = 0;
int display_timeout=500;
@@ -272,14 +273,16 @@
int gkey = map_gkey(keystate);
g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
-
+ pthread_mutex_lock(&config_mutex);
+
if(!rec_index) // nothing recorded - delete prior recording
memset(mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress,0,sizeof(keysequence_t));
else
memcpy(mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress, ¤t_recording, sizeof(keysequence_t));
mstates[mkey_state]->gkeys[gkey].keysequence.record_steps=rec_index;
-
+ pthread_mutex_unlock(&config_mutex);
+
memset(canvas->buffer,0,G15_BUFFER_LEN);
if(rec_index){
strcpy(tmpstr,"For key ");
@@ -346,6 +349,7 @@
return;
}
g15macro_log("Macro Playback: for key %s\n",gkeystring[gkey]);
+ pthread_mutex_lock(&config_mutex);
for(i=0;i<mstates[mkey_state]->gkeys[gkey].keysequence.record_steps;i++){
fake_keyevent(mstates[mkey_state]->gkeys[gkey].keysequence.recorded_keypress[i].keycode,
@@ -374,6 +378,7 @@
usleep(1000);
}
}
+ pthread_mutex_unlock(&config_mutex);
g15macro_log("Macro Playback Complete\n");
}
@@ -382,8 +387,8 @@
{
int i=0,gkey=0;
KeySym key;
+ pthread_mutex_lock(&config_mutex);
int orig_mkeystate=mkey_state;
-
for(mkey_state=0;mkey_state<3;mkey_state++){
fprintf(configfile,"\n\nCodes for MKey %i\n",mkey_state+1);
for(gkey=0;gkey<18;gkey++){
@@ -402,8 +407,8 @@
}
}
}
-
- mkey_state=orig_mkeystate;
+ mkey_state=orig_mkeystate;
+ pthread_mutex_unlock(&config_mutex);
}
void save_macros(char *filename){
@@ -424,7 +429,8 @@
unsigned int keycode;
f=fopen(filename,"r");
printf("restoring codes\n");
-do{
+ pthread_mutex_lock(&config_mutex);
+ do{
memset(tmpstring,0,1024);
fgets(tmpstring,1024,f);
@@ -450,6 +456,7 @@
mstates[mkey]->gkeys[key].keysequence.record_steps=++i;
}
} while(!feof(f));
+ pthread_mutex_unlock(&config_mutex);
fclose(f);
}
@@ -525,7 +532,7 @@
fds.events = POLLIN;
fds.revents=0;
keystate=0;
- if ((poll(&fds, 1, 5000)) > 0) {
+ if ((poll(&fds, 1, 1000)) > 0) {
read (g15screen_fd, &keystate, sizeof (keystate));
}
}
@@ -801,7 +808,7 @@
strncat(configpath,"/.g15macro",1024-strlen(configpath));
strncat(configpath,"/g15macro-data",1024-strlen(configpath));
config_fd = open(configpath,O_RDONLY|O_SYNC);
-
+
mstates[0] = malloc(sizeof(mstates_t));
mstates[1] = (mstates_t*)malloc(sizeof(mstates_t));
mstates[2] = (mstates_t*)malloc(sizeof(mstates_t));
@@ -906,6 +913,7 @@
g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
usleep(1000);
pthread_mutex_init(&x11mutex,NULL);
+ pthread_mutex_init(&config_mutex,NULL);
pthread_attr_t attr;
pthread_attr_init(&attr);
int thread_policy=SCHED_FIFO;
@@ -944,6 +952,7 @@
pthread_join(Xkeys,NULL);
pthread_join(Lkeys,NULL);
pthread_mutex_destroy(&x11mutex);
+ pthread_mutex_destroy(&config_mutex);
/* revert the keymap to g15daemon default on exit */
change_keymap(0);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2008-01-03 10:47:44
|
Revision: 398
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=398&view=rev
Author: mlampard
Date: 2008-01-03 02:47:49 -0800 (Thu, 03 Jan 2008)
Log Message:
-----------
Apply patch from 'schitso' cleaning up after recording.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/AUTHORS
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/AUTHORS
===================================================================
--- trunk/g15daemon-clients/g15macro/AUTHORS 2008-01-03 08:08:51 UTC (rev 397)
+++ trunk/g15daemon-clients/g15macro/AUTHORS 2008-01-03 10:47:49 UTC (rev 398)
@@ -1 +1,6 @@
-Mike Lampard <mla...@us...>
+[Primary Authors]
+ Mike Lampard <mla...@us...>
+
+[Contributions by:]
+ Tyler (schitzo) - provided patch that fixes cancellation of an in-progress recording via
+ any of the M keys, and moves repeated code into their own functions.
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-03 08:08:51 UTC (rev 397)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-03 10:47:49 UTC (rev 398)
@@ -19,3 +19,5 @@
config if it exists. Only Semi-readable, but better than a binary dump.
- Ensure each keypress is received by X11 in sequence.
- Add mutexes where appropriate.
+- Apply patch from 'schitso' that fixes cancellation of an in-progress recording via
+ any of the M keys, and moves repeated code into their own functions.
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-03 08:08:51 UTC (rev 397)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-03 10:47:49 UTC (rev 398)
@@ -267,12 +267,30 @@
}
}
+void record_cleanup(){
+ g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
+ memset(recstring,0,strlen((char*)recstring));
+ rec_index = 0;
+ recording = 0;
+ pthread_mutex_lock(&x11mutex);
+ XUngrabKeyboard(dpy,CurrentTime);
+ XFlush(dpy);
+ pthread_mutex_unlock(&x11mutex);
+}
+
+void record_cancel(){
+ memset(canvas->buffer,0,G15_BUFFER_LEN);
+ g15r_renderString (canvas, (unsigned char *)"Recording", 0, G15_TEXT_LARGE, 80-((strlen("Recording")/2)*8), 4);
+ g15r_renderString (canvas, (unsigned char *)"Canceled", 0, G15_TEXT_LARGE, 80-((strlen("Canceled")/2)*8), 18);
+ g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
+ record_cleanup();
+}
+
void record_complete(unsigned long keystate)
{
char tmpstr[1024];
int gkey = map_gkey(keystate);
- g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
pthread_mutex_lock(&config_mutex);
if(!rec_index) // nothing recorded - delete prior recording
@@ -302,8 +320,7 @@
g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
- memset(recstring,0,strlen((char*)recstring));
- rec_index = 0;
+ record_cleanup();
}
int calc_mkey_offset() {
@@ -506,7 +523,8 @@
break;
}
mkey_offset = calc_mkey_offset();
- recording = 0;
+ if(recording)
+ record_cancel();
g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
change_keymap(mkey_offset);
}
@@ -549,24 +567,27 @@
leaving = 1;
break;
}
- case G15_KEY_MR:
- {
+ case G15_KEY_MR: {
+ if(!recording) {
if(0==g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, foo)){
usleep(1000);
g15_send_cmd (g15screen_fd, G15DAEMON_SWITCH_PRIORITIES, foo);
g15macro_log("Switching to LCD foreground\n");
+ }
+ usleep(1000);
+ g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS, G15_LED_MR | mled_state);
+ g15r_initCanvas (canvas);
+ g15r_renderString (canvas, (unsigned char *)"Recording", 0, G15_TEXT_LARGE, 80-((strlen("Recording")/2)*8), 1);
+ g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
+ g15macro_log("Recording Enabled\n");
+ recording = 1;
+ pthread_mutex_lock(&x11mutex);
+ XGrabKeyboard(dpy, root_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ pthread_mutex_unlock(&x11mutex);
+ memset(¤t_recording,0,sizeof(current_recording));
+ } else {
+ record_cancel();
}
- usleep(1000);
- g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS, G15_LED_MR | mled_state);
- g15r_initCanvas (canvas);
- g15r_renderString (canvas, (unsigned char *)"Recording", 0, G15_TEXT_LARGE, 80-((strlen("Recording")/2)*8), 1);
- g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
- g15macro_log("Recording Enabled\n");
- recording = 1;
- pthread_mutex_lock(&x11mutex);
- XGrabKeyboard(dpy, root_win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
- pthread_mutex_unlock(&x11mutex);
- memset(¤t_recording,0,sizeof(current_recording));
break;
}
case G15_KEY_M1:
@@ -582,12 +603,6 @@
if(keystate >=G15_KEY_G1 && keystate <=G15_KEY_G18){
if(recording==1){
record_complete(keystate);
- g15macro_log("Recording Complete\n");
- recording = 0;
- pthread_mutex_lock(&x11mutex);
- XUngrabKeyboard(dpy,CurrentTime);
- XFlush(dpy);
- pthread_mutex_unlock(&x11mutex);
} else {
macro_playback(keystate);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2008-01-04 23:32:10
|
Revision: 403
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=403&view=rev
Author: mlampard
Date: 2008-01-04 15:32:15 -0800 (Fri, 04 Jan 2008)
Log Message:
-----------
Fix xtest checking in configure, and update xtest notification in g15macro.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/configure.in
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2008-01-04 23:07:36 UTC (rev 402)
+++ trunk/g15daemon-clients/g15macro/configure.in 2008-01-04 23:32:15 UTC (rev 403)
@@ -12,17 +12,23 @@
AC_PROG_RANLIB
AC_CHECK_LIB([g15daemon_client], [g15daemon_version],,AC_MSG_ERROR(["libg15daemon_client (or its devel package) not found. please install it"]))
-AC_CHECK_LIB([Xtst],[XTestQueryExtension],,AC_MSG_ERROR(["Xorg XTest extension library not found. please install it"]))
+AC_CHECK_LIB([Xtst],[XTestQueryExtension],have_xtest_libs=yes,AC_MSG_WARN(["Xorg XTest extension library not found. please install it"]))
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(g15daemon_client.h libg15render.h,,AC_MSG_ERROR(["libg15daemon_client (or its devel package) could not be found. please install it"]))
AC_CHECK_HEADERS(X11/Xlib.h X11/XF86keysym.h,,AC_MSG_ERROR(["Xorg development files could not be found. please install the devel package"]))
-AC_CHECK_HEADERS(X11/extensions/XTest.h,,AC_MSG_WARN(["Xorg XTEST Extension devel headers could not be found. Reverting to XSendEvent()"]))
+AC_CHECK_HEADERS(X11/extensions/XTest.h,have_xtest_includes=yes,AC_MSG_WARN(["Xorg XTEST Extension devel headers could not be found. Reverting to XSendEvent()"]))
AC_PATH_X
AC_ARG_ENABLE([xtest],AS_HELP_STRING([--enable-xtest],[enable use of the XTest extension]))
-if test "x$enable_xtest" = "xyes"; then
- AC_DEFINE([USE_XTEST],[1],[Enable this to use the XTest extension if available])
+
+if test "x$have_xtest_libs" = "xyes"; then
+ if test "x$have_xtest_includes" = "xyes"; then
+ AC_DEFINE([HAVE_XTEST],[1],[Define if XTest devel package is available"])
+ if test "x$enable_xtest" = "xyes"; then
+ AC_DEFINE([USE_XTEST],[1],[Enable this to use the XTest extension if available])
+ fi
+ fi
fi
CPPFLAGS="$CPPFLAGS "'-DDATADIR="\"$(datadir)\""'
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-04 23:07:36 UTC (rev 402)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-04 23:32:15 UTC (rev 403)
@@ -766,8 +766,10 @@
{
pthread_t Xkeys;
pthread_t Lkeys;
+#ifdef USE_XTEST
int xtest_major_version = 0;
int xtest_minor_version = 0;
+#endif
struct sigaction new_action;
int dummy=0,i=0;
unsigned char user[256];
@@ -899,16 +901,19 @@
}
have_xtest = False;
+#ifdef HAVE_XTEST
#ifdef USE_XTEST
-#ifdef HAVE_X11_EXTENSIONS_XTEST_H
have_xtest = XTestQueryExtension(dpy, &dummy, &dummy, &xtest_major_version, &xtest_minor_version);
-#endif
-#endif
-
if(have_xtest == False || xtest_major_version < 2 || (xtest_major_version <= 2 && xtest_minor_version < 2))
{
- printf("Warning: XTEST extension not supported. This is not fatal.\nReverting to XSendEvent for keypress emulation\n");
+ printf("Warning: XTEST extension not supported by Xserver. This is not fatal.\nReverting to XSendEvent for keypress emulation\n");
}
+#else
+ printf("XTest disabled by configure option. Using XSendEvent instead.\n");
+#endif
+#else
+ printf("XTest disabled by configure: no devel package was found. Using XSendEvent instead.\n");
+#endif
/* completely ignore errors and carry on */
XSetErrorHandler(myx_error_handler);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2008-01-16 05:57:09
|
Revision: 422
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=422&view=rev
Author: mlampard
Date: 2008-01-15 21:57:14 -0800 (Tue, 15 Jan 2008)
Log Message:
-----------
update version and changelog
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/configure.in
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-16 05:52:08 UTC (rev 421)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-16 05:57:14 UTC (rev 422)
@@ -11,13 +11,16 @@
- Fix XTest event output
- Fix order of events, release was being sent before press.
- increase max number of key up/down events recorded to 1024
-SVN:
+1.0.2
- Add --dump (-d) option to dump recorded macros in human-readable format
- Add --version (-v)
- Add --debug (-g) to add some debugging
+SVN (1.0.3):
- Switch to a textual configuration file. Auto-converts to new format from binary
config if it exists. Only Semi-readable, but better than a binary dump.
- Ensure each keypress is received by X11 in sequence.
- Add mutexes where appropriate.
- Apply patch from 'schitso' that fixes cancellation of an in-progress recording via
any of the M keys, and moves repeated code into their own functions.
+- Add --help, --keysonly cmdline options. --keysonly configures keymaps
+ (including multimedia keys) then exits.
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2008-01-16 05:52:08 UTC (rev 421)
+++ trunk/g15daemon-clients/g15macro/configure.in 2008-01-16 05:57:14 UTC (rev 422)
@@ -1,7 +1,7 @@
-AC_INIT(g15macro,[1.0.1svn], [mla...@us...])
+AC_INIT(g15macro,[1.0.3svn], [mla...@us...])
PACKAGE=g15macro
-VERSION=1.0.1
+VERSION=1.0.3
AC_PREFIX_DEFAULT(/usr)
AC_CONFIG_AUX_DIR(config)
AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2008-01-23 11:00:08
|
Revision: 446
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=446&view=rev
Author: mlampard
Date: 2008-01-23 03:00:13 -0800 (Wed, 23 Jan 2008)
Log Message:
-----------
g15macro: prepare for 1.0.3 release
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/configure.in
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-23 08:26:23 UTC (rev 445)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-23 11:00:13 UTC (rev 446)
@@ -15,7 +15,7 @@
- Add --dump (-d) option to dump recorded macros in human-readable format
- Add --version (-v)
- Add --debug (-g) to add some debugging
-SVN (1.0.3):
+1.0.3:
- Switch to a textual configuration file. Auto-converts to new format from binary
config if it exists. Only Semi-readable, but better than a binary dump.
- Ensure each keypress is received by X11 in sequence.
Modified: trunk/g15daemon-clients/g15macro/configure.in
===================================================================
--- trunk/g15daemon-clients/g15macro/configure.in 2008-01-23 08:26:23 UTC (rev 445)
+++ trunk/g15daemon-clients/g15macro/configure.in 2008-01-23 11:00:13 UTC (rev 446)
@@ -1,4 +1,4 @@
-AC_INIT(g15macro,[1.0.3svn], [mla...@us...])
+AC_INIT(g15macro,[1.0.3], [mla...@us...])
PACKAGE=g15macro
VERSION=1.0.3
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2008-01-27 06:58:41
|
Revision: 455
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=455&view=rev
Author: mlampard
Date: 2008-01-26 22:58:43 -0800 (Sat, 26 Jan 2008)
Log Message:
-----------
g15macro: fix a segfault in g15r_initCanvas() when Freetype support is compiled in. For some reason FT_Init_Freetype() doesn't like being called after XOpenDisplay() on my system.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-26 05:30:51 UTC (rev 454)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-27 06:58:43 UTC (rev 455)
@@ -24,3 +24,6 @@
any of the M keys, and moves repeated code into their own functions.
- Add --help, --keysonly cmdline options. --keysonly configures keymaps
(including multimedia keys) then exits.
+SVN:
+- Move g15r_initCanvas() higher in main() to work around a segfault when
+ libg15render is compiled with FreeType support.
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-26 05:30:51 UTC (rev 454)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-27 06:58:43 UTC (rev 455)
@@ -843,6 +843,15 @@
}
}
+ canvas = (g15canvas *) malloc (sizeof (g15canvas));
+
+ if (canvas != NULL) {
+ g15r_initCanvas(canvas);
+ } else {
+ printf("Unable to initialise the libg15render canvas\nExiting\n");
+ return 1;
+ }
+
do {
dpy = XOpenDisplay(getenv("DISPLAY"));
if (!dpy) {
@@ -916,21 +925,14 @@
usleep(1000);
g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
usleep(1000);
- canvas = (g15canvas *) malloc (sizeof (g15canvas));
- if (canvas != NULL) {
- g15r_initCanvas(canvas);
- } else {
- printf("Unable to initialise the libg15render canvas\nExiting\n");
- return 1;
- }
-
root_win = DefaultRootWindow(dpy);
if (!root_win) {
printf("Cant find root window\n");
return 1;
}
+
have_xtest = False;
#ifdef HAVE_XTEST
#ifdef USE_XTEST
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <mla...@us...> - 2008-02-09 14:36:25
|
Revision: 459
http://g15daemon.svn.sourceforge.net/g15daemon/?rev=459&view=rev
Author: mlampard
Date: 2008-02-09 06:36:30 -0800 (Sat, 09 Feb 2008)
Log Message:
-----------
Save macro on completion of recording.
Modified Paths:
--------------
trunk/g15daemon-clients/g15macro/ChangeLog
trunk/g15daemon-clients/g15macro/g15macro.c
Modified: trunk/g15daemon-clients/g15macro/ChangeLog
===================================================================
--- trunk/g15daemon-clients/g15macro/ChangeLog 2008-01-31 05:18:40 UTC (rev 458)
+++ trunk/g15daemon-clients/g15macro/ChangeLog 2008-02-09 14:36:30 UTC (rev 459)
@@ -27,3 +27,4 @@
SVN:
- Move g15r_initCanvas() higher in main() to work around a segfault when
libg15render is compiled with FreeType support.
+- Save macro to disk on completion of every recording, not only on exit.
Modified: trunk/g15daemon-clients/g15macro/g15macro.c
===================================================================
--- trunk/g15daemon-clients/g15macro/g15macro.c 2008-01-31 05:18:40 UTC (rev 458)
+++ trunk/g15daemon-clients/g15macro/g15macro.c 2008-02-09 14:36:30 UTC (rev 459)
@@ -72,6 +72,8 @@
int have_xtest = False;
int debug = 0;
+char configpath[1024];
+
unsigned char recstring[1024];
static unsigned int mled_state = G15_LED_M1;
@@ -321,6 +323,7 @@
g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
record_cleanup();
+ save_macros(configpath);
}
int calc_mkey_offset() {
@@ -664,7 +667,7 @@
/* now the default stuff */
pthread_mutex_lock(&x11mutex);
XUngrabKeyboard(dpy,CurrentTime);
- pthread_mutex_unlock(&x11mutex);
+ pthread_mutex_unlock(&x11mutex);
fake_keyevent(keycode,press,event->xkey.state);
@@ -689,6 +692,8 @@
pthread_mutex_unlock(&x11mutex);
recording = 0;
rec_index = 0;
+ printf("saving macro\n");
+ save_macros(configpath);
}
}else
@@ -784,7 +789,6 @@
int dummy=0,i=0;
unsigned char user[256];
struct passwd *username;
- char configpath[1024];
char splashpath[1024];
unsigned int dump = 0;
unsigned int keysonly = 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|