@@ -29,6 +29,8 @@ static const int DEFAULT_WIDTH = 800;
2929static const int DEFAULT_HEIGHT = 600 ;
3030static const char DEFAULT_URL [] = "http://www.google.com/" ;
3131static const char APP_NAME [] = "EFL MiniBrowser" ;
32+ static const int TOOL_BAR_ICON_SIZE = 24 ;
33+ static const int TOOL_BAR_BUTTON_SIZE = 32 ;
3234
3335#define info (format , args ...) \
3436 do { \
@@ -45,6 +47,8 @@ typedef struct _Browser_Window {
4547 Evas_Object * window ;
4648 Evas_Object * webview ;
4749 Evas_Object * url_bar ;
50+ Evas_Object * back_button ;
51+ Evas_Object * forward_button ;
4852} Browser_Window ;
4953
5054static const Ecore_Getopt options = {
@@ -205,6 +209,16 @@ on_url_changed(void *user_data, Evas_Object *webview, void *event_info)
205209 elm_entry_entry_set (window -> url_bar , ewk_view_url_get (window -> webview ));
206210}
207211
212+ static void
213+ on_back_forward_list_changed (void * user_data , Evas_Object * webview , void * event_info )
214+ {
215+ Browser_Window * window = (Browser_Window * )user_data ;
216+
217+ /* Update navigation buttons state */
218+ elm_object_disabled_set (window -> back_button , !ewk_view_back_possible (webview ));
219+ elm_object_disabled_set (window -> forward_button , !ewk_view_forward_possible (webview ));
220+ }
221+
208222static void
209223on_new_window (void * user_data , Evas_Object * webview , void * event_info )
210224{
@@ -322,12 +336,72 @@ on_url_bar_clicked(void *user_data, Evas_Object *url_bar, void *event_info)
322336 elm_object_focus_set (url_bar , EINA_TRUE );
323337}
324338
339+ static void
340+ on_back_button_clicked (void * user_data , Evas_Object * back_button , void * event_info )
341+ {
342+ Browser_Window * app_data = (Browser_Window * )user_data ;
343+
344+ ewk_view_back (app_data -> webview );
345+ /* Update back button state */
346+ elm_object_disabled_set (back_button , !ewk_view_back_possible (app_data -> webview ));
347+ }
348+
349+ static void
350+ on_forward_button_clicked (void * user_data , Evas_Object * forward_button , void * event_info )
351+ {
352+ Browser_Window * app_data = (Browser_Window * )user_data ;
353+
354+ ewk_view_forward (app_data -> webview );
355+ /* Update forward button state */
356+ elm_object_disabled_set (forward_button , !ewk_view_forward_possible (app_data -> webview ));
357+ }
358+
359+ static void
360+ on_refresh_button_clicked (void * user_data , Evas_Object * refresh_button , void * event_info )
361+ {
362+ Browser_Window * app_data = (Browser_Window * )user_data ;
363+
364+ Evas * evas = evas_object_evas_get (refresh_button );
365+ Eina_Bool ctrlPressed = evas_key_modifier_is_set (evas_key_modifier_get (evas ), "Control" );
366+ if (ctrlPressed ) {
367+ info ("Reloading and bypassing cache...\n" );
368+ ewk_view_reload_bypass_cache (app_data -> webview );
369+ } else {
370+ info ("Reloading...\n" );
371+ ewk_view_reload (app_data -> webview );
372+ }
373+ }
374+
375+ static void
376+ on_home_button_clicked (void * user_data , Evas_Object * home_button , void * event_info )
377+ {
378+ Browser_Window * app_data = (Browser_Window * )user_data ;
379+
380+ ewk_view_url_set (app_data -> webview , DEFAULT_URL );
381+ }
382+
325383static void
326384on_window_deletion (void * user_data , Evas_Object * window , void * event_info )
327385{
328386 window_close (browser_window_find (window ));
329387}
330388
389+ static Evas_Object *
390+ create_toolbar_button (Evas_Object * window , const char * icon_name )
391+ {
392+ Evas_Object * button = elm_button_add (window );
393+
394+ Evas_Object * icon = elm_icon_add (window );
395+ elm_icon_standard_set (icon , icon_name );
396+ evas_object_size_hint_max_set (icon , TOOL_BAR_ICON_SIZE , TOOL_BAR_ICON_SIZE );
397+ evas_object_color_set (icon , 44 , 44 , 102 , 128 );
398+ evas_object_show (icon );
399+ elm_object_part_content_set (button , "icon" , icon );
400+ evas_object_size_hint_min_set (button , TOOL_BAR_BUTTON_SIZE , TOOL_BAR_BUTTON_SIZE );
401+
402+ return button ;
403+ }
404+
331405static Browser_Window * window_create (const char * url )
332406{
333407 Browser_Window * app_data = malloc (sizeof (Browser_Window ));
@@ -337,28 +411,79 @@ static Browser_Window *window_create(const char *url)
337411 }
338412
339413 /* Create window */
340- app_data -> window = elm_win_util_standard_add ("minibrowser-window" , APP_NAME );
414+ app_data -> window = elm_win_add (NULL , "minibrowser-window" , ELM_WIN_BASIC );
415+ elm_win_title_set (app_data -> window , APP_NAME );
341416 evas_object_smart_callback_add (app_data -> window , "delete,request" , on_window_deletion , & app_data );
342417
418+ /* Create window background */
419+ Evas_Object * bg = elm_bg_add (app_data -> window );
420+ elm_bg_color_set (bg , 193 , 192 , 191 );
421+ evas_object_size_hint_weight_set (bg , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND );
422+ elm_win_resize_object_add (app_data -> window , bg );
423+ evas_object_show (bg );
424+
343425 /* Create vertical layout */
344426 Evas_Object * vertical_layout = elm_box_add (app_data -> window );
345427 elm_box_padding_set (vertical_layout , 0 , 2 );
346428 evas_object_size_hint_weight_set (vertical_layout , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND );
347429 elm_win_resize_object_add (app_data -> window , vertical_layout );
348430 evas_object_show (vertical_layout );
349431
432+ /* Create horizontal layout for top bar */
433+ Evas_Object * horizontal_layout = elm_box_add (app_data -> window );
434+ elm_box_horizontal_set (horizontal_layout , EINA_TRUE );
435+ evas_object_size_hint_weight_set (horizontal_layout , EVAS_HINT_EXPAND , 0.0 );
436+ evas_object_size_hint_align_set (horizontal_layout , EVAS_HINT_FILL , 0.0 );
437+ elm_box_pack_end (vertical_layout , horizontal_layout );
438+ evas_object_show (horizontal_layout );
439+
440+ /* Create Back button */
441+ app_data -> back_button = create_toolbar_button (app_data -> window , "arrow_left" );
442+ evas_object_smart_callback_add (app_data -> back_button , "clicked" , on_back_button_clicked , app_data );
443+ elm_object_disabled_set (app_data -> back_button , EINA_TRUE );
444+ evas_object_size_hint_weight_set (app_data -> back_button , 0.0 , EVAS_HINT_EXPAND );
445+ evas_object_size_hint_align_set (app_data -> back_button , 0.0 , 0.5 );
446+ elm_box_pack_end (horizontal_layout , app_data -> back_button );
447+ evas_object_show (app_data -> back_button );
448+
449+ /* Create Forward button */
450+ app_data -> forward_button = create_toolbar_button (app_data -> window , "arrow_right" );
451+ evas_object_smart_callback_add (app_data -> forward_button , "clicked" , on_forward_button_clicked , app_data );
452+ elm_object_disabled_set (app_data -> forward_button , EINA_TRUE );
453+ evas_object_size_hint_weight_set (app_data -> forward_button , 0.0 , EVAS_HINT_EXPAND );
454+ evas_object_size_hint_align_set (app_data -> forward_button , 0.0 , 0.5 );
455+ elm_box_pack_end (horizontal_layout , app_data -> forward_button );
456+ evas_object_show (app_data -> forward_button );
457+
350458 /* Create URL bar */
351459 app_data -> url_bar = elm_entry_add (app_data -> window );
460+ elm_entry_scrollable_set (app_data -> url_bar , EINA_TRUE );
352461 elm_entry_single_line_set (app_data -> url_bar , EINA_TRUE );
353462 elm_entry_cnp_mode_set (app_data -> url_bar , ELM_CNP_MODE_PLAINTEXT );
354- elm_entry_text_style_user_push (app_data -> url_bar , "DEFAULT='font_size=16 '" );
463+ elm_entry_text_style_user_push (app_data -> url_bar , "DEFAULT='font_size=18 '" );
355464 evas_object_smart_callback_add (app_data -> url_bar , "activated" , on_url_bar_activated , app_data );
356465 evas_object_smart_callback_add (app_data -> url_bar , "clicked" , on_url_bar_clicked , app_data );
357- evas_object_size_hint_weight_set (app_data -> url_bar , EVAS_HINT_EXPAND , 0.0 );
358- evas_object_size_hint_align_set (app_data -> url_bar , EVAS_HINT_FILL , 0.0 );
359- elm_box_pack_end (vertical_layout , app_data -> url_bar );
466+ evas_object_size_hint_weight_set (app_data -> url_bar , EVAS_HINT_EXPAND , EVAS_HINT_EXPAND );
467+ evas_object_size_hint_align_set (app_data -> url_bar , EVAS_HINT_FILL , EVAS_HINT_FILL );
468+ elm_box_pack_end (horizontal_layout , app_data -> url_bar );
360469 evas_object_show (app_data -> url_bar );
361470
471+ /* Create Refresh button */
472+ Evas_Object * refresh_button = create_toolbar_button (app_data -> window , "refresh" );
473+ evas_object_smart_callback_add (refresh_button , "clicked" , on_refresh_button_clicked , app_data );
474+ evas_object_size_hint_weight_set (refresh_button , 0.0 , EVAS_HINT_EXPAND );
475+ evas_object_size_hint_align_set (refresh_button , 1.0 , 0.5 );
476+ elm_box_pack_end (horizontal_layout , refresh_button );
477+ evas_object_show (refresh_button );
478+
479+ /* Create Home button */
480+ Evas_Object * home_button = create_toolbar_button (app_data -> window , "home" );
481+ evas_object_smart_callback_add (home_button , "clicked" , on_home_button_clicked , app_data );
482+ evas_object_size_hint_weight_set (home_button , 0.0 , EVAS_HINT_EXPAND );
483+ evas_object_size_hint_align_set (home_button , 1.0 , 0.5 );
484+ elm_box_pack_end (horizontal_layout , home_button );
485+ evas_object_show (home_button );
486+
362487 /* Create webview */
363488 Evas * evas = evas_object_evas_get (app_data -> window );
364489 app_data -> webview = ewk_view_add (evas );
@@ -377,6 +502,7 @@ static Browser_Window *window_create(const char *url)
377502 evas_object_smart_callback_add (app_data -> webview , "load,progress" , on_progress , app_data );
378503 evas_object_smart_callback_add (app_data -> webview , "title,changed" , on_title_changed , app_data );
379504 evas_object_smart_callback_add (app_data -> webview , "url,changed" , on_url_changed , app_data );
505+ evas_object_smart_callback_add (app_data -> webview , "back,forward,list,changed" , on_back_forward_list_changed , app_data );
380506
381507 evas_object_event_callback_add (app_data -> webview , EVAS_CALLBACK_KEY_DOWN , on_key_down , app_data );
382508 evas_object_event_callback_add (app_data -> webview , EVAS_CALLBACK_MOUSE_DOWN , on_mouse_down , app_data );
0 commit comments