00001 #include "dEvian.h"
00002
00003
00004 int devian_devian_main_init(E_Module *m)
00005 {
00006 Config_dEvian *cfg_devian;
00007 int i;
00008
00009 dEvianM = E_NEW(dEvian_Main, 1);
00010
00011 dEvianM->container = e_container_current_get(e_manager_current_get());
00012 evas_output_viewport_get(dEvianM->container->bg_evas, NULL, NULL, &dEvianM->canvas_w, &dEvianM->canvas_h);
00013 DMAIN(("dEvian : Canvas %d x %d",dEvianM->canvas_w,dEvianM->canvas_h));
00014
00015 dEvianM->module = m;
00016
00017 dEvianM->devians = NULL;
00018 dEvianM->themes_menu = NULL;
00019 dEvianM->container_box_count = 0;
00020
00021 dEvianM->display = devian_display_init();
00022
00023 dEvianM->conf = devian_config_init();
00024 if (!dEvianM->conf)
00025 return 0;
00026
00027 devian_menu_main_menu_init();
00028 if (!dEvianM->main_menu)
00029 return 0;
00030
00031 if ( devian_data_picture_list_local_init() )
00032 {
00033 fprintf(stderr, "dEvian: can't init picture list (local) !\n");
00034 return 0;
00035 }
00036
00037 if ( !devian_data_picture_cache_init() )
00038 {
00039 fprintf(stderr, "dEvian: can't init picture cache !\n");
00040 return 0;
00041 }
00042
00043
00044 DMAIN(("%d devians to create", dEvianM->conf->nb_devian));
00045 for (i=0; i<dEvianM->conf->nb_devian; i++)
00046 {
00047 cfg_devian = evas_list_nth(dEvianM->conf->devians_conf, i);
00048 if (!devian_devian_add(cfg_devian))
00049 {
00050 fprintf(stderr, "dEvian: Not good, a devian couldnt be created\n");
00051 evas_list_remove (dEvianM->conf->devians_conf,
00052 cfg_devian);
00053 }
00054 }
00055
00056 DMAIN(("dEvian : init_devian OK\n"));
00057
00058 return 1;
00059 }
00060
00061
00062 void devian_devian_main_shutdown(void)
00063 {
00064 DMAIN(("Main shutdown begins"));
00065
00066 devian_devian_del_all();
00067
00068 devian_data_picture_cache_shutdown();
00069 devian_data_picture_list_local_shutdown();
00070
00071 devian_menu_main_menu_shutdown();
00072 devian_config_dialog_main_shutdown();
00073 devian_config_free();
00074 devian_display_shutdown();
00075
00076 E_FREE(dEvianM);
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 dEvian *devian_devian_add(Config_dEvian *cfg_devian)
00089 {
00090 dEvian *devian;
00091
00092 devian = E_NEW(dEvian, 1);
00093 devian->menu = NULL;
00094 devian->name = NULL;
00095 devian->source = NULL;
00096 devian->container = NULL;
00097 devian->dying = 0;
00098 devian->dialog_conf = NULL;
00099 devian->conf = NULL;
00100 devian->menu = NULL;
00101
00102
00103 dEvianM->devians = evas_list_append (dEvianM->devians,
00104 devian);
00105
00106
00107 devian_devian_set_name(devian, SOURCE_NO, NULL);
00108
00109
00110 if (cfg_devian)
00111 {
00112
00113 devian->conf = cfg_devian;
00114 }
00115 else
00116 {
00117
00118 devian->conf = devian_config_devian_new(NULL);
00119 if (!devian->conf)
00120 {
00121 devian_devian_del(devian, 1);
00122 return NULL;
00123 }
00124 }
00125
00126
00127 devian->menu = devian_menu_init(devian);
00128 if (!devian->menu)
00129 {
00130 devian_devian_del(devian, 1);
00131 return NULL;
00132 }
00133
00134
00135 if ( devian_source_change(devian, devian->conf->source_type) )
00136 {
00137 devian_devian_del(devian, 1);
00138 return NULL;
00139 }
00140
00141
00142 if ( devian_container_change(devian, devian->conf->container_type) )
00143 {
00144 devian_devian_del(devian, 1);
00145 return NULL;
00146 }
00147
00148 DMAIN(("dEvian: New devian OK"));
00149
00150 return devian;
00151 }
00152
00153 void devian_devian_del(dEvian *devian, int now)
00154 {
00155 if (!now)
00156 {
00157 devian->dying = 1;
00158 if (devian_container_devian_dying(devian))
00159 return;
00160 }
00161
00162 DMAIN(("dEvian: del devian container"));
00163 devian_container_change(devian, CONTAINER_NO);
00164 DMAIN(("dEvian: del devian source"));
00165 devian_source_change(devian, SOURCE_NO);
00166 DMAIN(("dEvian: Free devian menu"));
00167 devian_menu_shutdown(devian);
00168 DMAIN(("dEvian: Free devian config dialog"));
00169 devian_config_dialog_devian_shutdown(devian);
00170 DMAIN(("dEvian: Free devian config"));
00171 devian_config_devian_free(devian);
00172 DMAIN(("dEvian: Free devian remove"));
00173 dEvianM->devians = evas_list_remove (dEvianM->devians,
00174 devian);
00175 DMAIN(("Rename dEvians"));
00176 devian_devian_set_name(NULL, 0, NULL);
00177 DMAIN(("dEvian: Free devian refresh main menu"));
00178 devian_menu_main_menu_refresh();
00179 DMAIN(("dEvian: Free devian free"));
00180
00181 if (devian->name)
00182 E_FREE(devian->name);
00183 E_FREE(devian);
00184
00185 DMAIN(("dEvian: Free devian OK"));
00186 }
00187
00188 void devian_devian_del_all(void)
00189 {
00190 while (dEvianM->devians)
00191 {
00192 DMAIN(("dEvian: devian_del"));
00193 devian_devian_del(evas_list_data(dEvianM->devians), 1);
00194 }
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 void devian_devian_set_name(dEvian *devian, int source, char *extra)
00206 {
00207 char *name;
00208 int n;
00209
00210 if (!devian)
00211 {
00212 Evas_List *l;
00213 dEvian *d;
00214
00215 n=1;
00216 for (l=dEvianM->devians; l; l=evas_list_next(l))
00217 {
00218 name = E_NEW(char, DEVIAN_NAME_LEN);
00219 d = evas_list_data(l);
00220 if (d->name && d->conf)
00221 {
00222 E_FREE(d->name);
00223 switch (d->conf->source_type)
00224 {
00225 case SOURCE_PICTURE:
00226 snprintf(name, DEVIAN_NAME_LEN, "Picture %d", n);
00227 break;
00228 case SOURCE_NO:
00229 snprintf(name, DEVIAN_NAME_LEN, "No source %d", n);
00230 break;
00231 }
00232 }
00233 else
00234 {
00235 if (d->name)
00236 E_FREE(d->name);
00237 snprintf(name, DEVIAN_NAME_LEN, "Invalid devian %d", n);
00238 }
00239 d->name = name;
00240 devian_container_update_name_devian(d);
00241 n++;
00242 }
00243 devian_menu_main_menu_refresh();
00244 }
00245 else
00246 {
00247 name = E_NEW(char, DEVIAN_NAME_LEN);
00248 n = evas_list_count(dEvianM->devians);
00249 switch (source)
00250 {
00251 case SOURCE_PICTURE:
00252 if (extra)
00253 snprintf(name, DEVIAN_NAME_LEN, "Picture %d %s", n, extra);
00254 else
00255 snprintf(name, DEVIAN_NAME_LEN, "Picture %d", n);
00256 break;
00257 case SOURCE_NO:
00258 if (extra)
00259 snprintf(name, DEVIAN_NAME_LEN, "No source %d %s", n, extra);
00260 else
00261 snprintf(name, DEVIAN_NAME_LEN, "No source %d", n);
00262 break;
00263 default:
00264 if (extra)
00265 snprintf(name, DEVIAN_NAME_LEN, "Invalid dEvian %d %s", n, extra);
00266 else
00267 snprintf(name, DEVIAN_NAME_LEN, "Invalid dEvian %d", n);
00268 break;
00269 }
00270 if (devian->name)
00271 E_FREE(devian->name);
00272 devian->name = name;
00273 if (devian->container)
00274 devian_container_update_name_devian(devian);
00275 if (devian->menu)
00276 devian_menu_main_menu_refresh();
00277 }
00278
00279 return;
00280 }
00281
00282 char *devian_display_init(void)
00283 {
00284 char *display = NULL;
00285 char *tmp;
00286
00287 tmp = getenv("DISPLAY");
00288 if (tmp) display = strdup(tmp);
00289
00290
00291 if (display)
00292 {
00293 char *p;
00294 char buf[1024];
00295
00296 p = strrchr(display, ':');
00297 if (!p)
00298 {
00299 snprintf(buf, sizeof(buf), "%s:0.0", display);
00300 free(display);
00301 display = strdup(buf);
00302 }
00303 else
00304 {
00305 p = strrchr(p, '.');
00306 if (!p)
00307 {
00308 snprintf(buf, sizeof(buf), "%s.0", display);
00309 free(display);
00310 display = strdup(buf);
00311 }
00312 }
00313 }
00314 else
00315 display = strdup(":0.0");
00316
00317
00318 if (display)
00319 e_lib_init(display);
00320 else
00321 {
00322 display = strdup(":0.0");
00323 e_lib_init(display);
00324 }
00325
00326 return display;
00327 }
00328
00329 void devian_display_shutdown(void)
00330 {
00331 free(dEvianM->display);
00332 dEvianM->display = NULL;
00333 e_lib_shutdown();
00334 }
00335
00336 int devian_devian_edje_load(Evas_Object *edje_obj, char *part)
00337 {
00338 char path[DEVIAN_MAX_PATH];
00339
00340 snprintf(path, DEVIAN_MAX_PATH, "%s/%s/%s%s",
00341 e_module_dir_get(dEvianM->module), "themes",
00342 dEvianM->conf->theme,
00343 ".edj");
00344 if ( !edje_object_file_set(edje_obj, path, part) )
00345 {
00346 char buf[4096];
00347 snprintf(buf, sizeof(buf),
00348 _(
00349 "<hilight>Error !</hilight><br>"
00350 "Did not find <hilight>theme</hilight> %s group %s"),
00351 path, part);
00352 e_module_dialog_show(_("dEvian Module Error"), buf);
00353 return 0;
00354 }
00355 #ifdef DEBUG_MAIN
00356 else
00357 {
00358 fprintf(stderr, "Edje loaded %s group %s\n" , path, part);
00359 }
00360 #endif
00361
00362 return 1;
00363 }