00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00031 #include <signal.h>
00032 #include <sys/wait.h>
00033 #include <unistd.h>
00034 #include <string.h>
00035
00036 #include <gdk/gdkkeysyms.h>
00037 #include <gtk/gtk.h>
00038
00039 #include <liberdm/display.h>
00040 #include <libergtk/ergtk.h>
00041
00042 #include <liberregxml/erregapi.h>
00043
00044
00045 #include "config.h"
00046 #include "displayStatus.h"
00047 #include "setupLog.h"
00048 #include "background.h"
00049 #include "settings.h"
00050 #include "settingsData.h"
00051 #include "iLiadUserData.h"
00052 #include "iLiadConfigData.h"
00053 #include "iLiadBgConnectData.h"
00054 #include "iLiadPCConnectData.h"
00055 #include "iLiadArcLocData.h"
00056 #include "iLiadStartUpData.h"
00057 #include "iLiadStartUpScreen.h"
00058 #include "iLiadTimediDSData.h"
00059 #include "system.h"
00060 #include "iLiadPincodeData.h"
00061 #include "iLiadLanguageData.h"
00062 #include "iLiadLanguageScreen.h"
00063 #include "erbusy.h"
00064 #include "pagebar.h"
00065 #include "toolbar.h"
00066 #include "languages.h"
00067
00068
00069
00070 static void on_sigterm(int signo);
00071 static void on_sigchld(int signo);
00072 static void on_main_window_destroy(GtkWidget * widget, gpointer data);
00073 static gboolean on_main_window_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer p);
00074 static gboolean on_main_window_focus_out_event(GtkWidget * widget, GdkEventFocus * event, gpointer p);
00075
00076 static gboolean g_select_language_only = FALSE;
00077
00078 static void parse_arguments(int argc, char **argv)
00079 {
00080 static const char *usage_text =
00081 "\n"
00082 "usage: %s [options]\n"
00083 "\n"
00084 "options:\n"
00085 " --help\n"
00086 " Print help text and quit\n"
00087 " --select-language-only\n"
00088 " Show language settings screen only\n"
00089 "\n";
00090 int i;
00091
00092 for (i = 0 ; i < argc ; i++)
00093 {
00094 if (strcmp(argv[i], "--help") == 0)
00095 {
00096 printf(usage_text, argv[0]);
00097 _exit(0);
00098 }
00099 else if(strcmp(argv[i], "--select-language-only") == 0)
00100 {
00101 ST_LOGPRINTF("%s is only for language selection", argv[0]);
00102 g_select_language_only = TRUE;
00103 }
00104 else if (strncmp(argv[i], "--", 2) == 0)
00105 {
00106 printf("\nInvalid option: %s\n", argv[i]);
00107 printf(usage_text, argv[0]);
00108 _exit(1);
00109 }
00110 }
00111 }
00112
00113
00114 static void load_registry(void)
00115 {
00116 gboolean b;
00117 regLoad_t regLoad;
00118
00119
00120 b = erRegRWLockInit();
00121 if (b == FALSE)
00122 {
00123 ST_ERRORPRINTF("erRegRWLockInit fails with return code [%d]", b);
00124 g_assert_not_reached();
00125 }
00126
00127
00128 b = erRegReadLock();
00129 if (b == FALSE)
00130 {
00131 ST_ERRORPRINTF("erRegReadLock fails with return code [%d]", b);
00132 g_assert_not_reached();
00133 }
00134
00135
00136 regLoad = erRegLoad(regBasis_t);
00137 if (regLoad == loadError_t)
00138 {
00139 ST_ERRORPRINTF("erRegLoad(regBasis_t) fails with return code [%d]", regLoad);
00140 g_assert_not_reached();
00141 }
00142
00143 regLoad = erRegLoad(regNWProfiles_t);
00144 if (regLoad == loadError_t)
00145 {
00146 ST_ERRORPRINTF("erRegLoad(regNWProfiles_t_t) fails with return code [%d]", regLoad);
00147 g_assert_not_reached();
00148 }
00149
00150
00151 erRegUnlock();
00152 }
00153
00154
00155 static void release_registry(void)
00156 {
00157
00158 erRegUnload(regBasis_t);
00159 erRegUnload(regNWProfiles_t);
00160
00161
00162 erRegRWLockDestroy();
00163 }
00164
00165
00166 void prepare_registry_write( void)
00167 {
00168 gboolean b;
00169 regLoad_t regLoad;
00170
00171
00172 b = erRegWriteLock();
00173 if (b == FALSE)
00174 {
00175 ST_ERRORPRINTF("erRegWriteLock fails with return code [%d]", b);
00176 g_assert_not_reached();
00177 }
00178
00179
00180 erRegUnload(regBasis_t);
00181 regLoad = erRegLoad(regBasis_t);
00182 if (regLoad == loadError_t)
00183 {
00184 ST_ERRORPRINTF("erRegLoad(regBasis_t) fails with return code [%d]", regLoad);
00185 g_assert_not_reached();
00186 }
00187
00188 erRegUnload(regNWProfiles_t);
00189 regLoad = erRegLoad(regNWProfiles_t);
00190 if (regLoad == loadError_t)
00191 {
00192 ST_ERRORPRINTF("erRegLoad(regNWProfiles_t) fails with return code [%d]", regLoad);
00193 g_assert_not_reached();
00194 }
00195
00196
00197 }
00198
00199
00200 void do_registry_write(void)
00201 {
00202 gboolean b;
00203
00204
00205 g_assert(lock_write == erRegGetLockState());
00206
00207
00208 b = erRegStore();
00209 if (b == FALSE)
00210 {
00211 ST_ERRORPRINTF("erRegStore fails with return code [%d]", b);
00212 }
00213
00214
00215 erRegUnlock();
00216 }
00217
00218 int main(int argc, char **argv)
00219 {
00220 GtkWidget *window=NULL;
00221 GtkWidget *settingsArea=NULL;
00222 GtkWidget *settingsScreens=NULL;
00223
00224 parse_arguments(argc, argv);
00225
00226
00227 g_thread_init(NULL);
00228 gdk_threads_init();
00229
00230
00231 gtk_rc_parse(DATA_DIR "/setup.rc");
00232 ST_LOGPRINTF("rc file %s", DATA_DIR "/setup.rc");
00233
00234 gtk_init(&argc, &argv);
00235
00236 load_registry();
00237 erbusy_init();
00238 erbusy_blink();
00239
00240 if (g_select_language_only)
00241 {
00242 iLiad_language_data_init();
00243 }
00244 else
00245 {
00246 settings_data_init();
00247 languagesInit();
00248 pagebar_init();
00249 toolbar_init();
00250 setupInstallIpcServer();
00251 }
00252
00253
00254 display_update_increase_level(MAIN_WINDOW_EXPOSE_LEVEL);
00255
00256 if (g_select_language_only)
00257 {
00258 window = iLiad_language_screen_create();
00259 iLiad_language_screen_display_data();
00260 gtk_widget_show(window);
00261 }
00262 else
00263 {
00264
00265 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00266 gtk_window_set_title(GTK_WINDOW(window), PACKAGE " " VERSION);
00267 gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
00268 gtk_container_set_border_width(GTK_CONTAINER(window), 0);
00269 gtk_widget_set_size_request(GTK_WIDGET(window), SCREEN_WIDTH, SCREEN_HEIGHT - TOOLBAR_HEIGTH - PAGEBAR_HEIGHT);
00270 gtk_window_set_modal(GTK_WINDOW(window), TRUE);
00271 gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
00272
00273 g_signal_connect( G_OBJECT(window), "destroy", G_CALLBACK(on_main_window_destroy), NULL);
00274 g_signal_connect_after(G_OBJECT(window), "expose-event", G_CALLBACK(on_main_window_expose_event), NULL);
00275 g_signal_connect( G_OBJECT(window), "key-press-event", G_CALLBACK(on_settings_keypress), NULL);
00276 g_signal_connect( G_OBJECT(window), "focus-out-event", G_CALLBACK(on_main_window_focus_out_event), NULL);
00277
00278
00279 settingsArea = bg_create(window);
00280 bg_set_text();
00281 settingsScreens = settings_create();
00282 gtk_container_add(GTK_CONTAINER(settingsArea), settingsScreens);
00283
00284 gtk_widget_show(window);
00285 display_update_request_screen_refresh(MAIN_WINDOW_EXPOSE_LEVEL, WAVEFORM_FULLSCREEN);
00286 }
00287
00288
00289 signal(SIGTERM, on_sigterm);
00290 if (!g_select_language_only)
00291 {
00292 signal(SIGCHLD, on_sigchld);
00293 }
00294
00295 gdk_threads_enter();
00296 gtk_main();
00297
00298 display_update_increase_level(NO_DISPLAY_UPDATE_LEVEL);
00299
00300 if (!g_select_language_only)
00301 {
00302 gtk_widget_hide(settingsArea);
00303 }
00304
00305 gdk_threads_leave();
00306
00307 if (!g_select_language_only)
00308 {
00309
00310 iLiad_user_data_store();
00311 iLiad_config_data_store();
00312 iLiad_autoconnect_data_store();
00313 iLiad_pc_connect_data_store();
00314 iLiad_pincode_data_store();
00315 iLiad_archive_location_data_store();
00316 iLiad_startup_data_store();
00317 iLiad_timedids_data_store();
00318 }
00319
00320 release_registry();
00321
00322 return 0;
00323 }
00324
00325
00326 static void on_sigterm(int signo)
00327 {
00328 ST_WARNPRINTF("entry settings: signo [%d]", signo);
00329
00330
00331 stop_xtscal();
00332
00333
00334 gdk_threads_enter();
00335 gtk_main_quit();
00336 gdk_threads_leave();
00337 }
00338
00339 static void on_sigchld(int signo)
00340 {
00341 pid_t pid;
00342 int status;
00343
00344 signal(SIGCHLD, on_sigchld);
00345 if ((pid = wait(&status)) < 0)
00346 {
00347 ST_ERRORPRINTF("wait failed!");
00348 return;
00349 }
00350 if (pid == get_xtscal_pid())
00351 {
00352
00353 handle_xtscal_quit();
00354 }
00355 }
00356
00357 static void on_main_window_destroy(GtkWidget * widget, gpointer data)
00358 {
00359 ST_LOGPRINTF("entry");
00360
00361 gtk_main_quit();
00362 }
00363
00364 static gboolean on_main_window_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer p)
00365 {
00366 ST_LOGPRINTF("entry");
00367
00368 display_update_request_screen_refresh(MAIN_WINDOW_EXPOSE_LEVEL, WAVEFORM_FULLSCREEN);
00369 return FALSE;
00370 }
00371
00372
00373 static gboolean on_main_window_focus_out_event(GtkWidget * widget, GdkEventFocus * event, gpointer p)
00374 {
00375 ST_LOGPRINTF("entry");
00376
00377 settings_data_store_currentpage();
00378 return FALSE;
00379 }