1 /*
2 * gcc -o web_example_02 web_example_02.c `pkg-config --cflags --libs elementary ewebkit` -D_GNU_SOURCE
3 */
4 #ifndef _GNU_SOURCE
5 # define _GNU_SOURCE
6 #endif
7
8 #include <Elementary.h>
9 #ifdef HAVE_ELEMENTARY_WEB
10 #include <EWebKit.h>
11 #endif
12
13 typedef struct _Tab_Data Tab_Data;
14
15 typedef struct
16 {
17 Evas_Object *win;
18 Evas_Object *main_box;
19 Evas_Object *naviframe;
20 Evas_Object *url_entry;
21 Evas_Object *default_web;
22 Evas_Object *tabs;
23 Evas_Object *close_tab;
24 Evas_Object *search_box;
25 Evas_Object *search_entry;
26
27 struct {
28 Evas_Object *back;
29 Evas_Object *fwd;
30 Evas_Object *refresh;
31 } nav;
32
33 Tab_Data *current_tab;
34
35 Eina_Bool exiting : 1;
36 } App_Data;
37
38 struct _Tab_Data
39 {
40 Evas_Object *web;
41 App_Data *app;
42 Elm_Object_Item *tab;
43 };
44
45 static Evas_Object * _web_create_window_cb(void *data, Evas_Object *obj, Eina_Bool js, const Elm_Web_Window_Features *wf);
46
47 static void
nav_button_update(App_Data * ad)48 nav_button_update(App_Data *ad)
49 {
50 Eina_Bool back, fwd;
51
52 back = !elm_web_back_possible_get(ad->current_tab->web);
53 fwd = !elm_web_forward_possible_get(ad->current_tab->web);
54
55 elm_object_disabled_set(ad->nav.back, back);
56 elm_object_disabled_set(ad->nav.fwd, fwd);
57 }
58
59 static void
tab_current_set(Tab_Data * td)60 tab_current_set(Tab_Data *td)
61 {
62 const char *url;
63
64 if (td == td->app->current_tab)
65 return;
66
67 td->app->current_tab = td;
68
69 url = elm_web_url_get(td->web);
70 elm_object_text_set(td->app->url_entry, url);
71
72 nav_button_update(td->app);
73 elm_entry_icon_visible_set(td->app->url_entry, EINA_TRUE);
74
75 elm_naviframe_item_simple_promote(td->app->naviframe, td->web);
76 }
77
78 static void
_tab_clicked_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)79 _tab_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
80 {
81 Tab_Data *td = data;
82 /* the first toolbar_item_append() calls the select callback before the item
83 * is assigned, so we need a workaround for that. */
84 if (!td->tab)
85 td->tab = event_info;
86 tab_current_set(td);
87 }
88
89 static void
_title_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)90 _title_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
91 {
92 Tab_Data *td = data;
93 const char *title = event_info;
94 char buf[20] = "";
95
96 if (title)
97 strncpy(buf, title, sizeof(buf) - 1);
98 elm_object_item_text_set(td->tab, buf);
99 }
100
101 static void
_url_changed_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info)102 _url_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
103 {
104 Tab_Data *td = data;
105 const char *url = event_info;
106
107 if (td != td->app->current_tab)
108 return;
109
110 nav_button_update(td->app);
111 elm_object_text_set(td->app->url_entry, url);
112 }
113
114 static void
_web_free_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)115 _web_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
116 {
117 Tab_Data *td = data;
118
119 if (td->tab)
120 elm_object_item_del(td->tab);
121
122 free(td);
123 }
124
125 static void
_tb_item_del_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)126 _tb_item_del_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
127 {
128 Tab_Data *td = data;
129 if (!td->app->exiting && !elm_toolbar_selected_item_get(obj))
130 {
131 td->app->current_tab = NULL;
132 elm_entry_icon_visible_set(td->app->url_entry, EINA_FALSE);
133 if (td->app->search_box)
134 evas_object_del(td->app->search_box);
135 }
136 td->tab = NULL;
137 }
138
139 Tab_Data *
tab_add(App_Data * ad)140 tab_add(App_Data *ad)
141 {
142 Tab_Data *td;
143
144 td = calloc(1, sizeof(Tab_Data));
145 if (!td) return NULL;
146
147 td->web = elm_web_add(ad->win);
148 elm_web_window_create_hook_set(td->web, _web_create_window_cb, ad);
149 elm_web_inwin_mode_set(td->web, EINA_TRUE);
150 evas_object_size_hint_weight_set(td->web, EVAS_HINT_EXPAND,
151 EVAS_HINT_EXPAND);
152 evas_object_size_hint_align_set(td->web, EVAS_HINT_FILL, EVAS_HINT_FILL);
153 elm_naviframe_item_simple_push(ad->naviframe, td->web);
154
155 td->app = ad;
156 td->tab = elm_toolbar_item_append(td->app->tabs, NULL, "New tab",
157 _tab_clicked_cb, td);
158 elm_object_item_del_cb_set(td->tab, _tb_item_del_cb);
159
160 evas_object_data_set(td->web, "tab_data", td);
161
162 evas_object_smart_callback_add(td->web, "title,changed", _title_changed_cb,
163 td);
164 evas_object_smart_callback_add(td->web, "url,changed", _url_changed_cb, td);
165 evas_object_event_callback_add(td->web, EVAS_CALLBACK_FREE, _web_free_cb,
166 td);
167
168 elm_toolbar_item_selected_set(td->tab, EINA_TRUE);
169 return td;
170 }
171
172 static char *
url_sanitize(const char * url)173 url_sanitize(const char *url)
174 {
175 char *fixed_url;
176 char *schema;
177 char *tmp;
178
179 if (!url || !*url) return NULL;
180
181 tmp = strstr(url, "://");
182 if (!tmp || (tmp == url) || (tmp > (url + 15)))
183 {
184 char *new_url = NULL;
185 if (ecore_file_exists(url))
186 {
187 schema = "file";
188 new_url = ecore_file_realpath(url);
189 }
190 else
191 schema = "http";
192
193 if (asprintf(&fixed_url, "%s://%s", schema, new_url ? new_url : url) >
194 0)
195 {
196 free(new_url);
197 return fixed_url;
198 }
199 free(new_url);
200 }
201 else
202 return strdup(url);
203
204 return NULL;
205 }
206
207 static void
tab_url_set(Tab_Data * td,const char * url)208 tab_url_set(Tab_Data *td, const char *url)
209 {
210 char *sane_url = url_sanitize(url);
211 elm_web_url_set(td->web, sane_url);
212 free(sane_url);
213 }
214
215 static void
_url_entry_activated_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)216 _url_entry_activated_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
217 {
218 App_Data *ad = data;
219 Tab_Data *td;
220 const char *url = eina_stringshare_ref(elm_object_text_get(obj));
221
222 if (!ad->current_tab)
223 td = tab_add(ad);
224 else
225 td = ad->current_tab;
226 tab_url_set(td, url);
227 eina_stringshare_del(url);
228 }
229
230 static void
_nav_back_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)231 _nav_back_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
232 {
233 App_Data *ad = data;
234
235 elm_web_back(ad->current_tab->web);
236 }
237
238 static void
_nav_refresh_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)239 _nav_refresh_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
240 {
241 App_Data *ad = data;
242 const Evas_Modifier *mods = evas_key_modifier_get(evas_object_evas_get(obj));
243
244 if (evas_key_modifier_is_set(mods, "Shift"))
245 elm_web_reload_full(ad->current_tab->web);
246 else
247 elm_web_reload(ad->current_tab->web);
248 }
249
250 static void
_nav_fwd_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)251 _nav_fwd_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
252 {
253 App_Data *ad = data;
254
255 elm_web_forward(ad->current_tab->web);
256 }
257
258 static void
_close_tab_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)259 _close_tab_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
260 {
261 App_Data *ad = data;
262
263 if (!ad->current_tab)
264 return;
265 evas_object_del(ad->current_tab->web);
266 }
267
268 static void
_add_tab_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)269 _add_tab_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
270 {
271 App_Data *ad = data;
272 tab_add(ad);
273 elm_object_focus_set(ad->url_entry, EINA_TRUE);
274 }
275
276 static Evas_Object *
_web_create_window_cb(void * data,Evas_Object * obj EINA_UNUSED,Eina_Bool js EINA_UNUSED,const Elm_Web_Window_Features * wf EINA_UNUSED)277 _web_create_window_cb(void *data, Evas_Object *obj EINA_UNUSED,
278 Eina_Bool js EINA_UNUSED, const Elm_Web_Window_Features *wf EINA_UNUSED)
279 {
280 App_Data *ad = data;
281 Tab_Data *td;
282
283 td = tab_add(ad);
284 return td->web;
285 }
286
287 static void
_win_del_request_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)288 _win_del_request_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
289 {
290 App_Data *ad = data;
291 ad->exiting = EINA_TRUE;
292 }
293
294 static void
_win_free_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)295 _win_free_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
296 {
297 free(data);
298 }
299
300 static void
_search_entry_changed_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)301 _search_entry_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
302 {
303 App_Data *ad = data;
304 const char *text;
305
306 text = elm_object_text_get(obj);
307 elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
308 EINA_TRUE);
309 elm_web_text_matches_unmark_all(ad->current_tab->web);
310 elm_web_text_matches_mark(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
311 0);
312 }
313
314 static void
_search_entry_activate_cb(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)315 _search_entry_activate_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
316 {
317 App_Data *ad = data;
318 const char *text;
319
320 text = elm_object_text_get(obj);
321 elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
322 EINA_TRUE);
323 }
324
325 static void
_search_next_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)326 _search_next_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
327 {
328 App_Data *ad = data;
329 const char *text;
330
331 text = elm_object_text_get(ad->search_entry);
332 elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_TRUE,
333 EINA_TRUE);
334 }
335
336 static void
_search_prev_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)337 _search_prev_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
338 {
339 App_Data *ad = data;
340 const char *text;
341
342 text = elm_object_text_get(ad->search_entry);
343 elm_web_text_search(ad->current_tab->web, text, EINA_FALSE, EINA_FALSE,
344 EINA_TRUE);
345 }
346
347 static void
_search_close_cb(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)348 _search_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
349 {
350 App_Data *ad = data;
351 evas_object_del(ad->search_box);
352 }
353
354 static void
_search_box_del_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)355 _search_box_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
356 {
357 App_Data *ad = data;
358 ad->search_box = NULL;
359 ad->search_entry = NULL;
360 }
361
362 static void
_win_search_trigger_cb(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info)363 _win_search_trigger_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
364 {
365 Evas_Event_Key_Down *ev = event_info;
366 App_Data *ad = data;
367 Evas_Object *box, *box2, *entry, *btn, *ic;
368
369 if (strcmp(ev->keyname, "f") ||
370 !evas_key_modifier_is_set(ev->modifiers, "Control"))
371 return;
372 if (ad->search_box || !ad->current_tab)
373 return;
374
375 box = elm_box_add(ad->win);
376 elm_box_horizontal_set(box, EINA_TRUE);
377 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
378 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
379 elm_box_pack_after(ad->main_box, box, ad->url_entry);
380 evas_object_show(box);
381
382 evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, _search_box_del_cb,
383 ad);
384
385 entry = elm_entry_add(ad->win);
386 elm_entry_single_line_set(entry, EINA_TRUE);
387 elm_entry_scrollable_set(entry, EINA_TRUE);
388 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
389 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
390 elm_box_pack_end(box, entry);
391 evas_object_show(entry);
392
393 evas_object_smart_callback_add(entry, "changed", _search_entry_changed_cb,
394 ad);
395 evas_object_smart_callback_add(entry, "activated", _search_entry_activate_cb,
396 ad);
397
398 box2 = elm_box_add(ad->win);
399 elm_box_horizontal_set(box2, EINA_TRUE);
400 elm_object_part_content_set(entry, "end", box2);
401
402 btn = elm_button_add(ad->win);
403 elm_box_pack_end(box2, btn);
404 evas_object_show(btn);
405
406 ic = elm_icon_add(ad->win);
407 elm_icon_standard_set(ic, "arrow_up");
408 elm_object_part_content_set(btn, "icon", ic);
409
410 evas_object_smart_callback_add(btn, "clicked", _search_prev_cb, ad);
411
412 btn = elm_button_add(ad->win);
413 elm_box_pack_end(box2, btn);
414 evas_object_show(btn);
415
416 ic = elm_icon_add(ad->win);
417 elm_icon_standard_set(ic, "arrow_down");
418 elm_object_part_content_set(btn, "icon", ic);
419
420 evas_object_smart_callback_add(btn, "clicked", _search_next_cb, ad);
421
422 btn = elm_button_add(ad->win);
423 elm_box_pack_end(box, btn);
424 evas_object_show(btn);
425
426 ic = elm_icon_add(ad->win);
427 elm_icon_standard_set(ic, "close");
428 elm_object_part_content_set(btn, "icon", ic);
429
430 evas_object_smart_callback_add(btn, "clicked", _search_close_cb, ad);
431
432 ad->search_box = box;
433 ad->search_entry = entry;
434
435 elm_object_focus_set(entry, EINA_TRUE);
436 }
437
438 static void
default_content_set(Evas_Object * web)439 default_content_set(Evas_Object *web)
440 {
441 #ifdef HAVE_ELEMENTARY_WEB
442 Evas_Object *view, *frame;
443 const char contents[] = ""
444 "<html>\n"
445 " <head>\n"
446 " <title>Nothing to see here, move along</title>\n"
447 " </head>\n"
448 " <body>\n"
449 " <a href=\"http://www.enlightenment.org\" target=\"_blank\">E</a>\n"
450 " <br />\n"
451 " <a href=\"http://www.google.com\" target=\"_blank\">Google</a>\n"
452 " <br />\n"
453 " </body>\n"
454 "</html>\n";
455
456 view = elm_web_webkit_view_get(web);
457 frame = ewk_view_frame_main_get(view);
458 ewk_frame_contents_set(frame, contents, sizeof(contents) - 1, "text/html",
459 "UTF-8", NULL);
460 #else
461 (void) web;
462 #endif
463 }
464
465 EAPI_MAIN int
elm_main(int argc EINA_UNUSED,char ** argv EINA_UNUSED)466 elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
467 {
468 Evas_Object *win, *box, *box2, *btn, *ic, *url_bar, *naviframe, *tabs, *web;
469 Evas *e;
470 Evas_Modifier_Mask ctrl_mask;
471 App_Data *ad;
472
473 if (!elm_need_web())
474 return -1;
475
476 ad = calloc(1, sizeof(App_Data));
477 if (!ad) return -1;
478
479 elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
480
481 win = elm_win_util_standard_add("example-web", "Web Example");
482 elm_win_autodel_set(win, EINA_TRUE);
483
484 e = evas_object_evas_get(win);
485 ctrl_mask = evas_key_modifier_mask_get(e, "Control");
486 if (!evas_object_key_grab(win, "f", ctrl_mask, 0, EINA_TRUE))
487 fprintf(stderr, "Could not grab trigger for search dialog\n");
488
489 evas_object_smart_callback_add(win, "delete,request", _win_del_request_cb,
490 ad);
491 evas_object_event_callback_add(win, EVAS_CALLBACK_KEY_DOWN,
492 _win_search_trigger_cb, ad);
493 evas_object_event_callback_add(win, EVAS_CALLBACK_FREE, _win_free_cb, ad);
494
495 box = elm_box_add(win);
496 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
497 elm_win_resize_object_add(win, box);
498 evas_object_show(box);
499
500 url_bar = elm_entry_add(win);
501 elm_entry_single_line_set(url_bar, EINA_TRUE);
502 elm_entry_scrollable_set(url_bar, EINA_TRUE);
503 evas_object_size_hint_weight_set(url_bar, EVAS_HINT_EXPAND, 0.0);
504 evas_object_size_hint_align_set(url_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
505 elm_box_pack_end(box, url_bar);
506 evas_object_show(url_bar);
507
508 evas_object_smart_callback_add(url_bar, "activated", _url_entry_activated_cb, ad);
509
510 box2 = elm_box_add(win);
511 elm_box_horizontal_set(box2, EINA_TRUE);
512 elm_object_part_content_set(url_bar, "icon", box2);
513 elm_entry_icon_visible_set(url_bar, EINA_FALSE);
514
515 btn = elm_button_add(win);
516 elm_box_pack_end(box2, btn);
517 evas_object_show(btn);
518
519 ad->nav.back = btn;
520
521 ic = elm_icon_add(win);
522 elm_icon_standard_set(ic, "arrow_left");
523 elm_object_part_content_set(btn, "icon", ic);
524
525 evas_object_smart_callback_add(btn, "clicked", _nav_back_cb, ad);
526
527 btn = elm_button_add(win);
528 elm_box_pack_end(box2, btn);
529 evas_object_show(btn);
530
531 ad->nav.refresh = btn;
532
533 ic = elm_icon_add(win);
534 elm_icon_standard_set(ic, "refresh");
535 elm_object_part_content_set(btn, "icon", ic);
536
537 evas_object_smart_callback_add(btn, "clicked", _nav_refresh_cb, ad);
538
539 btn = elm_button_add(win);
540 elm_box_pack_end(box2, btn);
541 evas_object_show(btn);
542
543 ad->nav.fwd = btn;
544
545 ic = elm_icon_add(win);
546 elm_icon_standard_set(ic, "arrow_right");
547 elm_object_part_content_set(btn, "icon", ic);
548
549 evas_object_smart_callback_add(btn, "clicked", _nav_fwd_cb, ad);
550
551 box2 = elm_box_add(win);
552 elm_box_horizontal_set(box2, EINA_TRUE);
553 evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.0);
554 evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
555 elm_box_pack_end(box, box2);
556 evas_object_show(box2);
557
558 btn = elm_button_add(win);
559 elm_box_pack_end(box2, btn);
560 evas_object_show(btn);
561
562 ic = elm_icon_add(win);
563 elm_icon_standard_set(ic, "file");
564 elm_object_part_content_set(btn, "icon", ic);
565
566 evas_object_smart_callback_add(btn, "clicked", _add_tab_cb, ad);
567
568 tabs = elm_toolbar_add(win);
569 elm_toolbar_align_set(tabs, 0.0);
570 elm_toolbar_select_mode_set(tabs, ELM_OBJECT_SELECT_MODE_ALWAYS);
571 elm_toolbar_homogeneous_set(tabs, EINA_FALSE);
572 elm_toolbar_shrink_mode_set(tabs, ELM_TOOLBAR_SHRINK_MENU);
573 evas_object_size_hint_weight_set(tabs, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
574 evas_object_size_hint_align_set(tabs, EVAS_HINT_FILL, EVAS_HINT_FILL);
575 elm_box_pack_end(box2, tabs);
576 evas_object_show(tabs);
577
578 btn = elm_button_add(win);
579 elm_box_pack_end(box2, btn);
580 evas_object_show(btn);
581
582 evas_object_smart_callback_add(btn, "clicked", _close_tab_cb, ad);
583
584 ic = elm_icon_add(win);
585 elm_icon_standard_set(ic, "close");
586 elm_object_part_content_set(btn, "icon", ic);
587
588 naviframe = elm_naviframe_add(win);
589 evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
590 evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
591 elm_box_pack_end(box, naviframe);
592 evas_object_show(naviframe);
593
594 elm_toolbar_menu_parent_set(tabs, naviframe);
595
596 web = elm_web_add(win);
597 elm_web_window_create_hook_set(web, _web_create_window_cb, ad);
598 elm_web_history_enabled_set(web, EINA_FALSE);
599 evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
600 evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
601 elm_naviframe_item_simple_push(naviframe, web);
602
603 default_content_set(web);
604
605 ad->win = win;
606 ad->main_box = box;
607 ad->naviframe = naviframe;
608 ad->url_entry = url_bar;
609 ad->default_web = web;
610 ad->tabs = tabs;
611 ad->close_tab = btn;
612
613 evas_object_resize(win, 480, 640);
614 evas_object_show(win);
615
616 elm_run();
617
618 return 0;
619 }
620 ELM_MAIN()
621