1086 lines
22 KiB
C
1086 lines
22 KiB
C
/*
|
|
|
|
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 <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <ctype.h>
|
|
#include <signal.h>
|
|
|
|
#include <sys/wait.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/param.h>
|
|
#include <sys/types.h>
|
|
|
|
#include <gtk/gtk.h>
|
|
#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 <device> (ppp0, ppp1, etc)\n");
|
|
fprintf (stderr, "-t set the on-line timer to MM:SS instead of HH:MM\n");
|
|
fprintf (stderr, "-u <update rate> (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);
|
|
}
|