#ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include "gettext.h" #include "eulogium.h" #define COPYRIGHT "Copyright © 2015 Olliver Schinagl and various contributors (see AUTHORS)." void eulogium_button_cb_set(struct button_def *button, struct button_cb *cb) { if (cb && button) button->cb = *cb; } void eulogium_button_cb_data_set(struct button_def *button, void *data) { if (data && button) button->cb.data = data; } void eulogium_button_data_set(struct button_def *button, void *data) { if (data && button) button->data = data; } void eulogium_print_file_set(struct eulogium_data *eulogium, char *filepath) { if (filepath && eulogium) eulogium->print.file = filepath; eulogium->print.name = ecore_file_strip_ext(ecore_file_file_get(filepath)); } /* test function to map try to mouse button to emit a click event */ static void _cb_eulogium_input_button(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Evas_Event_Mouse_Down *ev = event_info; // struct eulogium_data *eulogium = data; printf("Button: %d\n", ev->button); if (ev->button == 2) { // /* Broken */ // focused = elm_object_focused_object_get((Evas_Object *)data); // elm_object_signal_emit(focused, "mouse,down,1", "event"); /* TODO does not work */ // printf("Object: 0x%p\n", focused); } else { // /* TODO: remove if we know the button event from the rotary encoder */ // printf("Button: %d\n", ev->button); } } /* Function to make the Z-axis of any wheel focus the next/previous focusable widget */ static void _cb_eulogium_input_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { Evas_Event_Mouse_Wheel *ev = event_info; if (ev->z > 0) elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_NEXT); else elm_object_focus_next((Evas_Object *)data, ELM_FOCUS_PREVIOUS); } /* Generic button handler */ static void _cb_eulogium_button(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { printf("Button clicked\n"); } static void _cb_eulogium_resize(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { /* TODO: (adapt button sizes to window size? or keep fixed size? scale?) */ } static void _cb_eulogium_exit(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { elm_exit(); } Evas_Object *eulogium_split_screen(Evas_Object *parent, Evas_Object *top, Evas_Object *bottom) { Evas_Object *box; Evas_Object *object; box = elm_box_add(parent); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(box); evas_object_size_hint_align_set(top, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(top, 0, 48); evas_object_show(top); elm_box_pack_end(box, top); #if 0 /* FIXME use themed seperator */ object = elm_separator_add(eulogium->layout); elm_separator_horizontal_set(object, EINA_TRUE); evas_object_show(object); elm_table_pack(table, object, 1, 5, 1, 1); #else object = evas_object_rectangle_add(evas_object_evas_get(parent)); evas_object_color_set(object, 0x33, 0x99, 0xff, 0xff); evas_object_size_hint_min_set(object, 1, 0); evas_object_size_hint_padding_set(object, 3, 6, 1, 1); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(object, 0, 2); evas_object_show(object); elm_box_pack_end(box, object); #endif evas_object_size_hint_align_set(bottom, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bottom, 0, 14); evas_object_show(bottom); elm_box_pack_end(box, bottom); return box; } Evas_Object *eulogium_print_progress(struct eulogium_data *eulogium) { Evas_Object *table; Evas_Object *object; char buf[255]; table = elm_table_add(eulogium->layout); evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_table_homogeneous_set(table, EINA_FALSE); eulogium->print.status = elm_label_add(table); elm_object_text_set(eulogium->print.status, "Print time: ...
Print status unknown."); elm_label_slide_mode_set(eulogium->print.status, ELM_LABEL_SLIDE_MODE_NONE); evas_object_size_hint_align_set(eulogium->print.status, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(eulogium->print.status); elm_table_pack(table, eulogium->print.status, 0, 0, 3, 1); #if 0 eulogium->print.status = elm_label_add(table); elm_object_text_set(eulogium->print.status, "Print status unknown."); elm_label_slide_mode_set(eulogium->print.status, ELM_LABEL_SLIDE_MODE_AUTO); elm_label_slide_duration_set(eulogium->print.status, 8); elm_object_style_set(eulogium->print.status, "slide_bounce"); evas_object_size_hint_align_set(eulogium->print.status, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(eulogium->print.status); elm_table_pack(table, eulogium->print.status, 0, 1, 3, 1); #endif object = elm_label_add(table); elm_object_text_set(object, eulogium->print.name); elm_label_slide_mode_set(object, ELM_LABEL_SLIDE_MODE_AUTO); elm_label_slide_duration_set(object, 8); elm_object_style_set(object, "slide_bounce"); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_table_pack(table, object, 0, 2, 3, 1); if (!eulogium->print.progress) eulogium->print.progress = elm_progressbar_add(table); /* TODO: depending on i18n sig, change inverted */ elm_progressbar_horizontal_set(eulogium->print.progress, EINA_TRUE); elm_progressbar_pulse_set(eulogium->print.progress, EINA_FALSE); /* TODO: pulse = time-unknown/pause */ elm_progressbar_pulse(eulogium->print.progress, EINA_FALSE); elm_progressbar_value_set(eulogium->print.progress, 0.5); elm_progressbar_unit_format_set(eulogium->print.progress, "%1.0f%%"); evas_object_size_hint_align_set(eulogium->print.progress, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(eulogium->print.progress); elm_table_pack(table, eulogium->print.progress, 0, 3, 3, 1); #if 0 /* FIXME use themed seperator */ object = elm_separator_add(eulogium->layout); elm_separator_horizontal_set(object, EINA_TRUE); evas_object_show(object); elm_table_pack(table, object, 0, 4, 3, 1); #else object = evas_object_rectangle_add(evas_object_evas_get(eulogium->layout)); evas_object_color_set(object, 0x33, 0x99, 0xff, 0xff); evas_object_size_hint_min_set(object, 0, 1); evas_object_size_hint_padding_set(object, 1, 1, 1, 1); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_table_pack(table, object, 0, 4, 3, 1); #endif object = elm_button_add(table); elm_object_text_set(object, "TUNE"); /* create tune button */ evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_table_pack(table, object, 0, 5, 1, 1); #if 0 /* FIXME use themed seperator */ object = elm_separator_add(eulogium->layout); elm_separator_horizontal_set(object, EINA_TRUE); evas_object_show(object); elm_table_pack(table, object, 1, 5, 1, 1); #else object = evas_object_rectangle_add(evas_object_evas_get(eulogium->layout)); evas_object_color_set(object, 0x33, 0x99, 0xff, 0xff); evas_object_size_hint_min_set(object, 1, 0); evas_object_size_hint_padding_set(object, 1, 1, 1, 1); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_table_pack(table, object, 1, 5, 1, 1); #endif object = elm_button_add(table); elm_object_text_set(object, "PAUSE"); /* create pause button */ evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_table_pack(table, object, 2, 5, 1, 1); object = elm_label_add(table); snprintf(buf, sizeof(buf), "Material: %gm", eulogium->print.material); elm_object_text_set(object, buf); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_table_pack(table, object, 0, 6, 3, 1); return table; } Evas_Object *eulogium_start_print(struct eulogium_data *eulogium, char *filepath) { eulogium_print_file_set(eulogium, filepath); return eulogium_print_progress(eulogium); } /* Uglyness due to a 'shortcomming' of elm_list sorted insert using 1 data var for both funcs */ struct _filelist_sort { struct eulogium_data *eulogium; char *filepath; }; static void _cb_select_file(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { char *filepath = ((struct _filelist_sort *)data)->filepath; struct eulogium_data *eulogium = ((struct _filelist_sort *)data)->eulogium; Evas_Object *content; if (ecore_file_is_dir(filepath)) { content = eulogium_print_menu(eulogium, filepath); } else { eulogium->print.material = 100.23; /* TODO */ content = eulogium_start_print(eulogium, filepath); } elm_naviframe_item_simple_push(eulogium->layout, content); } static int _cb_dirfile_sort(const void *data1, const void *data2) { const char *filepath1 = ((struct _filelist_sort *)elm_object_item_data_get(data1))->filepath; const char *filepath2 = ((struct _filelist_sort *)elm_object_item_data_get(data2))->filepath; if (!filepath1) return 1; if (!filepath2) return -1; if (ecore_file_is_dir(filepath1) != (ecore_file_is_dir(filepath2))) { return (ecore_file_is_dir(filepath1) ? -1 : 1); } return strcoll(filepath1, filepath2); } char *ecore_file_ext_get(const char *path) { char *p, *file = NULL; p = strrchr(path, '.'); if ((!path) || (!p)) return NULL; else if (p != path) { int l = strlen(p); if (l < 2) return NULL; file = malloc(strlen(p) * sizeof(char)); if (file) { memcpy(file, &p[1], l); } } return file; } static void _cb_populate_filelist(const char *name, const char *path, void *data) { struct eulogium_data *eulogium = data; Evas_Object *list = (Evas_Object *)eulogium->data; Evas_Object *icon; Elm_Object_Item *list_item; char *filepath; char *ext; uint_fast32_t dir_len; uint_fast8_t hidden_visible = 1; struct _filelist_sort *filelist_sort; if (hidden_visible && (name[0] == '.')) return; dir_len = strlen(name) + strlen(path) + sizeof('/') + 1; filepath = malloc(dir_len); snprintf(filepath, dir_len, "%s/%s", path, name); if (!ecore_file_is_dir(filepath)) { int len; ext = ecore_file_ext_get(name); if (!ext) return; len = strlen(ext); if (strncmp(ext, "gcode", len) != 0) /* TODO: compare to list of filetypes/filterlist/mimetype */ return; } icon = elm_icon_add(list); if (ecore_file_is_dir(filepath)) elm_icon_standard_set(icon, "folder"); else elm_icon_standard_set(icon, "file"); elm_image_resizable_set(icon, EINA_FALSE, EINA_FALSE); filelist_sort = malloc(sizeof(struct _filelist_sort)); /* never freed, memleak! XXX */ filelist_sort->eulogium = eulogium; filelist_sort->filepath = filepath; list_item = elm_list_item_sorted_insert(list, name, icon, NULL, _cb_select_file, filelist_sort, _cb_dirfile_sort); // free(filepath); & filelist_sort /* TODO is this required?, yes! / elm_list_item_show(list_item); /* TODO: seems not needed? */ } #if 0 static void _cb_filelist_bottom(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *list = data; elm_list_item_bring_in(elm_list_first_item_get(list)); } static void _cb_filelist_top(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *list = data; elm_list_item_bring_in(elm_list_last_item_get(list)); } #endif static void _cb_content_prev_set(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; elm_naviframe_item_pop(eulogium->layout); } static struct button_def but_return = { .text = "RETURN", .cb = { .func = &_cb_content_prev_set, .data = NULL, .info = "return button pressed", }, .data = NULL, }; Evas_Object *eulogium_print_menu(struct eulogium_data *eulogium, char *filepath) { Evas_Object *box; Evas_Object *list; Evas_Object *icon; box = elm_box_add(eulogium->layout); #if 1 list = elm_label_add(box); elm_object_text_set(list, "SD Card"); /* TODO This may be more then just the SD card */ evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(list); elm_box_pack_start(box, list); #endif list = elm_list_add(box); evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_list_multi_select_set(list, EINA_FALSE); elm_scroller_bounce_set(list, EINA_FALSE, EINA_FALSE); elm_list_mode_set(list, ELM_LIST_COMPRESS); elm_box_pack_end(box, list); eulogium->data = (void *)list; eina_file_dir_list(filepath, EINA_FALSE, _cb_populate_filelist, eulogium); eulogium->data = NULL; icon = elm_icon_add(list); elm_icon_standard_set(icon, "home"); elm_list_item_prepend(list, "< RETURN", icon, NULL, _cb_content_prev_set, eulogium); /* XXX TODO: when we pop the filelist from the stack, who calls elm_list_free();? */ elm_list_go(list); // evas_object_smart_callback_add(list, "edge,bottom", _cb_filelist_bottom, list); // evas_object_smart_callback_add(list, "edge,top", _cb_filelist_top, list); // evas_object_smart_callback_add(list, "highlighted", _cb_filelist_bringin, NULL); // evas_object_smart_callback_add(list, "longpressed", _cb_filelist_filedetails, NULL); /* TODO, use inwin */ evas_object_show(list); evas_object_show(box); return box; } struct _multi_text_next_cb_data { struct eulogium_data *eulogium; struct multi_text *txtdata; uint_fast8_t pagenum; Eina_Bool pageindex; }; static void _eulogium_multi_text_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *content; struct eulogium_data *eulogium = ((struct _multi_text_next_cb_data *)data)->eulogium; uint_fast8_t pagenum = ((struct _multi_text_next_cb_data *)data)->pagenum; Eina_Bool pageindex = ((struct _multi_text_next_cb_data *)data)->pageindex; struct multi_text *txtdata = ((struct _multi_text_next_cb_data *)data)->txtdata; if (pagenum >= txtdata->count) { Elm_Object_Item *item; item = elm_naviframe_bottom_item_get(eulogium->layout); if (item) elm_naviframe_item_pop_to(item); /* XXX what to do else? */ } else { content = eulogium_multi_text_menu(eulogium, eulogium->layout, NULL, txtdata, pagenum, pageindex); if (content) elm_naviframe_item_simple_push(eulogium->layout, content); /* XXX what else? */ } free(data); } Evas_Object *eulogium_multi_text_menu(struct eulogium_data *eulogium, Evas_Object *parent, struct button_def *button, struct multi_text *txtdata, uint_fast8_t pagenum, Eina_Bool pageindex) { Evas_Object *object; Evas_Object *_top, *_bottom; char buf[6]; struct _multi_text_next_cb_data *multi_text_next_cb_data; if (pagenum >= txtdata->count) pagenum = txtdata->count - 1; _top = elm_box_add(parent); evas_object_show(_top); if (pageindex) { object = elm_label_add(_top); snprintf(buf, sizeof(buf), "%d/%d", pagenum + 1, txtdata->count); elm_object_text_set(object, buf); evas_object_show(object); evas_object_size_hint_align_set(object, 1.0, 0); elm_box_pack_end(_top, object); } object = elm_label_add(_top); elm_object_text_set(object, txtdata->text[pagenum]); evas_object_show(object); elm_box_pack_end(_top, object); multi_text_next_cb_data = malloc(sizeof(struct _multi_text_next_cb_data)); multi_text_next_cb_data->eulogium = eulogium; multi_text_next_cb_data->txtdata = txtdata; multi_text_next_cb_data->pagenum = pagenum + 1; multi_text_next_cb_data->pageindex = EINA_TRUE; _bottom = elm_button_add(parent); elm_object_text_set(_bottom, button ? button->text : "NEXT"); evas_object_smart_callback_add(_bottom, "clicked", _eulogium_multi_text_next_cb, multi_text_next_cb_data); evas_object_show(_bottom); return eulogium_split_screen(parent, _top, _bottom); } Evas_Object *eulogium_tripple_button_menu(Evas_Object *parent, const struct button_def *left, const struct button_def *right, const struct button_def *bottom) { Evas_Object *object; Evas_Object *_top, *_bottom; _top = elm_box_add(parent); elm_box_horizontal_set(_top, EINA_TRUE); evas_object_size_hint_weight_set(_top, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(_top); object = elm_button_add(_top); elm_object_text_set(object, left->text); evas_object_smart_callback_add(object, "clicked", left->cb.func, left->cb.data); evas_object_show(object); elm_box_pack_end(_top, object); #if 0 /* FIXME use themed seperator */ object = elm_separator_add(table); elm_separator_horizontal_set(object, EINA_TRUE); evas_object_show(object); elm_table_pack(table, object, 1, 0, 1, 1); #else object = evas_object_rectangle_add(_top); evas_object_color_set(object, 0x33, 0x99, 0xff, 0xff); evas_object_size_hint_min_set(object, 1, 0); evas_object_size_hint_padding_set(object, 1, 1, 1, 1); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(object); elm_box_pack_end(_top, object); #endif object = elm_button_add(_top); elm_object_text_set(object, right->text); evas_object_smart_callback_add(object, "clicked", right->cb.func, right->cb.data); evas_object_show(object); elm_box_pack_end(_top, object); _bottom = elm_button_add(parent); elm_object_text_set(_bottom, bottom->text); evas_object_smart_callback_add(_bottom, "clicked", bottom->cb.func, bottom->cb.data); evas_object_show(_bottom); return eulogium_split_screen(parent, _top, _bottom); } static struct button_def but_maintanance_advanced = { .text = "ADVANCED", .cb = { .func = &_cb_eulogium_button, .data = NULL, .info = "advanced button pressed", }, .data = NULL, }; static struct button_def but_maintanance_buildplate = { .text = "BUILD- PLATE", .cb = { .func = &_cb_eulogium_button, .data = NULL, .info = "buildplate button pressed", }, .data = NULL, }; static struct button_def but_mat_change = { .text = "CHANGE", .cb = { .func = &_cb_eulogium_button, .data = NULL, .info = "material change button pressed", }, .data = NULL, }; static struct button_def but_mat_settings = { .text = "SETTINGS", .cb = { .func = &_cb_eulogium_button, .data = NULL, .info = "settings button pressed", }, .data = NULL, }; static void _eulogium_button_main_mat_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; Evas_Object *content; content = eulogium_tripple_button_menu(eulogium->layout, &but_mat_change, &but_mat_settings, &but_return); if (!content) return; elm_naviframe_item_simple_push(eulogium->layout, content); } static void _eulogium_button_main_maintanance_cb(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; Evas_Object *content; content = eulogium_tripple_button_menu(eulogium->layout, &but_maintanance_buildplate, &but_maintanance_advanced, &but_return); if (!content) return; elm_naviframe_item_simple_push(eulogium->layout, content); } static void _cb_button_main_print(void *data, Evas_Object *object EINA_UNUSED, void *event_info EINA_UNUSED) { struct eulogium_data *eulogium = data; Evas_Object *content; /* TODO: add intermediate window to list drive/youmagine */ content = eulogium_print_menu(eulogium, "/home/oliver"); /* TODO: replace later */ if (!content) return; elm_naviframe_item_simple_push(eulogium->layout, content); } /* Buttons */ static struct button_def but_main_print = { .text = "PRINT", .cb = { .func = &_cb_button_main_print, .data = NULL, .info = "print button pressed", }, .data = NULL, }; static struct button_def but_main_material = { .text = "MATERIAL", .cb = { .func = &_eulogium_button_main_mat_cb, .data = NULL, .info = "material button pressed", }, .data = NULL, }; static struct button_def but_main_maintanance = { .text = "MAINTENANCE", .cb = { .func = &_eulogium_button_main_maintanance_cb, .data = NULL, .info = "maintenance button pressed", }, .data = NULL, }; static struct multi_text txtdata = { .text = { "Welcome
" "to your new Ultimaker", "Level the bed!", "Lets Print!", NULL, /* SENTINEL */ }, }; Evas_Object *eulogium_main_menu(Evas_Object *window, struct eulogium_data *eulogium) { Evas_Object *content; eulogium->layout = elm_naviframe_add(window); if (!eulogium->layout) return NULL; elm_naviframe_prev_btn_auto_pushed_set(eulogium->layout, EINA_FALSE); // elm_naviframe_item_title_enabled_set(eulogium->layout, EINA_TRUE, EINA_TRUE); // elm_naviframe_item_title_visible_set(eulogium->layout, EINA_FALSE); content = eulogium_tripple_button_menu(eulogium->layout, &but_main_print, &but_main_material, &but_main_maintanance); if (!content) return NULL; elm_naviframe_item_simple_push(eulogium->layout, content); // if (firstrunwiz) { content = eulogium_multi_text_menu(eulogium, eulogium->layout, NULL, &txtdata, 0, EINA_TRUE); if (!content) return NULL; elm_naviframe_item_simple_push(eulogium->layout, content); return eulogium->layout; } static void eulogium_setup(struct eulogium_data *eulogium) { /* XXX this is very ugly */ txtdata.count = 0; while (txtdata.text[txtdata.count]) txtdata.count++; eulogium->print.name = NULL; eulogium->print.file = NULL; eulogium->print.progress = NULL; eulogium->print.time = NULL; eulogium->print.status = NULL; eulogium->print.material = 0.0; eulogium_button_cb_data_set(&but_main_print, eulogium); eulogium_button_cb_data_set(&but_main_material, eulogium); eulogium_button_cb_data_set(&but_main_maintanance, eulogium); eulogium_button_cb_data_set(&but_mat_change, eulogium); eulogium_button_cb_data_set(&but_mat_settings, eulogium); eulogium_button_cb_data_set(&but_maintanance_buildplate, eulogium); eulogium_button_cb_data_set(&but_maintanance_advanced, eulogium); eulogium_button_cb_data_set(&but_return, eulogium); } EAPI_MAIN int elm_main(int argc, char **argv) { Eina_Bool quit_option = EINA_FALSE; static const Ecore_Getopt optdesc = { PACKAGE_NAME, "%prog [options]", PACKAGE_VERSION, COPYRIGHT, "Affero GPLv3", "eulogium program", 0, { ECORE_GETOPT_LICENSE('L', "license"), ECORE_GETOPT_COPYRIGHT('C', "copyright"), ECORE_GETOPT_VERSION('V', "version"), ECORE_GETOPT_HELP('h', "help"), ECORE_GETOPT_SENTINEL } }; Ecore_Getopt_Value values[] = { ECORE_GETOPT_VALUE_BOOL(quit_option), ECORE_GETOPT_VALUE_BOOL(quit_option), ECORE_GETOPT_VALUE_BOOL(quit_option), ECORE_GETOPT_VALUE_BOOL(quit_option), ECORE_GETOPT_VALUE_NONE }; int args; struct eulogium_data eulogium; Evas_Object *window, *object; // Evas_Object *splash_window; // Eina_List *engines, *l; args = ecore_getopt_parse(&optdesc, values, argc, argv); if (args < 0) { EINA_LOG_CRIT("Could not parse arguments."); return EXIT_FAILURE; } // elm_prefs_data_new(); /* TODO */ elm_policy_set(ELM_POLICY_QUIT, /* ELM_POLICY_QUIT_NONE */ ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR); elm_app_compile_lib_dir_set(PACKAGE_LIB_DIR); elm_app_compile_data_dir_set(PACKAGE_DATA_DIR); #if HAVE_GETTEXT && ENABLE_NLS elm_app_compile_locale_set(LOCALE_DIR); #endif #if ENABLE_NLS /* TODO Check for removal, elm_app_compile may solve this allready */ // setlocale(LC_ALL, ""); // bindtextdomain(PACKAGE, LOCALE_DIR); // bind_textdomain_codeset(PACKAGE, "UTF-8"); // textdomain(PACKAGE); #endif elm_app_info_set(NULL, PACKAGE, NULL); /* TODO */ #if (ELM_VERSION_MAJOR > 1) || (ELM_VERSION_MINOR >= 10) elm_config_accel_preference_set("accel"); #endif #if 0 /* TODO make icon */ icon = evas_object_image_add(evas_object_evas_get(win)); snprintf(buf, sizeof(buf), "%s/images/rage.png", elm_app_data_dir_get()); evas_object_image_file_set(o, buf, NULL); elm_win_icon_object_set(win, o); #endif elm_config_focus_highlight_enabled_set(EINA_TRUE); elm_config_focus_highlight_animate_set(EINA_TRUE); window = elm_win_add(NULL, PACKAGE_NAME, ELM_WIN_BASIC); if (!window) return EXIT_FAILURE; elm_win_title_set(window, PACKAGE_NAME); evas_object_resize(window, 128, 64); evas_object_repeat_events_set(window, EINA_TRUE); elm_win_autodel_set(window, EINA_TRUE); evas_object_smart_callback_add(window, "delete,request", _cb_eulogium_exit, NULL); evas_object_event_callback_add(window, EVAS_CALLBACK_RESIZE, _cb_eulogium_resize, NULL); object = elm_bg_add(window); if (!object) return EXIT_FAILURE; elm_bg_color_set(object, 0, 0, 0); evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_win_resize_object_add(window, object); evas_object_show(object); eulogium_setup(&eulogium); object = eulogium_main_menu(window, &eulogium); if (!object) return EXIT_FAILURE; evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_win_resize_object_add(window, object); evas_object_show(object); #if 0 /* Ideally we want to add the callbacks to the window. This currently does not work */ evas_object_event_callback_add(window, EVAS_CALLBACK_MOUSE_WHEEL, _cb_eulogium_input_wheel, NULL); #else /* HACK: draw a transparent rectangle over the entire window and capture events we are interested in */ object = evas_object_rectangle_add(evas_object_evas_get(window)); if (!object) return EXIT_FAILURE; evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_color_set(object, 0, 0, 0, 0); evas_object_repeat_events_set(object, EINA_TRUE); evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, _cb_eulogium_input_button, &eulogium); evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_WHEEL, _cb_eulogium_input_wheel, window); /* TODO: don't these two input events repeat/fall through, everything else, may/should. */ evas_object_show(object); elm_win_resize_object_add(window, object); #endif evas_object_show(window); elm_run(); elm_shutdown(); return EXIT_SUCCESS; } ELM_MAIN();