/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* Control applet ("capplet") for the gnome-pilot address conduit, */ /* based on */ /* gpilotd control applet ('capplet') for use with the GNOME control center */ #include #include #include #include #include #include #include #include #include #include "address-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; GnomePilotConduitManagement *conduit; GnomePilotConduitConfig *conduit_config; AddressbookConduitCfg *origState = NULL; AddressbookConduitCfg *curState = NULL; static void doTrySettings(GtkWidget *widget, AddressbookConduitCfg *cfg); static void doRevertSettings(GtkWidget *widget, AddressbookConduitCfg *cfg); static void doSaveSettings(GtkWidget *widget, AddressbookConduitCfg *cfg); //static void readStateCfg (GtkWidget *w, AddressbookConduitCfg *c); static void setStateCfg (GtkWidget *w, AddressbookConduitCfg *c); gint pilotId; CORBA_Environment ev; static GnomePilotClient *gpc; /* This array must be in the same order as enumerations in GnomePilotConduitSyncType as they are used as index. Custom type implies Disabled state. */ static gchar* sync_options[] ={ N_("Disabled"), N_("Synchronize"), N_("Copy From Pilot"), N_("Copy To Pilot"), N_("Merge From Pilot"), N_("Merge To Pilot")}; #define SYNC_OPTIONS_COUNT 6 /* Saves the configuration data. */ static void addressbookconduit_save_configuration(AddressbookConduitCfg *c) { gchar prefix[256]; g_snprintf(prefix,255,"/gnome-pilot.d/address-conduit/Pilot_%u/",c->pilotId); gnome_config_push_prefix(prefix); gnome_config_set_bool ("open_secret", c->open_secret); gnome_config_pop_prefix(); gnome_config_sync(); gnome_config_drop_all(); } /* Creates a duplicate of the configuration data */ static AddressbookConduitCfg* gcalconduit_dupe_configuration(AddressbookConduitCfg *c) { AddressbookConduitCfg *retval; g_return_val_if_fail(c!=NULL,NULL); retval = g_new0(AddressbookConduitCfg,1); retval->sync_type = c->sync_type; retval->open_secret = c->open_secret; retval->pilotId = c->pilotId; return retval; } static void doTrySettings(GtkWidget *widget, AddressbookConduitCfg *c) { /* readStateCfg (cfgStateWindow, curState); if (activated) gnome_pilot_conduit_config_enable (conduit_config, GnomePilotConduitSyncTypeCustom); else gnome_pilot_conduit_config_disable (conduit_config); */ if (c->sync_type!=GnomePilotConduitSyncTypeCustom) gnome_pilot_conduit_config_enable_with_first_sync (conduit_config, c->sync_type, c->sync_type, TRUE); else gnome_pilot_conduit_config_disable (conduit_config); addressbookconduit_save_configuration (c); } static void doSaveSettings(GtkWidget *widget, AddressbookConduitCfg *cfg) { doTrySettings(widget, cfg); addressbookconduit_save_configuration(cfg); } static void doCancelSettings(GtkWidget *widget, AddressbookConduitCfg *c) { doSaveSettings (widget, c); } static void doRevertSettings(GtkWidget *widget, AddressbookConduitCfg *cfg) { activated = org_activation_state; setStateCfg (cfgStateWindow, curState); } static void about_cb (GtkWidget *widget, gpointer data) { GtkWidget *about; const gchar *authors[] = {_("Eskil Heyn Olsen "),NULL}; about = gnome_about_new (_("Gpilotd address conduit"), VERSION, _("(C) 1998 the Free Software Foundation"), authors, _("Configuration utility for the address conduit.\n"), _("gnome-unknown.xpm")); gtk_widget_show (about); return; } /* called by the sync_type GtkOptionMenu */ static void sync_action_selection(GtkMenuShell *widget, gpointer unused) { if (!ignore_changes) { capplet_widget_state_changed(CAPPLET_WIDGET (capplet), TRUE); } } /* called by the sync_type GtkOptionMenu */ static void activate_sync_type(GtkMenuItem *widget, gpointer data) { curState->sync_type = GPOINTER_TO_INT(data); if(!ignore_changes) capplet_widget_state_changed(CAPPLET_WIDGET(capplet), TRUE); } static GtkWidget *createStateCfgWindow(void) { GtkWidget *vbox, *table; GtkWidget *label; GtkWidget *optionMenu,*menuItem; GtkMenu *menu; gint i; vbox = gtk_vbox_new(FALSE, GNOME_PAD); table = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, GNOME_PAD); label = gtk_label_new(_("Synchronize Action")); gtk_box_pack_start(GTK_BOX(table), label, FALSE, FALSE, GNOME_PAD); optionMenu=gtk_option_menu_new(); gtk_object_set_data(GTK_OBJECT(vbox), "conduit_state", optionMenu); menu = GTK_MENU(gtk_menu_new()); for (i=0; isync_type); ignore_changes = FALSE; } #if 0 static void readStateCfg (GtkWidget *w, AddressbookConduitCfg *c) { /* GtkWidget *button; button = gtk_object_get_data(GTK_OBJECT(cfg), "conduit_on_off"); g_assert(button!=NULL); activated = GTK_TOGGLE_BUTTON(button)->active; */ } #endif /* 0 */ 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), curState); gtk_signal_connect(GTK_OBJECT(capplet), "revert", GTK_SIGNAL_FUNC(doRevertSettings), curState); gtk_signal_connect(GTK_OBJECT(capplet), "ok", GTK_SIGNAL_FUNC(doSaveSettings), curState); gtk_signal_connect(GTK_OBJECT(capplet), "cancel", GTK_SIGNAL_FUNC(doCancelSettings), curState); gtk_signal_connect(GTK_OBJECT(capplet), "help", GTK_SIGNAL_FUNC(about_cb), NULL); setStateCfg (cfgStateWindow, curState); gtk_widget_show_all (capplet); } static 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); } static gint get_pilot_id_from_gpilotd() { GList *pilots=NULL; gint pilot; int i,err; i=0; /* we don't worry about leaking here, so pilots isn't freed */ switch(err = gnome_pilot_client_get_pilots(gpc,&pilots)) { case GPILOTD_OK: { if(pilots) { for(i=0;idata); } if(i==0) { run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first.")); return -1; } else { gnome_pilot_client_get_pilot_id_by_name(gpc, pilots->data, /* this is the first pilot */ &pilot); if(i>1) { g_message("too many pilots..."); /* need a choose here */ } return pilot; } } else { run_error_dialog(_("No pilot configured, please choose the\n'Pilot Link Properties' capplet first.")); return -1; } break; } case GPILOTD_ERR_NOT_CONNECTED: run_error_dialog(_("Not connected to the gnome-pilot daemon")); return -1; break; default: g_warning("gnome_pilot_client_get_pilot_ids(...) = %d",err); run_error_dialog(_("An error occured when trying to fetch\npilot list from the gnome-pilot daemon")); return -1; break; } } int main (int argc, char *argv[]) { g_log_set_always_fatal (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING); /* we're a capplet */ gnome_capplet_init ("address conduit control applet", NULL, argc, argv, NULL, 0, NULL); gpc = gnome_pilot_client_new(); gnome_pilot_client_connect_to_daemon(gpc); pilotId = get_pilot_id_from_gpilotd(); if(!pilotId) return -1; /* put all code to set things up in here */ conduit_load_configuration (&origState, pilotId); conduit = gnome_pilot_conduit_management_new ("address_conduit", GNOME_PILOT_CONDUIT_MGMT_ID); if (conduit == NULL) return -1; conduit_config = gnome_pilot_conduit_config_new (conduit, pilotId); org_activation_state = gnome_pilot_conduit_config_is_enabled (conduit_config, &origState->sync_type); activated = org_activation_state; //gpilotd_conduit_mgmt_get_sync_type (conduit, pilotId, &origState->sync_type); curState = gcalconduit_dupe_configuration(origState); pilot_capplet_setup (); /* done setting up, now run main loop */ capplet_gtk_main(); gnome_pilot_conduit_management_destroy(conduit); return 0; }