Add static NAND Flash menu entry
[qi-bootmenu/guyou.git] / qi-bootmenu.c
blob991cc52c667b3446551a97f3cf8f33c654fac194
1 /*
2 * qi-bootmenu - A kexec based bootloader with an elementary based GUI
4 * Copyright (c) 2009-2010 Marc Andre Tanner <mat@brain-dump.org>
6 * qi-bootmenu shares the basic idea with kexecboot which is written by:
8 * Copyright (c) 2008-2009 Yuri Bushmelev <jay4mail@gmail.com>
9 * Copyright (c) 2008 Thomas Kunze <thommycheck@gmx.de>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2, or (at your option)
14 * any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
23 #include <stdbool.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <Eina.h>
27 #include <Evas.h>
28 #include <Ecore.h>
29 #include <Ecore_Evas.h>
31 #define countof(arr) (sizeof(arr) / sizeof((arr)[0]))
32 #define sstrlen(str) (sizeof(str) - 1)
34 static void eprint(const char *errstr, ...);
36 #ifdef NDEBUG
37 #define debug(format, args...)
38 #else
39 #define debug eprint
40 #endif
42 #define RGB(r, g, b) r,g,b
44 typedef struct {
45 const char *fs;
46 const char *dev;
47 const char *kernel;
48 const char *cmdline;
49 const char *logo;
50 } BootItem;
52 typedef struct {
53 const char *text;
54 const char *logo;
55 void(*callback)(void*, Evas*, Evas_Object*, void *);
56 void *data;
57 } MenuItem;
59 /* menu actions */
60 static void boot_nand(void *data, Evas *evas, Evas_Object *obj, void *event);
61 static void poweroff(void *data, Evas *evas, Evas_Object *obj, void *event);
63 /* drawing related stuff */
64 static Ecore_Evas *ee;
65 static Evas *evas;
67 typedef struct {
68 char option;
69 void(*show)(Eina_List *systems);
70 void(*select)(Evas_Object *item);
71 void(*error)(const char *errstr, va_list ap);
72 } Gui;
74 /* functions available to gui modules */
75 static void gui_bootitem_clicked(void *data, Evas *evas, Evas_Object *item, void *event);
76 static void gui_show_error(const char *errstr, ...);
78 #include "config.h"
80 /* will be used to search the kernel as in {u,z}Image-$MACHINE.bin */
81 static const char *machine = DEFAULT_MACHINE;
83 /* if no option is passed in then use the first entry */
84 static Gui *gui = &guis[0];
86 #include "kexec.c"
87 #include "gui.c"
89 static void eprint(const char *errstr, ...) {
90 va_list ap;
91 va_start(ap, errstr);
92 vfprintf(stderr, errstr, ap);
93 va_end(ap);
96 static void usage() {
97 eprint("usage: qi-bootmenu [-d] [-m ...] [-i ...]\n");
98 exit(1);
101 int main(int argc, char **argv) {
103 Eina_List *dev_ignore = NULL; /* partitions to ignore */
104 bool diag = false;
105 int arg;
106 unsigned int g;
108 if (!eina_init())
109 return 1;
111 for (arg = 1; arg < argc; arg++) {
112 if (argv[arg][0] != '-')
113 usage();
115 switch (argv[arg][1]) {
116 case 'd':
117 diag = true;
118 break;
119 case 'm':
120 if (arg + 1 >= argc)
121 usage();
122 machine = argv[++arg];
123 break;
124 case 'i':
125 if (arg + 1 >= argc)
126 usage();
127 dev_ignore = eina_list_append(dev_ignore, argv[++arg]);
128 break;
129 default:
130 for (g = 0; g < countof(guis); g++) {
131 if (argv[arg][1] == guis[g].option)
132 gui = &guis[g];
134 break;
138 if (diag) {
139 gui->error = NULL;
140 diagnostics(dev_ignore);
141 return 0;
144 if (!gui_init()) {
145 eprint("Couldn't init GUI\n");
146 return 1;
149 /* search for system images to boot and display them */
150 gui->show(scan_system(dev_ignore));
152 debug("entering main loop\n");
154 ecore_main_loop_begin();
156 return 0;