411 lines
13 KiB
C
411 lines
13 KiB
C
#include "settings.h"
|
|
void set_lang(int language){lang = language;}
|
|
void setAppicon(int app){appicon = app;}
|
|
void enter_callback( GtkWidget *widget, GtkWidget *entry ){
|
|
strcpy(application, gtk_entry_get_text(GTK_ENTRY(entry)));}
|
|
int getAppicon(){return appicon;}
|
|
int get_start_of_week(){return start_of_week;}
|
|
int get_lang(){return lang;}
|
|
int get_debug(){return debug;}
|
|
void set_debug(int deb){debug = deb;}
|
|
char* getVersion(){return WMCALENDAR_VERSION;}
|
|
const char* get_application(){return application;}
|
|
const char* get_icsfile(){return icsfile;}
|
|
|
|
/*------------------------------------------------------
|
|
* destroy
|
|
-----------------------------------------------------*/
|
|
void destroy (GtkWidget * widget, gpointer data){
|
|
gtk_main_quit ();
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* getSettings
|
|
-----------------------------------------------------*/
|
|
void getSettings(){
|
|
char buf[15];
|
|
struct tm *timptr = malloc(sizeof(struct tm));
|
|
FILE *stream;
|
|
int lSize;
|
|
char *set = malloc(4096);
|
|
char *pch;
|
|
int i;
|
|
int next = 0;
|
|
int version = 0;
|
|
strcpy (rcfile, (char *) getenv ("HOME"));
|
|
strcat(rcfile, "/.wmcalendarrc");
|
|
stream = fopen(rcfile,"r");
|
|
|
|
for(i = 1; i < 8; i++){
|
|
timptr->tm_wday = (8-i)%7;
|
|
strftime(buf, 15, "%A", timptr);
|
|
daystr[i]=malloc(15);
|
|
strcpy(daystr[i], buf);
|
|
}
|
|
free(timptr);
|
|
if(stream == 0){ /* no rcfile */
|
|
writeSettings();
|
|
printf("created %s with default settings:\nICON:evolution\nLANG:default\nAPP:%s\nICS:%s\n\n",
|
|
rcfile, application, icsfile );
|
|
return;
|
|
}
|
|
else{
|
|
fseek (stream , 0 , SEEK_END);
|
|
lSize = ftell (stream);
|
|
rewind (stream);
|
|
fread (set,1,lSize,stream);
|
|
|
|
pch = strtok (set,"\n=");
|
|
while (pch != NULL)
|
|
{
|
|
switch(next){
|
|
case 1:
|
|
strcpy(icsfile, pch);
|
|
next = 0;
|
|
break;
|
|
|
|
case 2:
|
|
strcpy(application, pch);
|
|
next = 0;
|
|
break;
|
|
|
|
case 3:
|
|
if(!strcmp(pch, "farsi"))
|
|
lang = 1;
|
|
next = 0;
|
|
break;
|
|
|
|
case 4:
|
|
if(!strcmp(pch, "mozilla"))
|
|
appicon = 1;
|
|
else if(!strcmp(pch, "evolution"))
|
|
appicon = 0;
|
|
else
|
|
appicon = 2;
|
|
next = 0;
|
|
break;
|
|
|
|
case 5:
|
|
if(!strcmp(pch,WMCALENDAR_VERSION))
|
|
version = 1;
|
|
next = 0;
|
|
break;
|
|
|
|
case 6:
|
|
start_of_week = atoi(pch);
|
|
next = 0;
|
|
break;
|
|
|
|
default:
|
|
if(!strcmp(pch, "ICS"))
|
|
next = 1;
|
|
else if(!strcmp(pch, "APP"))
|
|
next = 2;
|
|
else if(!strcmp(pch, "LANG"))
|
|
next = 3;
|
|
else if(!strcmp(pch, "ICON"))
|
|
next = 4;
|
|
else if(!strcmp(pch, "VERSION"))
|
|
next = 5;
|
|
else if(!strcmp(pch, "STARTOFWEEK"))
|
|
next = 6;
|
|
else
|
|
next = 0;
|
|
}
|
|
pch = strtok (NULL, "=\n");
|
|
}
|
|
}
|
|
fclose(stream);
|
|
free(set);
|
|
if(!version){
|
|
writeSettings();
|
|
printf("Old rcfile detected!\nCreated new %s with default settings:", rcfile);
|
|
printf("\nICON:evolution\nLANG:default\nAPP:%s\nICS:%s\n\n", application, icsfile );
|
|
}
|
|
if(get_debug())printf("settings:\nICON:%d\nLANG:%d\nAPP:%s\nRC:%s\nICS:%s\n\n",
|
|
getAppicon(), lang, application, rcfile, icsfile );
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* writeSettings
|
|
-----------------------------------------------------*/
|
|
void writeSettings(){
|
|
char *set = malloc(1024);
|
|
char *bufint = malloc(5);
|
|
FILE *stream;
|
|
if(debug)printf("write settings\n");
|
|
stream = fopen(rcfile,"w");
|
|
if(strlen(icsfile)==0){
|
|
strcpy(icsfile, (char *) getenv ("HOME"));
|
|
strcat(icsfile , "/evolution/local/Calendar/calendar.ics");
|
|
}
|
|
if(strlen(application)==0)
|
|
strcpy(application , "evolution");
|
|
strcpy(set, "ICS=");
|
|
strcat(set, icsfile);
|
|
strcat(set, "\nAPP=");
|
|
strcat(set, application);
|
|
if(appicon == 0)
|
|
strcat(set, "\nICON=evolution");
|
|
if(appicon == 1)
|
|
strcat(set, "\nICON=mozilla");
|
|
if(appicon == 2)
|
|
strcat(set, "\nICON=other");
|
|
if(lang == 1)
|
|
strcat(set, "\nLANG=farsi");
|
|
else
|
|
strcat(set, "\nLANG=default");
|
|
strcat(set,"\nVERSION=");
|
|
strcat(set,WMCALENDAR_VERSION);
|
|
strcat(set,"\nSTARTOFWEEK=");
|
|
sprintf(bufint, "%d",start_of_week);
|
|
strcat(set, bufint);
|
|
strcat(set,"\n");
|
|
fwrite(set, 1, strlen(set), stream);
|
|
fclose(stream);
|
|
free(set);
|
|
free(bufint);
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* SettingsSeperator
|
|
-----------------------------------------------------*/
|
|
void SettingsSeperator(GtkWidget *box1){
|
|
GtkWidget *separator;
|
|
separator = gtk_hseparator_new ();
|
|
gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
|
|
gtk_widget_show (separator);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* SettingsLabel
|
|
-----------------------------------------------------*/
|
|
void SettingsLabel(GtkWidget *box1, char* str){
|
|
GtkWidget *label;
|
|
label = gtk_label_new (str);
|
|
gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
|
|
gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 3);
|
|
gtk_widget_show (label);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* openSettings
|
|
-----------------------------------------------------*/
|
|
void openSettings(){
|
|
GtkWidget *window;
|
|
GtkWidget *box1;
|
|
GtkWidget *box2;
|
|
GtkWidget *entry;
|
|
GtkWidget *button;
|
|
GtkWidget *menu;
|
|
GtkWidget *optionmenu;
|
|
GtkWidget *menuitem;
|
|
GSList *group;
|
|
int ii;
|
|
char title[30];
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
gtk_window_set_policy(GTK_WINDOW (window), FALSE, FALSE, FALSE);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (window), "destroy",
|
|
GTK_SIGNAL_FUNC(destroy),
|
|
NULL);
|
|
sprintf(title, "wmCalendar %s", WMCALENDAR_VERSION);
|
|
gtk_window_set_title (GTK_WINDOW (window), title);
|
|
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
|
|
|
|
box1 = gtk_vbox_new (FALSE, 0);
|
|
gtk_container_add (GTK_CONTAINER (window), box1);
|
|
gtk_widget_show (box1);
|
|
|
|
/* -------------- Applaunch icon --------------------------*/
|
|
SettingsLabel(box1, "Applaunch icon");
|
|
|
|
box2 = gtk_hbox_new (FALSE, 10);
|
|
gtk_container_set_border_width (GTK_CONTAINER (box2), 0);
|
|
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 3);
|
|
gtk_widget_show (box2);
|
|
|
|
/* create appicon boxes*/
|
|
button = gtk_radio_button_new_with_label (NULL, "Evolution");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
GTK_SIGNAL_FUNC(setAppicon),
|
|
0);
|
|
if(appicon == 0)
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
|
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
gtk_widget_show (button);
|
|
|
|
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
|
|
button = gtk_radio_button_new_with_label(group, "Mozilla");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
GTK_SIGNAL_FUNC(setAppicon),
|
|
(gpointer)1);
|
|
if(appicon == 1)
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
|
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
gtk_widget_show (button);
|
|
|
|
button = gtk_radio_button_new_with_label(
|
|
gtk_radio_button_group (GTK_RADIO_BUTTON (button)),
|
|
"Other");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
GTK_SIGNAL_FUNC(setAppicon),
|
|
(gpointer)2);
|
|
if(appicon == 2)
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
|
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
gtk_widget_show (button);
|
|
|
|
SettingsSeperator(box1);
|
|
|
|
/* -------------- Applaunch command -----------------------*/
|
|
SettingsLabel(box1, "Applaunch command");
|
|
|
|
entry = gtk_entry_new_with_max_length (100);
|
|
gtk_signal_connect(GTK_OBJECT(entry), "changed",
|
|
GTK_SIGNAL_FUNC(enter_callback),
|
|
entry);
|
|
gtk_entry_set_text (GTK_ENTRY (entry), application);
|
|
gtk_box_pack_start (GTK_BOX (box1), entry, TRUE, TRUE, 3);
|
|
gtk_widget_show (entry);
|
|
|
|
SettingsSeperator(box1);
|
|
|
|
/* -------------- Language -------------------------------*/
|
|
SettingsLabel(box1, "Language");
|
|
|
|
/* create Language boxes */
|
|
box2 = gtk_hbox_new (FALSE, 10);
|
|
gtk_container_set_border_width (GTK_CONTAINER (box2), 0);
|
|
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 3);
|
|
gtk_widget_show (box2);
|
|
|
|
button = gtk_radio_button_new_with_label (NULL, "default");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
GTK_SIGNAL_FUNC(set_lang),
|
|
0);
|
|
if(lang == 0)
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
|
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
gtk_widget_show (button);
|
|
|
|
group = gtk_radio_button_group (GTK_RADIO_BUTTON (button));
|
|
button = gtk_radio_button_new_with_label(group, "farsi");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
GTK_SIGNAL_FUNC(set_lang),
|
|
(gpointer)1);
|
|
if(lang == 1)
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
|
|
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
|
|
gtk_widget_show (button);
|
|
|
|
SettingsSeperator(box1);
|
|
|
|
/* -------------- first day of week --------------------------*/
|
|
SettingsLabel(box1, "Week starts");
|
|
optionmenu = gtk_option_menu_new();
|
|
menu = gtk_menu_new();
|
|
for(ii = 7; ii > 0; ii--){
|
|
menuitem = gtk_menu_item_new_with_label(daystr[ii]);
|
|
gtk_widget_show (menuitem);
|
|
gtk_menu_append(menu, menuitem);
|
|
}
|
|
gtk_menu_set_active(GTK_MENU (menu), 7 - start_of_week);
|
|
gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu),menu);
|
|
gtk_box_pack_start (GTK_BOX (box1), optionmenu, TRUE, TRUE, 5);
|
|
gtk_widget_show (optionmenu);
|
|
|
|
SettingsSeperator(box1);
|
|
|
|
|
|
/* -------------- Buttons -------------------------------*/
|
|
button = gtk_button_new_with_label ("change iCalendar file");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
GTK_SIGNAL_FUNC(changeFilename),
|
|
NULL);
|
|
gtk_box_pack_start (GTK_BOX (box1), button, TRUE, TRUE, 2);
|
|
gtk_widget_show (button);
|
|
|
|
button = gtk_button_new_with_label ("save");
|
|
gtk_signal_connect (GTK_OBJECT (button), "clicked",
|
|
(GtkSignalFunc) setFirstDay,
|
|
GTK_OPTION_MENU (optionmenu));
|
|
gtk_box_pack_start (GTK_BOX (box1), button, TRUE, FALSE, 2);
|
|
gtk_widget_show (button);
|
|
|
|
button = gtk_button_new_with_label ("close");
|
|
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
|
|
(GtkSignalFunc) gtk_widget_destroy,
|
|
GTK_OBJECT (window));
|
|
gtk_box_pack_start (GTK_BOX (box1), button, TRUE, TRUE, 2);
|
|
gtk_widget_show (button);
|
|
gtk_widget_show (window);
|
|
gtk_main();
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* setFirstDay
|
|
-----------------------------------------------------*/
|
|
void setFirstDay(GtkWidget *widget, GtkWidget *optionmenu ){
|
|
gchar *daystring;
|
|
int ii;
|
|
gtk_label_get (GTK_LABEL (GTK_BIN (optionmenu)->child), &daystring);
|
|
for(ii = 1; ii < 8; ii++)
|
|
if(!strcmp(daystring, daystr[ii]))
|
|
start_of_week = ii;
|
|
|
|
writeSettings();
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* changeFilename
|
|
-----------------------------------------------------*/
|
|
void changeFilename(){
|
|
static GtkWidget *settings;
|
|
|
|
settings = gtk_file_selection_new("iCalendar file");
|
|
|
|
gtk_file_selection_set_filename (GTK_FILE_SELECTION(settings),
|
|
icsfile);
|
|
/* Connect the ok_button to file_ok_sel function */
|
|
gtk_signal_connect(GTK_OBJECT (GTK_FILE_SELECTION (settings)->ok_button),
|
|
"clicked",(GtkSignalFunc) file_ok_sel, (gpointer) settings);
|
|
gtk_signal_connect(GTK_OBJECT (settings), "destroy",
|
|
GTK_SIGNAL_FUNC (destroy), NULL);
|
|
gtk_signal_connect_object(GTK_OBJECT (GTK_FILE_SELECTION(settings)->cancel_button),
|
|
"clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (settings));
|
|
|
|
gtk_window_position (GTK_WINDOW(settings), GTK_WIN_POS_MOUSE );
|
|
gtk_widget_show (settings);
|
|
gtk_main ();
|
|
}
|
|
|
|
|
|
|
|
/*------------------------------------------------------
|
|
* file_ok_sel
|
|
-----------------------------------------------------*/
|
|
static void file_ok_sel( GtkWidget *w,
|
|
GtkFileSelection *fs )
|
|
{
|
|
strcpy(icsfile, gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
|
|
gtk_widget_destroy((GtkWidget*)fs);
|
|
writeSettings();
|
|
}
|