2 * Copyright (C) 2012 Samsung Electronics
3 * Copyright (C) 2012 Intel Corporation. All rights reserved.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include <Ecore_Evas.h>
26 static const int DEFAULT_WIDTH = 800;
27 static const int DEFAULT_HEIGHT = 600;
28 static const char DEFAULT_URL[] = "http://www.google.com/";
29 static const char APP_NAME[] = "EFL MiniBrowser";
31 #define info(format, args...) \
34 printf(format, ##args); \
37 static int verbose = 0;
39 typedef struct _MiniBrowser {
46 static Eina_Bool main_signal_exit(void *data, int ev_type, void *ev)
48 ecore_main_loop_quit();
52 static void closeWindow(Ecore_Evas *ee)
54 ecore_main_loop_quit();
57 static void on_ecore_evas_resize(Ecore_Evas *ee)
63 ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
65 bg = evas_object_name_find(ecore_evas_get(ee), "bg");
66 evas_object_move(bg, 0, 0);
67 evas_object_resize(bg, w, h);
69 webview = evas_object_name_find(ecore_evas_get(ee), "browser");
70 evas_object_move(webview, 0, 0);
71 evas_object_resize(webview, w, h);
75 on_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
77 Evas_Event_Key_Down *ev = (Evas_Event_Key_Down*) event_info;
78 static const char *encodings[] = {
83 static int currentEncoding = -1;
84 if (!strcmp(ev->key, "F1")) {
85 info("Back (F1) was pressed\n");
86 if (!ewk_view_back(obj))
87 info("Back ignored: No back history\n");
88 } else if (!strcmp(ev->key, "F2")) {
89 info("Forward (F2) was pressed\n");
90 if (!ewk_view_forward(obj))
91 info("Forward ignored: No forward history\n");
92 } else if (!strcmp(ev->key, "F3")) {
93 currentEncoding = (currentEncoding + 1) % (sizeof(encodings) / sizeof(encodings[0]));
94 info("Set encoding (F3) pressed. New encoding to %s", encodings[currentEncoding]);
95 ewk_view_custom_encoding_set(obj, encodings[currentEncoding]);
96 } else if (!strcmp(ev->key, "F5")) {
97 info("Reload (F5) was pressed, reloading.\n");
99 } else if (!strcmp(ev->key, "F6")) {
100 info("Stop (F6) was pressed, stop loading.\n");
106 title_set(Ecore_Evas *ee, const char *title, int progress)
110 if (!title || !*title) {
111 ecore_evas_title_set(ee, APP_NAME);
115 buffer = eina_strbuf_new();
117 eina_strbuf_append_printf(buffer, "%s (%d%%) - %s", title, progress, APP_NAME);
119 eina_strbuf_append_printf(buffer, "%s - %s", title, APP_NAME);
121 ecore_evas_title_set(ee, eina_strbuf_string_get(buffer));
122 eina_strbuf_free(buffer);
126 on_title_changed(void *user_data, Evas_Object *webview, void *event_info)
128 MiniBrowser *app = (MiniBrowser *)user_data;
129 const char *title = (const char *)event_info;
131 title_set(app->ee, title, 100);
135 on_progress(void *user_data, Evas_Object *webview, void *event_info)
137 MiniBrowser *app = (MiniBrowser *)user_data;
138 double progress = *(double *)event_info;
140 title_set(app->ee, ewk_view_title_get(app->browser), progress * 100);
144 on_error(void *user_data, Evas_Object *webview, void *event_info)
147 const Ewk_Web_Error *error = (const Ewk_Web_Error *)event_info;
149 buffer = eina_strbuf_new();
150 eina_strbuf_append_printf(buffer, "<html><body><div style=\"color:#ff0000\">ERROR!</div><br><div>Code: %d<br>Description: %s<br>URL: %s</div></body</html>",
151 ewk_web_error_code_get(error), ewk_web_error_description_get(error), ewk_web_error_url_get(error));
153 ewk_view_html_string_load(webview, eina_strbuf_string_get(buffer), 0, ewk_web_error_url_get(error));
154 eina_strbuf_free(buffer);
157 static MiniBrowser *browserCreate(const char *url)
159 MiniBrowser *app = malloc(sizeof(MiniBrowser));
161 app->ee = ecore_evas_new(0, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0);
163 ecore_evas_title_set(app->ee, APP_NAME);
164 ecore_evas_callback_resize_set(app->ee, on_ecore_evas_resize);
165 ecore_evas_borderless_set(app->ee, 0);
166 ecore_evas_show(app->ee);
167 ecore_evas_callback_delete_request_set(app->ee, closeWindow);
169 app->evas = ecore_evas_get(app->ee);
171 app->bg = evas_object_rectangle_add(app->evas);
172 evas_object_name_set(app->bg, "bg");
173 evas_object_size_hint_weight_set(app->bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
175 evas_object_move(app->bg, 0, 0);
176 evas_object_resize(app->bg, DEFAULT_WIDTH, DEFAULT_HEIGHT);
177 evas_object_color_set(app->bg, 255, 150, 150, 255);
178 evas_object_show(app->bg);
181 app->browser = ewk_view_add(app->evas);
182 ewk_view_theme_set(app->browser, THEME_DIR"/default.edj");
183 evas_object_name_set(app->browser, "browser");
185 evas_object_smart_callback_add(app->browser, "load,error", on_error, app);
186 evas_object_smart_callback_add(app->browser, "load,progress", on_progress, app);
187 evas_object_smart_callback_add(app->browser, "title,changed", on_title_changed, app);
189 evas_object_event_callback_add(app->browser, EVAS_CALLBACK_KEY_DOWN, on_key_down, app);
191 evas_object_size_hint_weight_set(app->browser, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
192 evas_object_resize(app->browser, DEFAULT_WIDTH, DEFAULT_HEIGHT);
193 evas_object_show(app->browser);
194 evas_object_focus_set(app->browser, EINA_TRUE);
196 ewk_view_url_set(app->browser, url);
201 int main(int argc, char *argv[])
214 MiniBrowser *browser = browserCreate(url);
216 Ecore_Event_Handler *handle = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, main_signal_exit, 0);
218 ecore_main_loop_begin();
220 ecore_event_handler_del(handle);
221 ecore_evas_free(browser->ee);