diff options
Diffstat (limited to 'calendar/todo-conduit-control-applet.c')
-rw-r--r-- | calendar/todo-conduit-control-applet.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/calendar/todo-conduit-control-applet.c b/calendar/todo-conduit-control-applet.c new file mode 100644 index 0000000000..def35ca376 --- /dev/null +++ b/calendar/todo-conduit-control-applet.c @@ -0,0 +1,278 @@ +/* Control applet ("capplet") for the gnome-pilot todo conduit, */ +/* based on */ +/* gpilotd control applet ('capplet') for use with the GNOME control center */ +/* $Id$ */ + +#include <pwd.h> +#include <sys/types.h> +#include <signal.h> +#include <gnome.h> + +#include <config.h> +#include <capplet-widget.h> + +#include <gpilotd/gpilotd-conduit-mgmt.h> +#include <gpilotd/gpilotd-app.h> +#include <gpilotd/gpilotd-app-dummy-callbacks.h> + +#include "todo-conduit.h" + +/* tell changes callbacks to ignore changes or not */ +static gboolean ignore_changes=FALSE; + +/* capplet widget */ +static GtkWidget *capplet=NULL; + +/* host/device/pilot configuration windows */ +GtkWidget *cfgOptionsWindow=NULL; +GtkWidget *cfgStateWindow=NULL; +GtkWidget *dialogWindow=NULL; + +gboolean activated,org_activation_state; +GnomePilotConduitMgmt *conduit; + +static void doTrySettings(GtkWidget *widget, ConduitCfg *conduitCfg); +static void doRevertSettings(GtkWidget *widget, ConduitCfg *conduitCfg); +static void doSaveSettings(GtkWidget *widget, ConduitCfg *conduitCfg); + +static void readStateCfg(GtkWidget *w); +static void setStateCfg(GtkWidget *w); + +gchar *pilotId; +CORBA_Environment ev; + +static void +doTrySettings(GtkWidget *widget, ConduitCfg *conduitCfg) +{ + readStateCfg(cfgStateWindow); + if(activated) + gpilotd_conduit_mgmt_enable(conduit,pilotId); + else + gpilotd_conduit_mgmt_disable(conduit,pilotId); +} + +static void +doSaveSettings(GtkWidget *widget, ConduitCfg *conduitCfg) +{ + doTrySettings(widget, conduitCfg); + save_configuration(NULL); +} + + +static void +doRevertSettings(GtkWidget *widget, ConduitCfg *conduitCfg) +{ + activated = org_activation_state; + setStateCfg(cfgStateWindow); +} + +static void +insert_dir_callback (GtkEditable *editable, const gchar *text, + gint len, gint *position, void *data) +{ + gint i; + gchar *curname; + + curname = gtk_entry_get_text(GTK_ENTRY(editable)); + if (*curname == '\0' && len > 0) { + if (isspace(text[0])) { + gtk_signal_emit_stop_by_name(GTK_OBJECT(editable), "insert_text"); + return; + } + } else { + for (i=0; i<len; i++) { + if (isspace(text[i])) { + gtk_signal_emit_stop_by_name(GTK_OBJECT(editable), + "insert_text"); + return; + } + } + } +} +static void +insert_dir_callback2(GtkEditable *editable, const gchar *text, + gint length, gint *position, + void *data) +{ + if (!ignore_changes) + capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE); +} + +static void +clist_changed(GtkWidget *widget, gpointer data) +{ + if (!ignore_changes) + capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE); +} + +void about_cb (GtkWidget *widget, gpointer data) { + GtkWidget *about; + const gchar *authors[] = {_("Eskil Heyn Olsen <deity@eskil.dk>"),NULL}; + + about = gnome_about_new(_("Gpilotd todo conduit"), VERSION, + _("(C) 1998 the Free Software Foundation"), + authors, + _("Configuration utility for the todo conduit.\n"), + _("gnome-unknown.xpm")); + gtk_widget_show (about); + + return; +} + +static void toggled_cb(GtkWidget *widget, gpointer data) { + gtk_widget_set_sensitive(cfgOptionsWindow,GTK_TOGGLE_BUTTON(widget)->active); + capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE); +} + +static GtkWidget +*createStateCfgWindow(void) +{ + GtkWidget *vbox, *table; + GtkWidget *entry, *label; + GtkWidget *button; + + vbox = gtk_vbox_new(FALSE, GNOME_PAD); + + table = gtk_table_new(2, 2, FALSE); + gtk_table_set_row_spacings(GTK_TABLE(table), 4); + gtk_table_set_col_spacings(GTK_TABLE(table), 10); + gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, GNOME_PAD); + + label = gtk_label_new(_("Enabled")); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1,2); + + button = gtk_check_button_new(); + gtk_object_set_data(GTK_OBJECT(vbox), "conduit_on_off", button); + gtk_signal_connect(GTK_OBJECT(button), "toggled", + GTK_SIGNAL_FUNC(toggled_cb), + NULL); + gtk_table_attach_defaults(GTK_TABLE(table), button, 1, 2, 1,2); + + return vbox; +} + +static void +setStateCfg(GtkWidget *cfg) +{ + GtkWidget *button; + gchar num[40]; + + button = gtk_object_get_data(GTK_OBJECT(cfg), "conduit_on_off"); + + g_assert(button!=NULL); + + ignore_changes = TRUE; + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),activated); + gtk_widget_set_sensitive(cfgOptionsWindow,GTK_TOGGLE_BUTTON(button)->active); + ignore_changes = FALSE; +} + + +static void +readStateCfg(GtkWidget *cfg) +{ + GtkWidget *button; + + button = gtk_object_get_data(GTK_OBJECT(cfg), "conduit_on_off"); + + g_assert(button!=NULL); + + activated = GTK_TOGGLE_BUTTON(button)->active; +} + +static void +pilot_capplet_setup(void) +{ + GtkWidget *frame, *table; + + capplet = capplet_widget_new(); + + table = gtk_table_new(1, 2, FALSE); + gtk_container_border_width(GTK_CONTAINER(table), GNOME_PAD); + gtk_container_add(GTK_CONTAINER(capplet), table); + + frame = gtk_frame_new(_("Conduit state")); + gtk_container_border_width(GTK_CONTAINER(frame), GNOME_PAD_SMALL); + gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1); + cfgStateWindow = createStateCfgWindow(); + gtk_container_add(GTK_CONTAINER(frame), cfgStateWindow); + + gtk_signal_connect(GTK_OBJECT(capplet), "try", + GTK_SIGNAL_FUNC(doTrySettings), NULL); + gtk_signal_connect(GTK_OBJECT(capplet), "revert", + GTK_SIGNAL_FUNC(doRevertSettings), NULL); + gtk_signal_connect(GTK_OBJECT(capplet), "ok", + GTK_SIGNAL_FUNC(doSaveSettings), NULL); + gtk_signal_connect(GTK_OBJECT(capplet), "help", + GTK_SIGNAL_FUNC(about_cb), NULL); + + + setStateCfg(cfgStateWindow); + + gtk_widget_show_all(capplet); +} + +void run_error_dialog(gchar *mesg,...) { + char tmp[80]; + va_list ap; + + va_start(ap,mesg); + vsnprintf(tmp,79,mesg,ap); + dialogWindow = gnome_message_box_new(mesg,GNOME_MESSAGE_BOX_ERROR,GNOME_STOCK_BUTTON_OK,NULL); + gnome_dialog_run_and_close(GNOME_DIALOG(dialogWindow)); + va_end(ap); +} + +gchar *get_pilot_id_from_gpilotd() { + gchar **pilots; + int i; + + i=0; + gpilotd_get_pilots(&pilots); + if(pilots) { + while(pilots[i]) { g_message("pilot %d = \"%s\"",i,pilots[i]); i++; } + if(i==0) { + run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first.")); + return NULL; + } else + if(i==1) + return pilots[0]; + else { + g_message("too many pilots..."); + return pilots[0]; + } + } else { + run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first.")); + return NULL; + } +} + +int +main( int argc, char *argv[] ) +{ + /* we're a capplet */ + gnome_capplet_init ("todo conduit control applet", NULL, argc, argv, + NULL, + 0, NULL); + + /* put all code to set things up in here */ + conduit = gpilotd_conduit_mgmt_new("todo_conduit"); + + /* get pilot name from gpilotd */ + /* 1. initialize the gpilotd connection */ + gpilotd_init(&argc,argv); + /* 2 connect to gpilotd */ + if(!gpilotd_connect()) g_error("Cannot connect to gpilotd"); + + pilotId = get_pilot_id_from_gpilotd(); + if(!pilotId) return -1; + org_activation_state = activated = gpilotd_conduit_mgmt_is_enabled(conduit,pilotId); + + pilot_capplet_setup(); + + + /* done setting up, now run main loop */ + capplet_gtk_main(); + g_free(pilotId); + return 0; +} |