wmMatrix.c | 249 ++++++++++++----------------------------------------------- xutils.c | 10 ++- xutils.h | 3 +- 3 files changed, 61 insertions(+), 201 deletions(-) diff --git a/wmMatrix.c b/wmMatrix.c index 10a3efb..bda7c0e 100644 --- a/wmMatrix.c +++ b/wmMatrix.c @@ -1,12 +1,12 @@ /* * * wmMatrix-0.2 (C) 1999 Mike Henderson (mghenderson@lanl.gov) - * + * * - A DockApp version of Jamie Zawinski's xmatrix screensaver hack. - * - * - * - * + * + * + * + * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,11 +39,8 @@ */ - - - -/* - * Includes +/* + * Includes */ #include #include @@ -58,18 +55,13 @@ #include "matrix.h" - -/* - * Delay between refreshes (in microseconds) +/* + * Delay between refreshes (in microseconds) */ -#define DELAY 10000UL +#define DELAY 20000UL /* 0.020000 sec */ #define WMMATRIX_VERSION "0.2" - - - - void ParseCMDLine(int argc, char *argv[]); void ButtonPressEvent(XButtonEvent *); void print_usage(); @@ -77,147 +69,62 @@ m_state *init_matrix( Display *, Window ); void draw_matrix( m_state *, int ); - - int GotFirstClick1, GotDoubleClick1; int GotFirstClick2, GotDoubleClick2; int GotFirstClick3, GotDoubleClick3; int DblClkDelay; -int HasExecute; -char ExecuteCommand[1024]; +/*int HasExecute;*/ +/*char* ExecuteCommand = "xmatrixsmall";*/ char *progname = "wmMatrix"; char *progclass = "WMMatrix"; int PixmapSize; +char *DoubleClickCmd = NULL; +char *RDoubleClickCmd = NULL; +char* TimeColor = "#ffff00"; +char* BackgroundColor = "#181818"; - - - -char TimeColor[30] = "#ffff00"; -char BackgroundColor[30] = "#181818"; - - - - - - -/* - * main +/* + * main */ int main(int argc, char *argv[]) { - - XEvent event; - int n, k, m; - float avg1, user; - /*char Command[512];*/ m_state *state; - FILE *fp; - /* * Parse any command line arguments. */ ParseCMDLine(argc, argv); - - - strcpy(ExecuteCommand, "xmatrixsmall"); - HasExecute = 1; - - - - - + if(DoubleClickCmd==NULL) + DoubleClickCmd=strdup("xscreensaver-demo"); + if(RDoubleClickCmd==NULL) + RDoubleClickCmd=strdup("xscreensaver-command -activate"); initXwindow(argc, argv); openXwindow(argc, argv, wmMatrix_master, wmMatrix_mask_bits, wmMatrix_mask_width, wmMatrix_mask_height); - state = init_matrix( display, iconwin ); - -/* - if (HasExecute){ - sprintf(Command, "%s -window-id 0x%x &", ExecuteCommand, (int)iconwin); - system(Command); - } -*/ - - - - - - /* * Loop until we die */ - n = k = m = 32000; while(1) { - - -#if 0 - if ( n>10 ){ - - n = 0; - if ( (fp = fopen("/proc/loadavg", "r")) != NULL ){ - - fscanf(fp, "%f", &avg1); avg1 *= 10.0; fclose(fp); - m = (int)(40.0 - 1.00*avg1 + 0.5); - if (m < 0) m = 0; - - } else { - - printf("problem opening /proc/loadavg file for read\n"); - exit(-1); - - } - - } else { - - /* - * Update the counter. - */ - ++n; - - } -#endif - -m=0; - - - if (k > m){ - - k = 0; - draw_matrix( state, 40 ); - - } else { - - ++k; - - } - - + draw_matrix( state, 40 ); /* * Double Click Delays * Keep track of click events. If Delay too long, set GotFirstClick's to False. */ - if (DblClkDelay > 150) { - + /* 25 * 0.02 = .5 sec */ + if (DblClkDelay > 25) { DblClkDelay = 0; GotFirstClick1 = 0; GotDoubleClick1 = 0; GotFirstClick2 = 0; GotDoubleClick2 = 0; GotFirstClick3 = 0; GotDoubleClick3 = 0; - } else { - ++DblClkDelay; - } - - - - /* + /* * Process any pending X events. */ while(XPending(display)){ @@ -234,131 +141,81 @@ m=0; } } - - - - - - /* + /* * sleep till next update. I cant seem to get usleep or select to work properly * with args smaller than 10000. A kernel tick problem? If I comment out the next line, * the app screams (chews up cpu too). Or if I use DELAY of 0 it also screams. * But a delay of 1 or higher is slow..... - * + * */ short_uusleep(DELAY); - - } - - - } - - - - - - -/* - * ParseCMDLine() +/* + * ParseCMDLine() */ void ParseCMDLine(int argc, char *argv[]) { - -int i; - + int i; PixmapSize = 2; - for (i = 1; i < argc; i++) { - - if (!strcmp(argv[i], "-display")){ - + if (!strcmp(argv[i], "-display")){ ++i; - - } else if (!strcmp(argv[i], "-tc")){ - - if ((i+1 >= argc)||(argv[i+1][0] == '-')) { - fprintf(stderr, "wmMatrix: No color found\n"); - print_usage(); - exit(-1); - } - strcpy(TimeColor, argv[++i]); - - } else if (!strcmp(argv[i], "-bc")){ - + } else if (!strcmp(argv[i], "-c")){ if ((i+1 >= argc)||(argv[i+1][0] == '-')) { - fprintf(stderr, "wmMatrix: No color found\n"); + fprintf(stderr, "wmMatrix: No command given\n"); print_usage(); exit(-1); } - strcpy(BackgroundColor, argv[++i]); - - } else if (!strcmp(argv[i], "-e")){ - + if(DoubleClickCmd!=NULL) + free(DoubleClickCmd); + DoubleClickCmd=strdup(argv[++i]); + } else if (!strcmp(argv[i], "-cr")){ if ((i+1 >= argc)||(argv[i+1][0] == '-')) { fprintf(stderr, "wmMatrix: No command given\n"); print_usage(); exit(-1); } - strcpy(ExecuteCommand, argv[++i]); - HasExecute = 1; - + if(RDoubleClickCmd!=NULL) + free(RDoubleClickCmd); + RDoubleClickCmd=strdup(argv[++i]); } else if (!strcmp(argv[i], "-sml")){ - PixmapSize = 1; - } else if (!strcmp(argv[i], "-med")){ - PixmapSize = 2; - } else if (!strcmp(argv[i], "-lrg")){ - PixmapSize = 3; - } else { - print_usage(); exit(1); } - } - - } -void print_usage(){ - +void print_usage() { printf("\nwmMatrix version: %s\n", WMMATRIX_VERSION); printf("\t-h\t\tDisplay help screen.\n"); + printf("\t-c cmd\t\tCommand executed on doubleclick.\n"); + printf("\t-cr cmd\t\tCommand executed on right doubleclick\n"); printf("\t-sml\t\tUse small size pixmap.\n"); printf("\t-med\t\tUse medium size pixmap.\n"); printf("\t-lrg\t\tUse large size pixmap.\n"); - } - - - - - /* * This routine handles button presses. * * Double click on - * Mouse Button 1: Execute the command defined in the -e command-line option. + * Mouse Button 1: Execute the command defined in the -c command-line option. * Mouse Button 2: No action assigned. - * Mouse Button 3: No action assigned. + * Mouse Button 3: Execute the command defined in the -cr command-line option. * * */ void ButtonPressEvent(XButtonEvent *xev){ - - - DblClkDelay = 0; if ((xev->button == Button1) && (xev->type == ButtonPress)){ if (GotFirstClick1) GotDoubleClick1 = 1; @@ -378,12 +235,12 @@ void ButtonPressEvent(XButtonEvent *xev){ if (GotDoubleClick1) { GotFirstClick1 = 0; GotDoubleClick1 = 0; - system("xscreensaver-demo"); + system(DoubleClickCmd); } /* - * We got a double click on Mouse Button2 (i.e. the left one) + * We got a double click on Mouse Button2 (i.e. the middle one) */ if (GotDoubleClick2) { GotFirstClick2 = 0; @@ -392,16 +249,12 @@ void ButtonPressEvent(XButtonEvent *xev){ /* - * We got a double click on Mouse Button3 (i.e. the left one) + * We got a double click on Mouse Button3 (i.e. the right one) */ if (GotDoubleClick3) { GotFirstClick3 = 0; - GotDoubleClick3 = 0; + GotDoubleClick3 = 0; + system(RDoubleClickCmd); } - - - return; - } - diff --git a/xutils.c b/xutils.c index a3da40f..8ac287f 100644 --- a/xutils.c +++ b/xutils.c @@ -371,9 +371,12 @@ unsigned long getBlendedColor(char *ColorName, float fac, int red, int grn, int void uusleep(unsigned long usecs) { struct timeval tv; + fd_set fds; tv.tv_sec = usecs / 1000000UL; tv.tv_usec = usecs % 1000000UL; - select(1, NULL, NULL, NULL, &tv); + FD_ZERO(&fds); + FD_SET(x_fd, &fds); + select(x_fd + 1, &fds, NULL, NULL, &tv); } @@ -385,9 +388,12 @@ void uusleep(unsigned long usecs) { void short_uusleep(unsigned long usecs) { struct timeval tv; + fd_set fds; tv.tv_sec = 0; tv.tv_usec = usecs; - select(1, NULL, NULL, NULL, &tv); + FD_ZERO(&fds); + FD_SET(x_fd, &fds); + select(x_fd + 1, &fds, NULL, NULL, &tv); } diff --git a/xutils.h b/xutils.h index 1e03a08..9c062b9 100644 --- a/xutils.h +++ b/xutils.h @@ -43,7 +43,8 @@ void setMaskXY(int, int); unsigned long getColor(char *, float, int *, int *, int *); unsigned long getBlendedColor(char *, float, int, int, int); void RedrawWindow(void); -void wusleep( unsigned int ); +void uusleep( unsigned long ); +void short_uusleep( unsigned long );