Exemple #1
0
int new_g15_screen(int screentype)
{
    struct sigaction new_sigaction;
    int g15screen_fd;
    struct sockaddr_in serv_addr;
    static int sighandler_init=0;
    /* raise the priority of our packets */
    int tos = 0x6;

    char buffer[256];
    if(sighandler_init==0) {
#ifdef HAVE_BACKTRACE
      new_sigaction.sa_handler = g15_sighandler;
      new_sigaction.sa_flags = 0;
      sigaction(SIGSEGV,&new_sigaction,NULL);
#endif      
      sighandler_init=1;
    }
    
    g15screen_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (g15screen_fd < 0) 
        return -1;
    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family      = AF_INET;
    inet_aton (G15SERVER_ADDR, &serv_addr.sin_addr);
    serv_addr.sin_port        = htons(G15SERVER_PORT);

    if (connect(g15screen_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
        return -1;
    
    setsockopt(g15screen_fd, SOL_SOCKET, SO_PRIORITY, &tos, sizeof(tos));

    if (fcntl(g15screen_fd, F_SETFL, O_NONBLOCK) <0 ) {
    }
                        
    memset(buffer,0,256);
    if(g15_recv(g15screen_fd, buffer, 16)<0)
        return -1;
    
    /* here we check that we're really talking to the g15daemon */
    if(strcmp(buffer,"G15 daemon HELLO") != 0)
        return -1;
    if(screentype == G15_TEXTBUF) /* txt buffer - not supported yet */
        g15_send(g15screen_fd,"TBUF",4);
    else if(screentype == G15_WBMPBUF) /* wbmp buffer */
        g15_send(g15screen_fd,"WBUF",4);
    else if(screentype == G15_G15RBUF)
        g15_send(g15screen_fd,"RBUF",4);
    else 
        g15_send(g15screen_fd,"GBUF",4);
    
    return g15screen_fd;
}
Exemple #2
0
void record_cancel(){
	g15r_clearScreen(canvas,G15_COLOR_WHITE);
    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 processesApplet::update() {

    QProcess top;
    QString program = "top";
    QStringList arguments;

    arguments.append("-b");
    arguments.append("-n");
    arguments.append("1");

    top.start(program, arguments);
    top.waitForFinished();

    QStringList linies = QString(top.readAllStandardOutput()).split("\n");
    QStringList procs;

    procs.append(linies.at(7));
    procs.append(linies.at(8));
    procs.append(linies.at(9));
    procs.append(linies.at(10));
    procs.append(linies.at(11));

    QStringList p1 = procs.at(0).split(QRegExp("\\s+"));
    QStringList p2 = procs.at(1).split(QRegExp("\\s+"));
    QStringList p3 = procs.at(2).split(QRegExp("\\s+"));
    QStringList p4 = procs.at(3).split(QRegExp("\\s+"));
    QStringList p5 = procs.at(4).split(QRegExp("\\s+"));

    if (p1.first() == "") p1.erase(p1.begin());
    if (p2.first() == "") p2.erase(p2.begin());
    if (p3.first() == "") p3.erase(p3.begin());
    if (p4.first() == "") p4.erase(p4.begin());
    if (p5.first() == "") p5.erase(p5.begin());

    g15r_clearScreen(canvas, 0);

    g15r_G15FPrint(canvas, (char *) "Process Monitor", 0, 0, 1, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 0);

    g15r_G15FPrint(canvas, qstringToChar(p1.at(0)), 0, 0, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 2);
    g15r_G15FPrint(canvas, qstringToChar(p2.at(0)), 0, 0, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 3);
    g15r_G15FPrint(canvas, qstringToChar(p3.at(0)), 0, 0, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 4);
    g15r_G15FPrint(canvas, qstringToChar(p4.at(0)), 0, 0, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 5);
    g15r_G15FPrint(canvas, qstringToChar(p5.at(0)), 0, 0, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 6);

    g15r_G15FPrint(canvas, qstringToChar(p1.at(11)), 0, 0, 0, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 2);
    g15r_G15FPrint(canvas, qstringToChar(p2.at(11)), 0, 0, 0, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 3);
    g15r_G15FPrint(canvas, qstringToChar(p3.at(11)), 0, 0, 0, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 4);
    g15r_G15FPrint(canvas, qstringToChar(p4.at(11)), 0, 0, 0, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 5);
    g15r_G15FPrint(canvas, qstringToChar(p5.at(11)), 0, 0, 0, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 6);

    g15r_G15FPrint(canvas, qstringToChar(p1.at(9)), 0, 0, 0, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 2);
    g15r_G15FPrint(canvas, qstringToChar(p2.at(9)), 0, 0, 0, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 3);
    g15r_G15FPrint(canvas, qstringToChar(p3.at(9)), 0, 0, 0, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 4);
    g15r_G15FPrint(canvas, qstringToChar(p4.at(9)), 0, 0, 0, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 5);
    g15r_G15FPrint(canvas, qstringToChar(p5.at(9)), 0, 0, 0, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 6);

    g15_send(fd, (char *) canvas->buffer, G15_BUFFER_LEN);
}
Exemple #4
0
// Blasts a single frame onscreen, to the lcd...
//
MODULE_EXPORT void g15_flush (Driver *drvthis)
{
	PrivateData *p = drvthis->private_data;

	if (memcmp(p->backingstore->buffer, p->canvas->buffer, G15_BUFFER_LEN * sizeof(unsigned char)) == 0)
		return;

	memcpy(p->backingstore->buffer, p->canvas->buffer, G15_BUFFER_LEN * sizeof(unsigned char));

	g15_send(p->g15screen_fd,(char*)p->canvas->buffer,1048);
}
Exemple #5
0
void renderSelectionList()
{
	// Draws the three presets in the list (Selected-1,Selected,Selected+1)
	// Find config id to render
	pthread_mutex_lock(&gui_select);
	/*static*/ int tmpRenderConfID = 0;

	// Render first entry
	if (gui_selectConfig > 0)
		tmpRenderConfID = gui_selectConfig-1;
	else
		tmpRenderConfID = numConfigs;

	char* renderLine = stringTrim((char*)getConfigName(tmpRenderConfID),25);
	g15r_renderString(canvas, (unsigned char*)renderLine, 0, G15_TEXT_MED, 1, 17);
	free(renderLine);
	renderLine = NULL;


	// Render middle entry available for selection
	renderLine = stringTrim((char*)getConfigName(gui_selectConfig),25);

	g15r_renderString(canvas, (unsigned char*)renderLine, 0, G15_TEXT_MED, 1, 26);
	free(renderLine);
	renderLine = NULL;

	// Render third (last) entry
	if (gui_selectConfig < numConfigs)
		tmpRenderConfID = gui_selectConfig+1;
	else
		tmpRenderConfID = 0;
	pthread_mutex_unlock(&gui_select);

	renderLine = stringTrim((char*)getConfigName(tmpRenderConfID),25);
	g15r_renderString(canvas, (unsigned char*)renderLine, 0, G15_TEXT_MED, 1, 35);
	free(renderLine);
	renderLine = NULL;

	// Make middle look selected by inverting colours
	g15r_pixelReverseFill(canvas, 0, 24, 121, 33, 0,G15_COLOR_BLACK);

	g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);
	pthread_mutex_lock(&gui_select);
	gui_oldConfig = gui_selectConfig;
	pthread_mutex_unlock(&gui_select);
}
Exemple #6
0
void record_complete(unsigned long keystate)
{
    char tmpstr[1024];
    int gkey = map_gkey(keystate);

    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, &current_recording, sizeof(keysequence_t));

    mstates[mkey_state]->gkeys[gkey].keysequence.record_steps=rec_index;
    pthread_mutex_unlock(&config_mutex);

	g15r_clearScreen(canvas,G15_COLOR_WHITE);
    if(rec_index){
        strcpy(tmpstr,"For key ");
        strcat(tmpstr,gkeystring[map_gkey(keystate)]);
        g15macro_log("Recording Complete %s\n",tmpstr);
        g15r_renderString (canvas, (unsigned char *)"Recording", 0, G15_TEXT_LARGE, 80-((strlen("Recording")/2)*8), 4);
        g15r_renderString (canvas, (unsigned char *)"Complete", 0, G15_TEXT_LARGE, 80-((strlen("Complete")/2)*8), 18);

    }else{
        strcpy(tmpstr,"From Key ");
		printf("%lu\n",keystate);
        strcat(tmpstr,gkeystring[map_gkey(keystate)]);
        g15macro_log("Macro deleted %s\n",tmpstr);
        g15r_renderString (canvas, (unsigned char *)"Macro", 0, G15_TEXT_LARGE, 80-((strlen("Macro")/2)*8), 4);
        g15r_renderString (canvas, (unsigned char *)"Deleted", 0, G15_TEXT_LARGE, 80-((strlen("Deleted")/2)*8), 18);
    }
    g15r_renderString (canvas, (unsigned char *)tmpstr, 0, G15_TEXT_LARGE, 80-((strlen(tmpstr)/2)*8), 32);

    g15_send(g15screen_fd,(char *)canvas->buffer,G15_BUFFER_LEN);

    record_cleanup();
	g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
    save_macros(configpath);
}
void G15LCDDeviceUnix::blitImage(QImage *img, bool) {
	Q_ASSERT(img != NULL);

	const unsigned int len = 6880;
	uchar buf[len];
	uchar *tmp = img->bits();

	for (unsigned int i = 0; i < len / 8; ++i) {
		unsigned int idx = i*8;
		buf[idx+7] = tmp[i] & 0x80 ? 1 : 0;
		buf[idx+6] = tmp[i] & 0x40 ? 1 : 0;
		buf[idx+5] = tmp[i] & 0x20 ? 1 : 0;
		buf[idx+4] = tmp[i] & 0x10 ? 1 : 0;
		buf[idx+3] = tmp[i] & 0x08 ? 1 : 0;
		buf[idx+2] = tmp[i] & 0x04 ? 1 : 0;
		buf[idx+1] = tmp[i] & 0x02 ? 1 : 0;
		buf[idx+0] = tmp[i] & 0x01 ? 1 : 0;
	}

	int ret = g15_send(engine->sock, reinterpret_cast<char *>(buf), len);
	if (ret < 0)
		qWarning("G15LCDDeviceUnix: Unable to g15_send().");
}
Exemple #8
0
/* 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;
}
Exemple #9
0
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;
}
Exemple #10
0
void xkey_handler(XEvent *event) {
	static unsigned long lasttime;
	unsigned char keytext[256];
	unsigned int keycode = event->xkey.keycode;
	int press = True;

	if(event->type==KeyRelease){ // we only do keyreleases for some keys
	pthread_mutex_lock(&x11mutex);
		KeySym key = XKeycodeToKeysym(dpy, keycode, 0);
	pthread_mutex_unlock(&x11mutex);
		switch (key) {
			case XK_Shift_L:
			case XK_Shift_R:
			case XK_Control_L:
			case XK_Control_R:
			case XK_Caps_Lock:
			case XK_Shift_Lock:
			case XK_Meta_L:
			case XK_Meta_R:
			case XK_Alt_L:
			case XK_Alt_R:
			case XK_Super_L:
			case XK_Super_R:
			case XK_Hyper_L:
			case XK_Hyper_R:
			default:
				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
			current_recording.recorded_keypress[rec_index].time_ms=g15daemon_gettime_ms() - lasttime;
		if(rec_index < MAX_KEYSTEPS)
		{
			rec_index++;
			/* now the default stuff */
			pthread_mutex_lock(&x11mutex);
			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);
			XFlush(dpy);
			strcpy((char*)keytext,XKeysymToString(XKeycodeToKeysym(dpy, keycode, 0)));
			pthread_mutex_unlock(&x11mutex);
			if(0==strcmp((char*)keytext,"space"))
				strcpy((char*)keytext," ");
			if(0==strcmp((char*)keytext,"period"))
				strcpy((char*)keytext,".");
			if(press==True){
			strcat((char*)recstring,(char*)keytext);
			g15macro_log("Adding %s to Macro\n",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
		{
			pthread_mutex_lock(&x11mutex);
			XUngrabKeyboard(dpy,CurrentTime);
			pthread_mutex_unlock(&x11mutex);
			recording = 0;
			rec_index = 0;
			printf("Saving macro\n");
			save_macros(configpath);
		}

    }
	else
		rec_index=0;

	lasttime = g15daemon_gettime_ms();
}
Exemple #11
0
void *Lkeys_thread() {
    unsigned long keystate = 0;
    struct pollfd fds;
    char ver[5];
    int foo = 0;
    float g15v;

	memset(ver,0x0,sizeof(ver));
	strncpy(ver,G15DAEMON_VERSION,3);
    sscanf(ver,"%f",&g15v);

    g15macro_log("Using version %.2f as keypress protocol\n",g15v);

    while(!leaving){

        /* g15daemon series 1.2 need key request packets */
        if((g15v*10)<=18) {
            keystate = g15_send_cmd (g15screen_fd, G15DAEMON_GET_KEYSTATE, foo);
        } else {
            fds.fd = g15screen_fd;
            fds.events = POLLIN;
            fds.revents=0;
            keystate=0;
            if ((poll(&fds, 1, 1000)) > 0) {
                read (g15screen_fd, &keystate, sizeof (keystate));
            }
        }

        if (keystate!=0)
        {
            g15macro_log("Received Keystate == %lu\n",keystate);

            switch (keystate)
            {
				case G15_KEY_L2:
				{
					int fg_check = g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, foo);
					if(!fg_check)
						break;

					// Go to default/g15macro.conf = id =0
					gui_selectChange(0);
					break;
				}
				case G15_KEY_L3:
				{
					int fg_check = g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, foo);
					if(!fg_check)
						break;

					// Scroll up
					gui_selectChange(-1);
					break;
				}
				case G15_KEY_L4:
				{
					int fg_check = g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, foo);
					if(!fg_check)
						break;

					// Scroll down
					gui_selectChange(+1);
					break;
				}
				case G15_KEY_L5:
				{
					int fg_check = g15_send_cmd (g15screen_fd, G15DAEMON_IS_FOREGROUND, foo);
					if(!fg_check)
						break;

					// Change to selected

					char newConfig[1024];
					memset(newConfig,0,sizeof(newConfig));
					strcpy(newConfig,configDir);
					strncat(newConfig,configs[currConfig]->configfile,sizeof(newConfig)-strlen(newConfig));
					// Actually not the newConfig, it's the old, but didn't come up with a good name.
					save_macros(newConfig);

					// Purge all old data
					cleanMstates(1);

					// Now load the new config
					currConfig = gui_selectConfig;
					memset(newConfig,0,sizeof(newConfig));
					strcpy(newConfig,configDir);
					strncat(newConfig,configs[currConfig]->configfile,sizeof(newConfig)-strlen(newConfig));

					restore_config(newConfig);


					// Set the configpath to reflect the change
					memset(configpath,0,sizeof(configpath));
					strcpy(configpath,configDir);
					strncat(configpath,configs[currConfig]->configfile,sizeof(configpath)-strlen(configpath));
					gui_oldConfig = MAX_CONFIGS+1;

					break;
				}
                case G15_KEY_MR: {
					g15macro_log("Key pressed is MR\n");
                    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(&current_recording,0,sizeof(current_recording));
                    } else {
                      record_cancel();
					  g15_send_cmd (g15screen_fd,G15DAEMON_MKEYLEDS,mled_state);
                    }
                    break;
                  }
                case G15_KEY_M1:
                    handle_mkey_switch(G15_KEY_M1);
					g15macro_log("Key pressed is M1\n");
                    break;
                case G15_KEY_M2:
                    handle_mkey_switch(G15_KEY_M2);
					g15macro_log("Key pressed is M2\n");
                    break;
                case G15_KEY_M3:
                    handle_mkey_switch(G15_KEY_M3);
					g15macro_log("Key pressed is M3\n");
                    break;
                default:
                    if(keystate >=G15_KEY_G1 && keystate <=G15_KEY_G18){
                        if(recording==1){
                            record_complete(keystate);
                        } else {
                            macro_playback(keystate);
                        }
                    }
                    break;
            }
            keystate = 0;
        }
    }
    return NULL;
}
void hardwareApplet::update() {

    g15r_clearScreen(canvas, 0);

    unsigned int keystate = 0;

    recv(fd, &keystate, 4, 0);

    if (keystate) {
        if (keystate & G15_KEY_L2) screen = 0;
        else if (keystate & G15_KEY_L3) screen = 1;
        else if (keystate & G15_KEY_L4) screen = 2;
        else if (keystate & G15_KEY_L5) screen = 3;
    }

    QFile file;

    if (screen == 0) {

        //CPU
        file.setFileName("/proc/stat");
        file.open(QIODevice::ReadOnly);
        QStringList strcpu = QString(file.readLine()).split(QRegExp("\\s+"));
        file.close();

        int cpu = strcpu.at(1).toInt() + strcpu.at(2).toInt() + strcpu.at(3).toInt() + strcpu.at(5).toInt();
        float diffCpu = cpu - cpuOld;
        cpuOld = cpu;

        int idle = strcpu.at(4).toInt();
        int diffIdle = idle - idleOld;
        idleOld = idle;

        int progressCpu =  diffCpu/(diffCpu+diffIdle)*128;


        //MEM
        file.setFileName("/proc/meminfo");
        file.open(QIODevice::ReadOnly);
        QStringList memL1 = QString(file.readLine()).split(QRegExp("\\s+"));
        QStringList memL2 = QString(file.readLine()).split(QRegExp("\\s+"));
        file.close();

        int progressMem = (memL1.at(1).toInt()-memL2.at(1).toInt())/memL1.at(1).toFloat()*128;


        g15r_G15FPrint(canvas, (char *) " CPU", 0, 0, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 1);
        g15r_pixelBox(canvas, 28, 7, 28+progressCpu, 12, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
        g15r_pixelBox(canvas, 28+progressCpu, 7, 156, 12, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);

        g15r_G15FPrint(canvas, (char *) " MEM", 0, 0, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 3);
        g15r_pixelBox(canvas, 28, 21, 28+progressMem, 26, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
        g15r_pixelBox(canvas, 28+progressMem, 21, 156, 26, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);
    }

    //CPU
    else if (screen == 1) {
        file.setFileName("/proc/stat");
        file.open(QIODevice::ReadOnly);
        QStringList strcpu = QString(file.readLine()).split(QRegExp("\\s+"));
        file.close();

        int user = strcpu.at(1).toInt();
        int nice = strcpu.at(2).toInt();
        int sys = strcpu.at(3).toInt();
        int idle = strcpu.at(4).toInt();


        float diffUser = user - userOld;
        float diffNice = nice - niceOld;
        float diffSys = sys - sysOld;
        float diffIdle = idle - idleOld;
        float diffTotal = diffUser + diffNice + diffSys + diffIdle;

        userOld = user;
        niceOld = nice;
        sysOld = sys;
        idleOld = idle;


        QString progressUser = QString::number(std::floor(diffUser/diffTotal*10000)/100).append(" %         ");
        QString progressNice = QString::number(std::floor(diffNice/diffTotal*10000)/100).append(" %         ");
        QString progressSys =  QString::number(std::floor(diffSys/diffTotal*10000)/100).append(" %         ");
        QString progressCpu =  QString::number(std::floor((diffUser + diffNice + diffSys)/diffTotal*10000)/100).append(" %         ");



        g15r_G15FPrint(canvas, (char *) "  User :"******"  Nice :", 24, 4, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 1);
        g15r_G15FPrint(canvas, (char *) "System :", 24, 4, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 2);
        g15r_G15FPrint(canvas, (char *) " Total :", 24, 4, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 3);


        g15r_G15FPrint(canvas, (char *) progressUser.toStdString().c_str(), 0, 4, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 0);
        g15r_G15FPrint(canvas, (char *) progressNice.toStdString().c_str(), 0, 4, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 1);
        g15r_G15FPrint(canvas, (char *) progressSys.toStdString().c_str(), 0, 4, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 2);
        g15r_G15FPrint(canvas, (char *) progressCpu.toStdString().c_str(), 0, 4, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 3);

    }

    //MEM
    else if (screen == 2) {
        file.setFileName("/proc/meminfo");
        file.open(QIODevice::ReadOnly);

        float MemTotal = QString(file.readLine()).split(QRegExp("\\s+"))[1].toInt();
        int MemFree = QString(file.readLine()).split(QRegExp("\\s+"))[1].toInt();
        int Buffers = QString(file.readLine()).split(QRegExp("\\s+"))[1].toInt();
        int Cached = QString(file.readLine()).split(QRegExp("\\s+"))[1].toInt();

        file.close();

        int progressTotal = 31 + (MemTotal-MemFree)/MemTotal*125;
        int progressUsr = 31 + (MemTotal-MemFree-Buffers-Cached)/MemTotal*125;
        int progressBuffers = progressUsr + Buffers/MemTotal*125;
        int progressCached = progressBuffers + Cached/MemTotal*125;


        g15r_G15FPrint(canvas, (char *) " TOTAL", 2, 2, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 0);
        g15r_pixelBox(canvas, 31, 2, progressTotal, 6, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
        g15r_pixelBox(canvas, progressTotal, 2, 156, 6, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);

        g15r_G15FPrint(canvas, (char *) " USER", 4, 4, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 1);
        g15r_pixelBox(canvas, 31, 10, progressUsr, 14, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
        g15r_pixelBox(canvas, progressUsr, 10, 156, 14, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);

        g15r_G15FPrint(canvas, (char *) "BUFFERS", 2, 0, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 3);
        g15r_pixelBox(canvas, 31, 18, progressUsr+1, 22, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);
        g15r_pixelBox(canvas, progressUsr+1, 18, progressBuffers, 22, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
        g15r_pixelBox(canvas, progressBuffers, 18, 156, 22, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);

        g15r_G15FPrint(canvas, (char *) "CACHED", 3, 2, 0, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 4);
        g15r_pixelBox(canvas, 31, 26, progressBuffers+1, 30, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);
        g15r_pixelBox(canvas, progressBuffers+1, 26, progressCached, 30, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
        g15r_pixelBox(canvas, progressCached, 26, 156, 30, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);
    }

    
    //NET
    else if (screen == 3) {
        file.setFileName("/proc/net/dev");
        file.open(QIODevice::ReadOnly);
        
        int recvBytes = 0;
        int transBytes = 0;

        file.readLine();
        file.readLine();

        while (file.canReadLine()) {
            QStringList line = QString(file.readLine()).split(QRegExp("\\s+"));

            if (line.at(1) != "lo:") {
                recvBytes += line.at(2).toInt();
                transBytes += line.at(10).toInt();
            }
        }


        file.close();

        float recvVel = (recvBytes-recvBytesOld)*8;
        float transVel = (transBytes-transBytesOld)*8;
        float recvTotal = recvBytes;
        float transTotal = transBytes;

        recvBytesOld = recvBytes;
        transBytesOld = transBytes;


        char recvTotalUnit = 0;
        char transTotalUnit = 0;
        char recvVelUnit = 0;
        char transVelUnit = 0;


        while (recvVel >= 1024) {
            recvVel /= 1024;
            ++recvVelUnit;
        }
        while (transVel >= 1024) {
            transVel /= 1024;
            ++transVelUnit;
        }
        while (recvTotal >= 1024) {
            recvTotal /= 1024;
            ++recvTotalUnit;
        }
        while (transTotal >= 1024) {
            transTotal /= 1024;
            ++transTotalUnit;
        }


        recvVel = std::floor(recvVel*100) / 100;
        transVel = std::floor(transVel*100) / 100;
        recvTotal = std::floor(recvTotal*100) / 100;
        transTotal = std::floor(transTotal*100) / 100;


        QString L11 = QString::number(recvVel);

        if (recvVelUnit == 0) L11.append(" b/s                   ");
        else if (recvVelUnit == 1) L11.append(" Kb/s                   ");
        else if (recvVelUnit == 2) L11.append(" Mb/s                   ");
        else if (recvVelUnit == 3) L11.append(" Gb/s                   ");

        QString L12 = QString::number(transVel);

        if (transVelUnit == 0) L12.append(" b/s    ");
        else if (transVelUnit == 1) L12.append(" Kb/s    ");
        else if (transVelUnit == 2) L12.append(" Mb/s    ");
        else if (transVelUnit == 3) L12.append(" Gb/s    ");



        QString L21 = QString::number(recvTotal);

        if (recvTotalUnit == 0) L21.append(" B                   ");
        else if (recvTotalUnit == 1) L21.append(" KB                   ");
        else if (recvTotalUnit == 2) L21.append(" MB                   ");
        else if (recvTotalUnit == 3) L21.append(" GB                   ");

        QString L22 = QString::number(transTotal);

        if (transTotalUnit == 0) L22.append(" B    ");
        else if (transTotalUnit == 1) L22.append(" KB    ");
        else if (transTotalUnit == 2) L22.append(" MB    ");
        else if (transTotalUnit == 3) L22.append(" GB    ");


        g15r_G15FPrint(canvas, (char *) "     RECEIVE       TRANSMIT", 0, 2, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 0);

        g15r_G15FPrint(canvas, (char *) L11.toStdString().c_str(), 0, 2, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 2);
        g15r_G15FPrint(canvas, (char *) L12.toStdString().c_str(), 0, 2, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 2);

        g15r_G15FPrint(canvas, (char *) L21.toStdString().c_str(), 0, 2, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 3);
        g15r_G15FPrint(canvas, (char *) L22.toStdString().c_str(), 0, 2, 1, G15_JUSTIFY_RIGHT, G15_COLOR_BLACK, 3);



    }

    g15r_G15FPrint(canvas, (char *) "  ALL     CPU      MEM     NET", 0, 0, 1, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 5);
    g15_send(fd, (char *) canvas->buffer, G15_BUFFER_LEN);
}
void amarokApplet::update() {

    QDBusMessage m = QDBusMessage::createMethodCall((QString)"org.mpris.amarok",(QString)"/Player","",(QString)"GetStatus");
    QDBusReply<QRect> result = QDBusConnection::sessionBus().call(m);

    g15r_clearScreen(canvas, 0);

    if (!result.isValid()) {
        g15r_G15FPrint (canvas, (char *) "Amarok", 0, -4, G15_TEXT_HUGE, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 1);
        g15r_G15FPrint (canvas, (char *) "Not Running", 0, 0, G15_TEXT_HUGE, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 2);
    }
    else {

        int status = result.value().left();

        if (status == 2) g15r_G15FPrint (canvas, (char *) "Stopped", 0, 0, G15_TEXT_LARGE, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 2);

        else {

            m = QDBusMessage::createMethodCall((QString)"org.mpris.amarok",(QString)"/Player","",(QString)"GetMetadata");
            QVariantMap map = QDBusReply<QVariantMap>(QDBusConnection::sessionBus().call(m)).value();

            QString title = eliminarAccents(map.find("title").value().toString());
            QString artist = eliminarAccents(map.find("artist").value().toString());
            QString album = eliminarAccents(map.find("album").value().toString());
            QString year = map.find("year").value().toString();
            int length = map.find("mtime").value().toInt()/1000;


            m = QDBusMessage::createMethodCall((QString)"org.mpris.amarok",(QString)"/Player","",(QString)"PositionGet");
            QDBusReply<int> rpos = QDBusConnection::sessionBus().call(m);
            int position = rpos.value()/1000;

            int totm = length / 60;
            int tots = length % 60;
            int posm = position / 60;
            int poss = position % 60;


            int maxlen = std::max(title.length(), std::max(artist.length(), album.length()));
            int text_size = G15_TEXT_SMALL;

            if (maxlen <= 20) text_size = G15_TEXT_LARGE;
            else if (maxlen > 20 && maxlen <= 30) text_size = G15_TEXT_MED;
            else {
                if (title.length() > 40) title = title.right(title.length()-(poss % (title.length()-38)));
                if (artist.length() > 40) artist = artist.right(artist.length()-(poss % (artist.length()-38)));
                if (album.length() > 40) album = album.right(album.length()-(poss % (album.length()-38)));
            }

            QString strtemps;
            if (posm < 10) strtemps.append("0");
            strtemps.append(QString::number(posm));
            strtemps.append(":");
            if (poss < 10) strtemps.append("0");
            strtemps.append(QString::number(poss));

            strtemps.append("/");

            if (totm < 10) strtemps.append("0");
            strtemps.append(QString::number(totm));
            strtemps.append(":");
            if (tots < 10) strtemps.append("0");
            strtemps.append(QString::number(tots));


            int progress = float(position)/float(length)*160;

            g15r_G15FPrint (canvas, qstringToChar(title), 0, 0, text_size, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 0);
            g15r_G15FPrint (canvas, qstringToChar(artist), 0, 0, text_size, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 1);
            g15r_G15FPrint (canvas, qstringToChar(album), 0, 0, text_size, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 2);

            g15r_pixelBox(canvas, 0, 28, progress, 32, G15_COLOR_BLACK, 1, G15_PIXEL_FILL);
            g15r_pixelBox(canvas, progress, 28, 159, 32, G15_COLOR_BLACK, 1, G15_PIXEL_NOFILL);

            g15r_G15FPrint (canvas, qstringToChar(year), 4, 0, G15_TEXT_MED, G15_JUSTIFY_LEFT, G15_COLOR_BLACK, 5);
            g15r_G15FPrint (canvas, qstringToChar(strtemps), 0, 0, G15_TEXT_MED, G15_JUSTIFY_CENTER, G15_COLOR_BLACK, 5);
        }
    }

    g15_send(fd, (char *) canvas->buffer, G15_BUFFER_LEN);
}