summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2016-04-12 10:35:15 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2016-04-12 10:35:15 +0000
commita907096a990015010ec1171cd8997d33951f28a2 (patch)
treebcfab1e121f3ab398e6df384a205737500af0351
parentAdd option for larger icons (useful for 4K display). (diff)
downloadinkscape-a907096a990015010ec1171cd8997d33951f28a2.tar.gz
inkscape-a907096a990015010ec1171cd8997d33951f28a2.zip
Hackfest 2016: un-obfuscate the SPCanvas widget.
(bzr r14790)
-rw-r--r--src/desktop.cpp4
-rw-r--r--src/display/sp-canvas.cpp898
-rw-r--r--src/display/sp-canvas.h183
-rw-r--r--src/extension/dbus/document-interface.cpp4
-rw-r--r--src/extension/execution-env.cpp2
-rw-r--r--src/selection-chemistry.cpp4
-rw-r--r--src/ui/interface.cpp4
-rw-r--r--src/ui/tool/event-utils.cpp8
-rw-r--r--src/ui/tools/connector-tool.cpp4
-rw-r--r--src/widgets/desktop-widget.cpp16
10 files changed, 495 insertions, 632 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 84a578ee9..331ab3351 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -501,7 +501,7 @@ void SPDesktop::redrawDesktop() {
void SPDesktop::_setDisplayMode(Inkscape::RenderMode mode) {
SP_CANVAS_ARENA (drawing)->drawing.setRenderMode(mode);
- canvas->rendermode = mode;
+ canvas->_rendermode = mode;
_display_mode = mode;
redrawDesktop();
_widget->setTitle( this->getDocument()->getName() );
@@ -522,7 +522,7 @@ void SPDesktop::_setDisplayColorMode(Inkscape::ColorMode mode) {
}
SP_CANVAS_ARENA (drawing)->drawing.setColorMode(mode);
- canvas->colorrendermode = mode;
+ canvas->_colorrendermode = mode;
_display_color_mode = mode;
redrawDesktop();
_widget->setTitle( this->getDocument()->getName() );
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index 81ea7d142..df84e379c 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -173,159 +173,8 @@ bool is_descendant(SPCanvasItem const *item, SPCanvasItem const *parent);
guint item_signals[ITEM_LAST_SIGNAL] = { 0 };
-struct PaintRectSetup;
-
} // namespace
-class SPCanvasImpl
-{
-public:
-
- /**
- * Helper that emits an event for an item in the canvas, be it the current
- * item, grabbed item, or focused item, as appropriate.
- */
- static int emitEvent(SPCanvas *canvas, GdkEvent *event);
-
- /**
- * Helper that re-picks the current item in the canvas, based on the event's
- * coordinates and emits enter/leave events for items as appropriate.
- */
- static int pickCurrentItem(SPCanvas *canvas, GdkEvent *event);
-
- /**
- * The canvas widget's realize callback.
- */
- static void realize(GtkWidget *widget);
-
- /**
- * The canvas widget's unrealize callback.
- */
- static void unrealize(GtkWidget *widget);
-
- /**
- * The canvas widget's size request callback.
- */
-#if GTK_CHECK_VERSION(3,0,0)
- static void getPreferredWidth(GtkWidget *widget, gint *min_w, gint *nat_w);
- static void getPreferredHeight(GtkWidget *widget, gint *min_h, gint *nat_h);
-#else
- static void sizeRequest(GtkWidget *widget, GtkRequisition *req);
-#endif
-
- /**
- * The canvas widget's size allocate callback.
- */
- static void sizeAllocate(GtkWidget *widget, GtkAllocation *allocation);
-
- /**
- * Button event handler for the canvas.
- */
- static gint button(GtkWidget *widget, GdkEventButton *event);
-
- /**
- * Scroll event handler for the canvas.
- *
- * @todo FIXME: generate motion events to re-select items.
- */
- static gint handleScroll(GtkWidget *widget, GdkEventScroll *event);
-
- /**
- * Motion event handler for the canvas.
- */
- static gint handleMotion(GtkWidget *widget, GdkEventMotion *event);
-
- /**
- * The canvas widget's expose callback.
- *
- * @todo FIXME: function allways retruns false.
- */
-#if GTK_CHECK_VERSION(3,0,0)
- static gboolean handleDraw(GtkWidget *widget, cairo_t *cr);
-#else
- static gboolean handleExpose(GtkWidget *widget, GdkEventExpose *event);
-#endif
-
- /**
- * The canvas widget's keypress callback.
- */
- static gint handleKeyEvent(GtkWidget *widget, GdkEventKey *event);
-
- /**
- * Crossing event handler for the canvas.
- */
- static gint handleCrossing(GtkWidget *widget, GdkEventCrossing *event);
-
- /**
- * Focus in handler for the canvas.
- */
- static gint handleFocusIn(GtkWidget *widget, GdkEventFocus *event);
-
- /**
- * Focus out handler for the canvas.
- */
- static gint handleFocusOut(GtkWidget *widget, GdkEventFocus *event);
-
- /**
- * Helper that allocates a new tile array for the canvas, copying overlapping tiles from the old array
- */
- static void sp_canvas_resize_tiles(SPCanvas* canvas, int nl, int nt, int nr, int nb);
-
- /**
- * Helper that queues a canvas rectangle for redraw
- */
- static void sp_canvas_dirty_rect(SPCanvas* canvas, Geom::IntRect const &area);
-
- /**
- * Helper that marks specific canvas rectangle as clean (val == 0) or dirty (otherwise)
- */
- static void sp_canvas_mark_rect(SPCanvas* canvas, Geom::IntRect const &area, uint8_t val);
-
- /**
- * Helper that invokes update, paint, and repick on canvas.
- */
- static int do_update(SPCanvas *canvas);
-
- static void sp_canvas_paint_single_buffer(SPCanvas *canvas, Geom::IntRect const &paint_rect, Geom::IntRect const &canvas_rect, int sw);
-
- /**
- * Paint the given rect, recursively subdividing the region until it is the size of a single
- * buffer.
- *
- * @return true if the drawing completes
- */
- static int sp_canvas_paint_rect_internal(PaintRectSetup const *setup, Geom::IntRect const &this_rect);
-
- /**
- * Helper that draws a specific rectangular part of the canvas.
- *
- * @return true if the rectangle painting succeeds.
- */
- static bool sp_canvas_paint_rect(SPCanvas *canvas, int xx0, int yy0, int xx1, int yy1);
-
- /**
- * Helper that repaints the areas in the canvas that need it.
- *
- * @return true if all the dirty parts have been redrawn
- */
- static int paint(SPCanvas *canvas);
-
- /**
- * Idle handler for the canvas that deals with pending updates and redraws.
- */
- static gint idle_handler(gpointer data);
-
- /**
- * Convenience function to add an idle handler to a canvas.
- */
- static void add_idle(SPCanvas *canvas);
-
- /**
- * Update callback for canvas widget.
- */
- static void requestCanvasUpdate(SPCanvas *canvas);
-};
-
G_DEFINE_TYPE(SPCanvasItem, sp_canvas_item, G_TYPE_INITIALLY_UNOWNED);
static void
@@ -456,18 +305,18 @@ void sp_canvas_item_dispose(GObject *object)
}
item->visible = FALSE;
- if (item == item->canvas->current_item) {
- item->canvas->current_item = NULL;
- item->canvas->need_repick = TRUE;
+ if (item == item->canvas->_current_item) {
+ item->canvas->_current_item = NULL;
+ item->canvas->_need_repick = TRUE;
}
- if (item == item->canvas->new_current_item) {
- item->canvas->new_current_item = NULL;
- item->canvas->need_repick = TRUE;
+ if (item == item->canvas->_new_current_item) {
+ item->canvas->_new_current_item = NULL;
+ item->canvas->_need_repick = TRUE;
}
- if (item == item->canvas->grabbed_item) {
- item->canvas->grabbed_item = NULL;
+ if (item == item->canvas->_grabbed_item) {
+ item->canvas->_grabbed_item = NULL;
#if GTK_CHECK_VERSION(3,0,0)
GdkDeviceManager *dm = gdk_display_get_device_manager(gdk_display_get_default());
@@ -478,8 +327,8 @@ void sp_canvas_item_dispose(GObject *object)
#endif
}
- if (item == item->canvas->focused_item) {
- item->canvas->focused_item = NULL;
+ if (item == item->canvas->_focused_item) {
+ item->canvas->_focused_item = NULL;
}
if (item->parent) {
@@ -577,11 +426,11 @@ void sp_canvas_item_affine_absolute(SPCanvasItem *item, Geom::Affine const &affi
if (item->parent != NULL) {
sp_canvas_item_request_update (item->parent);
} else {
- SPCanvasImpl::requestCanvasUpdate(item->canvas);
+ item->canvas->requestUpdate();
}
}
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
/**
@@ -614,7 +463,7 @@ void sp_canvas_item_raise(SPCanvasItem *item, int positions)
parent->items.insert(l, item);
redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
void sp_canvas_item_raise_to_top(SPCanvasItem *item)
@@ -627,7 +476,7 @@ void sp_canvas_item_raise_to_top(SPCanvasItem *item)
parent->items.remove(item);
parent->items.push_back(item);
redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
@@ -663,7 +512,7 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions)
parent->items.insert(l, item);
redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
void sp_canvas_item_lower_to_bottom(SPCanvasItem *item)
@@ -676,7 +525,7 @@ void sp_canvas_item_lower_to_bottom(SPCanvasItem *item)
parent->items.remove(item);
parent->items.push_front(item);
redraw_if_visible (item);
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
bool sp_canvas_item_is_visible(SPCanvasItem *item)
@@ -705,7 +554,7 @@ void sp_canvas_item_show(SPCanvasItem *item)
if (x0 !=0 || x1 !=0 || y0 !=0 || y1 !=0) {
item->canvas->requestRedraw((int)(item->x1), (int)(item->y1), (int)(item->x2 + 1), (int)(item->y2 + 1));
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
}
@@ -730,7 +579,7 @@ void sp_canvas_item_hide(SPCanvasItem *item)
if (x0 !=0 || x1 !=0 || y0 !=0 || y1 !=0) {
item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)(item->x2 + 1), (int)(item->y2 + 1));
- item->canvas->need_repick = TRUE;
+ item->canvas->_need_repick = TRUE;
}
}
@@ -745,7 +594,7 @@ int sp_canvas_item_grab(SPCanvasItem *item, guint event_mask, GdkCursor *cursor,
g_return_val_if_fail (SP_IS_CANVAS_ITEM (item), -1);
g_return_val_if_fail (gtk_widget_get_mapped (GTK_WIDGET (item->canvas)), -1);
- if (item->canvas->grabbed_item) {
+ if (item->canvas->_grabbed_item) {
return -1;
}
@@ -780,9 +629,9 @@ int sp_canvas_item_grab(SPCanvasItem *item, guint event_mask, GdkCursor *cursor,
NULL, cursor, etime);
#endif
- item->canvas->grabbed_item = item;
- item->canvas->grabbed_event_mask = event_mask;
- item->canvas->current_item = item; // So that events go to the grabbed item
+ item->canvas->_grabbed_item = item;
+ item->canvas->_grabbed_event_mask = event_mask;
+ item->canvas->_current_item = item; // So that events go to the grabbed item
return 0;
}
@@ -799,11 +648,11 @@ void sp_canvas_item_ungrab(SPCanvasItem *item, guint32 etime)
g_return_if_fail (item != NULL);
g_return_if_fail (SP_IS_CANVAS_ITEM (item));
- if (item->canvas->grabbed_item != item) {
+ if (item->canvas->_grabbed_item != item) {
return;
}
- item->canvas->grabbed_item = NULL;
+ item->canvas->_grabbed_item = NULL;
#if GTK_CHECK_VERSION(3,0,0)
GdkDeviceManager *dm = gdk_display_get_device_manager(gdk_display_get_default());
@@ -865,7 +714,7 @@ void sp_canvas_item_request_update(SPCanvasItem *item)
sp_canvas_item_request_update (item->parent);
} else {
// Have reached the top of the tree, make sure the update call gets scheduled.
- SPCanvasImpl::requestCanvasUpdate(item->canvas);
+ item->canvas->requestUpdate();
}
}
@@ -955,10 +804,10 @@ double SPCanvasGroup::point(SPCanvasItem *item, Geom::Point p, SPCanvasItem **ac
SPCanvasGroup const *group = SP_CANVAS_GROUP(item);
double const x = p[Geom::X];
double const y = p[Geom::Y];
- int x1 = (int)(x - item->canvas->close_enough);
- int y1 = (int)(y - item->canvas->close_enough);
- int x2 = (int)(x + item->canvas->close_enough);
- int y2 = (int)(y + item->canvas->close_enough);
+ int x1 = (int)(x - item->canvas->_close_enough);
+ int y1 = (int)(y - item->canvas->_close_enough);
+ int x2 = (int)(x + item->canvas->_close_enough);
+ int y2 = (int)(y + item->canvas->_close_enough);
double best = 0.0;
*actual_item = NULL;
@@ -984,7 +833,7 @@ double SPCanvasGroup::point(SPCanvasItem *item, Geom::Point p, SPCanvasItem **ac
// of the item to be focused, and have that one selected. Of course this will only work if the
// centers are not coincident, but at least it's better than what we have now.
// See the extensive comment in Inkscape::SelTrans::_updateHandles()
- if (pickable && point_item && ((int) (dist + 0.5) <= item->canvas->close_enough)) {
+ if (pickable && point_item && ((int) (dist + 0.5) <= item->canvas->_close_enough)) {
best = dist;
*actual_item = point_item;
}
@@ -1049,135 +898,117 @@ void SPCanvasGroup::remove(SPCanvasItem *item)
}
-static void sp_canvas_dispose (GObject *object);
-static void sp_canvas_shutdown_transients(SPCanvas *canvas);
-
G_DEFINE_TYPE(SPCanvas, sp_canvas, GTK_TYPE_WIDGET);
-static void
-sp_canvas_class_init(SPCanvasClass *klass)
+void sp_canvas_class_init(SPCanvasClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
- object_class->dispose = sp_canvas_dispose;
+ object_class->dispose = SPCanvas::dispose;
- widget_class->realize = SPCanvasImpl::realize;
- widget_class->unrealize = SPCanvasImpl::unrealize;
+ widget_class->realize = SPCanvas::handle_realize;
+ widget_class->unrealize = SPCanvas::handle_unrealize;
#if GTK_CHECK_VERSION(3,0,0)
- widget_class->get_preferred_width = SPCanvasImpl::getPreferredWidth;
- widget_class->get_preferred_height = SPCanvasImpl::getPreferredHeight;
- widget_class->draw = SPCanvasImpl::handleDraw;
+ widget_class->get_preferred_width = SPCanvas::handle_get_preferred_width;
+ widget_class->get_preferred_height = SPCanvas::handle_get_preferred_height;
+ widget_class->draw = SPCanvas::handle_draw;
#else
- widget_class->size_request = SPCanvasImpl::sizeRequest;
- widget_class->expose_event = SPCanvasImpl::handleExpose;
+ widget_class->size_request = SPCanvas::handle_size_request;
+ widget_class->expose_event = SPCanvas::handle_expose;
#endif
- widget_class->size_allocate = SPCanvasImpl::sizeAllocate;
- widget_class->button_press_event = SPCanvasImpl::button;
- widget_class->button_release_event = SPCanvasImpl::button;
- widget_class->motion_notify_event = SPCanvasImpl::handleMotion;
- widget_class->scroll_event = SPCanvasImpl::handleScroll;
- widget_class->key_press_event = SPCanvasImpl::handleKeyEvent;
- widget_class->key_release_event = SPCanvasImpl::handleKeyEvent;
- widget_class->enter_notify_event = SPCanvasImpl::handleCrossing;
- widget_class->leave_notify_event = SPCanvasImpl::handleCrossing;
- widget_class->focus_in_event = SPCanvasImpl::handleFocusIn;
- widget_class->focus_out_event = SPCanvasImpl::handleFocusOut;
+ widget_class->size_allocate = SPCanvas::handle_size_allocate;
+ widget_class->button_press_event = SPCanvas::handle_button;
+ widget_class->button_release_event = SPCanvas::handle_button;
+ widget_class->motion_notify_event = SPCanvas::handle_motion;
+ widget_class->scroll_event = SPCanvas::handle_scroll;
+ widget_class->key_press_event = SPCanvas::handle_key_event;
+ widget_class->key_release_event = SPCanvas::handle_key_event;
+ widget_class->enter_notify_event = SPCanvas::handle_crossing;
+ widget_class->leave_notify_event = SPCanvas::handle_crossing;
+ widget_class->focus_in_event = SPCanvas::handle_focus_in;
+ widget_class->focus_out_event = SPCanvas::handle_focus_out;
}
-static void
-sp_canvas_init(SPCanvas *canvas)
+static void sp_canvas_init(SPCanvas *canvas)
{
gtk_widget_set_has_window (GTK_WIDGET (canvas), TRUE);
gtk_widget_set_double_buffered (GTK_WIDGET (canvas), FALSE);
gtk_widget_set_can_focus (GTK_WIDGET (canvas), TRUE);
- canvas->pick_event.type = GDK_LEAVE_NOTIFY;
- canvas->pick_event.crossing.x = 0;
- canvas->pick_event.crossing.y = 0;
+ canvas->_pick_event.type = GDK_LEAVE_NOTIFY;
+ canvas->_pick_event.crossing.x = 0;
+ canvas->_pick_event.crossing.y = 0;
// Create the root item as a special case
- canvas->root = SP_CANVAS_ITEM(g_object_new(SP_TYPE_CANVAS_GROUP, NULL));
- canvas->root->canvas = canvas;
+ canvas->_root = SP_CANVAS_ITEM(g_object_new(SP_TYPE_CANVAS_GROUP, NULL));
+ canvas->_root->canvas = canvas;
- g_object_ref (canvas->root);
- g_object_ref_sink (canvas->root);
+ g_object_ref (canvas->_root);
+ g_object_ref_sink (canvas->_root);
- canvas->need_repick = TRUE;
+ canvas->_need_repick = TRUE;
// See comment at in sp-canvas.h.
- canvas->gen_all_enter_events = false;
+ canvas->_gen_all_enter_events = false;
- canvas->drawing_disabled = false;
+ canvas->_drawing_disabled = false;
- canvas->tiles=NULL;
- canvas->tLeft=canvas->tTop=canvas->tRight=canvas->tBottom=0;
- canvas->tileH=canvas->tileV=0;
+ canvas->_tiles=NULL;
+ canvas->_tLeft=canvas->_tTop=canvas->_tRight=canvas->_tBottom=0;
+ canvas->_tile_h=canvas->_tile_h=0;
- canvas->forced_redraw_count = 0;
- canvas->forced_redraw_limit = -1;
+ canvas->_forced_redraw_count = 0;
+ canvas->_forced_redraw_limit = -1;
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- canvas->enable_cms_display_adj = false;
- new (&canvas->cms_key) Glib::ustring("");
+ canvas->_enable_cms_display_adj = false;
+ new (&canvas->_cms_key) Glib::ustring("");
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- canvas->is_scrolling = false;
+ canvas->_is_scrolling = false;
}
-static void sp_canvas_remove_idle(SPCanvas *canvas)
-{
- if (canvas->idle_id) {
- g_source_remove (canvas->idle_id);
- canvas->idle_id = 0;
- }
-}
-
-static void
-sp_canvas_shutdown_transients(SPCanvas *canvas)
+void SPCanvas::shutdownTransients()
{
// We turn off the need_redraw flag, since if the canvas is mapped again
// it will request a redraw anyways. We do not turn off the need_update
// flag, though, because updates are not queued when the canvas remaps
// itself.
//
- if (canvas->need_redraw) {
- canvas->need_redraw = FALSE;
- }
- if ( canvas->tiles ) g_free(canvas->tiles);
- canvas->tiles=NULL;
- canvas->tLeft=canvas->tTop=canvas->tRight=canvas->tBottom=0;
- canvas->tileH=canvas->tileV=0;
-
- if (canvas->grabbed_item) {
- canvas->grabbed_item = NULL;
+ _need_redraw = FALSE;
+ if (_tiles) g_free(_tiles);
+ _tiles = NULL;
+ _tLeft = _tTop = _tRight = _tBottom = 0;
+ _tile_h = _tile_h = 0;
+
+ if (_grabbed_item) {
+ _grabbed_item = NULL;
#if GTK_CHECK_VERSION(3,0,0)
GdkDeviceManager *dm = gdk_display_get_device_manager(gdk_display_get_default());
GdkDevice *device = gdk_device_manager_get_client_pointer(dm);
gdk_device_ungrab(device, GDK_CURRENT_TIME);
#else
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
+ gdk_pointer_ungrab(GDK_CURRENT_TIME);
#endif
}
-
- sp_canvas_remove_idle(canvas);
+ removeIdle();
}
-static void
-sp_canvas_dispose(GObject *object)
+void SPCanvas::dispose(GObject *object)
{
SPCanvas *canvas = SP_CANVAS(object);
- if (canvas->root) {
- g_object_unref (canvas->root);
- canvas->root = NULL;
+ if (canvas->_root) {
+ g_object_unref (canvas->_root);
+ canvas->_root = NULL;
}
- sp_canvas_shutdown_transients(canvas);
+ canvas->shutdownTransients();
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- canvas->cms_key.~ustring();
+ canvas->_cms_key.~ustring();
#endif
if (G_OBJECT_CLASS(sp_canvas_parent_class)->dispose) {
(* G_OBJECT_CLASS(sp_canvas_parent_class)->dispose)(object);
@@ -1203,7 +1034,7 @@ GtkWidget *SPCanvas::createAA()
return GTK_WIDGET(canvas);
}
-void SPCanvasImpl::realize(GtkWidget *widget)
+void SPCanvas::handle_realize(GtkWidget *widget)
{
GdkWindowAttr attributes;
GtkAllocation allocation;
@@ -1264,15 +1095,15 @@ void SPCanvasImpl::realize(GtkWidget *widget)
gtk_widget_set_realized (widget, TRUE);
}
-void SPCanvasImpl::unrealize(GtkWidget *widget)
+void SPCanvas::handle_unrealize(GtkWidget *widget)
{
SPCanvas *canvas = SP_CANVAS (widget);
- canvas->current_item = NULL;
- canvas->grabbed_item = NULL;
- canvas->focused_item = NULL;
+ canvas->_current_item = NULL;
+ canvas->_grabbed_item = NULL;
+ canvas->_focused_item = NULL;
- sp_canvas_shutdown_transients(canvas);
+ canvas->shutdownTransients();
if (GTK_WIDGET_CLASS(sp_canvas_parent_class)->unrealize)
(* GTK_WIDGET_CLASS(sp_canvas_parent_class)->unrealize)(widget);
@@ -1280,21 +1111,21 @@ void SPCanvasImpl::unrealize(GtkWidget *widget)
#if GTK_CHECK_VERSION(3,0,0)
-void SPCanvasImpl::getPreferredWidth(GtkWidget *widget, gint *minimum_width, gint *natural_width)
+void SPCanvas::handle_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width)
{
static_cast<void>(SP_CANVAS (widget));
*minimum_width = 256;
*natural_width = 256;
}
-void SPCanvasImpl::getPreferredHeight(GtkWidget *widget, gint *minimum_height, gint *natural_height)
+void SPCanvas::handle_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height)
{
static_cast<void>(SP_CANVAS (widget));
*minimum_height = 256;
*natural_height = 256;
}
#else
-void SPCanvasImpl::sizeRequest(GtkWidget *widget, GtkRequisition *req)
+void SPCanvas::handle_size_request(GtkWidget *widget, GtkRequisition *req)
{
static_cast<void>(SP_CANVAS (widget));
@@ -1304,7 +1135,7 @@ void SPCanvasImpl::sizeRequest(GtkWidget *widget, GtkRequisition *req)
#endif
-void SPCanvasImpl::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
+void SPCanvas::handle_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
{
SPCanvas *canvas = SP_CANVAS (widget);
GtkAllocation widg_allocation;
@@ -1314,25 +1145,25 @@ void SPCanvasImpl::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
// Geom::IntRect old_area = Geom::IntRect::from_xywh(canvas->x0, canvas->y0,
// widg_allocation.width, widg_allocation.height);
- Geom::IntRect new_area = Geom::IntRect::from_xywh(canvas->x0, canvas->y0,
+ Geom::IntRect new_area = Geom::IntRect::from_xywh(canvas->_x0, canvas->_y0,
allocation->width, allocation->height);
// Schedule redraw of new region
- sp_canvas_resize_tiles(canvas,canvas->x0,canvas->y0,canvas->x0+allocation->width,canvas->y0+allocation->height);
- if (SP_CANVAS_ITEM_GET_CLASS (canvas->root)->viewbox_changed)
- SP_CANVAS_ITEM_GET_CLASS (canvas->root)->viewbox_changed (canvas->root, new_area);
-
+ canvas->resizeTiles(canvas->_x0, canvas->_y0, canvas->_x0 + allocation->width, canvas->_y0 + allocation->height);
+ if (SP_CANVAS_ITEM_GET_CLASS (canvas->_root)->viewbox_changed)
+ SP_CANVAS_ITEM_GET_CLASS (canvas->_root)->viewbox_changed (canvas->_root, new_area);
+
if (allocation->width > widg_allocation.width) {
- canvas->requestRedraw(canvas->x0 + widg_allocation.width,
+ canvas->requestRedraw(canvas->_x0 + widg_allocation.width,
0,
- canvas->x0 + allocation->width,
- canvas->y0 + allocation->height);
+ canvas->_x0 + allocation->width,
+ canvas->_y0 + allocation->height);
}
if (allocation->height > widg_allocation.height) {
canvas->requestRedraw(0,
- canvas->y0 + widg_allocation.height,
- canvas->x0 + allocation->width,
- canvas->y0 + allocation->height);
+ canvas->_y0 + widg_allocation.height,
+ canvas->_x0 + allocation->width,
+ canvas->_y0 + allocation->height);
}
gtk_widget_set_allocation (widget, allocation);
@@ -1344,11 +1175,11 @@ void SPCanvasImpl::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
}
}
-int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event)
+int SPCanvas::emitEvent(GdkEvent *event)
{
guint mask;
- if (canvas->grabbed_item) {
+ if (_grabbed_item) {
switch (event->type) {
case GDK_ENTER_NOTIFY:
mask = GDK_ENTER_NOTIFY_MASK;
@@ -1384,7 +1215,7 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event)
break;
}
- if (!(mask & canvas->grabbed_event_mask)) return FALSE;
+ if (!(mask & _grabbed_event_mask)) return FALSE;
}
// Convert to world coordinates -- we have two cases because of different
@@ -1395,25 +1226,25 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event)
switch (ev->type) {
case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY:
- ev->crossing.x += canvas->x0;
- ev->crossing.y += canvas->y0;
+ ev->crossing.x += _x0;
+ ev->crossing.y += _y0;
break;
case GDK_MOTION_NOTIFY:
case GDK_BUTTON_PRESS:
case GDK_2BUTTON_PRESS:
case GDK_3BUTTON_PRESS:
case GDK_BUTTON_RELEASE:
- ev->motion.x += canvas->x0;
- ev->motion.y += canvas->y0;
+ ev->motion.x += _x0;
+ ev->motion.y += _y0;
break;
default:
break;
}
// Block Undo and Redo while we drag /anything/
if(event->type == GDK_BUTTON_PRESS && event->button.button == 1)
- canvas->is_dragging = true;
+ _is_dragging = true;
else if(event->type == GDK_BUTTON_RELEASE)
- canvas->is_dragging = false;
+ _is_dragging = false;
// Choose where we send the event
@@ -1422,17 +1253,17 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event)
// Lauris applied to SP to get around the problem.
//
SPCanvasItem* item = NULL;
- if (canvas->grabbed_item && !is_descendant (canvas->current_item, canvas->grabbed_item)) {
- item = canvas->grabbed_item;
+ if (_grabbed_item && !is_descendant(_current_item, _grabbed_item)) {
+ item = _grabbed_item;
} else {
- item = canvas->current_item;
+ item = _current_item;
}
- if (canvas->focused_item &&
+ if (_focused_item &&
((event->type == GDK_KEY_PRESS) ||
(event->type == GDK_KEY_RELEASE) ||
(event->type == GDK_FOCUS_CHANGE))) {
- item = canvas->focused_item;
+ item = _focused_item;
}
// The event is propagated up the hierarchy (for if someone connected to
@@ -1454,24 +1285,24 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event)
return finished;
}
-int SPCanvasImpl::pickCurrentItem(SPCanvas *canvas, GdkEvent *event)
+int SPCanvas::pickCurrentItem(GdkEvent *event)
{
int button_down = 0;
- if (!canvas->root) // canvas may have already be destroyed by closing desktop during interrupted display!
+ if (!_root) // canvas may have already be destroyed by closing desktop during interrupted display!
return FALSE;
int retval = FALSE;
- if (canvas->gen_all_enter_events == false) {
+ if (_gen_all_enter_events == false) {
// If a button is down, we'll perform enter and leave events on the
// current item, but not enter on any other item. This is more or
// less like X pointer grabbing for canvas items.
//
- button_down = canvas->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK |
+ button_down = _state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK |
GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK);
- if (!button_down) canvas->left_grabbed_item = FALSE;
+ if (!button_down) _left_grabbed_item = FALSE;
}
// Save the event in the canvas. This is used to synthesize enter and
@@ -1479,116 +1310,115 @@ int SPCanvasImpl::pickCurrentItem(SPCanvas *canvas, GdkEvent *event)
// re-pick the current item if the current one gets deleted. Also,
// synthesize an enter event.
- if (event != &canvas->pick_event) {
+ if (event != &_pick_event) {
if ((event->type == GDK_MOTION_NOTIFY) || (event->type == GDK_BUTTON_RELEASE)) {
// these fields have the same offsets in both types of events
- canvas->pick_event.crossing.type = GDK_ENTER_NOTIFY;
- canvas->pick_event.crossing.window = event->motion.window;
- canvas->pick_event.crossing.send_event = event->motion.send_event;
- canvas->pick_event.crossing.subwindow = NULL;
- canvas->pick_event.crossing.x = event->motion.x;
- canvas->pick_event.crossing.y = event->motion.y;
- canvas->pick_event.crossing.mode = GDK_CROSSING_NORMAL;
- canvas->pick_event.crossing.detail = GDK_NOTIFY_NONLINEAR;
- canvas->pick_event.crossing.focus = FALSE;
- canvas->pick_event.crossing.state = event->motion.state;
+ _pick_event.crossing.type = GDK_ENTER_NOTIFY;
+ _pick_event.crossing.window = event->motion.window;
+ _pick_event.crossing.send_event = event->motion.send_event;
+ _pick_event.crossing.subwindow = NULL;
+ _pick_event.crossing.x = event->motion.x;
+ _pick_event.crossing.y = event->motion.y;
+ _pick_event.crossing.mode = GDK_CROSSING_NORMAL;
+ _pick_event.crossing.detail = GDK_NOTIFY_NONLINEAR;
+ _pick_event.crossing.focus = FALSE;
+ _pick_event.crossing.state = event->motion.state;
// these fields don't have the same offsets in both types of events
if (event->type == GDK_MOTION_NOTIFY) {
- canvas->pick_event.crossing.x_root = event->motion.x_root;
- canvas->pick_event.crossing.y_root = event->motion.y_root;
+ _pick_event.crossing.x_root = event->motion.x_root;
+ _pick_event.crossing.y_root = event->motion.y_root;
} else {
- canvas->pick_event.crossing.x_root = event->button.x_root;
- canvas->pick_event.crossing.y_root = event->button.y_root;
+ _pick_event.crossing.x_root = event->button.x_root;
+ _pick_event.crossing.y_root = event->button.y_root;
}
} else {
- canvas->pick_event = *event;
+ _pick_event = *event;
}
}
// Don't do anything else if this is a recursive call
- if (canvas->in_repick) {
+ if (_in_repick) {
return retval;
}
// LeaveNotify means that there is no current item, so we don't look for one
- if (canvas->pick_event.type != GDK_LEAVE_NOTIFY) {
+ if (_pick_event.type != GDK_LEAVE_NOTIFY) {
// these fields don't have the same offsets in both types of events
double x, y;
- if (canvas->pick_event.type == GDK_ENTER_NOTIFY) {
- x = canvas->pick_event.crossing.x;
- y = canvas->pick_event.crossing.y;
+ if (_pick_event.type == GDK_ENTER_NOTIFY) {
+ x = _pick_event.crossing.x;
+ y = _pick_event.crossing.y;
} else {
- x = canvas->pick_event.motion.x;
- y = canvas->pick_event.motion.y;
+ x = _pick_event.motion.x;
+ y = _pick_event.motion.y;
}
// world coords
- x += canvas->x0;
- y += canvas->y0;
+ x += _x0;
+ y += _y0;
// find the closest item
- if (canvas->root->visible) {
- sp_canvas_item_invoke_point (canvas->root, Geom::Point(x, y), &canvas->new_current_item);
+ if (_root->visible) {
+ sp_canvas_item_invoke_point (_root, Geom::Point(x, y), &_new_current_item);
} else {
- canvas->new_current_item = NULL;
+ _new_current_item = NULL;
}
} else {
- canvas->new_current_item = NULL;
+ _new_current_item = NULL;
}
- if ((canvas->new_current_item == canvas->current_item) && !canvas->left_grabbed_item) {
+ if ((_new_current_item == _current_item) && !_left_grabbed_item) {
return retval; // current item did not change
}
// Synthesize events for old and new current items
- if ((canvas->new_current_item != canvas->current_item)
- && (canvas->current_item != NULL)
- && !canvas->left_grabbed_item) {
+ if ((_new_current_item != _current_item) &&
+ _current_item != NULL && !_left_grabbed_item)
+ {
GdkEvent new_event;
- new_event = canvas->pick_event;
+ new_event = _pick_event;
new_event.type = GDK_LEAVE_NOTIFY;
new_event.crossing.detail = GDK_NOTIFY_ANCESTOR;
new_event.crossing.subwindow = NULL;
- canvas->in_repick = TRUE;
- retval = emitEvent(canvas, &new_event);
- canvas->in_repick = FALSE;
+ _in_repick = TRUE;
+ retval = emitEvent(&new_event);
+ _in_repick = FALSE;
}
- if (canvas->gen_all_enter_events == false) {
+ if (_gen_all_enter_events == false) {
// new_current_item may have been set to NULL during the call to
// emitEvent() above
- if ((canvas->new_current_item != canvas->current_item) && button_down) {
- canvas->left_grabbed_item = TRUE;
+ if ((_new_current_item != _current_item) && button_down) {
+ _left_grabbed_item = TRUE;
return retval;
}
}
// Handle the rest of cases
+ _left_grabbed_item = FALSE;
+ _current_item = _new_current_item;
- canvas->left_grabbed_item = FALSE;
- canvas->current_item = canvas->new_current_item;
-
- if (canvas->current_item != NULL) {
+ if (_current_item != NULL) {
GdkEvent new_event;
- new_event = canvas->pick_event;
+ new_event = _pick_event;
new_event.type = GDK_ENTER_NOTIFY;
new_event.crossing.detail = GDK_NOTIFY_ANCESTOR;
new_event.crossing.subwindow = NULL;
- retval = emitEvent(canvas, &new_event);
+ retval = emitEvent(&new_event);
}
return retval;
}
-gint SPCanvasImpl::button(GtkWidget *widget, GdkEventButton *event)
+gint SPCanvas::handle_button(GtkWidget *widget, GdkEventButton *event)
{
SPCanvas *canvas = SP_CANVAS (widget);
@@ -1596,7 +1426,7 @@ gint SPCanvasImpl::button(GtkWidget *widget, GdkEventButton *event)
// dispatch normally regardless of the event's window if an item
// has a pointer grab in effect
- if (!canvas->grabbed_item &&
+ if (!canvas->_grabbed_item &&
event->window != getWindow(canvas))
return retval;
@@ -1628,21 +1458,21 @@ gint SPCanvasImpl::button(GtkWidget *widget, GdkEventButton *event)
// Pick the current item as if the button were not pressed, and
// then process the event.
//
- canvas->state = event->state;
- pickCurrentItem(canvas, reinterpret_cast<GdkEvent *>(event));
- canvas->state ^= mask;
- retval = emitEvent(canvas, (GdkEvent *) event);
+ canvas->_state = event->state;
+ canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
+ canvas->_state ^= mask;
+ retval = canvas->emitEvent((GdkEvent *) event);
break;
case GDK_BUTTON_RELEASE:
// Process the event as if the button were pressed, then repick
// after the button has been released
//
- canvas->state = event->state;
- retval = emitEvent(canvas, (GdkEvent *) event);
+ canvas->_state = event->state;
+ retval = canvas->emitEvent((GdkEvent *) event);
event->state ^= mask;
- canvas->state = event->state;
- pickCurrentItem(canvas, reinterpret_cast<GdkEvent *>(event));
+ canvas->_state = event->state;
+ canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
event->state ^= mask;
break;
@@ -1654,9 +1484,9 @@ gint SPCanvasImpl::button(GtkWidget *widget, GdkEventButton *event)
return retval;
}
-gint SPCanvasImpl::handleScroll(GtkWidget *widget, GdkEventScroll *event)
+gint SPCanvas::handle_scroll(GtkWidget *widget, GdkEventScroll *event)
{
- return emitEvent(SP_CANVAS(widget), reinterpret_cast<GdkEvent *>(event));
+ return SP_CANVAS(widget)->emitEvent(reinterpret_cast<GdkEvent *>(event));
}
static inline void request_motions(GdkWindow *w, GdkEventMotion *event) {
@@ -1670,7 +1500,7 @@ static inline void request_motions(GdkWindow *w, GdkEventMotion *event) {
gdk_event_request_motions(event);
}
-int SPCanvasImpl::handleMotion(GtkWidget *widget, GdkEventMotion *event)
+int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
{
int status;
SPCanvas *canvas = SP_CANVAS (widget);
@@ -1681,12 +1511,12 @@ int SPCanvasImpl::handleMotion(GtkWidget *widget, GdkEventMotion *event)
return FALSE;
}
- if (canvas->root == NULL) // canvas being deleted
+ if (canvas->_root == NULL) // canvas being deleted
return FALSE;
- canvas->state = event->state;
- pickCurrentItem(canvas, reinterpret_cast<GdkEvent *>(event));
- status = emitEvent(canvas, reinterpret_cast<GdkEvent *>(event));
+ canvas->_state = event->state;
+ canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
+ status = canvas->emitEvent(reinterpret_cast<GdkEvent *>(event));
if (event->is_hint) {
request_motions(gtk_widget_get_window (widget), event);
}
@@ -1694,12 +1524,12 @@ int SPCanvasImpl::handleMotion(GtkWidget *widget, GdkEventMotion *event)
return status;
}
-void SPCanvasImpl::sp_canvas_paint_single_buffer(SPCanvas *canvas, Geom::IntRect const &paint_rect, Geom::IntRect const &canvas_rect, int /*sw*/)
+void SPCanvas::paintSingleBuffer(Geom::IntRect const &paint_rect, Geom::IntRect const &canvas_rect, int /*sw*/)
{
- GtkWidget *widget = GTK_WIDGET (canvas);
+ GtkWidget *widget = GTK_WIDGET (this);
// Mark the region clean
- sp_canvas_mark_rect(canvas, paint_rect, 0);
+ markRect(paint_rect, 0);
SPCanvasBuf buf;
buf.buf = NULL;
@@ -1709,16 +1539,6 @@ void SPCanvasImpl::sp_canvas_paint_single_buffer(SPCanvas *canvas, Geom::IntRect
buf.is_empty = true;
//buf.ct = gdk_cairo_create(widget->window);
- /*
- cairo_t *xctt = gdk_cairo_create(widget->window);
- cairo_translate(xctt, paint_rect.left() - canvas->x0, paint_rect.top() - canvas->y0);
- cairo_set_source_rgb(xctt, 1,0,0);
- cairo_rectangle(xctt, 0, 0, paint_rect.width(), paint_rect.height());
- cairo_fill(xctt);
- cairo_destroy(xctt);
- //
- */
-
// create temporary surface
cairo_surface_t *imgs = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, paint_rect.width(), paint_rect.height());
buf.ct = cairo_create(imgs);
@@ -1749,20 +1569,20 @@ void SPCanvasImpl::sp_canvas_paint_single_buffer(SPCanvas *canvas, Geom::IntRect
cairo_paint(buf.ct);
cairo_set_operator(buf.ct, CAIRO_OPERATOR_OVER);
- if (canvas->root->visible) {
- SP_CANVAS_ITEM_GET_CLASS (canvas->root)->render (canvas->root, &buf);
+ if (_root->visible) {
+ SP_CANVAS_ITEM_GET_CLASS(_root)->render(_root, &buf);
}
// output to X
cairo_destroy(buf.ct);
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- if (canvas->enable_cms_display_adj) {
+ if (_enable_cms_display_adj) {
cmsHTRANSFORM transf = 0;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool fromDisplay = prefs->getBool( "/options/displayprofile/from_display");
if ( fromDisplay ) {
- transf = Inkscape::CMSSystem::getDisplayPer( canvas->cms_key );
+ transf = Inkscape::CMSSystem::getDisplayPer(_cms_key);
} else {
transf = Inkscape::CMSSystem::getDisplayTransform();
}
@@ -1781,7 +1601,7 @@ void SPCanvasImpl::sp_canvas_paint_single_buffer(SPCanvas *canvas, Geom::IntRect
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
cairo_t *xct = gdk_cairo_create(gtk_widget_get_window (widget));
- cairo_translate(xct, paint_rect.left() - canvas->x0, paint_rect.top() - canvas->y0);
+ cairo_translate(xct, paint_rect.left() - _x0, paint_rect.top() - _y0);
cairo_rectangle(xct, 0, 0, paint_rect.width(), paint_rect.height());
cairo_clip(xct);
cairo_set_source_surface(xct, imgs, 0, 0);
@@ -1789,26 +1609,16 @@ void SPCanvasImpl::sp_canvas_paint_single_buffer(SPCanvas *canvas, Geom::IntRect
cairo_paint(xct);
cairo_destroy(xct);
cairo_surface_destroy(imgs);
-
- //cairo_surface_t *cst = cairo_get_target(buf.ct);
- //cairo_destroy (buf.ct);
- //cairo_surface_finish (cst);
- //cairo_surface_destroy (cst);
}
-namespace {
-
struct PaintRectSetup {
- SPCanvas* canvas;
Geom::IntRect big_rect;
GTimeVal start_time;
int max_pixels;
Geom::Point mouse_loc;
};
-}// namespace
-
-int SPCanvasImpl::sp_canvas_paint_rect_internal(PaintRectSetup const *setup, Geom::IntRect const &this_rect)
+int SPCanvas::paintRectInternal(PaintRectSetup const *setup, Geom::IntRect const &this_rect)
{
GTimeVal now;
g_get_current_time (&now);
@@ -1831,11 +1641,11 @@ int SPCanvasImpl::sp_canvas_paint_rect_internal(PaintRectSetup const *setup, Geo
// If this limit is set, and if we have aborted redraw more times than is allowed,
// interrupting is blocked and we're forced to redraw full screen once
// (after which we can again interrupt forced_redraw_limit times).
- if (setup->canvas->forced_redraw_limit < 0 ||
- setup->canvas->forced_redraw_count < setup->canvas->forced_redraw_limit) {
+ if (_forced_redraw_limit < 0 ||
+ _forced_redraw_count < _forced_redraw_limit) {
- if (setup->canvas->forced_redraw_limit != -1) {
- setup->canvas->forced_redraw_count++;
+ if (_forced_redraw_limit != -1) {
+ _forced_redraw_count++;
}
return false;
@@ -1861,8 +1671,7 @@ int SPCanvasImpl::sp_canvas_paint_rect_internal(PaintRectSetup const *setup, Geo
gdk_window_begin_paint_rect(window, &r);
*/
- sp_canvas_paint_single_buffer (setup->canvas,
- this_rect, setup->big_rect, bw);
+ paintSingleBuffer(this_rect, setup->big_rect, bw);
//gdk_window_end_paint(window);
return 1;
}
@@ -1894,11 +1703,11 @@ The default for now is the strips mode.
if (setup->mouse_loc[Geom::X] < mid) {
// Always paint towards the mouse first
- return sp_canvas_paint_rect_internal(setup, lo)
- && sp_canvas_paint_rect_internal(setup, hi);
+ return paintRectInternal(setup, lo)
+ && paintRectInternal(setup, hi);
} else {
- return sp_canvas_paint_rect_internal(setup, hi)
- && sp_canvas_paint_rect_internal(setup, lo);
+ return paintRectInternal(setup, hi)
+ && paintRectInternal(setup, lo);
}
} else {
int mid = this_rect[Geom::Y].middle();
@@ -1910,24 +1719,24 @@ The default for now is the strips mode.
if (setup->mouse_loc[Geom::Y] < mid) {
// Always paint towards the mouse first
- return sp_canvas_paint_rect_internal(setup, lo)
- && sp_canvas_paint_rect_internal(setup, hi);
+ return paintRectInternal(setup, lo)
+ && paintRectInternal(setup, hi);
} else {
- return sp_canvas_paint_rect_internal(setup, hi)
- && sp_canvas_paint_rect_internal(setup, lo);
+ return paintRectInternal(setup, hi)
+ && paintRectInternal(setup, lo);
}
}
}
-bool SPCanvasImpl::sp_canvas_paint_rect(SPCanvas *canvas, int xx0, int yy0, int xx1, int yy1)
+bool SPCanvas::paintRect(int xx0, int yy0, int xx1, int yy1)
{
GtkAllocation allocation;
- g_return_val_if_fail (!canvas->need_update, false);
+ g_return_val_if_fail (!_need_update, false);
- gtk_widget_get_allocation (GTK_WIDGET (canvas), &allocation);
+ gtk_widget_get_allocation(GTK_WIDGET(this), &allocation);
- Geom::IntRect canvas_rect = Geom::IntRect::from_xywh(canvas->x0, canvas->y0,
+ Geom::IntRect canvas_rect = Geom::IntRect::from_xywh(_x0, _y0,
allocation.width, allocation.height);
Geom::IntRect paint_rect(xx0, yy0, xx1, yy1);
@@ -1937,8 +1746,6 @@ bool SPCanvasImpl::sp_canvas_paint_rect(SPCanvas *canvas, int xx0, int yy0, int
paint_rect = *area;
PaintRectSetup setup;
-
- setup.canvas = canvas;
setup.big_rect = paint_rect;
// Save the mouse location
@@ -1948,16 +1755,16 @@ bool SPCanvasImpl::sp_canvas_paint_rect(SPCanvas *canvas, int xx0, int yy0, int
GdkDeviceManager *dm = gdk_display_get_device_manager(gdk_display_get_default());
GdkDevice *device = gdk_device_manager_get_client_pointer(dm);
- gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(canvas)),
+ gdk_window_get_device_position(gtk_widget_get_window(GTK_WIDGET(this)),
device,
&x, &y, NULL);
#else
- gdk_window_get_pointer (gtk_widget_get_window (GTK_WIDGET(canvas)), &x, &y, NULL);
+ gdk_window_get_pointer(gtk_widget_get_window(GTK_WIDGET(this)), &x, &y, NULL);
#endif
- setup.mouse_loc = sp_canvas_window_to_world (canvas, Geom::Point(x,y));
+ setup.mouse_loc = sp_canvas_window_to_world(this, Geom::Point(x,y));
- if (canvas->rendermode != Inkscape::RENDERMODE_OUTLINE) {
+ if (_rendermode != Inkscape::RENDERMODE_OUTLINE) {
// use 256K as a compromise to not slow down gradients
// 256K is the cached buffer and we need 4 channels
setup.max_pixels = 65536; // 256K/4
@@ -1971,41 +1778,41 @@ bool SPCanvasImpl::sp_canvas_paint_rect(SPCanvas *canvas, int xx0, int yy0, int
g_get_current_time(&(setup.start_time));
// Go
- return sp_canvas_paint_rect_internal(&setup, paint_rect);
+ return paintRectInternal(&setup, paint_rect);
}
void SPCanvas::forceFullRedrawAfterInterruptions(unsigned int count)
{
- forced_redraw_limit = count;
- forced_redraw_count = 0;
+ _forced_redraw_limit = count;
+ _forced_redraw_count = 0;
}
void SPCanvas::endForcedFullRedraws()
{
- forced_redraw_limit = -1;
+ _forced_redraw_limit = -1;
}
#if GTK_CHECK_VERSION(3,0,0)
-gboolean SPCanvasImpl::handleDraw(GtkWidget *widget, cairo_t *cr) {
- SPCanvas *canvas = SP_CANVAS(widget);
+gboolean SPCanvas::handle_draw(GtkWidget *widget, cairo_t *cr) {
+ SPCanvas *canvas = SP_CANVAS(widget);
- cairo_rectangle_list_t *rects = cairo_copy_clip_rectangle_list(cr);
+ cairo_rectangle_list_t *rects = cairo_copy_clip_rectangle_list(cr);
- for (int i = 0; i < rects->num_rectangles; i++) {
- cairo_rectangle_t rectangle = rects->rectangles[i];
+ for (int i = 0; i < rects->num_rectangles; i++) {
+ cairo_rectangle_t rectangle = rects->rectangles[i];
- Geom::IntRect r = Geom::IntRect::from_xywh(rectangle.x + canvas->x0, rectangle.y + canvas->y0,
- rectangle.width, rectangle.height);
+ Geom::IntRect r = Geom::IntRect::from_xywh(rectangle.x + canvas->_x0, rectangle.y + canvas->_y0,
+ rectangle.width, rectangle.height);
- canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom());
- }
+ canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom());
+ }
- cairo_rectangle_list_destroy(rects);
+ cairo_rectangle_list_destroy(rects);
return FALSE;
}
#else
-gboolean SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event)
+gboolean SPCanvas::handle_expose(GtkWidget *widget, GdkEventExpose *event)
{
SPCanvas *canvas = SP_CANVAS(widget);
@@ -2024,7 +1831,7 @@ gboolean SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event)
for (int i = 0; i < n_rects; i++) {
GdkRectangle rectangle = rects[i];
- Geom::IntRect r = Geom::IntRect::from_xywh(rectangle.x + canvas->x0, rectangle.y + canvas->y0,
+ Geom::IntRect r = Geom::IntRect::from_xywh(rectangle.x + canvas->_x0, rectangle.y + canvas->_y0,
rectangle.width, rectangle.height);
canvas->requestRedraw(r.left(), r.top(), r.right(), r.bottom());
@@ -2035,12 +1842,12 @@ gboolean SPCanvasImpl::handleExpose(GtkWidget *widget, GdkEventExpose *event)
#endif
-gint SPCanvasImpl::handleKeyEvent(GtkWidget *widget, GdkEventKey *event)
+gint SPCanvas::handle_key_event(GtkWidget *widget, GdkEventKey *event)
{
- return emitEvent(SP_CANVAS(widget), reinterpret_cast<GdkEvent *>(event));
+ return SP_CANVAS(widget)->emitEvent(reinterpret_cast<GdkEvent *>(event));
}
-gint SPCanvasImpl::handleCrossing(GtkWidget *widget, GdkEventCrossing *event)
+gint SPCanvas::handle_crossing(GtkWidget *widget, GdkEventCrossing *event)
{
SPCanvas *canvas = SP_CANVAS (widget);
@@ -2048,57 +1855,56 @@ gint SPCanvasImpl::handleCrossing(GtkWidget *widget, GdkEventCrossing *event)
return FALSE;
}
- canvas->state = event->state;
- return pickCurrentItem(canvas, reinterpret_cast<GdkEvent *>(event));
+ canvas->_state = event->state;
+ return canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event));
}
-gint SPCanvasImpl::handleFocusIn(GtkWidget *widget, GdkEventFocus *event)
+gint SPCanvas::handle_focus_in(GtkWidget *widget, GdkEventFocus *event)
{
gtk_widget_grab_focus (widget);
SPCanvas *canvas = SP_CANVAS (widget);
- if (canvas->focused_item) {
- return emitEvent(canvas, reinterpret_cast<GdkEvent *>(event));
+ if (canvas->_focused_item) {
+ return canvas->emitEvent(reinterpret_cast<GdkEvent *>(event));
} else {
return FALSE;
}
}
-gint SPCanvasImpl::handleFocusOut(GtkWidget *widget, GdkEventFocus *event)
+gint SPCanvas::handle_focus_out(GtkWidget *widget, GdkEventFocus *event)
{
SPCanvas *canvas = SP_CANVAS(widget);
- if (canvas->focused_item) {
- return emitEvent(canvas, reinterpret_cast<GdkEvent *>(event));
+ if (canvas->_focused_item) {
+ return canvas->emitEvent(reinterpret_cast<GdkEvent *>(event));
} else {
return FALSE;
}
}
-int SPCanvasImpl::paint(SPCanvas *canvas)
+int SPCanvas::paint()
{
- if (canvas->need_update) {
- sp_canvas_item_invoke_update (canvas->root, Geom::identity(), 0);
- canvas->need_update = FALSE;
+ if (_need_update) {
+ sp_canvas_item_invoke_update(_root, Geom::identity(), 0);
+ _need_update = FALSE;
}
- if (!canvas->need_redraw) {
+ if (!_need_redraw) {
return TRUE;
}
Cairo::RefPtr<Cairo::Region> to_paint = Cairo::Region::create();
- for (int j=canvas->tTop; j<canvas->tBottom; j++) {
- for (int i=canvas->tLeft; i<canvas->tRight; i++) {
- int tile_index = (i - canvas->tLeft) + (j - canvas->tTop)*canvas->tileH;
+ for (int j = _tTop; j < _tBottom; ++j) {
+ for (int i = _tLeft; i < _tRight; ++i) {
+ int tile_index = (i - _tLeft) + (j - _tTop) * _tile_h;
- if ( canvas->tiles[tile_index] ) { // if this tile is dirtied (nonzero)
+ if (_tiles[tile_index]) { // if this tile is dirtied (nonzero)
Cairo::RectangleInt rect = {i*TILE_SIZE, j*TILE_SIZE,
TILE_SIZE, TILE_SIZE};
to_paint->do_union(rect);
}
-
}
}
@@ -2111,77 +1917,80 @@ int SPCanvasImpl::paint(SPCanvas *canvas)
int y0 = rect.y;
int x1 = x0 + rect.width;
int y1 = y0 + rect.height;
- if (!sp_canvas_paint_rect(canvas, x0, y0, x1, y1)) {
+ if (!paintRect(x0, y0, x1, y1)) {
// Aborted
return FALSE;
};
}
}
- canvas->need_redraw = FALSE;
+ _need_redraw = FALSE;
// we've had a full unaborted redraw, reset the full redraw counter
- if (canvas->forced_redraw_limit != -1) {
- canvas->forced_redraw_count = 0;
+ if (_forced_redraw_limit != -1) {
+ _forced_redraw_count = 0;
}
return TRUE;
}
-int SPCanvasImpl::do_update(SPCanvas *canvas)
+int SPCanvas::doUpdate()
{
- if (!canvas->root) { // canvas may have already be destroyed by closing desktop during interrupted display!
+ if (!_root) { // canvas may have already be destroyed by closing desktop during interrupted display!
return TRUE;
}
-
- if (canvas->drawing_disabled) {
+ if (_drawing_disabled) {
return TRUE;
}
// Cause the update if necessary
- if (canvas->need_update) {
- sp_canvas_item_invoke_update(canvas->root, Geom::identity(), 0);
- canvas->need_update = FALSE;
+ if (_need_update) {
+ sp_canvas_item_invoke_update(_root, Geom::identity(), 0);
+ _need_update = FALSE;
}
// Paint if able to
- if (gtk_widget_is_drawable( GTK_WIDGET(canvas) )) {
- return paint(canvas);
+ if (gtk_widget_is_drawable(GTK_WIDGET(this))) {
+ return paint();
}
// Pick new current item
- while (canvas->need_repick) {
- canvas->need_repick = FALSE;
- pickCurrentItem(canvas, &canvas->pick_event);
+ while (_need_repick) {
+ _need_repick = FALSE;
+ pickCurrentItem(&_pick_event);
}
return TRUE;
}
-gint SPCanvasImpl::idle_handler(gpointer data)
+gint SPCanvas::idle_handler(gpointer data)
{
SPCanvas *canvas = SP_CANVAS (data);
-
- int const ret = do_update (canvas);
-
+ int const ret = canvas->doUpdate();
if (ret) {
// Reset idle id
- canvas->idle_id = 0;
+ canvas->_idle_id = 0;
}
-
return !ret;
}
-void SPCanvasImpl::add_idle(SPCanvas *canvas)
+void SPCanvas::addIdle()
+{
+ if (_idle_id == 0) {
+ _idle_id = gdk_threads_add_idle_full(UPDATE_PRIORITY, idle_handler, this, NULL);
+ }
+}
+void SPCanvas::removeIdle()
{
- if (canvas->idle_id == 0) {
- canvas->idle_id = gdk_threads_add_idle_full(UPDATE_PRIORITY, idle_handler, canvas, NULL);
+ if (_idle_id) {
+ g_source_remove(_idle_id);
+ _idle_id = 0;
}
}
SPCanvasGroup *SPCanvas::getRoot()
{
- return SP_CANVAS_GROUP(root);
+ return SP_CANVAS_GROUP(_root);
}
void SPCanvas::scrollTo(double cx, double cy, unsigned int clear, bool is_scrolling)
@@ -2190,28 +1999,28 @@ void SPCanvas::scrollTo(double cx, double cy, unsigned int clear, bool is_scroll
int ix = (int) round(cx); // ix and iy are the new canvas coordinates (integer screen pixels)
int iy = (int) round(cy); // cx might be negative, so (int)(cx + 0.5) will not do!
- int dx = ix - x0; // dx and dy specify the displacement (scroll) of the
- int dy = iy - y0; // canvas w.r.t its previous position
+ int dx = ix - _x0; // dx and dy specify the displacement (scroll) of the
+ int dy = iy - _y0; // canvas w.r.t its previous position
Geom::IntRect old_area = getViewboxIntegers();
Geom::IntRect new_area = old_area + Geom::IntPoint(dx, dy);
- dx0 = cx; // here the 'd' stands for double, not delta!
- dy0 = cy;
- x0 = ix;
- y0 = iy;
+ _dx0 = cx; // here the 'd' stands for double, not delta!
+ _dy0 = cy;
+ _x0 = ix;
+ _y0 = iy;
- gtk_widget_get_allocation(&widget, &allocation);
+ gtk_widget_get_allocation(&_widget, &allocation);
- SPCanvasImpl::sp_canvas_resize_tiles(this, x0, y0, x0 + allocation.width, y0 + allocation.height);
- if (SP_CANVAS_ITEM_GET_CLASS(root)->viewbox_changed) {
- SP_CANVAS_ITEM_GET_CLASS(root)->viewbox_changed(root, new_area);
+ resizeTiles(_x0, _y0, _x0 + allocation.width, _y0 + allocation.height);
+ if (SP_CANVAS_ITEM_GET_CLASS(_root)->viewbox_changed) {
+ SP_CANVAS_ITEM_GET_CLASS(_root)->viewbox_changed(_root, new_area);
}
if (!clear) {
// scrolling without zoom; redraw only the newly exposed areas
if ((dx != 0) || (dy != 0)) {
- this->is_scrolling = is_scrolling;
+ this->_is_scrolling = is_scrolling;
if (gtk_widget_get_realized(GTK_WIDGET(this))) {
gdk_window_scroll(getWindow(this), -dx, -dy);
}
@@ -2223,15 +2032,15 @@ void SPCanvas::scrollTo(double cx, double cy, unsigned int clear, bool is_scroll
void SPCanvas::updateNow()
{
- if (need_update || need_redraw) {
- SPCanvasImpl::do_update(this);
+ if (_need_update || _need_redraw) {
+ doUpdate();
}
}
-void SPCanvasImpl::requestCanvasUpdate(SPCanvas *canvas)
+void SPCanvas::requestUpdate()
{
- canvas->need_update = TRUE;
- add_idle(canvas);
+ _need_update = TRUE;
+ addIdle();
}
void SPCanvas::requestRedraw(int x0, int y0, int x1, int y1)
@@ -2248,13 +2057,13 @@ void SPCanvas::requestRedraw(int x0, int y0, int x1, int y1)
Geom::IntRect bbox(x0, y0, x1, y1);
gtk_widget_get_allocation(GTK_WIDGET(this), &allocation);
- Geom::IntRect canvas_rect = Geom::IntRect::from_xywh(this->x0, this->y0,
+ Geom::IntRect canvas_rect = Geom::IntRect::from_xywh(this->_x0, this->_y0,
allocation.width, allocation.height);
Geom::OptIntRect clip = bbox & canvas_rect;
if (clip) {
- SPCanvasImpl::sp_canvas_dirty_rect(this, *clip);
- SPCanvasImpl::add_idle(this);
+ dirtyRect(*clip);
+ addIdle();
}
}
@@ -2266,8 +2075,8 @@ void sp_canvas_window_to_world(SPCanvas const *canvas, double winx, double winy,
g_return_if_fail (canvas != NULL);
g_return_if_fail (SP_IS_CANVAS (canvas));
- if (worldx) *worldx = canvas->x0 + winx;
- if (worldy) *worldy = canvas->y0 + winy;
+ if (worldx) *worldx = canvas->_x0 + winx;
+ if (worldy) *worldy = canvas->_y0 + winy;
}
/**
@@ -2278,8 +2087,8 @@ void sp_canvas_world_to_window(SPCanvas const *canvas, double worldx, double wor
g_return_if_fail (canvas != NULL);
g_return_if_fail (SP_IS_CANVAS (canvas));
- if (winx) *winx = worldx - canvas->x0;
- if (winy) *winy = worldy - canvas->y0;
+ if (winx) *winx = worldx - canvas->_x0;
+ if (winy) *winy = worldy - canvas->_y0;
}
/**
@@ -2290,7 +2099,7 @@ Geom::Point sp_canvas_window_to_world(SPCanvas const *canvas, Geom::Point const
g_assert (canvas != NULL);
g_assert (SP_IS_CANVAS (canvas));
- return Geom::Point(canvas->x0 + win[0], canvas->y0 + win[1]);
+ return Geom::Point(canvas->_x0 + win[0], canvas->_y0 + win[1]);
}
/**
@@ -2301,7 +2110,7 @@ Geom::Point sp_canvas_world_to_window(SPCanvas const *canvas, Geom::Point const
g_assert (canvas != NULL);
g_assert (SP_IS_CANVAS (canvas));
- return Geom::Point(world[0] - canvas->x0, world[1] - canvas->y0);
+ return Geom::Point(world[0] - canvas->_x0, world[1] - canvas->_y0);
}
/**
@@ -2317,10 +2126,10 @@ bool sp_canvas_world_pt_inside_window(SPCanvas const *canvas, Geom::Point const
GtkWidget *w = GTK_WIDGET(canvas);
gtk_widget_get_allocation (w, &allocation);
- return ( ( canvas->x0 <= world[Geom::X] ) &&
- ( canvas->y0 <= world[Geom::Y] ) &&
- ( world[Geom::X] < canvas->x0 + allocation.width ) &&
- ( world[Geom::Y] < canvas->y0 + allocation.height ) );
+ return ( ( canvas->_x0 <= world[Geom::X] ) &&
+ ( canvas->_y0 <= world[Geom::Y] ) &&
+ ( world[Geom::X] < canvas->_x0 + allocation.width ) &&
+ ( world[Geom::Y] < canvas->_y0 + allocation.height ) );
}
/**
@@ -2331,8 +2140,8 @@ Geom::Rect SPCanvas::getViewbox() const
GtkAllocation allocation;
gtk_widget_get_allocation (GTK_WIDGET (this), &allocation);
- return Geom::Rect(Geom::Point(dx0, dy0),
- Geom::Point(dx0 + allocation.width, dy0 + allocation.height));
+ return Geom::Rect(Geom::Point(_dx0, _dy0),
+ Geom::Point(_dx0 + allocation.width, _dy0 + allocation.height));
}
/**
@@ -2344,8 +2153,8 @@ Geom::IntRect SPCanvas::getViewboxIntegers() const
gtk_widget_get_allocation (GTK_WIDGET(this), &allocation);
Geom::IntRect ret;
- ret.setMin(Geom::IntPoint(x0, y0));
- ret.setMax(Geom::IntPoint(x0 + allocation.width, y0 + allocation.height));
+ ret.setMin(Geom::IntPoint(_x0, _y0));
+ ret.setMax(Geom::IntPoint(_x0 + allocation.width, _y0 + allocation.height));
return ret;
}
@@ -2359,63 +2168,62 @@ inline int sp_canvas_tile_ceil(int x)
return ((x + (TILE_SIZE - 1)) & (~(TILE_SIZE - 1))) / TILE_SIZE;
}
-void SPCanvasImpl::sp_canvas_resize_tiles(SPCanvas* canvas, int nl, int nt, int nr, int nb)
+void SPCanvas::resizeTiles(int nl, int nt, int nr, int nb)
{
if ( nl >= nr || nt >= nb ) {
- if ( canvas->tiles ) g_free(canvas->tiles);
- canvas->tLeft=canvas->tTop=canvas->tRight=canvas->tBottom=0;
- canvas->tileH=canvas->tileV=0;
- canvas->tiles=NULL;
+ if (_tiles) g_free(_tiles);
+ _tLeft = _tTop = _tRight = _tBottom = 0;
+ _tile_h = _tile_h = 0;
+ _tiles = NULL;
return;
}
- int tl=sp_canvas_tile_floor(nl);
- int tt=sp_canvas_tile_floor(nt);
- int tr=sp_canvas_tile_ceil(nr);
- int tb=sp_canvas_tile_ceil(nb);
+ int tl = sp_canvas_tile_floor(nl);
+ int tt = sp_canvas_tile_floor(nt);
+ int tr = sp_canvas_tile_ceil(nr);
+ int tb = sp_canvas_tile_ceil(nb);
int nh = tr-tl, nv = tb-tt;
- uint8_t* ntiles = (uint8_t*)g_malloc(nh*nv*sizeof(uint8_t));
- for (int i=tl; i<tr; i++) {
- for (int j=tt; j<tb; j++) {
+ uint8_t *ntiles = (uint8_t*) g_malloc(nh * nv * sizeof(uint8_t));
+ for (int i = tl; i < tr; i++) {
+ for (int j = tt; j < tb; j++) {
int ind = (i-tl) + (j-tt)*nh;
- if ( i >= canvas->tLeft && i < canvas->tRight && j >= canvas->tTop && j < canvas->tBottom ) {
- ntiles[ind]=canvas->tiles[(i-canvas->tLeft)+(j-canvas->tTop)*canvas->tileH]; // copy from the old tile
+ if ( i >= _tLeft && i < _tRight && j >= _tTop && j < _tBottom ) {
+ ntiles[ind] = _tiles[(i - _tLeft) + (j - _tTop) * _tile_h]; // copy from the old tile
} else {
- ntiles[ind]=0; // newly exposed areas get 0
+ ntiles[ind] = 0; // newly exposed areas get 0
}
}
}
- if ( canvas->tiles ) g_free(canvas->tiles);
- canvas->tiles=ntiles;
- canvas->tLeft=tl;
- canvas->tTop=tt;
- canvas->tRight=tr;
- canvas->tBottom=tb;
- canvas->tileH=nh;
- canvas->tileV=nv;
+ if (_tiles) g_free(_tiles);
+ _tiles = ntiles;
+ _tLeft = tl;
+ _tTop = tt;
+ _tRight = tr;
+ _tBottom = tb;
+ _tile_h = nh;
+ _tile_h = nv;
}
-void SPCanvasImpl::sp_canvas_dirty_rect(SPCanvas* canvas, Geom::IntRect const &area) {
- canvas->need_redraw = TRUE;
-
- sp_canvas_mark_rect(canvas, area, 1);
+void SPCanvas::dirtyRect(Geom::IntRect const &area) {
+ _need_redraw = TRUE;
+ markRect(area, 1);
}
-void SPCanvasImpl::sp_canvas_mark_rect(SPCanvas* canvas, Geom::IntRect const &area, uint8_t val)
+void SPCanvas::markRect(Geom::IntRect const &area, uint8_t val)
{
- int tl=sp_canvas_tile_floor(area.left());
- int tt=sp_canvas_tile_floor(area.top());
- int tr=sp_canvas_tile_ceil(area.right());
- int tb=sp_canvas_tile_ceil(area.bottom());
- if ( tl >= canvas->tRight || tr <= canvas->tLeft || tt >= canvas->tBottom || tb <= canvas->tTop ) return;
- if ( tl < canvas->tLeft ) tl=canvas->tLeft;
- if ( tr > canvas->tRight ) tr=canvas->tRight;
- if ( tt < canvas->tTop ) tt=canvas->tTop;
- if ( tb > canvas->tBottom ) tb=canvas->tBottom;
+ int tl = sp_canvas_tile_floor(area.left());
+ int tt = sp_canvas_tile_floor(area.top());
+ int tr = sp_canvas_tile_ceil(area.right());
+ int tb = sp_canvas_tile_ceil(area.bottom());
+ if ( tl >= _tRight || tr <= _tLeft || tt >= _tBottom || tb <= _tTop ) return;
+ if ( tl < _tLeft ) tl = _tLeft;
+ if ( tr > _tRight ) tr = _tRight;
+ if ( tt < _tTop ) tt = _tTop;
+ if ( tb > _tBottom ) tb = _tBottom;
for (int i=tl; i<tr; i++) {
for (int j=tt; j<tb; j++) {
- canvas->tiles[(i-canvas->tLeft)+(j-canvas->tTop)*canvas->tileH] = val;
+ _tiles[(i - _tLeft) + (j - _tTop) * _tile_h] = val;
}
}
}
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h
index 65b06ade8..1a13250b3 100644
--- a/src/display/sp-canvas.h
+++ b/src/display/sp-canvas.h
@@ -60,7 +60,7 @@ G_END_DECLS
// SPCanvas -------------------------------------------------
-class SPCanvasImpl;
+struct PaintRectSetup;
GType sp_canvas_get_type() G_GNUC_CONST;
@@ -68,123 +68,178 @@ GType sp_canvas_get_type() G_GNUC_CONST;
* Port of GnomeCanvas for inkscape needs.
*/
struct SPCanvas {
- friend class SPCanvasImpl;
+ /// Scrolls canvas to specific position (cx and cy are measured in screen pixels).
+ void scrollTo(double cx, double cy, unsigned int clear, bool is_scrolling = false);
- /**
- * Returns new canvas as widget.
- */
- static GtkWidget *createAA();
+ /// Synchronously updates the canvas if necessary.
+ void updateNow();
- /**
- * Returns the root group of the specified canvas.
- */
+ /// Queues a redraw of rectangular canvas area.
+ void requestRedraw(int x1, int y1, int x2, int y2);
+ void requestUpdate();
+
+ void forceFullRedrawAfterInterruptions(unsigned int count);
+ void endForcedFullRedraws();
+
+ Geom::Rect getViewbox() const;
+ Geom::IntRect getViewboxIntegers() const;
SPCanvasGroup *getRoot();
- /**
- * Scrolls canvas to specific position (cx and cy are measured in screen pixels).
- */
- void scrollTo(double cx, double cy, unsigned int clear, bool is_scrolling = false);
+ /// Returns new canvas as widget.
+ static GtkWidget *createAA();
+private:
+ /// Emits an event for an item in the canvas, be it the current
+ /// item, grabbed item, or focused item, as appropriate.
+ int emitEvent(GdkEvent *event);
- /**
- * Updates canvas if necessary.
- */
- void updateNow();
+ /// Re-picks the current item in the canvas, based on the event's
+ /// coordinates and emits enter/leave events for items as appropriate.
+ int pickCurrentItem(GdkEvent *event);
+ void shutdownTransients();
- /**
- * Forces redraw of rectangular canvas area.
- */
- void requestRedraw(int x1, int y1, int x2, int y2);
+ /// Allocates a new tile array for the canvas, copying overlapping tiles from the old array
+ void resizeTiles(int nl, int nt, int nr, int nb);
+
+ /// Marks the specified area as dirty (requiring redraw)
+ void dirtyRect(Geom::IntRect const &area);
+ /// Marks specific canvas rectangle as clean (val == 0) or dirty (otherwise)
+ void markRect(Geom::IntRect const &area, uint8_t val);
+
+ /// Invokes update, paint, and repick on canvas.
+ int doUpdate();
+
+ void paintSingleBuffer(Geom::IntRect const &paint_rect, Geom::IntRect const &canvas_rect, int sw);
/**
- * Force a full redraw after a specified number of interrupted redraws.
+ * Paint the given rect, recursively subdividing the region until it is the size of a single
+ * buffer.
+ *
+ * @return true if the drawing completes
*/
- void forceFullRedrawAfterInterruptions(unsigned int count);
+ int paintRectInternal(PaintRectSetup const *setup, Geom::IntRect const &this_rect);
+
+ /// Draws a specific rectangular part of the canvas.
+ /// @return true if the rectangle painting succeeds.
+ bool paintRect(int xx0, int yy0, int xx1, int yy1);
+
+ /// Repaints the areas in the canvas that need it.
+ /// @return true if all the dirty parts have been redrawn
+ int paint();
+
+ /// Idle handler for the canvas that deals with pending updates and redraws.
+ static gint idle_handler(gpointer data);
+
+ /// Convenience function to add an idle handler to a canvas.
+ void addIdle();
+ void removeIdle();
+
+public:
+ // GTK virtual functions.
+ static void dispose(GObject *object);
+ static void handle_realize(GtkWidget *widget);
+ static void handle_unrealize(GtkWidget *widget);
+#if GTK_CHECK_VERSION(3,0,0)
+ static void handle_get_preferred_width(GtkWidget *widget, gint *min_w, gint *nat_w);
+ static void handle_get_preferred_height(GtkWidget *widget, gint *min_h, gint *nat_h);
+#else
+ static void handle_size_request(GtkWidget *widget, GtkRequisition *req);
+#endif
+ static void handle_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
+ static gint handle_button(GtkWidget *widget, GdkEventButton *event);
/**
- * End forced full redraw requests.
+ * Scroll event handler for the canvas.
+ *
+ * @todo FIXME: generate motion events to re-select items.
*/
- void endForcedFullRedraws();
-
+ static gint handle_scroll(GtkWidget *widget, GdkEventScroll *event);
+ static gint handle_motion(GtkWidget *widget, GdkEventMotion *event);
+#if GTK_CHECK_VERSION(3,0,0)
+ static gboolean handle_draw(GtkWidget *widget, cairo_t *cr);
+#else
+ static gboolean handle_expose(GtkWidget *widget, GdkEventExpose *event);
+#endif
+ static gint handle_key_event(GtkWidget *widget, GdkEventKey *event);
+ static gint handle_crossing(GtkWidget *widget, GdkEventCrossing *event);
+ static gint handle_focus_in(GtkWidget *widget, GdkEventFocus *event);
+ static gint handle_focus_out(GtkWidget *widget, GdkEventFocus *event);
+public:
// Data members: ----------------------------------------------------------
+ GtkWidget _widget;
- GtkWidget widget;
+ guint _idle_id;
- guint idle_id;
+ SPCanvasItem *_root;
- SPCanvasItem *root;
-
- bool is_dragging;
- double dx0;
- double dy0;
- int x0;
- int y0;
+ bool _is_dragging;
+ double _dx0;
+ double _dy0;
+ int _x0;
+ int _y0;
/* Area that needs redrawing, stored as a microtile array */
- int tLeft, tTop, tRight, tBottom;
- int tileH, tileV;
- uint8_t *tiles;
+ int _tLeft, _tTop, _tRight, _tBottom;
+ int _tile_w, _tile_h;
+ uint8_t *_tiles;
/** Last known modifier state, for deferred repick when a button is down. */
- int state;
+ int _state;
/** The item containing the mouse pointer, or NULL if none. */
- SPCanvasItem *current_item;
+ SPCanvasItem *_current_item;
/** Item that is about to become current (used to track deletions and such). */
- SPCanvasItem *new_current_item;
+ SPCanvasItem *_new_current_item;
/** Item that holds a pointer grab, or NULL if none. */
- SPCanvasItem *grabbed_item;
+ SPCanvasItem *_grabbed_item;
/** Event mask specified when grabbing an item. */
- guint grabbed_event_mask;
+ guint _grabbed_event_mask;
/** If non-NULL, the currently focused item. */
- SPCanvasItem *focused_item;
+ SPCanvasItem *_focused_item;
/** Event on which selection of current item is based. */
- GdkEvent pick_event;
+ GdkEvent _pick_event;
- int close_enough;
+ int _close_enough;
- unsigned int need_update : 1;
- unsigned int need_redraw : 1;
- unsigned int need_repick : 1;
+ unsigned int _need_update : 1;
+ unsigned int _need_redraw : 1;
+ unsigned int _need_repick : 1;
- int forced_redraw_count;
- int forced_redraw_limit;
+ int _forced_redraw_count;
+ int _forced_redraw_limit;
/** For use by internal pick_current_item() function. */
- unsigned int left_grabbed_item : 1;
+ unsigned int _left_grabbed_item : 1;
/** For use by internal pick_current_item() function. */
- unsigned int in_repick : 1;
+ unsigned int _in_repick : 1;
// In most tools Inkscape only generates enter and leave events
// on the current item, but no other enter events if a mouse button
- // is depressed -- see function pick_current_item(). Some tools
+ // is depressed -- see function pickCurrentItem(). Some tools
// may wish the canvas to generate to all enter events, (e.g., the
// connector tool). If so, they may temporarily set this flag to
// 'true'.
- bool gen_all_enter_events;
+ bool _gen_all_enter_events;
/** For scripting, sometimes we want to delay drawing. */
- bool drawing_disabled;
+ bool _drawing_disabled;
- int rendermode;
- int colorrendermode;
+ int _rendermode;
+ int _colorrendermode;
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- bool enable_cms_display_adj;
- Glib::ustring cms_key;
+ bool _enable_cms_display_adj;
+ Glib::ustring _cms_key;
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- bool is_scrolling;
-
- Geom::Rect getViewbox() const;
- Geom::IntRect getViewboxIntegers() const;
+ bool _is_scrolling;
};
bool sp_canvas_world_pt_inside_window(SPCanvas const *canvas, Geom::Point const &world);
diff --git a/src/extension/dbus/document-interface.cpp b/src/extension/dbus/document-interface.cpp
index 121a49a25..d0a2e81aa 100644
--- a/src/extension/dbus/document-interface.cpp
+++ b/src/extension/dbus/document-interface.cpp
@@ -1052,7 +1052,7 @@ void document_interface_pause_updates(DocumentInterface *doc_interface, GError *
SPDesktop *desk = doc_interface->target.getDesktop();
g_return_if_fail(ensure_desktop_valid(desk, error));
doc_interface->updates = FALSE;
- desk->canvas->drawing_disabled = 1;
+ desk->canvas->_drawing_disabled = 1;
}
void document_interface_resume_updates(DocumentInterface *doc_interface, GError ** error)
@@ -1060,7 +1060,7 @@ void document_interface_resume_updates(DocumentInterface *doc_interface, GError
SPDesktop *desk = doc_interface->target.getDesktop();
g_return_if_fail(ensure_desktop_valid(desk, error));
doc_interface->updates = TRUE;
- desk->canvas->drawing_disabled = 0;
+ desk->canvas->_drawing_disabled = 0;
//FIXME: use better verb than rect.
Inkscape::DocumentUndo::done(doc_interface->target.getDocument(), SP_VERB_CONTEXT_RECT, "Multiple actions");
}
diff --git a/src/extension/execution-env.cpp b/src/extension/execution-env.cpp
index 31491605b..d5c80f26e 100644
--- a/src/extension/execution-env.cpp
+++ b/src/extension/execution-env.cpp
@@ -128,7 +128,7 @@ ExecutionEnv::createWorkingDialog (void) {
}
SPDesktop *desktop = (SPDesktop *)_doc;
- GtkWidget *toplevel = gtk_widget_get_toplevel(&(desktop->canvas->widget));
+ GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(desktop->canvas));
if (!toplevel || !gtk_widget_is_toplevel (toplevel))
return;
Gtk::Window *window = Glib::wrap(GTK_WINDOW(toplevel), false);
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index e6d5f174e..e9a3af83a 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -1126,7 +1126,7 @@ void
sp_undo(SPDesktop *desktop, SPDocument *)
{
// No re/undo while dragging, too dangerous.
- if(desktop->getCanvas()->is_dragging) return;
+ if(desktop->getCanvas()->_is_dragging) return;
if (!DocumentUndo::undo(desktop->getDocument())) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to undo."));
@@ -1137,7 +1137,7 @@ void
sp_redo(SPDesktop *desktop, SPDocument *)
{
// No re/undo while dragging, too dangerous.
- if(desktop->getCanvas()->is_dragging) return;
+ if(desktop->getCanvas()->_is_dragging) return;
if (!DocumentUndo::redo(desktop->getDocument())) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to redo."));
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 531aa728d..8639861f8 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -1018,7 +1018,7 @@ sp_ui_drag_data_received(GtkWidget *widget,
{
int destX = 0;
int destY = 0;
- gtk_widget_translate_coordinates( widget, &(desktop->canvas->widget), x, y, &destX, &destY );
+ gtk_widget_translate_coordinates( widget, GTK_WIDGET(desktop->canvas), x, y, &destX, &destY );
Geom::Point where( sp_canvas_window_to_world( desktop->canvas, Geom::Point( destX, destY ) ) );
Geom::Point const button_dt(desktop->w2d(where));
Geom::Point const button_doc(desktop->dt2doc(button_dt));
@@ -1141,7 +1141,7 @@ sp_ui_drag_data_received(GtkWidget *widget,
if ( worked ) {
int destX = 0;
int destY = 0;
- gtk_widget_translate_coordinates( widget, &(desktop->canvas->widget), x, y, &destX, &destY );
+ gtk_widget_translate_coordinates( widget, GTK_WIDGET(desktop->canvas), x, y, &destX, &destY );
Geom::Point where( sp_canvas_window_to_world( desktop->canvas, Geom::Point( destX, destY ) ) );
Geom::Point const button_dt(desktop->w2d(where));
Geom::Point const button_doc(desktop->dt2doc(button_dt));
diff --git a/src/ui/tool/event-utils.cpp b/src/ui/tool/event-utils.cpp
index 079275d63..6b8d5f0dc 100644
--- a/src/ui/tool/event-utils.cpp
+++ b/src/ui/tool/event-utils.cpp
@@ -60,8 +60,8 @@ unsigned combine_motion_events(SPCanvas *canvas, GdkEventMotion &event, gint mas
}
GdkEvent *event_next;
gint i = 0;
- event.x -= canvas->x0;
- event.y -= canvas->y0;
+ event.x -= canvas->_x0;
+ event.y -= canvas->_y0;
event_next = gdk_event_get();
// while the next event is also a motion notify
@@ -92,8 +92,8 @@ unsigned combine_motion_events(SPCanvas *canvas, GdkEventMotion &event, gint mas
if (event_next) {
gdk_event_put(event_next);
}
- event.x += canvas->x0;
- event.y += canvas->y0;
+ event.x += canvas->_x0;
+ event.y += canvas->_y0;
return i;
}
diff --git a/src/ui/tools/connector-tool.cpp b/src/ui/tools/connector-tool.cpp
index b84d16686..74f2664fe 100644
--- a/src/ui/tools/connector-tool.cpp
+++ b/src/ui/tools/connector-tool.cpp
@@ -247,7 +247,7 @@ void ConnectorTool::setup() {
// Make sure we see all enter events for canvas items,
// even if a mouse button is depressed.
- this->desktop->canvas->gen_all_enter_events = true;
+ this->desktop->canvas->_gen_all_enter_events = true;
}
void ConnectorTool::set(const Inkscape::Preferences::Entry& val) {
@@ -276,7 +276,7 @@ void ConnectorTool::finish() {
this->cc_clear_active_conn();
// Restore the default event generating behaviour.
- this->desktop->canvas->gen_all_enter_events = false;
+ this->desktop->canvas->_gen_all_enter_events = false;
}
//-----------------------------------------------------------------------------
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 1fdd3ca6d..3fa607820 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -564,7 +564,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
/* Canvas */
dtw->canvas = SP_CANVAS(SPCanvas::createAA());
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- dtw->canvas->enable_cms_display_adj = prefs->getBool("/options/displayprofile/enable");
+ dtw->canvas->_enable_cms_display_adj = prefs->getBool("/options/displayprofile/enable");
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
gtk_widget_set_can_focus (GTK_WIDGET (dtw->canvas), TRUE);
@@ -746,8 +746,8 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
Glib::ustring id = Inkscape::CMSSystem::getDisplayId( 0, 0 );
bool enabled = false;
- dtw->canvas->cms_key = id;
- enabled = !dtw->canvas->cms_key.empty();
+ dtw->canvas->_cms_key = id;
+ enabled = !dtw->canvas->_cms_key.empty();
cms_adjust_set_sensitive( dtw, enabled );
}
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
@@ -1035,7 +1035,7 @@ sp_desktop_widget_event (GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dt
// current item on the canvas, because item events and all mouse events are caught
// and passed on by the canvas acetate (I think). --bb
if ((event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE)
- && !dtw->canvas->current_item) {
+ && !dtw->canvas->_current_item) {
return sp_desktop_root_handler (NULL, event, dtw->desktop);
}
}
@@ -1054,9 +1054,9 @@ void sp_dtw_color_profile_event(EgeColorProfTracker */*tracker*/, SPDesktopWidge
gint monitor = gdk_screen_get_monitor_at_window(screen, window);
Glib::ustring id = Inkscape::CMSSystem::getDisplayId( screenNum, monitor );
bool enabled = false;
- dtw->canvas->cms_key = id;
+ dtw->canvas->_cms_key = id;
dtw->requestCanvasUpdate();
- enabled = !dtw->canvas->cms_key.empty();
+ enabled = !dtw->canvas->_cms_key.empty();
cms_adjust_set_sensitive( dtw, enabled );
}
#else
@@ -1092,8 +1092,8 @@ void cms_adjust_toggled( GtkWidget */*button*/, gpointer data )
SPDesktopWidget *dtw = SP_DESKTOP_WIDGET(data);
bool down = SP_BUTTON_IS_DOWN(dtw->cms_adjust);
- if ( down != dtw->canvas->enable_cms_display_adj ) {
- dtw->canvas->enable_cms_display_adj = down;
+ if ( down != dtw->canvas->_enable_cms_display_adj ) {
+ dtw->canvas->_enable_cms_display_adj = down;
dtw->requestCanvasUpdate();
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setBool("/options/displayprofile/enable", down);