dockapps/wmcalendar/Src/settings.c
2014-10-05 19:18:49 +01:00

411 lines
12 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();
}