Add a simple GUI
[qi-bootmenu/guyou.git] / gui.c
blob588f97ad1ae763e48fafc9507ecc3741a41ab83f
1 #include <stdbool.h>
2 #include <Eina.h>
3 #include <Evas.h>
4 #include <Ecore.h>
5 #include <Ecore_Evas.h>
6 #include "config.h"
7 #include "kexec.h"
8 #include "util.h"
10 /* drawing related stuff */
11 static Ecore_Evas *ee;
12 static Evas *evas;
14 void poweroff(void *data, Evas *evas, Evas_Object *obj, void *event);
16 typedef struct {
17 const char *text;
18 const char *logo;
19 void(*callback)(void*, Evas*, Evas_Object*, void *);
20 } MenuItem;
22 MenuItem menu[] = {
23 { "Power Off", POWEROFF_LOGO, poweroff },
26 void poweroff(void *data, Evas *evas, Evas_Object *obj, void *event) {
27 system("poweroff");
30 static void bootitem_clicked(void *data, Evas *evas, Evas_Object *obj, void *event){
31 boot_kernel((BootItem*)data);
32 /* XXX: shouldn't be reached, display an error message? */
35 static bool canvas_init(){
36 if (!ecore_init() || !ecore_evas_init())
37 return false;
39 /* XXX: fixed dimensions */
40 if (getenv("DISPLAY"))
41 ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 480, 640);
42 else
43 ee = ecore_evas_fb_new(NULL, 0, 480, 640);
45 if (!ee)
46 return false;
48 ecore_evas_title_set(ee, APPNAME);
49 ecore_evas_borderless_set(ee, 0);
50 ecore_evas_show(ee);
52 evas = ecore_evas_get(ee);
53 evas_font_path_append(evas, FONT_PATH);
55 return true;
58 static int draw_item(const char *text, const char *logo, void(*callback)(void*, Evas*, Evas_Object*, void *),
59 void *data, int x, int y) {
61 Evas_Object *ebox, *elogo, *etext;
63 elogo = evas_object_image_add(evas);
64 evas_object_image_file_set(elogo, logo, NULL);
65 evas_object_image_fill_set(elogo, 0, 0, LOGO_WIDTH, LOGO_HEIGHT);
66 evas_object_resize(elogo, LOGO_WIDTH, LOGO_HEIGHT);
67 evas_object_show(elogo);
69 etext = evas_object_text_add(evas);
70 evas_object_text_font_set(etext, FONT, FONT_SIZE);
71 evas_object_text_text_set(etext, text);
72 evas_object_show(etext);
74 ebox = evas_object_box_add(evas);
75 evas_object_box_align_set(ebox, 0, 0.5);
76 evas_object_box_padding_set(ebox, 10, 10);
77 evas_object_move(ebox, x, y);
78 evas_object_resize(ebox, 680, 50);
79 evas_object_box_append(ebox, elogo);
80 evas_object_box_append(ebox, etext);
81 evas_object_event_callback_add(ebox, EVAS_CALLBACK_MOUSE_UP, callback, data);
83 evas_object_show(ebox);
85 return 0;
88 int gui(int argc, char **argv) {
90 if (!canvas_init()) {
91 eprint("Couldn't init GUI\n");
92 return 1;
95 /* search for system images to boot and display them in a list */
96 Eina_List *l, *systems = scan_system();
97 int i, y = 50;
98 BootItem *s;
100 EINA_LIST_FOREACH(systems, l, s) {
101 draw_item(s->dev, s->logo, bootitem_clicked, s, 10, y);
102 y += LOGO_HEIGHT + 10;
105 /* add pre defined menu entries */
106 for (i = 0; i < countof(menu); i++) {
107 draw_item(menu[i].text, menu[i].logo, menu[i].callback, NULL, 10, y);
108 y += LOGO_HEIGHT + 10;
111 ecore_main_loop_begin();
113 return 0;