1 #include <clutter/clutter.h>
3 #include "web-browser-mozilla.h"
6 # include "clutter-mozembed.h"
8 # include <tidy/tidy.h>
9 # include <webkit/webkit.h>
10 # include "scroll-frame.h"
11 # include "popup-factory.h"
15 tabs_cb (ClutterActor *button,
19 G_DEFINE_TYPE (MmBrowser, mm_browser, CLUTTER_TYPE_GROUP)
20 #define BROWSER_PRIVATE(o) \
21 (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_BROWSER, MmBrowserPrivate))
23 typedef struct _MmBrowserPage
27 ClutterActor *overlay;
29 ClutterActor *popup_menu;
32 PopupFactory *factory;
35 WebkitAdjustment *hadj, *vadj;
46 struct _MmBrowserPrivate
48 ClutterTimeline *fade_timeline;
49 ClutterTimeline *scale_timeline;
50 ClutterTimeline *scroll_timeline;
51 ClutterTimeline *move_timeline;
53 ClutterActor *toolbar, *toolbar_bg;
54 ClutterActor *tab_control;
55 ClutterActor *new_tab;
56 ClutterActor *prev_tab;
57 ClutterActor *next_tab;
59 ClutterActor *next_prev_group;
62 ClutterActor *forward;
65 ClutterActor *progress;
67 ClutterActor *page_group;
72 gboolean showing_tabs;
73 gboolean maybe_scroll;
80 #define WEB_HEIGHT 480
85 mm_browser_finalize (GObject *object)
87 G_OBJECT_CLASS (mm_browser_parent_class)->finalize (object);
91 mm_browser_dispose (GObject *object)
93 G_OBJECT_CLASS (mm_browser_parent_class)->dispose (object);
97 mm_browser_class_init (MmBrowserClass *klass)
99 GObjectClass *o_class = (GObjectClass *) klass;
100 ClutterActorClass *a_class = (ClutterActorClass *) klass;
102 g_type_class_add_private (klass, sizeof (MmBrowserPrivate));
104 o_class->finalize = mm_browser_finalize;
105 o_class->dispose = mm_browser_dispose;
109 set_back_and_forward (MmBrowser *browser)
111 MmBrowserPrivate *priv = browser->priv;
115 page = priv->current_page->data;
118 if (clutter_mozembed_can_go_back (CLUTTER_MOZEMBED (page->web))) {
120 if (webkit_web_view_can_go_back (page->view)) {
122 clutter_actor_animate (priv->back, CLUTTER_LINEAR, 500,
123 "opacity", 0xff, NULL);
125 clutter_actor_animate (priv->back, CLUTTER_LINEAR, 500,
126 "opacity", 0x55, NULL);
130 if (clutter_mozembed_can_go_forward (CLUTTER_MOZEMBED (page->web))) {
132 if (webkit_web_view_can_go_forward (page->view)) {
134 clutter_actor_animate (priv->forward, CLUTTER_LINEAR, 500,
135 "opacity", 0xff, NULL);
137 clutter_actor_animate (priv->forward, CLUTTER_LINEAR, 500,
138 "opacity", 0x55, NULL);
143 load_started_cb (MmBrowser *browser)
145 MmBrowserPrivate *priv = browser->priv;
148 clutter_actor_animate (priv->progress, CLUTTER_LINEAR, 500,
149 "opacity", 0xff, NULL);
154 load_finished_cb (MmBrowser *browser,
155 ClutterMozEmbed *mozembed)
158 load_finished_cb (MmBrowser *browser,
159 WebKitWebFrame *frame,
160 WebKitWebView *web_view)
163 MmBrowserPrivate *priv = browser->priv;
164 const gchar *location;
168 clutter_actor_animate (priv->progress, CLUTTER_LINEAR, 500,
169 "opacity", 0x00, NULL);
172 location = clutter_mozembed_get_location (mozembed);
174 location = webkit_web_frame_get_uri (frame);
177 clutter_text_set_text (CLUTTER_TEXT (priv->entry), location);
178 page = priv->current_page->data;
180 g_free (page->address);
181 page->address = g_strdup (location);
183 set_back_and_forward (browser);
187 web_event_capture_cb (ClutterActor *actor,
191 MmBrowser *browser = page->browser;
192 MmBrowserPrivate *priv = browser->priv;
194 switch (event->type) {
195 case CLUTTER_BUTTON_PRESS:
196 if (priv->showing_tabs == TRUE)
198 tabs_cb (NULL, NULL, browser);
204 case CLUTTER_BUTTON_RELEASE:
209 if (priv->maybe_scroll == TRUE) {
210 ClutterMotionEvent *mev = (ClutterMotionEvent *) event;
211 int dx = mev->x - page->start_x;
212 int dy = mev->y - page->start_y;
214 gtk_adjustment_set_value (page->hscroll,
215 MIN (page->hscroll->value - dx,
216 page->hscroll->upper - WEB_WIDTH));
217 gtk_adjustment_set_value (page->vscroll,
218 MIN (page->vscroll->value - dy,
219 page->vscroll->upper - WEB_HEIGHT));
221 page->start_x = mev->x;
222 page->start_y = mev->y;
232 /* Let the actor handle all the other events */
241 hovering_over_link_cb (WebKitWebView *view,
242 const char *string1, /* What is this string? */
246 if (string1 == NULL && url == NULL) {
247 page->over_link = FALSE;
249 page->over_link = TRUE;
254 show_popup_menu (WebKitPopupFactory *factory,
257 MmBrowserPrivate *priv = browser->priv;
260 page = priv->current_page->data;
261 clutter_actor_raise_top (page->popup_menu);
262 clutter_actor_show_all (page->popup_menu);
266 hide_popup_menu (WebKitPopupFactory *factory,
269 MmBrowserPrivate *priv = browser->priv;
272 page = priv->current_page->data;
273 clutter_actor_hide (page->popup_menu);
277 popup_button_release_cb (ClutterActor *actor,
278 ClutterButtonEvent *event,
281 MmBrowserPrivate *priv = browser->priv;
284 page = priv->current_page->data;
286 if ((ABS (event->x - priv->popup_x) < JITTER) &&
287 (ABS (event->y - priv->popup_y) < JITTER)) {
290 row = tidy_list_view_get_row_at_pos (TIDY_LIST_VIEW (page->factory),
296 webkit_popup_factory_activate (WEBKIT_POPUP_FACTORY (page->factory), row);
297 webkit_popup_factory_close (WEBKIT_POPUP_FACTORY (page->factory));
305 popup_button_press_cb (ClutterActor *actor,
306 ClutterButtonEvent *event,
309 MmBrowserPrivate *priv = browser->priv;
311 if (event->button != 1) {
315 priv->popup_x = event->x;
316 priv->popup_y = event->y;
322 create_popup_factory (MmBrowser *browser,
325 MmBrowserPrivate *priv = browser->priv;
326 ClutterActor *bground, *scroll;
327 ClutterColor black = {0xbb, 0xbb, 0xbb, 0xdd};
329 page->popup_menu = clutter_group_new ();
331 bground = clutter_rectangle_new_with_color (&black);
332 clutter_container_add_actor (CLUTTER_CONTAINER (page->popup_menu), bground);
333 clutter_actor_set_size (bground, WEB_WIDTH, 125);
334 clutter_actor_show (bground);
336 page->factory = g_object_new (POPUP_TYPE_FACTORY,
338 "show-headers", FALSE,
340 tidy_stylable_set_style (TIDY_STYLABLE (page->factory), tidy_style_new ());
341 tidy_stylable_set (TIDY_STYLABLE (page->factory),
342 "font-name", "Impact 20", NULL);
344 g_signal_connect (page->factory, "show-menu",
345 G_CALLBACK (show_popup_menu), browser);
346 g_signal_connect (page->factory, "hide-menu",
347 G_CALLBACK (hide_popup_menu), browser);
348 g_signal_connect (page->factory, "button-press-event",
349 G_CALLBACK (popup_button_press_cb), browser);
350 g_signal_connect (page->factory, "button-release-event",
351 G_CALLBACK (popup_button_release_cb), browser);
352 webkit_web_view_set_popup_factory (page->view, WEBKIT_POPUP_FACTORY (page->factory));
353 clutter_actor_set_size (CLUTTER_ACTOR (page->factory), WEB_WIDTH, 125);
354 clutter_actor_show (CLUTTER_ACTOR (page->factory));
356 scroll = tidy_finger_scroll_new (TIDY_FINGER_SCROLL_MODE_KINETIC);
357 clutter_container_add_actor (CLUTTER_CONTAINER (page->popup_menu), scroll);
358 clutter_container_add_actor (CLUTTER_CONTAINER (scroll),
359 CLUTTER_ACTOR (page->factory));
360 clutter_actor_set_size (scroll, WEB_WIDTH, 125);
362 clutter_actor_set_position (page->popup_menu, 0, WEB_HEIGHT - 125);
363 clutter_container_add_actor (CLUTTER_CONTAINER (clutter_stage_get_default ()),
366 clutter_actor_show_all (scroll);
370 page_start_editing_cb (WebkitActor *actor,
373 MmBrowserPrivate *priv = browser->priv;
377 page = priv->current_page->data;
379 webkit_web_view_zoom_to_selected_node (page->view);
383 page_stop_editing_cb (WebkitActor *actor,
386 MmBrowserPrivate *priv = browser->priv;
390 page = priv->current_page->data;
392 webkit_web_view_zoom_to_default (page->view);
397 add_new_page (MmBrowser *browser)
399 MmBrowserPrivate *priv = browser->priv;
403 page = g_new (MmBrowserPage, 1);
404 page->address = NULL;
405 page->browser = browser;
408 page->scroll = page->web = clutter_mozembed_new ();
409 clutter_actor_set_size (page->web, WEB_WIDTH, WEB_HEIGHT);
410 clutter_mozembed_open (CLUTTER_MOZEMBED (page->web), "about:blank");
411 g_signal_connect_swapped (page->web, "net-start",
412 G_CALLBACK (load_started_cb), browser);
413 g_signal_connect_swapped (page->web, "net-stop",
414 G_CALLBACK (load_finished_cb), browser);
416 page->hadj = webkit_adjustment_new (0,0,0,0,0,0);
417 page->vadj = webkit_adjustment_new (0,0,0,0,0,0);
419 page->web = webkit_web_view_new (WEB_WIDTH, WEB_HEIGHT);
420 webkit_web_view_set_scroll_adjustments (WEBKIT_WEB_VIEW (page->web),
421 page->hadj, page->vadj);
423 clutter_actor_set_reactive (page->web, TRUE);
424 clutter_actor_set_size (page->web, WEB_WIDTH, WEB_HEIGHT);
425 g_signal_connect (page->web, "captured-event",
426 G_CALLBACK (webkit_event_capture_cb), page);
427 page->view = WEBKIT_WEB_VIEW (page->web);
428 clutter_actor_show (page->web);
430 frame = g_object_new (SCROLL_TYPE_FRAME, NULL);
431 /* clutter_actor_set_size (frame, WEB_WIDTH, WEB_HEIGHT); */
432 clutter_actor_show (frame);
434 scroll_frame_add_webkit (SCROLL_FRAME (frame), page->view);
436 page->scroll = tidy_finger_scroll_new (TIDY_FINGER_SCROLL_MODE_KINETIC);
437 tidy_stylable_set_style (TIDY_STYLABLE (page->scroll), tidy_style_new ());
438 tidy_stylable_set (TIDY_STYLABLE (page->scroll),
439 "xthickness", 5, "ythickness", 5, NULL);
440 clutter_actor_set_size (page->scroll, WEB_WIDTH, WEB_HEIGHT);
441 clutter_container_add_actor (CLUTTER_CONTAINER (page->scroll), frame);
443 webkit_web_view_open (page->view, "about:blank");
444 g_signal_connect_swapped (page->view, "load-started",
445 G_CALLBACK (load_started_cb), browser);
446 g_signal_connect_swapped (page->view, "load-finished",
447 G_CALLBACK (load_finished_cb), browser);
448 g_signal_connect (page->view, "hovering-over-link",
449 G_CALLBACK (hovering_over_link_cb), page);
450 g_signal_connect (page->view, "start-editing",
451 G_CALLBACK (page_start_editing_cb), browser);
452 g_signal_connect (page->view, "stop-editing",
453 G_CALLBACK (page_stop_editing_cb), browser);
455 create_popup_factory (browser, page);
458 clutter_actor_set_anchor_point_from_gravity (page->scroll,
459 CLUTTER_GRAVITY_CENTER);
460 clutter_actor_set_position (page->scroll, WEB_WIDTH / 2, WEB_HEIGHT / 2);
462 clutter_container_add_actor (CLUTTER_CONTAINER (priv->page_group),
465 priv->pages = g_list_append (priv->pages, page);
467 /* Fixme...obviously */
468 priv->current_page = g_list_last (priv->pages);
471 static ClutterActor *
472 make_button (const char *image)
474 return clutter_texture_new_from_file (image, NULL);
479 key_release_cb (ClutterEntry *entry,
483 if (event->type == CLUTTER_KEY_RELEASE) {
484 ClutterKeyEvent *kev = (ClutterKeyEvent *) event;
486 clutter_entry_handle_key_event (CLUTTER_ENTRY (browser->priv->entry), kev);
491 entry_activated_cb (ClutterText *entry,
494 ClutterActor *stage = clutter_stage_get_default ();
495 MmBrowserPrivate *priv = browser->priv;
496 char *address = g_strdup (clutter_text_get_text (entry));
499 mm_browser_open (browser, address);
501 page = priv->current_page->data;
502 clutter_stage_set_key_focus (CLUTTER_STAGE (stage), page->web);
507 entry_clicked_cb (ClutterActor *actor,
508 ClutterButtonEvent *event,
511 ClutterActor *stage = clutter_stage_get_default ();
512 MmBrowserPrivate *priv = browser->priv;
514 clutter_stage_set_key_focus (CLUTTER_STAGE (stage), priv->entry);
520 back_cb (ClutterActor *button,
524 MmBrowserPrivate *priv = browser->priv;
527 if (priv->showing_tabs == TRUE)
531 page = priv->current_page->data;
533 clutter_mozembed_back (CLUTTER_MOZEMBED (page->web));
535 webkit_web_view_go_back (page->view);
537 set_back_and_forward (browser);
541 forward_cb (ClutterActor *button,
545 MmBrowserPrivate *priv = browser->priv;
548 if (priv->showing_tabs == TRUE)
552 page = priv->current_page->data;
554 clutter_mozembed_forward (CLUTTER_MOZEMBED (page->web));
556 webkit_web_view_go_forward (page->view);
558 set_back_and_forward (browser);
562 hide_on_effect_complete (ClutterActor *actor,
565 clutter_actor_hide (actor);
569 tabs_cb (ClutterActor *button,
573 MmBrowserPrivate *priv = browser->priv;
574 MmBrowserPage *page, *prev = NULL, *next = NULL;
576 if (priv->showing_tabs == FALSE) {
577 page = priv->current_page->data;
579 /* Layout previous page */
580 if (priv->current_page->prev) {
581 prev = priv->current_page->prev->data;
583 clutter_actor_set_scale (prev->scroll, 0.4, 0.4);
584 clutter_actor_set_position (prev->scroll, 0, 240);
585 clutter_actor_set_opacity (prev->scroll, 0x00);
587 clutter_actor_show (prev->scroll);
589 g_print ("No prev\n");
592 /* Layout next page */
593 if (priv->current_page->next) {
594 next = priv->current_page->next->data;
596 clutter_actor_set_scale (next->scroll, 0.4, 0.4);
597 clutter_actor_set_position (next->scroll, 800, 240);
598 clutter_actor_set_opacity (next->scroll, 0x00);
600 clutter_actor_show (next->scroll);
603 clutter_actor_animate (page->scroll, CLUTTER_LINEAR, 100,
604 "scale-x", 0.4, "scale-y", 0.4, NULL);
605 clutter_actor_show (priv->tab_control);
606 clutter_actor_animate (priv->tab_control, CLUTTER_LINEAR, 500,
607 "opacity", 0xff, NULL);
609 clutter_actor_show (prev->scroll);
610 clutter_actor_animate (prev->scroll, CLUTTER_LINEAR, 500,
611 "opacity", 0xff, NULL);
615 clutter_actor_show (next->scroll);
616 clutter_actor_animate (next->scroll, CLUTTER_LINEAR, 500,
617 "opacity", 0xff, NULL);
620 priv->showing_tabs = TRUE;
622 page = priv->current_page->data;
624 if (priv->current_page->prev) {
625 prev = priv->current_page->prev->data;
627 g_signal_connect_swapped (clutter_actor_animate (prev->scroll,
629 "opacity", 0x00, NULL),
631 G_CALLBACK (hide_on_effect_complete),
635 if (priv->current_page->next) {
636 next = priv->current_page->next->data;
638 g_signal_connect_swapped (clutter_actor_animate (next->scroll,
640 "opacity", 0x00, NULL),
642 G_CALLBACK (hide_on_effect_complete),
646 clutter_actor_animate (page->scroll, CLUTTER_LINEAR, 100,
647 "scale-x", 1.0, "scale-y", 1.0, NULL);
648 g_signal_connect_swapped (clutter_actor_animate (priv->tab_control,
650 "opacity", 0x00, NULL),
652 G_CALLBACK (hide_on_effect_complete),
654 priv->showing_tabs = FALSE;
659 select_previous_tab (ClutterActor *button,
663 ClutterActor *stage = clutter_stage_get_default ();
664 MmBrowserPrivate *priv = browser->priv;
665 MmBrowserPage *pages[4], *current;
668 pages[2] = priv->current_page->data;
670 if (priv->current_page->next) {
671 pages[3] = priv->current_page->next->data;
676 if (priv->current_page->prev) {
677 pages[1] = priv->current_page->prev->data;
679 if (priv->current_page->prev->prev) {
680 pages[0] = priv->current_page->prev->prev->data;
685 /* Current page was the first page, so we can't screll */
689 /* Scroll all four pages */
690 for (i = 0; i < 4; i++) {
693 if (pages[i] == NULL) {
697 clutter_actor_get_position (pages[i]->scroll, &x, NULL);
698 clutter_actor_animate (pages[i]->scroll, CLUTTER_LINEAR, 400,
702 priv->current_page = priv->current_page->prev;
703 current = priv->current_page->data;
704 clutter_stage_set_key_focus (CLUTTER_STAGE (stage), current->scroll);
705 clutter_text_set_text (CLUTTER_TEXT (priv->entry),
706 current->address ? current->address : "");
710 select_next_tab (ClutterActor *button,
714 ClutterActor *stage = clutter_stage_get_default ();
715 MmBrowserPrivate *priv = browser->priv;
716 MmBrowserPage *pages[4], *current;
719 pages[1] = priv->current_page->data;
721 if (priv->current_page->prev) {
722 pages[0] = priv->current_page->prev->data;
727 if (priv->current_page->next) {
728 pages[2] = priv->current_page->next->data;
730 if (priv->current_page->next->next) {
731 pages[3] = priv->current_page->next->next->data;
736 /* Current page was last page, so we can't scroll */
740 /* Scroll all four pages */
741 for (i = 0; i < 4; i++) {
744 if (pages[i] == NULL) {
748 clutter_actor_get_position (pages[i]->scroll, &x, NULL);
749 clutter_actor_animate (pages[i]->scroll, CLUTTER_LINEAR, 400,
753 priv->current_page = priv->current_page->next;
754 current = priv->current_page->data;
755 clutter_stage_set_key_focus (CLUTTER_STAGE (stage), current->web);
756 clutter_text_set_text (CLUTTER_TEXT (priv->entry),
757 current->address ? current->address : "");
761 create_new_tab (ClutterActor *button,
765 g_print ("New tab\n");
769 mm_browser_init (MmBrowser *self)
771 MmBrowserPrivate *priv;
772 ClutterColor white = {0x33, 0x33, 0x33, 0xff};
773 ClutterColor progress_color = {0x00, 0x55, 0xdd, 0xff};
774 ClutterActor *stage = clutter_stage_get_default ();
776 ClutterBehaviour *behave;
777 ClutterKnot progress_knots[] = {{265, 11}, {515, 11}};
780 priv = self->priv = BROWSER_PRIVATE (self);
782 alpha = clutter_alpha_new_full (priv->move_timeline, CLUTTER_EASE_IN_OUT_CUBIC);
783 behave = clutter_behaviour_path_new_with_knots (alpha, progress_knots, 2);
786 priv->showing_tabs = FALSE;
788 priv->page_group = clutter_group_new ();
789 clutter_container_add_actor (CLUTTER_CONTAINER (self), priv->page_group);
790 clutter_actor_set_position (priv->page_group, 0, 0);
791 clutter_actor_set_reactive (priv->page_group, TRUE);
797 priv->current_page = priv->current_page->prev;
798 clutter_actor_show (((MmBrowserPage *) priv->current_page->data)->scroll);
799 clutter_actor_raise_top (((MmBrowserPage *) priv->current_page->data)->scroll);
801 priv->tab_control = clutter_group_new ();
802 clutter_container_add_actor (CLUTTER_CONTAINER (priv->page_group), priv->tab_control);
803 clutter_actor_set_position (priv->tab_control, 0, 350);
804 clutter_actor_set_size (priv->tab_control, 800, 34);
806 priv->prev_tab = make_button ("assets/go-previous.png");
807 clutter_container_add_actor (CLUTTER_CONTAINER (priv->tab_control),
809 clutter_actor_set_reactive (priv->prev_tab, TRUE);
810 clutter_actor_set_position (priv->prev_tab, 20, 2);
811 g_signal_connect (priv->prev_tab, "button-release-event",
812 G_CALLBACK (select_previous_tab), self);
814 priv->next_tab = make_button ("assets/go-next.png");
815 clutter_container_add_actor (CLUTTER_CONTAINER (priv->tab_control),
817 clutter_actor_set_reactive (priv->next_tab, TRUE);
818 clutter_actor_set_position (priv->next_tab, 748, 2);
819 g_signal_connect (priv->next_tab, "button-release-event",
820 G_CALLBACK (select_next_tab), self);
823 priv->new_tab = make_button ("assets/document-new.png");
824 clutter_container_add_actor (CLUTTER_CONTAINER (priv->tab_control),
826 clutter_actor_set_reactive (priv->new_tab, TRUE);
827 clutter_actor_set_position (priv->new_tab, 384, 2);
828 g_signal_connect (priv->new_tab, "button-release-event",
829 G_CALLBACK (create_new_tab), self);
831 clutter_actor_set_opacity (priv->tab_control, 0x00);
832 clutter_actor_show_all (priv->tab_control);
834 clutter_actor_show (priv->page_group);
836 priv->toolbar = clutter_group_new ();
837 clutter_container_add_actor (CLUTTER_CONTAINER (self), priv->toolbar);
838 clutter_actor_set_position (priv->toolbar, 0, 430);
840 priv->toolbar_bg = clutter_texture_new_from_file ("assets/toolbar-bg.png", NULL);
841 clutter_group_add (CLUTTER_GROUP (priv->toolbar), priv->toolbar_bg);
843 priv->progress = clutter_rectangle_new_with_color (&progress_color);
844 clutter_container_add_actor (CLUTTER_CONTAINER (priv->toolbar),
846 clutter_actor_set_size (priv->progress, 30, 28);
847 clutter_actor_set_position (priv->progress, 265, 11);
848 clutter_actor_set_opacity (priv->progress, 0x00);
849 clutter_behaviour_apply (behave, priv->progress);
852 priv->back = make_button ("assets/back.png");
853 clutter_container_add_actor (CLUTTER_CONTAINER (priv->toolbar), priv->back);
854 clutter_actor_set_reactive (CLUTTER_ACTOR (priv->back), TRUE);
855 clutter_actor_set_position (priv->back, 140, 2);
856 g_signal_connect (priv->back, "button-release-event",
857 G_CALLBACK (back_cb), self);
859 priv->forward = make_button ("assets/forward.png");
860 clutter_container_add_actor (CLUTTER_CONTAINER (priv->toolbar), priv->forward);
861 clutter_actor_set_reactive (CLUTTER_ACTOR (priv->forward), TRUE);
862 clutter_actor_set_position (priv->forward, 200, 2);
863 g_signal_connect (priv->forward, "button-release-event",
864 G_CALLBACK (forward_cb), self);
866 priv->tabs = make_button ("assets/tabs.png");
867 clutter_container_add_actor (CLUTTER_CONTAINER (priv->toolbar), priv->tabs);
868 clutter_actor_set_reactive (CLUTTER_ACTOR (priv->tabs), TRUE);
869 clutter_actor_set_position (priv->tabs, 8, 2);
870 g_signal_connect (priv->tabs, "button-release-event",
871 G_CALLBACK (tabs_cb), self);
874 priv->entry = clutter_text_new_full ("Sans 28px", "", &white);
875 g_object_set (G_OBJECT (priv->entry),
876 "editable", TRUE, "activatable", TRUE, NULL);
877 clutter_container_add_actor (CLUTTER_CONTAINER (priv->toolbar), priv->entry);
878 clutter_actor_set_reactive (priv->entry, TRUE);
879 clutter_actor_set_position (priv->entry, 265, 11);
880 clutter_actor_set_size (priv->entry, 515, 50);
882 g_signal_connect (priv->entry, "key-release-event",
883 G_CALLBACK (key_release_cb), self);
885 g_signal_connect (priv->entry, "activate",
886 G_CALLBACK (entry_activated_cb), self);
887 g_signal_connect (priv->entry, "button-release-event",
888 G_CALLBACK (entry_clicked_cb), self);
890 set_back_and_forward (self);
892 page = priv->current_page->data;
893 clutter_stage_set_key_focus (CLUTTER_STAGE (stage), page->web);
895 clutter_actor_show_all (priv->toolbar);
897 /* clutter_actor_raise_top (priv->page_group); */
901 mm_browser_new (void)
903 return g_object_new (MM_TYPE_BROWSER, NULL);
907 mm_browser_open (MmBrowser *browser,
910 MmBrowserPrivate *priv = browser->priv;
914 page = priv->current_page->data;
916 clutter_mozembed_open (CLUTTER_MOZEMBED (page->web), address);
918 webkit_web_view_open (page->view, address);
922 /***************************************************************************/
929 ClutterActor *background;
931 ClutterColor col = {0x24, 0x29, 0x29, 0xff};
933 clutter_init (&argc, &argv);
935 stage = clutter_stage_get_default ();
936 clutter_actor_set_size (stage, 800, 480);
937 clutter_stage_set_color (CLUTTER_STAGE(stage), &col);
939 browser = mm_browser_new ();
940 clutter_actor_set_position (CLUTTER_ACTOR (browser), 0, 0);
941 clutter_group_add (CLUTTER_GROUP (stage), CLUTTER_ACTOR (browser));
942 clutter_actor_show_all (stage);
945 mm_browser_open (browser, "http://news.google.co.uk/");
947 mm_browser_open (browser, argv[1]);