G15LCDEngineUnix::G15LCDEngineUnix() { sock = new_g15_screen(G15_PIXELBUF); if (sock < 0) { qWarning("G15LCDEngineUnix: Unable to connect to G15Daemon."); return; } qlDevices << new G15LCDDeviceUnix(this); }
// Find the proper usb device and initialize it // MODULE_EXPORT int g15_init (Driver *drvthis) { PrivateData *p; /* Allocate and store private data */ p = (PrivateData *) calloc(1, sizeof(PrivateData)); if (p == NULL) return -1; if (drvthis->store_private_ptr(drvthis, p)) return -1; /* Initialize the PrivateData structure */ p->width = G15_CHAR_WIDTH; p->height = G15_CHAR_HEIGHT; p->cellwidth = G15_CELL_WIDTH; p->cellheight = G15_CELL_HEIGHT; p->backlight_state = BACKLIGHT_ON; p->g15screen_fd = 0; p->g15d_ver = g15daemon_version(); if((p->g15screen_fd = new_g15_screen(G15_G15RBUF)) < 0) { report(RPT_ERR, "%s: Sorry, cant connect to the G15daemon", drvthis->name); return -1; } /* make sure the canvas is there... */ p->canvas = (g15canvas *) malloc(sizeof(g15canvas)); if (p->canvas == NULL) { report(RPT_ERR, "%s: unable to create canvas", drvthis->name); return -1; } /* make sure the backingstore is there... */ p->backingstore = (g15canvas *) malloc(sizeof(g15canvas)); if (p->backingstore == NULL) { report(RPT_ERR, "%s: unable to create framebuffer backing store", drvthis->name); return -1; } g15r_initCanvas(p->canvas); g15r_initCanvas(p->backingstore); p->canvas->buffer[0] = G15_LCD_WRITE_CMD; p->backingstore->buffer[0] = G15_LCD_WRITE_CMD; // ret = setLCDBrightness(G15_BRIGHTNESS_BRIGHT); return 0; }
int main(int argc, char **argv) { Display *dpy; int g15screen_fd; int event; int error; BOOL enabled = True; CARD16 power = 0; int dummy = 0, lights = True, change = 0; int i; struct sigaction new_action; char * enable_cmd = NULL; char * disable_cmd = NULL; int dpms_timeout = 0; for (i=0;i<argc;i++) { char argument[20]; memset(argument,0,20); strncpy(argument,argv[i],19); if (!strncmp(argument, "-a",2) || !strncmp(argument, "--activate",10)) { if(argv[i+1]!=NULL){ sscanf(argv[i+1],"%i",&dpms_timeout); i++; }else{ printf("%s --activate requires an argument <minutes to activation>\n",argv[0]); exit(1); } } if (!strncmp(argument, "-e",2) || !strncmp(argument, "--cmd-enable",12)) { if(argv[i+1]!=NULL){ enable_cmd = malloc(strlen(argv[i+1])+1); memcpy(enable_cmd, argv[i+1], strlen(argv[i+1])); i++; } } if (!strncmp(argument, "-d",2) || !strncmp(argument, "--cmd-disable",13)) { if(argv[i+1]!=NULL){ disable_cmd = malloc(strlen(argv[i+1])+1); memcpy(disable_cmd, argv[i+1], strlen(argv[i+1])); i++; } } if (!strncmp(argument, "-v",2) || !strncmp(argument, "--version",9)) { printf("%s version %s\n",argv[0],VERSION); exit(0); } if (!strncmp(argument, "-b",2) || !strncmp(argument, "--bright",13)) { bright=1; } if (!strncmp(argument, "-h",2) || !strncmp(argument, "--help",6)) { printf(" %s version %s\n (c)2007 Mike Lampard\n\n",argv[0],VERSION); printf(" -a or --activate <minutes> - cause DPMS to be activated in <minutes> if no activity.\n"); printf(" By default, %s will simply monitor DPMS status, and\n",argv[0]); printf(" requires a screensaver to activate. \n"); printf(" In this mode, no screensver is needed.\n"); printf(" %s will shut the monitor down on its own after <minutes>\n",argv[0]); printf(" with no keyboard or mouse activity.\n"); printf(" -e or --cmd-enable <cmd to run> - Run program <cmd> when DPMS is activated.\n\n"); printf(" -d or --cmd-disable <cmd to run> - Run program <cmd> when DPMS is de-activated.\n\n"); printf(" -b or --bright - When the keyboard is woken up, set the LEDs to bright.\n\n"); printf(" -v or --version - Show program version\n\n"); printf(" -h or --help - This page\n\n"); exit(0); } } dpy = XOpenDisplay(getenv("DISPLAY")); if (!dpy) { printf("Unable to open display %s - exiting\n",getenv("DISPLAY")); return 1; } 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 (!DPMSQueryExtension (dpy, &event, &error)) { printf ("XDPMS extension not supported.\n"); return 1; } if (!DPMSCapable(dpy)) { printf("DPMS is not enabled... exiting\n"); return 1; } if (dpms_timeout>0) { DPMSEnable(dpy); DPMSSetTimeouts(dpy,dpms_timeout*60,dpms_timeout*60,0); } new_action.sa_handler = sighandler; new_action.sa_flags = 0; sigaction(SIGINT, &new_action, NULL); sigaction(SIGQUIT, &new_action, NULL); while(!leaving) { int fg_check = g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, dummy); if (! DPMSInfo (dpy, &power, &enabled)) { printf ("unable to get DPMS state.\n"); return 1; } switch(power) { case DPMSModeOn: { if (lights == False) { change = 1; fork_child(enable_cmd); } lights = True; break; } case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: { if(lights == True){ change = 1; fork_child(disable_cmd); } lights = False; break; } } if (fg_check==1 && lights == True && change == 0) { // foreground g15_send_cmd (g15screen_fd, G15DAEMON_SWITCH_PRIORITIES, dummy); } if(change) { toggle_g15lights(g15screen_fd,lights,fg_check); change=0; } sleep (1); } close(g15screen_fd); if(enable_cmd!=NULL) free(enable_cmd); if(disable_cmd!=NULL) free(disable_cmd); XCloseDisplay(dpy); return 0; }
int main(int argc, char **argv) { int fdstdin = 0; pthread_t Lkeys; pthread_t g15display; pthread_t EKeys; int volume; int volume_new; char devname[256] = "Unknown"; int iport = 6600; char *hostname = getenv("MPD_HOST"); char *port = getenv("MPD_PORT"); char *password = getenv("MPD_PASSWORD"); int eventdev; char evdev_name[128]; pthread_mutex_init(&lockit,NULL); pthread_mutex_init(&daemon_mutex,NULL); int i; for (i=0;i<argc;i++) { char argument[20]; memset(argument,0,20); strncpy(argument,argv[i],19); if (!strncmp(argument, "-q",2) || !strncmp(argument, "--quickscroll",13)) { quickscroll=1; } if (!strncmp(argument, "-h",2) || !strncmp(argument, "--help",6)) { printf(" %s version %s\n (c)2006-2007 Mike Lampard\n\n",argv[0],VERSION); printf("%s -q or --quickscroll Use volume control to scroll through the playlist\n",argv[0]); printf("%s -v or --version Show program version\n",argv[0]); printf("%s -h or --help This help text\n\n",argv[0]); exit(0); } if (!strncmp(argument, "-v",2) || !strncmp(argument, "--version",9)) { printf("%s version %s\n",argv[0],VERSION); exit(0); } } for(eventdev=0;eventdev<127;eventdev++) { snprintf(evdev_name,127,"/dev/input/event%i",eventdev); if ((mmedia_fd = open(evdev_name, O_NONBLOCK|O_RDONLY)) < 0) { // ignore errors when opening devices //printf("error opening interface %i\n",eventdev); } else { ioctl(mmedia_fd, EVIOCGNAME(sizeof(devname)), devname); printf("Device Name %s on %s\n", devname, evdev_name); if(0==strncmp(devname,"Logitech Logitech Gaming Keyboard",256)){ printf("Found device: \"%s\" on %s ", devname,evdev_name); break; } else if(0==strncmp(devname,"G15 Gaming Keyboard",256)){ printf("Found device: \"%s\" on %s ", devname,evdev_name); break; }else close(mmedia_fd); } } if (mmedia_fd) { // we assume that the next event device is the multimedia keys close(mmedia_fd); snprintf(evdev_name,127,"/dev/input/event%i",++eventdev); printf("and %s\n",evdev_name); if ((mmedia_fd = open(evdev_name, O_NONBLOCK|O_RDONLY)) < 0) { printf("error opening interface %i",eventdev); } }else { printf("Unable to find Keyboard via EVENT interface... is /dev/input/event[0-9] readable??\n"); } /* set correct hostname */ if(!hostname) { hostname = "localhost"; } if(port){ iport = atoi(port); } if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){ printf("Sorry, cant connect to the G15daemon\n"); return 1; } canvas = (g15canvas *) malloc (sizeof (g15canvas)); if (canvas != NULL) { memset(canvas->buffer, 0, G15_BUFFER_LEN); canvas->mode_cache = 0; canvas->mode_reverse = 0; canvas->mode_xor = 0; } /* Create mpd object */ obj = mpd_new(hostname, iport,password); /* Connect signals */ mpd_signal_connect_error(obj,(ErrorCallback)error_callback, NULL); mpd_signal_connect_status_changed(obj,(StatusChangedCallback)status_changed, NULL); /* Set timeout */ mpd_set_connection_timeout(obj, 10); if(0==mpd_connect(obj)) { char buffer[20]; pthread_attr_t attr; mpd_send_password(obj); memset(buffer, '\0', 20); pthread_attr_init(&attr); pthread_attr_setstacksize(&attr,32*1024); /* set stack to 64k - dont need 8Mb !! */ pthread_create(&Lkeys, &attr, Lkeys_thread, NULL); pthread_create(&EKeys, &attr,event_key_thread, NULL); pthread_create(&g15display, &attr, g15display_thread, NULL); do{ pthread_mutex_lock(&daemon_mutex); if(voltimeout) --voltimeout; if(mute){ volume_adjust = 0; mute = 0; if (muted_volume == 0) { //printf("mute\n"); muted_volume = mpd_status_get_volume(obj); mpd_status_set_volume (obj,0); } else { //printf("unmute\n"); if (mpd_status_get_volume(obj) == 0) { /* if no other client has set volume up */ mpd_status_set_volume (obj,muted_volume); } muted_volume = 0; } } if(volume_adjust != 0){ if (muted_volume != 0) { volume=muted_volume; } else { volume=mpd_status_get_volume(obj); } volume_new = volume + volume_adjust; volume_adjust = 0; if(volume_new < 0) volume_new = 0; if(volume_new > 100) volume_new = 100; if(volume != volume_new || muted_volume){ //printf("volume %d -> %d\n", volume, volume_new); mpd_status_set_volume (obj,volume_new); } voltimeout=100; muted_volume=0; } mpd_status_update(obj); pthread_mutex_unlock(&daemon_mutex); }while(!usleep(5000) && !leaving); leaving = 1; pthread_join(Lkeys,NULL); pthread_join(g15display,NULL); }else printf("Unable to connect to MPD server. Exiting\n"); if(obj) mpd_free(obj); close(fdstdin); if(canvas!=NULL) free(canvas); close(g15screen_fd); close(mmedia_fd); pthread_mutex_destroy(&lockit); return 1; }
/* take the track_info structure and render it */ void *g15display_thread(){ long chksum=0; static long last_chksum; int i; unsigned char time_elapsed[41]; unsigned char time_total[41]; static int current = 0; int changed =0; while(!leaving){ if(playlist_mode){ int y=0; int offset=2; changed = 0; if(track_info.currentsong>-1){ current=track_info.currentsong; track_info.currentsong = -1; changed = 1; } if(playlist_selection>0){ if(current+1<mpd_playlist_get_playlist_length(obj)){ current+=playlist_selection; changed = 1; } playlist_selection=0; } if(playlist_selection<0){ if(current) { current--; changed = 1; } playlist_selection=0; } if(current-offset<0) offset-=current; if(changed){ g15r_pixelBox (canvas, 0, 0, 159, 42, G15_COLOR_WHITE, 1, 1); for(i=current-offset;i<current+6;i++){ char title[100]; mpd_Song *song; song = mpd_playlist_get_song_from_pos(obj, i); if(song) { if(song->title!=NULL) strncpy(title,song->title,99); else strncpy(title,"",99); if(song->artist!=NULL){ strncat(title," - ",99); strncat(title,song->artist,99); } } /* sanitise the display */ if(i==mpd_playlist_get_playlist_length(obj)) strncpy(title,"End of PlayList",99); if(i>mpd_playlist_get_playlist_length(obj)) break; if(i<0) strncpy(title,"",99); if(y==offset){ g15r_pixelBox (canvas, 0, 7*offset, 159 , 7*(offset+1), G15_COLOR_BLACK, 1, 1); canvas->mode_xor=1; if(song) if(song->id) item_selected=song->id; } g15r_renderString (canvas, (unsigned char *)title, y, G15_TEXT_MED, 1, 1); canvas->mode_xor=0; y++; } } }else{ /* track info */ g15r_pixelBox (canvas, 0, 0, 159, 42, G15_COLOR_WHITE, 1, 1); g15r_renderString (canvas, (unsigned char *)track_info.artist, 0, G15_TEXT_LARGE, 80-(strlen(track_info.artist)*8)/2, 2); g15r_renderString (canvas, (unsigned char *)track_info.title, 0, G15_TEXT_MED, 80-(strlen(track_info.title)*5)/2, 12); /* elapsed time */ memset(time_elapsed,0,41); memset(time_total,0,41); if (track_info.total != 0) { snprintf((char*)time_elapsed,40,"%02i:%02i",track_info.elapsed/60, track_info.elapsed%60); snprintf((char*)time_total,40,"%02i:%02i",track_info.total/60, track_info.total%60); } if(track_info.elapsed>0&&track_info.total>0) g15r_drawBar (canvas, 10, 22, 149, 30, G15_COLOR_BLACK, track_info.elapsed, track_info.total, 1); canvas->mode_xor=1; g15r_renderString (canvas,(unsigned char*)time_elapsed,0,G15_TEXT_MED,12,23); g15r_renderString (canvas,(unsigned char*)time_total,0,G15_TEXT_MED,124,23); canvas->mode_xor=0; switch(track_info.playstate) { case MPD_PLAYER_PLAY: playing=1; paused=0; break; case MPD_PLAYER_PAUSE: g15r_pixelBox (canvas, 10, 22, 149, 30, G15_COLOR_WHITE, 1, 1); g15r_renderString (canvas, (unsigned char *)"Playback Paused", 0, G15_TEXT_LARGE, 22, 23); paused=1; break; case MPD_PLAYER_STOP: g15r_pixelBox (canvas, 10, 22, 149, 30, G15_COLOR_WHITE, 1, 1); g15r_renderString (canvas, (unsigned char *)"Playback Stopped", 0, G15_TEXT_LARGE, 18, 23); playing=0; paused=0; break; default: break; } g15r_pixelBox (canvas, 1, 34, 158 , 41, G15_COLOR_WHITE, 1, 1); g15r_pixelBox (canvas, 10, 34, 27, 42, G15_COLOR_BLACK, 1, 1); canvas->mode_xor=1; g15r_renderString (canvas, (unsigned char *)"mode", 0, G15_TEXT_SMALL, 11, 36); canvas->mode_xor=0; if(menulevel==MENU_MODE1){ if(track_info.random){ g15r_drawLine (canvas, 43, 42, 158, 42,G15_COLOR_WHITE); canvas->mode_xor=1; g15r_pixelBox (canvas, 104, 34, 125 , 42, G15_COLOR_BLACK, 1, 1); }else{ g15r_pixelBox (canvas, 104, 34, 125 , 42, G15_COLOR_BLACK, 1, 0); } g15r_renderString (canvas, (unsigned char *)"Rndm", 0, G15_TEXT_SMALL, 108, 36); canvas->mode_xor=0; if(track_info.repeat){ canvas->mode_xor=1; g15r_pixelBox (canvas, 130, 34, 149 , 42, G15_COLOR_BLACK, 1, 1); }else { g15r_pixelBox (canvas, 130, 34, 149 , 42, G15_COLOR_BLACK, 1, 0); } g15r_renderString (canvas, (unsigned char *)"Rpt", 0, G15_TEXT_SMALL, 136, 36); canvas->mode_xor=0; // 2nd box from left - if you want it... if(playlist_mode==0){ g15r_pixelBox (canvas, 34, 34, 70 , 42, G15_COLOR_BLACK, 1, 0); g15r_renderString (canvas, (unsigned char *)"Playlist", 0, G15_TEXT_SMALL, 36, 36); }else{ canvas->mode_xor=1; g15r_pixelBox (canvas, 34, 34, 70 , 42, G15_COLOR_BLACK, 1, 1); g15r_renderString (canvas, (unsigned char *)"Playlist", 0, G15_TEXT_SMALL, 36, 36); canvas->mode_xor=0; } } if(menulevel==MENU_MODE2){ g15r_pixelBox (canvas, 104, 34, 125 , 42, G15_COLOR_BLACK, 1, 0); g15r_renderString (canvas, (unsigned char *)"Vol-", 0, G15_TEXT_SMALL, 108, 36); g15r_pixelBox (canvas, 130, 34, 149 , 42, G15_COLOR_BLACK, 1, 0); g15r_renderString (canvas, (unsigned char *)"Vol+", 0, G15_TEXT_SMALL, 132, 36); // 2nd box from left - if you want it... //g15r_pixelBox (canvas, 34, 34, 54 , 42, G15_COLOR_BLACK, 1, 0); //g15r_renderString (canvas, (unsigned char *)"test", 0, G15_TEXT_SMALL, 36, 36); } if(muted_volume != 0){ g15r_renderString (canvas, (unsigned char *)"MUTE", 0, G15_TEXT_LARGE, 11, 2); } else if(voltimeout){ g15r_drawBar (canvas,10, 22, 149, 30, G15_COLOR_BLACK, track_info.volume, 100, 1); canvas->mode_xor=1; g15r_renderString (canvas, (unsigned char *)"Volume", 0, G15_TEXT_LARGE, 59, 23); canvas->mode_xor=0; } } /* do a quicky checksum - only send frame if different */ chksum=0; for(i=0;i<G15_BUFFER_LEN;i++){ chksum+=canvas->buffer[i]*i; } pthread_mutex_lock(&daemon_mutex); if(last_chksum!=chksum) { while(g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN)<0 && !leaving) { perror("lost connection, tryng again\n"); usleep(10000); /* connection error occurred - try to reconnect to the daemon */ g15screen_fd=new_g15_screen(G15_G15RBUF); } } pthread_mutex_unlock(&daemon_mutex); last_chksum=chksum; usleep(75*1000); if(playlist_mode) usleep(75*1000); } return NULL; }
int main(int argc, char **argv) { // init vars have_xtest = False; numConfigs = 0; currConfig = 0; gui_selectConfig = 0; G15Version = 0; config_fd = 0; mled_state = G15_LED_M1; mkey_state = 0; recording = 0; // this is for keeping track of when to redraw gui_oldConfig = MAX_CONFIGS+1; // To make sure it will be redrawn at first was_recording = 1; #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]; struct passwd *username; char splashpath[1024]; unsigned int dump = 0; unsigned int keysonly = 0; FILE *config; unsigned int convert = 0; memset(configDir,0,sizeof(configDir)); strncpy(configDir,getenv("HOME"),1024); strncat(configDir,"/.g15macro/",1024-strlen(configDir)); strncpy(configpath,getenv("HOME"),1024); memset(user,0,256); for(i=0;i<argc;i++){ 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], "-h",2) || !strncmp(argv[i], "--help",6)) { helptext(); exit(0); } if (!strncmp(argv[i], "-k",2) || !strncmp(argv[i], "--keysonly",10)) { keysonly = 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); } if (!strncmp(argv[i], "-2",2) || !strncmp(argv[i], "--g15version2",13)) { G15Version = 1; // See declaration for info } } if(strlen((char*)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); strncpy(configDir,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")); } printf("BEWARE: this program will run files WITHOUT dropping any kind of privilegies.\n"); } 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) { printf("Unable to open display %s - retrying\n",getenv("DISPLAY")); sleep(2); } }while(!dpy); /* completely ignore errors and carry on */ XSetErrorHandler(myx_error_handler); // Get keycodes for all keys strcpy(GKeyCodeCfg,configDir); strncat(GKeyCodeCfg,"GKeyCodes.cfg",1024-strlen(GKeyCodeCfg)); printf("%s\n",GKeyCodeCfg); getKeyDefs(GKeyCodeCfg); configure_mmediakeys(); change_keymap(0); XFlush(dpy); if(keysonly>0) goto close_and_exit; /* old binary config format */ 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)); 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 cleanMstates(0); //0 = only NULL the pointers /* 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 { if((g15screen_fd = new_g15_screen(G15_G15RBUF))<0){ printf("Sorry, cant connect to the G15daemon - retrying\n"); sleep(2); } }while(g15screen_fd<0); loadMultiConfig(); printf("I've now got the following macro files:\n"); for(i=0; i < MAX_CONFIGS;++i) { if(!configs[i]) continue; printf("%i:%s%s\n",i,configDir,configs[i]->configfile); } if(!convert) { memset(configpath,0,sizeof(configpath)); strcpy(configpath,configDir); strncat(configpath,configs[currConfig]->configfile,1024-strlen(configpath)); restore_config(configpath); } if(dump){ printf("G15Macro Dumping Codes..."); 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); root_win = DefaultRootWindow(dpy); if (!root_win) { printf("Cant find root window\n"); return 1; } have_xtest = False; #ifdef HAVE_XTEST #ifdef USE_XTEST have_xtest = XTestQueryExtension(dpy, &dummy, &dummy, &xtest_major_version, &xtest_minor_version); if(have_xtest == False || xtest_major_version < 2 || (xtest_major_version <= 2 && xtest_minor_version < 2)) { printf("Warning: XTEST extension not supported by Xserver. This is not fatal.\nReverting to XSendEvent for keypress emulation\n"); } #else //USE_XTEST printf("XTest disabled by configure option. Using XSendEvent instead.\n"); #endif //USE_XTEST #else //HAVE_XTEST printf("XTest disabled by configure: no devel package was found. Using XSendEvent instead.\n"); #endif //HAVE_XTEST printf("XTest enabled. Using XTest.\n"); new_action.sa_handler = g15macro_sighandler; 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); sigaction(SIGHUP, &new_action, NULL); // So that forked processes that die can actually die instead of going defunct. struct sigaction act; memset(&act,0,sizeof(act)); act.sa_handler = &cleanupChildren; sigaction(SIGCHLD,&act,NULL); snprintf((char*)splashpath,1024,"%s/%s",DATADIR,"g15macro/splash/g15macro.wbmp"); g15r_loadWbmpSplash(canvas, splashpath); g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN); // Following piece of code is not documented (what i could find anyway) // But makes so that the user can never bring this screen to front. // TODO: Document it // #ifdef G15DAEMON_NEVER_SELECT // g15_send_cmd (g15screen_fd, G15DAEMON_NEVER_SELECT, dummy); // #endif usleep(1000); pthread_mutex_init(&x11mutex,NULL); pthread_mutex_init(&config_mutex,NULL); pthread_mutex_init(&gui_select,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 32k - dont need 8Mb !! */ pthread_create(&Xkeys, &attr, xevent_thread, NULL); pthread_create(&Lkeys, &attr, Lkeys_thread, NULL); mainLoop(); cleanup(); close_and_exit: /* XCloseDisplay(dpy); */ return 0; }