/* YAWMPPP - PPP dock app/helper for WindowMaker Copyright (C) 2000: Author: Felipe Bergo (bergo@seul.org) based on the wmppp application by Martijn Pieterse (pieterse@xs4all.nl) Antoine Nulle (warp@xs4all.nl) 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 the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "thinppp.h" #include "ycommon.h" #include "misc.h" #include "isprc.h" #include "dataxpm.xpm" #include "backxpm.xpm" GdkPixmap *origback, *myback ,*datasrc; GtkWidget *mainw,*mda; /* ppp related globals */ /* global variables */ long starttime; char *ProgName; char *active_interface = "ppp0"; int TimerDivisor = 60; int updaterate = 5; int current_isp = 0; int num_isps = 0; int got_sched=0; int caution=1; struct YAWMPPP_ISP_INFO IspData[MAX_ISPS]; /* log data */ struct LogStruct logconn; /* PPP variables */ #define PPP_UNIT 0 int ppp_h = -1; int ppp_open = 0; #define PPP_STATS_HIS 23 int pixels_per_byte; int ppp_history[PPP_STATS_HIS + 1][2]; int pressed_button=-1; int myaction=-1; pid_t stop_child = 0; pid_t start_child = 0; int status; int wx,wy,dragx,dragy,xlimit,ylimit,ipx,ipy; int main(int argc,char **argv) { int i; /* Parse Command Line */ ProgName = argv[0]; if (strlen (ProgName) >= 5) ProgName += (strlen (ProgName) - 5); for (i = 1; i < argc; i++) { char *arg = argv[i]; if (*arg == '-') { switch (arg[1]) { case 'c': caution=1; break; case 'd': if (strcmp (arg + 1, "display")) { usage (); exit (1); } break; case 'g': if (strcmp (arg + 1, "geometry")) { usage (); exit (1); } break; case 'i': if (!argv[i + 1]) { usage (); exit (1); } if (strncmp (argv[i + 1], "ppp", 3)) { usage (); exit (1); } active_interface = argv[i + 1]; i++; break; case 'p': caution=2; break; case 't': TimerDivisor = 1; break; case 'u': i++; if (!argv[i]) { usage (); exit (1); } updaterate = atoi (argv[i]); if (updaterate < 1 || updaterate > 10) { usage (); exit (1); } break; case 'v': printversion (); exit (0); break; case 'z': printf("Caution level: %d\n",caution); break; default: usage (); exit (0); break; } } } gtk_init(&argc,&argv); gdk_rgb_init(); create_thinppp(); init_ppp(); gtk_idle_add(thinppp,NULL); gtk_main(); save_initial_position(); gdk_pixmap_unref(origback); gdk_pixmap_unref(datasrc); gdk_pixmap_unref(myback); return 0; } void create_thinppp(void) { GtkStyle *sty; GdkBitmap *mask; ipx=((gdk_screen_width()-320)/2); ipy=0; read_initial_position(); wx=ipx; wy=ipy; mainw=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize(mainw,320,20); gtk_widget_set_uposition(mainw,wx,wy); gtk_widget_realize(mainw); gdk_window_set_decorations(mainw->window,0); xlimit=gdk_screen_width()-320; ylimit=gdk_screen_height()-20; mda=gtk_drawing_area_new(); gtk_widget_set_events(mda,GDK_EXPOSURE_MASK|GDK_BUTTON_PRESS_MASK| GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_MOTION_MASK); gtk_drawing_area_size(GTK_DRAWING_AREA(mda),320,20); gtk_container_add(GTK_CONTAINER(mainw),mda); sty=gtk_widget_get_style(mainw); origback=gdk_pixmap_create_from_xpm_d(mainw->window, &mask, NULL, backxpm_xpm); datasrc=gdk_pixmap_create_from_xpm_d(mainw->window, &mask, NULL, dataxpm_xpm); myback=gdk_pixmap_new(mainw->window,320,20,-1); gdk_draw_pixmap(myback, mainw->style->fg_gc[GTK_WIDGET_STATE (mainw)], origback, 0, 0, 0, 0, 320, 20); gtk_signal_connect(GTK_OBJECT(mda),"expose_event", GTK_SIGNAL_FUNC(exposed),NULL); gtk_signal_connect(GTK_OBJECT(mda),"button_press_event", GTK_SIGNAL_FUNC(bpress),NULL); gtk_signal_connect(GTK_OBJECT(mda),"button_release_event", GTK_SIGNAL_FUNC(brelease),NULL); gtk_signal_connect(GTK_OBJECT(mda),"motion_notify_event", GTK_SIGNAL_FUNC(bmotion),NULL); gtk_signal_connect(GTK_OBJECT(mainw),"destroy", GTK_SIGNAL_FUNC(wdestroy),NULL); gtk_widget_show(mda); gtk_widget_show(mainw); } gboolean exposed(GtkWidget *w,GdkEventExpose *gee,gpointer data) { gdk_draw_pixmap(w->window, w->style->fg_gc[GTK_WIDGET_STATE (w)], myback, gee->area.x, gee->area.y, gee->area.x, gee->area.y, gee->area.width, gee->area.height); return FALSE; } void refresh(void) { gdk_draw_pixmap(mainw->window, mainw->style->fg_gc[GTK_WIDGET_STATE (mainw)], myback, 0, 0, 0, 0, 320, 20); gdk_flush(); gtk_widget_queue_resize(mda); } void setled(int index,int type) { int sx,sy,dx,dy,w,h; w=LED_SZE_X; h=LED_SZE_Y; switch(index) { case LED_PPP_POWER: dx=LED_PWR_X; dy=LED_PWR_Y; break; case LED_PPP_TX: dx=LED_SND_X; dy=LED_SND_Y; break; case LED_PPP_RX: dx=LED_RCV_X; dy=LED_RCV_Y; break; default: return; } switch(type) { case LED_GREEN: sx=LED_ON_X; sy=LED_ON_Y; break; case LED_YELLOW: sx=LED_WTE_X; sy=LED_WTE_Y; break; case LED_RED: sx=LED_ERR_X; sy=LED_ERR_Y; break; case LED_DARK: sx=LED_OFF_X; sy=LED_OFF_Y; break; default: return; } paste_xpm(dx,dy,sx,sy,w,h); refresh(); } void paste_xpm(int dx,int dy,int sx,int sy,int w,int h) { gdk_draw_pixmap(myback, mainw->style->fg_gc[GTK_WIDGET_STATE (mainw)], datasrc, sx, sy, dx, dy, w, h); } void init_ppp(void) { int i; for (i = 0; i < MAX_ISPS; i++) memset(&IspData[i],0,sizeof(struct YAWMPPP_ISP_INFO)); make_config_dir(); signal(SIGUSR1,sigusr_handler); signal(SIGHUP,sigusr_handler); signal(SIGINT,sigusr_handler); signal(SIGTERM,sigusr_handler); write_pid_file(); clean_guards(); grab_isp_info(1); } gint thinppp(gpointer data) { static int like_a_virgin=1; static int but_stat; static long currenttime; static long lasttime; static long waittime; static long ppptime; static int hour, minute; static long timetolog; static long ppp_send, ppp_sl = -1; static long ppp_recv, ppp_rl = -1; static long ppp_sbytes, ppp_rbytes; static long ppp_osbytes, ppp_orbytes; static struct stat st; static int isonline = 0; static int speed_ind = 10; int i,j; if (like_a_virgin) { get_statistics (active_interface, &ppp_rl, &ppp_sl, &ppp_orbytes, &ppp_osbytes); starttime = 0; currenttime = time (0); ppptime = 0; but_stat = -1; waittime = 0; timetolog=0; /* 888k8 on bottom */ paste_xpm(ERR_DEST_X,ERR_DEST_Y,ERR_SRC_X+28,ERR_SRC_Y+9,25,8); DrawISPName (); refresh(); like_a_virgin=0; } lasttime = currenttime; currenttime = time (0); /* Check if any child has left the playground */ i = waitpid (0, &status, WNOHANG); if (i == stop_child && stop_child != 0) { starttime = 0; setled(LED_PPP_POWER,LED_DARK); setled(LED_PPP_RX,LED_DARK); setled(LED_PPP_TX,LED_DARK); /* 888k8 on bottom */ paste_xpm(ERR_DEST_X,ERR_DEST_Y,ERR_SRC_X+28,ERR_SRC_Y+9,25,8); refresh(); stop_child = 0; } if (i == start_child && start_child != 0) { if (WIFEXITED (status)) { if (WEXITSTATUS (status) == 10) { starttime = 0; /* 88k8 on bottom */ paste_xpm(ERR_DEST_X,ERR_DEST_Y,ERR_SRC_X+28,ERR_SRC_Y+9,25,8); setled(LED_PPP_POWER,LED_DARK); DrawTime (0, 1); refresh(); } start_child = 0; } } /* On-line detectie! 1x per second */ if (currenttime != lasttime) { i = 0; if (stillonline (active_interface)) { i = 1; if (!starttime) { starttime = currenttime; if (stat (STAMP_FILE, &st) == 0) starttime = st.st_mtime; setled(LED_PPP_POWER,LED_GREEN); waittime = 0; /* 88k8 on bottom */ paste_xpm(ERR_DEST_X,ERR_DEST_Y,ERR_SRC_X+28,ERR_SRC_Y+9,25,8); if (IspData[current_isp].SpeedAction) DrawSpeedInd (IspData[current_isp].SpeedAction); speed_ind = currenttime + 10; refresh(); } } if (!i && starttime) { starttime = 0; setled(LED_PPP_POWER,LED_RED); logconn.status=1; /* Error */ paste_xpm(ERR_DEST_X,ERR_DEST_Y,ERR_SRC_X,ERR_SRC_Y+9,25,8); if (IspData[current_isp].IfDownAction) execCommand (IspData[current_isp].IfDownAction); refresh(); } } if (waittime && waittime <= currenttime) { setled(LED_PPP_POWER,LED_RED); refresh(); waittime = 0; } if ((starttime)&&(!isonline)) { isonline=1; logconn.start=time(NULL); logconn.status=0; strcpy(logconn.longname,IspData[current_isp].LongName); strcpy(logconn.shortname,IspData[current_isp].ShortName); strcpy(logconn.user,IspData[current_isp].User); strcpy(logconn.phone,IspData[current_isp].Phone); if (!strlen(logconn.shortname)) strcpy(logconn.shortname,"empty"); if (!strlen(logconn.longname)) strcpy(logconn.longname,"empty"); if (!strlen(logconn.user)) strcpy(logconn.user,"empty"); if (!strlen(logconn.phone)) strcpy(logconn.phone,"empty"); make_guards(); } if ((!starttime)&&(isonline)) { isonline=0; logconn.end=time(NULL); write_log(); if (got_sched) make_delayed_update(); if (caution>0) close_ppp(); } /* If we are on-line. Print the time we are */ if (starttime) { i = currenttime - starttime; i /= TimerDivisor; if (TimerDivisor == 1) if (i > 59 * 60 + 59) i /= 60; minute = i % 60; hour = (i / 60) % 100; i = hour * 100 + minute; DrawTime (i, currenttime % 2); /* We are online, so we can check for send/recv packets */ get_statistics (active_interface, &ppp_recv, &ppp_send, &ppp_rbytes, &ppp_sbytes); if (caution>1) close_ppp(); if (ppp_send != ppp_sl) setled(LED_PPP_TX,LED_GREEN); else setled(LED_PPP_TX,LED_DARK); if (ppp_recv != ppp_rl) setled(LED_PPP_RX,LED_GREEN); else setled(LED_PPP_RX,LED_DARK); ppp_sl = ppp_send; ppp_rl = ppp_recv; /* Every five seconds we check to load on the line */ if (currenttime - timetolog >= 0) { timetolog=currenttime + 60; make_guards(); } if ((currenttime - ppptime >= 0) || (ppptime == 0)) { ppptime = currenttime + updaterate; ppp_history[PPP_STATS_HIS][0] = ppp_rbytes - ppp_orbytes; ppp_history[PPP_STATS_HIS][1] = ppp_sbytes - ppp_osbytes; ppp_orbytes = ppp_rbytes; ppp_osbytes = ppp_sbytes; DrawStats (23, 9, 170, 13); for (j = 1; j < 24; j++) { ppp_history[j - 1][0] = ppp_history[j][0]; ppp_history[j - 1][1] = ppp_history[j][1]; } if (currenttime > speed_ind) { DrawLoadInd ((ppp_history[23][0] + ppp_history[23][1]) / updaterate); } } refresh(); } switch (myaction) { case BUT_V: if (!starttime) { /* 888k8 */ paste_xpm(ERR_DEST_X,ERR_DEST_Y,ERR_SRC_X+28,ERR_SRC_Y+9,25,8); DrawTime (0, 1); start_child = execCommand (IspData[current_isp].StartAction); setled(LED_PPP_POWER,LED_YELLOW); waittime = ORANGE_LED_TIMEOUT + currenttime; refresh(); } break; case BUT_X: if (stop_child == 0) stop_child = execCommand (IspData[current_isp].StopAction); break; case BUT_REW: if (!starttime) { current_isp--; if (current_isp < 0) current_isp = num_isps - 1; if (current_isp < 0) current_isp=0; DrawISPName (); refresh(); } break; case BUT_FF: if (!starttime) { current_isp++; if (current_isp == num_isps) current_isp = 0; DrawISPName (); refresh(); } break; case BUT_CONF: run_pref_app(); break; case BUT_LOG: run_log_app(); break; case BUT_KILL: if (!starttime) gtk_widget_destroy(mainw); break; } myaction=-1; usleep (50000L); return TRUE; } gboolean wdestroy(GtkWidget *w,GdkEvent *ev,gpointer data) { int i; while (start_child | stop_child) { i = waitpid (0, &status, WNOHANG); if (i == stop_child) stop_child = 0; if (i == start_child) start_child = 0; usleep (50000l); } gtk_main_quit(); return FALSE; } gboolean bpress(GtkWidget *w,GdkEventButton *geb,gpointer data) { int x,y; if (geb==NULL) return FALSE; x=(int)geb->x; y=(int)geb->y; dragx=(int)geb->x_root; dragy=(int)geb->y_root; pressed_button=-1; if (x<50) { pressed_button=BUT_DRAG; grab_me(); } if (inbox(x,y,BUT_V_X,BUT_V_Y,12,11)) { pressed_button=BUT_V; paste_xpm(BUT_V_X,BUT_V_Y,BUT_V_SRC_X,BUT_V_SRC_Y,12,11); refresh(); grab_me(); return FALSE; } if (inbox(x,y,BUT_X_X,BUT_X_Y,12,11)) { pressed_button=BUT_X; paste_xpm(BUT_X_X,BUT_X_Y,BUT_X_SRC_X,BUT_X_SRC_Y,12,11); refresh(); grab_me(); return FALSE; } if (inbox(x,y,BUT_R_X,BUT_R_Y,12,11)) { pressed_button=BUT_REW; paste_xpm(BUT_R_X,BUT_R_Y,BUT_R_SRC_X,BUT_R_SRC_Y,12,11); refresh(); grab_me(); return FALSE; } if (inbox(x,y,BUT_F_X,BUT_F_Y,12,11)) { pressed_button=BUT_FF; paste_xpm(BUT_F_X,BUT_F_Y,BUT_F_SRC_X,BUT_F_SRC_Y,12,11); refresh(); grab_me(); return FALSE; } if (inbox(x,y,BUT_C_X,BUT_C_Y,12,11)) { pressed_button=BUT_CONF; paste_xpm(BUT_C_X,BUT_C_Y,BUT_C_SRC_X,BUT_C_SRC_Y,12,11); refresh(); grab_me(); return FALSE; } if (inbox(x,y,BUT_L_X,BUT_L_Y,12,11)) { pressed_button=BUT_LOG; paste_xpm(BUT_L_X,BUT_L_Y,BUT_L_SRC_X,BUT_L_SRC_Y,12,11); refresh(); grab_me(); return FALSE; } if (inbox(x,y,BUT_K_X,BUT_K_Y,17,18)) { pressed_button=BUT_KILL; paste_xpm(BUT_K_X,BUT_K_Y,BUT_K_SRC_X,BUT_K_SRC_Y,17,18); refresh(); grab_me(); return FALSE; } return FALSE; } gboolean brelease(GtkWidget *w,GdkEventButton *geb,gpointer data) { int x,y,c; if (geb==NULL) return FALSE; if (pressed_button<0) return FALSE; x=(int)geb->x; y=(int)geb->y; c=-1; if (inbox(x,y,BUT_V_X,BUT_V_Y,12,11)) c=BUT_V; if (inbox(x,y,BUT_X_X,BUT_X_Y,12,11)) c=BUT_X; if (inbox(x,y,BUT_R_X,BUT_R_Y,12,11)) c=BUT_REW; if (inbox(x,y,BUT_F_X,BUT_F_Y,12,11)) c=BUT_FF; if (inbox(x,y,BUT_C_X,BUT_C_Y,12,11)) c=BUT_CONF; if (inbox(x,y,BUT_L_X,BUT_L_Y,12,11)) c=BUT_LOG; if (inbox(x,y,BUT_K_X,BUT_K_Y,17,18)) c=BUT_KILL; ungrab_me(); if (c!=pressed_button) { pressed_button=-1; paste_xpm(BUT_V_X,BUT_V_Y,BUT_V_SRC_X+24,BUT_V_SRC_Y,12,11); paste_xpm(BUT_X_X,BUT_X_Y,BUT_X_SRC_X+24,BUT_X_SRC_Y,12,11); paste_xpm(BUT_R_X,BUT_R_Y,BUT_R_SRC_X+24,BUT_R_SRC_Y,12,11); paste_xpm(BUT_F_X,BUT_F_Y,BUT_F_SRC_X+24,BUT_F_SRC_Y,12,11); paste_xpm(BUT_C_X,BUT_C_Y,BUT_C_SRC_X+24,BUT_C_SRC_Y,12,11); paste_xpm(BUT_L_X,BUT_L_Y,BUT_L_SRC_X+24,BUT_L_SRC_Y,12,11); paste_xpm(BUT_K_X,BUT_K_Y,BUT_K_SRC_X+17,BUT_K_SRC_Y,17,18); refresh(); return FALSE; } myaction=pressed_button; paste_xpm(BUT_V_X,BUT_V_Y,BUT_V_SRC_X+24,BUT_V_SRC_Y,12,11); paste_xpm(BUT_X_X,BUT_X_Y,BUT_X_SRC_X+24,BUT_X_SRC_Y,12,11); paste_xpm(BUT_R_X,BUT_R_Y,BUT_R_SRC_X+24,BUT_R_SRC_Y,12,11); paste_xpm(BUT_F_X,BUT_F_Y,BUT_F_SRC_X+24,BUT_F_SRC_Y,12,11); paste_xpm(BUT_C_X,BUT_C_Y,BUT_C_SRC_X+24,BUT_C_SRC_Y,12,11); paste_xpm(BUT_L_X,BUT_L_Y,BUT_L_SRC_X+24,BUT_L_SRC_Y,12,11); paste_xpm(BUT_K_X,BUT_K_Y,BUT_K_SRC_X+17,BUT_K_SRC_Y,17,18); refresh(); pressed_button=-1; return FALSE; } gboolean bmotion(GtkWidget *w,GdkEventMotion *geb,gpointer data) { if (pressed_button!=BUT_DRAG) return TRUE; if (geb==NULL) return TRUE; wx=wx+((int)geb->x_root-dragx); wy=wy+((int)geb->y_root-dragy); if (wx<0) wx=0; if (wx>xlimit) wx=xlimit; if (wy<0) wy=0; if (wy>ylimit) wy=ylimit; dragx=(int)geb->x_root; dragy=(int)geb->y_root; gdk_window_move(mainw->window,wx,wy); gdk_flush(); return FALSE; } void grab_me(void) { gdk_pointer_grab(mda->window,FALSE, GDK_BUTTON_RELEASE_MASK, NULL, NULL, time(NULL)); } void ungrab_me(void) { gdk_pointer_ungrab(time(NULL)); } gboolean inbox(int x,int y,int bx,int by,int bw,int bh) { if ((x>=bx)&&(y>=by)&&(x<=(bx+bw))&&(y<=(by+bh))) return TRUE; else return FALSE; } void sigusr_handler(int signum) { save_initial_position(); if (signum==SIGUSR1) { if (!starttime) { grab_isp_info(0); if (current_isp>=num_isps) current_isp=0; DrawISPName(); refresh(); } else { got_sched=1; warn_pref(); } } else { remove_pid_file(); exit(0); } } /* lower level drawing */ void DrawISPName (void) { int i, s; s = strlen (IspData[current_isp].ShortName); for (i = 0; i < 5; i++) { if (s >= (i + 1)) draw_isp_char (i, IspData[current_isp].ShortName[i]); else draw_isp_char (i, ' '); } } void draw_isp_char (int pos, char letter) { int sx = 0, sy = 0, ac = 0; if ((!ac) && (letter >= 'A') && (letter <= 'Z')) { sx = UPPER_ABC_BASE_X; sy = UPPER_ABC_BASE_Y; sy += 8 * ((letter - 'A') / 12); sx += 5 * ((letter - 'A') % 12); ac = 1; } if ((!ac) && (letter >= 'a') && (letter <= 'z')) { sx = LOWER_ABC_BASE_X; sy = LOWER_ABC_BASE_Y; sy += 8 * ((letter - 'a') / 12); sx += 5 * ((letter - 'a') % 12); ac = 1; } if ((!ac) && (letter >= '0') && (letter <= '9')) { sx = DIGIT_BASE_X; sy = DIGIT_BASE_Y; sx += 5 * (letter - '0'); ac = 1; } if (!ac) { sx = SPACE_BASE_X; sy = SPACE_BASE_Y; } paste_xpm(ISP_BASE_X + 5 * pos, ISP_BASE_Y, sx, sy, 4, 7); } void DrawTime (int i, int j) { int k = 1000; paste_xpm(TIMER_DES_X + 6 * 0, TIMER_DES_Y, TIMER_SZE_X * ((i/k)%10)+1, TIMER_SRC_Y,5,7); k=k/10; paste_xpm(TIMER_DES_X + 6 * 1, TIMER_DES_Y, TIMER_SZE_X * ((i/k)%10)+1, TIMER_SRC_Y,5,7); k=k/10; /* colon */ if (j) paste_xpm(TIMER_DES_X + 6 * 2 + 1, TIMER_DES_Y, 62, TIMER_SRC_Y,1,7); else paste_xpm(TIMER_DES_X + 6 * 2 + 1, TIMER_DES_Y, 63, TIMER_SRC_Y,1,7); paste_xpm(TIMER_DES_X + 6 * 2 + 4, TIMER_DES_Y, TIMER_SZE_X * ((i/k)%10)+1, TIMER_SRC_Y,5,7); k=k/10; paste_xpm(TIMER_DES_X + 6 * 3 + 4, TIMER_DES_Y, TIMER_SZE_X * ((i/k)%10)+1, TIMER_SRC_Y,5,7); } void DrawStats (int num, int size, int x_left, int y_bottom) { int pixels_per_byte; int j, k; pixels_per_byte = size; for (j = 0; j < num; j++) if ((ppp_history[j][0]+ppp_history[j][1]) > pixels_per_byte) pixels_per_byte = ppp_history[j][0] + ppp_history[j][1]; pixels_per_byte /= size; for (k = 0; k < num; k++) for (j = 0; j < size; j++) { if (j < (ppp_history[k][0] / pixels_per_byte)) paste_xpm(k+x_left, y_bottom-j,HIST_SRC_X+2,HIST_SRC_Y,1,1); else if (j < (ppp_history[k][0] + ppp_history[k][1]) / pixels_per_byte) paste_xpm(k+x_left,y_bottom-j,HIST_SRC_X+1,HIST_SRC_Y,1,1); else paste_xpm(k+x_left,y_bottom-j,HIST_SRC_X,HIST_SRC_Y,1,1); } } void PrintLittle (int i, int *k) { switch (i) { case -1: *k -= 5; paste_xpm(*k,ERR_DEST_Y,12*5,ERR_SRC_Y,4,8); break; case 0: *k -= 5; paste_xpm(*k,ERR_DEST_Y,45,ERR_SRC_Y,5,8); break; default: *k -= 5; paste_xpm(*k,ERR_DEST_Y,i*5 - 5,ERR_SRC_Y,5,8); break; } } void DrawSpeedInd (char *speed_action) { int linespeed, i, k; FILE *fp; char *p; char temp[128]; fp = popen (speed_action, "r"); if (fp) { linespeed = 0; while (fgets (temp, 128, fp)) ; pclose (fp); if ((p = strstr (temp, "CONNECT"))) linespeed = atoi (p + 8); k = ERR_DEST_X+25; i = (linespeed % 1000) / 100; linespeed /= 1000; PrintLittle (i, &k); k -= 5; paste_xpm(k,ERR_DEST_Y,ERR_SRC_X+50,ERR_SRC_Y,5,8); do { PrintLittle (linespeed % 10, &k); linespeed /= 10; } while (linespeed); } } void DrawLoadInd (int speed) { int i, k; k = ERR_DEST_X+25; for (i = 0; i < 5; i++) PrintLittle (-1, &k); k = ERR_DEST_X+25; do { PrintLittle (speed % 10, &k); speed /= 10; } while (speed); } void make_delayed_update(void) { grab_isp_info(0); if (current_isp>=num_isps) current_isp=0; DrawISPName(); refresh(); got_sched=0; } void usage (void) { fprintf (stderr, "\nyawmppp.thin\nYet Another Window Maker PPP dock applet,\nfor non-Window Maker window managers\n\n"); fprintf (stderr, "version %s\n\n",VERSION); fprintf (stderr, "usage:\n"); fprintf (stderr, "-h this help screen\n"); fprintf (stderr, "-i (ppp0, ppp1, etc)\n"); fprintf (stderr, "-t set the on-line timer to MM:SS instead of HH:MM\n"); fprintf (stderr, "-u (1..10), default 5 seconds\n"); fprintf (stderr, "-v print the version number\n"); fprintf (stderr, "-paranoid be paranoid about open sockets\n"); fprintf (stderr, "\n"); } void printversion (void) { fprintf (stderr, "%s\n", VERSION); } void read_initial_position(void) { FILE *f; char *p,z[256]; p=getenv("HOME"); sprintf(z,"%s/.yawmppp/thin.position",p); f=fopen(z,"r"); if (!f) return; fgets(z,255,f); ipx=atoi(strtok(z," \t\n")); ipy=atoi(strtok(NULL," \t\n")); fclose(f); } void save_initial_position(void) { FILE *f; char *p,z[256]; p=getenv("HOME"); sprintf(z,"%s/.yawmppp/thin.position",p); f=fopen(z,"w"); if (!f) return; ipx=wx; ipy=wy; fprintf(f,"%d %d\n",ipx,ipy); fclose(f); }