#include "ev-document-forms.h"
#include "ev-document-images.h"
#include "ev-document-links.h"
+#include "ev-document-layers.h"
#include "ev-document-misc.h"
#include "ev-pixbuf-cache.h"
#include "ev-page-cache.h"
SIGNAL_SELECTION_CHANGED,
SIGNAL_SYNC_SOURCE,
SIGNAL_ANNOT_ADDED,
+ SIGNAL_LAYERS_CHANGED,
N_SIGNALS
};
TARGET_DND_IMAGE
};
+enum {
+ PROP_0,
+ PROP_HADJUSTMENT,
+ PROP_VADJUSTMENT,
+ PROP_HSCROLL_POLICY,
+ PROP_VSCROLL_POLICY
+};
+
static guint signals[N_SIGNALS];
typedef enum {
#define SCROLL_TIME 150
/*** Scrolling ***/
-static void ev_view_set_scroll_adjustments (GtkLayout *layout,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment);
static void view_update_range_and_current_page (EvView *view);
-static void set_scroll_adjustment (EvView *view,
- GtkOrientation orientation,
- GtkAdjustment *adjustment);
static void add_scroll_binding_keypad (GtkBindingSet *binding_set,
guint keyval,
GdkModifierType modifiers,
GtkRequisition *requisition);
static void ev_view_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
-static void ev_view_realize (GtkWidget *widget);
static gboolean ev_view_scroll_event (GtkWidget *widget,
GdkEventScroll *event);
-static gboolean ev_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
+static gboolean ev_view_draw (GtkWidget *widget,
+ cairo_t *cr);
static gboolean ev_view_popup_menu (GtkWidget *widget);
static gboolean ev_view_button_press_event (GtkWidget *widget,
GdkEventButton *event);
GdkEventCrossing *event);
static gboolean ev_view_leave_notify_event (GtkWidget *widget,
GdkEventCrossing *event);
-static void ev_view_style_set (GtkWidget *widget,
- GtkStyle *old_style);
+static void ev_view_style_updated (GtkWidget *widget);
static void ev_view_remove_all (EvView *view);
static AtkObject *ev_view_get_accessible (GtkWidget *widget);
/*** Drawing ***/
static void highlight_find_results (EvView *view,
+ cairo_t *cr,
int page);
static void highlight_forward_search_results (EvView *view,
+ cairo_t *cr,
int page);
static void focus_annotation (EvView *view,
+ cairo_t *cr,
int page,
GdkRectangle *clip);
static void draw_one_page (EvView *view,
/*** GObject ***/
static void ev_view_finalize (GObject *object);
-static void ev_view_destroy (GtkObject *object);
+static void ev_view_dispose (GObject *object);
static void ev_view_class_init (EvViewClass *class);
static void ev_view_init (EvView *view);
gpointer data);
static void ev_view_update_primary_selection (EvView *ev_view);
-G_DEFINE_TYPE (EvView, ev_view, GTK_TYPE_LAYOUT)
+G_DEFINE_TYPE_WITH_CODE (EvView, ev_view, GTK_TYPE_FIXED,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
/* HeightToPage cache */
#define EV_HEIGHT_TO_PAGE_CACHE_KEY "ev-height-to-page-cache"
}
gtk_widget_style_get (swindow, "scrollbar_spacing", &spacing, NULL);
- gtk_widget_size_request (sb, &req);
+ gtk_widget_get_preferred_size (sb, &req, NULL);
return (orientation == GTK_ORIENTATION_VERTICAL ? req.width : req.height) + spacing;
}
}
static void
-view_set_adjustment_values (EvView *view,
- GtkOrientation orientation)
+ev_view_set_adjustment_values (EvView *view,
+ GtkOrientation orientation)
{
GtkWidget *widget = GTK_WIDGET (view);
GtkAdjustment *adjustment;
}
static void
-set_scroll_adjustment (EvView *view,
- GtkOrientation orientation,
- GtkAdjustment *adjustment)
+ev_view_set_scroll_adjustment (EvView *view,
+ GtkOrientation orientation,
+ GtkAdjustment *adjustment)
{
GtkAdjustment **to_set;
+ const gchar *prop_name;
- if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ if (orientation == GTK_ORIENTATION_HORIZONTAL) {
to_set = &view->hadjustment;
- else
+ prop_name = "hadjustment";
+ } else {
to_set = &view->vadjustment;
+ prop_name = "vadjustment";
+ }
- if (*to_set != adjustment) {
- if (*to_set) {
- g_signal_handlers_disconnect_by_func (*to_set,
- (gpointer) on_adjustment_value_changed,
- view);
- g_object_unref (*to_set);
- }
-
- *to_set = adjustment;
- view_set_adjustment_values (view, orientation);
+ if (adjustment && adjustment == *to_set)
+ return;
- if (*to_set) {
- g_object_ref (*to_set);
- g_signal_connect (*to_set, "value_changed",
- G_CALLBACK (on_adjustment_value_changed), view);
- }
+ if (*to_set) {
+ g_signal_handlers_disconnect_by_func (*to_set,
+ (gpointer) on_adjustment_value_changed,
+ view);
+ g_object_unref (*to_set);
}
-}
-static void
-ev_view_set_scroll_adjustments (GtkLayout *layout,
- GtkAdjustment *hadjustment,
- GtkAdjustment *vadjustment)
-{
- EvView *view = EV_VIEW (layout);
-
- set_scroll_adjustment (view, GTK_ORIENTATION_HORIZONTAL, hadjustment);
- set_scroll_adjustment (view, GTK_ORIENTATION_VERTICAL, vadjustment);
-
- on_adjustment_value_changed (NULL, view);
+ if (!adjustment)
+ adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+ g_signal_connect (adjustment, "value_changed",
+ G_CALLBACK (on_adjustment_value_changed),
+ view);
+ *to_set = g_object_ref_sink (adjustment);
+ ev_view_set_adjustment_values (view, orientation);
+
+ g_object_notify (G_OBJECT (view), prop_name);
}
static void
GtkScrollType scroll,
gboolean horizontal)
{
- guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left;
+ guint keypad_keyval = keyval - GDK_KEY_Left + GDK_KEY_KP_Left;
gtk_binding_entry_add_signal (binding_set, keyval, modifiers,
"binding_activated", 2,
ev_view_goto_dest (view, dest);
}
break;
+ case EV_LINK_ACTION_TYPE_LAYERS_STATE: {
+ GList *show, *hide, *toggle;
+ GList *l;
+ EvDocumentLayers *document_layers;
+
+ document_layers = EV_DOCUMENT_LAYERS (view->document);
+
+ show = ev_link_action_get_show_list (action);
+ for (l = show; l; l = g_list_next (l)) {
+ ev_document_layers_show_layer (document_layers, EV_LAYER (l->data));
+ }
+
+ hide = ev_link_action_get_hide_list (action);
+ for (l = hide; l; l = g_list_next (l)) {
+ ev_document_layers_hide_layer (document_layers, EV_LAYER (l->data));
+ }
+
+ toggle = ev_link_action_get_toggle_list (action);
+ for (l = toggle; l; l = g_list_next (l)) {
+ EvLayer *layer = EV_LAYER (l->data);
+
+ if (ev_document_layers_layer_is_visible (document_layers, layer)) {
+ ev_document_layers_hide_layer (document_layers, layer);
+ } else {
+ ev_document_layers_show_layer (document_layers, layer);
+ }
+ }
+
+ g_signal_emit (view, signals[SIGNAL_LAYERS_CHANGED], 0);
+ ev_view_reload_page (view, view->current_page, NULL);
+ }
+ break;
case EV_LINK_ACTION_TYPE_GOTO_REMOTE:
case EV_LINK_ACTION_TYPE_EXTERNAL_URI:
case EV_LINK_ACTION_TYPE_LAUNCH:
field->changed = TRUE;
}
- if (GTK_IS_COMBO_BOX_ENTRY (widget)) {
- gchar *text;
-
- text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (widget));
+ if (gtk_combo_box_get_has_entry (GTK_COMBO_BOX (widget))) {
+ const gchar *text;
+
+ text = gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget))));
if (!field_choice->text ||
(field_choice->text && g_ascii_strcasecmp (field_choice->text, text) != 0)) {
g_free (field_choice->text);
- field_choice->text = text;
+ field_choice->text = g_strdup (text);
field->changed = TRUE;
}
}
view);
} else if (field_choice->is_editable) { /* ComboBoxEntry */
gchar *text;
-
- choice = gtk_combo_box_entry_new_with_model (model, 0);
+
+ /* FIXME once gtk bug 633050 is fixed */
+ choice = g_object_new (GTK_TYPE_COMBO_BOX, "has-entry", TRUE, "model", model, NULL);
+
text = ev_document_forms_form_field_choice_get_text (EV_DOCUMENT_FORMS (view->document), field);
if (text) {
gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (choice))), text);
form_field_mapping,
field, &view_area);
- gtk_layout_put (GTK_LAYOUT (view), field_widget, view_area.x, view_area.y);
+ gtk_fixed_put (GTK_FIXED (view), field_widget, view_area.x, view_area.y);
gtk_widget_show (field_widget);
gtk_widget_grab_focus (field_widget);
}
*requisition = view->requisition;
}
+static void
+ev_view_get_preferred_width (GtkWidget *widget,
+ gint *minimum,
+ gint *natural)
+{
+ GtkRequisition requisition;
+
+ ev_view_size_request (widget, &requisition);
+
+ *minimum = *natural = requisition.width;
+}
+
+static void
+ev_view_get_preferred_height (GtkWidget *widget,
+ gint *minimum,
+ gint *natural)
+{
+ GtkRequisition requisition;
+
+ ev_view_size_request (widget, &requisition);
+
+ *minimum = *natural = requisition.height;
+}
+
static void
ev_view_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
view->internal_size_request = FALSE;
}
- view_set_adjustment_values (view, GTK_ORIENTATION_HORIZONTAL);
- view_set_adjustment_values (view, GTK_ORIENTATION_VERTICAL);
+ ev_view_set_adjustment_values (view, GTK_ORIENTATION_HORIZONTAL);
+ ev_view_set_adjustment_values (view, GTK_ORIENTATION_VERTICAL);
if (view->document)
view_update_range_and_current_page (view);
form_field_mapping,
field, &view_area);
- gtk_widget_size_request (child, &child_requisition);
+ gtk_widget_get_preferred_size (child, &child_requisition, NULL);
if (child_requisition.width != view_area.width ||
child_requisition.height != view_area.height)
gtk_widget_set_size_request (child, view_area.width, view_area.height);
NULL);
if (child_allocation.x != view_area.x ||
child_allocation.y != view_area.y) {
- gtk_layout_move (GTK_LAYOUT (widget), child, view_area.x, view_area.y);
+ gtk_fixed_move (GTK_FIXED (widget), child, view_area.x, view_area.y);
}
}
g_list_free (children);
}
}
-static void
-ev_view_realize (GtkWidget *widget)
-{
- EvView *view = EV_VIEW (widget);
- GdkWindow *bin_window;
- GtkStyle *style;
-
- if (GTK_WIDGET_CLASS (ev_view_parent_class)->realize)
- (* GTK_WIDGET_CLASS (ev_view_parent_class)->realize) (widget);
-
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
- gdk_window_set_events (bin_window,
- (gdk_window_get_events (bin_window) |
- GDK_EXPOSURE_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_SCROLL_MASK |
- GDK_KEY_PRESS_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_POINTER_MOTION_HINT_MASK |
- GDK_ENTER_NOTIFY_MASK |
- GDK_LEAVE_NOTIFY_MASK));
-
- style = gtk_widget_get_style (widget);
- gdk_window_set_background (bin_window, &style->mid[GTK_STATE_NORMAL]);
-
- on_adjustment_value_changed (NULL, view);
-}
-
static gboolean
ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event)
{
}
static gboolean
-ev_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
+ev_view_draw (GtkWidget *widget,
+ cairo_t *cr)
{
- EvView *view = EV_VIEW (widget);
- GdkWindow *bin_window;
- cairo_t *cr;
- gint i;
+ EvView *view = EV_VIEW (widget);
+ gint i;
+ GdkRectangle clip_rect;
if (view->loading) {
show_loading_window (view);
if (view->document == NULL)
return FALSE;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
- cr = gdk_cairo_create (bin_window);
+ if (!gdk_cairo_get_clip_rectangle (cr, &clip_rect))
+ return FALSE;
for (i = view->start_page; i >= 0 && i <= view->end_page; i++) {
GdkRectangle page_area;
page_area.x -= view->scroll_x;
page_area.y -= view->scroll_y;
- draw_one_page (view, i, cr, &page_area, &border, &(event->area), &page_ready);
+ draw_one_page (view, i, cr, &page_area, &border, &clip_rect, &page_ready);
if (page_ready && view->find_pages && view->highlight_find_results)
- highlight_find_results (view, i);
+ highlight_find_results (view, cr, i);
if (page_ready && EV_IS_DOCUMENT_ANNOTATIONS (view->document))
show_annotation_windows (view, i);
if (page_ready && view->focus_annotation)
- focus_annotation (view, i, &event->area);
+ focus_annotation (view, cr, i, &clip_rect);
if (page_ready && view->synctex_result)
- highlight_forward_search_results (view, i);
+ highlight_forward_search_results (view, cr, i);
}
- cairo_destroy (cr);
-
- if (GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event)
- (* GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event) (widget, event);
+ if (GTK_WIDGET_CLASS (ev_view_parent_class)->draw)
+ GTK_WIDGET_CLASS (ev_view_parent_class)->draw (widget, cr);
return FALSE;
}
get_link_area (view, x, y, link, &link_area);
gtk_tooltip_set_text (tooltip, text);
gtk_tooltip_set_tip_area (tooltip, &link_area);
+ g_free (text);
+
+ return TRUE;
}
g_free (text);
- return TRUE;
+ return FALSE;
}
static void
GdkEventMotion *event)
{
EvView *view = EV_VIEW (widget);
- GdkWindow *bin_window;
+ GdkWindow *window;
gint x, y;
if (!view->document)
return FALSE;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
+ window = gtk_widget_get_window (widget);
- if (event->is_hint || event->window != bin_window) {
+ if (event->is_hint || event->window != window) {
gtk_widget_get_pointer (widget, &x, &y);
} else {
x = event->x;
return FALSE;
}
- return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
+ return gtk_bindings_activate_event (G_OBJECT (widget), event);
}
static gint
}
static void
-ev_view_style_set (GtkWidget *widget,
- GtkStyle *old_style)
+ev_view_style_updated (GtkWidget *widget)
{
if (EV_VIEW (widget)->pixbuf_cache)
ev_pixbuf_cache_style_changed (EV_VIEW (widget)->pixbuf_cache);
- GTK_WIDGET_CLASS (ev_view_parent_class)->style_set (widget, old_style);
+ GTK_WIDGET_CLASS (ev_view_parent_class)->style_updated (widget);
}
/*** Drawing ***/
static void
draw_rubberband (EvView *view,
- GdkWindow *window,
+ cairo_t *cr,
const GdkRectangle *rect,
gdouble alpha)
{
- GtkStyle *style;
- GdkColor *fill_color_gdk;
- gdouble r, g, b;
- cairo_t *cr;
-
- style = gtk_widget_get_style (GTK_WIDGET (view));
- fill_color_gdk = gdk_color_copy (&style->base[GTK_STATE_SELECTED]);
- r = fill_color_gdk->red / 65535.;
- g = fill_color_gdk->green / 65535.;
- b = fill_color_gdk->blue / 65535.;
+ GtkStyleContext *context;
+ GdkRGBA color;
- cr = gdk_cairo_create (window);
+ context = gtk_widget_get_style_context (GTK_WIDGET (view));
+ gtk_style_context_get_background_color (context, GTK_STATE_FLAG_SELECTED, &color);
+ cairo_save (cr);
- cairo_set_source_rgba (cr, r, g, b, alpha);
+ cairo_set_source_rgba (cr, color.red, color.green, color.blue, alpha);
cairo_rectangle (cr,
rect->x - view->scroll_x,
rect->y - view->scroll_y,
cairo_fill_preserve (cr);
cairo_set_line_width (cr, 0.5);
- cairo_set_source_rgb (cr, r, g, b);
+ cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_stroke (cr);
- cairo_destroy (cr);
-
- gdk_color_free (fill_color_gdk);
+ cairo_restore (cr);
}
static void
-highlight_find_results (EvView *view, int page)
+highlight_find_results (EvView *view,
+ cairo_t *cr,
+ int page)
{
gint i, n_results = 0;
- GdkWindow *bin_window;
-
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
-
n_results = ev_view_find_get_n_results (view, page);
for (i = 0; i < n_results; i++) {
rectangle = ev_view_find_get_result (view, page, i);
doc_rect_to_view_rect (view, page, rectangle, &view_rectangle);
- draw_rubberband (view, bin_window, &view_rectangle, alpha);
+ draw_rubberband (view, cr, &view_rectangle, alpha);
}
}
static void
-highlight_forward_search_results (EvView *view, int page)
+highlight_forward_search_results (EvView *view,
+ cairo_t *cr,
+ int page)
{
- GdkWindow *bin_window;
GdkRectangle rect;
- cairo_t *cr;
EvMapping *mapping = view->synctex_result;
if (GPOINTER_TO_INT (mapping->data) != page)
return;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
doc_rect_to_view_rect (view, page, &mapping->area, &rect);
- cr = gdk_cairo_create (bin_window);
+ cairo_save (cr);
cairo_set_source_rgb (cr, 1., 0., 0.);
cairo_rectangle (cr,
rect.x - view->scroll_x,
rect.y - view->scroll_y,
rect.width, rect.height);
cairo_stroke (cr);
- cairo_destroy (cr);
+ cairo_restore (cr);
}
static void
focus_annotation (EvView *view,
+ cairo_t *cr,
gint page,
GdkRectangle *clip)
{
return;
doc_rect_to_view_rect (view, page, &mapping->area, &rect);
- gtk_paint_focus (gtk_widget_get_style (widget),
- gtk_layout_get_bin_window (GTK_LAYOUT (view)),
- gtk_widget_get_state (widget),
- NULL, widget, NULL,
- rect.x - view->scroll_x,
- rect.y - view->scroll_y,
- rect.width + 1, rect.height + 1);
+
+ gtk_render_focus (gtk_widget_get_style_context (widget),
+ cr,
+ rect.x - view->scroll_x,
+ rect.y - view->scroll_y,
+ rect.width + 1, rect.height + 1);
}
static void
GdkRectangle *expose_area,
gboolean *page_ready)
{
- GdkWindow *bin_window;
GdkRectangle overlap;
GdkRectangle real_page_area;
gint current_page;
real_page_area.height -= (border->top + border->bottom);
*page_ready = TRUE;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
current_page = ev_document_model_get_page (view->model);
inverted_colors = ev_document_model_get_inverted_colors (view->model);
ev_document_misc_paint_one_page (cr,
}
static void
-ev_view_destroy (GtkObject *object)
+ev_view_dispose (GObject *object)
{
EvView *view = EV_VIEW (object);
view->loading_timeout = 0;
}
- ev_view_set_scroll_adjustments (GTK_LAYOUT (view), NULL, NULL);
+ gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (view), NULL);
+ gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (view), NULL);
+
+ G_OBJECT_CLASS (ev_view_parent_class)->dispose (object);
+}
+
+static void
+ev_view_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EvView *view = EV_VIEW (object);
+
+ switch (prop_id) {
+ case PROP_HADJUSTMENT:
+ g_value_set_object (value, view->hadjustment);
+ break;
+ case PROP_VADJUSTMENT:
+ g_value_set_object (value, view->vadjustment);
+ break;
+ case PROP_HSCROLL_POLICY:
+ g_value_set_enum (value, view->hscroll_policy);
+ break;
+ case PROP_VSCROLL_POLICY:
+ g_value_set_enum (value, view->vscroll_policy);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+ev_view_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EvView *view = EV_VIEW (object);
- GTK_OBJECT_CLASS (ev_view_parent_class)->destroy (object);
+ switch (prop_id) {
+ case PROP_HADJUSTMENT:
+ ev_view_set_scroll_adjustment (view, GTK_ORIENTATION_HORIZONTAL,
+ (GtkAdjustment *) g_value_get_object (value));
+ break;
+ case PROP_VADJUSTMENT:
+ ev_view_set_scroll_adjustment (view, GTK_ORIENTATION_VERTICAL,
+ (GtkAdjustment *) g_value_get_object (value));
+ break;
+ case PROP_HSCROLL_POLICY:
+ view->hscroll_policy = g_value_get_enum (value);
+ gtk_widget_queue_resize (GTK_WIDGET (view));
+ break;
+ case PROP_VSCROLL_POLICY:
+ view->vscroll_policy = g_value_get_enum (value);
+ gtk_widget_queue_resize (GTK_WIDGET (view));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static AtkObject *
ev_view_class_init (EvViewClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
- GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
- GtkLayoutClass *layout_class = GTK_LAYOUT_CLASS (class);
GtkBindingSet *binding_set;
+ object_class->get_property = ev_view_get_property;
+ object_class->set_property = ev_view_set_property;
+ object_class->dispose = ev_view_dispose;
object_class->finalize = ev_view_finalize;
- widget_class->expose_event = ev_view_expose_event;
+ widget_class->draw = ev_view_draw;
widget_class->button_press_event = ev_view_button_press_event;
widget_class->motion_notify_event = ev_view_motion_notify_event;
widget_class->button_release_event = ev_view_button_release_event;
widget_class->focus_in_event = ev_view_focus_in;
widget_class->focus_out_event = ev_view_focus_out;
widget_class->get_accessible = ev_view_get_accessible;
- widget_class->size_request = ev_view_size_request;
+ widget_class->get_preferred_width = ev_view_get_preferred_width;
+ widget_class->get_preferred_height = ev_view_get_preferred_height;
widget_class->size_allocate = ev_view_size_allocate;
- widget_class->realize = ev_view_realize;
widget_class->scroll_event = ev_view_scroll_event;
widget_class->enter_notify_event = ev_view_enter_notify_event;
widget_class->leave_notify_event = ev_view_leave_notify_event;
- widget_class->style_set = ev_view_style_set;
+ widget_class->style_updated = ev_view_style_updated;
widget_class->drag_data_get = ev_view_drag_data_get;
widget_class->drag_motion = ev_view_drag_motion;
widget_class->popup_menu = ev_view_popup_menu;
widget_class->query_tooltip = ev_view_query_tooltip;
- gtk_object_class->destroy = ev_view_destroy;
-
- layout_class->set_scroll_adjustments = ev_view_set_scroll_adjustments;
-
class->binding_activated = ev_view_scroll;
+ /* Scrollable interface */
+ g_object_class_override_property (object_class, PROP_HADJUSTMENT, "hadjustment");
+ g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment");
+ g_object_class_override_property (object_class, PROP_HSCROLL_POLICY, "hscroll-policy");
+ g_object_class_override_property (object_class, PROP_VSCROLL_POLICY, "vscroll-policy");
+
signals[SIGNAL_BINDING_ACTIVATED] = g_signal_new ("binding_activated",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
EV_TYPE_ANNOTATION);
+ signals[SIGNAL_LAYERS_CHANGED] = g_signal_new ("layers-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (EvViewClass, layers_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0,
+ G_TYPE_NONE);
binding_set = gtk_binding_set_by_class (class);
- add_scroll_binding_keypad (binding_set, GDK_Left, 0, GTK_SCROLL_STEP_BACKWARD, TRUE);
- add_scroll_binding_keypad (binding_set, GDK_Right, 0, GTK_SCROLL_STEP_FORWARD, TRUE);
- add_scroll_binding_keypad (binding_set, GDK_Left, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, TRUE);
- add_scroll_binding_keypad (binding_set, GDK_Right, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, TRUE);
- add_scroll_binding_keypad (binding_set, GDK_Up, 0, GTK_SCROLL_STEP_BACKWARD, FALSE);
- add_scroll_binding_keypad (binding_set, GDK_Down, 0, GTK_SCROLL_STEP_FORWARD, FALSE);
- add_scroll_binding_keypad (binding_set, GDK_Up, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, FALSE);
- add_scroll_binding_keypad (binding_set, GDK_Down, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, FALSE);
- gtk_binding_entry_add_signal (binding_set, GDK_H, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Left, 0, GTK_SCROLL_STEP_BACKWARD, TRUE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Right, 0, GTK_SCROLL_STEP_FORWARD, TRUE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Left, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, TRUE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Right, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, TRUE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Up, 0, GTK_SCROLL_STEP_BACKWARD, FALSE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Down, 0, GTK_SCROLL_STEP_FORWARD, FALSE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Up, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, FALSE);
+ add_scroll_binding_keypad (binding_set, GDK_KEY_Down, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, FALSE);
+ gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, TRUE);
- gtk_binding_entry_add_signal (binding_set, GDK_J, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
+ gtk_binding_entry_add_signal (binding_set, GDK_KEY_J, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, FALSE);
- gtk_binding_entry_add_signal (binding_set, GDK_K, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
+ gtk_binding_entry_add_signal (binding_set, GDK_KEY_K, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, FALSE);
- gtk_binding_entry_add_signal (binding_set, GDK_L, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
+ gtk_binding_entry_add_signal (binding_set, GDK_KEY_L, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE,
GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, TRUE);
}
static void
ev_view_init (EvView *view)
{
+ gtk_widget_set_has_window (GTK_WIDGET (view), TRUE);
gtk_widget_set_can_focus (GTK_WIDGET (view), TRUE);
+ gtk_widget_set_redraw_on_allocate (GTK_WIDGET (view), FALSE);
+ gtk_container_set_resize_mode (GTK_CONTAINER (view), GTK_RESIZE_QUEUE);
+
+ gtk_widget_set_events (GTK_WIDGET (view),
+ GDK_EXPOSURE_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_SCROLL_MASK |
+ GDK_KEY_PRESS_MASK |
+ GDK_POINTER_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_ENTER_NOTIFY_MASK |
+ GDK_LEAVE_NOTIFY_MASK);
view->start_page = -1;
view->end_page = -1;
view->pending_scroll = SCROLL_TO_KEEP_POSITION;
view->jump_to_find_result = TRUE;
view->highlight_find_results = FALSE;
-
- gtk_layout_set_hadjustment (GTK_LAYOUT (view), NULL);
- gtk_layout_set_vadjustment (GTK_LAYOUT (view), NULL);
}
/*** Callbacks ***/
EvView *view)
{
if (region) {
- GdkWindow *bin_window;
-
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
- gdk_window_invalidate_region (bin_window, region, TRUE);
+ gdk_window_invalidate_region (gtk_widget_get_window (GTK_WIDGET (view)), region, TRUE);
} else {
gtk_widget_queue_draw (GTK_WIDGET (view));
}
"x", &child_x,
"y", &child_y,
NULL);
- gtk_layout_move (GTK_LAYOUT (view), child, child_x + dx, child_y + dy);
+ gtk_fixed_move (GTK_FIXED (view), child, child_x + dx, child_y + dy);
}
g_list_free (children);
if (view->pending_resize) {
gtk_widget_queue_draw (GTK_WIDGET (view));
} else {
- GdkWindow *bin_window;
-
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
- gdk_window_scroll (bin_window, dx, dy);
+ gdk_window_scroll (gtk_widget_get_window (GTK_WIDGET (view)), dx, dy);
}
gtk_widget_get_pointer (GTK_WIDGET (view), &x, &y);
/* Redraw the damaged region! */
if (region) {
- GdkWindow *bin_window;
GdkRectangle page_area;
GtkBorder border;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
ev_view_get_page_extents (view, cur_page, &page_area, &border);
cairo_region_translate (region,
page_area.x + border.left - view->scroll_x,
page_area.y + border.top - view->scroll_y);
- gdk_window_invalidate_region (bin_window, region, TRUE);
+ gdk_window_invalidate_region (gtk_widget_get_window (GTK_WIDGET (view)), region, TRUE);
cairo_region_destroy (region);
}
}
{
GdkCursor *cursor = NULL;
GtkWidget *widget;
- GdkWindow *bin_window;
+ GdkWindow *window;
if (view->cursor == new_cursor) {
return;
view->cursor = new_cursor;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
+ window = gtk_widget_get_window (GTK_WIDGET (view));
widget = gtk_widget_get_toplevel (GTK_WIDGET (view));
cursor = ev_view_cursor_new (gtk_widget_get_display (widget), new_cursor);
- gdk_window_set_cursor (bin_window, cursor);
+ gdk_window_set_cursor (window, cursor);
gdk_flush ();
if (cursor)
gdk_cursor_unref (cursor);