// // $Id: mavbiff.c,v 1.4 2001/12/19 12:29:45 mavetju Exp $ // #include #include #include #include #include #include #include #include "mavraise.h" #define STRSIZE 200 struct mailbox { char * label; char * mbox; char * xterm; GtkButton * button; time_t lastchanged; struct mailbox *next; }; struct mailbox *mailboxes=NULL; // // Check if the modified time of the file has changed. // If so, change the button. // gint update(void) { struct stat sb; struct mailbox *mailbox=mailboxes; while (mailbox!=NULL) { if (stat(mailbox->mbox,&sb)==0) { if (mailbox->lastchanged < sb.st_mtime) { mailbox->lastchanged=sb.st_mtime; gtk_button_set_relief(mailbox->button,GTK_RELIEF_NORMAL); gtk_widget_set_state(GTK_WIDGET(mailbox->button),GTK_STATE_ACTIVE); } } mailbox=mailbox->next; } return 1; } // // If a button is clicked, bring the right window to the front. // void on_button_clicked(GtkButton *button,gpointer user_data) { struct mailbox *mailbox; mailbox=mailboxes; while (mailbox->button!=button) mailbox=mailbox->next; mavraise(mailbox->xterm); gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NONE); } void quit(void) { gtk_exit(0); } void readmailbox(FILE *fin,char *mbox,char *label,char *xterm) { char line[STRSIZE]; xterm[0]=0; mbox[0]=0; label[0]=0; if (fgets(label,STRSIZE,fin)==NULL) return; if (fgets(mbox,STRSIZE,fin)==NULL) return; if (fgets(xterm,STRSIZE,fin)==NULL) return; fgets(line,STRSIZE,fin); label[strlen(label)-1]=0; mbox[strlen(mbox)-1]=0; xterm[strlen(xterm)-1]=0; } GtkWidget *init_window(void) { GtkWidget *window; GtkWidget *vbox; GtkWidget *button; FILE *fin; char *filename; struct mailbox *mailbox; char label[STRSIZE]; char mbox[STRSIZE]; char xterm[STRSIZE]; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_object_set_data(GTK_OBJECT(window),"window",window); gtk_window_set_title(GTK_WINDOW(window),"MavBiff"); vbox = gtk_vbox_new(FALSE,0); gtk_widget_ref(vbox); gtk_object_set_data_full(GTK_OBJECT(window),"vbox",vbox, (GtkDestroyNotify)gtk_widget_unref); gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(window),vbox); asprintf(&filename,"%s/.mavbiffrc",getenv("HOME")); if ((fin=fopen(filename,"r"))==NULL) { perror("fopen"); exit(0); } free(filename); while (!feof(fin)) { readmailbox(fin,mbox,label,xterm); if (mbox[0]==0) break; button=gtk_button_new_with_label(label); gtk_widget_ref(button); gtk_object_set_data_full(GTK_OBJECT(window),"button",button, (GtkDestroyNotify)gtk_widget_unref); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,1); gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NORMAL); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(on_button_clicked), NULL); if (mailboxes==NULL) { mailboxes=(struct mailbox *)calloc(1,sizeof(struct mailbox)); mailboxes->next=NULL; mailbox=mailboxes; } else { mailbox=(struct mailbox *)calloc(1,sizeof(struct mailbox)); mailbox->next=mailboxes; mailboxes=mailbox; } mailbox->xterm=strdup(xterm); mailbox->mbox=strdup(mbox); mailbox->label=strdup(label); mailbox->button=(GtkButton *)button; mailbox->xterm=strdup(xterm); mailbox->lastchanged=0l; } gtk_signal_connect(GTK_OBJECT(window),"destroy",GTK_SIGNAL_FUNC(quit),NULL); gtk_widget_show(window); return window; } int main(int argc,char **argv) { init_X(); gtk_init(&argc,&argv); init_window(); gtk_timeout_add(1000,(GtkFunction)update,NULL); gtk_main(); close_X(); return 0; }