Implement drag (finger) and kinetic scrolling with KatzeScrolled
The feature is primarily interesting for mobile devices and by default enabled with gtk-touchscreen-mode.
This commit is contained in:
parent
7259066e20
commit
96093d9067
7 changed files with 1203 additions and 12 deletions
1086
katze/katze-scrolled.c
Normal file
1086
katze/katze-scrolled.c
Normal file
File diff suppressed because it is too large
Load diff
59
katze/katze-scrolled.h
Normal file
59
katze/katze-scrolled.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
Copyright (C) 2007 Henrik Hedberg <hhedberg@innologies.fi>
|
||||
Copyright (C) 2009 Nadav Wiener <nadavwr@yahoo.com>
|
||||
Copyright (C) 2009 Christian Dywan <christian@twotoasts.de>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
See the file COPYING for the full license text.
|
||||
*/
|
||||
|
||||
#ifndef KATZE_SCROLLED_H
|
||||
#define KATZE_SCROLLED_H
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define KATZE_TYPE_SCROLLED (katze_scrolled_get_type())
|
||||
#define KATZE_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), KATZE_TYPE_SCROLLED, KatzeScrolled))
|
||||
#define KATZE_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), KATZE_TYPE_SCROLLED, KatzeScrolledClass))
|
||||
#define KATZE_IS_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), KATZE_TYPE_SCROLLED))
|
||||
#define KATZE_IS_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), KATZE_TYPE_SCROLLED))
|
||||
#define KATZE_SCROLLED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), KATZE_TYPE_SCROLLED, KatzeScrolledClass))
|
||||
|
||||
typedef struct _KatzeScrolled KatzeScrolled;
|
||||
typedef struct _KatzeScrolledClass KatzeScrolledClass;
|
||||
typedef struct _KatzeScrolledPrivate KatzeScrolledPrivate;
|
||||
|
||||
struct _KatzeScrolled
|
||||
{
|
||||
GtkScrolledWindow parent;
|
||||
|
||||
KatzeScrolledPrivate* priv;
|
||||
};
|
||||
|
||||
struct _KatzeScrolledClass
|
||||
{
|
||||
GtkScrolledWindowClass parent;
|
||||
|
||||
/* Padding for future expansion */
|
||||
void (*_katze_reserved1) (void);
|
||||
void (*_katze_reserved2) (void);
|
||||
void (*_katze_reserved3) (void);
|
||||
void (*_katze_reserved4) (void);
|
||||
};
|
||||
|
||||
GType
|
||||
katze_scrolled_get_type (void);
|
||||
|
||||
GtkWidget*
|
||||
katze_scrolled_new (GtkAdjustment* hadjustment,
|
||||
GtkAdjustment* vadjustment);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __KATZE_SCROLLED_H__ */
|
|
@ -21,5 +21,6 @@
|
|||
#include "katze-arrayaction.h"
|
||||
#include "katze-separatoraction.h"
|
||||
#include "katze-net.h"
|
||||
#include "katze-scrolled.h"
|
||||
|
||||
#endif /* __KATZE_H__ */
|
||||
|
|
|
@ -1554,9 +1554,6 @@ _midori_browser_add_tab (MidoriBrowser* browser,
|
|||
KatzeItem* item;
|
||||
guint n;
|
||||
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (view),
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
|
||||
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (view),
|
||||
GTK_SHADOW_ETCHED_IN);
|
||||
|
|
|
@ -315,6 +315,9 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
|
|||
GtkWidget* header;
|
||||
GtkWindow* parent;
|
||||
const gchar* icon_name;
|
||||
#if WEBKIT_CHECK_VERSION (1, 1, 15)
|
||||
GtkSettings* gtk_settings;
|
||||
#endif
|
||||
GtkSizeGroup* sizegroup;
|
||||
GtkWidget* toolbar;
|
||||
GtkWidget* toolbutton;
|
||||
|
@ -341,6 +344,9 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
|
|||
gtk_window_get_title (GTK_WINDOW (preferences)))))
|
||||
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (preferences)->vbox),
|
||||
header, FALSE, FALSE, 0);
|
||||
#if WEBKIT_CHECK_VERSION (1, 1, 15)
|
||||
gtk_settings = parent ? gtk_widget_get_settings (GTK_WIDGET (parent)) : NULL;
|
||||
#endif
|
||||
|
||||
preferences->notebook = gtk_notebook_new ();
|
||||
gtk_container_set_border_width (GTK_CONTAINER (preferences->notebook), 6);
|
||||
|
@ -487,9 +493,14 @@ midori_preferences_set_settings (MidoriPreferences* preferences,
|
|||
gtk_widget_set_tooltip_text (button, _("Load and display images automatically"));
|
||||
INDENTED_ADD (button, 0, 1, 0, 1);
|
||||
#if WEBKIT_CHECK_VERSION (1, 1, 15)
|
||||
button = katze_property_proxy (settings, "auto-shrink-images", NULL);
|
||||
gtk_button_set_label (GTK_BUTTON (button), _("Shrink images automatically"));
|
||||
gtk_widget_set_tooltip_text (button, _("Automatically shrink standalone images to fit"));
|
||||
if (katze_object_get_boolean (gtk_settings, "gtk-touchscreen-mode"))
|
||||
button = katze_property_proxy (settings, "kinetic-scrolling", NULL);
|
||||
else
|
||||
{
|
||||
button = katze_property_proxy (settings, "auto-shrink-images", NULL);
|
||||
gtk_button_set_label (GTK_BUTTON (button), _("Shrink images automatically"));
|
||||
gtk_widget_set_tooltip_text (button, _("Automatically shrink standalone images to fit"));
|
||||
}
|
||||
#else
|
||||
button = katze_property_proxy (settings, "middle-click-opens-selection", NULL);
|
||||
#endif
|
||||
|
|
|
@ -59,7 +59,7 @@ midori_view_item_meta_data_changed (KatzeItem* item,
|
|||
|
||||
struct _MidoriView
|
||||
{
|
||||
GtkScrolledWindow parent_instance;
|
||||
KatzeScrolled parent_instance;
|
||||
|
||||
gchar* uri;
|
||||
gchar* title;
|
||||
|
@ -104,10 +104,10 @@ struct _MidoriView
|
|||
|
||||
struct _MidoriViewClass
|
||||
{
|
||||
GtkScrolledWindowClass parent_class;
|
||||
KatzeScrolledClass parent_class;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (MidoriView, midori_view, GTK_TYPE_SCROLLED_WINDOW)
|
||||
G_DEFINE_TYPE (MidoriView, midori_view, KATZE_TYPE_SCROLLED);
|
||||
|
||||
GType
|
||||
midori_load_status_get_type (void)
|
||||
|
@ -1525,6 +1525,9 @@ webkit_web_view_populate_popup_cb (WebKitWebView* web_view,
|
|||
katze_object_assign (view->hit_test,
|
||||
webkit_web_view_get_hit_test_result (web_view, &event));
|
||||
context = katze_object_get_int (view->hit_test, "context");
|
||||
/* Ensure view->link_uri is correct. */
|
||||
katze_assign (view->link_uri,
|
||||
katze_object_get_string (view->hit_test, "link-uri"));
|
||||
has_selection = context & WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION;
|
||||
/* Ensure view->selected_text */
|
||||
midori_view_has_selection (view);
|
||||
|
@ -1533,6 +1536,8 @@ webkit_web_view_populate_popup_cb (WebKitWebView* web_view,
|
|||
is_media = context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA;
|
||||
is_document = !view->link_uri && !has_selection && !is_image && !is_media;
|
||||
#else
|
||||
/* There is no guarantee view->link_uri is correct in case
|
||||
gtk-touchscreen-mode is enabled, nothing we can do. */
|
||||
has_selection = midori_view_has_selection (view);
|
||||
is_document = !view->link_uri && !has_selection;
|
||||
|
||||
|
@ -2329,13 +2334,14 @@ midori_view_new (KatzeNet* net)
|
|||
static void
|
||||
_midori_view_update_settings (MidoriView* view)
|
||||
{
|
||||
gboolean zoom_text_and_images;
|
||||
gboolean zoom_text_and_images, kinetic_scrolling;
|
||||
|
||||
g_object_get (view->settings,
|
||||
"speed-dial-in-new-tabs", &view->speed_dial_in_new_tabs,
|
||||
"download-manager", &view->download_manager,
|
||||
"news-aggregator", &view->news_aggregator,
|
||||
"zoom-text-and-images", &zoom_text_and_images,
|
||||
"kinetic-scrolling", &kinetic_scrolling,
|
||||
"close-buttons-on-tabs", &view->close_buttons_on_tabs,
|
||||
"open-new-pages-in", &view->open_new_pages_in,
|
||||
"ask-for-destination-folder", &view->ask_for_destination_folder,
|
||||
|
@ -2345,8 +2351,9 @@ _midori_view_update_settings (MidoriView* view)
|
|||
NULL);
|
||||
|
||||
if (view->web_view)
|
||||
g_object_set (view->web_view, "full-content-zoom",
|
||||
zoom_text_and_images, NULL);
|
||||
g_object_set (view->web_view,
|
||||
"full-content-zoom", zoom_text_and_images, NULL);
|
||||
g_object_set (view, "kinetic-scrolling", kinetic_scrolling, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2379,6 +2386,11 @@ midori_view_settings_notify_cb (MidoriWebSettings* settings,
|
|||
g_object_set (view->web_view, "full-content-zoom",
|
||||
g_value_get_boolean (&value), NULL);
|
||||
}
|
||||
else if (name == g_intern_string ("kinetic-scrolling"))
|
||||
{
|
||||
g_object_set (view, "kinetic-scrolling",
|
||||
g_value_get_boolean (&value), NULL);
|
||||
}
|
||||
else if (name == g_intern_string ("close-buttons-on-tabs"))
|
||||
{
|
||||
view->close_buttons_on_tabs = g_value_get_boolean (&value);
|
||||
|
|
|
@ -75,6 +75,7 @@ struct _MidoriWebSettings
|
|||
|
||||
gboolean zoom_text_and_images;
|
||||
gboolean find_while_typing;
|
||||
gboolean kinetic_scrolling;
|
||||
MidoriAcceptCookies accept_cookies;
|
||||
gboolean original_cookies_only;
|
||||
gint maximum_cookie_age;
|
||||
|
@ -151,6 +152,7 @@ enum
|
|||
|
||||
PROP_ZOOM_TEXT_AND_IMAGES,
|
||||
PROP_FIND_WHILE_TYPING,
|
||||
PROP_KINETIC_SCROLLING,
|
||||
PROP_ACCEPT_COOKIES,
|
||||
PROP_ORIGINAL_COOKIES_ONLY,
|
||||
PROP_MAXIMUM_COOKIE_AGE,
|
||||
|
@ -833,6 +835,22 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
|
|||
FALSE,
|
||||
flags));
|
||||
|
||||
/**
|
||||
* MidoriWebSettings:kinetic-scrolling:
|
||||
*
|
||||
* Whether scrolling should kinetically move according to speed.
|
||||
*
|
||||
* Since: 0.2.0
|
||||
*/
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_KINETIC_SCROLLING,
|
||||
g_param_spec_boolean (
|
||||
"kinetic-scrolling",
|
||||
_("Kinetic scrolling"),
|
||||
_("Whether scrolling should kinetically move according to speed"),
|
||||
TRUE,
|
||||
flags));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_ACCEPT_COOKIES,
|
||||
g_param_spec_enum (
|
||||
|
@ -1025,6 +1043,7 @@ midori_web_settings_init (MidoriWebSettings* web_settings)
|
|||
web_settings->open_popups_in_tabs = TRUE;
|
||||
web_settings->remember_last_form_inputs = TRUE;
|
||||
web_settings->remember_last_downloaded_files = TRUE;
|
||||
web_settings->kinetic_scrolling = TRUE;
|
||||
web_settings->auto_detect_proxy = TRUE;
|
||||
|
||||
g_signal_connect (web_settings, "notify::default-encoding",
|
||||
|
@ -1303,6 +1322,9 @@ midori_web_settings_set_property (GObject* object,
|
|||
case PROP_FIND_WHILE_TYPING:
|
||||
web_settings->find_while_typing = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_KINETIC_SCROLLING:
|
||||
web_settings->kinetic_scrolling = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_ACCEPT_COOKIES:
|
||||
web_settings->accept_cookies = g_value_get_enum (value);
|
||||
break;
|
||||
|
@ -1506,6 +1528,9 @@ midori_web_settings_get_property (GObject* object,
|
|||
case PROP_FIND_WHILE_TYPING:
|
||||
g_value_set_boolean (value, web_settings->find_while_typing);
|
||||
break;
|
||||
case PROP_KINETIC_SCROLLING:
|
||||
g_value_set_boolean (value, web_settings->kinetic_scrolling);
|
||||
break;
|
||||
case PROP_ACCEPT_COOKIES:
|
||||
g_value_set_enum (value, web_settings->accept_cookies);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue