From 1d68dc9fb7a6f89f325e9c26d60f7ac4e8b7c0ad Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Fri, 27 Nov 2009 23:42:07 +0100 Subject: [PATCH] Implement and optimize for portrait mode support for Fremantle Listen to accelerometer movement. Hide tool items in portrait mode. Omit Homepage and View Source from app menu. Include Compact Add, View Source and Fullscreen in context menu. Hide buttons in portrait mode in preferences. --- katze/katze-preferences.c | 30 ++++++++++++-- midori/midori-app.c | 11 ++++++ midori/midori-browser.c | 83 +++++++++++++++++++++++++++++++++++---- midori/midori-view.c | 14 +++++-- 4 files changed, 123 insertions(+), 15 deletions(-) diff --git a/katze/katze-preferences.c b/katze/katze-preferences.c index f42f77d1..91006cb9 100644 --- a/katze/katze-preferences.c +++ b/katze/katze-preferences.c @@ -66,6 +66,19 @@ katze_preferences_response_cb (KatzePreferences* preferences, gtk_widget_destroy (GTK_WIDGET (preferences)); } +#ifdef HAVE_HILDON_2_2 +static void +katze_preferences_size_request_cb (KatzePreferences* preferences, + GtkRequisition* requisition) +{ + GdkScreen* screen = gtk_widget_get_screen (GTK_WIDGET (preferences)); + if (gdk_screen_get_height (screen) > gdk_screen_get_width (screen)) + gtk_widget_hide (gtk_dialog_get_action_area (GTK_DIALOG (preferences))); + else + gtk_widget_show (gtk_dialog_get_action_area (GTK_DIALOG (preferences))); +} +#endif + static void katze_preferences_init (KatzePreferences* preferences) { @@ -94,9 +107,17 @@ katze_preferences_init (KatzePreferences* preferences) #endif NULL); #endif + g_object_connect (preferences, "signal::response", katze_preferences_response_cb, NULL, NULL); + + #ifdef HAVE_HILDON_2_2 + katze_preferences_size_request_cb (preferences, NULL); + g_object_connect (preferences, + "signal::size-request", katze_preferences_size_request_cb, NULL, + NULL); + #endif } static void @@ -168,7 +189,8 @@ katze_preferences_prepare (KatzePreferences* preferences) priv->sizegroup = NULL; priv->sizegroup2 = NULL; - g_signal_connect (priv->scrolled, "destroy", G_CALLBACK (gtk_widget_destroyed), &priv->scrolled); + g_signal_connect (priv->scrolled, "destroy", + G_CALLBACK (gtk_widget_destroyed), &priv->scrolled); #else priv->notebook = gtk_notebook_new (); gtk_container_set_border_width (GTK_CONTAINER (priv->notebook), 6); @@ -195,7 +217,8 @@ katze_preferences_prepare (KatzePreferences* preferences) priv->box = NULL; priv->hbox = NULL; - g_signal_connect (priv->notebook, "destroy", G_CALLBACK (gtk_widget_destroyed), &priv->notebook); + g_signal_connect (priv->notebook, "destroy", + G_CALLBACK (gtk_widget_destroyed), &priv->notebook); #endif #if HAVE_OSX @@ -206,8 +229,7 @@ katze_preferences_prepare (KatzePreferences* preferences) gtk_button_set_image (GTK_BUTTON (button), icon); g_signal_connect (button, "clicked", G_CALLBACK (katze_preferences_help_clicked_cb), preferences); - gtk_box_pack_end (GTK_BOX (hbox), - button, FALSE, FALSE, 4); + gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 4); gtk_box_pack_end (GTK_BOX (GTK_DIALOG (preferences)->action_area), hbox, FALSE, FALSE, 0); #endif diff --git a/midori/midori-app.c b/midori/midori-app.c index 434e3469..cb756e1e 100644 --- a/midori/midori-app.c +++ b/midori/midori-app.c @@ -22,6 +22,11 @@ #if HAVE_HILDON #include + #ifdef HAVE_HILDON_2_2 + #include + #include + #include + #endif typedef osso_context_t* MidoriAppInstance; #define MidoriAppInstanceNull NULL #elif HAVE_UNIQUE @@ -642,6 +647,12 @@ midori_app_create_instance (MidoriApp* app, osso_deinitialize (instance); return NULL; } + + #ifdef HAVE_HILDON_2_2 + if (OSSO_OK == osso_rpc_run_system (instance, MCE_SERVICE, MCE_REQUEST_PATH, + MCE_REQUEST_IF, MCE_ACCELEROMETER_ENABLE_REQ, NULL, DBUS_TYPE_INVALID)) + /* Accelerometer enabled */; + #endif #else GdkDisplay* display; gchar* display_name; diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 588ca570..25d064ad 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -38,6 +38,16 @@ #include #endif +#ifdef HAVE_HILDON_2_2 + #include + #include + #include + #define MCE_SIGNAL_MATCH "type='signal'," \ + "sender='" MCE_SERVICE "'," \ + "path='" MCE_SIGNAL_PATH "'," \ + "interface='" MCE_SIGNAL_IF "'" +#endif + struct _MidoriBrowser { #if HAVE_HILDON @@ -3029,8 +3039,6 @@ _action_compact_menu_populate_popup (GtkAction* action, { "Open" }, #if HAVE_HILDON { "Find" }, - { "Homepage" }, - { "SourceView" }, #else { "Print" }, { "About" }, @@ -3057,12 +3065,7 @@ _action_compact_menu_populate_popup (GtkAction* action, for (i = 0; i < G_N_ELEMENTS (actions); i++) { - #if HAVE_HILDON - #if HILDON_CHECK_VERSION (2, 2, 0) - #define HAVE_APP_MENU 1 - #endif - #endif - #ifdef HAVE_APP_MENU + #ifdef HAVE_HILDON_2_2 GtkAction* _action; gchar* label; GtkWidget* button; @@ -5474,6 +5477,58 @@ midori_browser_ui_manager_disconnect_proxy_cb (GtkUIManager* ui_manager, } } +#ifdef HAVE_HILDON_2_2 +static void +midori_browser_set_portrait_mode (MidoriBrowser* browser, + gboolean portrait) +{ + if (portrait) + hildon_gtk_window_set_portrait_flags (GTK_WINDOW (browser), + HILDON_PORTRAIT_MODE_REQUEST); + else + hildon_gtk_window_set_portrait_flags (GTK_WINDOW (browser), + ~HILDON_PORTRAIT_MODE_REQUEST); + _action_set_visible (browser, "Bookmarks", !portrait); + _action_set_visible (browser, "CompactAdd", !portrait); + _action_set_visible (browser, "Back", !portrait); + _action_set_visible (browser, "SourceView", !portrait); + _action_set_visible (browser, "Fullscreen", !portrait); +} + +static DBusHandlerResult +midori_browser_mce_filter_cb (DBusConnection* connection, + DBusMessage* message, + gpointer data) +{ + if (dbus_message_is_signal (message, MCE_SIGNAL_IF, MCE_DEVICE_ORIENTATION_SIG)) + { + DBusError error; + char *rotation, *stand, *face; + int x, y, z; + + dbus_error_init (&error); + if (dbus_message_get_args (message, + &error, + DBUS_TYPE_STRING, &rotation, + DBUS_TYPE_STRING, &stand, + DBUS_TYPE_STRING, &face, + DBUS_TYPE_INT32, &x, + DBUS_TYPE_INT32, &y, + DBUS_TYPE_INT32, &z, DBUS_TYPE_INVALID)) + { + gboolean portrait = !strcmp (rotation, MCE_ORIENTATION_PORTRAIT); + midori_browser_set_portrait_mode (MIDORI_BROWSER (data), portrait); + } + else + { + g_warning ("%s: %s\n", error.name, error.message); + dbus_error_free (&error); + } + } + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} +#endif + static void midori_browser_init (MidoriBrowser* browser) { @@ -5792,6 +5847,18 @@ midori_browser_init (MidoriBrowser* browser) gtk_box_pack_start (GTK_BOX (vbox), browser->navigationbar, FALSE, FALSE, 0); #endif + #ifdef HAVE_HILDON_2_2 + DBusConnection* system_bus = dbus_bus_get (DBUS_BUS_SYSTEM, NULL); + if (system_bus) + { + dbus_bus_add_match (system_bus, MCE_SIGNAL_MATCH, NULL); + dbus_connection_add_filter (system_bus, + midori_browser_mce_filter_cb, browser, NULL); + hildon_gtk_window_set_portrait_flags (GTK_WINDOW (browser), + HILDON_PORTRAIT_MODE_SUPPORT); + } + #endif + /* Bookmarkbar */ browser->bookmarkbar = gtk_toolbar_new (); gtk_widget_set_name (browser->bookmarkbar, "MidoriBookmarkbar"); diff --git a/midori/midori-view.c b/midori/midori-view.c index e41d19f3..d4a89e3d 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -1977,12 +1977,14 @@ webkit_web_view_populate_popup_cb (WebKitWebView* web_view, gtk_menu_shell_append (menu_shell, menuitem); } + #if !HAVE_HILDON menuitem = sokoke_action_create_popup_menu_item ( gtk_action_group_get_action (actions, "ZoomIn")); gtk_menu_shell_append (menu_shell, menuitem); menuitem = sokoke_action_create_popup_menu_item ( gtk_action_group_get_action (actions, "ZoomOut")); gtk_menu_shell_append (menu_shell, menuitem); + #endif menuitem = sokoke_action_create_popup_menu_item ( gtk_action_group_get_action (actions, "Encoding")); @@ -2012,7 +2014,15 @@ webkit_web_view_populate_popup_cb (WebKitWebView* web_view, } } - #if !HAVE_HILDON + #if HAVE_HILDON + gtk_menu_shell_append (menu_shell, gtk_separator_menu_item_new ()); + menuitem = sokoke_action_create_popup_menu_item ( + gtk_action_group_get_action (actions, "CompactAdd")); + gtk_menu_shell_append (menu_shell, menuitem); + menuitem = sokoke_action_create_popup_menu_item ( + gtk_action_group_get_action (actions, "Fullscreen")); + gtk_menu_shell_append (menu_shell, menuitem); + #else gtk_menu_shell_append (menu_shell, gtk_separator_menu_item_new ()); menuitem = sokoke_action_create_popup_menu_item ( gtk_action_group_get_action (actions, "BookmarkAdd")); @@ -2033,7 +2043,6 @@ webkit_web_view_populate_popup_cb (WebKitWebView* web_view, menuitem = sokoke_action_create_popup_menu_item ( gtk_action_group_get_action (actions, "SaveAs")); gtk_menu_shell_append (menu_shell, menuitem); - #if !HAVE_HILDON /* Currently views that don't support source, don't support saving either. If that changes, we need to think of something. */ if (!midori_view_can_view_source (view)) @@ -2041,7 +2050,6 @@ webkit_web_view_populate_popup_cb (WebKitWebView* web_view, menuitem = sokoke_action_create_popup_menu_item ( gtk_action_group_get_action (actions, "SourceView")); gtk_menu_shell_append (menu_shell, menuitem); - #endif } gtk_widget_show_all (menu);