summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenis Declara <declara91@gmail.com>2012-04-15 12:29:45 +0000
committerDenis Declara <declara91@gmail.com>2012-04-15 12:29:45 +0000
commit6b5ff661a46ea1779c86f6947006c5ed32926117 (patch)
treea5b170f0830854e99ad065055ee2a3996933e614 /src
parentImproved User interface. (diff)
parenti18n. Fix for Bug #980518 (Please use c-format). (diff)
downloadinkscape-6b5ff661a46ea1779c86f6947006c5ed32926117.tar.gz
inkscape-6b5ff661a46ea1779c86f6947006c5ed32926117.zip
Trunk merge
(bzr r11073.1.15)
Diffstat (limited to 'src')
-rw-r--r--src/2geom/d2-sbasis.cpp13
-rw-r--r--src/2geom/d2-sbasis.h5
-rw-r--r--src/2geom/sbasis-geometric.cpp15
-rw-r--r--src/2geom/sbasis.cpp20
-rw-r--r--src/Makefile.am10
-rw-r--r--src/arc-context.cpp68
-rw-r--r--src/box3d-context.cpp69
-rw-r--r--src/connector-context.cpp31
-rw-r--r--src/desktop-events.cpp104
-rw-r--r--src/desktop.cpp4
-rw-r--r--src/dialogs/dialog-events.cpp107
-rw-r--r--src/dialogs/find.cpp49
-rw-r--r--src/display/canvas-grid.cpp2
-rw-r--r--src/display/nr-filter-merge.cpp2
-rw-r--r--src/display/snap-indicator.cpp7
-rw-r--r--src/display/sodipodi-ctrl.cpp290
-rw-r--r--src/display/sodipodi-ctrl.h4
-rw-r--r--src/display/sp-canvas-item.h5
-rw-r--r--src/display/sp-canvas.cpp59
-rw-r--r--src/document.cpp27
-rw-r--r--src/document.h2
-rw-r--r--src/dom/svgtypes.h5
-rw-r--r--src/doxygen-main.cpp2
-rw-r--r--src/draw-context.cpp78
-rw-r--r--src/dropper-context.cpp18
-rw-r--r--src/dyna-draw-context.cpp60
-rw-r--r--src/ege-adjustment-action.cpp109
-rw-r--r--src/enums.h22
-rw-r--r--src/eraser-context.cpp60
-rw-r--r--src/event-context.cpp183
-rw-r--r--src/extension/dbus/document-interface.cpp3
-rw-r--r--src/extension/dxf2svg/test_dxf.cpp4
-rw-r--r--src/extension/internal/cairo-renderer.cpp2
-rw-r--r--src/extension/internal/javafx-out.cpp15
-rw-r--r--src/extension/internal/pdf-input-cairo.cpp14
-rw-r--r--src/extension/internal/pdfinput/pdf-input.cpp17
-rw-r--r--src/extension/internal/pdfinput/pdf-parser.cpp3
-rw-r--r--src/extension/param/bool.cpp5
-rw-r--r--src/extension/script/InkscapeScript.cpp12
-rw-r--r--src/file.cpp104
-rw-r--r--src/file.h2
-rw-r--r--src/flood-context.cpp95
-rw-r--r--src/gradient-chemistry.cpp13
-rw-r--r--src/gradient-context.cpp133
-rw-r--r--src/gradient-drag.cpp9
-rw-r--r--src/helper/geom.cpp12
-rw-r--r--src/helper/pixbuf-ops.cpp2
-rw-r--r--src/helper/png-write.cpp2
-rw-r--r--src/helper/unit-menu.cpp6
-rw-r--r--src/ink-comboboxentry-action.cpp8
-rw-r--r--src/inkview.cpp151
-rw-r--r--src/interface.cpp978
-rw-r--r--src/interface.h199
-rw-r--r--src/io/gzipstream.cpp18
-rw-r--r--src/knot-holder-entity.h17
-rw-r--r--src/knot.cpp14
-rw-r--r--src/knot.h32
-rw-r--r--src/knotholder.cpp35
-rw-r--r--src/knotholder.h4
-rw-r--r--src/libgdl/Makefile_insert43
-rw-r--r--src/libnrtype/Layout-TNG-OutIter.cpp16
-rw-r--r--src/libnrtype/Layout-TNG-Output.cpp43
-rw-r--r--src/live_effects/effect.cpp29
-rw-r--r--src/live_effects/effect.h5
-rw-r--r--src/live_effects/lpe-angle_bisector.cpp72
-rw-r--r--src/live_effects/lpe-angle_bisector.h11
-rw-r--r--src/live_effects/lpe-copy_rotate.cpp62
-rw-r--r--src/live_effects/lpe-copy_rotate.h1
-rw-r--r--src/live_effects/lpe-knot.cpp43
-rw-r--r--src/live_effects/lpe-knot.h5
-rw-r--r--src/live_effects/lpe-parallel.cpp59
-rw-r--r--src/live_effects/lpe-parallel.h1
-rw-r--r--src/live_effects/lpe-perp_bisector.cpp47
-rw-r--r--src/live_effects/lpe-perp_bisector.h1
-rw-r--r--src/live_effects/lpe-perspective_path.cpp38
-rw-r--r--src/live_effects/lpe-perspective_path.h1
-rw-r--r--src/live_effects/lpe-powerstroke.cpp130
-rw-r--r--src/live_effects/lpe-rough-hatches.cpp4
-rw-r--r--src/live_effects/lpe-rough-hatches.h2
-rw-r--r--src/live_effects/lpe-skeleton.cpp25
-rw-r--r--src/live_effects/lpe-skeleton.h13
-rw-r--r--src/live_effects/lpe-tangent_to_curve.cpp66
-rw-r--r--src/live_effects/lpe-tangent_to_curve.h1
-rw-r--r--src/live_effects/parameter/originalpath.cpp8
-rw-r--r--src/live_effects/parameter/originalpath.h2
-rw-r--r--src/live_effects/parameter/path.cpp10
-rw-r--r--src/live_effects/parameter/path.h3
-rw-r--r--src/live_effects/parameter/point.cpp2
-rw-r--r--src/live_effects/parameter/powerstrokepointarray.cpp43
-rw-r--r--src/live_effects/parameter/vector.cpp11
-rw-r--r--src/live_effects/parameter/vector.h1
-rw-r--r--src/main.cpp13
-rw-r--r--src/measure-context.cpp3
-rw-r--r--src/menus-skeleton.h6
-rw-r--r--src/object-edit.cpp12
-rw-r--r--src/pen-context.cpp123
-rw-r--r--src/pencil-context.cpp86
-rw-r--r--src/rect-context.cpp108
-rw-r--r--src/select-context.cpp172
-rw-r--r--src/selection-chemistry.cpp280
-rw-r--r--src/selection-chemistry.h17
-rw-r--r--src/seltrans-handles.cpp34
-rw-r--r--src/seltrans-handles.h3
-rw-r--r--src/seltrans.cpp14
-rw-r--r--src/shortcuts.cpp37
-rw-r--r--src/sp-filter.cpp2
-rw-r--r--src/sp-font-face.cpp32
-rw-r--r--src/sp-gradient.cpp2
-rw-r--r--src/sp-image.cpp6
-rw-r--r--src/sp-item.cpp41
-rw-r--r--src/sp-path.cpp7
-rw-r--r--src/spiral-context.cpp112
-rw-r--r--src/spray-context.cpp148
-rw-r--r--src/star-context.cpp112
-rw-r--r--src/svg-view.cpp4
-rw-r--r--src/svg/itos.cpp2
-rw-r--r--src/svg/svg-color.cpp87
-rw-r--r--src/text-context.cpp217
-rw-r--r--src/tweak-context.cpp179
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/Makefile_insert2
-rw-r--r--src/ui/clipboard.cpp185
-rw-r--r--src/ui/context-menu.cpp693
-rw-r--r--src/ui/context-menu.h36
-rw-r--r--src/ui/dialog/aboutbox.cpp4
-rw-r--r--src/ui/dialog/align-and-distribute.cpp45
-rw-r--r--src/ui/dialog/align-and-distribute.h25
-rw-r--r--src/ui/dialog/clonetiler.cpp75
-rw-r--r--src/ui/dialog/export.cpp128
-rw-r--r--src/ui/dialog/export.h6
-rw-r--r--src/ui/dialog/filedialogimpl-gtkmm.cpp2
-rw-r--r--src/ui/dialog/filedialogimpl-win32.cpp4
-rw-r--r--src/ui/dialog/filter-effects-dialog.cpp86
-rw-r--r--src/ui/dialog/find.cpp4
-rw-r--r--src/ui/dialog/inkscape-preferences.cpp58
-rw-r--r--src/ui/dialog/layers.h4
-rw-r--r--src/ui/dialog/livepatheffect-editor.cpp105
-rw-r--r--src/ui/dialog/livepatheffect-editor.h4
-rw-r--r--src/ui/dialog/ocaldialogs.cpp30
-rw-r--r--src/ui/dialog/ocaldialogs.h2
-rw-r--r--src/ui/dialog/spellcheck.h4
-rw-r--r--src/ui/dialog/swatches.cpp10
-rw-r--r--src/ui/dialog/swatches.h3
-rw-r--r--src/ui/dialog/text-edit.cpp4
-rw-r--r--src/ui/dialog/xml-tree.cpp215
-rw-r--r--src/ui/dialog/xml-tree.h13
-rw-r--r--src/ui/previewfillable.h3
-rw-r--r--src/ui/previewholder.cpp24
-rw-r--r--src/ui/previewholder.h5
-rw-r--r--src/ui/tool/control-point-selection.cpp149
-rw-r--r--src/ui/tool/control-point.cpp26
-rw-r--r--src/ui/tool/control-point.h11
-rw-r--r--src/ui/tool/curve-drag-point.cpp2
-rw-r--r--src/ui/tool/event-utils.cpp90
-rw-r--r--src/ui/tool/modifier-tracker.cpp91
-rw-r--r--src/ui/tool/multi-path-manipulator.cpp179
-rw-r--r--src/ui/tool/node-tool.cpp18
-rw-r--r--src/ui/tool/node.cpp21
-rw-r--r--src/ui/tool/path-manipulator.cpp2
-rw-r--r--src/ui/tool/selectable-control-point.cpp4
-rw-r--r--src/ui/tool/selectable-control-point.h4
-rw-r--r--src/ui/tool/selector.cpp8
-rw-r--r--src/ui/tool/transform-handle-set.cpp26
-rw-r--r--src/ui/tool/transform-handle-set.h3
-rw-r--r--src/ui/widget/dock-item.h4
-rw-r--r--src/ui/widget/panel.cpp8
-rw-r--r--src/ui/widget/panel.h7
-rw-r--r--src/ui/widget/registered-widget.h4
-rw-r--r--src/ui/widget/selected-style.cpp12
-rw-r--r--src/ui/widget/spinbutton.cpp12
-rw-r--r--src/ui/widget/style-swatch.cpp4
-rw-r--r--src/ui/widget/zoom-status.cpp2
-rw-r--r--src/verbs.cpp31
-rw-r--r--src/verbs.h4
-rw-r--r--src/widgets/desktop-widget.cpp37
-rw-r--r--src/widgets/eek-preview.cpp35
-rw-r--r--src/widgets/font-selector.cpp39
-rw-r--r--src/widgets/gradient-selector.cpp10
-rw-r--r--src/widgets/gradient-toolbar.cpp11
-rw-r--r--src/widgets/gradient-vector.cpp31
-rw-r--r--src/widgets/paint-selector.cpp51
-rw-r--r--src/widgets/select-toolbar.cpp5
-rw-r--r--src/widgets/shrink-wrap-button.cpp4
-rw-r--r--src/widgets/sp-color-notebook.cpp5
-rw-r--r--src/widgets/sp-color-slider.cpp32
-rw-r--r--src/widgets/sp-widget.cpp2
-rw-r--r--src/widgets/sp-xmlview-attr-list.cpp58
-rw-r--r--src/widgets/sp-xmlview-attr-list.h4
-rw-r--r--src/widgets/sp-xmlview-tree.cpp546
-rw-r--r--src/widgets/sp-xmlview-tree.h14
-rw-r--r--src/widgets/stroke-marker-selector.cpp31
-rw-r--r--src/widgets/toolbox.cpp31
-rw-r--r--src/xml/repr-css.cpp71
-rw-r--r--src/xml/repr.h1
-rw-r--r--src/xml/simple-document.h3
-rw-r--r--src/zoom-context.cpp28
196 files changed, 6378 insertions, 3170 deletions
diff --git a/src/2geom/d2-sbasis.cpp b/src/2geom/d2-sbasis.cpp
index 7bfb7c6c5..486ada9a2 100644
--- a/src/2geom/d2-sbasis.cpp
+++ b/src/2geom/d2-sbasis.cpp
@@ -185,6 +185,19 @@ split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwsbi
return ret;
}
+Point unitTangentAt(D2<SBasis> const & a, Coord t, unsigned n)
+{
+ std::vector<Point> derivs = a.valueAndDerivatives(t, n);
+ for (unsigned deriv_n = 1; deriv_n < derivs.size(); deriv_n++) {
+ Coord length = derivs[deriv_n].length();
+ if ( ! are_near(length, 0) ) {
+ // length of derivative is non-zero, so return unit vector
+ return derivs[deriv_n] / length;
+ }
+ }
+ return Point (0,0);
+}
+
static void set_first_point(Piecewise<D2<SBasis> > &f, Point a){
if ( f.empty() ){
f.concat(Piecewise<D2<SBasis> >(D2<SBasis>(Linear(a[X]),Linear(a[Y]))));
diff --git a/src/2geom/d2-sbasis.h b/src/2geom/d2-sbasis.h
index e61067e1b..965ec8746 100644
--- a/src/2geom/d2-sbasis.h
+++ b/src/2geom/d2-sbasis.h
@@ -83,6 +83,11 @@ std::vector<Piecewise<D2<SBasis> > > fuse_nearby_ends(std::vector<Piecewise<D2<S
std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwsbin, double tol = .0001);
+/**
+* note that -unitTangentAt(reverse(a),0.) == unitTangentAt(a,1.) but the former is more reliable (sometimes the sign is wrong for the latter)
+*/
+Point unitTangentAt(D2<SBasis> const & a, Coord t, unsigned n = 3);
+
class CoordIterator
: public std::iterator<std::input_iterator_tag, SBasis const>
{
diff --git a/src/2geom/sbasis-geometric.cpp b/src/2geom/sbasis-geometric.cpp
index b228a8ca0..74827e27c 100644
--- a/src/2geom/sbasis-geometric.cpp
+++ b/src/2geom/sbasis-geometric.cpp
@@ -1,9 +1,3 @@
-#include <2geom/sbasis-geometric.h>
-#include <2geom/sbasis.h>
-#include <2geom/sbasis-math.h>
-//#include <2geom/solver.h>
-#include <2geom/sbasis-geometric.h>
-
/** Geometric operators on D2<SBasis> (1D->2D).
* Copyright 2007 JF Barraud
* Copyright 2007 N Hurst
@@ -21,6 +15,12 @@
*
**/
+#include <2geom/sbasis-geometric.h>
+#include <2geom/sbasis.h>
+#include <2geom/sbasis-math.h>
+//#include <2geom/solver.h>
+#include <2geom/sbasis-geometric.h>
+
//namespace Geom{
using namespace Geom;
using namespace std;
@@ -409,6 +409,9 @@ Geom::arc_length_parametrization(D2<SBasis> const &M,
Piecewise<SBasis> s = arcLengthSb(Piecewise<D2<SBasis> >(M),tol);
for (unsigned i=0; i < s.size();i++){
double t0=s.cuts[i],t1=s.cuts[i+1];
+ if ( are_near(s(t0),s(t1)) ) {
+ continue;
+ }
D2<SBasis> sub_M = compose(M,Linear(t0,t1));
D2<SBasis> sub_u;
for (unsigned dim=0;dim<2;dim++){
diff --git a/src/2geom/sbasis.cpp b/src/2geom/sbasis.cpp
index 89640af5c..b56e03c74 100644
--- a/src/2geom/sbasis.cpp
+++ b/src/2geom/sbasis.cpp
@@ -225,10 +225,9 @@ SBasis multiply(SBasis const &a, SBasis const &b) {
// c = {a0*b0 - shift(1, a.Tri*b.Tri), a1*b1 - shift(1, a.Tri*b.Tri)}
// shift(1, a.Tri*b.Tri)
- SBasis c;
+ SBasis c(a.size() + b.size(), Linear(0,0));
if(a.isZero() || b.isZero())
return c;
- c.resize(a.size() + b.size(), Linear(0,0));
for(unsigned j = 0; j < b.size(); j++) {
for(unsigned i = j; i < a.size()+j; i++) {
double tri = b[j].tri()*a[i-j].tri();
@@ -280,7 +279,7 @@ SBasis multiply_add(SBasis const &a, SBasis const &b, SBasis c) {
*/
SBasis multiply(SBasis const &a, SBasis const &b) {
- SBasis c;
+ SBasis c(a.size() + b.size(), Linear(0,0));
if(a.isZero() || b.isZero())
return c;
return multiply_add(a, b, c);
@@ -607,7 +606,7 @@ TODO: compute order according to tol?
TODO: requires g(0)=0 & g(1)=1 atm... adaptation to other cases should be obvious!
*/
SBasis compose_inverse(SBasis const &f, SBasis const &g, unsigned order, double zero){
- SBasis result(order, Linear()); //result
+ SBasis result(order, Linear(0.)); //result
SBasis r=f; //remainder
SBasis Pk=Linear(1)-g,Qk=g,sg=Pk*Qk;
Pk.truncate(order);
@@ -616,7 +615,10 @@ SBasis compose_inverse(SBasis const &f, SBasis const &g, unsigned order, double
Qk.resize(order,Linear(0.));
r.resize(order,Linear(0.));
- int vs= valuation(sg,zero);
+ int vs = valuation(sg,zero);
+ if (vs == 0) { // to prevent infinite loop
+ return result;
+ }
for (unsigned k=0; k<order; k+=vs){
double p10 = Pk.at(k)[0];// we have to solve the linear system:
@@ -641,9 +643,11 @@ SBasis compose_inverse(SBasis const &f, SBasis const &g, unsigned order, double
Pk=Pk*sg;
Qk=Qk*sg;
- Pk.truncate(order);
- Qk.truncate(order);
- r.truncate(order);
+
+ Pk.resize(order,Linear(0.)); // truncates if too high order, expands with zeros if too low
+ Qk.resize(order,Linear(0.));
+ r.resize(order,Linear(0.));
+
}
result.normalize();
return result;
diff --git a/src/Makefile.am b/src/Makefile.am
index 2ab4d0030..c27af0800 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,12 +19,18 @@ bin_PROGRAMS = inkscape inkview
#if WITH_INKBOARD
#libpedro = pedro/libpedro.a
#endif
+
+if !WITH_EXT_GDL
+internal_GDL = libgdl/libgdl.a
+endif
+
+
noinst_LIBRARIES = \
libinkscape.a \
dom/libdom.a \
libcroco/libcroco.a \
libavoid/libavoid.a \
- libgdl/libgdl.a \
+ $(internal_GDL) \
libcola/libcola.a \
libvpsc/libvpsc.a \
livarot/libvarot.a \
@@ -46,6 +52,7 @@ all_libs = \
$(INKBOARD_LIBS) \
$(LIBWPG_LIBS) \
$(DBUS_LIBS) \
+ $(GDL_LIBS) \
$(IMAGEMAGICK_LIBS)
# Add sources common for Inkscape and Inkview to this variable.
@@ -68,6 +75,7 @@ INCLUDES = \
$(INKBOARD_CFLAGS) \
$(LIBWPG_CFLAGS) \
$(DBUS_CFLAGS) \
+ $(GDL_CFLAGS) \
$(XFT_CFLAGS) \
$(LCMS_CFLAGS) \
$(POPPLER_CFLAGS) \
diff --git a/src/arc-context.cpp b/src/arc-context.cpp
index b62da2db8..ceea63c05 100644
--- a/src/arc-context.cpp
+++ b/src/arc-context.cpp
@@ -48,6 +48,26 @@
#include "arc-context.h"
#include "display/sp-canvas-item.h"
+// Define new form of key macros if we're using an old GTK+ version
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_space 0x020
+#endif
+
using Inkscape::DocumentUndo;
static void sp_arc_context_class_init(SPArcContextClass *klass);
@@ -319,14 +339,14 @@ static gint sp_arc_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
+ case GDK_KEY_Meta_R:
if (!dragging) {
sp_event_show_modifier_tip(event_context->defaultMessageContext(), event,
_("<b>Ctrl</b>: make circle or integer-ratio ellipse, snap arc/segment angle"),
@@ -334,22 +354,22 @@ static gint sp_arc_context_root_handler(SPEventContext *event_context, GdkEvent
NULL);
}
break;
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-arc");
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (dragging) {
dragging = false;
sp_event_context_discard_delayed_snap_event(event_context);
@@ -358,7 +378,7 @@ static gint sp_arc_context_root_handler(SPEventContext *event_context, GdkEvent
ret = TRUE;
}
break;
- case GDK_space:
+ case GDK_KEY_space:
if (dragging) {
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate),
event->button.time);
@@ -378,14 +398,14 @@ static gint sp_arc_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_RELEASE:
switch (event->key.keyval) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt
+ case GDK_KEY_Meta_R:
event_context->defaultMessageContext()->clear();
break;
default:
diff --git a/src/box3d-context.cpp b/src/box3d-context.cpp
index 12487d1a9..2ffef98e1 100644
--- a/src/box3d-context.cpp
+++ b/src/box3d-context.cpp
@@ -51,6 +51,31 @@
#include "shape-editor.h"
#include "verbs.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_parenright 0x029
+#define GDK_KEY_parenleft 0x028
+#define GDK_KEY_braceright 0x07d
+#define GDK_KEY_braceleft 0x07b
+#define GDK_KEY_G 0x047
+#define GDK_KEY_g 0x067
+#define GDK_KEY_p 0x070
+#define GDK_KEY_P 0x050
+#define GDK_KEY_X 0x058
+#define GDK_KEY_x 0x078
+#define GDK_KEY_y 0x079
+#define GDK_KEY_Y 0x059
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_space 0x020
+#endif
+
using Inkscape::DocumentUndo;
static void sp_box3d_context_class_init(Box3DContextClass *klass);
@@ -429,51 +454,51 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
break;
- case GDK_bracketright:
+ case GDK_KEY_bracketright:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, -180/snaps, MOD__ALT);
DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
- case GDK_bracketleft:
+ case GDK_KEY_bracketleft:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::X, 180/snaps, MOD__ALT);
DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
- case GDK_parenright:
+ case GDK_KEY_parenright:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, -180/snaps, MOD__ALT);
DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
- case GDK_parenleft:
+ case GDK_KEY_parenleft:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Y, 180/snaps, MOD__ALT);
DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
- case GDK_braceright:
+ case GDK_KEY_braceright:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, -180/snaps, MOD__ALT);
DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
ret = true;
break;
- case GDK_braceleft:
+ case GDK_KEY_braceleft:
persp3d_rotate_VP (document->getCurrentPersp3D(), Proj::Z, 180/snaps, MOD__ALT);
DocumentUndo::done(document, SP_VERB_CONTEXT_3DBOX,
_("Change perspective (angle of PLs)"));
@@ -490,16 +515,16 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
break;
*/
- case GDK_g:
- case GDK_G:
+ case GDK_KEY_g:
+ case GDK_KEY_G:
if (MOD__SHIFT_ONLY) {
sp_selection_to_guides(desktop);
ret = true;
}
break;
- case GDK_p:
- case GDK_P:
+ case GDK_KEY_p:
+ case GDK_KEY_P:
if (MOD__SHIFT_ONLY) {
if (document->getCurrentPersp3D()) {
persp3d_print_debugging_info (document->getCurrentPersp3D());
@@ -508,8 +533,8 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
}
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-box3d");
ret = TRUE;
@@ -521,8 +546,8 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
}
break;
- case GDK_y:
- case GDK_Y:
+ case GDK_KEY_y:
+ case GDK_KEY_Y:
if (MOD__SHIFT_ONLY) {
persp3d_toggle_VPs(selection->perspList(), Proj::Y);
bc->_vpdrag->updateLines(); // FIXME: Shouldn't this be done automatically?
@@ -530,8 +555,8 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (MOD__SHIFT_ONLY) {
persp3d_toggle_VPs(selection->perspList(), Proj::Z);
bc->_vpdrag->updateLines(); // FIXME: Shouldn't this be done automatically?
@@ -539,12 +564,12 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
sp_desktop_selection(desktop)->clear();
//TODO: make dragging escapable by Esc
break;
- case GDK_space:
+ case GDK_KEY_space:
if (dragging) {
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate),
event->button.time);
diff --git a/src/connector-context.cpp b/src/connector-context.cpp
index 1c631c446..d3ad81134 100644
--- a/src/connector-context.cpp
+++ b/src/connector-context.cpp
@@ -194,6 +194,13 @@
using Inkscape::DocumentUndo;
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Delete 0xffff
+#endif
+
static void sp_connector_context_class_init(SPConnectorContextClass *klass);
static void sp_connector_context_init(SPConnectorContext *conn_context);
static void sp_connector_context_dispose(GObject *object);
@@ -613,7 +620,7 @@ cc_select_handle(SPKnot* knot)
{
knot->setShape(SP_KNOT_SHAPE_SQUARE);
knot->setSize(10);
- knot->setAnchor(GTK_ANCHOR_CENTER);
+ knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0x0000ffff, 0x0000ffff, 0x0000ffff);
sp_knot_update_ctrl(knot);
}
@@ -623,7 +630,7 @@ cc_deselect_handle(SPKnot* knot)
{
knot->setShape(SP_KNOT_SHAPE_SQUARE);
knot->setSize(8);
- knot->setAnchor(GTK_ANCHOR_CENTER);
+ knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
sp_knot_update_ctrl(knot);
}
@@ -1156,15 +1163,15 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
if ( cc->mode == SP_CONNECTOR_CONTEXT_DRAWING_MODE )
{
switch (keyval) {
- case GDK_Return:
- case GDK_KP_Enter:
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
if (cc->npoints != 0) {
spcc_connector_finish(cc);
cc->state = SP_CONNECTOR_CONTEXT_IDLE;
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
@@ -1195,7 +1202,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
switch ( cc->state )
{
case SP_CONNECTOR_CONTEXT_DRAGGING:
- if ( keyval == GDK_Escape )
+ if ( keyval == GDK_KEY_Escape )
{
// Cancel connection point dragging
@@ -1209,7 +1216,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
_("Connection point drag cancelled."));
ret = TRUE;
}
- else if ( keyval == GDK_Return || keyval == GDK_KP_Enter )
+ else if ( keyval == GDK_KEY_Return || keyval == GDK_KEY_KP_Enter )
{
// Put connection point at current position
@@ -1233,7 +1240,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
}
break;
case SP_CONNECTOR_CONTEXT_NEWCONNPOINT:
- if ( keyval == GDK_Escape )
+ if ( keyval == GDK_KEY_Escape )
{
// Just destroy the knot
g_object_unref( cc->selected_handle );
@@ -1241,7 +1248,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
cc->state = SP_CONNECTOR_CONTEXT_IDLE;
ret = TRUE;
}
- else if ( keyval == GDK_Return || keyval == GDK_KP_Enter )
+ else if ( keyval == GDK_KEY_Return || keyval == GDK_KEY_KP_Enter )
{
SPDesktop *desktop = SP_EVENT_CONTEXT_DESKTOP(cc);
SPDocument *doc = sp_desktop_document(desktop);
@@ -1272,7 +1279,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
break;
case SP_CONNECTOR_CONTEXT_IDLE:
- if ( keyval == GDK_Delete && cc->selected_handle )
+ if ( keyval == GDK_KEY_Delete && cc->selected_handle )
{
cc->active_shape->avoidRef->deleteConnectionPoint(cc->connpthandles[cc->selected_handle]);
cc->selected_handle = NULL;
@@ -1630,7 +1637,7 @@ static void cc_active_shape_add_knot(SPDesktop* desktop, SPItem* item, Connectio
knot->setShape(SP_KNOT_SHAPE_SQUARE);
knot->setSize(8);
- knot->setAnchor(GTK_ANCHOR_CENTER);
+ knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
sp_knot_update_ctrl(knot);
@@ -1814,7 +1821,7 @@ cc_set_active_conn(SPConnectorContext *cc, SPItem *item)
knot->setShape(SP_KNOT_SHAPE_SQUARE);
knot->setSize(7);
- knot->setAnchor(GTK_ANCHOR_CENTER);
+ knot->setAnchor(SP_ANCHOR_CENTER);
knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff);
knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff);
sp_knot_update_ctrl(knot);
diff --git a/src/desktop-events.cpp b/src/desktop-events.cpp
index d24ddfed0..68b372d99 100644
--- a/src/desktop-events.cpp
+++ b/src/desktop-events.cpp
@@ -47,6 +47,72 @@
#include "widgets/desktop-widget.h"
#include "xml/repr.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
static void snoop_extended(GdkEvent* event, SPDesktop *desktop);
@@ -84,12 +150,18 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge
int wx, wy;
SPDesktop *desktop = dtw->desktop;
+ GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(dtw->canvas));
- gdk_window_get_pointer(gtk_widget_get_window (GTK_WIDGET(dtw->canvas)), &wx, &wy, NULL);
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkDisplay *display = gdk_window_get_display(window);
+ gdk_window_get_device_position(window, display->core_pointer, &wx, &wy, NULL);
+#else
+ gdk_window_get_pointer(window, &wx, &wy, NULL);
+#endif
Geom::Point const event_win(wx, wy);
gint width, height;
- gdk_window_get_geometry(gtk_widget_get_window (GTK_WIDGET(dtw->canvas)), NULL /*x*/, NULL /*y*/, &width, &height, NULL/*depth*/);
+ gdk_window_get_geometry(window, NULL /*x*/, NULL /*y*/, &width, &height, NULL/*depth*/);
switch (event->type) {
case GDK_BUTTON_PRESS:
@@ -450,7 +522,11 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
GdkCursor *guide_cursor;
guide_cursor = gdk_cursor_new (GDK_EXCHANGE);
gdk_window_set_cursor(gtk_widget_get_window (GTK_WIDGET(sp_desktop_canvas(desktop))), guide_cursor);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(guide_cursor);
+#else
gdk_cursor_unref(guide_cursor);
+#endif
}
char *guide_description = sp_guide_description(guide);
@@ -468,9 +544,9 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Delete:
- case GDK_KP_Delete:
- case GDK_BackSpace:
+ case GDK_KEY_Delete:
+ case GDK_KEY_KP_Delete:
+ case GDK_KEY_BackSpace:
{
SPDocument *doc = guide->document;
sp_guide_remove(guide);
@@ -479,13 +555,17 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
sp_event_context_discard_delayed_snap_event(desktop->event_context);
break;
}
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
if (drag_type != SP_DRAG_MOVE_ORIGIN) {
GdkCursor *guide_cursor;
guide_cursor = gdk_cursor_new (GDK_EXCHANGE);
gdk_window_set_cursor(gtk_widget_get_window (GTK_WIDGET(sp_desktop_canvas(desktop))), guide_cursor);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(guide_cursor);
+#else
gdk_cursor_unref(guide_cursor);
+#endif
ret = TRUE;
break;
}
@@ -497,12 +577,16 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval (&event->key)) {
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
GdkCursor *guide_cursor;
guide_cursor = gdk_cursor_new (GDK_EXCHANGE);
gdk_window_set_cursor(gtk_widget_get_window (GTK_WIDGET(sp_desktop_canvas(desktop))), guide_cursor);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(guide_cursor);
+#else
gdk_cursor_unref(guide_cursor);
+#endif
break;
default:
// do nothing;
@@ -658,7 +742,7 @@ void snoop_extended(GdkEvent* event, SPDesktop *desktop)
}
-void sp_dt_ruler_snap_new_guide(SPDesktop *desktop, SPCanvasItem *guide, Geom::Point &event_dt, Geom::Point &normal)
+void sp_dt_ruler_snap_new_guide(SPDesktop *desktop, SPCanvasItem * /*guide*/, Geom::Point &event_dt, Geom::Point &normal)
{
SnapManager &m = desktop->namedview->snap_manager;
m.setup(desktop);
diff --git a/src/desktop.cpp b/src/desktop.cpp
index cf71c8f9e..7aabb1245 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -1402,7 +1402,11 @@ void SPDesktop::setWaitingCursor()
{
GdkCursor *waiting = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(sp_desktop_canvas(this))), waiting);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_cursor_unref(waiting);
+#else
gdk_cursor_unref(waiting);
+#endif
// GDK needs the flush for the cursor change to take effect
gdk_flush();
waiting_cursor = true;
diff --git a/src/dialogs/dialog-events.cpp b/src/dialogs/dialog-events.cpp
index f8fce8bd7..70899d4d7 100644
--- a/src/dialogs/dialog-events.cpp
+++ b/src/dialogs/dialog-events.cpp
@@ -27,6 +27,105 @@
#include "dialog-events.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_b 0x062
+#define GDK_KEY_B 0x042
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_i 0x069
+#define GDK_KEY_I 0x049
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_k 0x06b
+#define GDK_KEY_K 0x04b
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_KP_Space 0xff80
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#define GDK_KEY_KP_Add 0xffab
+#define GDK_KEY_KP_Subtract 0xffad
+#endif
+
/**
* Remove focus from window to whoever it is transient for.
@@ -105,13 +204,13 @@ sp_dialog_event_handler (GtkWindow *win, GdkEvent *event, gpointer data)
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Escape:
+ case GDK_KEY_Escape:
sp_dialog_defocus (win);
ret = TRUE;
break;
- case GDK_F4:
- case GDK_w:
- case GDK_W:
+ case GDK_KEY_F4:
+ case GDK_KEY_w:
+ case GDK_KEY_W:
// close dialog
if (MOD__CTRL_ONLY) {
diff --git a/src/dialogs/find.cpp b/src/dialogs/find.cpp
index b96284209..3bd22b8eb 100644
--- a/src/dialogs/find.cpp
+++ b/src/dialogs/find.cpp
@@ -108,7 +108,11 @@ void
sp_find_squeeze_window()
{
GtkRequisition r;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(dlg, &r, NULL);
+#else
gtk_widget_size_request(dlg, &r);
+#endif
gtk_window_resize ((GtkWindow *) dlg, r.width, r.height);
}
@@ -418,7 +422,12 @@ sp_find_dialog_reset (GObject *, GObject *dlg)
void
sp_find_new_searchfield (GtkWidget *dlg, GtkWidget *vb, const gchar *label, const gchar *id, const gchar *tip)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
GtkWidget *l = gtk_label_new_with_mnemonic (label);
gtk_widget_set_size_request (l, FIND_LABELWIDTH, -1);
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
@@ -491,7 +500,12 @@ sp_find_types_checkbox (GtkWidget *w, const gchar *data, gboolean active,
const gchar *label,
void (*toggled)(GtkToggleButton *, gpointer))
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
gtk_widget_show (hb);
{
@@ -514,7 +528,12 @@ sp_find_types_checkbox_indented (GtkWidget *w, const gchar *data, gboolean activ
const gchar *label,
void (*toggled)(GtkToggleButton *, gpointer), guint indent)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
gtk_widget_show (hb);
{ // empty label for indent
@@ -534,11 +553,21 @@ sp_find_types_checkbox_indented (GtkWidget *w, const gchar *data, gboolean activ
GtkWidget *
sp_find_types ()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new (FALSE, 4);
+#endif
gtk_widget_show (vb);
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
gtk_widget_show (hb);
{
@@ -556,7 +585,12 @@ sp_find_types ()
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb_all = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(vb_all), FALSE);
+#else
GtkWidget *vb_all = gtk_vbox_new (FALSE, 0);
+#endif
gtk_widget_show (vb_all);
{
@@ -566,7 +600,12 @@ sp_find_types ()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
gtk_widget_show (hb);
{ // empty label for alignment
@@ -694,7 +733,12 @@ sp_find_dialog_old (void)
gtk_container_set_border_width (GTK_CONTAINER (dlg), 4);
/* Toplevel vbox */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new (FALSE, 0);
+#endif
gtk_container_add (GTK_CONTAINER (dlg), vb);
sp_find_new_searchfield (dlg, vb, _("_Text:"), "text", _("Find objects by their text content (exact or partial match)"));
@@ -751,7 +795,12 @@ sp_find_dialog_old (void)
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
gtk_widget_show (hb);
gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 1cc6e72ed..92a1b0fb8 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -311,7 +311,7 @@ CanvasGrid::createCanvasItem(SPDesktop * desktop)
item->grid = this;
sp_canvas_item_show(SP_CANVAS_ITEM(item));
- gtk_object_ref(GTK_OBJECT(item)); // since we're keeping a link to this item, we need to bump up the ref count
+ g_object_ref(item); // since we're keeping a link to this item, we need to bump up the ref count
canvasitems = g_slist_prepend(canvasitems, item);
return item;
diff --git a/src/display/nr-filter-merge.cpp b/src/display/nr-filter-merge.cpp
index 28ac19a19..f1fbd7d33 100644
--- a/src/display/nr-filter-merge.cpp
+++ b/src/display/nr-filter-merge.cpp
@@ -74,7 +74,7 @@ double FilterMerge::complexity(Geom::Affine const &)
bool FilterMerge::uses_background()
{
- for (int i = 0; i < _input_image.size(); ++i) {
+ for (unsigned int i = 0; i < _input_image.size(); ++i) {
int input = _input_image[i];
if (input == NR_FILTER_BACKGROUNDIMAGE || input == NR_FILTER_BACKGROUNDALPHA) {
return true;
diff --git a/src/display/snap-indicator.cpp b/src/display/snap-indicator.cpp
index d5b8ce07f..1dd3022c7 100644
--- a/src/display/snap-indicator.cpp
+++ b/src/display/snap-indicator.cpp
@@ -23,6 +23,7 @@
#include "preferences.h"
#include <glibmm/i18n.h>
#include "tools-switch.h"
+#include "enums.h"
namespace Inkscape {
namespace Display {
@@ -245,7 +246,7 @@ SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const &p, bool pre_snap
SPCanvasItem * canvasitem = NULL;
canvasitem = sp_canvas_item_new(sp_desktop_tempgroup (_desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"size", 10.0,
"stroked", TRUE,
"stroke_color", pre_snap ? 0x7f7f7fff : 0xff0000ff,
@@ -345,7 +346,7 @@ SnapIndicator::set_new_snapsource(Inkscape::SnapCandidatePoint const &p)
if (value) {
SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (_desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"size", 6.0,
"stroked", TRUE,
"stroke_color", 0xff0000ff,
@@ -364,7 +365,7 @@ SnapIndicator::set_new_debugging_point(Geom::Point const &p)
g_assert(_desktop != NULL);
SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (_desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"size", 10.0,
"fill_color", 0x00ff00ff,
"stroked", FALSE,
diff --git a/src/display/sodipodi-ctrl.cpp b/src/display/sodipodi-ctrl.cpp
index 1380b491a..725ead0d6 100644
--- a/src/display/sodipodi-ctrl.cpp
+++ b/src/display/sodipodi-ctrl.cpp
@@ -29,14 +29,13 @@ enum {
static void sp_ctrl_class_init (SPCtrlClass *klass);
static void sp_ctrl_init (SPCtrl *ctrl);
static void sp_ctrl_destroy (GtkObject *object);
-static void sp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
-
+static void sp_ctrl_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
+static void sp_ctrl_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
static void sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrl_render (SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_ctrl_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
-
static SPCanvasItemClass *parent_class;
GType
@@ -66,24 +65,36 @@ sp_ctrl_class_init (SPCtrlClass *klass)
{
GtkObjectClass *object_class;
SPCanvasItemClass *item_class;
+ GObjectClass *g_object_class;
object_class = (GtkObjectClass *) klass;
item_class = (SPCanvasItemClass *) klass;
+ g_object_class = (GObjectClass *) klass;
parent_class = (SPCanvasItemClass *)g_type_class_peek_parent (klass);
- gtk_object_add_arg_type ("SPCtrl::shape", G_TYPE_INT, G_PARAM_READWRITE, ARG_SHAPE);
- gtk_object_add_arg_type ("SPCtrl::mode", G_TYPE_INT, G_PARAM_READWRITE, ARG_MODE);
- gtk_object_add_arg_type ("SPCtrl::anchor", GTK_TYPE_ANCHOR_TYPE, G_PARAM_READWRITE, ARG_ANCHOR);
- gtk_object_add_arg_type ("SPCtrl::size", G_TYPE_DOUBLE, G_PARAM_READWRITE, ARG_SIZE);
- gtk_object_add_arg_type ("SPCtrl::pixbuf", G_TYPE_POINTER, G_PARAM_READWRITE, ARG_PIXBUF);
- gtk_object_add_arg_type ("SPCtrl::filled", G_TYPE_BOOLEAN, G_PARAM_READWRITE, ARG_FILLED);
- gtk_object_add_arg_type ("SPCtrl::fill_color", G_TYPE_INT, G_PARAM_READWRITE, ARG_FILL_COLOR);
- gtk_object_add_arg_type ("SPCtrl::stroked", G_TYPE_BOOLEAN, G_PARAM_READWRITE, ARG_STROKED);
- gtk_object_add_arg_type ("SPCtrl::stroke_color", G_TYPE_INT, G_PARAM_READWRITE, ARG_STROKE_COLOR);
-
+ g_object_class->set_property = sp_ctrl_set_property;
+ g_object_class->get_property = sp_ctrl_get_property;
object_class->destroy = sp_ctrl_destroy;
- object_class->set_arg = sp_ctrl_set_arg;
+
+ g_object_class_install_property (g_object_class,
+ ARG_SHAPE, g_param_spec_int ("shape", "shape", "Shape", 0, G_MAXINT, SP_CTRL_SHAPE_SQUARE, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_MODE, g_param_spec_int ("mode", "mode", "Mode", 0, G_MAXINT, SP_CTRL_MODE_COLOR, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_ANCHOR, g_param_spec_int ("anchor", "anchor", "Anchor", 0, G_MAXINT, SP_ANCHOR_CENTER, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_SIZE, g_param_spec_double ("size", "size", "Size", 0.0, G_MAXDOUBLE, 8.0, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_PIXBUF, g_param_spec_pointer ("pixbuf", "pixbuf", "Pixbuf", (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_FILLED, g_param_spec_boolean ("filled", "filled", "Filled", TRUE, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_FILL_COLOR, g_param_spec_int ("fill_color", "fill_color", "Fill Color", G_MININT, G_MAXINT, 0x000000ff, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_STROKED, g_param_spec_boolean ("stroked", "stroked", "Stroked", FALSE, (GParamFlags) G_PARAM_READWRITE));
+ g_object_class_install_property (g_object_class,
+ ARG_STROKE_COLOR, g_param_spec_int ("stroke_color", "stroke_color", "Stroke Color", G_MININT, G_MAXINT, 0x000000ff, (GParamFlags) G_PARAM_READWRITE));
item_class->update = sp_ctrl_update;
item_class->render = sp_ctrl_render;
@@ -91,55 +102,9 @@ sp_ctrl_class_init (SPCtrlClass *klass)
}
static void
-sp_ctrl_init (SPCtrl *ctrl)
-{
- ctrl->shape = SP_CTRL_SHAPE_SQUARE;
- ctrl->mode = SP_CTRL_MODE_COLOR;
- ctrl->anchor = GTK_ANCHOR_CENTER;
- ctrl->span = 3;
- ctrl->defined = TRUE;
- ctrl->shown = FALSE;
- ctrl->build = FALSE;
- ctrl->filled = 1;
- ctrl->stroked = 0;
- ctrl->fill_color = 0x000000ff;
- ctrl->stroke_color = 0x000000ff;
-
- // This way we make sure that the first sp_ctrl_update() call finishes properly;
- // in subsequent calls it will not update anything it the control hasn't moved
- // Consider for example the case in which a snap indicator is drawn at (0, 0);
- // If moveto() is called then it will not set _moved to true because we're initially already at (0, 0)
- ctrl->_moved = true; // Is this flag ever going to be set back to false? I can't find where that is supposed to happen
-
- new (&ctrl->box) Geom::IntRect(0,0,0,0);
- ctrl->cache = NULL;
- ctrl->pixbuf = NULL;
-
- ctrl->_point = Geom::Point(0,0);
-}
-
-static void
-sp_ctrl_destroy (GtkObject *object)
+sp_ctrl_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
- SPCtrl *ctrl;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (SP_IS_CTRL (object));
-
- ctrl = SP_CTRL (object);
- if (ctrl->cache) {
- delete[] ctrl->cache;
- ctrl->cache = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
-}
-
-static void
-sp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
-{
SPCanvasItem *item;
SPCtrl *ctrl;
GdkPixbuf * pixbuf = NULL;
@@ -147,75 +112,182 @@ sp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
item = SP_CANVAS_ITEM (object);
ctrl = SP_CTRL (object);
- switch (arg_id) {
- case ARG_SHAPE:
- ctrl->shape = (SPCtrlShapeType)(GTK_VALUE_INT (*arg));
+ switch (prop_id) {
+ case ARG_SHAPE: {
+ ctrl->shape = (SPCtrlShapeType) g_value_get_int(value);
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
+ }
break;
- case ARG_MODE:
- ctrl->mode = (SPCtrlModeType)(GTK_VALUE_INT (*arg));
+ case ARG_MODE: {
+ ctrl->mode = (SPCtrlModeType) g_value_get_int(value);
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
+ }
break;
- case ARG_ANCHOR:
- ctrl->anchor = (GtkAnchorType)(GTK_VALUE_INT (*arg));
+ case ARG_ANCHOR: {
+ ctrl->anchor = (SPAnchorType) g_value_get_int(value);
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
+ }
break;
- case ARG_SIZE:
- ctrl->span = (gint) ((GTK_VALUE_DOUBLE (*arg) - 1.0) / 2.0 + 0.5);
+ case ARG_SIZE: {
+ ctrl->span = (gint)((g_value_get_double(value) - 1.0) / 2.0 + 0.5);
ctrl->defined = (ctrl->span > 0);
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
+ }
break;
- case ARG_FILLED:
- ctrl->filled = GTK_VALUE_BOOL (*arg);
+ case ARG_FILLED: {
+ ctrl->filled = g_value_get_boolean(value);
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
+ }
break;
case ARG_FILL_COLOR: {
- guint32 fill = GTK_VALUE_INT (*arg);
+ guint32 fill = g_value_get_int(value);
ctrl->fill_color = fill;
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
- } break;
+ sp_canvas_item_request_update(item);
+ }
+ break;
- case ARG_STROKED:
- ctrl->stroked = GTK_VALUE_BOOL (*arg);
+ case ARG_STROKED: {
+ ctrl->stroked = g_value_get_boolean(value);
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
+ }
break;
case ARG_STROKE_COLOR: {
- guint32 stroke = GTK_VALUE_INT (*arg);
+ guint32 stroke = g_value_get_int(value);
ctrl->stroke_color = stroke;
ctrl->build = FALSE;
- sp_canvas_item_request_update (item);
- } break;
+ sp_canvas_item_request_update(item);
+ }
+ break;
- case ARG_PIXBUF:
- pixbuf = (GdkPixbuf*)(GTK_VALUE_POINTER (*arg));
- if (gdk_pixbuf_get_has_alpha (pixbuf)) {
+ case ARG_PIXBUF: {
+ pixbuf = (GdkPixbuf*) g_value_get_pointer(value);
+ if (gdk_pixbuf_get_has_alpha(pixbuf)) {
ctrl->pixbuf = pixbuf;
} else {
- ctrl->pixbuf = gdk_pixbuf_add_alpha (pixbuf, FALSE, 0, 0, 0);
- gdk_pixbuf_unref (pixbuf);
+ ctrl->pixbuf = gdk_pixbuf_add_alpha(pixbuf, FALSE, 0, 0, 0);
+ g_object_unref(pixbuf);
}
ctrl->build = FALSE;
+ }
break;
default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
+sp_ctrl_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+ SPCtrl *ctrl;
+ ctrl = SP_CTRL (object);
+
+ switch (prop_id) {
+
+ case ARG_SHAPE:
+ g_value_set_int(value, ctrl->shape);
+ break;
+
+ case ARG_MODE:
+ g_value_set_int(value, ctrl->mode);
+ break;
+
+ case ARG_ANCHOR:
+ g_value_set_int(value, ctrl->anchor);
+ break;
+
+ case ARG_SIZE:
+ g_value_set_double(value, ctrl->span);
+ break;
+
+ case ARG_FILLED:
+ g_value_set_boolean(value, ctrl->filled);
+ break;
+
+ case ARG_FILL_COLOR:
+ g_value_set_int(value, ctrl->fill_color);
+ break;
+
+ case ARG_STROKED:
+ g_value_set_boolean(value, ctrl->stroked);
+ break;
+
+ case ARG_STROKE_COLOR:
+ g_value_set_int(value, ctrl->stroke_color);
+ break;
+
+ case ARG_PIXBUF:
+ g_value_set_pointer(value, ctrl->pixbuf);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+
+}
+static void
+sp_ctrl_init (SPCtrl *ctrl)
+{
+ ctrl->shape = SP_CTRL_SHAPE_SQUARE;
+ ctrl->mode = SP_CTRL_MODE_COLOR;
+ ctrl->anchor = SP_ANCHOR_CENTER;
+ ctrl->span = 3;
+ ctrl->defined = TRUE;
+ ctrl->shown = FALSE;
+ ctrl->build = FALSE;
+ ctrl->filled = 1;
+ ctrl->stroked = 0;
+ ctrl->fill_color = 0x000000ff;
+ ctrl->stroke_color = 0x000000ff;
+
+ // This way we make sure that the first sp_ctrl_update() call finishes properly;
+ // in subsequent calls it will not update anything it the control hasn't moved
+ // Consider for example the case in which a snap indicator is drawn at (0, 0);
+ // If moveto() is called then it will not set _moved to true because we're initially already at (0, 0)
+ ctrl->_moved = true; // Is this flag ever going to be set back to false? I can't find where that is supposed to happen
+
+ new (&ctrl->box) Geom::IntRect(0,0,0,0);
+ ctrl->cache = NULL;
+ ctrl->pixbuf = NULL;
+
+ ctrl->_point = Geom::Point(0,0);
+}
+
+static void
+sp_ctrl_destroy (GtkObject *object)
+{
+ SPCtrl *ctrl;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (SP_IS_CTRL (object));
+
+ ctrl = SP_CTRL (object);
+
+ if (ctrl->cache) {
+ delete[] ctrl->cache;
+ ctrl->cache = NULL;
+ }
+
+ if (GTK_OBJECT_CLASS (parent_class)->destroy)
+ (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void
sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
SPCtrl *ctrl;
@@ -240,39 +312,39 @@ sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int fla
y = (gint) ((affine[5] > 0) ? (affine[5] + 0.5) : (affine[5] - 0.5)) - ctrl->span;
switch (ctrl->anchor) {
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_S:
+ case SP_ANCHOR_N:
+ case SP_ANCHOR_CENTER:
+ case SP_ANCHOR_S:
break;
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_SW:
+ case SP_ANCHOR_NW:
+ case SP_ANCHOR_W:
+ case SP_ANCHOR_SW:
x += ctrl->span;
break;
- case GTK_ANCHOR_NE:
- case GTK_ANCHOR_E:
- case GTK_ANCHOR_SE:
+ case SP_ANCHOR_NE:
+ case SP_ANCHOR_E:
+ case SP_ANCHOR_SE:
x -= (ctrl->span + 1);
break;
}
switch (ctrl->anchor) {
- case GTK_ANCHOR_W:
- case GTK_ANCHOR_CENTER:
- case GTK_ANCHOR_E:
+ case SP_ANCHOR_W:
+ case SP_ANCHOR_CENTER:
+ case SP_ANCHOR_E:
break;
- case GTK_ANCHOR_NW:
- case GTK_ANCHOR_N:
- case GTK_ANCHOR_NE:
+ case SP_ANCHOR_NW:
+ case SP_ANCHOR_N:
+ case SP_ANCHOR_NE:
y += ctrl->span;
break;
- case GTK_ANCHOR_SW:
- case GTK_ANCHOR_S:
- case GTK_ANCHOR_SE:
+ case SP_ANCHOR_SW:
+ case SP_ANCHOR_S:
+ case SP_ANCHOR_SE:
y -= (ctrl->span + 1);
break;
}
diff --git a/src/display/sodipodi-ctrl.h b/src/display/sodipodi-ctrl.h
index 2617e7db2..cd0fcadf1 100644
--- a/src/display/sodipodi-ctrl.h
+++ b/src/display/sodipodi-ctrl.h
@@ -7,9 +7,9 @@
*
*/
-#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "sp-canvas-item.h"
+#include "enums.h"
#define SP_TYPE_CTRL (sp_ctrl_get_type ())
@@ -36,7 +36,7 @@ typedef enum {
struct SPCtrl : public SPCanvasItem {
SPCtrlShapeType shape;
SPCtrlModeType mode;
- GtkAnchorType anchor;
+ SPAnchorType anchor;
gint span;
guint defined : 1;
guint shown : 1;
diff --git a/src/display/sp-canvas-item.h b/src/display/sp-canvas-item.h
index c70a4e241..0a6d343b2 100644
--- a/src/display/sp-canvas-item.h
+++ b/src/display/sp-canvas-item.h
@@ -54,6 +54,11 @@ struct SPCanvasItem : public GtkObject {
double x1, y1, x2, y2;
Geom::Rect bounds;
Geom::Affine xform;
+
+ // Replacement for custom GtkObject flag enumeration
+ gboolean visible;
+ gboolean need_update;
+ gboolean need_affine;
};
/**
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index 11836baa2..0f650bf4a 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -140,11 +140,6 @@ GdkWindow *getWindow(SPCanvas *canvas)
return gtk_widget_get_window(reinterpret_cast<GtkWidget *>(canvas));
}
-enum {
- SP_CANVAS_ITEM_VISIBLE = 1 << 7,
- SP_CANVAS_ITEM_NEED_UPDATE = 1 << 8,
- SP_CANVAS_ITEM_NEED_AFFINE = 1 << 9
-};
// SPCanvasItem
@@ -413,7 +408,7 @@ void sp_canvas_item_init(SPCanvasItem *item)
// TODO items should not be visible on creation - this causes kludges with items
// that should be initially invisible; examples of such items: node handles, the CtrlRect
// used for rubberbanding, path outline, etc.
- item->flags |= SP_CANVAS_ITEM_VISIBLE;
+ item->visible = TRUE;
item->xform = Geom::Affine(Geom::identity());
}
@@ -463,7 +458,7 @@ void sp_canvas_item_construct(SPCanvasItem *item, SPCanvasGroup *parent, gchar c
*/
static void redraw_if_visible(SPCanvasItem *item)
{
- if (item->flags & SP_CANVAS_ITEM_VISIBLE) {
+ if(item->visible) {
int x0 = (int)(item->x1);
int x1 = (int)(item->x2);
int y0 = (int)(item->y1);
@@ -490,7 +485,7 @@ void sp_canvas_item_dispose(GObject *object)
} else {
redraw_if_visible (item);
}
- item->flags &= ~SP_CANVAS_ITEM_VISIBLE;
+ item->visible = FALSE;
if (item == item->canvas->current_item) {
item->canvas->current_item = NULL;
@@ -533,11 +528,11 @@ static void sp_canvas_item_invoke_update(SPCanvasItem *item, Geom::Affine const
// apply object flags to child flags
int child_flags = flags & ~SP_CANVAS_UPDATE_REQUESTED;
- if (item->flags & SP_CANVAS_ITEM_NEED_UPDATE) {
+ if(item->need_update) {
child_flags |= SP_CANVAS_UPDATE_REQUESTED;
}
- if (item->flags & SP_CANVAS_ITEM_NEED_AFFINE) {
+ if(item->need_affine) {
child_flags |= SP_CANVAS_UPDATE_AFFINE;
}
@@ -547,8 +542,8 @@ static void sp_canvas_item_invoke_update(SPCanvasItem *item, Geom::Affine const
}
}
- GTK_OBJECT_UNSET_FLAGS (item, SP_CANVAS_ITEM_NEED_UPDATE);
- GTK_OBJECT_UNSET_FLAGS (item, SP_CANVAS_ITEM_NEED_AFFINE);
+ item->need_update = FALSE;
+ item->need_affine = FALSE;
}
/**
@@ -578,8 +573,8 @@ void sp_canvas_item_affine_absolute(SPCanvasItem *item, Geom::Affine const &affi
{
item->xform = affine;
- if (!(item->flags & SP_CANVAS_ITEM_NEED_AFFINE)) {
- item->flags |= SP_CANVAS_ITEM_NEED_AFFINE;
+ if (!item->need_affine) {
+ item->need_affine = TRUE;
if (item->parent != NULL) {
sp_canvas_item_request_update (item->parent);
} else {
@@ -726,7 +721,7 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions)
bool sp_canvas_item_is_visible(SPCanvasItem *item)
{
- return item->flags & SP_CANVAS_ITEM_VISIBLE;
+ return item->visible;
}
@@ -738,11 +733,11 @@ void sp_canvas_item_show(SPCanvasItem *item)
g_return_if_fail (item != NULL);
g_return_if_fail (SP_IS_CANVAS_ITEM (item));
- if (item->flags & SP_CANVAS_ITEM_VISIBLE) {
+ if (item->visible) {
return;
}
- item->flags |= SP_CANVAS_ITEM_VISIBLE;
+ item->visible = TRUE;
int x0 = (int)(item->x1);
int x1 = (int)(item->x2);
@@ -763,11 +758,11 @@ void sp_canvas_item_hide(SPCanvasItem *item)
g_return_if_fail (item != NULL);
g_return_if_fail (SP_IS_CANVAS_ITEM (item));
- if (!(item->flags & SP_CANVAS_ITEM_VISIBLE)) {
+ if (!item->visible) {
return;
}
- item->flags &= ~SP_CANVAS_ITEM_VISIBLE;
+ item->visible = FALSE;
int x0 = (int)(item->x1);
int x1 = (int)(item->x2);
@@ -882,11 +877,11 @@ bool is_descendant(SPCanvasItem const *item, SPCanvasItem const *parent)
*/
void sp_canvas_item_request_update(SPCanvasItem *item)
{
- if (item->flags & SP_CANVAS_ITEM_NEED_UPDATE) {
+ if (item->need_update) {
return;
}
- item->flags |= SP_CANVAS_ITEM_NEED_UPDATE;
+ item->need_update = TRUE;
if (item->parent != NULL) {
// Recurse up the tree
@@ -1020,7 +1015,7 @@ double SPCanvasGroup::point(SPCanvasItem *item, Geom::Point p, SPCanvasItem **ac
SPCanvasItem *point_item = NULL; // cater for incomplete item implementations
int has_point;
- if ((child->flags & SP_CANVAS_ITEM_VISIBLE) && SP_CANVAS_ITEM_GET_CLASS (child)->point) {
+ if (child->visible && SP_CANVAS_ITEM_GET_CLASS (child)->point) {
dist = sp_canvas_item_invoke_point (child, p, &point_item);
has_point = TRUE;
} else {
@@ -1049,7 +1044,7 @@ void SPCanvasGroup::render(SPCanvasItem *item, SPCanvasBuf *buf)
for (GList *list = group->items; list; list = list->next) {
SPCanvasItem *child = (SPCanvasItem *)list->data;
- if (child->flags & SP_CANVAS_ITEM_VISIBLE) {
+ if (child->visible) {
if ((child->x1 < buf->rect.right()) &&
(child->y1 < buf->rect.bottom()) &&
(child->x2 > buf->rect.left()) &&
@@ -1068,7 +1063,7 @@ void SPCanvasGroup::viewboxChanged(SPCanvasItem *item, Geom::IntRect const &new_
for (GList *list = group->items; list; list = list->next) {
SPCanvasItem *child = (SPCanvasItem *)list->data;
- if (child->flags & SP_CANVAS_ITEM_VISIBLE) {
+ if (child->visible) {
if (SP_CANVAS_ITEM_GET_CLASS(child)->viewbox_changed) {
SP_CANVAS_ITEM_GET_CLASS(child)->viewbox_changed(child, new_area);
}
@@ -1078,7 +1073,7 @@ void SPCanvasGroup::viewboxChanged(SPCanvasItem *item, Geom::IntRect const &new_
void SPCanvasGroup::add(SPCanvasItem *item)
{
- gtk_object_ref( GTK_OBJECT(item) );
+ g_object_ref(item);
g_object_ref_sink(item);
if (!items) {
@@ -1100,7 +1095,7 @@ void SPCanvasGroup::remove(SPCanvasItem *item)
// Unparent the child
item->parent = NULL;
- gtk_object_unref(GTK_OBJECT(item));
+ g_object_unref(item);
// Remove it from the list
if (children == last) {
@@ -1181,7 +1176,7 @@ void SPCanvasImpl::init(SPCanvas *canvas)
canvas->root = SP_CANVAS_ITEM(g_object_new(SPCanvasGroup::getType(), NULL));
canvas->root->canvas = canvas;
- gtk_object_ref (GTK_OBJECT (canvas->root));
+ g_object_ref (canvas->root);
g_object_ref_sink (canvas->root);
canvas->need_repick = TRUE;
@@ -1242,7 +1237,7 @@ void SPCanvasImpl::destroy(GtkObject *object)
SPCanvas *canvas = SP_CANVAS(object);
if (canvas->root) {
- gtk_object_unref (GTK_OBJECT (canvas->root));
+ g_object_unref (canvas->root);
canvas->root = NULL;
}
@@ -1484,10 +1479,10 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event)
gint finished = FALSE;
while (item && !finished) {
- gtk_object_ref (GTK_OBJECT (item));
+ g_object_ref (item);
g_signal_emit (G_OBJECT (item), item_signals[ITEM_EVENT], 0, &ev, &finished);
SPCanvasItem *parent = item->parent;
- gtk_object_unref (GTK_OBJECT (item));
+ g_object_unref (item);
item = parent;
}
@@ -1571,7 +1566,7 @@ int SPCanvasImpl::pickCurrentItem(SPCanvas *canvas, GdkEvent *event)
y += canvas->y0;
// find the closest item
- if (canvas->root->flags & SP_CANVAS_ITEM_VISIBLE) {
+ if (canvas->root->visible) {
sp_canvas_item_invoke_point (canvas->root, Geom::Point(x, y), &canvas->new_current_item);
} else {
canvas->new_current_item = NULL;
@@ -1774,7 +1769,7 @@ 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->flags & SP_CANVAS_ITEM_VISIBLE) {
+ if (canvas->root->visible) {
SP_CANVAS_ITEM_GET_CLASS (canvas->root)->render (canvas->root, &buf);
}
diff --git a/src/document.cpp b/src/document.cpp
index b5383c91d..cc139aae0 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -37,17 +37,18 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <gtk/gtk.h>
#include <string>
#include <cstring>
#include <2geom/transforms.h>
+#include "widgets/desktop-widget.h"
#include "desktop.h"
#include "dir-util.h"
#include "display/drawing-item.h"
#include "document-private.h"
#include "document-undo.h"
#include "helper/units.h"
+#include "id-clash.h"
#include "inkscape-private.h"
#include "inkscape-version.h"
#include "libavoid/router.h"
@@ -60,7 +61,6 @@
#include "sp-object-repr.h"
#include "transf_mat_3x4.h"
#include "unit-constants.h"
-#include "widgets/desktop-widget.h"
#include "xml/repr.h"
#include "xml/rebase-hrefs.h"
#include "libcroco/cr-cascade.h"
@@ -1429,10 +1429,31 @@ void SPDocument::setModifiedSinceSave(bool modified) {
this->modified_since_save = modified;
Gtk::Window *parent = SP_ACTIVE_DESKTOP->getToplevel();
g_assert(parent != NULL);
- SPDesktopWidget *dtw = (SPDesktopWidget *) parent->get_data("desktopwidget");
+ SPDesktopWidget *dtw = static_cast<SPDesktopWidget *>(parent->get_data("desktopwidget"));
dtw->updateTitle( this->getName() );
}
+
+/**
+ * Paste SVG defs from the document retrieved from the clipboard into the active document.
+ * @param clipdoc The document to paste.
+ * @pre @c clipdoc != NULL and pasting into the active document is possible.
+ */
+void SPDocument::importDefs(SPDocument *source)
+{
+ Inkscape::XML::Node *root = source->getReprRoot();
+ Inkscape::XML::Node *defs = sp_repr_lookup_name(root, "svg:defs", 1);
+ Inkscape::XML::Node *target_defs = this->getDefs()->getRepr();
+
+ prevent_id_clashes(source, this);
+
+ for (Inkscape::XML::Node *def = defs->firstChild() ; def ; def = def->next()) {
+ Inkscape::XML::Node * dup = def->duplicate(this->getReprDoc());
+ target_defs->appendChild(dup);
+ Inkscape::GC::release(dup);
+ }
+}
+
/*
Local Variables:
mode:c++
diff --git a/src/document.h b/src/document.h
index e41ec4d59..ca709a8b6 100644
--- a/src/document.h
+++ b/src/document.h
@@ -247,6 +247,8 @@ public:
unsigned int vacuumDocument();
+ void importDefs(SPDocument *source);
+
private:
void do_change_uri(gchar const *const filename, bool const rebase);
void setupViewport(SPItemCtx *ctx);
diff --git a/src/dom/svgtypes.h b/src/dom/svgtypes.h
index 0c30069b8..41b4de307 100644
--- a/src/dom/svgtypes.h
+++ b/src/dom/svgtypes.h
@@ -74,11 +74,6 @@ namespace svg {
//local definitions
typedef dom::DOMString DOMString;
-typedef dom::DOMException DOMException;
-typedef dom::Element Element;
-typedef dom::Document Document;
-typedef dom::NodeList NodeList;
-
class SVGElement;
typedef Ptr<SVGElement> SVGElementPtr;
diff --git a/src/doxygen-main.cpp b/src/doxygen-main.cpp
index ea4d056ce..70c62b3a9 100644
--- a/src/doxygen-main.cpp
+++ b/src/doxygen-main.cpp
@@ -305,7 +305,7 @@ namespace XML {}
* [\ref help.cpp] [\ref inkscape.cpp] [\ref inkscape-stock.cpp]
* [\ref interface.cpp, \ref memeq.h] [\ref main.cpp, \ref winmain.cpp]
* [\ref menus-skeleton.h, \ref preferences-skeleton.h]
- * [\ref context-menu.cpp] [\ref select-toolbar.cpp] [\ref shortcuts.cpp]
+ * [\ref select-toolbar.cpp] [\ref shortcuts.cpp]
* [\ref sp-cursor.cpp] [\ref text-edit.cpp] [\ref toolbox.cpp, \ref ui/widget/toolbox.cpp]
* Inkscape::Verb [\ref verbs.h]
*
diff --git a/src/draw-context.cpp b/src/draw-context.cpp
index 36d7eb8de..d8ce2729d 100644
--- a/src/draw-context.cpp
+++ b/src/draw-context.cpp
@@ -45,6 +45,76 @@
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
static void sp_draw_context_class_init(SPDrawContextClass *klass);
@@ -240,10 +310,10 @@ sp_draw_context_root_handler(SPEventContext *ec, GdkEvent *event)
switch (event->type) {
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY) {
ret = TRUE;
diff --git a/src/dropper-context.cpp b/src/dropper-context.cpp
index 3a93df33a..336314c4f 100644
--- a/src/dropper-context.cpp
+++ b/src/dropper-context.cpp
@@ -44,6 +44,14 @@
#include "message-context.h"
#include "verbs.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Escape 0xff1b
+#endif
+
using Inkscape::DocumentUndo;
static void sp_dropper_context_class_init(SPDropperContextClass *klass);
@@ -328,16 +336,16 @@ static gint sp_dropper_context_root_handler(SPEventContext *event_context, GdkEv
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval(&event->key)) {
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY) {
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
sp_desktop_selection(desktop)->clear();
default:
break;
diff --git a/src/dyna-draw-context.cpp b/src/dyna-draw-context.cpp
index f48db0a99..c737b8d29 100644
--- a/src/dyna-draw-context.cpp
+++ b/src/dyna-draw-context.cpp
@@ -81,6 +81,28 @@ using Inkscape::DocumentUndo;
#define DYNA_MIN_WIDTH 1.0e-6
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#endif
+
static void sp_dyna_draw_context_class_init(SPDynaDrawContextClass *klass);
static void sp_dyna_draw_context_init(SPDynaDrawContext *ddc);
static void sp_dyna_draw_context_dispose(GObject *object);
@@ -878,8 +900,8 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Up:
- case GDK_KP_Up:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
if (!MOD__CTRL_ONLY) {
dc->angle += 5.0;
if (dc->angle > 90.0)
@@ -888,8 +910,8 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Down:
- case GDK_KP_Down:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
if (!MOD__CTRL_ONLY) {
dc->angle -= 5.0;
if (dc->angle < -90.0)
@@ -898,8 +920,8 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Right:
- case GDK_KP_Right:
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
if (!MOD__CTRL_ONLY) {
dc->width += 0.01;
if (dc->width > 1.0)
@@ -908,8 +930,8 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Left:
- case GDK_KP_Left:
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
if (!MOD__CTRL_ONLY) {
dc->width -= 0.01;
if (dc->width < 0.01)
@@ -918,34 +940,34 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Home:
- case GDK_KP_Home:
+ case GDK_KEY_Home:
+ case GDK_KEY_KP_Home:
dc->width = 0.01;
sp_ddc_update_toolbox (desktop, "altx-calligraphy", dc->width * 100);
ret = TRUE;
break;
- case GDK_End:
- case GDK_KP_End:
+ case GDK_KEY_End:
+ case GDK_KEY_KP_End:
dc->width = 1.0;
sp_ddc_update_toolbox (desktop, "altx-calligraphy", dc->width * 100);
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-calligraphy");
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (dc->is_drawing) {
// if drawing, cancel, otherwise pass it up for deselecting
calligraphic_cancel (dc);
ret = TRUE;
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (MOD__CTRL_ONLY && dc->is_drawing) {
// if drawing, cancel, otherwise pass it up for undo
calligraphic_cancel (dc);
@@ -959,8 +981,8 @@ sp_dyna_draw_context_root_handler(SPEventContext *event_context,
case GDK_KEY_RELEASE:
switch (get_group0_keyval(&event->key)) {
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
dc->_message_context->clear();
dc->hatch_spacing = 0;
dc->hatch_spacing_step = 0;
diff --git a/src/ege-adjustment-action.cpp b/src/ege-adjustment-action.cpp
index 49f899372..181d63d8f 100644
--- a/src/ege-adjustment-action.cpp
+++ b/src/ege-adjustment-action.cpp
@@ -48,6 +48,76 @@
#include "icon-size.h"
#include "ege-adjustment-action.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
static void ege_adjustment_action_class_init( EgeAdjustmentActionClass* klass );
static void ege_adjustment_action_init( EgeAdjustmentAction* action );
@@ -815,7 +885,12 @@ static GtkWidget* create_tool_item( GtkAction* action )
if ( IS_EGE_ADJUSTMENT_ACTION(action) ) {
EgeAdjustmentAction* act = EGE_ADJUSTMENT_ACTION( action );
GtkWidget* spinbutton = 0;
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget* hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget* hb = gtk_hbox_new( FALSE, 5 );
+#endif
GValue value;
memset( &value, 0, sizeof(value) );
g_value_init( &value, G_TYPE_STRING );
@@ -824,7 +899,11 @@ static GtkWidget* create_tool_item( GtkAction* action )
if ( act->private_data->appearanceMode == APPEARANCE_FULL ) {
/* Slider */
gchar *leakyForNow = g_value_dup_string( &value );
+#if GTK_CHECK_VERSION(3,0,0)
+ spinbutton = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, act->private_data->adj);
+#else
spinbutton = gtk_hscale_new( act->private_data->adj);
+#endif
gtk_widget_set_size_request(spinbutton, 100, -1);
gtk_scale_set_digits( GTK_SCALE(spinbutton), 0 );
g_signal_connect( G_OBJECT(spinbutton), "format-value", G_CALLBACK(slider_format_falue), leakyForNow );
@@ -1016,7 +1095,7 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
0, &key, 0, 0, 0 );
switch ( key ) {
- case GDK_Escape:
+ case GDK_KEY_Escape:
{
action->private_data->transferFocus = TRUE;
gtk_spin_button_set_value( GTK_SPIN_BUTTON(widget), action->private_data->lastVal );
@@ -1025,8 +1104,8 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
}
break;
- case GDK_Return:
- case GDK_KP_Enter:
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
{
action->private_data->transferFocus = TRUE;
ege_adjustment_action_defocus( action );
@@ -1034,22 +1113,22 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
}
break;
- case GDK_Tab:
+ case GDK_KEY_Tab:
{
action->private_data->transferFocus = FALSE;
wasConsumed = process_tab( widget, 1 );
}
break;
- case GDK_ISO_Left_Tab:
+ case GDK_KEY_ISO_Left_Tab:
{
action->private_data->transferFocus = FALSE;
wasConsumed = process_tab( widget, -1 );
}
break;
- case GDK_Up:
- case GDK_KP_Up:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
{
action->private_data->transferFocus = FALSE;
gdouble val = gtk_spin_button_get_value( GTK_SPIN_BUTTON(widget) );
@@ -1058,8 +1137,8 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
}
break;
- case GDK_Down:
- case GDK_KP_Down:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
{
action->private_data->transferFocus = FALSE;
gdouble val = gtk_spin_button_get_value( GTK_SPIN_BUTTON(widget) );
@@ -1068,8 +1147,8 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
}
break;
- case GDK_Page_Up:
- case GDK_KP_Page_Up:
+ case GDK_KEY_Page_Up:
+ case GDK_KEY_KP_Page_Up:
{
action->private_data->transferFocus = FALSE;
gdouble val = gtk_spin_button_get_value( GTK_SPIN_BUTTON(widget) );
@@ -1078,8 +1157,8 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
}
break;
- case GDK_Page_Down:
- case GDK_KP_Page_Down:
+ case GDK_KEY_Page_Down:
+ case GDK_KEY_KP_Page_Down:
{
action->private_data->transferFocus = FALSE;
gdouble val = gtk_spin_button_get_value( GTK_SPIN_BUTTON(widget) );
@@ -1088,8 +1167,8 @@ gboolean keypress_cb( GtkWidget *widget, GdkEventKey *event, gpointer data )
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
{
action->private_data->transferFocus = FALSE;
gtk_spin_button_set_value( GTK_SPIN_BUTTON(widget), action->private_data->lastVal );
diff --git a/src/enums.h b/src/enums.h
index 8b9dcc71f..2a30fc4a8 100644
--- a/src/enums.h
+++ b/src/enums.h
@@ -12,6 +12,28 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+/* Anchor types (imported from Gtk) */
+typedef enum
+{
+ SP_ANCHOR_CENTER,
+ SP_ANCHOR_NORTH,
+ SP_ANCHOR_NORTH_WEST,
+ SP_ANCHOR_NORTH_EAST,
+ SP_ANCHOR_SOUTH,
+ SP_ANCHOR_SOUTH_WEST,
+ SP_ANCHOR_SOUTH_EAST,
+ SP_ANCHOR_WEST,
+ SP_ANCHOR_EAST,
+ SP_ANCHOR_N = SP_ANCHOR_NORTH,
+ SP_ANCHOR_NW = SP_ANCHOR_NORTH_WEST,
+ SP_ANCHOR_NE = SP_ANCHOR_NORTH_EAST,
+ SP_ANCHOR_S = SP_ANCHOR_SOUTH,
+ SP_ANCHOR_SW = SP_ANCHOR_SOUTH_WEST,
+ SP_ANCHOR_SE = SP_ANCHOR_SOUTH_EAST,
+ SP_ANCHOR_W = SP_ANCHOR_WEST,
+ SP_ANCHOR_E = SP_ANCHOR_EAST
+} SPAnchorType;
+
/* preserveAspectRatio */
enum {
diff --git a/src/eraser-context.cpp b/src/eraser-context.cpp
index 628ad0164..3b309899b 100644
--- a/src/eraser-context.cpp
+++ b/src/eraser-context.cpp
@@ -83,6 +83,28 @@ using Inkscape::DocumentUndo;
#define DRAG_DEFAULT 1.0
#define DRAG_MAX 1.0
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#endif
+
static void sp_eraser_context_class_init(SPEraserContextClass *klass);
static void sp_eraser_context_init(SPEraserContext *erc);
@@ -594,8 +616,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Up:
- case GDK_KP_Up:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
if (!MOD__CTRL_ONLY) {
dc->angle += 5.0;
if (dc->angle > 90.0)
@@ -604,8 +626,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Down:
- case GDK_KP_Down:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
if (!MOD__CTRL_ONLY) {
dc->angle -= 5.0;
if (dc->angle < -90.0)
@@ -614,8 +636,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Right:
- case GDK_KP_Right:
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
if (!MOD__CTRL_ONLY) {
dc->width += 0.01;
if (dc->width > 1.0)
@@ -624,8 +646,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Left:
- case GDK_KP_Left:
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
if (!MOD__CTRL_ONLY) {
dc->width -= 0.01;
if (dc->width < 0.01)
@@ -634,26 +656,26 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Home:
- case GDK_KP_Home:
+ case GDK_KEY_Home:
+ case GDK_KEY_KP_Home:
dc->width = 0.01;
sp_erc_update_toolbox (desktop, "altx-eraser", dc->width * 100);
ret = TRUE;
break;
- case GDK_End:
- case GDK_KP_End:
+ case GDK_KEY_End:
+ case GDK_KEY_KP_End:
dc->width = 1.0;
sp_erc_update_toolbox (desktop, "altx-eraser", dc->width * 100);
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-eraser");
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
Inkscape::Rubberband::get(desktop)->stop();
if (dc->is_drawing) {
// if drawing, cancel, otherwise pass it up for deselecting
@@ -661,8 +683,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (MOD__CTRL_ONLY && dc->is_drawing) {
// if drawing, cancel, otherwise pass it up for undo
eraser_cancel (dc);
@@ -676,8 +698,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context,
case GDK_KEY_RELEASE:
switch (get_group0_keyval(&event->key)) {
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
dc->_message_context->clear();
break;
default:
diff --git a/src/event-context.cpp b/src/event-context.cpp
index 0cfa18f57..db7b29640 100644
--- a/src/event-context.cpp
+++ b/src/event-context.cpp
@@ -6,8 +6,9 @@
* Frank Felfe <innerspace@iname.com>
* bulia byak <buliabyak@users.sf.net>
* Jon A. Cruz <jon@joncruz.org>
+ * Kris De Gussem <Kris.DeGussem@gmail.com>
*
- * Copyright (C) 1999-2010 authors
+ * Copyright (C) 1999-2012 authors
* Copyright (C) 2001-2002 Ximian, Inc.
*
* Released under GNU GPL, read the file 'COPYING' for more information
@@ -63,6 +64,93 @@
#include "sp-guide.h"
#include "color.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
static void sp_event_context_class_init(SPEventContextClass *klass);
static void sp_event_context_init(SPEventContext *event_context);
static void sp_event_context_dispose(GObject *object);
@@ -157,7 +245,11 @@ static void sp_event_context_dispose(GObject *object) {
}
if (ec->cursor != NULL) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(ec->cursor);
+#else
gdk_cursor_unref(ec->cursor);
+#endif
ec->cursor = NULL;
}
@@ -203,7 +295,11 @@ void sp_event_context_update_cursor(SPEventContext *ec) {
);
if (pixbuf != NULL) {
if (ec->cursor)
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(ec->cursor);
+#else
gdk_cursor_unref(ec->cursor);
+#endif
ec->cursor = gdk_cursor_new_from_pixbuf(display, pixbuf, ec->hot_x, ec->hot_y);
g_object_unref(pixbuf);
}
@@ -213,7 +309,11 @@ void sp_event_context_update_cursor(SPEventContext *ec) {
sp_cursor_bitmap_and_mask_from_xpm(&bitmap, &mask, ec->cursor_shape);
if ((bitmap != NULL) && (mask != NULL)) {
if (ec->cursor)
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(ec->cursor);
+#else
gdk_cursor_unref(ec->cursor);
+#endif
ec->cursor = gdk_cursor_new_from_pixmap(bitmap, mask,
&style->black, &style->white, ec->hot_x,
ec->hot_y);
@@ -545,9 +645,9 @@ static gint sp_event_context_private_root_handler(
// in the editing window). So we resteal them back and run our regular shortcut
// invoker on them.
unsigned int shortcut;
- case GDK_Tab:
- case GDK_ISO_Left_Tab:
- case GDK_F1:
+ case GDK_KEY_Tab:
+ case GDK_KEY_ISO_Left_Tab:
+ case GDK_KEY_F1:
shortcut = get_group0_keyval(&event->key);
if (event->key.state & GDK_SHIFT_MASK)
shortcut |= SP_SHORTCUT_SHIFT_MASK;
@@ -558,15 +658,15 @@ static gint sp_event_context_private_root_handler(
ret = sp_shortcut_invoke(shortcut, desktop);
break;
- case GDK_D:
- case GDK_d:
+ case GDK_KEY_D:
+ case GDK_KEY_d:
if (!MOD__SHIFT && !MOD__CTRL && !MOD__ALT) {
sp_toggle_dropper(desktop);
ret = TRUE;
}
break;
- case GDK_Q:
- case GDK_q:
+ case GDK_KEY_Q:
+ case GDK_KEY_q:
if (desktop->quick_zoomed()) {
ret = TRUE;
}
@@ -575,18 +675,18 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_W:
- case GDK_w:
- case GDK_F4:
+ case GDK_KEY_W:
+ case GDK_KEY_w:
+ case GDK_KEY_F4:
/* Close view */
if (MOD__CTRL_ONLY) {
sp_ui_close_view(NULL);
ret = TRUE;
}
break;
- case GDK_Left: // Ctrl Left
- case GDK_KP_Left:
- case GDK_KP_4:
+ case GDK_KEY_Left: // Ctrl Left
+ case GDK_KEY_KP_Left:
+ case GDK_KEY_KP_4:
if (MOD__CTRL_ONLY) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, sp_desktop_canvas(desktop)));
@@ -595,9 +695,9 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_Up: // Ctrl Up
- case GDK_KP_Up:
- case GDK_KP_8:
+ case GDK_KEY_Up: // Ctrl Up
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_8:
if (MOD__CTRL_ONLY) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, sp_desktop_canvas(desktop)));
@@ -606,9 +706,9 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_Right: // Ctrl Right
- case GDK_KP_Right:
- case GDK_KP_6:
+ case GDK_KEY_Right: // Ctrl Right
+ case GDK_KEY_KP_Right:
+ case GDK_KEY_KP_6:
if (MOD__CTRL_ONLY) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, sp_desktop_canvas(desktop)));
@@ -617,9 +717,9 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_Down: // Ctrl Down
- case GDK_KP_Down:
- case GDK_KP_2:
+ case GDK_KEY_Down: // Ctrl Down
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_KP_2:
if (MOD__CTRL_ONLY) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, sp_desktop_canvas(desktop)));
@@ -628,13 +728,13 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_F10:
+ case GDK_KEY_F10:
if (MOD__SHIFT_ONLY) {
sp_event_root_menu_popup(desktop, NULL, event);
ret = TRUE;
}
break;
- case GDK_space:
+ case GDK_KEY_space:
if (prefs->getBool("/options/spacepans/value")) {
event_context->space_panning = true;
event_context->_message_context->set(Inkscape::INFORMATION_MESSAGE,
@@ -645,8 +745,8 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (MOD__ALT_ONLY) {
desktop->zoom_grab_focus();
ret = TRUE;
@@ -659,7 +759,7 @@ static gint sp_event_context_private_root_handler(
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval(&event->key)) {
- case GDK_space:
+ case GDK_KEY_space:
if (event_context->space_panning) {
event_context->space_panning = false;
event_context->_message_context->clear();
@@ -672,8 +772,8 @@ static gint sp_event_context_private_root_handler(
ret = TRUE;
}
break;
- case GDK_Q:
- case GDK_q:
+ case GDK_KEY_Q:
+ case GDK_KEY_q:
if (desktop->quick_zoomed()) {
desktop->zoom_quick(false);
ret = TRUE;
@@ -1034,22 +1134,19 @@ static void set_event_location(SPDesktop *desktop, GdkEvent *event) {
* Create popup menu and tell Gtk to show it.
*/
void sp_event_root_menu_popup(SPDesktop *desktop, SPItem *item, GdkEvent *event) {
- GtkWidget *menu;
-
/* fixme: This is not what I want but works for now (Lauris) */
if (event->type == GDK_KEY_PRESS) {
item = sp_desktop_selection(desktop)->singleItem();
}
- menu = sp_ui_context_menu(desktop, item);
- gtk_widget_show(menu);
+ ContextMenu* CM = new ContextMenu(desktop, item);
+ CM->show();
switch (event->type) {
case GDK_BUTTON_PRESS:
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, 0, NULL,
- event->button.button, event->button.time);
+ CM->popup(event->button.button, event->button.time);
break;
case GDK_KEY_PRESS:
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, 0, NULL, 0, event->key.time);
+ CM->popup(0, event->key.time);
break;
default:
break;
@@ -1064,12 +1161,12 @@ void sp_event_show_modifier_tip(Inkscape::MessageContext *message_context,
gchar const *alt_tip) {
guint keyval = get_group0_keyval(&event->key);
- bool ctrl = ctrl_tip && (MOD__CTRL || (keyval == GDK_Control_L) || (keyval
- == GDK_Control_R));
- bool shift = shift_tip && (MOD__SHIFT || (keyval == GDK_Shift_L) || (keyval
- == GDK_Shift_R));
- bool alt = alt_tip && (MOD__ALT || (keyval == GDK_Alt_L) || (keyval
- == GDK_Alt_R) || (keyval == GDK_Meta_L) || (keyval == GDK_Meta_R));
+ bool ctrl = ctrl_tip && (MOD__CTRL || (keyval == GDK_KEY_Control_L) || (keyval
+ == GDK_KEY_Control_R));
+ bool shift = shift_tip && (MOD__SHIFT || (keyval == GDK_KEY_Shift_L) || (keyval
+ == GDK_KEY_Shift_R));
+ bool alt = alt_tip && (MOD__ALT || (keyval == GDK_KEY_Alt_L) || (keyval
+ == GDK_KEY_Alt_R) || (keyval == GDK_KEY_Meta_L) || (keyval == GDK_KEY_Meta_R));
gchar *tip = g_strdup_printf("%s%s%s%s%s", (ctrl ? ctrl_tip : ""), (ctrl
&& (shift || alt) ? "; " : ""), (shift ? shift_tip : ""), ((ctrl
diff --git a/src/extension/dbus/document-interface.cpp b/src/extension/dbus/document-interface.cpp
index dc1c8402d..c67234b34 100644
--- a/src/extension/dbus/document-interface.cpp
+++ b/src/extension/dbus/document-interface.cpp
@@ -15,6 +15,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include "file.h" //IO
#include "document-interface.h"
#include <string.h>
#include <dbus/dbus-glib.h>
@@ -39,8 +40,6 @@
#include "sp-root.h"
#include "style.h" //style_write
-#include "file.h" //IO
-
#include "extension/system.h" //IO
#include "extension/output.h" //IO
diff --git a/src/extension/dxf2svg/test_dxf.cpp b/src/extension/dxf2svg/test_dxf.cpp
index 62969ca6e..c3bbdc141 100644
--- a/src/extension/dxf2svg/test_dxf.cpp
+++ b/src/extension/dxf2svg/test_dxf.cpp
@@ -80,7 +80,7 @@ int main(){
ents.display_all();
//char units[5] = "in";
- char units[5] = "";
+ // char units[5] = "";
cout << "\nNow for the begining of the SVG...\n\n";
@@ -90,7 +90,7 @@ int main(){
//cout << "pline2pline\n" << pline2pline(ents.ret_plines()[0], units ) << endl;
//cout << "pline2path\n" << pline2path(ents.ret_plines()[0], units );
- char tmp_char[10000];
+ // char tmp_char[10000];
cout << "\nCircle conversion\n";
//cout << "circle2circle\n" << circle2circle(ents.ret_circles()[0], 3, units, tmp_char) << endl;
diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp
index 61e943dba..09d69becb 100644
--- a/src/extension/internal/cairo-renderer.cpp
+++ b/src/extension/internal/cairo-renderer.cpp
@@ -507,7 +507,7 @@ static void sp_asbitmap_render(SPItem *item, CairoRenderContext *ctx)
// TODO this is stupid - we just converted to pixbuf format when generating the bitmap!
convert_pixbuf_normal_to_argb32(pb);
ctx->renderImage(pb, t, item->style);
- gdk_pixbuf_unref(pb);
+ g_object_unref(pb);
pb = 0;
}
g_slist_free (items);
diff --git a/src/extension/internal/javafx-out.cpp b/src/extension/internal/javafx-out.cpp
index 4cf6f3c4f..67c0fae66 100644
--- a/src/extension/internal/javafx-out.cpp
+++ b/src/extension/internal/javafx-out.cpp
@@ -130,21 +130,6 @@ static JavaFXOutput::String dstr(double d)
/**
- * Format a double as an integer
- */
-static JavaFXOutput::String istr(double d)
-{
- char dbuf[G_ASCII_DTOSTR_BUF_SIZE+1];
- g_ascii_formatd(dbuf, G_ASCII_DTOSTR_BUF_SIZE,
- "%.0f", (gdouble)d);
- JavaFXOutput::String s = dbuf;
- return s;
-}
-
-#define ISTR(d) (istr(d).c_str())
-
-
-/**
* Format an rgba() string
*/
static JavaFXOutput::String rgba(guint32 rgba)
diff --git a/src/extension/internal/pdf-input-cairo.cpp b/src/extension/internal/pdf-input-cairo.cpp
index bc76a30b5..36ef66713 100644
--- a/src/extension/internal/pdf-input-cairo.cpp
+++ b/src/extension/internal/pdf-input-cairo.cpp
@@ -32,6 +32,7 @@
#include <poppler/glib/poppler-page.h>
#include "ui/widget/spinbutton.h"
+#include <gdkmm/general.h>
namespace Inkscape {
namespace Extension {
@@ -482,9 +483,10 @@ bool PdfImportCairoDialog::_onExposePreview(GdkEventExpose */*event*/) {
if (!back_pixmap) {
return true;
}
- back_pixmap->draw_pixbuf(Glib::RefPtr<Gdk::GC>(), thumb, 0, 0, 0, 0,
- _thumb_width, _thumb_height,
- Gdk::RGB_DITHER_NONE, 0, 0);
+
+ Cairo::RefPtr<Cairo::Context> cr = back_pixmap->create_cairo_context();
+ Gdk::Cairo::set_source_pixbuf(cr, thumb, 0, 0);
+ cr->paint();
_previewArea->get_window()->set_back_pixmap(back_pixmap, false);
_previewArea->get_window()->clear();
}
@@ -493,9 +495,9 @@ bool PdfImportCairoDialog::_onExposePreview(GdkEventExpose */*event*/) {
if (_render_thumb) {
copy_cairo_surface_to_pixbuf(_cairo_surface, _thumb_data, thumb->gobj());
}
- _previewArea->get_window()->draw_pixbuf(Glib::RefPtr<Gdk::GC>(), thumb,
- 0, 0, 0, _render_thumb ? 0 : 20,
- -1, -1, Gdk::RGB_DITHER_NONE, 0, 0);
+ Cairo::RefPtr<Cairo::Context> cr = _previewArea->get_window()->create_cairo_context();
+ Gdk::Cairo::set_source_pixbuf(cr, thumb, 0, _render_thumb ? 0 : 20);
+ cr->paint();
return true;
}
diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp
index ee091d54b..eff488c9d 100644
--- a/src/extension/internal/pdfinput/pdf-input.cpp
+++ b/src/extension/internal/pdfinput/pdf-input.cpp
@@ -51,6 +51,8 @@
#include "ui/widget/spinbutton.h"
#include <glibmm/i18n.h>
+#include <gdkmm/general.h>
+
namespace Inkscape {
namespace Extension {
namespace Internal {
@@ -513,10 +515,11 @@ bool PdfImportDialog::_onExposePreview(GdkEventExpose */*event*/) {
if (!back_pixmap) {
return true;
}
- back_pixmap->draw_pixbuf(Glib::RefPtr<Gdk::GC>(), thumb, 0, 0, 0, 0,
- _thumb_width, _thumb_height,
- Gdk::RGB_DITHER_NONE, 0, 0);
- _previewArea->get_window()->set_back_pixmap(back_pixmap, false);
+
+ Cairo::RefPtr<Cairo::Context> cr = back_pixmap->create_cairo_context();
+ Gdk::Cairo::set_source_pixbuf(cr, thumb, 0, 0);
+ cr->paint();
+ _previewArea->get_window()->set_back_pixmap(back_pixmap, false);
_previewArea->get_window()->clear();
}
#ifdef HAVE_POPPLER_CAIRO
@@ -525,10 +528,10 @@ bool PdfImportDialog::_onExposePreview(GdkEventExpose */*event*/) {
copy_cairo_surface_to_pixbuf(_cairo_surface, _thumb_data, thumb->gobj());
}
#endif
- _previewArea->get_window()->draw_pixbuf(Glib::RefPtr<Gdk::GC>(), thumb,
- 0, 0, 0, _render_thumb ? 0 : 20,
- -1, -1, Gdk::RGB_DITHER_NONE, 0, 0);
+ Cairo::RefPtr<Cairo::Context> cr = _previewArea->get_window()->create_cairo_context();
+ Gdk::Cairo::set_source_pixbuf(cr, thumb, 0, _render_thumb ? 0 : 20);
+ cr->paint();
return true;
}
diff --git a/src/extension/internal/pdfinput/pdf-parser.cpp b/src/extension/internal/pdfinput/pdf-parser.cpp
index 5347a85ac..5e8b005e2 100644
--- a/src/extension/internal/pdfinput/pdf-parser.cpp
+++ b/src/extension/internal/pdfinput/pdf-parser.cpp
@@ -3199,7 +3199,8 @@ void PdfParser::opMarkPoint(Object args[], int numArgs) {
void PdfParser::saveState() {
builder->saveState();
- state = state->save();
+// state = state->save(); // nasty hack to prevent GfxRadialShading from getting corrupted during copy operation
+ state->save(); // see LP Bug 919176 comment 8
clipHistory = clipHistory->save();
}
diff --git a/src/extension/param/bool.cpp b/src/extension/param/bool.cpp
index ef0a06222..f7c4e6c0c 100644
--- a/src/extension/param/bool.cpp
+++ b/src/extension/param/bool.cpp
@@ -129,7 +129,12 @@ Gtk::Widget *ParamBool::get_widget(SPDocument * doc, Inkscape::XML::Node * node,
return NULL;
}
+#if WITH_GTKMM_3_0
+ Gtk::Box * hbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 4));
+ hbox->set_homogeneous(false);
+#else
Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));
+#endif
#if WITH_GTKMM_2_22
Gtk::Label * label = Gtk::manage(new Gtk::Label(_(_text), Gtk::ALIGN_START));
diff --git a/src/extension/script/InkscapeScript.cpp b/src/extension/script/InkscapeScript.cpp
index 9f8ebfbbb..02cd28fa5 100644
--- a/src/extension/script/InkscapeScript.cpp
+++ b/src/extension/script/InkscapeScript.cpp
@@ -67,9 +67,9 @@ InkscapeScript::~InkscapeScript()
* enumerated types in ScriptLanguage above.
*/
bool InkscapeScript::interpretScript(const Glib::ustring &script,
- Glib::ustring &output,
- Glib::ustring &error,
- ScriptLanguage language)
+ Glib::ustring & /*output*/,
+ Glib::ustring & /*error*/,
+ ScriptLanguage language)
{
const char *langname=NULL;
//if() instead of switch() lets us scope vars
@@ -135,9 +135,9 @@ bool InkscapeScript::interpretScript(const Glib::ustring &script,
* enumerated types in ScriptLanguage above.
*/
bool InkscapeScript::interpretFile(const Glib::ustring &fname,
- Glib::ustring &output,
- Glib::ustring &error,
- ScriptLanguage language)
+ Glib::ustring & /*output*/,
+ Glib::ustring & /*error*/,
+ ScriptLanguage language)
{
const char *langname=NULL;
//if() instead of switch() lets us scope vars
diff --git a/src/file.cpp b/src/file.cpp
index dbf8fc7d4..2ce532f03 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -36,6 +36,7 @@
#include "dir-util.h"
#include "document-private.h"
#include "document-undo.h"
+#include "event-context.h"
#include "extension/db.h"
#include "extension/input.h"
#include "extension/output.h"
@@ -642,6 +643,17 @@ file_save(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
return FALSE;
}
+ if (SP_ACTIVE_DESKTOP) {
+ if (! SP_ACTIVE_DESKTOP->event_log) {
+ g_message("file_save: ->event_log == NULL. please report to bug #967416");
+ }
+ if (! SP_ACTIVE_DESKTOP->messageStack()) {
+ g_message("file_save: ->messageStack() == NULL. please report to bug #967416");
+ }
+ } else {
+ g_message("file_save: SP_ACTIVE_DESKTOP == NULL. please report to bug #967416");
+ }
+
SP_ACTIVE_DESKTOP->event_log->rememberFileSave();
SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Document saved."));
return true;
@@ -859,10 +871,11 @@ sp_file_save_dialog(Gtk::Window &parentWindow, SPDocument *doc, Inkscape::Extens
g_warning( "Error converting save filename to UTF-8." );
Inkscape::Extension::Output *omod = dynamic_cast<Inkscape::Extension::Output *>(selectionType);
- Glib::ustring save_extension = (std::string)omod->get_extension();
-
- if ( !hasEnding(fileName, save_extension.c_str()) ) {
- fileName += save_extension.c_str();
+ if (omod) {
+ Glib::ustring save_extension = (std::string)omod->get_extension();
+ if ( !hasEnding(fileName, save_extension.c_str()) ) {
+ fileName += save_extension.c_str();
+ }
}
// FIXME: does the argument !is_copy really convey the correct meaning here?
@@ -974,6 +987,89 @@ sp_file_save_a_copy(Gtk::Window &parentWindow, gpointer /*object*/, gpointer /*d
######################*/
/**
+ * Paste the contents of a document into the active desktop.
+ * @param clipdoc The document to paste
+ * @param in_place Whether to paste the selection where it was when copied
+ * @pre @c clipdoc is not empty and items can be added to the current layer
+ */
+void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place)
+{
+ //TODO: merge with file_import()
+
+ SPDocument *target_document = sp_desktop_document(desktop);
+ Inkscape::XML::Node *root = clipdoc->getReprRoot();
+ Inkscape::XML::Node *target_parent = desktop->currentLayer()->getRepr();
+
+ // copy definitions
+ desktop->doc()->importDefs(clipdoc);
+
+ // copy objects
+ GSList *pasted_objects = NULL;
+ for (Inkscape::XML::Node *obj = root->firstChild() ; obj ; obj = obj->next()) {
+ // Don't copy metadata, defs, named views and internal clipboard contents to the document
+ if (!strcmp(obj->name(), "svg:defs")) {
+ continue;
+ }
+ if (!strcmp(obj->name(), "svg:metadata")) {
+ continue;
+ }
+ if (!strcmp(obj->name(), "sodipodi:namedview")) {
+ continue;
+ }
+ if (!strcmp(obj->name(), "inkscape:clipboard")) {
+ continue;
+ }
+ Inkscape::XML::Node *obj_copy = obj->duplicate(target_document->getReprDoc());
+ target_parent->appendChild(obj_copy);
+ Inkscape::GC::release(obj_copy);
+
+ pasted_objects = g_slist_prepend(pasted_objects, (gpointer) obj_copy);
+ }
+
+ // Change the selection to the freshly pasted objects
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ selection->setReprList(pasted_objects);
+
+ // invers apply parent transform
+ Geom::Affine doc2parent = SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse();
+ sp_selection_apply_affine(selection, desktop->dt2doc() * doc2parent * desktop->doc2dt(), true, false);
+
+ // Update (among other things) all curves in paths, for bounds() to work
+ target_document->ensureUpToDate();
+
+ // move selection either to original position (in_place) or to mouse pointer
+ Geom::OptRect sel_bbox = selection->visualBounds();
+ if (sel_bbox) {
+ // get offset of selection to original position of copied elements
+ Geom::Point pos_original;
+ Inkscape::XML::Node *clipnode = sp_repr_lookup_name(root, "inkscape:clipboard", 1);
+ if (clipnode) {
+ Geom::Point min, max;
+ sp_repr_get_point(clipnode, "min", &min);
+ sp_repr_get_point(clipnode, "max", &max);
+ pos_original = Geom::Point(min[Geom::X], max[Geom::Y]);
+ }
+ Geom::Point offset = pos_original - sel_bbox->corner(3);
+
+ if (!in_place) {
+ SnapManager &m = desktop->namedview->snap_manager;
+ m.setup(desktop);
+ sp_event_context_discard_delayed_snap_event(desktop->event_context);
+
+ // get offset from mouse pointer to bbox center, snap to grid if enabled
+ Geom::Point mouse_offset = desktop->point() - sel_bbox->midpoint();
+ offset = m.multipleOfGridPitch(mouse_offset - offset, sel_bbox->midpoint() + offset) + offset;
+ m.unSetup();
+ }
+
+ sp_selection_move_relative(selection, offset);
+ }
+
+ g_slist_free(pasted_objects);
+}
+
+
+/**
* Import a resource. Called by sp_file_import()
*/
SPObject *
diff --git a/src/file.h b/src/file.h
index cd6de2eb1..4d28e57d8 100644
--- a/src/file.h
+++ b/src/file.h
@@ -117,6 +117,8 @@ bool sp_file_save_dialog (Gtk::Window &parentWindow, SPDocument *doc, Inkscape::
## I M P O R T
######################*/
+void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place);
+
/**
* Displays a file selector dialog, to allow the
* user to import data into the current document.
diff --git a/src/flood-context.cpp b/src/flood-context.cpp
index c9f4a0097..7d798a93e 100644
--- a/src/flood-context.cpp
+++ b/src/flood-context.cpp
@@ -70,6 +70,93 @@
#include "pixmaps/cursor-paintbucket.xpm"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
using Inkscape::Display::ExtractARGB32;
@@ -1239,10 +1326,10 @@ static gint sp_flood_context_root_handler(SPEventContext *event_context, GdkEven
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
diff --git a/src/gradient-chemistry.cpp b/src/gradient-chemistry.cpp
index b56352c19..a0da1e430 100644
--- a/src/gradient-chemistry.cpp
+++ b/src/gradient-chemistry.cpp
@@ -513,13 +513,16 @@ SPStop *sp_last_stop(SPGradient *gradient)
SPStop *sp_get_stop_i(SPGradient *gradient, guint stop_i)
{
SPStop *stop = gradient->getFirstStop();
+ if (!stop) {
+ return NULL;
+ }
// if this is valid but weird gradient without an offset-zero stop element,
// inkscape has created a handle for the start of gradient anyway,
// so when it asks for stop N that corresponds to stop element N-1
if (stop->offset != 0)
{
- stop_i --;
+ stop_i--;
}
for (guint i = 0; i < stop_i; i++) {
@@ -534,10 +537,10 @@ SPStop *sp_get_stop_i(SPGradient *gradient, guint stop_i)
guint32 average_color(guint32 c1, guint32 c2, gdouble p)
{
- guint32 r = (guint32) (SP_RGBA32_R_U (c1) * (1 - p) + SP_RGBA32_R_U (c2) * p);
- guint32 g = (guint32) (SP_RGBA32_G_U (c1) * (1 - p) + SP_RGBA32_G_U (c2) * p);
- guint32 b = (guint32) (SP_RGBA32_B_U (c1) * (1 - p) + SP_RGBA32_B_U (c2) * p);
- guint32 a = (guint32) (SP_RGBA32_A_U (c1) * (1 - p) + SP_RGBA32_A_U (c2) * p);
+ guint32 r = static_cast<guint32>(SP_RGBA32_R_U (c1) * (1 - p) + SP_RGBA32_R_U (c2) * p);
+ guint32 g = static_cast<guint32>(SP_RGBA32_G_U (c1) * (1 - p) + SP_RGBA32_G_U (c2) * p);
+ guint32 b = static_cast<guint32>(SP_RGBA32_B_U (c1) * (1 - p) + SP_RGBA32_B_U (c2) * p);
+ guint32 a = static_cast<guint32>(SP_RGBA32_A_U (c1) * (1 - p) + SP_RGBA32_A_U (c2) * p);
return SP_RGBA32_U_COMPOSE(r, g, b, a);
}
diff --git a/src/gradient-context.cpp b/src/gradient-context.cpp
index e10e42610..54f4bdfc1 100644
--- a/src/gradient-context.cpp
+++ b/src/gradient-context.cpp
@@ -48,6 +48,55 @@
#include "document-undo.h"
#include "verbs.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#endif
+
using Inkscape::DocumentUndo;
static void sp_gradient_context_class_init(SPGradientContextClass *klass);
@@ -713,45 +762,45 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
+ case GDK_KEY_Meta_R:
sp_event_show_modifier_tip (event_context->defaultMessageContext(), event,
_("<b>Ctrl</b>: snap gradient angle"),
_("<b>Shift</b>: draw gradient around the starting point"),
NULL);
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-grad");
ret = TRUE;
}
break;
- case GDK_A:
- case GDK_a:
+ case GDK_KEY_A:
+ case GDK_KEY_a:
if (MOD__CTRL_ONLY && drag->isNonEmpty()) {
drag->selectAll();
ret = TRUE;
}
break;
- case GDK_L:
- case GDK_l:
+ case GDK_KEY_L:
+ case GDK_KEY_l:
if (MOD__CTRL_ONLY && drag->isNonEmpty() && drag->hasSelection()) {
sp_gradient_simplify(rc, 1e-4);
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (drag->selected) {
drag->deselectAll();
} else {
@@ -761,9 +810,9 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
//TODO: make dragging escapable by Esc
break;
- case GDK_Left: // move handle left
- case GDK_KP_Left:
- case GDK_KP_4:
+ case GDK_KEY_Left: // move handle left
+ case GDK_KEY_KP_Left:
+ case GDK_KEY_KP_4:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -778,9 +827,9 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Up: // move handle up
- case GDK_KP_Up:
- case GDK_KP_8:
+ case GDK_KEY_Up: // move handle up
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_8:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -795,9 +844,9 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Right: // move handle right
- case GDK_KP_Right:
- case GDK_KP_6:
+ case GDK_KEY_Right: // move handle right
+ case GDK_KEY_KP_Right:
+ case GDK_KEY_KP_6:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -812,9 +861,9 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Down: // move handle down
- case GDK_KP_Down:
- case GDK_KP_2:
+ case GDK_KEY_Down: // move handle down
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_KP_2:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -829,8 +878,8 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_r:
- case GDK_R:
+ case GDK_KEY_r:
+ case GDK_KEY_R:
if (MOD__SHIFT_ONLY) {
// First try selected dragger
if (drag && drag->selected) {
@@ -848,16 +897,16 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
break;
- case GDK_Insert:
- case GDK_KP_Insert:
+ case GDK_KEY_Insert:
+ case GDK_KEY_KP_Insert:
// with any modifiers:
sp_gradient_context_add_stops_between_selected_stops (rc);
ret = TRUE;
break;
- case GDK_Delete:
- case GDK_KP_Delete:
- case GDK_BackSpace:
+ case GDK_KEY_Delete:
+ case GDK_KEY_KP_Delete:
+ case GDK_KEY_BackSpace:
if ( drag->selected ) {
drag->deleteSelected(MOD__CTRL_ONLY);
ret = TRUE;
@@ -869,14 +918,14 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval (&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt
+ case GDK_KEY_Meta_R:
event_context->defaultMessageContext()->clear();
break;
default:
diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp
index 12ecd467c..ad66b258a 100644
--- a/src/gradient-drag.cpp
+++ b/src/gradient-drag.cpp
@@ -1012,7 +1012,7 @@ static void gr_knot_clicked_handler(SPKnot */*knot*/, guint state, gpointer data
}
/**
- * Called when a dragger knot is doubleclicked; opens gradient editor with the stop from the first draggable.
+ * Called when a dragger knot is doubleclicked;
*/
static void gr_knot_doubleclicked_handler(SPKnot */*knot*/, guint /*state*/, gpointer data)
{
@@ -1023,8 +1023,11 @@ static void gr_knot_doubleclicked_handler(SPKnot */*knot*/, guint /*state*/, gpo
if (dragger->draggables == NULL)
return;
- GrDraggable *draggable = (GrDraggable *) dragger->draggables->data;
- sp_item_gradient_edit_stop (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke);
+ /*
+ * 2012/4 - Do nothing (gradient editor to be disabled)
+ */
+ //GrDraggable *draggable = (GrDraggable *) dragger->draggables->data;
+ //sp_item_gradient_edit_stop (draggable->item, draggable->point_type, draggable->point_i, draggable->fill_or_stroke);
}
/**
diff --git a/src/helper/geom.cpp b/src/helper/geom.cpp
index 33947c14d..585d2b8a5 100644
--- a/src/helper/geom.cpp
+++ b/src/helper/geom.cpp
@@ -75,11 +75,11 @@ cubic_bbox (Geom::Coord x000, Geom::Coord y000, Geom::Coord x001, Geom::Coord y0
if (fabs (a) < Geom::EPSILON) {
/* s = -c / b */
if (fabs (b) > Geom::EPSILON) {
- double s, t, xttt;
+ double s;
s = -c / b;
if ((s > 0.0) && (s < 1.0)) {
- t = 1.0 - s;
- xttt = s * s * s * x000 + 3 * s * s * t * x001 + 3 * s * t * t * x011 + t * t * t * x111;
+ double t = 1.0 - s;
+ double xttt = s * s * s * x000 + 3 * s * s * t * x001 + 3 * s * t * t * x011 + t * t * t * x111;
bbox[0].expandTo(xttt);
}
}
@@ -114,11 +114,11 @@ cubic_bbox (Geom::Coord x000, Geom::Coord y000, Geom::Coord x001, Geom::Coord y0
if (fabs (a) < Geom::EPSILON) {
/* s = -c / b */
if (fabs (b) > Geom::EPSILON) {
- double s, t, yttt;
+ double s;
s = -c / b;
if ((s > 0.0) && (s < 1.0)) {
- t = 1.0 - s;
- yttt = s * s * s * y000 + 3 * s * s * t * y001 + 3 * s * t * t * y011 + t * t * t * y111;
+ double t = 1.0 - s;
+ double yttt = s * s * s * y000 + 3 * s * s * t * y001 + 3 * s * t * t * y011 + t * t * t * y111;
bbox[1].expandTo(yttt);
}
}
diff --git a/src/helper/pixbuf-ops.cpp b/src/helper/pixbuf-ops.cpp
index f980953dc..cae297e89 100644
--- a/src/helper/pixbuf-ops.cpp
+++ b/src/helper/pixbuf-ops.cpp
@@ -77,7 +77,7 @@ bool sp_export_jpg_file(SPDocument *doc, gchar const *filename,
g_snprintf(c, 32, "%f", quality);
gboolean saved = gdk_pixbuf_save (pixbuf, filename, "jpeg", NULL, "quality", c, NULL);
g_free(c);
- gdk_pixbuf_unref (pixbuf);
+ g_object_unref (pixbuf);
return saved;
}
diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp
index febdb645e..35fd5a62a 100644
--- a/src/helper/png-write.cpp
+++ b/src/helper/png-write.cpp
@@ -16,11 +16,11 @@
# include "config.h"
#endif
+#include <png.h>
#include "interface.h"
#include <2geom/rect.h>
#include <2geom/transforms.h>
#include <glib.h>
-#include <png.h>
#include "png-write.h"
#include "io/sys.h"
#include "display/drawing.h"
diff --git a/src/helper/unit-menu.cpp b/src/helper/unit-menu.cpp
index ce64cabf4..964ca9d67 100644
--- a/src/helper/unit-menu.cpp
+++ b/src/helper/unit-menu.cpp
@@ -132,7 +132,7 @@ sp_unit_selector_finalize(GObject *object)
}
while (selector->adjustments) {
- gtk_object_unref(GTK_OBJECT(selector->adjustments->data));
+ g_object_unref(selector->adjustments->data);
selector->adjustments = g_slist_remove(selector->adjustments, selector->adjustments->data);
}
@@ -326,7 +326,7 @@ sp_unit_selector_add_adjustment(SPUnitSelector *us, GtkAdjustment *adj)
g_return_if_fail(!g_slist_find(us->adjustments, adj));
- gtk_object_ref(GTK_OBJECT(adj));
+ g_object_ref(adj);
us->adjustments = g_slist_prepend(us->adjustments, adj);
}
@@ -341,7 +341,7 @@ sp_unit_selector_remove_adjustment(SPUnitSelector *us, GtkAdjustment *adj)
g_return_if_fail(g_slist_find(us->adjustments, adj));
us->adjustments = g_slist_remove(us->adjustments, adj);
- gtk_object_unref(GTK_OBJECT(adj));
+ g_object_unref(adj);
}
gboolean
diff --git a/src/ink-comboboxentry-action.cpp b/src/ink-comboboxentry-action.cpp
index b9dac24e9..6b5266709 100644
--- a/src/ink-comboboxentry-action.cpp
+++ b/src/ink-comboboxentry-action.cpp
@@ -378,7 +378,11 @@ GtkWidget* create_tool_item( GtkAction* action )
// Optionally widen the combobox width... which widens the drop-down list in list mode.
if( ink_comboboxentry_action->extra_width > 0 ) {
GtkRequisition req;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(GTK_WIDGET(ink_comboboxentry_action->combobox), &req, NULL);
+#else
gtk_widget_size_request( GTK_WIDGET( ink_comboboxentry_action->combobox ), &req );
+#endif
gtk_widget_set_size_request( GTK_WIDGET( ink_comboboxentry_action->combobox ),
req.width + ink_comboboxentry_action->extra_width, -1 );
}
@@ -527,7 +531,11 @@ void ink_comboboxentry_action_set_extra_width( Ink_ComboBoxEntry_Action* action,
// Widget may not have been created....
if( action->combobox ) {
GtkRequisition req;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(GTK_WIDGET(action->combobox), &req, NULL);
+#else
gtk_widget_size_request( GTK_WIDGET( action->combobox ), &req );
+#endif
gtk_widget_set_size_request( GTK_WIDGET( action->combobox ), req.width + action->extra_width, -1 );
}
}
diff --git a/src/inkview.cpp b/src/inkview.cpp
index c188827ce..76d12aa46 100644
--- a/src/inkview.cpp
+++ b/src/inkview.cpp
@@ -70,6 +70,115 @@ Inkscape::Application *inkscape;
#define bind_textdomain_codeset(p,c)
#endif
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_b 0x062
+#define GDK_KEY_B 0x042
+#define GDK_KEY_c 0x063
+#define GDK_KEY_C 0x043
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_h 0x068
+#define GDK_KEY_H 0x048
+#define GDK_KEY_i 0x069
+#define GDK_KEY_I 0x049
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_k 0x06b
+#define GDK_KEY_K 0x04b
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_v 0x076
+#define GDK_KEY_V 0x056
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_y 0x079
+#define GDK_KEY_Y 0x059
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_KP_Space 0xff80
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_braceleft 0x07b
+#define GDK_KEY_braceright 0x07d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#define GDK_KEY_KP_Add 0xffab
+#define GDK_KEY_KP_Subtract 0xffad
+#endif
+
extern char *optarg;
extern int optind, opterr;
@@ -117,15 +226,15 @@ static int
sp_svgview_main_key_press (GtkWidget */*widget*/, GdkEventKey *event, struct SPSlideShow *ss)
{
switch (event->keyval) {
- case GDK_Up:
- case GDK_Home:
+ case GDK_KEY_Up:
+ case GDK_KEY_Home:
sp_svgview_goto_first(ss);
break;
- case GDK_Down:
- case GDK_End:
+ case GDK_KEY_Down:
+ case GDK_KEY_End:
sp_svgview_goto_last(ss);
break;
- case GDK_F11:
+ case GDK_KEY_F11:
#ifdef HAVE_GTK_WINDOW_FULLSCREEN
if (ss->fullscreen) {
gtk_window_unfullscreen (GTK_WINDOW(ss->window));
@@ -138,24 +247,24 @@ sp_svgview_main_key_press (GtkWidget */*widget*/, GdkEventKey *event, struct SPS
std::cout<<"Your GTK+ does not support fullscreen mode. Upgrade to 2.2."<<std::endl;
#endif
break;
- case GDK_Return:
+ case GDK_KEY_Return:
sp_svgview_control_show (ss);
break;
- case GDK_KP_Page_Down:
- case GDK_Page_Down:
- case GDK_Right:
- case GDK_space:
+ case GDK_KEY_KP_Page_Down:
+ case GDK_KEY_Page_Down:
+ case GDK_KEY_Right:
+ case GDK_KEY_space:
sp_svgview_show_next (ss);
break;
- case GDK_KP_Page_Up:
- case GDK_Page_Up:
- case GDK_Left:
- case GDK_BackSpace:
+ case GDK_KEY_KP_Page_Up:
+ case GDK_KEY_Page_Up:
+ case GDK_KEY_Left:
+ case GDK_KEY_BackSpace:
sp_svgview_show_prev (ss);
break;
- case GDK_Escape:
- case GDK_q:
- case GDK_Q:
+ case GDK_KEY_Escape:
+ case GDK_KEY_q:
+ case GDK_KEY_Q:
gtk_main_quit();
break;
default:
@@ -413,11 +522,19 @@ sp_svgview_waiting_cursor(struct SPSlideShow *ss)
{
GdkCursor *waiting = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ss->window)), waiting);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(waiting);
+#else
gdk_cursor_unref(waiting);
+#endif
if (ctrlwin) {
GdkCursor *waiting = gdk_cursor_new(GDK_WATCH);
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(ctrlwin)), waiting);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(waiting);
+#else
gdk_cursor_unref(waiting);
+#endif
}
while(gtk_events_pending())
gtk_main_iteration();
diff --git a/src/interface.cpp b/src/interface.cpp
index 493ffa32f..762a1692d 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -8,11 +8,13 @@
* bulia byak <buliabyak@users.sf.net>
* Jon A. Cruz <jon@joncruz.org>
* Abhishek Sharma
+ * Kris De Gussem <Kris.DeGussem@gmail.com>
*
+ * Copyright (C) 2012 Kris De Gussem
* Copyright (C) 2010 authors
* Copyright (C) 1999-2005 authors
- * Copyright (C) 2001-2002 Ximian, Inc.
* Copyright (C) 2004 David Turner
+ * Copyright (C) 2001-2002 Ximian, Inc.
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -24,6 +26,8 @@
#include "file.h"
#include <glib.h>
#include <gtkmm/icontheme.h>
+#include <gtkmm/imagemenuitem.h>
+#include <gtkmm/separatormenuitem.h>
#include "inkscape-private.h"
#include "extension/db.h"
@@ -37,7 +41,6 @@
#include "desktop-handles.h"
#include "interface.h"
#include "desktop.h"
-#include "ui/context-menu.h"
#include "selection.h"
#include "selection-chemistry.h"
#include "svg-view-widget.h"
@@ -66,10 +69,108 @@
#include "gradient-drag.h"
#include "widgets/ege-paint-def.h"
#include "document-undo.h"
+#include "sp-anchor.h"
+#include "sp-clippath.h"
+#include "sp-image.h"
+#include "sp-item.h"
+#include "sp-mask.h"
+// #include "verbs.h"
+#include "message-stack.h"
+// #include "inkscape.h"
+#include "ui/dialog/dialog-manager.h"
+// #include "../xml/repr.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
/* Drag and Drop */
@@ -276,8 +377,6 @@ sp_ui_new_view()
sp_namedview_update_layers_from_document(static_cast<SPDesktop*>(dtw->view));
}
-/* TODO: not yet working */
-/* To be re-enabled (by adding to menu) once it works. */
void sp_ui_new_view_preview()
{
SPDocument *document = SP_ACTIVE_DOCUMENT;
@@ -290,15 +389,12 @@ void sp_ui_new_view_preview()
}
}
-/**
- * \param widget unused
- */
void
sp_ui_close_view(GtkWidget */*widget*/)
{
- SPDesktop *dt = SP_ACTIVE_DESKTOP;
+ SPDesktop *dt = SP_ACTIVE_DESKTOP;
- if (dt == NULL) {
+ if (dt == NULL) {
return;
}
@@ -312,31 +408,20 @@ sp_ui_close_view(GtkWidget */*widget*/)
}
-/**
- * sp_ui_close_all
- *
- * This function is called to exit the program, and iterates through all
- * open document view windows, attempting to close each in turn. If the
- * view has unsaved information, the user will be prompted to save,
- * discard, or cancel.
- *
- * Returns FALSE if the user cancels the close_all operation, TRUE
- * otherwise.
- */
unsigned int
sp_ui_close_all(void)
{
/* Iterate through all the windows, destroying each in the order they
become active */
while (SP_ACTIVE_DESKTOP) {
- SPDesktop *dt = SP_ACTIVE_DESKTOP;
- if (dt->shutdown()) {
+ SPDesktop *dt = SP_ACTIVE_DESKTOP;
+ if (dt->shutdown()) {
/* The user canceled the operation, so end doing the close */
return FALSE;
}
- // Shutdown can proceed; use the stored reference to the desktop here instead of the current SP_ACTIVE_DESKTOP,
- // because the user might have changed the focus in the meantime (see bug #381357 on Launchpad)
- dt->destroyWidget();
+ // Shutdown can proceed; use the stored reference to the desktop here instead of the current SP_ACTIVE_DESKTOP,
+ // because the user might have changed the focus in the meantime (see bug #381357 on Launchpad)
+ dt->destroyWidget();
}
return TRUE;
@@ -353,7 +438,7 @@ static void
sp_ui_menu_activate(void */*object*/, SPAction *action)
{
if (!temporarily_block_actions) {
- sp_action_perform(action, NULL);
+ sp_action_perform(action, NULL);
}
}
@@ -384,10 +469,7 @@ sp_ui_menu_deselect(gpointer object)
}
/**
- * sp_ui_menuitem_add_icon
- *
* Creates and attaches a scaled icon to the given menu item.
- *
*/
void
sp_ui_menuitem_add_icon( GtkWidget *item, gchar *icon_name )
@@ -404,47 +486,6 @@ sp_ui_menuitem_add_icon( GtkWidget *item, gchar *icon_name )
gtk_image_menu_item_set_image((GtkImageMenuItem *) item, icon);
} // end of sp_ui_menu_add_icon
-/**
- * sp_ui_menu_append_item
- *
- * Appends a UI item with specific info for Inkscape/Sodipodi.
- *
- */
-static GtkWidget *
-sp_ui_menu_append_item( GtkMenu *menu, gchar const *stock,
- gchar const *label, gchar const *tip, Inkscape::UI::View::View *view, GCallback callback,
- gpointer data, gboolean with_mnemonic = TRUE )
-{
- GtkWidget *item;
-
- if (stock) {
- item = gtk_image_menu_item_new_from_stock(stock, NULL);
- } else if (label) {
- item = (with_mnemonic)
- ? gtk_image_menu_item_new_with_mnemonic(label) :
- gtk_image_menu_item_new_with_label(label);
- } else {
- item = gtk_separator_menu_item_new();
- }
-
- gtk_widget_show(item);
-
- if (callback) {
- g_signal_connect(G_OBJECT(item), "activate", callback, data);
- }
-
- if (tip && view) {
- g_object_set_data(G_OBJECT(item), "view", (gpointer) view);
- g_signal_connect( G_OBJECT(item), "select", G_CALLBACK(sp_ui_menu_select), (gpointer) tip );
- g_signal_connect( G_OBJECT(item), "deselect", G_CALLBACK(sp_ui_menu_deselect), NULL);
- }
-
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-
- return item;
-
-} // end of sp_ui_menu_append_item()
-
void
sp_ui_dialog_title_string(Inkscape::Verb *verb, gchar *c)
{
@@ -464,7 +505,7 @@ sp_ui_dialog_title_string(Inkscape::Verb *verb, gchar *c)
g_free(atitle);
shortcut = sp_shortcut_get_primary(verb);
- if (shortcut!=GDK_VoidSymbol) {
+ if (shortcut!=GDK_KEY_VoidSymbol) {
gchar* key = sp_shortcut_get_label(shortcut);
s = g_stpcpy(s, " (");
s = g_stpcpy(s, key);
@@ -475,14 +516,11 @@ sp_ui_dialog_title_string(Inkscape::Verb *verb, gchar *c)
/**
- * sp_ui_menu_append_item_from_verb
- *
* Appends a custom menu UI from a verb.
- *
+ *
+ * @see ContextMenu::AppendItemFromVerb for a c++ified alternative. Consider dropping sp_ui_menu_append_item_from_verb when c++ifying interface.cpp.
*/
-
-static GtkWidget *
-sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::UI::View::View *view, bool radio = false, GSList *group = NULL)
+static GtkWidget *sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::UI::View::View *view, bool radio = false, GSList *group = NULL)
{
SPAction *action;
GtkWidget *item;
@@ -498,23 +536,28 @@ sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::
if (!action) return NULL;
shortcut = sp_shortcut_get_primary(verb);
- if (shortcut!=GDK_VoidSymbol) {
+ if (shortcut!=GDK_KEY_VoidSymbol) {
gchar* c = sp_shortcut_get_label(shortcut);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *const hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 16);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *const hb = gtk_hbox_new(FALSE, 16);
+#endif
GtkWidget *const name_lbl = gtk_label_new("");
gtk_label_set_markup_with_mnemonic(GTK_LABEL(name_lbl), action->name);
- gtk_misc_set_alignment((GtkMisc *) name_lbl, 0.0, 0.5);
- gtk_box_pack_start((GtkBox *) hb, name_lbl, TRUE, TRUE, 0);
+ gtk_misc_set_alignment(reinterpret_cast<GtkMisc *>(name_lbl), 0.0, 0.5);
+ gtk_box_pack_start(reinterpret_cast<GtkBox *>(hb), name_lbl, TRUE, TRUE, 0);
GtkWidget *const accel_lbl = gtk_label_new(c);
- gtk_misc_set_alignment((GtkMisc *) accel_lbl, 1.0, 0.5);
- gtk_box_pack_end((GtkBox *) hb, accel_lbl, FALSE, FALSE, 0);
+ gtk_misc_set_alignment(reinterpret_cast<GtkMisc *>(accel_lbl), 1.0, 0.5);
+ gtk_box_pack_end(reinterpret_cast<GtkBox *>(hb), accel_lbl, FALSE, FALSE, 0);
gtk_widget_show_all(hb);
if (radio) {
item = gtk_radio_menu_item_new (group);
} else {
item = gtk_image_menu_item_new();
}
- gtk_container_add((GtkContainer *) item, hb);
+ gtk_container_add(reinterpret_cast<GtkContainer *>(item), hb);
g_free(c);
} else {
if (radio) {
@@ -524,8 +567,8 @@ sp_ui_menu_append_item_from_verb(GtkMenu *menu, Inkscape::Verb *verb, Inkscape::
}
GtkWidget *const name_lbl = gtk_label_new("");
gtk_label_set_markup_with_mnemonic(GTK_LABEL(name_lbl), action->name);
- gtk_misc_set_alignment((GtkMisc *) name_lbl, 0.0, 0.5);
- gtk_container_add((GtkContainer *) item, name_lbl);
+ gtk_misc_set_alignment(reinterpret_cast<GtkMisc *>(name_lbl), 0.0, 0.5);
+ gtk_container_add(reinterpret_cast<GtkContainer *>(item), name_lbl);
}
action->signal_set_sensitive.connect(
@@ -681,10 +724,15 @@ sp_ui_menu_append_check_item_from_verb(GtkMenu *menu, Inkscape::UI::View::View *
SPAction *action = (verb) ? verb->get_action(view) : 0;
GtkWidget *item = gtk_check_menu_item_new();
- if (verb && shortcut!=GDK_VoidSymbol) {
+ if (verb && shortcut!=GDK_KEY_VoidSymbol) {
gchar* c = sp_shortcut_get_label(shortcut);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 16);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 16);
+#endif
{
GtkWidget *l = gtk_label_new_with_mnemonic(action ? action->name : label);
@@ -836,9 +884,9 @@ sp_ui_checkboxes_menus(GtkMenu *m, Inkscape::UI::View::View *view)
void addTaskMenuItems(GtkMenu *menu, Inkscape::UI::View::View *view)
{
gchar const* data[] = {
- _("Default"), _("Default interface setup"),
- _("Custom"), _("Set the custom task"),
- _("Wide"), _("Setup for widescreen work"),
+ C_("Interface setup", "Default"), _("Default interface setup"),
+ C_("Interface setup", "Custom"), _("Set the custom task"),
+ C_("Interface setup", "Wide"), _("Setup for widescreen work"),
0, 0
};
@@ -929,8 +977,8 @@ void sp_ui_build_dyn_menus(Inkscape::XML::Node *menus, GtkWidget *menu, Inkscape
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
}
if (verb->get_code() != SP_VERB_NONE) {
- SPAction *action = verb->get_action(view);
- g_signal_connect( G_OBJECT(item), "expose_event", (GCallback) update_view_menu, (void *) action);
+ SPAction *action = verb->get_action(view);
+ g_signal_connect( G_OBJECT(item), "expose_event", (GCallback) update_view_menu, (void *) action);
}
} else {
sp_ui_menu_append_item_from_verb(GTK_MENU(menu), verb, view);
@@ -1000,15 +1048,6 @@ void sp_ui_build_dyn_menus(Inkscape::XML::Node *menus, GtkWidget *menu, Inkscape
}
}
-/**
- * Build the main tool bar.
- *
- * Currently the main tool bar is built as a dynamic XML menu using
- * \c sp_ui_build_dyn_menus. This function builds the bar, and then
- * pass it to get items attached to it.
- *
- * @param view View to build the bar for
- */
GtkWidget *sp_ui_main_menubar(Inkscape::UI::View::View *view)
{
GtkWidget *mbar = gtk_menu_bar_new();
@@ -1016,87 +1055,6 @@ GtkWidget *sp_ui_main_menubar(Inkscape::UI::View::View *view)
return mbar;
}
-static void leave_group(GtkMenuItem *, SPDesktop *desktop) {
- desktop->setCurrentLayer(desktop->currentLayer()->parent);
-}
-
-static void enter_group(GtkMenuItem *mi, SPDesktop *desktop) {
- desktop->setCurrentLayer(reinterpret_cast<SPObject *>(g_object_get_data(G_OBJECT(mi), "group")));
- sp_desktop_selection(desktop)->clear();
-}
-
-GtkWidget *
-sp_ui_context_menu(Inkscape::UI::View::View *view, SPItem *item)
-{
- GtkWidget *m;
- SPDesktop *dt;
-
- dt = static_cast<SPDesktop*>(view);
-
- m = gtk_menu_new();
-
- /* Undo and Redo */
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_UNDO), view);
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_REDO), view);
-
- /* Separator */
- sp_ui_menu_append_item(GTK_MENU(m), NULL, NULL, NULL, NULL, NULL, NULL);
-
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_CUT), view);
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_COPY), view);
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_PASTE), view);
-
- /* Separator */
- sp_ui_menu_append_item(GTK_MENU(m), NULL, NULL, NULL, NULL, NULL, NULL);
-
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_DUPLICATE), view);
- sp_ui_menu_append_item_from_verb(GTK_MENU(m), Inkscape::Verb::get(SP_VERB_EDIT_DELETE), view);
-
- /* Item menu */
- if (item) {
- sp_ui_menu_append_item(GTK_MENU(m), NULL, NULL, NULL, NULL, NULL, NULL);
- sp_object_menu((SPObject *) item, dt, GTK_MENU(m));
- }
-
- /* layer menu */
- SPGroup *group=NULL;
- if (item) {
- if (SP_IS_GROUP(item)) {
- group = SP_GROUP(item);
- } else if ( item != dt->currentRoot() && SP_IS_GROUP(item->parent) ) {
- group = SP_GROUP(item->parent);
- }
- }
-
- if (( group && group != dt->currentLayer() ) ||
- ( dt->currentLayer() != dt->currentRoot() && dt->currentLayer()->parent != dt->currentRoot() ) ) {
- /* Separator */
- sp_ui_menu_append_item(GTK_MENU(m), NULL, NULL, NULL, NULL, NULL, NULL);
- }
-
- if ( group && group != dt->currentLayer() ) {
- /* TRANSLATORS: #%s is the id of the group e.g. <g id="#g7">, not a number. */
- gchar *label=g_strdup_printf(_("Enter group #%s"), group->getId());
- GtkWidget *w = gtk_menu_item_new_with_label(label);
- g_free(label);
- g_object_set_data(G_OBJECT(w), "group", group);
- g_signal_connect(G_OBJECT(w), "activate", GCallback(enter_group), dt);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- }
-
- if ( dt->currentLayer() != dt->currentRoot() ) {
- if ( dt->currentLayer()->parent != dt->currentRoot() ) {
- GtkWidget *w = gtk_menu_item_new_with_label(_("Go to parent"));
- g_signal_connect(G_OBJECT(w), "activate", GCallback(leave_group), dt);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- }
- }
-
- return m;
-}
/* Drag and Drop */
void
@@ -1455,9 +1413,9 @@ sp_ui_drag_data_received(GtkWidget *widget,
gchar *filename = g_build_filename( g_get_tmp_dir(), "inkscape-dnd-import", NULL );
g_file_set_contents(filename,
- reinterpret_cast<gchar const *>(gtk_selection_data_get_data (data)),
- gtk_selection_data_get_length (data),
- NULL);
+ reinterpret_cast<gchar const *>(gtk_selection_data_get_data (data)),
+ gtk_selection_data_get_length (data),
+ NULL);
file_import(doc, filename, ext);
g_free(filename);
@@ -1585,19 +1543,21 @@ sp_ui_overwrite_file(gchar const *filename)
static void
sp_ui_menu_item_set_name(GtkWidget *data, Glib::ustring const &name)
{
- void *child = gtk_bin_get_child (GTK_BIN (data));
- //child is either
- //- a GtkHBox, whose first child is a label displaying name if the menu
- //item has an accel key
- //- a GtkLabel if the menu has no accel key
- if (GTK_IS_LABEL(child)) {
- gtk_label_set_markup_with_mnemonic(GTK_LABEL (child), name.c_str());
- } else if (GTK_IS_HBOX(child)) {
- gtk_label_set_markup_with_mnemonic(
- GTK_LABEL (gtk_container_get_children(GTK_CONTAINER (child))->data),
- name.c_str());
- }//else sp_ui_menu_append_item_from_verb has been modified and can set
- //a menu item in yet another way...
+ if (data || GTK_IS_BIN (data)) {
+ void *child = gtk_bin_get_child (GTK_BIN (data));
+ //child is either
+ //- a GtkHBox, whose first child is a label displaying name if the menu
+ //item has an accel key
+ //- a GtkLabel if the menu has no accel key
+ if (GTK_IS_LABEL(child)) {
+ gtk_label_set_markup_with_mnemonic(GTK_LABEL (child), name.c_str());
+ } else if (GTK_IS_HBOX(child)) {
+ gtk_label_set_markup_with_mnemonic(
+ GTK_LABEL (gtk_container_get_children(GTK_CONTAINER (child))->data),
+ name.c_str());
+ }//else sp_ui_menu_append_item_from_verb has been modified and can set
+ //a menu item in yet another way...
+ }
}
void injectRenamedIcons()
@@ -1627,6 +1587,630 @@ void injectRenamedIcons()
}
+ContextMenu::ContextMenu(SPDesktop *desktop, SPItem *item) :
+ _item(item),
+ separators(),
+ MIGroup(),
+ MIParent(_("Go to parent"))
+{
+// g_message("ContextMenu");
+ _object = static_cast<SPObject *>(item);
+ _desktop = desktop;
+
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_UNDO));
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_REDO));
+ AddSeparator();
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_CUT));
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_COPY));
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_PASTE));
+ AddSeparator();
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_DUPLICATE));
+ AppendItemFromVerb(Inkscape::Verb::get(SP_VERB_EDIT_DELETE));
+
+ positionOfLastDialog = 10; // 9 in front + 1 for the separator in the next if; used to position the dialog menu entries below each other
+
+ /* Item menu */
+ if (item!=NULL) {
+ AddSeparator();
+ MakeObjectMenu();
+ }
+
+ /* layer menu */
+ SPGroup *group=NULL;
+ if (item) {
+ if (SP_IS_GROUP(item)) {
+ group = SP_GROUP(item);
+ } else if ( item != _desktop->currentRoot() && SP_IS_GROUP(item->parent) ) {
+ group = SP_GROUP(item->parent);
+ }
+ }
+
+ if (( group && group != _desktop->currentLayer() ) ||
+ ( _desktop->currentLayer() != _desktop->currentRoot() && _desktop->currentLayer()->parent != _desktop->currentRoot() ) ) {
+ AddSeparator();
+ }
+
+ if ( group && group != _desktop->currentLayer() ) {
+ /* TRANSLATORS: #%1 is the id of the group e.g. <g id="#g7">, not a number. */
+ MIGroup.set_label (Glib::ustring::compose(_("Enter group #%1"), group->getId()));
+ MIGroup.set_data("group", group);
+ MIGroup.signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &ContextMenu::EnterGroup),&MIGroup));
+ MIGroup.show();
+ append(MIGroup);
+ }
+
+ if ( _desktop->currentLayer() != _desktop->currentRoot() ) {
+ if ( _desktop->currentLayer()->parent != _desktop->currentRoot() ) {
+ MIParent.signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::LeaveGroup));
+ MIParent.show();
+ append(MIParent);
+ }
+ }
+}
+
+ContextMenu::~ContextMenu(void)
+{
+// g_message("~ContextMenu");
+}
+
+Gtk::SeparatorMenuItem* ContextMenu::AddSeparator(void)
+{
+ Gtk::SeparatorMenuItem* sep = new Gtk::SeparatorMenuItem();
+ sep->show();
+ append(*sep);
+ separators.push_back(sep);
+ return sep;
+}
+
+void ContextMenu::EnterGroup(Gtk::MenuItem* mi)
+{
+ _desktop->setCurrentLayer(reinterpret_cast<SPObject *>(mi->get_data("group")));
+ _desktop->selection->clear();
+}
+
+void ContextMenu::LeaveGroup(void)
+{
+ _desktop->setCurrentLayer(_desktop->currentLayer()->parent);
+}
+
+void ContextMenu::AppendItemFromVerb(Inkscape::Verb *verb)//, SPDesktop *view)//, bool radio, GSList *group)
+{
+ SPAction *action;
+ SPDesktop *view = _desktop;
+
+ if (verb->get_code() == SP_VERB_NONE) {
+ Gtk::MenuItem *item = AddSeparator();
+ item->show();
+ append(*item);
+ } else {
+ action = verb->get_action(view);
+ if (!action)
+ {
+ return;
+ }
+
+ Gtk::ImageMenuItem *item = NULL;
+ unsigned int shortcut = sp_shortcut_get_primary(verb);
+ if (shortcut!=GDK_KEY_VoidSymbol) {
+ gchar* c = sp_shortcut_get_label(shortcut);
+ Gtk::HBox *const hb = new Gtk::HBox (FALSE, 16);
+ Gtk::Label *const name_lbl = new Gtk::Label(action->name, true);
+ name_lbl->set_alignment(0.0, 0.5);
+ hb->pack_start(*name_lbl, TRUE, TRUE, 0);
+ Gtk::Label *const accel_lbl = new Gtk::Label(c);
+ accel_lbl->set_alignment(1.0, 0.5);
+ hb->pack_end(*accel_lbl, FALSE, FALSE, 0);
+ hb->show_all();
+ // if (radio) {
+ // item = gtk_radio_menu_item_new (group);
+ // } else {
+ item = new Gtk::ImageMenuItem();
+ // }
+ item->add(*hb);
+ g_free(c);
+ } else {
+ // if (radio) {
+ // item = gtk_radio_menu_item_new (group);
+ // } else {
+ item = new Gtk::ImageMenuItem();
+ // }
+ Gtk::Label *const name_lbl = new Gtk::Label(action->name, true);
+ name_lbl->set_alignment(0.0, 0.5);
+ item->add(*name_lbl);
+ }
+
+ action->signal_set_sensitive.connect(sigc::mem_fun(*this, &ContextMenu::set_sensitive));
+ action->signal_set_name.connect(sigc::mem_fun(*item, &ContextMenu::set_name));
+
+ if (!action->sensitive) {
+ item->set_sensitive(FALSE);
+ }
+
+ if (action->image) {
+ sp_ui_menuitem_add_icon((GtkWidget*)item->gobj(), action->image);
+ }
+ item->set_events(Gdk::KEY_PRESS_MASK);
+ item->signal_activate().connect(sigc::bind(sigc::ptr_fun(sp_ui_menu_activate),item,action));
+ item->signal_select().connect(sigc::bind(sigc::ptr_fun(sp_ui_menu_select_action),item,action));
+ item->signal_deselect().connect(sigc::bind(sigc::ptr_fun(sp_ui_menu_deselect_action),item,action));
+ item->show();
+ append(*item);
+ }
+}
+
+void ContextMenu::MakeObjectMenu(void)
+{
+ GObjectClass *klass = G_OBJECT_GET_CLASS(_object); //to deduce the object's type from its class
+
+ if (G_TYPE_CHECK_CLASS_TYPE(klass, SP_TYPE_ITEM))
+ {
+ MakeItemMenu ();
+ }
+ if (G_TYPE_CHECK_CLASS_TYPE(klass, SP_TYPE_GROUP))
+ {
+ MakeGroupMenu();
+ }
+ if (G_TYPE_CHECK_CLASS_TYPE(klass, SP_TYPE_ANCHOR))
+ {
+ MakeAnchorMenu();
+ }
+ if (G_TYPE_CHECK_CLASS_TYPE(klass, SP_TYPE_IMAGE))
+ {
+ MakeImageMenu();
+ }
+ if (G_TYPE_CHECK_CLASS_TYPE(klass, SP_TYPE_SHAPE))
+ {
+ MakeShapeMenu();
+ }
+ if (G_TYPE_CHECK_CLASS_TYPE(klass, SP_TYPE_TEXT))
+ {
+ MakeTextMenu();
+ }
+}
+
+void ContextMenu::MakeItemMenu (void)
+{
+ Gtk::MenuItem* mi;
+
+ /* Item dialog */
+ mi = new Gtk::MenuItem(_("_Object Properties..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ItemProperties));
+ mi->show();
+ append(*mi);//insert(*mi,positionOfLastDialog++);
+
+ AddSeparator();
+
+ /* Select item */
+ mi = new Gtk::MenuItem(_("_Select This"),1);
+ if (_desktop->selection->includes(_item)) {
+ mi->set_sensitive(FALSE);
+ } else {
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ItemSelectThis));
+ }
+ mi->show();
+ append(*mi);
+
+ /* Select same fill and stroke */
+ mi = new Gtk::MenuItem(_("_Select Same Fill and Stroke"),1);
+ if (_desktop->selection->isEmpty()) {
+ mi->set_sensitive(FALSE);
+ } else {
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameFillStroke));
+ }
+ mi->set_sensitive(!SP_IS_ANCHOR(_item));
+ mi->show();
+ append(*mi);
+
+ /* Create link */
+ mi = new Gtk::MenuItem(_("_Create Link"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ItemCreateLink));
+ mi->set_sensitive(!SP_IS_ANCHOR(_item));
+ mi->show();
+ append(*mi);
+
+ bool ClipRefOK=false;
+ bool MaskRefOK=false;
+ if (_item){
+ if (_item->clip_ref){
+ if (_item->clip_ref->getObject()){
+ ClipRefOK=true;
+ }
+ }
+ }
+ if (_item){
+ if (_item->mask_ref){
+ if (_item->mask_ref->getObject()){
+ MaskRefOK=true;
+ }
+ }
+ }
+ /* Set mask */
+ mi = new Gtk::MenuItem(_("Set Mask"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SetMask));
+ if (ClipRefOK || MaskRefOK) {
+ mi->set_sensitive(FALSE);
+ } else {
+ mi->set_sensitive(TRUE);
+ }
+ mi->show();
+ append(*mi);
+
+ /* Release mask */
+ mi = new Gtk::MenuItem(_("Release Mask"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ReleaseMask));
+ if (MaskRefOK) {
+ mi->set_sensitive(TRUE);
+ } else {
+ mi->set_sensitive(FALSE);
+ }
+ mi->show();
+ append(*mi);
+
+ /* Set Clip */
+ mi = new Gtk::MenuItem(_("Set _Clip"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SetClip));
+ if (ClipRefOK || MaskRefOK) {
+ mi->set_sensitive(FALSE);
+ } else {
+ mi->set_sensitive(TRUE);
+ }
+ mi->show();
+ append(*mi);
+
+ /* Release Clip */
+ mi = new Gtk::MenuItem(_("Release C_lip"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ReleaseClip));
+ if (ClipRefOK) {
+ mi->set_sensitive(TRUE);
+ } else {
+ mi->set_sensitive(FALSE);
+ }
+ mi->show();
+ append(*mi);
+}
+
+void ContextMenu::SelectSameFillStroke(void)
+{
+ sp_select_same_fill_stroke_style(_desktop, true, true, true);
+}
+
+void ContextMenu::ItemProperties(void)
+{
+ _desktop->selection->set(_item);
+ _desktop->_dlg_mgr->showDialog("ObjectProperties");
+}
+
+void ContextMenu::ItemSelectThis(void)
+{
+ _desktop->selection->set(_item);
+}
+
+void ContextMenu::ItemCreateLink(void)
+{
+ Inkscape::XML::Document *xml_doc = _desktop->doc()->getReprDoc();
+ Inkscape::XML::Node *repr = xml_doc->createElement("svg:a");
+ _item->parent->getRepr()->addChild(repr, _item->getRepr());
+ SPObject *object = _item->document->getObjectByRepr(repr);
+ g_return_if_fail(SP_IS_ANCHOR(object));
+
+ const char *id = _item->getRepr()->attribute("id");
+ Inkscape::XML::Node *child = _item->getRepr()->duplicate(xml_doc);
+ _item->deleteObject(false);
+ repr->addChild(child, NULL);
+ child->setAttribute("id", id);
+
+ Inkscape::GC::release(repr);
+ Inkscape::GC::release(child);
+
+ DocumentUndo::done(object->document, SP_VERB_NONE, _("Create link"));
+
+ _desktop->selection->set(SP_ITEM(object));
+ _desktop->_dlg_mgr->showDialog("ObjectAttributes");
+}
+
+void ContextMenu::SetMask(void)
+{
+ sp_selection_set_mask(_desktop, false, false);
+}
+
+void ContextMenu::ReleaseMask(void)
+{
+ sp_selection_unset_mask(_desktop, false);
+}
+
+
+void ContextMenu::SetClip(void)
+{
+ sp_selection_set_mask(_desktop, true, false);
+}
+
+
+void ContextMenu::ReleaseClip(void)
+{
+ sp_selection_unset_mask(_desktop, true);
+}
+
+void ContextMenu::MakeGroupMenu(void)
+{
+ /* Ungroup */
+ Gtk::MenuItem* mi = new Gtk::MenuItem(_("_Ungroup"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ActivateUngroup));
+ mi->show();
+ append(*mi);
+}
+
+void ContextMenu::ActivateUngroup(void)
+{
+ GSList *children = NULL;
+
+ sp_item_group_ungroup(static_cast<SPGroup*>(_item), &children);
+ _desktop->selection->setList(children);
+ g_slist_free(children);
+}
+
+void ContextMenu::MakeAnchorMenu(void)
+{
+ Gtk::MenuItem* mi;
+
+ /* Link dialog */
+ mi = new Gtk::MenuItem(_("Link _Properties..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::AnchorLinkProperties));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+
+ /* Select item */
+ mi = new Gtk::MenuItem(_("_Follow Link"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::AnchorLinkFollow));
+ mi->show();
+ append(*mi);
+
+ /* Reset transformations */
+ mi = new Gtk::MenuItem(_("_Remove Link"),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::AnchorLinkRemove));
+ mi->show();
+ append(*mi);
+}
+
+void ContextMenu::AnchorLinkProperties(void)
+{
+ _desktop->_dlg_mgr->showDialog("ObjectAttributes");
+}
+
+void ContextMenu::AnchorLinkFollow(void)
+{
+ /* shell out to an external browser here */
+}
+
+void ContextMenu::AnchorLinkRemove(void)
+{
+ GSList *children = NULL;
+ sp_item_group_ungroup(static_cast<SPAnchor*>(_item), &children);
+ g_slist_free(children);
+}
+
+void ContextMenu::MakeImageMenu (void)
+{
+ Gtk::MenuItem* mi;
+ Inkscape::XML::Node *ir = _object->getRepr();
+ const gchar *href = ir->attribute("xlink:href");
+
+ /* Image properties */
+ mi = new Gtk::MenuItem(_("Image _Properties..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ImageProperties));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+
+ /* Edit externally */
+ mi = new Gtk::MenuItem(_("Edit Externally..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ImageEdit));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+ if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
+ mi->set_sensitive( FALSE );
+ }
+
+ /* Embed image */
+ if (Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" )) {
+ mi = new Gtk::MenuItem(C_("Context menu", "Embed Image"));
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ImageEmbed));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+ if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
+ mi->set_sensitive( FALSE );
+ }
+ }
+
+ /* Extract image */
+ if (Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" )) {
+ mi = new Gtk::MenuItem(C_("Context menu", "Extract Image..."));
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ImageExtract));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+ if ( (!href) || ((strncmp(href, "data:", 5) != 0)) ) {
+ mi->set_sensitive( FALSE );
+ }
+ }
+}
+
+void ContextMenu::ImageProperties(void)
+{
+ _desktop->_dlg_mgr->showDialog("ObjectAttributes");
+}
+
+Glib::ustring ContextMenu::getImageEditorName() {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ Glib::ustring value;
+ Glib::ustring choices = prefs->getString("/options/bitmapeditor/value");
+ if (!choices.empty()) {
+ value = choices;
+ }
+ else {
+ value = "gimp";
+ }
+ return value;
+}
+
+void ContextMenu::ImageEdit(void)
+{
+ if (_desktop->selection->isEmpty()) {
+ _desktop->selection->set(_item);
+ }
+
+ GSList const *selected = _desktop->selection->itemList();
+
+ GError* errThing = 0;
+ Glib::ustring cmdline = getImageEditorName();
+ Glib::ustring name;
+ Glib::ustring fullname;
+
+#ifdef WIN32
+ // g_spawn_command_line_sync parsing is done according to Unix shell rules,
+ // not Windows command interpreter rules. Thus we need to enclose the
+ // executable path with single quotes.
+ int index = cmdline.find(".exe");
+ if ( index < 0 ) index = cmdline.find(".bat");
+ if ( index < 0 ) index = cmdline.find(".com");
+ if ( index >= 0 ) {
+ Glib::ustring editorBin = cmdline.substr(0, index + 4).c_str();
+ Glib::ustring args = cmdline.substr(index + 4, cmdline.length()).c_str();
+ editorBin.insert(0, "'");
+ editorBin.append("'");
+ cmdline = editorBin;
+ cmdline.append(args);
+ } else {
+ // Enclose the whole command line if no executable path can be extracted.
+ cmdline.insert(0, "'");
+ cmdline.append("'");
+ }
+#endif
+
+ for (GSList const *iter = selected; iter != NULL; iter = iter->next) {
+ Inkscape::XML::Node *ir = SP_ITEM(iter->data)->getRepr();
+ const gchar *href = ir->attribute("xlink:href");
+
+ if (strncmp (href,"file:",5) == 0) {
+ // URI to filename conversion
+ name = g_filename_from_uri(href, NULL, NULL);
+ } else {
+ name.append(href);
+ }
+
+ if (Glib::path_is_absolute(name)) {
+ fullname = name;
+ } else if (SP_ACTIVE_DOCUMENT->getBase()) {
+ fullname = Glib::build_filename(SP_ACTIVE_DOCUMENT->getBase(), name);
+ } else {
+ fullname = Glib::build_filename(Glib::get_current_dir(), name);
+ }
+
+ cmdline.append(" '");
+ cmdline.append(fullname.c_str());
+ cmdline.append("'");
+ }
+
+ //g_warning("##Command line: %s\n", cmdline.c_str());
+
+ g_spawn_command_line_async(cmdline.c_str(), &errThing);
+
+ if ( errThing ) {
+ g_warning("Problem launching editor (%d). %s", errThing->code, errThing->message);
+ (_desktop->messageStack())->flash(Inkscape::ERROR_MESSAGE, errThing->message);
+ g_error_free(errThing);
+ errThing = 0;
+ }
+}
+
+void ContextMenu::ImageEmbed(void)
+{
+ if (_desktop->selection->isEmpty()) {
+ _desktop->selection->set(_item);
+ }
+
+ Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" );
+ if (verb) {
+ SPAction *action = verb->get_action(_desktop);
+ if (action) {
+ sp_action_perform(action, NULL);
+ }
+ }
+}
+
+void ContextMenu::ImageExtract(void)
+{
+ if (_desktop->selection->isEmpty()) {
+ _desktop->selection->set(_item);
+ }
+
+ Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" );
+ if (verb) {
+ SPAction *action = verb->get_action(_desktop);
+ if (action) {
+ sp_action_perform(action, NULL);
+ }
+ }
+}
+
+void ContextMenu::MakeShapeMenu (void)
+{
+ Gtk::MenuItem* mi;
+
+ /* Item dialog */
+ mi = new Gtk::MenuItem(_("_Fill and Stroke..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::FillSettings));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+}
+
+void ContextMenu::FillSettings(void)
+{
+ if (_desktop->selection->isEmpty()) {
+ _desktop->selection->set(_item);
+ }
+
+ _desktop->_dlg_mgr->showDialog("FillAndStroke");
+}
+
+void ContextMenu::MakeTextMenu (void)
+{
+ Gtk::MenuItem* mi;
+
+ /* Fill and Stroke dialog */
+ mi = new Gtk::MenuItem(_("_Fill and Stroke..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::FillSettings));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+
+ /* Edit Text dialog */
+ mi = new Gtk::MenuItem(_("_Text and Font..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::TextSettings));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+
+ /* Spellcheck dialog */
+ mi = new Gtk::MenuItem(_("Check Spellin_g..."),1);
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SpellcheckSettings));
+ mi->show();
+ insert(*mi,positionOfLastDialog++);
+}
+
+void ContextMenu::TextSettings (void)
+{
+ if (_desktop->selection->isEmpty()) {
+ _desktop->selection->set(_item);
+ }
+
+ _desktop->_dlg_mgr->showDialog("TextFont");
+}
+
+void ContextMenu::SpellcheckSettings (void)
+{
+ if (_desktop->selection->isEmpty()) {
+ _desktop->selection->set(_item);
+ }
+
+ _desktop->_dlg_mgr->showDialog("SpellCheck");
+}
+
/*
Local Variables:
mode:c++
diff --git a/src/interface.h b/src/interface.h
index 2b01a20d7..1ea13f639 100644
--- a/src/interface.h
+++ b/src/interface.h
@@ -8,19 +8,26 @@
* Lauris Kaplinski <lauris@kaplinski.com>
* Frank Felfe <innerspace@iname.com>
* Abhishek Sharma
+ * Kris De Gussem <Kris.DeGussem@gmail.com>
*
+ * Copyright (C) 2012 Kris De Gussem
* Copyright (C) 1999-2002 authors
* Copyright (C) 2001-2002 Ximian, Inc.
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtk/gtk.h>
-
-#include "sp-item.h"
+#include <gtkmm/menu.h>
+class SPItem;
+class SPObject;
+class SPDesktop;
class SPViewWidget;
+namespace Gtk {
+class SeparatorMenuItem;
+}
+
namespace Inkscape {
class Verb;
@@ -38,49 +45,203 @@ class View;
void sp_create_window (SPViewWidget *vw, gboolean editable);
/**
- *
+ * \param widget unused
*/
void sp_ui_close_view (GtkWidget *widget);
+void sp_ui_new_view (void);
+
/**
- *
+ * @todo TODO: not yet working. To be re-enabled (by adding to menu) once it works.
*/
-void sp_ui_new_view (void);
void sp_ui_new_view_preview (void);
/**
+ * This function is called to exit the program, and iterates through all
+ * open document view windows, attempting to close each in turn. If the
+ * view has unsaved information, the user will be prompted to save,
+ * discard, or cancel.
*
+ * Returns FALSE if the user cancels the close_all operation, TRUE
+ * otherwise.
*/
unsigned int sp_ui_close_all (void);
/**
+ * Build the main tool bar.
*
- */
-GtkWidget *sp_ui_main_menubar (Inkscape::UI::View::View *view);
-
-/**
+ * Currently the main tool bar is built as a dynamic XML menu using
+ * \c sp_ui_build_dyn_menus. This function builds the bar, and then
+ * pass it to get items attached to it.
*
+ * @param view View to build the bar for
*/
-GtkWidget *sp_ui_context_menu (Inkscape::UI::View::View *v, SPItem *item);
-
+GtkWidget *sp_ui_main_menubar (Inkscape::UI::View::View *view);
-/**
- *
- */
void sp_menu_append_recent_documents (GtkWidget *menu);
+void sp_ui_dialog_title_string (Inkscape::Verb * verb, gchar* c);
/**
*
*/
-void sp_ui_dialog_title_string (Inkscape::Verb * verb, gchar* c);
+void sp_ui_error_dialog (const gchar * message);
+bool sp_ui_overwrite_file (const gchar * filename);
/**
- *
+ * Implements the Inkscape context menu.
+ *
+ * For the context menu implementation, the ContextMenu class stores the object
+ * that was selected in a private data member. This should be farely safe to do
+ * and a pointer to the SPItem as well as SPObject class are kept.
+ * All callbacks of the context menu entries are implemented as private
+ * functions.
+ *
+ * @todo add callbacks to destroy the context menu when it is closed (=key or mouse button pressed out of the scope of the context menu)
*/
-void sp_ui_error_dialog (const gchar * message);
-bool sp_ui_overwrite_file (const gchar * filename);
+class ContextMenu : public Gtk::Menu
+{
+ public:
+ /**
+ * The ContextMenu constructor contains all code to create and show the
+ * menu entries (aka child widgets).
+ *
+ * @param desktop pointer to the desktop the user is currently working on.
+ * @param item SPItem pointer to the object selected at the time the ContextMenu is created.
+ */
+ ContextMenu(SPDesktop *desktop, SPItem *item);
+ ~ContextMenu(void);
+
+ private:
+ SPItem *_item; // pointer to the object selected at the time the ContextMenu is created
+ SPObject *_object; // pointer to the object selected at the time the ContextMenu is created
+ SPDesktop *_desktop; //pointer to the desktop the user was currently working on at the time the ContextMenu is created
+
+ int positionOfLastDialog;
+
+ std::vector<Gtk::SeparatorMenuItem*> separators; //contains pointers to separators
+ Gtk::MenuItem MIGroup; //menu entry to enter a group
+ Gtk::MenuItem MIParent; //menu entry to leave a group
+
+ /**
+ * auxiliary function that adds a separator line in the context menu
+ */
+ Gtk::SeparatorMenuItem* AddSeparator(void);
+
+ /**
+ * c++ified version of sp_ui_menu_append_item.
+ *
+ * @see sp_ui_menu_append_item_from_verb and synchronize/drop that function when c++ifying other code in interface.cpp
+ */
+ void AppendItemFromVerb(Inkscape::Verb *verb);
+
+ /**
+ * main function which is responsible for creating the context sensitive menu items,
+ * calls subfunctions below to create the menu entry widgets.
+ */
+ void MakeObjectMenu (void);
+ /**
+ * creates menu entries for an SP_TYPE_ITEM object
+ */
+ void MakeItemMenu (void);
+ /**
+ * creates menu entries for a grouped object
+ */
+ void MakeGroupMenu (void);
+ /**
+ * creates menu entries for an anchor object
+ */
+ void MakeAnchorMenu (void);
+ /**
+ * creates menu entries for a bitmap image object
+ */
+ void MakeImageMenu (void);
+ /**
+ * creates menu entries for a shape object
+ */
+ void MakeShapeMenu (void);
+ /**
+ * creates menu entries for a text object
+ */
+ void MakeTextMenu (void);
+
+ void EnterGroup(Gtk::MenuItem* mi);
+ void LeaveGroup(void);
+ //////////////////////////////////////////
+ //callbacks for the context menu entries of an SP_TYPE_ITEM object
+ void ItemProperties(void);
+ void ItemSelectThis(void);
+ void SelectSameFillStroke(void);
+ void ItemCreateLink(void);
+ void SetMask(void);
+ void ReleaseMask(void);
+ void SetClip(void);
+ void ReleaseClip(void);
+ //////////////////////////////////////////
+
+
+ /**
+ * callback, is executed on clicking the anchor "Ungroup" menu entry
+ */
+ void ActivateUngroup(void);
+
+
+ void AnchorLinkProperties(void);
+ /**
+ * placeholder for callback to be executed on clicking the anchor "Follow link" context menu entry
+ * @todo add code to follow link externally
+ */
+ void AnchorLinkFollow(void);
+
+ /**
+ * callback, is executed on clicking the anchor "Link remove" menu entry
+ */
+ void AnchorLinkRemove(void);
+
+
+ /**
+ * callback, opens the image properties dialog and is executed on clicking the context menu entry with similar name
+ */
+ void ImageProperties(void);
+
+ /**
+ * callback, is executed on clicking the image "Edit Externally" menu entry
+ */
+ void ImageEdit(void);
+
+ /**
+ * auxiliary function that loads the external image editor name from the settings.
+ */
+ Glib::ustring getImageEditorName();
+
+ /**
+ * callback, is executed on clicking the "Embed Image" menu entry
+ */
+ void ImageEmbed(void);
+
+ /**
+ * callback, is executed on clicking the "Extract Image" menu entry
+ */
+ void ImageExtract(void);
+
+
+ /**
+ * callback, is executed on clicking the "Fill and Stroke" menu entry
+ */
+ void FillSettings(void);
+
+
+ /**
+ * callback, is executed on clicking the "Text and Font" menu entry
+ */
+ void TextSettings(void);
+
+ /**
+ * callback, is executed on clicking the "Check spelling" menu entry
+ */
+ void SpellcheckSettings(void);
+};
#endif // SEEN_SP_INTERFACE_H
diff --git a/src/io/gzipstream.cpp b/src/io/gzipstream.cpp
index ed94974fe..cbe29a41e 100644
--- a/src/io/gzipstream.cpp
+++ b/src/io/gzipstream.cpp
@@ -38,6 +38,7 @@ GzipInputStream::GzipInputStream(InputStream &sourceStream)
totalIn(0),
totalOut(0),
outputBuf(NULL),
+ srcBuf(NULL),
crc(0),
srcCrc(0),
srcSiz(0),
@@ -57,11 +58,11 @@ GzipInputStream::~GzipInputStream()
close();
if ( srcBuf ) {
free(srcBuf);
- srcBuf = 0;
+ srcBuf = NULL;
}
if ( outputBuf ) {
free(outputBuf);
- outputBuf = 0;
+ outputBuf = NULL;
}
}
@@ -94,11 +95,11 @@ void GzipInputStream::close()
if ( srcBuf ) {
free(srcBuf);
- srcBuf = 0;
+ srcBuf = NULL;
}
if ( outputBuf ) {
free(outputBuf);
- outputBuf = 0;
+ outputBuf = NULL;
}
closed = true;
}
@@ -117,10 +118,9 @@ int GzipInputStream::get()
} else {
loaded = true;
- int zerr = Z_OK;
if ( outputBufPos >= outputBufLen ) {
// time to read more, if we can
- zerr = fetchMore();
+ fetchMore();
}
if ( outputBufPos < outputBufLen ) {
@@ -201,13 +201,13 @@ bool GzipInputStream::load()
//OS
val = (int)srcBuf[9];
- int cur = 10;
// if ( flags & FEXTRA ) {
// headerLen += 2;
// int xlen =
// TODO deal with optional header parts
// }
if ( flags & FNAME ) {
+ int cur = 10;
while ( srcBuf[cur] )
{
cur++;
@@ -229,10 +229,6 @@ bool GzipInputStream::load()
| ((0x0ff & srcBuf[srcLen - 4]) << 0);
//printf("srcSiz:%lx/%ld\n", srcSiz, srcSiz);
- if ( srcSiz <= 0 ) {
- return false;
- }
-
//outputBufLen = srcSiz + srcSiz/100 + 14;
unsigned char *data = srcBuf + headerLen;
diff --git a/src/knot-holder-entity.h b/src/knot-holder-entity.h
index 5422e6d1b..ec936d464 100644
--- a/src/knot-holder-entity.h
+++ b/src/knot-holder-entity.h
@@ -25,6 +25,12 @@ struct SPKnot;
class SPDesktop;
class KnotHolder;
+namespace Inkscape {
+namespace LivePathEffect {
+ class Effect;
+}
+}
+
typedef void (* SPKnotHolderSetFunc) (SPItem *item, Geom::Point const &p, Geom::Point const &origin, guint state);
typedef Geom::Point (* SPKnotHolderGetFunc) (SPItem *item);
/* fixme: Think how to make callbacks most sensitive (Lauris) */
@@ -42,12 +48,6 @@ public:
SPKnotModeType mode = SP_KNOT_MODE_XOR,
guint32 color = 0xffffff00);
- /* derived classes used for LPE knotholder handles use this to indicate that they
- must not be deleted when a knotholder is destroyed */
- // TODO: it would be nice to ditch this but then we need to dynamically create instances of different
- // KnotHolderEntity classes in Effect::addKnotHolderEntities. How to do this???
- virtual bool isDeletable() { return true; }
-
/* the get/set/click handlers are virtual functions; each handler class for a knot
should be derived from KnotHolderEntity and override these functions */
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) = 0;
@@ -83,7 +83,10 @@ public:
// derived KnotHolderEntity class for LPEs
class LPEKnotHolderEntity : public KnotHolderEntity {
- virtual bool isDeletable() { return false; }
+public:
+ LPEKnotHolderEntity(Inkscape::LivePathEffect::Effect *effect) : _effect(effect) {};
+protected:
+ Inkscape::LivePathEffect::Effect *_effect;
};
/* pattern manipulation */
diff --git a/src/knot.cpp b/src/knot.cpp
index aee4fe1a5..770618470 100644
--- a/src/knot.cpp
+++ b/src/knot.cpp
@@ -36,6 +36,10 @@ using Inkscape::DocumentUndo;
GDK_POINTER_MOTION_HINT_MASK | \
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK)
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#endif
+
static bool nograb = false;
static bool grabbed = FALSE;
@@ -189,7 +193,7 @@ static void sp_knot_init(SPKnot *knot)
knot->size = 8;
knot->pos = Geom::Point(0, 0);
knot->grabbed_rel_pos = Geom::Point(0, 0);
- knot->anchor = GTK_ANCHOR_CENTER;
+ knot->anchor = SP_ANCHOR_CENTER;
knot->shape = SP_KNOT_SHAPE_SQUARE;
knot->mode = SP_KNOT_MODE_XOR;
knot->tip = NULL;
@@ -241,7 +245,11 @@ static void sp_knot_dispose(GObject *object)
for (gint i = 0; i < SP_KNOT_VISIBLE_STATES; i++) {
if (knot->cursor[i]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(knot->cursor[i]);
+#else
gdk_cursor_unref(knot->cursor[i]);
+#endif
knot->cursor[i] = NULL;
}
}
@@ -411,7 +419,7 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
break;
case GDK_KEY_PRESS: // keybindings for knot
switch (get_group0_keyval(&event->key)) {
- case GDK_Escape:
+ case GDK_KEY_Escape:
sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
if (!nograb) {
sp_canvas_item_ungrab(knot->item, event->button.time);
@@ -472,7 +480,7 @@ SPKnot *sp_knot_new(SPDesktop *desktop, const gchar *tip)
knot->item = sp_canvas_item_new(sp_desktop_controls (desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"size", 8.0,
"filled", TRUE,
"fill_color", 0xffffff00,
diff --git a/src/knot.h b/src/knot.h
index 73bb226c6..c0d2f68e4 100644
--- a/src/knot.h
+++ b/src/knot.h
@@ -15,11 +15,12 @@
*/
#include <gdk/gdk.h>
-#include <gtk/gtk.h>
#include <2geom/point.h>
#include "knot-enums.h"
#include <stddef.h>
#include <sigc++/sigc++.h>
+#include "enums.h"
+#include <gtk/gtk.h>
class SPDesktop;
class SPKnot;
@@ -32,6 +33,7 @@ struct SPCanvasItem;
#define SP_IS_KNOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_KNOT))
#define SP_IS_KNOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_KNOT))
+
/**
* Desktop-bound visual control object.
*
@@ -47,7 +49,7 @@ struct SPKnot : GObject {
Geom::Point pos; /**< Our desktop coordinates. */
Geom::Point grabbed_rel_pos; /**< Grabbed relative position. */
Geom::Point drag_origin; /**< Origin of drag. */
- GtkAnchorType anchor; /**< Anchor. */
+ SPAnchorType anchor; /**< Anchor. */
SPKnotShapeType shape; /**< Shape type. */
SPKnotModeType mode;
@@ -80,7 +82,7 @@ struct SPKnot : GObject {
//TODO: all the members above should eventualle become private, accessible via setters/getters
inline void setSize (guint i) {size = i;}
inline void setShape (guint i) {shape = (SPKnotShapeType) i;}
- inline void setAnchor (guint i) {anchor = (GtkAnchorType) i;}
+ inline void setAnchor (guint i) {anchor = (SPAnchorType) i;}
inline void setMode (guint i) {mode = (SPKnotModeType) i;}
inline void setPixbuf (gpointer p) {pixbuf = p;}
inline void setFill (guint32 normal, guint32 mouseover, guint32 dragging) {
@@ -100,27 +102,51 @@ struct SPKnot : GObject {
}
inline void setCursor (GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging) {
if (cursor[SP_KNOT_STATE_NORMAL]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor[SP_KNOT_STATE_NORMAL]);
+#else
gdk_cursor_unref(cursor[SP_KNOT_STATE_NORMAL]);
+#endif
}
cursor[SP_KNOT_STATE_NORMAL] = normal;
if (normal) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_ref(normal);
+#else
gdk_cursor_ref(normal);
+#endif
}
if (cursor[SP_KNOT_STATE_MOUSEOVER]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor[SP_KNOT_STATE_MOUSEOVER]);
+#else
gdk_cursor_unref(cursor[SP_KNOT_STATE_MOUSEOVER]);
+#endif
}
cursor[SP_KNOT_STATE_MOUSEOVER] = mouseover;
if (mouseover) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_ref(mouseover);
+#else
gdk_cursor_ref(mouseover);
+#endif
}
if (cursor[SP_KNOT_STATE_DRAGGING]) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor[SP_KNOT_STATE_DRAGGING]);
+#else
gdk_cursor_unref(cursor[SP_KNOT_STATE_DRAGGING]);
+#endif
}
cursor[SP_KNOT_STATE_DRAGGING] = dragging;
if (dragging) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_ref(dragging);
+#else
gdk_cursor_ref(dragging);
+#endif
}
}
diff --git a/src/knotholder.cpp b/src/knotholder.cpp
index 91013ad2e..947f7c92a 100644
--- a/src/knotholder.cpp
+++ b/src/knotholder.cpp
@@ -66,15 +66,9 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun
KnotHolder::~KnotHolder() {
g_object_unref(G_OBJECT(item));
- for(std::list<KnotHolderEntity *>::iterator i = entity.begin(); i != entity.end(); ++i) {
- KnotHolderEntity* e = (*i);
- if (e->isDeletable()) {
- delete (*i);
- } else {
- // we must not delete the entity (since it's attached to an LPE parameter),
- // but the handle should be destroyed
- g_object_unref(e->knot);
- }
+ for (std::list<KnotHolderEntity *>::iterator i = entity.begin(); i != entity.end(); ++i)
+ {
+ delete (*i);
(*i) = NULL;
}
entity.clear(); // is this necessary?
@@ -111,7 +105,8 @@ bool KnotHolder::knot_mouseover()
void
KnotHolder::knot_clicked_handler(SPKnot *knot, guint state)
{
- KnotHolder *knot_holder = this;
+ KnotHolder *knot_holder = this;
+ SPItem *saved_item = this->item;
for(std::list<KnotHolderEntity *>::iterator i = knot_holder->entity.begin(); i != knot_holder->entity.end(); ++i) {
KnotHolderEntity *e = *i;
@@ -122,33 +117,33 @@ KnotHolder::knot_clicked_handler(SPKnot *knot, guint state)
}
}
- if (SP_IS_SHAPE(item)) {
- SP_SHAPE(item)->setShape();
+ if (SP_IS_SHAPE(saved_item)) {
+ SP_SHAPE(saved_item)->setShape();
}
knot_holder->update_knots();
unsigned int object_verb = SP_VERB_NONE;
- if (SP_IS_RECT(item))
+ if (SP_IS_RECT(saved_item))
object_verb = SP_VERB_CONTEXT_RECT;
- else if (SP_IS_BOX3D(item))
+ else if (SP_IS_BOX3D(saved_item))
object_verb = SP_VERB_CONTEXT_3DBOX;
- else if (SP_IS_GENERICELLIPSE(item))
+ else if (SP_IS_GENERICELLIPSE(saved_item))
object_verb = SP_VERB_CONTEXT_ARC;
- else if (SP_IS_STAR(item))
+ else if (SP_IS_STAR(saved_item))
object_verb = SP_VERB_CONTEXT_STAR;
- else if (SP_IS_SPIRAL(item))
+ else if (SP_IS_SPIRAL(saved_item))
object_verb = SP_VERB_CONTEXT_SPIRAL;
- else if (SP_IS_OFFSET(item)) {
- if (SP_OFFSET(item)->sourceHref)
+ else if (SP_IS_OFFSET(saved_item)) {
+ if (SP_OFFSET(saved_item)->sourceHref)
object_verb = SP_VERB_SELECTION_LINKED_OFFSET;
else
object_verb = SP_VERB_SELECTION_DYNAMIC_OFFSET;
}
// for drag, this is done by ungrabbed_handler, but for click we must do it here
- DocumentUndo::done(item->document, object_verb,
+ DocumentUndo::done(saved_item->document, object_verb,
_("Change handle"));
}
diff --git a/src/knotholder.h b/src/knotholder.h
index 9a4dda1da..463436be6 100644
--- a/src/knotholder.h
+++ b/src/knotholder.h
@@ -27,6 +27,9 @@ namespace Inkscape {
namespace XML {
class Node;
}
+namespace LivePathEffect {
+class PowerStrokePointArrayParamKnotHolderEntity;
+}
}
class KnotHolder {
@@ -50,6 +53,7 @@ public:
bool knot_mouseover();
friend class ShapeEditor;
+ friend class Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity;
protected:
SPDesktop *desktop;
diff --git a/src/libgdl/Makefile_insert b/src/libgdl/Makefile_insert
index e151fd5d6..788df0673 100644
--- a/src/libgdl/Makefile_insert
+++ b/src/libgdl/Makefile_insert
@@ -1,5 +1,46 @@
## Makefile.am fragment sourced by src/Makefile.am.
+if WITH_EXT_GDL
+
+EXTRA_DIST += \
+ libgdl/gdl-tools.h \
+ libgdl/gdl-dock-object.h \
+ libgdl/gdl-dock-master.h \
+ libgdl/gdl-dock.h \
+ libgdl/gdl-dock-item.h \
+ libgdl/gdl-dock-notebook.h \
+ libgdl/gdl-dock-paned.h \
+ libgdl/gdl-dock-tablabel.h \
+ libgdl/gdl-dock-placeholder.h \
+ libgdl/gdl-dock-bar.h \
+ libgdl/gdl-stock-icons.h \
+ libgdl/gdl-i18n.h \
+ libgdl/gdl-i18n.c \
+ libgdl/gdl-dock-object.c \
+ libgdl/gdl-dock-master.c \
+ libgdl/gdl-dock.c \
+ libgdl/gdl-dock-item.c \
+ libgdl/gdl-dock-item-button-image.c \
+ libgdl/gdl-dock-item-button-image.h \
+ libgdl/gdl-dock-item-grip.h \
+ libgdl/gdl-dock-item-grip.c \
+ libgdl/gdl-dock-notebook.c \
+ libgdl/gdl-dock-paned.c \
+ libgdl/gdl-dock-tablabel.c \
+ libgdl/gdl-dock-placeholder.c \
+ libgdl/gdl-dock-bar.c \
+ libgdl/gdl-switcher.h \
+ libgdl/gdl-switcher.c \
+ libgdl/gdl-win32.h \
+ libgdl/gdl-win32.c \
+ libgdl/libgdltypebuiltins.h \
+ libgdl/libgdltypebuiltins.c \
+ libgdl/libgdlmarshal.h \
+ libgdl/libgdlmarshal.c \
+ libgdl/gdl.h
+
+else # WITH_EXT_GDL
+
libgdl/all: libgdl/libgdl.a
libgdl/clean:
@@ -41,3 +82,5 @@ libgdl_libgdl_a_SOURCES = \
libgdl/libgdlmarshal.h \
libgdl/libgdlmarshal.c \
libgdl/gdl.h
+
+endif
diff --git a/src/libnrtype/Layout-TNG-OutIter.cpp b/src/libnrtype/Layout-TNG-OutIter.cpp
index 1d300b210..4e61c10a0 100644
--- a/src/libnrtype/Layout-TNG-OutIter.cpp
+++ b/src/libnrtype/Layout-TNG-OutIter.cpp
@@ -446,6 +446,8 @@ void Layout::queryCursorShape(iterator const &it, Geom::Point &position, double
} else {
span = &_spans[_characters[it._char_index].in_span];
x = _chunks[span->in_chunk].left_x + span->x_start + _characters[it._char_index].x - _chunks[0].left_x;
+ if (_directions_are_orthogonal(_blockProgression(), TOP_TO_BOTTOM))
+ x -= span->line_height.descent;
if (it._char_index != 0)
span = &_spans[_characters[it._char_index - 1].in_span];
}
@@ -454,7 +456,7 @@ void Layout::queryCursorShape(iterator const &it, Geom::Point &position, double
if (x_on_path < 0.0) x_on_path = 0.0;
int unused = 0;
- // as far as I know these functions are const, they're just not marked as such
+ // as far as I know these functions are const, they're just not marked as such
Path::cut_position *path_parameter_list = const_cast<Path*>(_path_fitted)->CurvilignToPosition(1, &x_on_path, unused);
Path::cut_position path_parameter;
if (path_parameter_list != NULL && path_parameter_list[0].piece >= 0)
@@ -472,9 +474,15 @@ void Layout::queryCursorShape(iterator const &it, Geom::Point &position, double
point += x * tangent;
if (x > path_length )
point += (x - path_length) * tangent;
- rotation = atan2(tangent);
- position[Geom::X] = point[Geom::X] - tangent[Geom::Y] * span->baseline_shift;
- position[Geom::Y] = point[Geom::Y] + tangent[Geom::X] * span->baseline_shift;
+ if (_directions_are_orthogonal(_blockProgression(), TOP_TO_BOTTOM)) {
+ rotation = atan2(-tangent[Geom::X], tangent[Geom::Y]);
+ position[Geom::X] = point[Geom::Y] - tangent[Geom::X] * span->baseline_shift;
+ position[Geom::Y] = point[Geom::X] + tangent[Geom::Y] * span->baseline_shift;
+ } else {
+ rotation = atan2(tangent);
+ position[Geom::X] = point[Geom::X] - tangent[Geom::Y] * span->baseline_shift;
+ position[Geom::Y] = point[Geom::Y] + tangent[Geom::X] * span->baseline_shift;
+ }
} else {
// text is not on a path
if (it._char_index >= _characters.size()) {
diff --git a/src/libnrtype/Layout-TNG-Output.cpp b/src/libnrtype/Layout-TNG-Output.cpp
index 07ed6062f..2830a8026 100644
--- a/src/libnrtype/Layout-TNG-Output.cpp
+++ b/src/libnrtype/Layout-TNG-Output.cpp
@@ -426,16 +426,21 @@ void Layout::fitToPathAlign(SVGLength const &startOffset, Path const &path)
Geom::Point tangent;
const_cast<Path&>(path).PointAndTangentAt(point_otp[0].piece, point_otp[0].t, point, tangent);
_empty_cursor_shape.position = point;
- _empty_cursor_shape.rotation = atan2(tangent[Geom::Y], tangent[Geom::X]);
+ if (_directions_are_orthogonal(_blockProgression(), TOP_TO_BOTTOM)) {
+ _empty_cursor_shape.rotation = atan2(-tangent[Geom::X], tangent[Geom::Y]);
+ } else {
+ _empty_cursor_shape.rotation = atan2(tangent[Geom::Y], tangent[Geom::X]);
+ }
}
}
for (unsigned char_index = 0 ; char_index < _characters.size() ; ) {
- int next_cluster_glyph_index;
+ unsigned current_cluster_glyph_index, next_cluster_glyph_index;
unsigned next_cluster_char_index;
- double character_advance;
Span const &span = _characters[char_index].span(this);
+ current_cluster_glyph_index = _characters[char_index].in_glyph;
+
for (next_cluster_char_index = char_index + 1 ; next_cluster_char_index < _characters.size() ; next_cluster_char_index++) {
if (_characters[next_cluster_char_index].in_glyph != -1 && _characters[next_cluster_char_index].char_attributes.is_cursor_position)
break;
@@ -443,17 +448,15 @@ void Layout::fitToPathAlign(SVGLength const &startOffset, Path const &path)
if (next_cluster_char_index == _characters.size()) {
next_cluster_glyph_index = _glyphs.size();
- character_advance = 0.0; // arbitrary because we're not going to advance
} else {
next_cluster_glyph_index = _characters[next_cluster_char_index].in_glyph;
- character_advance = (_glyphs[next_cluster_glyph_index].x + _glyphs[next_cluster_glyph_index].chunk(this).left_x)
- - (_glyphs[_characters[char_index].in_glyph].x + span.chunk(this).left_x);
}
double start_offset = offset + span.x_start + _characters[char_index].x;
double cluster_width = 0.0;
- for (int glyph_index = _characters[char_index].in_glyph ; glyph_index < next_cluster_glyph_index ; glyph_index++)
+ for (int glyph_index = current_cluster_glyph_index ; glyph_index < next_cluster_glyph_index ; glyph_index++)
cluster_width += _glyphs[glyph_index].width;
+ // TODO block progression?
if (span.direction == RIGHT_TO_LEFT)
start_offset -= cluster_width;
double end_offset = start_offset + cluster_width;
@@ -499,15 +502,23 @@ void Layout::fitToPathAlign(SVGLength const &startOffset, Path const &path)
}
}
- double rotation = atan2(tangent[1], tangent[0]);
- for (int glyph_index = _characters[char_index].in_glyph ; glyph_index < next_cluster_glyph_index ; glyph_index++) {
- double tangent_shift = -cluster_width * 0.5 + _glyphs[glyph_index].x - (_characters[char_index].x + span.x_start);
- double normal_shift = _glyphs[glyph_index].y;
- if (span.direction == RIGHT_TO_LEFT)
- tangent_shift += cluster_width;
- _glyphs[glyph_index].x = midpoint[0] - span.chunk(this).left_x + tangent[0] * tangent_shift - tangent[1] * normal_shift;
- _glyphs[glyph_index].y = midpoint[1] - _lines.front().baseline_y + tangent[1] * tangent_shift + tangent[0] * normal_shift;
- _glyphs[glyph_index].rotation += rotation;
+ if (_directions_are_orthogonal(_blockProgression(), TOP_TO_BOTTOM)) {
+ double rotation = atan2(-tangent[Geom::X], tangent[Geom::Y]);
+ for (int glyph_index = current_cluster_glyph_index; glyph_index < next_cluster_glyph_index ; glyph_index++) {
+ _glyphs[glyph_index].x = midpoint[Geom::Y] - tangent[Geom::X] * _glyphs[glyph_index].y - span.chunk(this).left_x;
+ _glyphs[glyph_index].y = midpoint[Geom::X] + tangent[Geom::Y] * _glyphs[glyph_index].y - _lines.front().baseline_y;
+ _glyphs[glyph_index].rotation += rotation;
+ }
+ } else {
+ double rotation = atan2(tangent[Geom::Y], tangent[Geom::X]);
+ for (int glyph_index = current_cluster_glyph_index; glyph_index < next_cluster_glyph_index ; glyph_index++) {
+ double tangent_shift = -cluster_width * 0.5 + _glyphs[glyph_index].x - (_characters[char_index].x + span.x_start);
+ if (span.direction == RIGHT_TO_LEFT)
+ tangent_shift += cluster_width;
+ _glyphs[glyph_index].x = midpoint[Geom::X] + tangent[Geom::X] * tangent_shift - tangent[Geom::Y] * _glyphs[glyph_index].y - span.chunk(this).left_x;
+ _glyphs[glyph_index].y = midpoint[Geom::Y] + tangent[Geom::Y] * tangent_shift + tangent[Geom::X] * _glyphs[glyph_index].y - _lines.front().baseline_y;
+ _glyphs[glyph_index].rotation += rotation;
+ }
}
_input_truncated = false;
} else { // outside the bounds of the path: hide the glyphs
diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp
index 0b1fe1160..44e57addf 100644
--- a/src/live_effects/effect.cpp
+++ b/src/live_effects/effect.cpp
@@ -282,7 +282,8 @@ Effect::createAndApply(EffectType type, SPDocument *doc, SPItem *item)
}
Effect::Effect(LivePathEffectObject *lpeobject)
- : oncanvasedit_it(0),
+ : _provides_knotholder_entities(false),
+ oncanvasedit_it(0),
is_visible(_("Is visible?"), _("If unchecked, the effect remains applied to the object but is temporarily disabled on canvas"), "is_visible", &wr, this, true),
show_orig_path(false),
lpeobj(lpeobject),
@@ -468,12 +469,6 @@ Effect::registerParameter(Parameter * param)
param_vector.push_back(param);
}
-// TODO: should we provide a way to alter the handle's appearance?
-void
-Effect::registerKnotHolderHandle(KnotHolderEntity* entity, const char* descr)
-{
- kh_entity_vector.push_back(std::make_pair(entity, descr));
-}
/**
* Add all registered LPE knotholder handles to the knotholder
@@ -491,23 +486,6 @@ Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
}
}
-void
-Effect::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
- // TODO: The entities in kh_entity_vector are already instantiated during the call
- // to registerKnotHolderHandle(), but they are recreated here. Also, we must not
- // delete them when the knotholder is destroyed, whence the clumsy function
- // isDeletable(). If we could create entities of different classes dynamically,
- // this would be much nicer. How to do this?
- std::vector<std::pair<KnotHolderEntity*, const char*> >::iterator i;
- for (i = kh_entity_vector.begin(); i != kh_entity_vector.end(); ++i) {
- KnotHolderEntity *entity = i->first;
- const char *descr = i->second;
-
- entity->create(desktop, item, knotholder, descr);
- knotholder->add(entity);
- }
-}
-
/**
* Return a vector of PathVectors which contain all helperpaths that should be drawn by the effect.
* This is the function called by external code like SPLPEItem.
@@ -688,8 +666,9 @@ bool
Effect::providesKnotholder()
{
// does the effect actively provide any knotholder entities of its own?
- if (kh_entity_vector.size() > 0)
+ if (_provides_knotholder_entities) {
return true;
+ }
// otherwise: are there any parameters that have knotholderentities?
for (std::vector<Parameter *>::iterator p = param_vector.begin(); p != param_vector.end(); ++p) {
diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h
index 50d4c142b..008de5ea8 100644
--- a/src/live_effects/effect.h
+++ b/src/live_effects/effect.h
@@ -124,15 +124,14 @@ protected:
doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
void registerParameter(Parameter * param);
- void registerKnotHolderHandle(KnotHolderEntity* entity, const char* descr);
Parameter * getNextOncanvasEditableParam();
- void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
+ virtual void addKnotHolderEntities(KnotHolder * /*knotholder*/, SPDesktop * /*desktop*/, SPItem * /*item*/) {};
virtual void addCanvasIndicators(SPLPEItem *lpeitem, std::vector<Geom::PathVector> &hp_vec);
std::vector<Parameter *> param_vector;
- std::vector<std::pair<KnotHolderEntity*, const char*> > kh_entity_vector;
+ bool _provides_knotholder_entities;
int oncanvasedit_it;
BoolParam is_visible;
diff --git a/src/live_effects/lpe-angle_bisector.cpp b/src/live_effects/lpe-angle_bisector.cpp
index aee4f48a1..99110c51e 100644
--- a/src/live_effects/lpe-angle_bisector.cpp
+++ b/src/live_effects/lpe-angle_bisector.cpp
@@ -1,47 +1,38 @@
#define INKSCAPE_LPE_ANGLE_BISECTOR_CPP
-/** \file
- * LPE <angle_bisector> implementation, used as an example for a base starting class
- * when implementing new LivePathEffects.
- *
- * In vi, three global search-and-replaces will let you rename everything
- * in this and the .h file:
- *
- * :%s/ANGLE_BISECTOR/YOURNAME/g
- * :%s/AngleBisector/Yourname/g
- * :%s/angle_bisector/yourname/g
- */
/*
* Authors:
- * Johan Engelen
+ * Maximilian Albert <maximilian.albert@gmail.com>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ * Copyright (C) Authors 2007-2012
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include "live_effects/lpe-angle_bisector.h"
-// You might need to include other 2geom files. You can add them here:
#include <2geom/path.h>
#include <2geom/sbasis-to-bezier.h>
#include "sp-lpe-item.h"
+#include "knot-holder-entity.h"
+#include "knotholder.h"
namespace Inkscape {
namespace LivePathEffect {
namespace AB {
-class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity
-{
+class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityLeftEnd(LPEAngleBisector* effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
-class KnotHolderEntityRightEnd : public LPEKnotHolderEntity
-{
+class KnotHolderEntityRightEnd : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityRightEnd(LPEAngleBisector* effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
@@ -54,12 +45,10 @@ LPEAngleBisector::LPEAngleBisector(LivePathEffectObject *lpeobject) :
length_right(_("Length right"), _("Specifies the right end of the bisector"), "length-right", &wr, this, 250)
{
show_orig_path = true;
+ _provides_knotholder_entities = true;
registerParameter( dynamic_cast<Parameter *>(&length_left) );
registerParameter( dynamic_cast<Parameter *>(&length_right) );
-
- registerKnotHolderHandle(new AB::KnotHolderEntityLeftEnd(), _("Adjust the \"left\" end of the bisector"));
- registerKnotHolderHandle(new AB::KnotHolderEntityRightEnd(), _("Adjust the \"right\" of the bisector"));
}
LPEAngleBisector::~LPEAngleBisector()
@@ -89,25 +78,32 @@ LPEAngleBisector::doEffect_path (std::vector<Geom::Path> const & path_in)
return path_from_piecewise(output, LPE_CONVERSION_TOLERANCE);
}
-namespace AB {
-// TODO: make this more generic
-static LPEAngleBisector *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != ANGLE_BISECTOR) {
- g_print ("Warning: Effect is not of type LPEAngleBisector!\n");
- return NULL;
+void
+LPEAngleBisector::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new AB::KnotHolderEntityLeftEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the \"left\" end of the bisector")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
}
- return static_cast<LPEAngleBisector *>(effect);
-}
+ {
+ KnotHolderEntity *e = new AB::KnotHolderEntityRightEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the \"right\" of the bisector")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+};
+
+namespace AB {
void
KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
- LPEAngleBisector *lpe = get_effect(item);
-
+ LPEAngleBisector *lpe = dynamic_cast<LPEAngleBisector *>(_effect);
+
Geom::Point const s = snap_knot_position(p);
double lambda = Geom::nearest_point(s, lpe->ptA, lpe->dir);
@@ -119,8 +115,8 @@ KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*ori
void
KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
- LPEAngleBisector *lpe = get_effect(item);
-
+ LPEAngleBisector *lpe = dynamic_cast<LPEAngleBisector *>(_effect);
+
Geom::Point const s = snap_knot_position(p);
double lambda = Geom::nearest_point(s, lpe->ptA, lpe->dir);
@@ -132,14 +128,14 @@ KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*or
Geom::Point
KnotHolderEntityLeftEnd::knot_get()
{
- LPEAngleBisector *lpe = get_effect(item);
+ LPEAngleBisector *lpe = dynamic_cast<LPEAngleBisector *>(_effect);
return lpe->ptA - lpe->dir * lpe->length_left;
}
Geom::Point
KnotHolderEntityRightEnd::knot_get()
{
- LPEAngleBisector *lpe = get_effect(item);
+ LPEAngleBisector *lpe = dynamic_cast<LPEAngleBisector *>(_effect);
return lpe->ptA + lpe->dir * lpe->length_right;
}
diff --git a/src/live_effects/lpe-angle_bisector.h b/src/live_effects/lpe-angle_bisector.h
index 0fd4c112f..95048751e 100644
--- a/src/live_effects/lpe-angle_bisector.h
+++ b/src/live_effects/lpe-angle_bisector.h
@@ -1,22 +1,18 @@
#ifndef INKSCAPE_LPE_ANGLE_BISECTOR_H
#define INKSCAPE_LPE_ANGLE_BISECTOR_H
-/** \file
- * LPE <angle_bisector> implementation, see lpe-angle_bisector.cpp.
- */
-
/*
* Authors:
- * Johan Engelen
+ * Maximilian Albert <maximilian.albert@gmail.com>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ * Copyright (C) Authors 2007-2012
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include "live_effects/effect.h"
#include "live_effects/parameter/parameter.h"
-#include "live_effects/parameter/point.h"
namespace Inkscape {
namespace LivePathEffect {
@@ -36,6 +32,7 @@ public:
friend class AB::KnotHolderEntityLeftEnd;
friend class AB::KnotHolderEntityRightEnd;
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
//private:
ScalarParam length_left;
diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp
index e77d80994..c61f4c3c1 100644
--- a/src/live_effects/lpe-copy_rotate.cpp
+++ b/src/live_effects/lpe-copy_rotate.cpp
@@ -4,10 +4,10 @@
*/
/*
* Authors:
- * Maximilian Albert
+ * Maximilian Albert <maximilian.albert@gmail.com>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
- * Copyright (C) Maximilian Albert 2008 <maximilian.albert@gmail.com>
+ * Copyright (C) Authors 2007-2012
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -21,21 +21,24 @@
#include <2geom/d2-sbasis.h>
#include <2geom/angle.h>
+#include "knot-holder-entity.h"
+#include "knotholder.h"
+
namespace Inkscape {
namespace LivePathEffect {
namespace CR {
-class KnotHolderEntityStartingAngle : public LPEKnotHolderEntity
-{
+class KnotHolderEntityStartingAngle : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityStartingAngle(LPECopyRotate *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
-class KnotHolderEntityRotationAngle : public LPEKnotHolderEntity
-{
+class KnotHolderEntityRotationAngle : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityRotationAngle(LPECopyRotate *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
@@ -51,6 +54,7 @@ LPECopyRotate::LPECopyRotate(LivePathEffectObject *lpeobject) :
dist_angle_handle(100)
{
show_orig_path = true;
+ _provides_knotholder_entities = true;
// register all your parameters here, so Inkscape knows which parameters this effect has:
registerParameter( dynamic_cast<Parameter *>(&starting_angle) );
@@ -58,12 +62,8 @@ LPECopyRotate::LPECopyRotate(LivePathEffectObject *lpeobject) :
registerParameter( dynamic_cast<Parameter *>(&num_copies) );
registerParameter( dynamic_cast<Parameter *>(&origin) );
- registerKnotHolderHandle(new CR::KnotHolderEntityStartingAngle(), _("Adjust the starting angle"));
- registerKnotHolderHandle(new CR::KnotHolderEntityRotationAngle(), _("Adjust the rotation angle"));
-
num_copies.param_make_integer(true);
num_copies.param_set_range(0, 1000);
-
}
LPECopyRotate::~LPECopyRotate()
@@ -127,26 +127,32 @@ LPECopyRotate::addCanvasIndicators(SPLPEItem */*lpeitem*/, std::vector<Geom::Pat
hp_vec.push_back(pathv);
}
+void
+LPECopyRotate::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new CR::KnotHolderEntityStartingAngle(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the starting angle")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+ {
+ KnotHolderEntity *e = new CR::KnotHolderEntityRotationAngle(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the rotation angle")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+};
+
namespace CR {
using namespace Geom;
-// TODO: make this more generic
-static LPECopyRotate *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != COPY_ROTATE) {
- g_print ("Warning: Effect is not of type LPECopyRotate!\n");
- return NULL;
- }
- return static_cast<LPECopyRotate *>(effect);
-}
-
void
KnotHolderEntityStartingAngle::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
{
- LPECopyRotate* lpe = get_effect(item);
+ LPECopyRotate* lpe = dynamic_cast<LPECopyRotate *>(_effect);
Geom::Point const s = snap_knot_position(p);
@@ -166,7 +172,7 @@ KnotHolderEntityStartingAngle::knot_set(Geom::Point const &p, Geom::Point const
void
KnotHolderEntityRotationAngle::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
{
- LPECopyRotate* lpe = get_effect(item);
+ LPECopyRotate* lpe = dynamic_cast<LPECopyRotate *>(_effect);
Geom::Point const s = snap_knot_position(p);
@@ -186,19 +192,21 @@ KnotHolderEntityRotationAngle::knot_set(Geom::Point const &p, Geom::Point const
Geom::Point
KnotHolderEntityStartingAngle::knot_get()
{
- LPECopyRotate* lpe = get_effect(item);
+ LPECopyRotate* lpe = dynamic_cast<LPECopyRotate *>(_effect);
return snap_knot_position(lpe->start_pos);
}
Geom::Point
KnotHolderEntityRotationAngle::knot_get()
{
- LPECopyRotate* lpe = get_effect(item);
+ LPECopyRotate* lpe = dynamic_cast<LPECopyRotate *>(_effect);
return snap_knot_position(lpe->rot_pos);
}
} // namespace CR
+
+
/* ######################## */
} //namespace LivePathEffect
diff --git a/src/live_effects/lpe-copy_rotate.h b/src/live_effects/lpe-copy_rotate.h
index 8cabdfb48..b14bc4128 100644
--- a/src/live_effects/lpe-copy_rotate.h
+++ b/src/live_effects/lpe-copy_rotate.h
@@ -38,6 +38,7 @@ public:
/* the knotholder entity classes must be declared friends */
friend class CR::KnotHolderEntityStartingAngle;
friend class CR::KnotHolderEntityRotationAngle;
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
protected:
virtual void addCanvasIndicators(SPLPEItem *lpeitem, std::vector<Geom::PathVector> &hp_vec);
diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp
index d8c13a515..7a66b80c9 100644
--- a/src/live_effects/lpe-knot.cpp
+++ b/src/live_effects/lpe-knot.cpp
@@ -5,8 +5,9 @@
/* Authors:
* Jean-Francois Barraud <jf.barraud@gmail.com>
* Abhishek Sharma
+ * Johan Engelen
*
- * Copyright (C) 2007 Authors
+ * Copyright (C) 2007-2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -18,6 +19,7 @@
#include "svg/svg.h"
#include "style.h"
#include "knot-holder-entity.h"
+#include "knotholder.h"
#include <2geom/sbasis-to-bezier.h>
#include <2geom/sbasis.h>
@@ -38,11 +40,9 @@
namespace Inkscape {
namespace LivePathEffect {
-class KnotHolderEntityCrossingSwitcher : public LPEKnotHolderEntity
-{
+class KnotHolderEntityCrossingSwitcher : public LPEKnotHolderEntity {
public:
- virtual ~KnotHolderEntityCrossingSwitcher() {}
-
+ KnotHolderEntityCrossingSwitcher(LPEKnot *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
virtual void knot_click(guint state);
@@ -357,10 +357,11 @@ LPEKnot::LPEKnot(LivePathEffectObject *lpeobject) :
registerParameter( dynamic_cast<Parameter *>(&switcher_size) );
registerParameter( dynamic_cast<Parameter *>(&crossing_points_vector) );
- registerKnotHolderHandle(new KnotHolderEntityCrossingSwitcher(), _("Drag to select a crossing, click to flip it"));
crossing_points = LPEKnotNS::CrossingPoints();
selectedCrossing = 0;
switcher = Geom::Point(0,0);
+
+ _provides_knotholder_entities = true;
}
LPEKnot::~LPEKnot()
@@ -582,18 +583,6 @@ LPEKnot::doBeforeEffect (SPLPEItem *lpeitem)
updateSwitcher();
}
-
-static LPEKnot *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != KNOT) {
- g_print ("Warning: Effect is not of type LPEKnot!\n");
- return NULL;
- }
- return static_cast<LPEKnot *>(effect);
-}
-
void
LPEKnot::addCanvasIndicators(SPLPEItem */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
{
@@ -618,9 +607,21 @@ LPEKnot::addCanvasIndicators(SPLPEItem */*lpeitem*/, std::vector<Geom::PathVecto
}
void
+LPEKnot::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new KnotHolderEntityCrossingSwitcher(this);
+ e->create( desktop, item, knotholder,
+ _("Drag to select a crossing, click to flip it")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+};
+
+
+void
KnotHolderEntityCrossingSwitcher::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
- LPEKnot* lpe = get_effect(item);
+ LPEKnot* lpe = dynamic_cast<LPEKnot *>(_effect);
lpe->selectedCrossing = idx_of_nearest(lpe->crossing_points,p);
lpe->updateSwitcher();
@@ -631,14 +632,14 @@ KnotHolderEntityCrossingSwitcher::knot_set(Geom::Point const &p, Geom::Point con
Geom::Point
KnotHolderEntityCrossingSwitcher::knot_get()
{
- LPEKnot* lpe = get_effect(item);
+ LPEKnot* lpe = dynamic_cast<LPEKnot *>(_effect);
return snap_knot_position(lpe->switcher);
}
void
KnotHolderEntityCrossingSwitcher::knot_click(guint state)
{
- LPEKnot* lpe = get_effect(item);
+ LPEKnot* lpe = dynamic_cast<LPEKnot *>(_effect);
unsigned s = lpe->selectedCrossing;
if (s < lpe->crossing_points.size()){
if (state & GDK_SHIFT_MASK){
diff --git a/src/live_effects/lpe-knot.h b/src/live_effects/lpe-knot.h
index e3dcb0b7f..14c61a4e5 100644
--- a/src/live_effects/lpe-knot.h
+++ b/src/live_effects/lpe-knot.h
@@ -3,9 +3,9 @@
*/
/* Authors:
* Jean-Francois Barraud <jf.barraud@gmail.com>
- * Johan Engelen <j.b.c.engelen@utwente.nl>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) Johan Engelen 2007
+ * Copyright (C) Authors 2007-2012
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -61,6 +61,7 @@ public:
/* the knotholder entity classes must be declared friends */
friend class KnotHolderEntityCrossingSwitcher;
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
protected:
virtual void addCanvasIndicators(SPLPEItem *lpeitem, std::vector<Geom::PathVector> &hp_vec);
diff --git a/src/live_effects/lpe-parallel.cpp b/src/live_effects/lpe-parallel.cpp
index 5b373442b..4d15bf13e 100644
--- a/src/live_effects/lpe-parallel.cpp
+++ b/src/live_effects/lpe-parallel.cpp
@@ -6,7 +6,7 @@
* Authors:
* Maximilian Albert
*
- * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ * Copyright (C) Johan Engelen 2007-2012 <j.b.c.engelen@alumnus.utwente.nl>
* Copyright (C) Maximilian Albert 2008 <maximilian.albert@gmail.com>
*
* Released under GNU GPL, read the file 'COPYING' for more information
@@ -19,21 +19,24 @@
#include <2geom/path.h>
#include <2geom/transforms.h>
+#include "knot-holder-entity.h"
+#include "knotholder.h"
+
namespace Inkscape {
namespace LivePathEffect {
namespace Pl {
-class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity
-{
+class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityLeftEnd(LPEParallel *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
-class KnotHolderEntityRightEnd : public LPEKnotHolderEntity
-{
+class KnotHolderEntityRightEnd : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityRightEnd(LPEParallel *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
@@ -48,13 +51,11 @@ LPEParallel::LPEParallel(LivePathEffectObject *lpeobject) :
length_right(_("Length right"), _("Specifies the right end of the parallel"), "length-right", &wr, this, 150)
{
show_orig_path = true;
+ _provides_knotholder_entities = true;
registerParameter(dynamic_cast<Parameter *>(&offset_pt));
registerParameter( dynamic_cast<Parameter *>(&length_left) );
registerParameter( dynamic_cast<Parameter *>(&length_right) );
-
- registerKnotHolderHandle(new Pl::KnotHolderEntityLeftEnd(), _("Adjust the \"left\" end of the parallel"));
- registerKnotHolderHandle(new Pl::KnotHolderEntityRightEnd(), _("Adjust the \"right\" end of the parallel"));
}
LPEParallel::~LPEParallel()
@@ -93,27 +94,33 @@ LPEParallel::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd
return output + dir;
}
-namespace Pl {
-
-// TODO: make this more generic
-static LPEParallel *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != PARALLEL) {
- g_print ("Warning: Effect is not of type LPEParallel!\n");
- return NULL;
+void
+LPEParallel::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new Pl::KnotHolderEntityLeftEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the \"left\" end of the parallel")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
}
- return static_cast<LPEParallel *>(effect);
-}
+ {
+ KnotHolderEntity *e = new Pl::KnotHolderEntityRightEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the \"right\" end of the parallel")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+};
+
+namespace Pl {
void
KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
using namespace Geom;
- LPEParallel *lpe = get_effect(item);
-
+ LPEParallel *lpe = dynamic_cast<LPEParallel *>(_effect);
+
Geom::Point const s = snap_knot_position(p);
double lambda = L2(s - lpe->offset_pt) * sgn(dot(s - lpe->offset_pt, lpe->dir));
@@ -127,8 +134,8 @@ KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*or
{
using namespace Geom;
- LPEParallel *lpe = get_effect(item);
-
+ LPEParallel *lpe = dynamic_cast<LPEParallel *>(_effect);
+
Geom::Point const s = snap_knot_position(p);
double lambda = L2(s - lpe->offset_pt) * sgn(dot(s - lpe->offset_pt, lpe->dir));
@@ -140,14 +147,14 @@ KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*or
Geom::Point
KnotHolderEntityLeftEnd::knot_get()
{
- LPEParallel *lpe = get_effect(item);
+ LPEParallel *lpe = dynamic_cast<LPEParallel *>(_effect);
return lpe->C;
}
Geom::Point
KnotHolderEntityRightEnd::knot_get()
{
- LPEParallel *lpe = get_effect(item);
+ LPEParallel *lpe = dynamic_cast<LPEParallel *>(_effect);
return lpe->D;
}
diff --git a/src/live_effects/lpe-parallel.h b/src/live_effects/lpe-parallel.h
index 6dc426aa8..e23361675 100644
--- a/src/live_effects/lpe-parallel.h
+++ b/src/live_effects/lpe-parallel.h
@@ -39,6 +39,7 @@ public:
/* the knotholder entity classes must be declared friends */
friend class Pl::KnotHolderEntityLeftEnd;
friend class Pl::KnotHolderEntityRightEnd;
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
private:
PointParam offset_pt;
diff --git a/src/live_effects/lpe-perp_bisector.cpp b/src/live_effects/lpe-perp_bisector.cpp
index ac720b88b..ddf16cc9a 100644
--- a/src/live_effects/lpe-perp_bisector.cpp
+++ b/src/live_effects/lpe-perp_bisector.cpp
@@ -20,55 +20,48 @@
#include "sp-lpe-item.h"
#include <2geom/path.h>
+#include "knot-holder-entity.h"
+#include "knotholder.h"
+
namespace Inkscape {
namespace LivePathEffect {
namespace PB {
class KnotHolderEntityEnd : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityEnd(LPEPerpBisector *effect) : LPEKnotHolderEntity(effect) {};
void bisector_end_set(Geom::Point const &p, bool left = true);
};
class KnotHolderEntityLeftEnd : public KnotHolderEntityEnd {
public:
+ KnotHolderEntityLeftEnd(LPEPerpBisector *effect) : KnotHolderEntityEnd(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
class KnotHolderEntityRightEnd : public KnotHolderEntityEnd {
public:
+ KnotHolderEntityRightEnd(LPEPerpBisector *effect) : KnotHolderEntityEnd(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
-// TODO: Make this more generic
-static LPEPerpBisector *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != PERP_BISECTOR) {
- g_print ("Warning: Effect is not of type LPEPerpBisector!\n");
- return NULL;
- }
- return static_cast<LPEPerpBisector *>(effect);
-}
-
Geom::Point
KnotHolderEntityLeftEnd::knot_get() {
- Inkscape::LivePathEffect::LPEPerpBisector *lpe = get_effect(item);
+ LPEPerpBisector *lpe = dynamic_cast<LPEPerpBisector *>(_effect);
return Geom::Point(lpe->C);
}
Geom::Point
KnotHolderEntityRightEnd::knot_get() {
- Inkscape::LivePathEffect::LPEPerpBisector *lpe = get_effect(item);
+ LPEPerpBisector *lpe = dynamic_cast<LPEPerpBisector *>(_effect);
return Geom::Point(lpe->D);
}
void
KnotHolderEntityEnd::bisector_end_set(Geom::Point const &p, bool left) {
- Inkscape::LivePathEffect::LPEPerpBisector *lpe =
- dynamic_cast<Inkscape::LivePathEffect::LPEPerpBisector *> (sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item)));
+ LPEPerpBisector *lpe = dynamic_cast<LPEPerpBisector *>(_effect);
if (!lpe) return;
Geom::Point const s = snap_knot_position(p);
@@ -105,13 +98,11 @@ LPEPerpBisector::LPEPerpBisector(LivePathEffectObject *lpeobject) :
A(0,0), B(0,0), M(0,0), C(0,0), D(0,0), perp_dir(0,0)
{
show_orig_path = true;
+ _provides_knotholder_entities = true;
// register all your parameters here, so Inkscape knows which parameters this effect has:
registerParameter( dynamic_cast<Parameter *>(&length_left) );
registerParameter( dynamic_cast<Parameter *>(&length_right) );
-
- registerKnotHolderHandle(new PB::KnotHolderEntityLeftEnd(), _("Adjust the bisector's \"left\" end"));
- registerKnotHolderHandle(new PB::KnotHolderEntityRightEnd(), _("Adjust the bisector's \"right\" end"));
}
LPEPerpBisector::~LPEPerpBisector()
@@ -159,6 +150,24 @@ LPEPerpBisector::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const &
return output;
}
+void
+LPEPerpBisector::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new PB::KnotHolderEntityLeftEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the bisector's \"left\" end")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+ {
+ KnotHolderEntity *e = new PB::KnotHolderEntityRightEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the bisector's \"right\" end")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+};
+
/* ######################## */
} //namespace LivePathEffect
diff --git a/src/live_effects/lpe-perp_bisector.h b/src/live_effects/lpe-perp_bisector.h
index baa440822..823717e62 100644
--- a/src/live_effects/lpe-perp_bisector.h
+++ b/src/live_effects/lpe-perp_bisector.h
@@ -47,6 +47,7 @@ public:
friend class PB::KnotHolderEntityLeftEnd;
friend class PB::KnotHolderEntityRightEnd;
friend void PB::bisector_end_set(SPItem *item, Geom::Point const &p, bool left = true);
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
private:
ScalarParam length_left;
diff --git a/src/live_effects/lpe-perspective_path.cpp b/src/live_effects/lpe-perspective_path.cpp
index 9208d4aeb..d9df32076 100644
--- a/src/live_effects/lpe-perspective_path.cpp
+++ b/src/live_effects/lpe-perspective_path.cpp
@@ -4,9 +4,9 @@
*/
/* Authors:
* Maximilian Albert <maximilian.albert@gmail.com>
- * Johan Engelen <j.b.c.engelen@utwente.nl>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) 2007-2008 Authors
+ * Copyright (C) 2007-2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -18,6 +18,7 @@
#include "live_effects/lpe-perspective_path.h"
#include "sp-item-group.h"
#include "knot-holder-entity.h"
+#include "knotholder.h"
#include "inkscape.h"
@@ -31,6 +32,7 @@ namespace PP {
class KnotHolderEntityOffset : public LPEKnotHolderEntity
{
public:
+ KnotHolderEntityOffset(LPEPerspectivePath *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
@@ -53,14 +55,11 @@ LPEPerspectivePath::LPEPerspectivePath(LivePathEffectObject *lpeobject) :
registerParameter( dynamic_cast<Parameter *>(&offsety) );
registerParameter( dynamic_cast<Parameter *>(&uses_plane_xy) );
- registerKnotHolderHandle(new PP::KnotHolderEntityOffset(), _("Adjust the origin"));
-
concatenate_before_pwd2 = true; // don't split the path into its subpaths
+ _provides_knotholder_entities = true;
Persp3D *persp = persp3d_document_first_persp(inkscape_active_document());
-
Proj::TransfMat3x4 pmat = persp->perspective_impl->tmat;
-
pmat.copy_tmat(tmat);
}
@@ -138,26 +137,25 @@ LPEPerspectivePath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > cons
return output;
}
-namespace PP {
-
-// TODO: make this more generic
-static LPEPerspectivePath *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != PERSPECTIVE_PATH) {
- g_print ("Warning: Effect is not of type LPEPerspectivePath!\n");
- return NULL;
+void
+LPEPerspectivePath::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new PP::KnotHolderEntityOffset(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the origin")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
}
- return static_cast<LPEPerspectivePath *>(effect);
-}
+};
+
+namespace PP {
void
KnotHolderEntityOffset::knot_set(Geom::Point const &p, Geom::Point const &origin, guint /*state*/)
{
using namespace Geom;
- LPEPerspectivePath* lpe = get_effect(item);
+ LPEPerspectivePath* lpe = dynamic_cast<LPEPerspectivePath *>(_effect);
Geom::Point const s = snap_knot_position(p);
@@ -171,7 +169,7 @@ KnotHolderEntityOffset::knot_set(Geom::Point const &p, Geom::Point const &origin
Geom::Point
KnotHolderEntityOffset::knot_get()
{
- LPEPerspectivePath* lpe = get_effect(item);
+ LPEPerspectivePath* lpe = dynamic_cast<LPEPerspectivePath *>(_effect);
return lpe->orig + Geom::Point(lpe->offsetx, -lpe->offsety);
}
diff --git a/src/live_effects/lpe-perspective_path.h b/src/live_effects/lpe-perspective_path.h
index ad4d307c1..14321f52e 100644
--- a/src/live_effects/lpe-perspective_path.h
+++ b/src/live_effects/lpe-perspective_path.h
@@ -40,6 +40,7 @@ public:
/* the knotholder entity classes must be declared friends */
friend class PP::KnotHolderEntityOffset;
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
private:
// add the parameters for your effect here:
diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp
index d3843dc92..a9cf22f6a 100644
--- a/src/live_effects/lpe-powerstroke.cpp
+++ b/src/live_effects/lpe-powerstroke.cpp
@@ -14,6 +14,7 @@
#include "live_effects/lpe-powerstroke-interpolators.h"
#include "sp-shape.h"
+#include "style.h"
#include "display/curve.h"
#include <2geom/path.h>
@@ -33,18 +34,6 @@
namespace Geom {
// should all be moved to 2geom at some point
-Point unitTangentAt( D2<SBasis> const & a, Coord t, unsigned n = 3) {
- std::vector<Point> derivs = a.valueAndDerivatives(t, n);
- for (unsigned deriv_n = 1; deriv_n < derivs.size(); deriv_n++) {
- Coord length = derivs[deriv_n].length();
- if ( ! are_near(length, 0) ) {
- // length of derivative is non-zero, so return unit vector
- return derivs[deriv_n] / length;
- }
- }
- return Point (0,0);
-}
-
/** Find the point where two straight lines cross.
*/
boost::optional<Point> intersection_point( Point const & origin_a, Point const & vector_a,
@@ -182,11 +171,21 @@ LPEPowerStroke::doOnApply(SPLPEItem *lpeitem)
{
if (SP_IS_SHAPE(lpeitem)) {
std::vector<Geom::Point> points;
- Geom::PathVector pathv = SP_SHAPE(lpeitem)->_curve->get_pathvector();
- Geom::Path::size_type size = pathv.empty() ? 1 : pathv.front().size_open();
- points.push_back( Geom::Point(0,0) );
- points.push_back( Geom::Point(0.5*size,0) );
- points.push_back( Geom::Point(size,0) );
+ Geom::PathVector const &pathv = SP_SHAPE(lpeitem)->_curve->get_pathvector();
+ double width = (lpeitem && lpeitem->style) ? lpeitem->style->stroke_width.computed : 1.;
+ if (pathv.empty()) {
+ points.push_back( Geom::Point(0.,width) );
+ points.push_back( Geom::Point(0.5,width) );
+ points.push_back( Geom::Point(1.,width) );
+ } else {
+ Geom::Path const &path = pathv.front();
+ Geom::Path::size_type const size = path.size_default();
+ points.push_back( Geom::Point(0.,width) );
+ points.push_back( Geom::Point(0.5*size,width) );
+ if (!path.closed()) {
+ points.push_back( Geom::Point(size,width) );
+ }
+ }
offset_points.param_set_and_write_new_value(points);
} else {
g_warning("LPE Powerstroke can only be applied to shapes (not groups).");
@@ -206,47 +205,8 @@ static bool compare_offsets (Geom::Point first, Geom::Point second)
return first[Geom::X] < second[Geom::X];
}
-// find discontinuities in input path
-struct discontinuity_data {
- Geom::Point der0; // unit derivative of 'left' side of join
- Geom::Point der1; // unit derivative of 'right' side of join
- double width; // intended stroke width at join
-};
-std::vector<discontinuity_data> find_discontinuities( Geom::Piecewise<Geom::D2<Geom::SBasis> > const & der,
- Geom::Piecewise<Geom::SBasis> const & x,
- Geom::Piecewise<Geom::SBasis> const & y,
- double eps=Geom::EPSILON )
-{
- std::vector<discontinuity_data> vect;
- for(unsigned i = 1; i < der.size(); i++) {
- if ( ! are_near(der[i-1].at1(), der[i].at0(), eps) ) {
- discontinuity_data data;
-
- data.der0 = der[i-1].at1();
- data.der1 = der[i].at0();
- if ( Geom::are_near(data.der0.length(), 0) ) {
- data.der0 = unitTangentAt(der[i-1], 1, 2);
- }
- if ( Geom::are_near(data.der1.length(), 0) ) {
- data.der1 = unitTangentAt(der[i], 0, 2);
- }
-
- double t = der.cuts[i];
- std::vector< double > rts = roots (x - t); /// @todo this has multiple solutions for general strokewidth paths (generated by spiro interpolator...), ignore for now
- if (!rts.empty()) {
- data.width = y(rts.front());
- } else {
- data.width = 1;
- }
- vect.push_back(data);
- }
- }
- return vect;
-}
-
-
Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis> > const & B,
- std::vector<discontinuity_data> const & cusps,
+ Geom::Piecewise<Geom::SBasis> const & y, // width path
LineJoinType jointype,
double miter_limit,
bool forward_direction,
@@ -259,9 +219,6 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
return pb.peek().front();
}
- double sign = forward_direction ? 1. : -1.;
-
- unsigned int cusp_i = forward_direction ? 0 : cusps.size()-1;
Geom::Point start = B[0].at0();
pb.moveTo(start);
build_from_sbasis(pb, B[0], tol, false);
@@ -274,9 +231,12 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
}
if (!are_near(B[prev_i].at1(), B[i].at0(), tol) )
{ // discontinuity found, so fix it :-)
- discontinuity_data cusp = cusps[cusp_i];
+ double width = y( B.cuts[i] );
- bool on_outside = ( sign*cusp.width*angle_between(cusp.der0, cusp.der1) < 0. );
+ Geom::Point tang1 = -unitTangentAt(reverse(B[prev_i]),0.); // = unitTangentAt(B[prev_i],1);
+ Geom::Point tang2 = unitTangentAt(B[i],0);
+ Geom::Point discontinuity_vec = B[i].at0() - B[prev_i].at1();
+ bool on_outside = ( dot(tang1, discontinuity_vec) >= 0. );
switch (jointype) {
case LINEJOIN_ROUND: {
@@ -290,8 +250,6 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
A 2Geom method was created to do exactly this :)
*/
- Geom::Point tang1 = unitTangentAt(B[prev_i],1);
- Geom::Point tang2 = unitTangentAt(B[i],0);
boost::optional<Geom::Point> O = intersection_point( B[prev_i].at1(), tang1,
B[i].at0(), tang2 );
if (!O) {
@@ -302,7 +260,7 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
Geom::Ellipse ellipse = find_ellipse(B[prev_i].at1(), B[i].at0(), *O);
pb.arcTo( ellipse.ray(Geom::X), ellipse.ray(Geom::Y), ellipse.rot_angle(),
- false, cusp.width < 0, B[i].at0() );
+ false, width < 0, B[i].at0() );
} else {
// we are on the inside, do a simple bevel to connect the paths
pb.lineTo(B[i].at0()); // default to bevel for too shallow cusp angles
@@ -312,8 +270,7 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
/* case LINEJOIN_NONE: {
if ( on_outside ) {
// we are on the outside
- Geom::Point der1 = unitTangentAt(B[prev_i],1);
- Geom::Point point_on_path = B[prev_i].at1() - rot90(der1) * cusp.width;
+ Geom::Point point_on_path = B[prev_i].at1() - rot90(tang1) * width;
pb.lineTo(point_on_path);
pb.lineTo(B[i].at0());
} else {
@@ -325,13 +282,10 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
if (on_outside) {
// we are on the outside, do something complicated to make it look good ;)
- Geom::Point der1 = unitTangentAt(B[prev_i],1);
- Geom::Point der2 = unitTangentAt(B[i],0);
-
- Geom::D2<Geom::SBasis> newcurve1 = B[prev_i] * Geom::reflection(rot90(der1), B[prev_i].at1());
+ Geom::D2<Geom::SBasis> newcurve1 = B[prev_i] * Geom::reflection(rot90(tang1), B[prev_i].at1());
Geom::CubicBezier bzr1 = sbasis_to_cubicbezier( reverse(newcurve1) );
- Geom::D2<Geom::SBasis> newcurve2 = B[i] * Geom::reflection(rot90(der2), B[i].at0());
+ Geom::D2<Geom::SBasis> newcurve2 = B[i] * Geom::reflection(rot90(tang2), B[i].at0());
Geom::CubicBezier bzr2 = sbasis_to_cubicbezier( reverse(newcurve2) );
Geom::Crossings cross = crossings(bzr1, bzr2);
@@ -340,9 +294,9 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
pb.lineTo(B[i].at0());
} else {
// check size of miter
- Geom::Point point_on_path = B[prev_i].at1() - rot90(der1) * cusp.width;
+ Geom::Point point_on_path = B[prev_i].at1() - rot90(tang1) * width;
Geom::Coord len = distance(bzr1.pointAt(cross[0].ta), point_on_path);
- if (len > cusp.width * miter_limit) {
+ if (len > fabs(width) * miter_limit) {
// miter too big: default to bevel
pb.lineTo(B[i].at0());
} else {
@@ -363,15 +317,13 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
if (on_outside) {
// we are on the outside, do something complicated to make it look good ;)
- Geom::Point der1 = unitTangentAt(B[prev_i],1);
- Geom::Point der2 = unitTangentAt(B[i],0);
- boost::optional<Geom::Point> p = intersection_point( B[prev_i].at1(), der1,
- B[i].at0(), der2 );
+ boost::optional<Geom::Point> p = intersection_point( B[prev_i].at1(), tang1,
+ B[i].at0(), tang2 );
if (p) {
// check size of miter
- Geom::Point point_on_path = B[prev_i].at1() - rot90(der1) * cusp.width;
+ Geom::Point point_on_path = B[prev_i].at1() - rot90(tang1) * width;
Geom::Coord len = distance(*p, point_on_path);
- if (len <= cusp.width * miter_limit) {
+ if (len <= fabs(width) * miter_limit) {
// miter OK
pb.lineTo(*p);
}
@@ -385,9 +337,6 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
}
case LINEJOIN_SPIRO: {
if (on_outside) {
- Geom::Point tang1 = unitTangentAt(B[prev_i],1);
- Geom::Point tang2 = unitTangentAt(B[i],0);
-
Geom::Point direction = B[i].at0() - B[prev_i].at1();
double tang1_sign = dot(direction,tang1);
double tang2_sign = dot(direction,tang2);
@@ -420,8 +369,6 @@ Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise<Geom::D2<Geom::SBasis>
pb.lineTo(B[i].at0());
break;
}
-
- cusp_i += forward_direction ? 1 : -1;
}
build_from_sbasis(pb, B[i], tol, false);
prev_i = i;
@@ -492,14 +439,13 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
y = portion(y, rtsmin.at(0), rtsmax.at(0));
}
- std::vector<discontinuity_data> cusps = find_discontinuities(der, x, y);
LineJoinType jointype = static_cast<LineJoinType>(linejoin_type.get_value());
Piecewise<D2<SBasis> > pwd2_out = compose(pwd2_in,x) + y*compose(n,x);
Piecewise<D2<SBasis> > mirrorpath = reverse(compose(pwd2_in,x) - y*compose(n,x));
- Geom::Path fixed_path = path_from_piecewise_fix_cusps( pwd2_out, cusps, jointype, miter_limit, true, LPE_CONVERSION_TOLERANCE);
- Geom::Path fixed_mirrorpath = path_from_piecewise_fix_cusps( mirrorpath, cusps, jointype, miter_limit, false, LPE_CONVERSION_TOLERANCE);
+ Geom::Path fixed_path = path_from_piecewise_fix_cusps( pwd2_out, y, jointype, miter_limit, LPE_CONVERSION_TOLERANCE);
+ Geom::Path fixed_mirrorpath = path_from_piecewise_fix_cusps( mirrorpath, reverse(y), jointype, miter_limit, LPE_CONVERSION_TOLERANCE);
if (path_in[0].closed()) {
fixed_path.close(true);
@@ -514,7 +460,7 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
break;
case LINECAP_PEAK:
{
- Geom::Point end_deriv = unit_vector(der.lastValue());
+ Geom::Point end_deriv = -unitTangentAt( reverse(pwd2_in.segs.back()), 0.);
double radius = 0.5 * distance(pwd2_out.lastValue(), mirrorpath.firstValue());
Geom::Point midpoint = 0.5*(pwd2_out.lastValue() + mirrorpath.firstValue()) + radius*end_deriv;
fixed_path.appendNew<LineSegment>(midpoint);
@@ -523,7 +469,7 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
}
case LINECAP_SQUARE:
{
- Geom::Point end_deriv = unit_vector(der.lastValue());
+ Geom::Point end_deriv = -unitTangentAt( reverse(pwd2_in.segs.back()), 0.);
double radius = 0.5 * distance(pwd2_out.lastValue(), mirrorpath.firstValue());
fixed_path.appendNew<LineSegment>( pwd2_out.lastValue() + radius*end_deriv );
fixed_path.appendNew<LineSegment>( mirrorpath.firstValue() + radius*end_deriv );
@@ -552,7 +498,7 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
break;
case LINECAP_PEAK:
{
- Geom::Point start_deriv = unit_vector(der.firstValue());
+ Geom::Point start_deriv = unitTangentAt( pwd2_in.segs.front(), 0.);
double radius = 0.5 * distance(pwd2_out.firstValue(), mirrorpath.lastValue());
Geom::Point midpoint = 0.5*(mirrorpath.lastValue() + pwd2_out.firstValue()) - radius*start_deriv;
fixed_path.appendNew<LineSegment>( midpoint );
@@ -561,7 +507,7 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
}
case LINECAP_SQUARE:
{
- Geom::Point start_deriv = unit_vector(der.firstValue());
+ Geom::Point start_deriv = unitTangentAt( pwd2_in.segs.front(), 0.);
double radius = 0.5 * distance(pwd2_out.firstValue(), mirrorpath.lastValue());
fixed_path.appendNew<LineSegment>( mirrorpath.lastValue() - radius*start_deriv );
fixed_path.appendNew<LineSegment>( pwd2_out.firstValue() - radius*start_deriv );
diff --git a/src/live_effects/lpe-rough-hatches.cpp b/src/live_effects/lpe-rough-hatches.cpp
index a6fdde02a..f9ab72373 100644
--- a/src/live_effects/lpe-rough-hatches.cpp
+++ b/src/live_effects/lpe-rough-hatches.cpp
@@ -246,7 +246,6 @@ LPERoughHatches::LPERoughHatches(LivePathEffectObject *lpeobject) :
direction(_("Hatches width and dir"), _("Defines hatches frequency and direction"), "direction", &wr, this, Geom::Point(50,0)),
//
- //bender(_("Global bending"), _("Relative position to a reference point defines global bending direction and amount"), "bender", &wr, this, NULL, Geom::Point(-5,0)),
bender(_("Global bending"), _("Relative position to a reference point defines global bending direction and amount"), "bender", &wr, this, Geom::Point(-5,0))
{
registerParameter( dynamic_cast<Parameter *>(&direction) );
@@ -281,6 +280,9 @@ LPERoughHatches::LPERoughHatches(LivePathEffectObject *lpeobject) :
// hide the widgets for direction and bender vectorparams
direction.widget_is_visible = false;
bender.widget_is_visible = false;
+ // give distinguishing colors to direction and bender on-canvas params
+ direction.set_oncanvas_color(0x00ff7d00);
+ bender.set_oncanvas_color(0xffffb500);
concatenate_before_pwd2 = false;
show_orig_path = true;
diff --git a/src/live_effects/lpe-rough-hatches.h b/src/live_effects/lpe-rough-hatches.h
index cbc3c3b26..5051b313a 100644
--- a/src/live_effects/lpe-rough-hatches.h
+++ b/src/live_effects/lpe-rough-hatches.h
@@ -15,7 +15,6 @@
*/
#include "live_effects/effect.h"
-#include "live_effects/parameter/point.h"
#include "live_effects/parameter/parameter.h"
#include "live_effects/parameter/bool.h"
#include "live_effects/parameter/random.h"
@@ -64,7 +63,6 @@ private:
ScalarParam stroke_width_bot;
ScalarParam front_thickness, back_thickness;
- //PointParam bender;
VectorParam direction;
VectorParam bender;
diff --git a/src/live_effects/lpe-skeleton.cpp b/src/live_effects/lpe-skeleton.cpp
index 08f31da7e..f3d7788d6 100644
--- a/src/live_effects/lpe-skeleton.cpp
+++ b/src/live_effects/lpe-skeleton.cpp
@@ -11,9 +11,9 @@
* :%s/skeleton/yourname/g
*/
/* Authors:
- * Johan Engelen <j.b.c.engelen@utwente.nl>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) 2007 Authors
+ * Copyright (C) 2007-2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -23,6 +23,9 @@
// You might need to include other 2geom files. You can add them here:
#include <2geom/path.h>
+//#include "knot-holder-entity.h"
+//#include "knotholder.h"
+
namespace Inkscape {
namespace LivePathEffect {
@@ -33,12 +36,11 @@ LPESkeleton::LPESkeleton(LivePathEffectObject *lpeobject) :
{
/* uncomment the following line to have the original path displayed while the item is selected */
//show_orig_path = true;
+ /* uncomment the following line to enable display of the effect-specific on-canvas handles (knotholder entities) */
+ //_provides_knotholder_entities
/* register all your parameters here, so Inkscape knows which parameters this effect has: */
registerParameter( dynamic_cast<Parameter *>(&number) );
-
- /* register all your knotholder handles here: */
- //registerKnotHolderHandle(new Skeleton::KnotHolderEntityAttachMyHandle(), _("help message"));
}
LPESkeleton::~LPESkeleton()
@@ -80,7 +82,7 @@ LPESkeleton::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd
}
/* ########################
- * Define the classes for your knotholder handles here
+ * If you want to provide effect-specific on-canvas handles (knotholder entities), define them here:
*/
/*
@@ -96,6 +98,17 @@ public:
};
} // namespace Skeleton
+
+void
+LPESkeleton::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntityMyHandle *e = new KnotHolderEntityMyHandle(this);
+ e->create( desktop, item, knotholder,
+ _("Text describing what this handle does"),
+ //optional: knot_shape, knot_mode, knot_color);
+ knotholder->add(e);
+ }
+};
*/
/* ######################## */
diff --git a/src/live_effects/lpe-skeleton.h b/src/live_effects/lpe-skeleton.h
index 104ef3489..124d1a4cb 100644
--- a/src/live_effects/lpe-skeleton.h
+++ b/src/live_effects/lpe-skeleton.h
@@ -2,9 +2,9 @@
* @brief Minimal LPE effect, see lpe-skeleton.cpp.
*/
/* Authors:
- * Johan Engelen <j.b.c.engelen@utwente.nl>
+ * Johan Engelen <j.b.c.engelen@alumnus.utwente.nl>
*
- * Copyright (C) 2007 Authors
+ * Copyright (C) 2007-2012 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -18,8 +18,10 @@
namespace Inkscape {
namespace LivePathEffect {
-// each knotholder handle for your LPE requires a separate class derived from KnotHolderEntity;
-// define it in lpe-skeleton.cpp and register it in the effect's constructor
+// each knotholder handle for your LPE requires a separate class derived from LPEKnotHolderEntity;
+// define it in lpe-skeleton.cpp and add code to create it in addKnotHolderEntities
+// note that the LPE parameter classes implement their own handles! So in most cases, you will
+// not have to do anything like this.
/**
namespace Skeleton {
// we need a separate namespace to avoid clashes with other LPEs
@@ -37,8 +39,9 @@ public:
// virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
- /* the knotholder entity classes (if any) must be declared friends */
+ /* the knotholder entity classes (if any) can be declared friends */
//friend class Skeleton::KnotHolderEntityMyHandle;
+ //virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
private:
// add the parameters for your effect here:
diff --git a/src/live_effects/lpe-tangent_to_curve.cpp b/src/live_effects/lpe-tangent_to_curve.cpp
index a2d3cd061..04cc3335f 100644
--- a/src/live_effects/lpe-tangent_to_curve.cpp
+++ b/src/live_effects/lpe-tangent_to_curve.cpp
@@ -23,21 +23,24 @@
#include <2geom/path.h>
#include <2geom/transforms.h>
+#include "knot-holder-entity.h"
+#include "knotholder.h"
+
namespace Inkscape {
namespace LivePathEffect {
namespace TtC {
-class KnotHolderEntityAttachPt : public LPEKnotHolderEntity
-{
+class KnotHolderEntityAttachPt : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityAttachPt(LPETangentToCurve *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
-class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity
-{
+class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity {
public:
+ KnotHolderEntityLeftEnd(LPETangentToCurve *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
@@ -45,6 +48,7 @@ public:
class KnotHolderEntityRightEnd : public LPEKnotHolderEntity
{
public:
+ KnotHolderEntityRightEnd(LPETangentToCurve *effect) : LPEKnotHolderEntity(effect) {};
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
virtual Geom::Point knot_get();
};
@@ -59,15 +63,12 @@ LPETangentToCurve::LPETangentToCurve(LivePathEffectObject *lpeobject) :
length_right(_("Length right"), _("Specifies the right end of the tangent"), "length-right", &wr, this, 150)
{
show_orig_path = true;
+ _provides_knotholder_entities = true;
registerParameter( dynamic_cast<Parameter *>(&angle) );
registerParameter( dynamic_cast<Parameter *>(&t_attach) );
registerParameter( dynamic_cast<Parameter *>(&length_left) );
registerParameter( dynamic_cast<Parameter *>(&length_right) );
-
- registerKnotHolderHandle(new TtC::KnotHolderEntityAttachPt(), _("Adjust the point of attachment of the tangent"));
- registerKnotHolderHandle(new TtC::KnotHolderEntityLeftEnd(), _("Adjust the \"left\" end of the tangent"));
- registerKnotHolderHandle(new TtC::KnotHolderEntityRightEnd(), _("Adjust the \"right\" end of the tangent"));
}
LPETangentToCurve::~LPETangentToCurve()
@@ -95,26 +96,39 @@ LPETangentToCurve::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const
return output;
}
-namespace TtC {
-
-// TODO: make this more generic
-static LPETangentToCurve *
-get_effect(SPItem *item)
-{
- Effect *effect = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (effect->effectType() != TANGENT_TO_CURVE) {
- g_print ("Warning: Effect is not of type LPETangentToCurve!\n");
- return NULL;
+void
+LPETangentToCurve::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) {
+ {
+ KnotHolderEntity *e = new TtC::KnotHolderEntityAttachPt(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the point of attachment of the tangent")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
}
- return static_cast<LPETangentToCurve *>(effect);
-}
+ {
+ KnotHolderEntity *e = new TtC::KnotHolderEntityLeftEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the \"left\" end of the tangent")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+ {
+ KnotHolderEntity *e = new TtC::KnotHolderEntityRightEnd(this);
+ e->create( desktop, item, knotholder,
+ _("Adjust the \"right\" end of the tangent")
+ /*optional: knot_shape, knot_mode, knot_color*/);
+ knotholder->add(e);
+ }
+};
+
+namespace TtC {
void
KnotHolderEntityAttachPt::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
using namespace Geom;
- LPETangentToCurve* lpe = get_effect(item);
+ LPETangentToCurve* lpe = dynamic_cast<LPETangentToCurve *>(_effect);
Geom::Point const s = snap_knot_position(p);
@@ -136,7 +150,7 @@ KnotHolderEntityAttachPt::knot_set(Geom::Point const &p, Geom::Point const &/*or
void
KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
- LPETangentToCurve *lpe = get_effect(item);
+ LPETangentToCurve *lpe = dynamic_cast<LPETangentToCurve *>(_effect);
Geom::Point const s = snap_knot_position(p);
@@ -149,7 +163,7 @@ KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*ori
void
KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
{
- LPETangentToCurve *lpe = get_effect(item);
+ LPETangentToCurve *lpe = dynamic_cast<LPETangentToCurve *>(_effect);
Geom::Point const s = snap_knot_position(p);
@@ -162,21 +176,21 @@ KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*or
Geom::Point
KnotHolderEntityAttachPt::knot_get()
{
- LPETangentToCurve* lpe = get_effect(item);
+ LPETangentToCurve* lpe = dynamic_cast<LPETangentToCurve *>(_effect);
return lpe->ptA;
}
Geom::Point
KnotHolderEntityLeftEnd::knot_get()
{
- LPETangentToCurve *lpe = get_effect(item);
+ LPETangentToCurve *lpe = dynamic_cast<LPETangentToCurve *>(_effect);
return lpe->C;
}
Geom::Point
KnotHolderEntityRightEnd::knot_get()
{
- LPETangentToCurve *lpe = get_effect(item);
+ LPETangentToCurve *lpe = dynamic_cast<LPETangentToCurve *>(_effect);
return lpe->D;
}
diff --git a/src/live_effects/lpe-tangent_to_curve.h b/src/live_effects/lpe-tangent_to_curve.h
index 8fe54335c..309afc14b 100644
--- a/src/live_effects/lpe-tangent_to_curve.h
+++ b/src/live_effects/lpe-tangent_to_curve.h
@@ -42,6 +42,7 @@ public:
friend class TtC::KnotHolderEntityLeftEnd;
friend class TtC::KnotHolderEntityRightEnd;
friend class TtC::KnotHolderEntityAttachPt;
+ virtual void addKnotHolderEntities(KnotHolder * knotholder, SPDesktop * desktop, SPItem * item);
private:
ScalarParam angle;
diff --git a/src/live_effects/parameter/originalpath.cpp b/src/live_effects/parameter/originalpath.cpp
index e5c16943c..71ab006d6 100644
--- a/src/live_effects/parameter/originalpath.cpp
+++ b/src/live_effects/parameter/originalpath.cpp
@@ -104,6 +104,14 @@ OriginalPathParam::linked_modified_callback(SPObject *linked_obj, guint /*flags*
}
void
+OriginalPathParam::linked_transformed_callback(Geom::Affine const * /*rel_transf*/, SPItem * /*moved_item*/)
+{
+/** \todo find good way to compensate for referenced path transform, like done for normal clones.
+ * See sp-use.cpp: sp_use_move_compensate */
+}
+
+
+void
OriginalPathParam::on_select_original_button_click()
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
diff --git a/src/live_effects/parameter/originalpath.h b/src/live_effects/parameter/originalpath.h
index f05f17d9a..7dd17edb0 100644
--- a/src/live_effects/parameter/originalpath.h
+++ b/src/live_effects/parameter/originalpath.h
@@ -35,6 +35,8 @@ public:
protected:
virtual void linked_modified_callback(SPObject *linked_obj, guint flags);
+ virtual void linked_transformed_callback(Geom::Affine const *rel_transf, SPItem *moved_item);
+
void on_select_original_button_click();
private:
diff --git a/src/live_effects/parameter/path.cpp b/src/live_effects/parameter/path.cpp
index 186cfff9a..69c337a7c 100644
--- a/src/live_effects/parameter/path.cpp
+++ b/src/live_effects/parameter/path.cpp
@@ -326,6 +326,9 @@ PathParam::start_listening(SPObject * to)
}
linked_delete_connection = to->connectDelete(sigc::mem_fun(*this, &PathParam::linked_delete));
linked_modified_connection = to->connectModified(sigc::mem_fun(*this, &PathParam::linked_modified));
+ if (SP_IS_ITEM(to)) {
+ linked_transformed_connection = SP_ITEM(to)->connectTransformed(sigc::mem_fun(*this, &PathParam::linked_transformed));
+ }
linked_modified(to, SP_OBJECT_MODIFIED_FLAG); // simulate linked_modified signal, so that path data is updated
}
@@ -334,6 +337,7 @@ PathParam::quit_listening(void)
{
linked_modified_connection.disconnect();
linked_delete_connection.disconnect();
+ linked_transformed_connection.disconnect();
}
void
@@ -368,6 +372,11 @@ void PathParam::linked_modified(SPObject *linked_obj, guint flags)
linked_modified_callback(linked_obj, flags);
}
+void PathParam::linked_transformed(Geom::Affine const *rel_transf, SPItem *moved_item)
+{
+ linked_transformed_callback(rel_transf, moved_item);
+}
+
void
PathParam::linked_modified_callback(SPObject *linked_obj, guint /*flags*/)
{
@@ -392,6 +401,7 @@ PathParam::linked_modified_callback(SPObject *linked_obj, guint /*flags*/)
SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
}
+
/* CALLBACK FUNCTIONS FOR THE BUTTONS */
void
PathParam::on_edit_button_click()
diff --git a/src/live_effects/parameter/path.h b/src/live_effects/parameter/path.h
index 7b51dc48a..a4f46f11f 100644
--- a/src/live_effects/parameter/path.h
+++ b/src/live_effects/parameter/path.h
@@ -70,13 +70,16 @@ protected:
sigc::connection ref_changed_connection;
sigc::connection linked_delete_connection;
sigc::connection linked_modified_connection;
+ sigc::connection linked_transformed_connection;
void ref_changed(SPObject *old_ref, SPObject *new_ref);
void remove_link();
void start_listening(SPObject * to);
void quit_listening(void);
void linked_delete(SPObject *deleted);
void linked_modified(SPObject *linked_obj, guint flags);
+ void linked_transformed(Geom::Affine const *rel_transf, SPItem *moved_item);
virtual void linked_modified_callback(SPObject *linked_obj, guint flags);
+ virtual void linked_transformed_callback(Geom::Affine const * /*rel_transf*/, SPItem * /*moved_item*/) {};
void on_edit_button_click();
void on_copy_button_click();
diff --git a/src/live_effects/parameter/point.cpp b/src/live_effects/parameter/point.cpp
index e3731fdcf..eb2543ac7 100644
--- a/src/live_effects/parameter/point.cpp
+++ b/src/live_effects/parameter/point.cpp
@@ -127,7 +127,7 @@ PointParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint
knot_color = color;
}
-class PointParamKnotHolderEntity : public LPEKnotHolderEntity {
+class PointParamKnotHolderEntity : public KnotHolderEntity {
public:
PointParamKnotHolderEntity(PointParam *p) { this->pparam = p; }
virtual ~PointParamKnotHolderEntity() {}
diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp
index 5bf5c51c7..06048cb32 100644
--- a/src/live_effects/parameter/powerstrokepointarray.cpp
+++ b/src/live_effects/parameter/powerstrokepointarray.cpp
@@ -19,6 +19,7 @@
// needed for on-canvas editting:
#include "desktop.h"
+#include "live_effects/lpeobject.h"
namespace Inkscape {
@@ -31,7 +32,7 @@ PowerStrokePointArrayParam::PowerStrokePointArrayParam( const Glib::ustring& lab
{
knot_shape = SP_KNOT_SHAPE_DIAMOND;
knot_mode = SP_KNOT_MODE_XOR;
- knot_color = 0xff00ff00;
+ knot_color = 0xff88ff00;
}
PowerStrokePointArrayParam::~PowerStrokePointArrayParam()
@@ -117,7 +118,7 @@ PowerStrokePointArrayParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotMode
knot_color = color;
}
-class PowerStrokePointArrayParamKnotHolderEntity : public LPEKnotHolderEntity {
+class PowerStrokePointArrayParamKnotHolderEntity : public KnotHolderEntity {
public:
PowerStrokePointArrayParamKnotHolderEntity(PowerStrokePointArrayParam *p, unsigned int index);
virtual ~PowerStrokePointArrayParamKnotHolderEntity() {}
@@ -183,22 +184,50 @@ PowerStrokePointArrayParamKnotHolderEntity::knot_get()
void
PowerStrokePointArrayParamKnotHolderEntity::knot_click(guint state)
{
-//g_print ("This is the %d handle associated to parameter '%s'\n", _index, _pparam->param_key.c_str());
-
if (state & GDK_CONTROL_MASK) {
if (state & GDK_MOD1_MASK) {
// delete the clicked knot
std::vector<Geom::Point> & vec = _pparam->_vector;
vec.erase(vec.begin() + _index);
_pparam->param_set_and_write_new_value(vec);
+
+ // remove knot from knotholder
+ parent_holder->entity.remove(this);
+ // shift knots down one index
+ for(std::list<KnotHolderEntity *>::iterator ent = parent_holder->entity.begin(); ent != parent_holder->entity.end(); ++ent) {
+ PowerStrokePointArrayParamKnotHolderEntity *pspa_ent = dynamic_cast<PowerStrokePointArrayParamKnotHolderEntity *>(*ent);
+ if ( pspa_ent && pspa_ent->_pparam == this->_pparam ) { // check if the knotentity belongs to this powerstrokepointarray parameter
+ if (pspa_ent->_index > this->_index) {
+ --pspa_ent->_index;
+ }
+ }
+ };
+ // delete self and return
+ delete this;
+ return;
} else {
- // add a knot
+ // add a knot to XML
std::vector<Geom::Point> & vec = _pparam->_vector;
- vec.insert(vec.begin() + _index, 1, vec.at(_index));
+ vec.insert(vec.begin() + _index, 1, vec.at(_index)); // this clicked knot is duplicated
_pparam->param_set_and_write_new_value(vec);
+
+ // shift knots up one index
+ for(std::list<KnotHolderEntity *>::iterator ent = parent_holder->entity.begin(); ent != parent_holder->entity.end(); ++ent) {
+ PowerStrokePointArrayParamKnotHolderEntity *pspa_ent = dynamic_cast<PowerStrokePointArrayParamKnotHolderEntity *>(*ent);
+ if ( pspa_ent && pspa_ent->_pparam == this->_pparam ) { // check if the knotentity belongs to this powerstrokepointarray parameter
+ if (pspa_ent->_index > this->_index) {
+ ++pspa_ent->_index;
+ }
+ }
+ };
+ // add knot to knotholder
+ PowerStrokePointArrayParamKnotHolderEntity *e = new PowerStrokePointArrayParamKnotHolderEntity(_pparam, _index+1);
+ e->create( this->desktop, this->item, parent_holder,
+ _("<b>Stroke width control point</b>: drag to alter the stroke width. <b>Ctrl+click</b> adds a control point, <b>Ctrl+Alt+click</b> deletes it."),
+ _pparam->knot_shape, _pparam->knot_mode, _pparam->knot_color);
+ parent_holder->add(e);
}
}
-
}
void
diff --git a/src/live_effects/parameter/vector.cpp b/src/live_effects/parameter/vector.cpp
index e8725c4b2..3e0ac9092 100644
--- a/src/live_effects/parameter/vector.cpp
+++ b/src/live_effects/parameter/vector.cpp
@@ -137,7 +137,14 @@ VectorParam::set_origin_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mod
ori_knot_color = color;
}
-class VectorParamKnotHolderEntity_Origin : public LPEKnotHolderEntity {
+void
+VectorParam::set_oncanvas_color(guint32 color)
+{
+ vec_knot_color = color;
+ ori_knot_color = color;
+}
+
+class VectorParamKnotHolderEntity_Origin : public KnotHolderEntity {
public:
VectorParamKnotHolderEntity_Origin(VectorParam *p) : param(p) { }
virtual ~VectorParamKnotHolderEntity_Origin() {}
@@ -158,7 +165,7 @@ private:
VectorParam *param;
};
-class VectorParamKnotHolderEntity_Vector : public LPEKnotHolderEntity {
+class VectorParamKnotHolderEntity_Vector : public KnotHolderEntity {
public:
VectorParamKnotHolderEntity_Vector(VectorParam *p) : param(p) { }
virtual ~VectorParamKnotHolderEntity_Vector() {}
diff --git a/src/live_effects/parameter/vector.h b/src/live_effects/parameter/vector.h
index 5d6d1c932..f82affe16 100644
--- a/src/live_effects/parameter/vector.h
+++ b/src/live_effects/parameter/vector.h
@@ -50,6 +50,7 @@ public:
void set_vector_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color);
void set_origin_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color);
+ void set_oncanvas_color(guint32 color);
virtual bool providesKnotHolderEntities() { return true; }
virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
diff --git a/src/main.cpp b/src/main.cpp
index 4bf327284..7a5d15cb7 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -117,6 +117,11 @@
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#endif
+
enum {
SP_ARG_NONE,
SP_ARG_NOGUI,
@@ -889,8 +894,8 @@ snooper(GdkEvent *event, gpointer /*data*/) {
break;
case GDK_KEY_PRESS:
keyval = get_group0_keyval(&event->key);
- if (keyval == GDK_Alt_L) altL_pressed = TRUE;
- if (keyval == GDK_Alt_R) altR_pressed = TRUE;
+ if (keyval == GDK_KEY_Alt_L) altL_pressed = TRUE;
+ if (keyval == GDK_KEY_Alt_R) altR_pressed = TRUE;
alt_pressed = alt_pressed || altL_pressed || altR_pressed;
alt_pressed = alt_pressed || (event->button.state & GDK_MOD1_MASK);
if (alt_pressed)
@@ -900,8 +905,8 @@ snooper(GdkEvent *event, gpointer /*data*/) {
break;
case GDK_KEY_RELEASE:
keyval = get_group0_keyval(&event->key);
- if (keyval == GDK_Alt_L) altL_pressed = FALSE;
- if (keyval == GDK_Alt_R) altR_pressed = FALSE;
+ if (keyval == GDK_KEY_Alt_L) altL_pressed = FALSE;
+ if (keyval == GDK_KEY_Alt_R) altR_pressed = FALSE;
if (!altL_pressed && !altR_pressed)
alt_pressed = FALSE;
break;
diff --git a/src/measure-context.cpp b/src/measure-context.cpp
index 9db2b8de4..3237bb3fb 100644
--- a/src/measure-context.cpp
+++ b/src/measure-context.cpp
@@ -40,6 +40,7 @@
#include <2geom/angle.h>
#include "snap.h"
#include "sp-namedview.h"
+#include "enums.h"
static void sp_measure_context_class_init(SPMeasureContextClass *klass);
@@ -351,7 +352,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
SPCanvasItem * canvasitem = NULL;
canvasitem = sp_canvas_item_new(sp_desktop_tempgroup(desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"size", 8.0,
"stroked", TRUE,
"stroke_color", 0xff0000ff,
diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h
index 3236d9a55..84ecc83ea 100644
--- a/src/menus-skeleton.h
+++ b/src/menus-skeleton.h
@@ -78,6 +78,12 @@ static char const menus_skeleton[] =
" <separator/>\n"
" <verb verb-id=\"EditSelectAll\" />\n"
" <verb verb-id=\"EditSelectAllInAllLayers\" />\n"
+" <submenu name=\"" N_("Selec_t Same") "\">\n"
+" <verb verb-id=\"EditSelectSameFillStroke\" />\n"
+" <verb verb-id=\"EditSelectSameFillColor\" />\n"
+" <verb verb-id=\"EditSelectSameStrokeColor\" />\n"
+" <verb verb-id=\"EditSelectSameStrokeStyle\" />\n"
+" </submenu>\n"
" <verb verb-id=\"EditInvert\" />\n"
" <verb verb-id=\"EditDeselect\" />\n"
" <separator/>\n"
diff --git a/src/object-edit.cpp b/src/object-edit.cpp
index 1c828e1e5..528f202ab 100644
--- a/src/object-edit.cpp
+++ b/src/object-edit.cpp
@@ -719,6 +719,7 @@ class ArcKnotHolderEntityStart : public KnotHolderEntity {
public:
virtual Geom::Point knot_get();
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_click(guint state);
};
class ArcKnotHolderEntityEnd : public KnotHolderEntity {
@@ -793,6 +794,17 @@ ArcKnotHolderEntityStart::knot_get()
}
void
+ArcKnotHolderEntityStart::knot_click(guint state)
+{
+ SPGenericEllipse *ge = SP_GENERICELLIPSE(item);
+
+ if (state & GDK_SHIFT_MASK) {
+ ge->end = ge->start = 0;
+ (static_cast<SPObject *>(ge))->updateRepr();
+ }
+}
+
+void
ArcKnotHolderEntityEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
diff --git a/src/pen-context.cpp b/src/pen-context.cpp
index 5e9f27fb9..dbfd436f0 100644
--- a/src/pen-context.cpp
+++ b/src/pen-context.cpp
@@ -44,6 +44,61 @@
#include "context-fns.h"
#include "tools-switch.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#endif
+
static void sp_pen_context_class_init(SPPenContextClass *klass);
static void sp_pen_context_init(SPPenContext *pc);
static void sp_pen_context_dispose(GObject *object);
@@ -995,9 +1050,9 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
switch (get_group0_keyval (&event->key)) {
- case GDK_Left: // move last point left
- case GDK_KP_Left:
- case GDK_KP_4:
+ case GDK_KEY_Left: // move last point left
+ case GDK_KEY_KP_Left:
+ case GDK_KEY_KP_4:
if (!MOD__CTRL) { // not ctrl
if (MOD__ALT) { // alt
if (MOD__SHIFT) pen_lastpoint_move_screen(pc, -10, 0); // shift
@@ -1010,9 +1065,9 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Up: // move last point up
- case GDK_KP_Up:
- case GDK_KP_8:
+ case GDK_KEY_Up: // move last point up
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_8:
if (!MOD__CTRL) { // not ctrl
if (MOD__ALT) { // alt
if (MOD__SHIFT) pen_lastpoint_move_screen(pc, 0, 10); // shift
@@ -1025,9 +1080,9 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Right: // move last point right
- case GDK_KP_Right:
- case GDK_KP_6:
+ case GDK_KEY_Right: // move last point right
+ case GDK_KEY_KP_Right:
+ case GDK_KEY_KP_6:
if (!MOD__CTRL) { // not ctrl
if (MOD__ALT) { // alt
if (MOD__SHIFT) pen_lastpoint_move_screen(pc, 10, 0); // shift
@@ -1040,9 +1095,9 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Down: // move last point down
- case GDK_KP_Down:
- case GDK_KP_2:
+ case GDK_KEY_Down: // move last point down
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_KP_2:
if (!MOD__CTRL) { // not ctrl
if (MOD__ALT) { // alt
if (MOD__SHIFT) pen_lastpoint_move_screen(pc, 0, -10); // shift
@@ -1057,32 +1112,32 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
break;
/* TODO: this is not yet enabled?? looks like some traces of the Geometry tool
- case GDK_P:
- case GDK_p:
+ case GDK_KEY_P:
+ case GDK_KEY_p:
if (MOD__SHIFT_ONLY) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::PARALLEL, 2);
ret = TRUE;
}
break;
- case GDK_C:
- case GDK_c:
+ case GDK_KEY_C:
+ case GDK_KEY_c:
if (MOD__SHIFT_ONLY) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::CIRCLE_3PTS, 3);
ret = TRUE;
}
break;
- case GDK_B:
- case GDK_b:
+ case GDK_KEY_B:
+ case GDK_KEY_b:
if (MOD__SHIFT_ONLY) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::PERP_BISECTOR, 2);
ret = TRUE;
}
break;
- case GDK_A:
- case GDK_a:
+ case GDK_KEY_A:
+ case GDK_KEY_a:
if (MOD__SHIFT_ONLY) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::ANGLE_BISECTOR, 3);
ret = TRUE;
@@ -1090,53 +1145,53 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
break;
*/
- case GDK_U:
- case GDK_u:
+ case GDK_KEY_U:
+ case GDK_KEY_u:
if (MOD__SHIFT_ONLY) {
pen_lastpoint_tocurve(pc);
ret = TRUE;
}
break;
- case GDK_L:
- case GDK_l:
+ case GDK_KEY_L:
+ case GDK_KEY_l:
if (MOD__SHIFT_ONLY) {
pen_lastpoint_toline(pc);
ret = TRUE;
}
break;
- case GDK_Return:
- case GDK_KP_Enter:
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
if (pc->npoints != 0) {
spdc_pen_finish(pc, FALSE);
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (pc->npoints != 0) {
// if drawing, cancel, otherwise pass it up for deselecting
pen_cancel (pc);
ret = TRUE;
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (MOD__CTRL_ONLY && pc->npoints != 0) {
// if drawing, cancel, otherwise pass it up for undo
pen_cancel (pc);
ret = TRUE;
}
break;
- case GDK_g:
- case GDK_G:
+ case GDK_KEY_g:
+ case GDK_KEY_G:
if (MOD__SHIFT_ONLY) {
sp_selection_to_guides(SP_EVENT_CONTEXT(pc)->desktop);
ret = true;
}
break;
- case GDK_BackSpace:
- case GDK_Delete:
- case GDK_KP_Delete:
+ case GDK_KEY_BackSpace:
+ case GDK_KEY_Delete:
+ case GDK_KEY_KP_Delete:
if ( pc->green_curve->is_empty() || (pc->green_curve->last_segment() == NULL) ) {
if (!pc->red_curve->is_empty()) {
pen_cancel (pc);
diff --git a/src/pencil-context.cpp b/src/pencil-context.cpp
index e6bd8f297..6db7c8ae2 100644
--- a/src/pencil-context.cpp
+++ b/src/pencil-context.cpp
@@ -45,6 +45,58 @@
#include "display/curve.h"
#include "livarot/Path.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#endif
+
+
static void sp_pencil_context_class_init(SPPencilContextClass *klass);
static void sp_pencil_context_init(SPPencilContext *pc);
static void sp_pencil_context_setup(SPEventContext *ec);
@@ -567,16 +619,16 @@ pencil_handle_key_press(SPPencilContext *const pc, guint const keyval, guint con
{
gint ret = FALSE;
switch (keyval) {
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// Prevent the zoom field from activation.
if (!mod_ctrl_only(state)) {
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (pc->npoints != 0) {
// if drawing, cancel, otherwise pass it up for deselecting
if (pc->state != SP_PENCIL_CONTEXT_IDLE) {
@@ -585,8 +637,8 @@ pencil_handle_key_press(SPPencilContext *const pc, guint const keyval, guint con
}
}
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (mod_ctrl_only(state) && pc->npoints != 0) {
// if drawing, cancel, otherwise pass it up for undo
if (pc->state != SP_PENCIL_CONTEXT_IDLE) {
@@ -595,17 +647,17 @@ pencil_handle_key_press(SPPencilContext *const pc, guint const keyval, guint con
}
}
break;
- case GDK_g:
- case GDK_G:
+ case GDK_KEY_g:
+ case GDK_KEY_G:
if (mod_shift_only(state)) {
sp_selection_to_guides(SP_EVENT_CONTEXT(pc)->desktop);
ret = true;
}
break;
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Meta_L:
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Meta_L:
+ case GDK_KEY_Meta_R:
if (pc->state == SP_PENCIL_CONTEXT_IDLE) {
pc->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("<b>Sketch mode</b>: holding <b>Alt</b> interpolates between sketched paths. Release <b>Alt</b> to finalize."));
}
@@ -621,10 +673,10 @@ pencil_handle_key_release(SPPencilContext *const pc, guint const keyval, guint c
{
gint ret = FALSE;
switch (keyval) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Meta_L:
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Meta_L:
+ case GDK_KEY_Meta_R:
if (pc->state == SP_PENCIL_CONTEXT_SKETCH) {
spdc_concat_colors_and_flush(pc, FALSE);
pc->sketch_n = 0;
diff --git a/src/rect-context.cpp b/src/rect-context.cpp
index 7231038dc..d1f10d1ec 100644
--- a/src/rect-context.cpp
+++ b/src/rect-context.cpp
@@ -46,6 +46,62 @@
#include "verbs.h"
#include "display/sp-canvas-item.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#endif
+
using Inkscape::DocumentUndo;
//static const double goldenratio = 1.61803398874989484820; // golden ratio
@@ -364,14 +420,14 @@ static gint sp_rect_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
+ case GDK_KEY_Meta_R:
if (!dragging){
sp_event_show_modifier_tip (event_context->defaultMessageContext(), event,
_("<b>Ctrl</b>: make square or integer-ratio rect, lock a rounded corner circular"),
@@ -379,32 +435,32 @@ static gint sp_rect_context_root_handler(SPEventContext *event_context, GdkEvent
NULL);
}
break;
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-rect");
ret = TRUE;
}
break;
- case GDK_g:
- case GDK_G:
+ case GDK_KEY_g:
+ case GDK_KEY_G:
if (MOD__SHIFT_ONLY) {
sp_selection_to_guides(desktop);
ret = true;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (dragging) {
dragging = false;
sp_event_context_discard_delayed_snap_event(event_context);
@@ -414,7 +470,7 @@ static gint sp_rect_context_root_handler(SPEventContext *event_context, GdkEvent
}
break;
- case GDK_space:
+ case GDK_KEY_space:
if (dragging) {
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate),
event->button.time);
@@ -434,14 +490,14 @@ static gint sp_rect_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval (&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt
+ case GDK_KEY_Meta_R:
event_context->defaultMessageContext()->clear();
break;
default:
diff --git a/src/select-context.cpp b/src/select-context.cpp
index 922329d7a..37d0e79ec 100644
--- a/src/select-context.cpp
+++ b/src/select-context.cpp
@@ -49,6 +49,72 @@
#include "display/sp-canvas.h"
#include "display/drawing-item.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
@@ -163,11 +229,19 @@ sp_select_context_dispose(GObject *object)
sc->_describer = NULL;
if (CursorSelectDragging) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(CursorSelectDragging);
+#else
gdk_cursor_unref (CursorSelectDragging);
+#endif
CursorSelectDragging = NULL;
}
if (CursorSelectMouseover) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(CursorSelectMouseover);
+#else
gdk_cursor_unref (CursorSelectMouseover);
+#endif
CursorSelectMouseover = NULL;
}
@@ -265,14 +339,14 @@ sp_select_context_abort(SPEventContext *event_context)
bool
key_is_a_modifier (guint key) {
- return (key == GDK_Alt_L ||
- key == GDK_Alt_R ||
- key == GDK_Control_L ||
- key == GDK_Control_R ||
- key == GDK_Shift_L ||
- key == GDK_Shift_R ||
- key == GDK_Meta_L || // Meta is when you press Shift+Alt (at least on my machine)
- key == GDK_Meta_R);
+ return (key == GDK_KEY_Alt_L ||
+ key == GDK_KEY_Alt_R ||
+ key == GDK_KEY_Control_L ||
+ key == GDK_KEY_Control_R ||
+ key == GDK_KEY_Shift_L ||
+ key == GDK_KEY_Shift_R ||
+ key == GDK_KEY_Meta_L || // Meta is when you press Shift+Alt (at least on my machine)
+ key == GDK_KEY_Meta_R);
}
void
@@ -399,18 +473,18 @@ sp_select_context_item_handler(SPEventContext *event_context, SPItem *item, GdkE
break;
case GDK_KEY_PRESS:
- if (get_group0_keyval (&event->key) == GDK_space) {
+ if (get_group0_keyval (&event->key) == GDK_KEY_space) {
if (sc->dragging && sc->grabbed) {
/* stamping mode: show content mode moving */
seltrans->stamp();
ret = TRUE;
}
- } else if (get_group0_keyval (&event->key) == GDK_Tab) {
+ } else if (get_group0_keyval (&event->key) == GDK_KEY_Tab) {
if (sc->dragging && sc->grabbed) {
seltrans->getNextClosestPoint(false);
ret = TRUE;
}
- } else if (get_group0_keyval (&event->key) == GDK_ISO_Left_Tab) {
+ } else if (get_group0_keyval (&event->key) == GDK_KEY_ISO_Left_Tab) {
if (sc->dragging && sc->grabbed) {
seltrans->getNextClosestPoint(true);
ret = TRUE;
@@ -862,10 +936,10 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
{
guint keyval = get_group0_keyval(&event->key);
bool alt = ( MOD__ALT
- || (keyval == GDK_Alt_L)
- || (keyval == GDK_Alt_R)
- || (keyval == GDK_Meta_L)
- || (keyval == GDK_Meta_R));
+ || (keyval == GDK_KEY_Alt_L)
+ || (keyval == GDK_KEY_Alt_R)
+ || (keyval == GDK_KEY_Meta_L)
+ || (keyval == GDK_KEY_Meta_R));
if (!key_is_a_modifier (keyval)) {
event_context->defaultMessageContext()->clear();
@@ -900,9 +974,9 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
int const snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
switch (get_group0_keyval (&event->key)) {
- case GDK_Left: // move selection left
- case GDK_KP_Left:
- case GDK_KP_4:
+ case GDK_KEY_Left: // move selection left
+ case GDK_KEY_KP_Left:
+ case GDK_KEY_KP_4:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -917,9 +991,9 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Up: // move selection up
- case GDK_KP_Up:
- case GDK_KP_8:
+ case GDK_KEY_Up: // move selection up
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_8:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -934,9 +1008,9 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Right: // move selection right
- case GDK_KP_Right:
- case GDK_KP_6:
+ case GDK_KEY_Right: // move selection right
+ case GDK_KEY_KP_Right:
+ case GDK_KEY_KP_6:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -951,9 +1025,9 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Down: // move selection down
- case GDK_KP_Down:
- case GDK_KP_2:
+ case GDK_KEY_Down: // move selection down
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_KP_2:
if (!MOD__CTRL) { // not ctrl
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -968,20 +1042,20 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (!sp_select_context_abort(event_context))
selection->clear();
ret = TRUE;
break;
- case GDK_a:
- case GDK_A:
+ case GDK_KEY_a:
+ case GDK_KEY_A:
if (MOD__CTRL_ONLY) {
sp_edit_select_all(desktop);
ret = TRUE;
}
break;
- case GDK_space:
+ case GDK_KEY_space:
/* stamping mode: show outline mode moving */
/* FIXME: Is next condition ok? (lauris) */
if (sc->dragging && sc->grabbed) {
@@ -989,14 +1063,14 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx");
ret = TRUE;
}
break;
- case GDK_bracketleft:
+ case GDK_KEY_bracketleft:
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -1008,7 +1082,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
ret = TRUE;
break;
- case GDK_bracketright:
+ case GDK_KEY_bracketright:
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -1020,8 +1094,8 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
ret = TRUE;
break;
- case GDK_less:
- case GDK_comma:
+ case GDK_KEY_less:
+ case GDK_KEY_comma:
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -1035,8 +1109,8 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
ret = TRUE;
break;
- case GDK_greater:
- case GDK_period:
+ case GDK_KEY_greater:
+ case GDK_KEY_period:
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
get_group0_keyval(&event->key), 0); // with any mask
@@ -1050,7 +1124,7 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
ret = TRUE;
break;
- case GDK_Return:
+ case GDK_KEY_Return:
if (MOD__CTRL_ONLY) {
if (selection->singleItem()) {
SPItem *clicked_item = selection->singleItem();
@@ -1065,14 +1139,14 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_BackSpace:
+ case GDK_KEY_BackSpace:
if (MOD__CTRL_ONLY) {
sp_select_context_up_one_layer(desktop);
ret = TRUE;
}
break;
- case GDK_s:
- case GDK_S:
+ case GDK_KEY_s:
+ case GDK_KEY_S:
if (MOD__SHIFT_ONLY) {
if (!selection->isEmpty()) {
seltrans->increaseState();
@@ -1080,8 +1154,8 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
ret = TRUE;
}
break;
- case GDK_g:
- case GDK_G:
+ case GDK_KEY_g:
+ case GDK_KEY_G:
if (MOD__SHIFT_ONLY) {
sp_selection_to_guides(desktop);
ret = true;
@@ -1099,10 +1173,10 @@ sp_select_context_root_handler(SPEventContext *event_context, GdkEvent *event)
event_context->defaultMessageContext()->clear();
bool alt = ( MOD__ALT
- || (keyval == GDK_Alt_L)
- || (keyval == GDK_Alt_R)
- || (keyval == GDK_Meta_L)
- || (keyval == GDK_Meta_R));
+ || (keyval == GDK_KEY_Alt_L)
+ || (keyval == GDK_KEY_Alt_R)
+ || (keyval == GDK_KEY_Meta_L)
+ || (keyval == GDK_KEY_Meta_R));
if (Inkscape::Rubberband::get(desktop)->is_started()) {
// if Alt then change cursor to moving cursor:
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index d0fba0de5..e9257d3af 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -151,6 +151,26 @@ void SelectionHelper::selectNone(SPDesktop *dt)
}
}
+void SelectionHelper::selectSameFillStroke(SPDesktop *dt)
+{
+ sp_select_same_fill_stroke_style(dt, true, true, true);
+}
+
+void SelectionHelper::selectSameFillColor(SPDesktop *dt)
+{
+ sp_select_same_fill_stroke_style(dt, true, false, false);
+}
+
+void SelectionHelper::selectSameStrokeColor(SPDesktop *dt)
+{
+ sp_select_same_fill_stroke_style(dt, false, true, false);
+}
+
+void SelectionHelper::selectSameStrokeStyle(SPDesktop *dt)
+{
+ sp_select_same_stroke_style(dt);
+}
+
void SelectionHelper::invert(SPDesktop *dt)
{
if (tools_isactive(dt, TOOLS_NODES)) {
@@ -470,7 +490,17 @@ void sp_edit_clear_all(SPDesktop *dt)
_("Delete all"));
}
-GSList *get_all_items(GSList *list, SPObject *from, SPDesktop *desktop, bool onlyvisible, bool onlysensitive, GSList const *exclude)
+/*
+ * Return a list of SPItems that are the children of 'list'
+ *
+ * list - source list of items to search in
+ * desktop - desktop associated with the source list
+ * exclude - list of items to exclude from result
+ * onlyvisible - TRUE includes only items visible on canvas
+ * onlysensitive - TRUE includes only non-locked items
+ * ingroups - TRUE to recursively get grouped items children
+ */
+GSList *get_all_items(GSList *list, SPObject *from, SPDesktop *desktop, bool onlyvisible, bool onlysensitive, bool ingroups, GSList const *exclude)
{
for ( SPObject *child = from->firstChild() ; child; child = child->getNext() ) {
if (SP_IS_ITEM(child) &&
@@ -483,8 +513,8 @@ GSList *get_all_items(GSList *list, SPObject *from, SPDesktop *desktop, bool onl
list = g_slist_prepend(list, SP_ITEM(child));
}
- if (SP_IS_ITEM(child) && desktop->isLayer(SP_ITEM(child))) {
- list = get_all_items(list, child, desktop, onlyvisible, onlysensitive, exclude);
+ if (ingroups || (SP_IS_ITEM(child) && desktop->isLayer(SP_ITEM(child)))) {
+ list = get_all_items(list, child, desktop, onlyvisible, onlysensitive, ingroups, exclude);
}
}
@@ -541,11 +571,11 @@ void sp_edit_select_all_full(SPDesktop *dt, bool force_all_layers, bool invert)
break;
}
case PREFS_SELECTION_LAYER_RECURSIVE: {
- items = get_all_items(NULL, dt->currentLayer(), dt, onlyvisible, onlysensitive, exclude);
+ items = get_all_items(NULL, dt->currentLayer(), dt, onlyvisible, onlysensitive, FALSE, exclude);
break;
}
default: {
- items = get_all_items(NULL, dt->currentRoot(), dt, onlyvisible, onlysensitive, exclude);
+ items = get_all_items(NULL, dt->currentRoot(), dt, onlyvisible, onlysensitive, FALSE, exclude);
break;
}
}
@@ -1610,6 +1640,244 @@ sp_selection_rotate(Inkscape::Selection *selection, gdouble const angle_degrees)
_("Rotate"));
}
+/*
+ * Selects all the visible items with the same fill and/or stroke color/style as the items in the current selection
+ *
+ * Params:
+ * desktop - set the selection on this desktop
+ * fill - select objects matching fill
+ * stroke - select objects matching stroke
+ */
+void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolean stroke, gboolean style)
+{
+ if (!desktop) {
+ return;
+ }
+
+ if (!fill && !stroke && !style) {
+ return;
+ }
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
+ bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true);
+ bool ingroups = TRUE;
+
+ GSList *all_list = get_all_items(NULL, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, NULL);
+ GSList *all_matches = NULL;
+
+ Inkscape::Selection *selection = sp_desktop_selection (desktop);
+
+ for (GSList const* sel_iter = selection->itemList(); sel_iter; sel_iter = sel_iter->next) {
+ SPItem *sel = SP_ITEM(sel_iter->data);
+ GSList *matches = all_list;
+ if (fill) {
+ matches = sp_get_same_fill_or_stroke_color(sel, matches, SP_FILL_COLOR);
+ }
+ if (stroke) {
+ matches = sp_get_same_fill_or_stroke_color(sel, matches, SP_STROKE_COLOR);
+ }
+ if (style) {
+ matches = sp_get_same_stroke_style(sel, matches, SP_STROKE_STYLE_WIDTH);
+ matches = sp_get_same_stroke_style(sel, matches, SP_STROKE_STYLE_DASHES);
+ matches = sp_get_same_stroke_style(sel, matches, SP_STROKE_STYLE_MARKERS);
+ }
+ all_matches = g_slist_concat (all_matches, matches);
+ }
+
+ selection->clear();
+ selection->setList(all_matches);
+
+ if (all_matches) {
+ g_slist_free(all_matches);
+ }
+ if (all_list) {
+ g_slist_free(all_list);
+ }
+
+}
+
+
+/*
+ * Selects all the visible items with the same stroke style as the items in the current selection
+ *
+ * Params:
+ * desktop - set the selection on this desktop
+ */
+void sp_select_same_stroke_style(SPDesktop *desktop)
+{
+ if (!desktop) {
+ return;
+ }
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
+ bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true);
+ bool ingroups = TRUE;
+
+ GSList *all_list = get_all_items(NULL, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, NULL);
+ GSList *matches = all_list;
+
+ Inkscape::Selection *selection = sp_desktop_selection (desktop);
+
+ for (GSList const* sel_iter = selection->itemList(); sel_iter; sel_iter = sel_iter->next) {
+ SPItem *sel = SP_ITEM(sel_iter->data);
+ matches = sp_get_same_stroke_style(sel, matches, SP_STROKE_STYLE_WIDTH);
+ matches = sp_get_same_stroke_style(sel, matches, SP_STROKE_STYLE_DASHES);
+ matches = sp_get_same_stroke_style(sel, matches, SP_STROKE_STYLE_MARKERS);
+ }
+
+ selection->clear();
+ selection->setList(matches);
+
+ if (matches) {
+ g_slist_free(matches);
+ }
+ if (all_list) {
+ g_slist_free(all_list);
+ }
+}
+
+/*
+ * Find all items in src list that have the same fill or stroke style as sel
+ * Return the list of matching items
+ */
+GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrokeStyleType type)
+{
+ GSList *matches = NULL;
+ gboolean match = false;
+
+ SPIPaint *sel_paint = (type == SP_FILL_COLOR) ? &(sel->style->fill) : &(sel->style->stroke);
+
+ for (GSList *i = src; i != NULL; i = i->next) {
+ SPItem *iter = SP_ITEM(i->data);
+ SPIPaint *iter_paint = (type == SP_FILL_COLOR) ? &(iter->style->fill) : &(iter->style->stroke);
+ match = false;
+ if (sel_paint->isColor() && iter_paint->isColor() // color == color comparision doesnt seem to work here.
+ && (sel_paint->value.color.toRGBA32(1.0) == iter_paint->value.color.toRGBA32(1.0))) {
+ match = true;
+ } else if (sel_paint->isPaintserver() && iter_paint->isPaintserver()) {
+
+ SPPaintServer *sel_server =
+ (type == SP_FILL_COLOR) ? sel->style->getFillPaintServer() : sel->style->getStrokePaintServer();
+ SPPaintServer *iter_server =
+ (type == SP_FILL_COLOR) ? iter->style->getFillPaintServer() : iter->style->getStrokePaintServer();
+
+ if ((SP_IS_LINEARGRADIENT(sel_server) || SP_IS_RADIALGRADIENT(sel_server) ||
+ (SP_IS_GRADIENT(sel_server) && SP_GRADIENT(sel_server)->getVector()->isSwatch()))
+ &&
+ (SP_IS_LINEARGRADIENT(iter_server) || SP_IS_RADIALGRADIENT(iter_server) ||
+ (SP_IS_GRADIENT(iter_server) && SP_GRADIENT(iter_server)->getVector()->isSwatch()))) {
+ SPGradient *sel_vector = SP_GRADIENT(sel_server)->getVector();
+ SPGradient *iter_vector = SP_GRADIENT(iter_server)->getVector();
+ if (sel_vector == iter_vector) {
+ match = true;
+ }
+
+ } else if (SP_IS_PATTERN(sel_server) && SP_IS_PATTERN(iter_server)) {
+ SPPattern *sel_pat = pattern_getroot(SP_PATTERN(sel_server));
+ SPPattern *iter_pat = pattern_getroot(SP_PATTERN(iter_server));
+ if (sel_pat == iter_pat) {
+ match = true;
+ }
+ }
+ } else if (sel_paint->isNone() && iter_paint->isNone()) {
+ match = true;
+ } else if (sel_paint->isNoneSet() && iter_paint->isNoneSet()) {
+ match = true;
+ }
+
+ if (match) {
+ matches = g_slist_prepend(matches, iter);
+ }
+ }
+
+ return matches;
+}
+
+/*
+ * Find all items in src list that have the same stroke style as sel by type
+ * Return the list of matching items
+ */
+GSList *sp_get_same_stroke_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type)
+{
+ GSList *matches = NULL;
+ gboolean match = false;
+
+ SPStyle *sel_style = sel->style;
+
+ if (type == SP_FILL_COLOR || type == SP_STROKE_COLOR) {
+ return sp_get_same_fill_or_stroke_color(sel, src, type);
+ }
+
+ /*
+ * Stroke width needs to handle transformations, so call this function
+ * to get the transformed stroke width
+ */
+ GSList *objects = NULL;
+ SPStyle *sel_style_for_width = NULL;
+ if (type == SP_STROKE_STYLE_WIDTH) {
+ objects = g_slist_prepend(objects, sel);
+ sel_style_for_width = sp_style_new (SP_ACTIVE_DOCUMENT);
+ objects_query_strokewidth (objects, sel_style_for_width);
+ }
+
+ for (GSList *i = src; i != NULL; i = i->next) {
+ SPItem *iter = SP_ITEM(i->data);
+ SPStyle *iter_style = iter->style;
+ match = false;
+
+ if (type == SP_STROKE_STYLE_WIDTH) {
+ match = (sel_style->stroke_width.set == iter_style->stroke_width.set);
+ if (sel_style->stroke_width.set && iter_style->stroke_width.set) {
+ GSList *objects = NULL;
+ objects = g_slist_prepend(objects, iter);
+ SPStyle *iter_style_for_width = sp_style_new (SP_ACTIVE_DOCUMENT);
+ objects_query_strokewidth (objects, iter_style_for_width);
+
+ if (sel_style_for_width) {
+ match = (sel_style_for_width->stroke_width.computed == iter_style_for_width->stroke_width.computed);
+ }
+ g_slist_free(objects);
+ }
+ }
+ else if (type == SP_STROKE_STYLE_DASHES ) {
+ match = (sel_style->stroke_dasharray_set == iter_style->stroke_dasharray_set);
+ if (sel_style->stroke_dasharray_set && iter_style->stroke_dasharray_set) {
+ match = (sel_style->stroke_dash.n_dash == iter_style->stroke_dash.n_dash);
+ if (sel_style->stroke_dash.n_dash == iter_style->stroke_dash.n_dash) {
+ for (int i = 0; i < sel_style->stroke_dash.n_dash; i++) {
+ if (sel_style->stroke_dash.dash[i] != iter_style->stroke_dash.dash[i]) {
+ match = false;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (type == SP_STROKE_STYLE_MARKERS) {
+ match = true;
+ int len = sizeof(sel_style->marker)/sizeof(SPIString);
+ for (int i = 0; i < len; i++) {
+ match = (sel_style->marker[i].set == iter_style->marker[i].set);
+ if (sel_style->marker[i].set && iter_style->marker[i].set &&
+ (strcmp(sel_style->marker[i].value, iter_style->marker[i].value))) {
+ match = false;
+ break;
+ }
+ }
+ }
+
+ if (match) {
+ matches = g_slist_prepend(matches, iter);
+ }
+ }
+
+ g_slist_free(objects);
+
+ return matches;
+}
+
// helper function:
static
Geom::Point
@@ -2907,7 +3175,7 @@ void sp_selection_create_bitmap_copy(SPDesktop *desktop)
// Clean up
Inkscape::GC::release(repr);
- gdk_pixbuf_unref(pb);
+ g_object_unref(pb);
// Complete undoable transaction
DocumentUndo::done(document, SP_VERB_SELECTION_CREATE_BITMAP,
diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h
index 1b09d98c9..ccb152602 100644
--- a/src/selection-chemistry.h
+++ b/src/selection-chemistry.h
@@ -36,6 +36,10 @@ namespace Inkscape {
static void selectAll(SPDesktop *desktop);
static void selectAllInAll(SPDesktop *desktop);
static void selectNone(SPDesktop *desktop);
+ static void selectSameFillStroke(SPDesktop *dt);
+ static void selectSameFillColor(SPDesktop *dt);
+ static void selectSameStrokeColor(SPDesktop *dt);
+ static void selectSameStrokeStyle(SPDesktop *dt);
static void invert(SPDesktop *desktop);
static void invertAllInAll(SPDesktop *desktop);
static void reverse(SPDesktop *dt);
@@ -120,6 +124,19 @@ void sp_selection_next_patheffect_param(SPDesktop * dt);
void sp_selection_edit_clip_or_mask(SPDesktop * dt, bool clip);
+enum SPSelectStrokeStyleType {
+ SP_FILL_COLOR = 0,
+ SP_STROKE_COLOR = 1,
+ SP_STROKE_STYLE_WIDTH = 2,
+ SP_STROKE_STYLE_DASHES = 3,
+ SP_STROKE_STYLE_MARKERS = 4
+};
+
+void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolean strok, gboolean style);
+void sp_select_same_stroke_style(SPDesktop *desktop);
+GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrokeStyleType type);
+GSList *sp_get_same_stroke_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type);
+
void scroll_to_show_item(SPDesktop *desktop, SPItem *item);
void sp_undo (SPDesktop *desktop, SPDocument *doc);
diff --git a/src/seltrans-handles.cpp b/src/seltrans-handles.cpp
index 10b87aaff..fc03789d6 100644
--- a/src/seltrans-handles.cpp
+++ b/src/seltrans-handles.cpp
@@ -3,29 +3,29 @@
SPSelTransHandle const handles_scale[] = {
//anchor cursor control action request x y
- {GTK_ANCHOR_SE, GDK_TOP_LEFT_CORNER, 0, sp_sel_trans_scale, sp_sel_trans_scale_request, 0, 1},
- {GTK_ANCHOR_S, GDK_TOP_SIDE, 3, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 0.5, 1},
- {GTK_ANCHOR_SW, GDK_TOP_RIGHT_CORNER, 1, sp_sel_trans_scale, sp_sel_trans_scale_request, 1, 1},
- {GTK_ANCHOR_W, GDK_RIGHT_SIDE, 2, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 1, 0.5},
- {GTK_ANCHOR_NW, GDK_BOTTOM_RIGHT_CORNER, 0, sp_sel_trans_scale, sp_sel_trans_scale_request, 1, 0},
- {GTK_ANCHOR_N, GDK_BOTTOM_SIDE, 3, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 0.5, 0},
- {GTK_ANCHOR_NE, GDK_BOTTOM_LEFT_CORNER, 1, sp_sel_trans_scale, sp_sel_trans_scale_request, 0, 0},
- {GTK_ANCHOR_E, GDK_LEFT_SIDE, 2, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 0, 0.5}
+ {SP_ANCHOR_SE, GDK_TOP_LEFT_CORNER, 0, sp_sel_trans_scale, sp_sel_trans_scale_request, 0, 1},
+ {SP_ANCHOR_S, GDK_TOP_SIDE, 3, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 0.5, 1},
+ {SP_ANCHOR_SW, GDK_TOP_RIGHT_CORNER, 1, sp_sel_trans_scale, sp_sel_trans_scale_request, 1, 1},
+ {SP_ANCHOR_W, GDK_RIGHT_SIDE, 2, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 1, 0.5},
+ {SP_ANCHOR_NW, GDK_BOTTOM_RIGHT_CORNER, 0, sp_sel_trans_scale, sp_sel_trans_scale_request, 1, 0},
+ {SP_ANCHOR_N, GDK_BOTTOM_SIDE, 3, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 0.5, 0},
+ {SP_ANCHOR_NE, GDK_BOTTOM_LEFT_CORNER, 1, sp_sel_trans_scale, sp_sel_trans_scale_request, 0, 0},
+ {SP_ANCHOR_E, GDK_LEFT_SIDE, 2, sp_sel_trans_stretch, sp_sel_trans_stretch_request, 0, 0.5}
};
SPSelTransHandle const handles_rotate[] = {
- {GTK_ANCHOR_SE, GDK_EXCHANGE, 4, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 0, 1},
- {GTK_ANCHOR_S, GDK_SB_H_DOUBLE_ARROW, 5, sp_sel_trans_skew, sp_sel_trans_skew_request, 0.5, 1},
- {GTK_ANCHOR_SW, GDK_EXCHANGE, 6, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 1, 1},
- {GTK_ANCHOR_W, GDK_SB_V_DOUBLE_ARROW, 7, sp_sel_trans_skew, sp_sel_trans_skew_request, 1, 0.5},
- {GTK_ANCHOR_NW, GDK_EXCHANGE, 8, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 1, 0},
- {GTK_ANCHOR_N, GDK_SB_H_DOUBLE_ARROW, 9, sp_sel_trans_skew, sp_sel_trans_skew_request, 0.5, 0},
- {GTK_ANCHOR_NE, GDK_EXCHANGE, 10, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 0, 0},
- {GTK_ANCHOR_E, GDK_SB_V_DOUBLE_ARROW, 11, sp_sel_trans_skew, sp_sel_trans_skew_request, 0, 0.5}
+ {SP_ANCHOR_SE, GDK_EXCHANGE, 4, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 0, 1},
+ {SP_ANCHOR_S, GDK_SB_H_DOUBLE_ARROW, 5, sp_sel_trans_skew, sp_sel_trans_skew_request, 0.5, 1},
+ {SP_ANCHOR_SW, GDK_EXCHANGE, 6, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 1, 1},
+ {SP_ANCHOR_W, GDK_SB_V_DOUBLE_ARROW, 7, sp_sel_trans_skew, sp_sel_trans_skew_request, 1, 0.5},
+ {SP_ANCHOR_NW, GDK_EXCHANGE, 8, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 1, 0},
+ {SP_ANCHOR_N, GDK_SB_H_DOUBLE_ARROW, 9, sp_sel_trans_skew, sp_sel_trans_skew_request, 0.5, 0},
+ {SP_ANCHOR_NE, GDK_EXCHANGE, 10, sp_sel_trans_rotate, sp_sel_trans_rotate_request, 0, 0},
+ {SP_ANCHOR_E, GDK_SB_V_DOUBLE_ARROW, 11, sp_sel_trans_skew, sp_sel_trans_skew_request, 0, 0.5}
};
SPSelTransHandle const handle_center =
- {GTK_ANCHOR_CENTER, GDK_CROSSHAIR, 12, sp_sel_trans_center, sp_sel_trans_center_request, 0.5, 0.5};
+ {SP_ANCHOR_CENTER, GDK_CROSSHAIR, 12, sp_sel_trans_center, sp_sel_trans_center_request, 0.5, 0.5};
/*
diff --git a/src/seltrans-handles.h b/src/seltrans-handles.h
index 53dbd3cda..f58524c1a 100644
--- a/src/seltrans-handles.h
+++ b/src/seltrans-handles.h
@@ -15,6 +15,7 @@
#include "display/sodipodi-ctrl.h"
#include <2geom/forward.h>
#include <gdk/gdk.h>
+#include "enums.h"
namespace Inkscape
{
@@ -43,7 +44,7 @@ void sp_sel_trans_rotate(Inkscape::SelTrans *seltrans, SPSelTransHandle const &h
void sp_sel_trans_center(Inkscape::SelTrans *seltrans, SPSelTransHandle const &handle, Geom::Point &p, guint state);
struct SPSelTransHandle {
- GtkAnchorType anchor;
+ SPAnchorType anchor;
GdkCursorType cursor;
guint control;
void (* action) (Inkscape::SelTrans *seltrans, SPSelTransHandle const &handle, Geom::Point &p, guint state);
diff --git a/src/seltrans.cpp b/src/seltrans.cpp
index 45574fee1..246dd82e0 100644
--- a/src/seltrans.cpp
+++ b/src/seltrans.cpp
@@ -47,6 +47,10 @@
#include <2geom/angle.h>
#include "display/snap-indicator.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_space 0x020
+#endif
+
using Inkscape::DocumentUndo;
static void sp_remove_handles(SPKnot *knot[], gint num);
@@ -65,7 +69,7 @@ static gboolean sp_seltrans_handle_event(SPKnot *knot, GdkEvent *event, gpointer
case GDK_MOTION_NOTIFY:
break;
case GDK_KEY_PRESS:
- if (get_group0_keyval (&event->key) == GDK_space) {
+ if (get_group0_keyval (&event->key) == GDK_KEY_space) {
/* stamping mode: both mode(show content and outline) operation with knot */
if (!SP_KNOT_IS_GRABBED(knot)) {
return FALSE;
@@ -125,7 +129,7 @@ Inkscape::SelTrans::SelTrans(SPDesktop *desktop) :
_norm = sp_canvas_item_new(sp_desktop_controls(desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"mode", SP_CTRL_MODE_COLOR,
"shape", SP_CTRL_SHAPE_BITMAP,
"size", 13.0,
@@ -138,7 +142,7 @@ Inkscape::SelTrans::SelTrans(SPDesktop *desktop) :
_grip = sp_canvas_item_new(sp_desktop_controls(desktop),
SP_TYPE_CTRL,
- "anchor", GTK_ANCHOR_CENTER,
+ "anchor", SP_ANCHOR_CENTER,
"mode", SP_CTRL_MODE_XOR,
"shape", SP_CTRL_SHAPE_CROSS,
"size", 7.0,
@@ -750,7 +754,7 @@ static void sp_sel_trans_handle_click(SPKnot *knot, guint state, gpointer data)
void Inkscape::SelTrans::handleClick(SPKnot */*knot*/, guint state, SPSelTransHandle const &handle)
{
switch (handle.anchor) {
- case GTK_ANCHOR_CENTER:
+ case SP_ANCHOR_CENTER:
if (state & GDK_SHIFT_MASK) {
// Unset the center position for all selected items
for (GSList const *l = _desktop->selection->itemList(); l; l = l->next) {
@@ -772,7 +776,7 @@ void Inkscape::SelTrans::handleClick(SPKnot */*knot*/, guint state, SPSelTransHa
void Inkscape::SelTrans::handleGrab(SPKnot *knot, guint /*state*/, SPSelTransHandle const &handle)
{
switch (handle.anchor) {
- case GTK_ANCHOR_CENTER:
+ case SP_ANCHOR_CENTER:
g_object_set(G_OBJECT(_grip),
"shape", SP_CTRL_SHAPE_BITMAP,
"size", 13.0,
diff --git a/src/shortcuts.cpp b/src/shortcuts.cpp
index fe1d31331..57fc59614 100644
--- a/src/shortcuts.cpp
+++ b/src/shortcuts.cpp
@@ -25,6 +25,7 @@
#include <vector>
#include <cstring>
#include <string>
+#include <map>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
@@ -38,6 +39,10 @@
#include "xml/node-iterators.h"
#include "xml/repr.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#endif
+
using namespace Inkscape;
static void sp_shortcut_set(unsigned int const shortcut, Inkscape::Verb *const verb, bool const is_primary);
@@ -60,8 +65,8 @@ sp_shortcut_invoke(unsigned int shortcut, Inkscape::UI::View::View *view)
return false;
}
-static GHashTable *verbs = NULL;
-static GHashTable *primary_shortcuts = NULL;
+static std::map<unsigned int, Inkscape::Verb * > *verbs = NULL;
+static std::map<Inkscape::Verb *, unsigned int> *primary_shortcuts = NULL;
static void
sp_shortcut_init()
@@ -71,8 +76,8 @@ sp_shortcut_init()
using Inkscape::IO::Resource::USER;
using Inkscape::IO::Resource::KEYS;
- verbs = g_hash_table_new(NULL, NULL);
- primary_shortcuts = g_hash_table_new(NULL, NULL);
+ verbs = new std::map<unsigned int, Inkscape::Verb * >();
+ primary_shortcuts = new std::map<Inkscape::Verb *, unsigned int>();
read_shortcuts_file(get_path(SYSTEM, KEYS, "default.xml"));
try_shortcuts_file(get_path(USER, KEYS, "default.xml"));
@@ -126,7 +131,7 @@ static void read_shortcuts_file(char const *filename) {
}
guint keyval=gdk_keyval_from_name(keyval_name);
- if (keyval == GDK_VoidSymbol || keyval == 0) {
+ if (keyval == GDK_KEY_VoidSymbol || keyval == 0) {
g_warning("Unknown keyval %s for %s", keyval_name, verb_name);
continue;
}
@@ -175,20 +180,20 @@ sp_shortcut_set(unsigned int const shortcut, Inkscape::Verb *const verb, bool co
{
if (!verbs) sp_shortcut_init();
- Inkscape::Verb *old_verb = (Inkscape::Verb *)(g_hash_table_lookup(verbs, GINT_TO_POINTER(shortcut)));
- g_hash_table_insert(verbs, GINT_TO_POINTER(shortcut), (gpointer)(verb));
+ Inkscape::Verb *old_verb = (*verbs)[shortcut];
+ (*verbs)[shortcut] = verb;
/* Maintain the invariant that sp_shortcut_get_primary(v) returns either 0 or a valid shortcut for v. */
if (old_verb && old_verb != verb) {
- unsigned int const old_primary = (unsigned int)GPOINTER_TO_INT(g_hash_table_lookup(primary_shortcuts, (gpointer)old_verb));
+ unsigned int const old_primary = (*primary_shortcuts)[old_verb];
if (old_primary == shortcut) {
- g_hash_table_insert(primary_shortcuts, (gpointer)old_verb, GINT_TO_POINTER(0));
+ (*primary_shortcuts)[old_verb] = 0;
}
}
if (is_primary) {
- g_hash_table_insert(primary_shortcuts, (gpointer)(verb), GINT_TO_POINTER(shortcut));
+ (*primary_shortcuts)[verb] = shortcut;
}
}
@@ -196,18 +201,18 @@ Inkscape::Verb *
sp_shortcut_get_verb(unsigned int shortcut)
{
if (!verbs) sp_shortcut_init();
- return (Inkscape::Verb *)(g_hash_table_lookup(verbs, GINT_TO_POINTER(shortcut)));
+ return (*verbs)[shortcut];
}
unsigned int sp_shortcut_get_primary(Inkscape::Verb *verb)
{
- unsigned int result = GDK_VoidSymbol;
+ unsigned int result = GDK_KEY_VoidSymbol;
if (!primary_shortcuts) {
sp_shortcut_init();
}
- gpointer value = 0;
- if (g_hash_table_lookup_extended(primary_shortcuts, static_cast<gpointer>(verb), NULL, &value)) {
- result = static_cast<unsigned int>(GPOINTER_TO_INT(value));
+
+ if (primary_shortcuts->count(verb)) {
+ result = (*primary_shortcuts)[verb];
}
return result;
}
@@ -224,7 +229,7 @@ gchar *sp_shortcut_get_label(unsigned int shortcut)
* gtk_label_set_text_with_mnemonic(lbl, str).
*/
gchar *result = 0;
- if (shortcut != GDK_VoidSymbol) {
+ if (shortcut != GDK_KEY_VoidSymbol) {
result = gtk_accelerator_get_label(
shortcut & (~SP_SHORTCUT_MODIFIER_MASK), static_cast<GdkModifierType>(
((shortcut & SP_SHORTCUT_SHIFT_MASK) ? GDK_SHIFT_MASK : 0) |
diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp
index b39694b3a..a20856f53 100644
--- a/src/sp-filter.cpp
+++ b/src/sp-filter.cpp
@@ -564,7 +564,7 @@ Glib::ustring sp_filter_get_new_result_name(SPFilter *filter) {
int index;
if (result)
{
- if (sscanf(result, "result%d", &index) == 1)
+ if (sscanf(result, "result%5d", &index) == 1)
{
if (index > largest)
{
diff --git a/src/sp-font-face.cpp b/src/sp-font-face.cpp
index 05f71cbf6..e9faabdc6 100644
--- a/src/sp-font-face.cpp
+++ b/src/sp-font-face.cpp
@@ -27,38 +27,6 @@
#include <cstring>
-//TODO: apparently unused. Maybe should be removed.
-class ObjectContainer
-{
-
-public:
- ObjectContainer(double def){
- this->isset = false;
- this->default_value = def;
- }
-
- double get(){
- if (this->isset)
- return this->obj;
- else
- return this->default_value;
- }
-
- void set(double val){
- this->obj = val;
- this->isset = true;
- }
-
- void unset(){
- this->isset = false;
- }
-
-private:
- double obj;
- double default_value;
- bool isset;
-};
-
static std::vector<FontFaceStyleType> sp_read_fontFaceStyleType(gchar const *value){
std::vector<FontFaceStyleType> v;
diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp
index 0934c0705..1a99485f6 100644
--- a/src/sp-gradient.cpp
+++ b/src/sp-gradient.cpp
@@ -1018,7 +1018,7 @@ void SPGradient::rebuildVector()
vector.stops.clear();
- SPGradient *reffed = ref->getObject();
+ SPGradient *reffed = ref ? ref->getObject() : NULL;
if ( !hasStops() && reffed ) {
/* Copy vector from referenced gradient */
vector.built = true; // Prevent infinite recursion.
diff --git a/src/sp-image.cpp b/src/sp-image.cpp
index df0d052dd..07885ff4d 100644
--- a/src/sp-image.cpp
+++ b/src/sp-image.cpp
@@ -657,7 +657,7 @@ static void sp_image_release( SPObject *object )
}
if (image->pixbuf) {
- gdk_pixbuf_unref (image->pixbuf);
+ g_object_unref (image->pixbuf);
image->pixbuf = NULL;
}
@@ -815,7 +815,7 @@ static void sp_image_update( SPObject *object, SPCtx *ctx, unsigned int flags )
if (flags & SP_IMAGE_HREF_MODIFIED_FLAG) {
if (image->pixbuf) {
- gdk_pixbuf_unref (image->pixbuf);
+ g_object_unref (image->pixbuf);
image->pixbuf = NULL;
}
if ( image->pixPath ) {
@@ -1254,7 +1254,7 @@ static GdkPixbuf *sp_image_pixbuf_force_rgba( GdkPixbuf * pixbuf )
result = pixbuf;
} else {
result = gdk_pixbuf_add_alpha(pixbuf, FALSE, 0, 0, 0);
- gdk_pixbuf_unref(pixbuf);
+ g_object_unref(pixbuf);
}
return result;
}
diff --git a/src/sp-item.cpp b/src/sp-item.cpp
index f7f957a6f..d6395cfee 100644
--- a/src/sp-item.cpp
+++ b/src/sp-item.cpp
@@ -1282,16 +1282,23 @@ void SPItem::doWriteTransform(Inkscape::XML::Node *repr, Geom::Affine const &tra
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (compensate) {
-
- // recursively compensating for stroke scaling will not work, because it can be scaled to zero or infinite
+ // recursively compensating for stroke scaling will not always work, because it can be scaled to zero or infinite
// from which we cannot ever recover by applying an inverse scale; therefore we temporarily block any changes
- // to the strokewidth instead, and unblock these after the transformation
+ // to the strokewidth in such a case instead, and unblock these after the transformation
// (as reported in https://bugs.launchpad.net/inkscape/+bug/825840/comments/4)
if (!prefs->getBool("/options/transform/stroke", true)) {
- freeze_stroke_width_recursive(true);
- // This will only work if the item has a set_transform method (in this method adjust_stroke() will be called)
- // We will still have to apply the inverse scaling to other items, not having a set_transform method
- // such as ellipses and stars
+ double const expansion = 1. / advertized_transform.descrim();
+ if (expansion < 1e-9 || expansion > 1e9) {
+ freeze_stroke_width_recursive(true);
+ // This will only work if the item has a set_transform method (in this method adjust_stroke() will be called)
+ // We will still have to apply the inverse scaling to other items, not having a set_transform method
+ // such as ellipses and stars
+ // PS: We cannot use this freeze_stroke_width_recursive() trick in all circumstances. For example, it will
+ // break pasting objects within their group (because in such a case the transformation of the group will affect
+ // the strokewidth, and has to be compensated for. See https://bugs.launchpad.net/inkscape/+bug/959223/comments/10)
+ } else {
+ adjust_stroke_width_recursive(expansion);
+ }
}
// recursively compensate rx/ry of a rect if requested
@@ -1325,15 +1332,19 @@ void SPItem::doWriteTransform(Inkscape::XML::Node *repr, Geom::Affine const &tra
!(!transform.isTranslation() && style && style->getFilter()) // the object does not have a filter, or the transform is translation (which is supposed to not affect filters)
) {
transform_attr = ((SPItemClass *) G_OBJECT_GET_CLASS(this))->set_transform(this, transform);
- freeze_stroke_width_recursive(false);
+ if (freeze_stroke_width) {
+ freeze_stroke_width_recursive(false);
+ }
} else {
- freeze_stroke_width_recursive(false);
- if (compensate) {
- if (!prefs->getBool("/options/transform/stroke", true)) {
- // Recursively compensate for stroke scaling, depending on user preference
- // (As to why we need to do this, see the comment a few lines above near the freeze_stroke_width_recursive(true) call)
- double const expansion = 1. / advertized_transform.descrim();
- adjust_stroke_width_recursive(expansion);
+ if (freeze_stroke_width) {
+ freeze_stroke_width_recursive(false);
+ if (compensate) {
+ if (!prefs->getBool("/options/transform/stroke", true)) {
+ // Recursively compensate for stroke scaling, depending on user preference
+ // (As to why we need to do this, see the comment a few lines above near the freeze_stroke_width_recursive(true) call)
+ double const expansion = 1. / advertized_transform.descrim();
+ adjust_stroke_width_recursive(expansion);
+ }
}
}
}
diff --git a/src/sp-path.cpp b/src/sp-path.cpp
index 3ac4666e2..107ceac16 100644
--- a/src/sp-path.cpp
+++ b/src/sp-path.cpp
@@ -377,7 +377,12 @@ sp_path_set_transform(SPItem *item, Geom::Affine const &xform)
// Transform the original-d path if this is a valid LPE item, other else the (ordinary) path
if (path->_curve_before_lpe && sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(item))) {
- path->_curve_before_lpe->transform(xform);
+ if (sp_lpe_item_has_path_effect_of_type(SP_LPE_ITEM(item), Inkscape::LivePathEffect::CLONE_ORIGINAL)) {
+ // if path has the CLONE_ORIGINAL LPE applied, don't write the transform to the pathdata, but write it 'unoptimized'
+ return xform;
+ } else {
+ path->_curve_before_lpe->transform(xform);
+ }
} else {
path->_curve->transform(xform);
}
diff --git a/src/spiral-context.cpp b/src/spiral-context.cpp
index cb2100cca..17d46ec2b 100644
--- a/src/spiral-context.cpp
+++ b/src/spiral-context.cpp
@@ -45,6 +45,72 @@
#include "verbs.h"
#include "display/sp-canvas-item.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
static void sp_spiral_context_class_init(SPSpiralContextClass * klass);
@@ -318,34 +384,34 @@ sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval(&event->key)) {
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
- case GDK_Meta_R:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
+ case GDK_KEY_Meta_R:
sp_event_show_modifier_tip(event_context->defaultMessageContext(), event,
_("<b>Ctrl</b>: snap angle"),
NULL,
_("<b>Alt</b>: lock spiral radius"));
break;
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-spiral");
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (dragging) {
dragging = false;
sp_event_context_discard_delayed_snap_event(event_context);
@@ -355,7 +421,7 @@ sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event)
}
break;
- case GDK_space:
+ case GDK_KEY_space:
if (dragging) {
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate),
event->button.time);
@@ -375,14 +441,14 @@ sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event)
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval(&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt
+ case GDK_KEY_Meta_R:
event_context->defaultMessageContext()->clear();
break;
default:
diff --git a/src/spray-context.cpp b/src/spray-context.cpp
index 89da66b8f..b10c486c7 100644
--- a/src/spray-context.cpp
+++ b/src/spray-context.cpp
@@ -72,6 +72,98 @@
#include <gdk/gdkkeysyms.h>
#include <glibmm/i18n.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_k 0x06b
+#define GDK_KEY_K 0x04b
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
using namespace std;
@@ -796,29 +888,29 @@ gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *even
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_j:
- case GDK_J:
+ case GDK_KEY_j:
+ case GDK_KEY_J:
if (MOD__SHIFT_ONLY) {
sp_spray_switch_mode(tc, SPRAY_MODE_COPY, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_k:
- case GDK_K:
+ case GDK_KEY_k:
+ case GDK_KEY_K:
if (MOD__SHIFT_ONLY) {
sp_spray_switch_mode(tc, SPRAY_MODE_CLONE, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_l:
- case GDK_L:
+ case GDK_KEY_l:
+ case GDK_KEY_L:
if (MOD__SHIFT_ONLY) {
sp_spray_switch_mode(tc, SPRAY_MODE_SINGLE_PATH, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_Up:
- case GDK_KP_Up:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
if (!MOD__CTRL_ONLY) {
tc->population += 0.01;
if (tc->population > 1.0) {
@@ -828,8 +920,8 @@ gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *even
ret = TRUE;
}
break;
- case GDK_Down:
- case GDK_KP_Down:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
if (!MOD__CTRL_ONLY) {
tc->population -= 0.01;
if (tc->population < 0.0) {
@@ -839,8 +931,8 @@ gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *even
ret = TRUE;
}
break;
- case GDK_Right:
- case GDK_KP_Right:
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
if (!MOD__CTRL_ONLY) {
tc->width += 0.01;
if (tc->width > 1.0) {
@@ -852,8 +944,8 @@ gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *even
ret = TRUE;
}
break;
- case GDK_Left:
- case GDK_KP_Left:
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
if (!MOD__CTRL_ONLY) {
tc->width -= 0.01;
if (tc->width < 0.01) {
@@ -864,33 +956,33 @@ gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *even
ret = TRUE;
}
break;
- case GDK_Home:
- case GDK_KP_Home:
+ case GDK_KEY_Home:
+ case GDK_KEY_KP_Home:
tc->width = 0.01;
desktop->setToolboxAdjustmentValue("altx-spray", tc->width * 100);
sp_spray_update_area(tc);
ret = TRUE;
break;
- case GDK_End:
- case GDK_KP_End:
+ case GDK_KEY_End:
+ case GDK_KEY_KP_End:
tc->width = 1.0;
desktop->setToolboxAdjustmentValue("altx-spray", tc->width * 100);
sp_spray_update_area(tc);
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo("altx-spray");
ret = TRUE;
}
break;
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
sp_spray_update_cursor(tc, true);
break;
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
break;
default:
break;
@@ -900,12 +992,12 @@ gint sp_spray_context_root_handler(SPEventContext *event_context, GdkEvent *even
case GDK_KEY_RELEASE: {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
switch (get_group0_keyval(&event->key)) {
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
sp_spray_update_cursor(tc, false);
break;
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
sp_spray_switch_mode (tc, prefs->getInt("/tools/spray/mode"), MOD__SHIFT);
tc->_message_context->clear();
break;
diff --git a/src/star-context.cpp b/src/star-context.cpp
index 4156384d5..226721cfc 100644
--- a/src/star-context.cpp
+++ b/src/star-context.cpp
@@ -49,6 +49,72 @@
#include "star-context.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
using Inkscape::DocumentUndo;
static void sp_star_context_class_init (SPStarContextClass * klass);
@@ -334,34 +400,34 @@ static gint sp_star_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_PRESS:
switch (get_group0_keyval(&event->key)) {
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
- case GDK_Meta_R:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt (at least on my machine)
+ case GDK_KEY_Meta_R:
sp_event_show_modifier_tip(event_context->defaultMessageContext(), event,
_("<b>Ctrl</b>: snap angle; keep rays radial"),
NULL,
NULL);
break;
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-star");
ret = TRUE;
}
break;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (dragging) {
dragging = false;
sp_event_context_discard_delayed_snap_event(event_context);
@@ -370,7 +436,7 @@ static gint sp_star_context_root_handler(SPEventContext *event_context, GdkEvent
ret = TRUE;
}
break;
- case GDK_space:
+ case GDK_KEY_space:
if (dragging) {
sp_canvas_item_ungrab(SP_CANVAS_ITEM(desktop->acetate),
event->button.time);
@@ -390,14 +456,14 @@ static gint sp_star_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval (&event->key)) {
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Meta_L: // Meta is when you press Shift+Alt
- case GDK_Meta_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
+ case GDK_KEY_Meta_L: // Meta is when you press Shift+Alt
+ case GDK_KEY_Meta_R:
event_context->defaultMessageContext()->clear();
break;
default:
diff --git a/src/svg-view.cpp b/src/svg-view.cpp
index aa6666445..7559cbb24 100644
--- a/src/svg-view.cpp
+++ b/src/svg-view.cpp
@@ -105,7 +105,11 @@ void SPSVGView::mouseover()
GdkCursor *cursor = gdk_cursor_new(GDK_HAND2);
GdkWindow *window = gtk_widget_get_window (GTK_WIDGET(SP_CANVAS_ITEM(_drawing)->canvas));
gdk_window_set_cursor(window, cursor);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cursor);
+#else
gdk_cursor_unref(cursor);
+#endif
}
void SPSVGView::mouseout()
diff --git a/src/svg/itos.cpp b/src/svg/itos.cpp
index 0f2c64ec4..ff7ca516c 100644
--- a/src/svg/itos.cpp
+++ b/src/svg/itos.cpp
@@ -18,7 +18,7 @@
#include <string> // for string
#include <cstring>
-using namespace std;
+using std::string;
string itos(int n)
{
diff --git a/src/svg/svg-color.cpp b/src/svg/svg-color.cpp
index 705e2a76f..e045a23c7 100644
--- a/src/svg/svg-color.cpp
+++ b/src/svg/svg-color.cpp
@@ -24,6 +24,8 @@
#include <glib.h> // g_assert
#include <errno.h>
+#include <map>
+
#include "strneq.h"
#include "preferences.h"
#include "svg-color.h"
@@ -39,11 +41,12 @@
#include "cms-system.h"
using std::sprintf;
+using std::string;
using Inkscape::CMSSystem;
struct SPSVGColor {
unsigned long rgb;
- char const *name;
+ const string name;
};
/*
@@ -199,18 +202,16 @@ static SPSVGColor const sp_svg_color_named[] = {
{ 0x9ACD32, "yellowgreen" }
};
-static GHashTable *sp_svg_create_color_hash();
+static std::map<string, unsigned long> sp_svg_create_color_hash();
-guint32
-sp_svg_read_color(gchar const *str, guint32 const dfl)
+guint32 sp_svg_read_color(gchar const *str, guint32 const dfl)
{
return sp_svg_read_color(str, NULL, dfl);
}
-static guint32
-internal_sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def)
+static guint32 internal_sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def)
{
- static GHashTable *colors = NULL;
+ static std::map<string, unsigned long> colors;
guint32 val = 0;
if (str == NULL) return def;
@@ -295,13 +296,13 @@ internal_sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def)
++s;
if (hasp && hasd) return def;
if (hasp) {
- val = (guint) floor(CLAMP(r, 0.0, 100.0) * 2.559999) << 24;
- val |= ((guint) floor(CLAMP(g, 0.0, 100.0) * 2.559999) << 16);
- val |= ((guint) floor(CLAMP(b, 0.0, 100.0) * 2.559999) << 8);
+ val = static_cast<guint>(floor(CLAMP(r, 0.0, 100.0) * 2.559999)) << 24;
+ val |= (static_cast<guint>(floor(CLAMP(g, 0.0, 100.0) * 2.559999)) << 16);
+ val |= (static_cast<guint>(floor(CLAMP(b, 0.0, 100.0) * 2.559999)) << 8);
} else {
- val = (guint) CLAMP(r, 0, 255) << 24;
- val |= ((guint) CLAMP(g, 0, 255) << 16);
- val |= ((guint) CLAMP(b, 0, 255) << 8);
+ val = static_cast<guint>(CLAMP(r, 0, 255)) << 24;
+ val |= (static_cast<guint>(CLAMP(g, 0, 255)) << 16);
+ val |= (static_cast<guint>(CLAMP(b, 0, 255)) << 8);
}
if (end_ptr) {
*end_ptr = s;
@@ -309,7 +310,7 @@ internal_sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def)
return val;
} else {
gint i;
- if (!colors) {
+ if (colors.empty()) {
colors = sp_svg_create_color_hash();
}
gchar c[32];
@@ -323,10 +324,10 @@ internal_sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def)
}
c[31] = '\0';
- gpointer const rgb_ptr = g_hash_table_lookup(colors, c);
- if (rgb_ptr) {
- val = *(static_cast<unsigned long *>(rgb_ptr));
- } else {
+ if (colors.count(string(c))) {
+ val = colors[string(c)];
+ }
+ else {
return def;
}
if (end_ptr) {
@@ -337,8 +338,7 @@ internal_sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def)
return (val << 8);
}
-guint32
-sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 dfl)
+guint32 sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 dfl)
{
/* I've been rather hurried in editing the above to add support for end_ptr, so I'm adding
* this check wrapper. */
@@ -369,8 +369,7 @@ sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 dfl)
* Converts an RGB colour expressed in form 0x00rrggbb to a CSS/SVG representation of that colour.
* The result is valid even in SVG Tiny or non-SVG CSS.
*/
-static void
-rgb24_to_css(char *const buf, unsigned const rgb24)
+static void rgb24_to_css(char *const buf, unsigned const rgb24)
{
assert(rgb24 < (1u << 24));
@@ -385,22 +384,22 @@ rgb24_to_css(char *const buf, unsigned const rgb24)
switch (rgb24) {
/* Extracted mechanically from the table at
* http://www.w3.org/TR/REC-html40/types.html#h-6.5 .*/
- case 0x000000: src = "black"; break;
- case 0xc0c0c0: src = "silver"; break;
- case 0x808080: src = "gray"; break;
- case 0xffffff: src = "white"; break;
- case 0x800000: src = "maroon"; break;
- case 0xff0000: src = "red"; break;
- case 0x800080: src = "purple"; break;
- case 0xff00ff: src = "fuchsia"; break;
- case 0x008000: src = "green"; break;
- case 0x00ff00: src = "lime"; break;
- case 0x808000: src = "olive"; break;
+ case 0x000000: src = "black"; break;
+ case 0xc0c0c0: src = "silver"; break;
+ case 0x808080: src = "gray"; break;
+ case 0xffffff: src = "white"; break;
+ case 0x800000: src = "maroon"; break;
+ case 0xff0000: src = "red"; break;
+ case 0x800080: src = "purple"; break;
+ case 0xff00ff: src = "fuchsia"; break;
+ case 0x008000: src = "green"; break;
+ case 0x00ff00: src = "lime"; break;
+ case 0x808000: src = "olive"; break;
case 0xffff00: src = "yellow"; break;
- case 0x000080: src = "navy"; break;
- case 0x0000ff: src = "blue"; break;
- case 0x008080: src = "teal"; break;
- case 0x00ffff: src = "aqua"; break;
+ case 0x000080: src = "navy"; break;
+ case 0x0000ff: src = "blue"; break;
+ case 0x008080: src = "teal"; break;
+ case 0x00ffff: src = "aqua"; break;
default: {
if ((rgb24 & 0xf0f0f) * 0x11 == rgb24) {
@@ -429,8 +428,7 @@ rgb24_to_css(char *const buf, unsigned const rgb24)
* \param rgba32 Colour expressed in form 0xrrggbbaa.
* \pre buflen \>= 8.
*/
-void
-sp_svg_write_color(gchar *buf, unsigned const buflen, guint32 const rgba32)
+void sp_svg_write_color(gchar *buf, unsigned const buflen, guint32 const rgba32)
{
g_assert(8 <= buflen);
@@ -443,17 +441,14 @@ sp_svg_write_color(gchar *buf, unsigned const buflen, guint32 const rgba32)
}
}
-static GHashTable *
+static std::map<string, unsigned long>
sp_svg_create_color_hash()
{
- GHashTable *colors = g_hash_table_new(g_str_hash, g_str_equal);
+ std::map<string, unsigned long> colors;
for (unsigned i = 0 ; i < G_N_ELEMENTS(sp_svg_color_named) ; i++) {
- g_hash_table_insert(colors,
- (gpointer)(sp_svg_color_named[i].name),
- (gpointer)(&sp_svg_color_named[i].rgb));
+ colors[sp_svg_color_named[i].name] = sp_svg_color_named[i].rgb;
}
-
return colors;
}
@@ -480,7 +475,7 @@ g_message("profile name: %s", icc->colorProfile.c_str());
count = 4; //do we need it? Should we allow an arbitrary number of color values? Or should we limit to a maximum? (max==4?)
}
for (gint i = 0; i < count; i++){
- color_in[i] = (guchar) ((((gdouble)icc->colors[i])*256.0) * (gdouble)scales[i]);
+ color_in[i] = static_cast<guchar>((((gdouble)icc->colors[i])*256.0) * (gdouble)scales[i]);
g_message("input[%d]: %d",i, color_in[i]);
}
diff --git a/src/text-context.cpp b/src/text-context.cpp
index 724c40aa8..c2a9b6a24 100644
--- a/src/text-context.cpp
+++ b/src/text-context.cpp
@@ -54,6 +54,105 @@
#include "xml/repr.h"
#include <gtk/gtk.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_b 0x062
+#define GDK_KEY_B 0x042
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_i 0x069
+#define GDK_KEY_I 0x049
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_k 0x06b
+#define GDK_KEY_K 0x04b
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_KP_Space 0xff80
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#define GDK_KEY_KP_Add 0xffab
+#define GDK_KEY_KP_Subtract 0xffad
+#endif
+
using Inkscape::DocumentUndo;
static void sp_text_context_class_init(SPTextContextClass *klass);
@@ -741,8 +840,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
case GDK_KEY_PRESS: {
guint const group0_keyval = get_group0_keyval(&event->key);
- if (group0_keyval == GDK_KP_Add ||
- group0_keyval == GDK_KP_Subtract) {
+ if (group0_keyval == GDK_KEY_KP_Add ||
+ group0_keyval == GDK_KEY_KP_Subtract) {
if (!(event->key.state & GDK_MOD2_MASK)) // mod2 is NumLock; if on, type +/- keys
break; // otherwise pass on keypad +/- so they can zoom
}
@@ -765,8 +864,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
keyboard shortcuts), but differs from the ISO 14755
recommendation. */
switch (group0_keyval) {
- case GDK_space:
- case GDK_KP_Space: {
+ case GDK_KEY_space:
+ case GDK_KEY_KP_Space: {
if (tc->unipos) {
insert_uni_char(tc);
}
@@ -775,7 +874,7 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
- case GDK_BackSpace: {
+ case GDK_KEY_BackSpace: {
g_return_val_if_fail(tc->unipos < sizeof(tc->uni), TRUE);
if (tc->unipos) {
tc->uni[--tc->unipos] = '\0';
@@ -784,8 +883,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
- case GDK_Return:
- case GDK_KP_Enter: {
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter: {
if (tc->unipos) {
insert_uni_char(tc);
}
@@ -795,7 +894,7 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
- case GDK_Escape: {
+ case GDK_KEY_Escape: {
// Cancel unimode.
tc->unimode = false;
gtk_im_context_reset(tc->imc);
@@ -803,8 +902,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
break;
default: {
@@ -850,14 +949,14 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
/* Neither unimode nor IM consumed key; process text tool shortcuts */
switch (group0_keyval) {
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-text");
return TRUE;
}
break;
- case GDK_space:
+ case GDK_KEY_space:
if (MOD__CTRL_ONLY) {
/* No-break space */
if (!tc->text) { // printable key; create text if none (i.e. if nascent_object)
@@ -873,8 +972,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
break;
- case GDK_U:
- case GDK_u:
+ case GDK_KEY_U:
+ case GDK_KEY_u:
if (MOD__CTRL_ONLY || (MOD__CTRL && MOD__SHIFT)) {
if (tc->unimode) {
tc->unimode = false;
@@ -890,8 +989,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
break;
- case GDK_B:
- case GDK_b:
+ case GDK_KEY_B:
+ case GDK_KEY_b:
if (MOD__CTRL_ONLY && tc->text) {
SPStyle const *style = sp_te_style_at_position(tc->text, std::min(tc->text_sel_start, tc->text_sel_end));
SPCSSAttr *css = sp_repr_css_attr_new();
@@ -912,8 +1011,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
return TRUE;
}
break;
- case GDK_I:
- case GDK_i:
+ case GDK_KEY_I:
+ case GDK_KEY_i:
if (MOD__CTRL_ONLY && tc->text) {
SPStyle const *style = sp_te_style_at_position(tc->text, std::min(tc->text_sel_start, tc->text_sel_end));
SPCSSAttr *css = sp_repr_css_attr_new();
@@ -931,8 +1030,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
break;
- case GDK_A:
- case GDK_a:
+ case GDK_KEY_A:
+ case GDK_KEY_a:
if (MOD__CTRL_ONLY && tc->text) {
Inkscape::Text::Layout const *layout = te_get_layout(tc->text);
if (layout) {
@@ -945,8 +1044,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
break;
- case GDK_Return:
- case GDK_KP_Enter:
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
{
if (!tc->text) { // printable key; create text if none (i.e. if nascent_object)
sp_text_context_setup_text(tc);
@@ -966,7 +1065,7 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
_("New line"));
return TRUE;
}
- case GDK_BackSpace:
+ case GDK_KEY_BackSpace:
if (tc->text) { // if nascent_object, do nothing, but return TRUE; same for all other delete and move keys
bool noSelection = false;
@@ -1000,8 +1099,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
_("Backspace"));
}
return TRUE;
- case GDK_Delete:
- case GDK_KP_Delete:
+ case GDK_KEY_Delete:
+ case GDK_KEY_KP_Delete:
if (tc->text) {
bool noSelection = false;
@@ -1031,9 +1130,9 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
_("Delete"));
}
return TRUE;
- case GDK_Left:
- case GDK_KP_Left:
- case GDK_KP_4:
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
+ case GDK_KEY_KP_4:
if (tc->text) {
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
@@ -1056,9 +1155,9 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
return TRUE;
- case GDK_Right:
- case GDK_KP_Right:
- case GDK_KP_6:
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
+ case GDK_KEY_KP_6:
if (tc->text) {
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
@@ -1081,9 +1180,9 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
return TRUE;
- case GDK_Up:
- case GDK_KP_Up:
- case GDK_KP_8:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_8:
if (tc->text) {
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
@@ -1106,9 +1205,9 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
return TRUE;
- case GDK_Down:
- case GDK_KP_Down:
- case GDK_KP_2:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_KP_2:
if (tc->text) {
if (MOD__ALT) {
gint mul = 1 + gobble_key_events(
@@ -1131,8 +1230,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
return TRUE;
- case GDK_Home:
- case GDK_KP_Home:
+ case GDK_KEY_Home:
+ case GDK_KEY_KP_Home:
if (tc->text) {
if (MOD__CTRL)
tc->text_sel_end.thisStartOfShape();
@@ -1142,8 +1241,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
break;
}
return TRUE;
- case GDK_End:
- case GDK_KP_End:
+ case GDK_KEY_End:
+ case GDK_KEY_KP_End:
if (tc->text) {
if (MOD__CTRL)
tc->text_sel_end.nextStartOfShape();
@@ -1153,23 +1252,23 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
break;
}
return TRUE;
- case GDK_Page_Down:
- case GDK_KP_Page_Down:
+ case GDK_KEY_Page_Down:
+ case GDK_KEY_KP_Page_Down:
if (tc->text) {
tc->text_sel_end.cursorDown(screenlines);
cursor_moved = true;
break;
}
return TRUE;
- case GDK_Page_Up:
- case GDK_KP_Page_Up:
+ case GDK_KEY_Page_Up:
+ case GDK_KEY_KP_Page_Up:
if (tc->text) {
tc->text_sel_end.cursorUp(screenlines);
cursor_moved = true;
break;
}
return TRUE;
- case GDK_Escape:
+ case GDK_KEY_Escape:
if (tc->creating) {
tc->creating = 0;
if (tc->grabbed) {
@@ -1182,7 +1281,7 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
tc->nascent_object = FALSE;
return TRUE;
- case GDK_bracketleft:
+ case GDK_KEY_bracketleft:
if (tc->text) {
if (MOD__ALT || MOD__CTRL) {
if (MOD__ALT) {
@@ -1203,7 +1302,7 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
break;
- case GDK_bracketright:
+ case GDK_KEY_bracketright:
if (tc->text) {
if (MOD__ALT || MOD__CTRL) {
if (MOD__ALT) {
@@ -1224,8 +1323,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
break;
- case GDK_less:
- case GDK_comma:
+ case GDK_KEY_less:
+ case GDK_KEY_comma:
if (tc->text) {
if (MOD__ALT) {
if (MOD__CTRL) {
@@ -1249,8 +1348,8 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
}
break;
- case GDK_greater:
- case GDK_period:
+ case GDK_KEY_greater:
+ case GDK_KEY_period:
if (tc->text) {
if (MOD__ALT) {
if (MOD__CTRL) {
@@ -1291,13 +1390,13 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
} else return TRUE; // return the "I took care of it" value if it was consumed by the IM
} else { // do nothing if there's no object to type in - the key will be sent to parent context,
// except up/down that are swallowed to prevent the zoom field from activation
- if ((group0_keyval == GDK_Up ||
- group0_keyval == GDK_Down ||
- group0_keyval == GDK_KP_Up ||
- group0_keyval == GDK_KP_Down )
+ if ((group0_keyval == GDK_KEY_Up ||
+ group0_keyval == GDK_KEY_Down ||
+ group0_keyval == GDK_KEY_KP_Up ||
+ group0_keyval == GDK_KEY_KP_Down )
&& !MOD__CTRL_ONLY) {
return TRUE;
- } else if (group0_keyval == GDK_Escape) { // cancel rubberband
+ } else if (group0_keyval == GDK_KEY_Escape) { // cancel rubberband
if (tc->creating) {
tc->creating = 0;
if (tc->grabbed) {
@@ -1306,7 +1405,7 @@ static gint sp_text_context_root_handler(SPEventContext *const event_context, Gd
}
Inkscape::Rubberband::get(desktop)->stop();
}
- } else if ((group0_keyval == GDK_x || group0_keyval == GDK_X) && MOD__ALT_ONLY) {
+ } else if ((group0_keyval == GDK_KEY_x || group0_keyval == GDK_KEY_X) && MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-text");
return TRUE;
}
diff --git a/src/tweak-context.cpp b/src/tweak-context.cpp
index 3d4bde2ac..112711d3b 100644
--- a/src/tweak-context.cpp
+++ b/src/tweak-context.cpp
@@ -81,6 +81,65 @@ using Inkscape::DocumentUndo;
#define DYNA_MIN_WIDTH 1.0e-6
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_M 0x04d
+#define GDK_KEY_m 0x06d
+#define GDK_KEY_0 0x030
+#define GDK_KEY_1 0x031
+#define GDK_KEY_2 0x032
+#define GDK_KEY_3 0x033
+#define GDK_KEY_4 0x034
+#define GDK_KEY_5 0x035
+#define GDK_KEY_6 0x036
+#define GDK_KEY_7 0x037
+#define GDK_KEY_8 0x038
+#define GDK_KEY_9 0x039
+#define GDK_KEY_I 0x049
+#define GDK_KEY_i 0x069
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_period 0x02e
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_P 0x050
+#define GDK_KEY_p 0x070
+#define GDK_KEY_S 0x053
+#define GDK_KEY_s 0x073
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_R 0x052
+#define GDK_KEY_r 0x072
+#define GDK_KEY_c 0x063
+#define GDK_KEY_C 0x043
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_b 0x062
+#define GDK_KEY_B 0x042
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_X 0x058
+#define GDK_KEY_x 0x078
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#endif
+
static void sp_tweak_context_class_init(SPTweakContextClass *klass);
static void sp_tweak_context_init(SPTweakContext *ddc);
static void sp_tweak_context_dispose(GObject *object);
@@ -1322,112 +1381,112 @@ sp_tweak_context_root_handler(SPEventContext *event_context,
case GDK_KEY_PRESS:
{
switch (get_group0_keyval (&event->key)) {
- case GDK_m:
- case GDK_M:
- case GDK_0:
+ case GDK_KEY_m:
+ case GDK_KEY_M:
+ case GDK_KEY_0:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_MOVE, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_i:
- case GDK_I:
- case GDK_1:
+ case GDK_KEY_i:
+ case GDK_KEY_I:
+ case GDK_KEY_1:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_MOVE_IN_OUT, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_z:
- case GDK_Z:
- case GDK_2:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
+ case GDK_KEY_2:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_MOVE_JITTER, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_less:
- case GDK_comma:
- case GDK_greater:
- case GDK_period:
- case GDK_3:
+ case GDK_KEY_less:
+ case GDK_KEY_comma:
+ case GDK_KEY_greater:
+ case GDK_KEY_period:
+ case GDK_KEY_3:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_SCALE, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_bracketright:
- case GDK_bracketleft:
- case GDK_4:
+ case GDK_KEY_bracketright:
+ case GDK_KEY_bracketleft:
+ case GDK_KEY_4:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_ROTATE, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_d:
- case GDK_D:
- case GDK_5:
+ case GDK_KEY_d:
+ case GDK_KEY_D:
+ case GDK_KEY_5:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_MORELESS, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_p:
- case GDK_P:
- case GDK_6:
+ case GDK_KEY_p:
+ case GDK_KEY_P:
+ case GDK_KEY_6:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_PUSH, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_s:
- case GDK_S:
- case GDK_7:
+ case GDK_KEY_s:
+ case GDK_KEY_S:
+ case GDK_KEY_7:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_SHRINK_GROW, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_a:
- case GDK_A:
- case GDK_8:
+ case GDK_KEY_a:
+ case GDK_KEY_A:
+ case GDK_KEY_8:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_ATTRACT_REPEL, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_r:
- case GDK_R:
- case GDK_9:
+ case GDK_KEY_r:
+ case GDK_KEY_R:
+ case GDK_KEY_9:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_ROUGHEN, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_c:
- case GDK_C:
+ case GDK_KEY_c:
+ case GDK_KEY_C:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_COLORPAINT, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_j:
- case GDK_J:
+ case GDK_KEY_j:
+ case GDK_KEY_J:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_COLORJITTER, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_b:
- case GDK_B:
+ case GDK_KEY_b:
+ case GDK_KEY_B:
if (MOD__SHIFT_ONLY) {
sp_tweak_switch_mode(tc, TWEAK_MODE_BLUR, MOD__SHIFT);
ret = TRUE;
}
break;
- case GDK_Up:
- case GDK_KP_Up:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
if (!MOD__CTRL_ONLY) {
tc->force += 0.05;
if (tc->force > 1.0) {
@@ -1437,8 +1496,8 @@ sp_tweak_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Down:
- case GDK_KP_Down:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
if (!MOD__CTRL_ONLY) {
tc->force -= 0.05;
if (tc->force < 0.0) {
@@ -1448,8 +1507,8 @@ sp_tweak_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Right:
- case GDK_KP_Right:
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
if (!MOD__CTRL_ONLY) {
tc->width += 0.01;
if (tc->width > 1.0) {
@@ -1460,8 +1519,8 @@ sp_tweak_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Left:
- case GDK_KP_Left:
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
if (!MOD__CTRL_ONLY) {
tc->width -= 0.01;
if (tc->width < 0.01) {
@@ -1472,35 +1531,35 @@ sp_tweak_context_root_handler(SPEventContext *event_context,
ret = TRUE;
}
break;
- case GDK_Home:
- case GDK_KP_Home:
+ case GDK_KEY_Home:
+ case GDK_KEY_KP_Home:
tc->width = 0.01;
desktop->setToolboxAdjustmentValue ("altx-tweak", tc->width * 100);
sp_tweak_update_area(tc);
ret = TRUE;
break;
- case GDK_End:
- case GDK_KP_End:
+ case GDK_KEY_End:
+ case GDK_KEY_KP_End:
tc->width = 1.0;
desktop->setToolboxAdjustmentValue ("altx-tweak", tc->width * 100);
sp_tweak_update_area(tc);
ret = TRUE;
break;
- case GDK_x:
- case GDK_X:
+ case GDK_KEY_x:
+ case GDK_KEY_X:
if (MOD__ALT_ONLY) {
desktop->setToolboxFocusTo ("altx-tweak");
ret = TRUE;
}
break;
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
sp_tweak_update_cursor(tc, true);
break;
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
sp_tweak_switch_mode_temporarily(tc, TWEAK_MODE_SHRINK_GROW, MOD__SHIFT);
break;
default:
@@ -1511,12 +1570,12 @@ sp_tweak_context_root_handler(SPEventContext *event_context,
case GDK_KEY_RELEASE: {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
switch (get_group0_keyval(&event->key)) {
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
sp_tweak_update_cursor(tc, false);
break;
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
sp_tweak_switch_mode (tc, prefs->getInt("/tools/tweak/mode"), MOD__SHIFT);
tc->_message_context->clear();
break;
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index bfd8cca95..c00590ae1 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -1,7 +1,6 @@
set(ui_SRC
clipboard.cpp
- context-menu.cpp
previewholder.cpp
uxmanager.cpp
@@ -122,7 +121,6 @@ set(ui_SRC
# -------
# Headers
clipboard.h
- context-menu.h
icon-names.h
previewable.h
previewfillable.h
diff --git a/src/ui/Makefile_insert b/src/ui/Makefile_insert
index eb8966d11..19ecef0fc 100644
--- a/src/ui/Makefile_insert
+++ b/src/ui/Makefile_insert
@@ -1,8 +1,6 @@
## Makefile.am fragment sourced by src/Makefile.am.
ink_common_sources += \
- ui/context-menu.cpp \
- ui/context-menu.h \
ui/clipboard.cpp \
ui/clipboard.h \
ui/icon-names.h \
diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp
index b9d6e0c6b..b972997e2 100644
--- a/src/ui/clipboard.cpp
+++ b/src/ui/clipboard.cpp
@@ -70,12 +70,11 @@
#include "live_effects/lpeobject-reference.h"
#include "live_effects/parameter/path.h"
#include "svg/svg.h" // for sp_svg_transform_write, used in _copySelection
-#include "svg/css-ostringstream.h" // used in _parseColor
+#include "svg/css-ostringstream.h" // used in copy
#include "text-context.h"
#include "text-editing.h"
#include "tools-switch.h"
#include "path-chemistry.h"
-#include "id-clash.h"
#include "unit-constants.h"
#include "helper/png-write.h"
#include "svg/svg-color.h"
@@ -129,11 +128,8 @@ private:
void _copyTextPath(SPTextPath *);
Inkscape::XML::Node *_copyNode(Inkscape::XML::Node *, Inkscape::XML::Document *, Inkscape::XML::Node *);
- void _pasteDocument(SPDesktop *desktop, SPDocument *clipdoc, bool in_place);
- void _pasteDefs(SPDesktop *desktop, SPDocument *clipdoc);
bool _pasteImage(SPDocument *doc);
bool _pasteText(SPDesktop *desktop);
- SPCSSAttr *_parseColor(const Glib::ustring &);
void _applyPathEffect(SPItem *, gchar const *);
SPDocument *_retrieveClipboard(Glib::ustring = "");
@@ -334,7 +330,7 @@ bool ClipboardManagerImpl::paste(SPDesktop *desktop, bool in_place)
return false;
}
- _pasteDocument(desktop, tempdoc, in_place);
+ sp_import_document(desktop, tempdoc, in_place);
tempdoc->doUnref();
return true;
@@ -410,7 +406,7 @@ bool ClipboardManagerImpl::pasteStyle(SPDesktop *desktop)
bool pasted = false;
if (clipnode) {
- _pasteDefs(desktop, tempdoc);
+ desktop->doc()->importDefs(tempdoc);
SPCSSAttr *style = sp_repr_css_attr(clipnode, "style");
sp_desktop_set_style(desktop, style);
pasted = true;
@@ -512,7 +508,7 @@ bool ClipboardManagerImpl::pastePathEffect(SPDesktop *desktop)
if ( clipnode ) {
gchar const *effectstack = clipnode->attribute("inkscape:path-effect");
if ( effectstack ) {
- _pasteDefs(desktop, tempdoc);
+ desktop->doc()->importDefs(tempdoc);
// make sure all selected items are converted to paths first (i.e. rectangles)
sp_selected_to_lpeitems(desktop);
for (GSList *itemptr = const_cast<GSList *>(selection->itemList()) ; itemptr ; itemptr = itemptr->next) {
@@ -803,107 +799,6 @@ Inkscape::XML::Node *ClipboardManagerImpl::_copyNode(Inkscape::XML::Node *node,
/**
- * Paste the contents of a document into the active desktop.
- * @param clipdoc The document to paste
- * @param in_place Whether to paste the selection where it was when copied
- * @pre @c clipdoc is not empty and items can be added to the current layer
- */
-void ClipboardManagerImpl::_pasteDocument(SPDesktop *desktop, SPDocument *clipdoc, bool in_place)
-{
- SPDocument *target_document = sp_desktop_document(desktop);
- Inkscape::XML::Node *root = clipdoc->getReprRoot();
- Inkscape::XML::Node *target_parent = desktop->currentLayer()->getRepr();
- Inkscape::XML::Document *target_xmldoc = target_document->getReprDoc();
-
- // copy definitions
- _pasteDefs(desktop, clipdoc);
-
- // copy objects
- GSList *pasted_objects = NULL;
- for (Inkscape::XML::Node *obj = root->firstChild() ; obj ; obj = obj->next()) {
- // Don't copy metadata, defs, named views and internal clipboard contents to the document
- if (!strcmp(obj->name(), "svg:defs")) {
- continue;
- }
- if (!strcmp(obj->name(), "svg:metadata")) {
- continue;
- }
- if (!strcmp(obj->name(), "sodipodi:namedview")) {
- continue;
- }
- if (!strcmp(obj->name(), "inkscape:clipboard")) {
- continue;
- }
- Inkscape::XML::Node *obj_copy = _copyNode(obj, target_xmldoc, target_parent);
- pasted_objects = g_slist_prepend(pasted_objects, (gpointer) obj_copy);
- }
-
- // Change the selection to the freshly pasted objects
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
- selection->setReprList(pasted_objects);
-
- // invers apply parent transform
- Geom::Affine doc2parent = SP_ITEM(desktop->currentLayer())->i2doc_affine().inverse();
- sp_selection_apply_affine(selection, desktop->dt2doc() * doc2parent * desktop->doc2dt(), true, false);
-
- // Update (among other things) all curves in paths, for bounds() to work
- target_document->ensureUpToDate();
-
- // move selection either to original position (in_place) or to mouse pointer
- Geom::OptRect sel_bbox = selection->visualBounds();
- if (sel_bbox) {
- // get offset of selection to original position of copied elements
- Geom::Point pos_original;
- Inkscape::XML::Node *clipnode = sp_repr_lookup_name(root, "inkscape:clipboard", 1);
- if (clipnode) {
- Geom::Point min, max;
- sp_repr_get_point(clipnode, "min", &min);
- sp_repr_get_point(clipnode, "max", &max);
- pos_original = Geom::Point(min[Geom::X], max[Geom::Y]);
- }
- Geom::Point offset = pos_original - sel_bbox->corner(3);
-
- if (!in_place) {
- SnapManager &m = desktop->namedview->snap_manager;
- m.setup(desktop);
- sp_event_context_discard_delayed_snap_event(desktop->event_context);
-
- // get offset from mouse pointer to bbox center, snap to grid if enabled
- Geom::Point mouse_offset = desktop->point() - sel_bbox->midpoint();
- offset = m.multipleOfGridPitch(mouse_offset - offset, sel_bbox->midpoint() + offset) + offset;
- m.unSetup();
- }
-
- sp_selection_move_relative(selection, offset);
- }
-
- g_slist_free(pasted_objects);
-}
-
-
-/**
- * Paste SVG defs from the document retrieved from the clipboard into the active document.
- * @param clipdoc The document to paste.
- * @pre @c clipdoc != NULL and pasting into the active document is possible.
- */
-void ClipboardManagerImpl::_pasteDefs(SPDesktop *desktop, SPDocument *clipdoc)
-{
- // boilerplate vars copied from _pasteDocument
- SPDocument *target_document = sp_desktop_document(desktop);
- Inkscape::XML::Node *root = clipdoc->getReprRoot();
- Inkscape::XML::Node *defs = sp_repr_lookup_name(root, "svg:defs", 1);
- Inkscape::XML::Node *target_defs = target_document->getDefs()->getRepr();
- Inkscape::XML::Document *target_xmldoc = target_document->getReprDoc();
-
- prevent_id_clashes(clipdoc, target_document);
-
- for (Inkscape::XML::Node *def = defs->firstChild() ; def ; def = def->next()) {
- _copyNode(def, target_xmldoc, target_defs);
- }
-}
-
-
-/**
* Retrieve a bitmap image from the clipboard and paste it into the active document.
*/
bool ClipboardManagerImpl::_pasteImage(SPDocument *doc)
@@ -957,7 +852,7 @@ bool ClipboardManagerImpl::_pasteText(SPDesktop *desktop)
}
// try to parse the text as a color and, if successful, apply it as the current style
- SPCSSAttr *css = _parseColor(_clipboard->wait_for_text());
+ SPCSSAttr *css = sp_repr_css_attr_parse_color_to_fill(_clipboard->wait_for_text());
if (css) {
sp_desktop_set_style(desktop, css);
return true;
@@ -968,76 +863,6 @@ bool ClipboardManagerImpl::_pasteText(SPDesktop *desktop)
/**
- * Attempt to parse the passed string as a hexadecimal RGB or RGBA color.
- * @param text The Glib::ustring to parse
- * @return New CSS style representation if the parsing was successful, NULL otherwise
- */
-SPCSSAttr *ClipboardManagerImpl::_parseColor(const Glib::ustring &text)
-{
-// TODO reuse existing code instead of replicating here.
- Glib::ustring::size_type len = text.bytes();
- char *str = const_cast<char *>(text.data());
- bool attempt_alpha = false;
- if ( !str || ( *str == '\0' ) ) {
- return NULL; // this is OK due to boolean short-circuit
- }
-
- // those conditionals guard against parsing e.g. the string "fab" as "fab000"
- // (incomplete color) and "45fab71" as "45fab710" (incomplete alpha)
- if ( *str == '#' ) {
- if ( len < 7 ) {
- return NULL;
- }
- if ( len >= 9 ) {
- attempt_alpha = true;
- }
- } else {
- if ( len < 6 ) {
- return NULL;
- }
- if ( len >= 8 ) {
- attempt_alpha = true;
- }
- }
-
- unsigned int color = 0, alpha = 0xff;
-
- // skip a leading #, if present
- if ( *str == '#' ) {
- ++str;
- }
-
- // try to parse first 6 digits
- int res = sscanf(str, "%6x", &color);
- if ( res && ( res != EOF ) ) {
- if (attempt_alpha) {// try to parse alpha if there's enough characters
- sscanf(str + 6, "%2x", &alpha);
- if ( !res || res == EOF ) {
- alpha = 0xff;
- }
- }
-
- SPCSSAttr *color_css = sp_repr_css_attr_new();
-
- // print and set properties
- gchar color_str[16];
- g_snprintf(color_str, 16, "#%06x", color);
- sp_repr_css_set_property(color_css, "fill", color_str);
-
- float opacity = static_cast<float>(alpha)/static_cast<float>(0xff);
- if (opacity > 1.0) {
- opacity = 1.0; // safeguard
- }
- Inkscape::CSSOStringStream opcss;
- opcss << opacity;
- sp_repr_css_set_property(color_css, "fill-opacity", opcss.str().data());
- return color_css;
- }
- return NULL;
-}
-
-
-/**
* Applies a pasted path effect to a given item.
*/
void ClipboardManagerImpl::_applyPathEffect(SPItem *item, gchar const *effectstack)
diff --git a/src/ui/context-menu.cpp b/src/ui/context-menu.cpp
deleted file mode 100644
index 9e5c65af9..000000000
--- a/src/ui/context-menu.cpp
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- * Unser-interface related object extension
- *
- * Authors:
- * Lauris Kaplinski <lauris@kaplinski.com>
- * Jon A. Cruz <jon@joncruz.org>
- * Abhishek Sharma
- *
- * This code is in public domain
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "ui/dialog/dialog-manager.h"
-#include "context-menu.h"
-#include "../xml/repr.h"
-#include "desktop.h"
-#include "document.h"
-#include "document-undo.h"
-#include "helper/action.h" //sp_action_perform
-#include "inkscape.h"
-#include "message-stack.h"
-#include "preferences.h"
-#include "verbs.h"
-
-using Inkscape::DocumentUndo;
-
-static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-/* Append object-specific part to context menu */
-
-void sp_object_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- GObjectClass *klass;
- klass = G_OBJECT_GET_CLASS(object);
- while (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_OBJECT)) {
- GType type;
- type = G_TYPE_FROM_CLASS(klass);
- sp_object_type_menu(type, object, desktop, menu);
- klass = (GObjectClass*)g_type_class_peek_parent(klass);
- }
-}
-
-/* Implementation */
-
-#include <gtk/gtk.h>
-#include <glibmm/i18n.h>
-
-#include "selection.h"
-#include "selection-chemistry.h"
-#include "sp-anchor.h"
-#include "sp-clippath.h"
-#include "sp-image.h"
-#include "sp-mask.h"
-#include "sp-path.h"
-#include "sp-text.h"
-#include "desktop-handles.h"
-#include "ui/dialog/object-attributes.h"
-#include "ui/dialog/object-properties.h"
-#include "ui/dialog/spellcheck.h"
-
-
-static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-static void sp_object_type_menu(GType type, SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- static GHashTable *t2m = NULL;
- void (* handler)(SPObject *object, SPDesktop *desktop, GtkMenu *menu);
- if (!t2m) {
- t2m = g_hash_table_new(NULL, NULL);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ITEM), (void*)sp_item_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_GROUP), (void*)sp_group_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_ANCHOR), (void*)sp_anchor_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_IMAGE), (void*)sp_image_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_SHAPE), (void*)sp_shape_menu);
- g_hash_table_insert(t2m, GUINT_TO_POINTER(SP_TYPE_TEXT), (void*)sp_text_menu);
- }
- handler = (void (*)(SPObject*, SPDesktop*, GtkMenu*))g_hash_table_lookup(t2m, GUINT_TO_POINTER(type));
- if (handler) handler(object, desktop, menu);
-}
-
-/* SPItem */
-
-static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item);
-static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item);
-static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item);
-static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item);
-static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item);
-static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item);
-static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item);
-
-/* Generate context menu item section */
-static void sp_item_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Item dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Object Properties..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_properties), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Separator */
- w = gtk_menu_item_new();
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Select item */
- w = gtk_menu_item_new_with_mnemonic(_("_Select This"));
- if (sp_desktop_selection(desktop)->includes(item)) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_select_this), item);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Create link */
- w = gtk_menu_item_new_with_mnemonic(_("_Create Link"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_create_link), item);
- gtk_widget_set_sensitive(w, !SP_IS_ANCHOR(item));
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Set mask */
- w = gtk_menu_item_new_with_mnemonic(_("Set Mask"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_mask), item);
- if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- gtk_widget_set_sensitive(w, TRUE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Release mask */
- w = gtk_menu_item_new_with_mnemonic(_("Release Mask"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_mask), item);
- if (item && item->mask_ref && item->mask_ref->getObject()) {
- gtk_widget_set_sensitive(w, TRUE);
- } else {
- gtk_widget_set_sensitive(w, FALSE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Set Clip */
- w = gtk_menu_item_new_with_mnemonic(_("Set _Clip"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_set_clip), item);
- if ((item && item->mask_ref && item->mask_ref->getObject()) || (item->clip_ref && item->clip_ref->getObject())) {
- gtk_widget_set_sensitive(w, FALSE);
- } else {
- gtk_widget_set_sensitive(w, TRUE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Release Clip */
- w = gtk_menu_item_new_with_mnemonic(_("Release C_lip"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_release_clip), item);
- if (item && item->clip_ref && item->clip_ref->getObject()) {
- gtk_widget_set_sensitive(w, TRUE);
- } else {
- gtk_widget_set_sensitive(w, FALSE);
- }
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
-}
-
-static void sp_item_properties(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_desktop_selection(desktop)->set(item);
-
- // sp_item_dialog();
- desktop->_dlg_mgr->showDialog("ObjectProperties");
-}
-
-
-static void sp_set_mask(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_set_mask(desktop, false, false);
-}
-
-
-static void sp_release_mask(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_unset_mask(desktop, false);
-}
-
-
-static void sp_set_clip(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_set_mask(desktop, true, false);
-}
-
-
-static void sp_release_clip(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_selection_unset_mask(desktop, true);
-}
-
-
-static void sp_item_select_this(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- sp_desktop_selection(desktop)->set(item);
-}
-
-static void sp_item_create_link(GtkMenuItem *menuitem, SPItem *item)
-{
- g_assert(SP_IS_ITEM(item));
- g_assert(!SP_IS_ANCHOR(item));
-
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
- Inkscape::XML::Node *repr = xml_doc->createElement("svg:a");
- item->parent->getRepr()->addChild(repr, item->getRepr());
- SPObject *object = item->document->getObjectByRepr(repr);
- g_return_if_fail(SP_IS_ANCHOR(object));
-
- const char *id = item->getRepr()->attribute("id");
- Inkscape::XML::Node *child = item->getRepr()->duplicate(xml_doc);
- item->deleteObject(false);
- repr->addChild(child, NULL);
- child->setAttribute("id", id);
-
- Inkscape::GC::release(repr);
- Inkscape::GC::release(child);
-
- DocumentUndo::done(object->document, SP_VERB_NONE,
- _("Create link"));
-
- sp_desktop_selection(desktop)->set(SP_ITEM(object));
- desktop->_dlg_mgr->showDialog("ObjectAttributes");
-}
-
-/* SPGroup */
-
-static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group);
-
-static void sp_group_menu(SPObject *object, SPDesktop *desktop, GtkMenu *menu)
-{
- SPItem *item=SP_ITEM(object);
- GtkWidget *w;
-
- /* "Ungroup" */
- w = gtk_menu_item_new_with_mnemonic(_("_Ungroup"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_item_group_ungroup_activate), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), w);
-}
-
-static void sp_item_group_ungroup_activate(GtkMenuItem *menuitem, SPGroup *group)
-{
- SPDesktop *desktop;
- GSList *children;
-
- g_assert(SP_IS_GROUP(group));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- children = NULL;
- sp_item_group_ungroup(group, &children);
-
- sp_desktop_selection(desktop)->setList(children);
- g_slist_free(children);
-}
-
-/* SPAnchor */
-
-static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_anchor_link_follow(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_anchor_link_remove(GtkMenuItem *menuitem, SPAnchor *anchor);
-
-static void sp_anchor_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Link dialog */
- w = gtk_menu_item_new_with_mnemonic(_("Link _Properties..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_properties), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Select item */
- w = gtk_menu_item_new_with_mnemonic(_("_Follow Link"));
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_follow), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- /* Reset transformations */
- w = gtk_menu_item_new_with_mnemonic(_("_Remove Link"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_anchor_link_remove), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-}
-
-static void sp_anchor_link_properties(GtkMenuItem *menuitem, SPAnchor */*anchor*/)
-{
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
- desktop->_dlg_mgr->showDialog("ObjectAttributes");
-}
-
-static void sp_anchor_link_follow(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
-{
- g_return_if_fail(anchor != NULL);
- g_return_if_fail(SP_IS_ANCHOR(anchor));
-
- /* shell out to an external browser here */
-}
-
-static void sp_anchor_link_remove(GtkMenuItem */*menuitem*/, SPAnchor *anchor)
-{
- GSList *children;
-
- g_return_if_fail(anchor != NULL);
- g_return_if_fail(SP_IS_ANCHOR(anchor));
-
- children = NULL;
- sp_item_group_ungroup(SP_GROUP(anchor), &children);
-
- g_slist_free(children);
-}
-
-/* Image */
-
-static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor *anchor);
-static void sp_image_image_edit(GtkMenuItem *menuitem, SPItem *item);
-static void sp_image_image_embed(GtkMenuItem *menuitem, SPItem *item);
-static void sp_image_image_extract(GtkMenuItem *menuitem, SPItem *item);
-
-static void sp_image_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item = SP_ITEM(object);
- GtkWidget *w;
- Inkscape::XML::Node *ir = object->getRepr();
- const gchar *href = ir->attribute("xlink:href");
-
- /* Image properties */
- w = gtk_menu_item_new_with_mnemonic(_("Image _Properties..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_properties), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- /* Edit externally */
- w = gtk_menu_item_new_with_mnemonic(_("Edit Externally..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_edit), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
- gtk_widget_set_sensitive( w, FALSE );
- }
-
- /* Embed image */
- if (Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" )) {
- w = gtk_menu_item_new_with_mnemonic(C_("Context menu", "Embed Image"));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_embed), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- if ( (!href) || ((strncmp(href, "data:", 5) == 0)) ) {
- gtk_widget_set_sensitive( w, FALSE );
- }
- }
-
- /* Extract image */
- if (Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" )) {
- w = gtk_menu_item_new_with_mnemonic(C_("Context menu", "Extract Image..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_image_image_extract), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
- if ( (!href) || ((strncmp(href, "data:", 5) != 0)) ) {
- gtk_widget_set_sensitive( w, FALSE );
- }
- }
-}
-
-/* Image Properties entry */
-static void sp_image_image_properties(GtkMenuItem *menuitem, SPAnchor */*anchor*/)
-{
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
- desktop->_dlg_mgr->showDialog("ObjectAttributes");
-}
-
-static gchar* getImageEditorName() {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gchar* value = 0;
- Glib::ustring choices = prefs->getString("/options/bitmapeditor/value");
- if (!choices.empty()) {
- value = g_strdup(choices.c_str());
- }
- if (!value) {
- value = g_strdup("gimp");
- }
- return value;
-}
-
-/* Edit Externally entry */
-static void sp_image_image_edit(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop = NULL;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- GSList const *selected = sp_desktop_selection(desktop)->itemList();
-
- GError* errThing = 0;
- Glib::ustring cmdline = getImageEditorName();
- Glib::ustring name;
- Glib::ustring fullname;
-
-#ifdef WIN32
- // g_spawn_command_line_sync parsing is done according to Unix shell rules,
- // not Windows command interpreter rules. Thus we need to enclose the
- // executable path with sigle quotes.
- int index = cmdline.find(".exe");
- if ( index < 0 ) index = cmdline.find(".bat");
- if ( index < 0 ) index = cmdline.find(".com");
- if ( index >= 0 ) {
- Glib::ustring editorBin = cmdline.substr(0, index + 4).c_str();
- Glib::ustring args = cmdline.substr(index + 4, cmdline.length()).c_str();
- editorBin.insert(0, "'");
- editorBin.append("'");
- cmdline = editorBin;
- cmdline.append(args);
- } else {
- // Enclose the whole command line if no executable path can be extracted.
- cmdline.insert(0, "'");
- cmdline.append("'");
- }
-#endif
-
- for (GSList const *iter = selected; iter != NULL; iter = iter->next) {
- Inkscape::XML::Node *ir = SP_ITEM(iter->data)->getRepr();
- const gchar *href = ir->attribute("xlink:href");
-
- if (strncmp (href,"file:",5) == 0) {
- // URI to filename conversion
- name = g_filename_from_uri(href, NULL, NULL);
- } else {
- name.append(href);
- }
-
- if (Glib::path_is_absolute(name)) {
- fullname = name;
- } else if (SP_ACTIVE_DOCUMENT->getBase()) {
- fullname = Glib::build_filename(SP_ACTIVE_DOCUMENT->getBase(), name);
- } else {
- fullname = Glib::build_filename(Glib::get_current_dir(), name);
- }
-
- cmdline.append(" '");
- cmdline.append(fullname.c_str());
- cmdline.append("'");
- }
-
- //g_warning("##Command line: %s\n", cmdline.c_str());
-
- g_spawn_command_line_async(cmdline.c_str(),
- &errThing);
-
- if ( errThing ) {
- g_warning("Problem launching editor (%d). %s", errThing->code, errThing->message);
- SPDesktop *desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, errThing->message);
- g_error_free(errThing);
- errThing = 0;
- }
-}
-
-/* Embed Image entry */
-static void sp_image_image_embed(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.embedselectedimages" );
- if (verb) {
- SPAction *action = verb->get_action(desktop);
- if (action) {
- sp_action_perform(action, NULL);
- }
- }
-}
-
-/* Extract Image entry */
-static void sp_image_image_extract(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- Inkscape::Verb *verb = Inkscape::Verb::getbyid( "org.ekips.filter.extractimage" );
- if (verb) {
- SPAction *action = verb->get_action(desktop);
- if (action) {
- sp_action_perform(action, NULL);
- }
- }
-}
-
-/* Fill and Stroke entry */
-static void sp_fill_settings(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- desktop->_dlg_mgr->showDialog("FillAndStroke");
-}
-
-/* SPShape */
-static void sp_shape_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Item dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-}
-
-/* Edit Text entry */
-static void sp_text_settings(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- desktop->_dlg_mgr->showDialog("TextFont");
-}
-
-/* Spellcheck entry */
-static void sp_spellcheck_settings(GtkMenuItem *menuitem, SPItem *item)
-{
- SPDesktop *desktop;
-
- g_assert(SP_IS_ITEM(item));
-
- desktop = (SPDesktop*)g_object_get_data(G_OBJECT(menuitem), "desktop");
- g_return_if_fail(desktop != NULL);
-
- if (sp_desktop_selection(desktop)->isEmpty()) {
- sp_desktop_selection(desktop)->set(item);
- }
-
- desktop->_dlg_mgr->showDialog("SpellCheck");
-}
-
-/* SPText */
-static void sp_text_menu(SPObject *object, SPDesktop *desktop, GtkMenu *m)
-{
- SPItem *item;
- GtkWidget *w;
-
- item = (SPItem *) object;
-
- /* Fill and Stroke dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Fill and Stroke..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_fill_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- /* Edit Text dialog */
- w = gtk_menu_item_new_with_mnemonic(_("_Text and Font..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_text_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-
- /* Spellcheck dialog */
- w = gtk_menu_item_new_with_mnemonic(_("Check Spellin_g..."));
- g_object_set_data(G_OBJECT(w), "desktop", desktop);
- g_signal_connect(G_OBJECT(w), "activate", G_CALLBACK(sp_spellcheck_settings), item);
- gtk_widget_show(w);
- gtk_menu_shell_append(GTK_MENU_SHELL(m), w);
-}
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/context-menu.h b/src/ui/context-menu.h
deleted file mode 100644
index 39753f93f..000000000
--- a/src/ui/context-menu.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef SEEN_CONTEXT_MENU_H
-#define SEEN_CONTEXT_MENU_H
-
-/*
- * Unser-interface related object extension
- *
- * Authors:
- * Lauris Kaplinski <lauris@kaplinski.com>
- * Abhishek Sharma
- *
- * This code is in public domain
- */
-
-#include <gtk/gtk.h>
-
-#include "sp-object.h"
-
-class SPDesktop;
-
-/**
- * Append object-specific part to context menu.
- */
-void sp_object_menu (SPObject *object, SPDesktop *desktop, GtkMenu *menu);
-
-#endif
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/aboutbox.cpp b/src/ui/dialog/aboutbox.cpp
index f6adc71c0..885846685 100644
--- a/src/ui/dialog/aboutbox.cpp
+++ b/src/ui/dialog/aboutbox.cpp
@@ -121,7 +121,11 @@ AboutBox::AboutBox() : Gtk::Dialog(_("About Inkscape")) {
get_vbox()->pack_start(*manage(label), false, false);
Gtk::Requisition requisition;
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(reinterpret_cast<GtkWidget*>(gobj()), &requisition, NULL);
+#else
gtk_widget_size_request (reinterpret_cast<GtkWidget*>(gobj()), &requisition);
+#endif
// allow window to shrink
set_size_request(0, 0);
set_default_size(requisition.width, requisition.height);
diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp
index 062384b52..f8d63aade 100644
--- a/src/ui/dialog/align-and-distribute.cpp
+++ b/src/ui/dialog/align-and-distribute.cpp
@@ -50,6 +50,7 @@
#include <glibmm/i18n.h>
+
namespace Inkscape {
namespace UI {
namespace Dialog {
@@ -61,7 +62,11 @@ public :
Action(const Glib::ustring &id,
const Glib::ustring &tiptext,
guint row, guint column,
- Gtk::Table &parent,
+#if WITH_GTKMM_3_0
+ Gtk::Grid &parent,
+#else
+ Gtk::Table &parent,
+#endif
AlignAndDistribute &dialog):
_dialog(dialog),
_id(id),
@@ -77,7 +82,11 @@ public :
pButton->signal_clicked()
.connect(sigc::mem_fun(*this, &Action::on_button_click));
pButton->set_tooltip_text(tiptext);
+#if WITH_GTKMM_3_0
+ parent.attach(*pButton, column, row, 1, 1);
+#else
parent.attach(*pButton, column, column+1, row, row+1, Gtk::FILL, Gtk::FILL);
+#endif
}
virtual ~Action(){}
@@ -87,7 +96,12 @@ private :
virtual void on_button_click(){}
Glib::ustring _id;
+
+#if WITH_GTKMM_3_0
+ Gtk::Grid &_parent;
+#else
Gtk::Table &_parent;
+#endif
};
@@ -462,7 +476,11 @@ public:
Action(id, tiptext, row, column + 4,
dialog.removeOverlap_table(), dialog)
{
+#if WITH_GTKMM_3_0
+ dialog.removeOverlap_table().set_column_spacing(3);
+#else
dialog.removeOverlap_table().set_col_spacings(3);
+#endif
removeOverlapXGap.set_digits(1);
removeOverlapXGap.set_size_request(60, -1);
@@ -484,11 +502,17 @@ public:
removeOverlapYGapLabel.set_text_with_mnemonic(C_("Gap", "_V:"));
removeOverlapYGapLabel.set_mnemonic_widget(removeOverlapYGap);
+#if WITH_GTKMM_3_0
+ dialog.removeOverlap_table().attach(removeOverlapXGapLabel, column, row, 1, 1);
+ dialog.removeOverlap_table().attach(removeOverlapXGap, column+1, row, 1, 1);
+ dialog.removeOverlap_table().attach(removeOverlapYGapLabel, column+2, row, 1, 1);
+ dialog.removeOverlap_table().attach(removeOverlapYGap, column+3, row, 1, 1);
+#else
dialog.removeOverlap_table().attach(removeOverlapXGapLabel, column, column+1, row, row+1, Gtk::FILL, Gtk::FILL);
dialog.removeOverlap_table().attach(removeOverlapXGap, column+1, column+2, row, row+1, Gtk::FILL, Gtk::FILL);
dialog.removeOverlap_table().attach(removeOverlapYGapLabel, column+2, column+3, row, row+1, Gtk::FILL, Gtk::FILL);
dialog.removeOverlap_table().attach(removeOverlapYGap, column+3, column+4, row, row+1, Gtk::FILL, Gtk::FILL);
-
+#endif
}
private :
@@ -769,7 +793,11 @@ public :
guint row,
guint column,
AlignAndDistribute &dialog,
+#if WITH_GTKMM_3_0
+ Gtk::Grid &table,
+#else
Gtk::Table &table,
+#endif
Geom::Dim2 orientation, bool distribute):
Action(id, tiptext, row, column,
table, dialog),
@@ -896,11 +924,19 @@ AlignAndDistribute::AlignAndDistribute()
_rearrangeFrame(_("Rearrange")),
_removeOverlapFrame(_("Remove overlaps")),
_nodesFrame(_("Nodes")),
+#if WITH_GTKMM_3_0
+ _alignTable(),
+ _distributeTable(),
+ _rearrangeTable(),
+ _removeOverlapTable(),
+ _nodesTable(),
+#else
_alignTable(2, 6, true),
_distributeTable(2, 6, true),
_rearrangeTable(1, 5, false),
_removeOverlapTable(1, 5, false),
_nodesTable(1, 4, true),
+#endif
_anchorLabel(_("Relative to: ")),
_selgrpLabel(_("_Treat selection as group: "), 1)
{
@@ -1238,8 +1274,13 @@ void AlignAndDistribute::addRandomizeButton(const Glib::ustring &id, const Glib:
);
}
+#if WITH_GTKMM_3_0
+void AlignAndDistribute::addBaselineButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col, Gtk::Grid &table, Geom::Dim2 orientation, bool distribute)
+#else
void AlignAndDistribute::addBaselineButton(const Glib::ustring &id, const Glib::ustring tiptext,
guint row, guint col, Gtk::Table &table, Geom::Dim2 orientation, bool distribute)
+#endif
{
_actionList.push_back(
new ActionBaseline(
diff --git a/src/ui/dialog/align-and-distribute.h b/src/ui/dialog/align-and-distribute.h
index 8cbd48f28..7edf9c30c 100644
--- a/src/ui/dialog/align-and-distribute.h
+++ b/src/ui/dialog/align-and-distribute.h
@@ -19,11 +19,15 @@
#include "ui/widget/panel.h"
#include <gtkmm/frame.h>
#include <gtkmm/comboboxtext.h>
-#include <gtkmm/table.h>
#include <gtkmm/label.h>
-
#include "2geom/rect.h"
+#if WITH_GTKMM_3_0
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/grid.h>
+#else
+#include <gtkmm/table.h>
+#endif
class SPItem;
@@ -45,11 +49,19 @@ public:
AlignTarget getAlignTarget() const;
+#if WITH_GTKMM_3_0
+ Gtk::Grid &align_table(){return _alignTable;}
+ Gtk::Grid &distribute_table(){return _distributeTable;}
+ Gtk::Grid &rearrange_table(){return _rearrangeTable;}
+ Gtk::Grid &removeOverlap_table(){return _removeOverlapTable;}
+ Gtk::Grid &nodes_table(){return _nodesTable;}
+#else
Gtk::Table &align_table(){return _alignTable;}
Gtk::Table &distribute_table(){return _distributeTable;}
Gtk::Table &rearrange_table(){return _rearrangeTable;}
Gtk::Table &removeOverlap_table(){return _removeOverlapTable;}
Gtk::Table &nodes_table(){return _nodesTable;}
+#endif
std::list<SPItem *>::iterator find_master(std::list <SPItem *> &list, bool horizontal);
void setMode(bool nodeEdit);
@@ -86,12 +98,21 @@ protected:
guint row, guint col);
void addRandomizeButton(const Glib::ustring &id, const Glib::ustring tiptext,
guint row, guint col);
+#if WITH_GTKMM_3_0
+ void addBaselineButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col, Gtk::Grid &table, Geom::Dim2 orientation, bool distribute);
+#else
void addBaselineButton(const Glib::ustring &id, const Glib::ustring tiptext,
guint row, guint col, Gtk::Table &table, Geom::Dim2 orientation, bool distribute);
+#endif
std::list<Action *> _actionList;
Gtk::Frame _alignFrame, _distributeFrame, _rearrangeFrame, _removeOverlapFrame, _nodesFrame;
+#if WITH_GTKMM_3_0
+ Gtk::Grid _alignTable, _distributeTable, _rearrangeTable, _removeOverlapTable, _nodesTable;
+#else
Gtk::Table _alignTable, _distributeTable, _rearrangeTable, _removeOverlapTable, _nodesTable;
+#endif
Gtk::HBox _anchorBox;
Gtk::HBox _selgrpBox;
Gtk::VBox _alignBox;
diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
index 36e79a682..7b7c66553 100644
--- a/src/ui/dialog/clonetiler.cpp
+++ b/src/ui/dialog/clonetiler.cpp
@@ -93,7 +93,12 @@ CloneTiler::CloneTiler (void) :
dlg = GTK_WIDGET(gobj());
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *mainbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(mainbox), FALSE);
+#else
GtkWidget *mainbox = gtk_vbox_new(FALSE, 4);
+#endif
gtk_container_set_border_width (GTK_CONTAINER (mainbox), 6);
contents->pack_start (*Gtk::manage(Glib::wrap(mainbox)), true, true, 0);
@@ -648,7 +653,12 @@ CloneTiler::CloneTiler (void) :
GtkWidget *vb = clonetiler_new_tab (nb, _("Co_lor"));
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
GtkWidget *l = gtk_label_new (_("Initial color: "));
gtk_box_pack_start (GTK_BOX (hb), l, FALSE, FALSE, 0);
@@ -771,7 +781,12 @@ CloneTiler::CloneTiler (void) :
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
GtkWidget *b = gtk_check_button_new_with_label (_("Trace the drawing under the tiles"));
@@ -786,7 +801,12 @@ CloneTiler::CloneTiler (void) :
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vvb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(vvb), FALSE);
+#else
GtkWidget *vvb = gtk_vbox_new (FALSE, 0);
+#endif
gtk_box_pack_start (GTK_BOX (vb), vvb, FALSE, FALSE, 0);
g_object_set_data (G_OBJECT(dlg), "dotrace", (gpointer) vvb);
@@ -974,7 +994,12 @@ CloneTiler::CloneTiler (void) :
gtk_box_pack_start (GTK_BOX (mainbox), table, FALSE, FALSE, 0);
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
g_object_set_data (G_OBJECT(dlg), "rowscols", (gpointer) hb);
{
@@ -1018,7 +1043,12 @@ CloneTiler::CloneTiler (void) :
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
g_object_set_data (G_OBJECT(dlg), "widthheight", (gpointer) hb);
// unitmenu
@@ -1103,7 +1133,12 @@ CloneTiler::CloneTiler (void) :
// Use saved pos
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
GtkWidget *b = gtk_check_button_new_with_label (_("Use saved size and position of the tile"));
@@ -1118,7 +1153,12 @@ CloneTiler::CloneTiler (void) :
// Statusbar
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
gtk_box_pack_end (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
GtkWidget *l = gtk_label_new("");
g_object_set_data (G_OBJECT(dlg), "status", (gpointer) l);
@@ -1127,7 +1167,12 @@ CloneTiler::CloneTiler (void) :
// Buttons
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
gtk_box_pack_start (GTK_BOX (mainbox), hb, FALSE, FALSE, 0);
{
@@ -1141,7 +1186,12 @@ CloneTiler::CloneTiler (void) :
}
{ // buttons which are enabled only when there are tiled clones
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *sb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(sb), FALSE);
+#else
GtkWidget *sb = gtk_hbox_new(FALSE, 0);
+#endif
gtk_box_pack_end (GTK_BOX (hb), sb, FALSE, FALSE, 0);
g_object_set_data (G_OBJECT(dlg), "buttons_on_tiles", (gpointer) sb);
{
@@ -2534,7 +2584,12 @@ void CloneTiler::clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg)
GtkWidget * CloneTiler::clonetiler_new_tab(GtkWidget *nb, const gchar *label)
{
GtkWidget *l = gtk_label_new_with_mnemonic (label);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, VB_MARGIN);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new (FALSE, VB_MARGIN);
+#endif
gtk_container_set_border_width (GTK_CONTAINER (vb), VB_MARGIN);
gtk_notebook_append_page (GTK_NOTEBOOK (nb), vb, l);
return vb;
@@ -2549,7 +2604,12 @@ void CloneTiler::clonetiler_checkbox_toggled(GtkToggleButton *tb, gpointer *data
GtkWidget * CloneTiler::clonetiler_checkbox(const char *tip, const char *attr)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VB_MARGIN);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, VB_MARGIN);
+#endif
GtkWidget *b = gtk_check_button_new ();
gtk_widget_set_tooltip_text (b, tip);
@@ -2576,7 +2636,12 @@ void CloneTiler::clonetiler_value_changed(GtkAdjustment *adj, gpointer data)
GtkWidget * CloneTiler::clonetiler_spinbox(const char *tip, const char *attr, double lower, double upper, const gchar *suffix, bool exponent/* = false*/)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 0);
+#endif
{
Gtk::Adjustment *a;
@@ -2704,7 +2769,12 @@ GtkWidget * CloneTiler::clonetiler_table_x_y_rand(int values)
gtk_table_set_col_spacings (GTK_TABLE (table), 8);
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
GtkWidget *i = sp_icon_new (Inkscape::ICON_SIZE_DECORATION, INKSCAPE_ICON("object-rows"));
gtk_box_pack_start (GTK_BOX (hb), i, FALSE, FALSE, 2);
@@ -2717,7 +2787,12 @@ GtkWidget * CloneTiler::clonetiler_table_x_y_rand(int values)
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new (FALSE, 0);
+#endif
GtkWidget *i = sp_icon_new (Inkscape::ICON_SIZE_DECORATION, INKSCAPE_ICON("object-columns"));
gtk_box_pack_start (GTK_BOX (hb), i, FALSE, FALSE, 2);
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index 150abd66b..060a10f63 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -8,8 +8,9 @@
* Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
* Jon A. Cruz <jon@joncruz.org>
* Abhishek Sharma
+ * Kris De Gussem <Kris.DeGussem@gmail.com>
*
- * Copyright (C) 1999-2007 Authors
+ * Copyright (C) 1999-2007, 2012 Authors
* Copyright (C) 2001-2002 Ximian, Inc.
*
* Released under GNU GPL, read the file 'COPYING' for more information
@@ -350,7 +351,7 @@ void Export::setTargetDesktop(SPDesktop *desktop)
subselChangedConn = desktop->connectToolSubselectionChanged(sigc::hide(sigc::mem_fun(*this, &Export::onSelectionChanged)));
//// Must check flags, so can't call widget_setup() directly.
- selectModifiedConn = desktop->selection->connectModified(sigc::hide<0>(sigc::mem_fun(*this, &Export::onSelectioModified)));
+ selectModifiedConn = desktop->selection->connectModified(sigc::hide<0>(sigc::mem_fun(*this, &Export::onSelectionModified)));
}
//widget_setup();
}
@@ -428,7 +429,7 @@ void Export::set_default_filename () {
* @param sensitive Whether the spin button is sensitive or not
* @param cb Callback for when this spin button is changed (optional)
*/
-Gtk::Adjustment * Export::createSpinbutton( gchar const *key, float val, float min, float max,
+Gtk::Adjustment * Export::createSpinbutton( gchar const * /*key*/, float val, float min, float max,
float step, float page, GtkWidget *us,
GtkWidget *t, int x, int y,
const gchar *ll, const gchar *lr,
@@ -606,7 +607,7 @@ void Export::onSelectionChanged()
updateCheckbuttons ();
}
-void Export::onSelectioModified ( guint flags )
+void Export::onSelectionModified ( guint /*flags*/ )
{
switch (current_key) {
case SELECTION_DRAWING:
@@ -784,7 +785,7 @@ void Export::onAreaToggled ()
/// Called when dialog is deleted
-gint Export::onProgressDelete ( GtkWidget *widget, GdkEvent *event, GObject *base )
+gint Export::onProgressDelete ( GtkWidget * /*widget*/, GdkEvent * /*event*/, GObject *base )
{
g_object_set_data (base, "cancel", (gpointer) 1);
return TRUE;
@@ -792,7 +793,7 @@ gint Export::onProgressDelete ( GtkWidget *widget, GdkEvent *event, GObject *bas
/// Called when progress is cancelled
-void Export::onProgressCancel ( GtkWidget *widget, GObject *base )
+void Export::onProgressCancel ( GtkWidget * /*widget*/, GObject *base )
{
g_object_set_data (base, "cancel", (gpointer) 1);
} // end of sp_export_progress_cancel()
@@ -822,8 +823,7 @@ unsigned int Export::onProgressCallback (float value, void *data)
} // end of sp_export_progress_callback()
-GtkWidget * Export::create_progress_dialog (gchar *progress_text) {
-
+GtkWidget * Export::create_progress_dialog (Glib::ustring progress_text) {
GtkWidget *dlg, *prg, *btn; /* progressbar dlg widgets */
dlg = gtk_dialog_new ();
@@ -836,7 +836,7 @@ GtkWidget * Export::create_progress_dialog (gchar *progress_text) {
gtk_window_set_resizable (GTK_WINDOW (dlg), FALSE);
g_object_set_data ((GObject *) base, "progress", prg);
- gtk_progress_bar_set_text ((GtkProgressBar *) prg, progress_text);
+ gtk_progress_bar_set_text ((GtkProgressBar *) prg, progress_text.c_str());
gtk_progress_bar_set_orientation ( (GtkProgressBar *) prg,
GTK_PROGRESS_LEFT_TO_RIGHT);
@@ -857,26 +857,26 @@ GtkWidget * Export::create_progress_dialog (gchar *progress_text) {
}
// FIXME: Some lib function should be available to do this ...
-gchar * Export::filename_add_extension (const gchar *filename, const gchar *extension)
+Glib::ustring Export::filename_add_extension (Glib::ustring filename, Glib::ustring extension)
{
- const gchar *dot;
-
- dot = strrchr (filename, '.');
- if ( !dot )
- return g_strconcat (filename, ".", extension, NULL);
- {
- if (dot[1] == '\0')
- return g_strconcat (filename, extension, NULL);
+ Glib::ustring::size_type dot;
+
+ dot = filename.find_last_of(".");
+ if ( !dot )
+ {
+ return filename = filename + "." + extension;
+ }
else
{
- if (g_ascii_strcasecmp (dot + 1, extension) == 0)
- return g_strdup (filename);
- else
- {
- return g_strconcat (filename, ".", extension, NULL);
- }
- }
- }
+ if (dot==filename.find_last_of(Glib::ustring::compose(".", extension)))
+ {
+ return filename;
+ }
+ else
+ {
+ return filename = filename + "." + extension;
+ }
+ }
}
gchar *Export::absolutize_path_from_document_location (SPDocument *doc, const gchar *filename)
@@ -908,24 +908,22 @@ void Export::onExport ()
if (batch_export.get_active ()) {
// Batch export of selected objects
- gint num = g_slist_length((GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList());
+ gint num = g_slist_length(const_cast<GSList *>(sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList()));
gint n = 0;
if (num < 1)
return;
- gchar *progress_text = g_strdup_printf (_("Exporting %d files"), num);
- GtkWidget *prog_dlg = create_progress_dialog (progress_text);
- g_free (progress_text);
+ GtkWidget *prog_dlg = create_progress_dialog (Glib::ustring::compose(_("Exporting %1 files"),num));
- for (GSList *i = (GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList();
+ for (GSList *i = const_cast<GSList *>(sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList());
i != NULL;
i = i->next) {
SPItem *item = reinterpret_cast<SPItem *>(i->data);
// retrieve export filename hint
const gchar *filename = item->getRepr()->attribute("inkscape:export-filename");
- gchar *path = 0;
+ gchar *path = NULL;
if (!filename) {
path = create_filepath_from_id(item->getId(), NULL);
} else {
@@ -953,7 +951,7 @@ void Export::onExport ()
*area, width, height, dpi, dpi,
nv->pagecolor,
NULL, NULL, TRUE, // overwrite without asking
- hide ? (GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList() : NULL
+ hide ? const_cast<GSList *>(sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList()) : NULL
)) {
gchar * error;
gchar * safeFile = Inkscape::IO::sanitizeString(path);
@@ -974,8 +972,13 @@ void Export::onExport ()
} else {
- gchar const *filename = g_strdup(filename_entry.get_text().c_str());
+ Glib::ustring filename = filename_entry.get_text();
+ if (filename.empty()){
+ sp_ui_error_dialog(_("You have to enter a filename"));
+ return;
+ }
+
float const x0 = getValuePx(x0_adj);
float const y0 = getValuePx(y0_adj);
float const x1 = getValuePx(x1_adj);
@@ -985,22 +988,15 @@ void Export::onExport ()
unsigned long int const width = int(getValue(bmwidth_adj) + 0.5);
unsigned long int const height = int(getValue(bmheight_adj) + 0.5);
- if (filename == NULL || *filename == '\0') {
- sp_ui_error_dialog(_("You have to enter a filename"));
- return;
- }
-
if (!((x1 > x0) && (y1 > y0) && (width > 0) && (height > 0))) {
sp_ui_error_dialog (_("The chosen area to be exported is invalid"));
return;
}
// make sure that .png is the extension of the file:
- gchar * filename_ext = filename_add_extension(filename, "png");
- //gtk_entry_set_text(GTK_ENTRY(filename_entry), filename_ext);
+ Glib::ustring const filename_ext = filename_add_extension(filename, "png");
filename_entry.set_text(filename_ext);
-
- gchar *path = absolutize_path_from_document_location(doc, filename_ext);
+ gchar *path = absolutize_path_from_document_location(doc, filename_ext.c_str());
gchar *dirname = g_path_get_dirname(path);
if ( dirname == NULL
@@ -1019,18 +1015,16 @@ void Export::onExport ()
g_free(dirname);
gchar *fn = g_path_get_basename (path);
- gchar *progress_text = g_strdup_printf (_("Exporting %s (%lu x %lu)"), fn, width, height);
+ GtkWidget *prog_dlg = create_progress_dialog (Glib::ustring::compose(_("Exporting %1 (%2 x %3)"), fn, width, height));
g_free (fn);
- GtkWidget *prog_dlg = create_progress_dialog (progress_text);
- g_free (progress_text);
/* Do export */
if (!sp_export_png_file (sp_desktop_document (SP_ACTIVE_DESKTOP), path,
Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1)), width, height, xdpi, ydpi,
nv->pagecolor,
onProgressCallback, prog_dlg, FALSE,
- hide ? (GSList *) sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList() : NULL
+ hide ? const_cast<GSList *>(sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList()) : NULL
)) {
gchar * error;
gchar * safeFile = Inkscape::IO::sanitizeString(path);
@@ -1043,12 +1037,13 @@ void Export::onExport ()
/* Reset the filename so that it can be changed again by changing
selections and all that */
g_free(original_name);
- original_name = g_strdup(filename_ext);
+ original_name = const_cast<gchar*>(filename_ext.c_str());
filename_modified = false;
gtk_widget_destroy (prog_dlg);
//g_object_set_data (G_OBJECT (base), "cancel", (gpointer) 0);
+
/* Setup the values in the document */
switch (current_key) {
case SELECTION_PAGE:
@@ -1061,8 +1056,8 @@ void Export::onExport ()
DocumentUndo::setUndoSensitive(doc, false);
gchar const *temp_string = repr->attribute("inkscape:export-filename");
- if (temp_string == NULL || strcmp(temp_string, filename_ext)) {
- repr->setAttribute("inkscape:export-filename", filename_ext);
+ if (temp_string == NULL || (filename_ext != temp_string)) {
+ repr->setAttribute("inkscape:export-filename", filename_ext.c_str());
modified = true;
}
temp_string = repr->attribute("inkscape:export-xdpi");
@@ -1071,7 +1066,7 @@ void Export::onExport ()
modified = true;
}
temp_string = repr->attribute("inkscape:export-ydpi");
- if (temp_string == NULL || xdpi != atof(temp_string)) {
+ if (temp_string == NULL || ydpi != atof(temp_string)) {
sp_repr_set_svg_double(repr, "inkscape:export-ydpi", ydpi);
modified = true;
}
@@ -1092,18 +1087,22 @@ void Export::onExport ()
reprlst = sp_desktop_selection(SP_ACTIVE_DESKTOP)->reprList();
for(; reprlst != NULL; reprlst = reprlst->next) {
- Inkscape::XML::Node * repr = (Inkscape::XML::Node *)reprlst->data;
+ Inkscape::XML::Node * repr = static_cast<Inkscape::XML::Node *>(reprlst->data);
const gchar * temp_string;
- gchar *dir = g_path_get_dirname(filename);
- gchar *docdir = g_path_get_dirname(SP_ACTIVE_DOCUMENT->getURI());
-
+ Glib::ustring dir = Glib::path_get_dirname(filename.c_str());
+ const gchar* docURI=SP_ACTIVE_DOCUMENT->getURI();
+ Glib::ustring docdir;
+ if (docURI)
+ {
+ docdir = Glib::path_get_dirname(docURI);
+ }
if (repr->attribute("id") == NULL ||
- !(g_strrstr(filename_ext, repr->attribute("id")) != NULL &&
- ( !SP_ACTIVE_DOCUMENT->getURI() ||
- strcmp(dir, docdir) == 0))) {
+ !(filename_ext.find_last_of(repr->attribute("id")) &&
+ ( !docURI ||
+ (dir == docdir)))) {
temp_string = repr->attribute("inkscape:export-filename");
- if (temp_string == NULL || strcmp(temp_string, filename_ext)) {
- repr->setAttribute("inkscape:export-filename", filename_ext);
+ if (temp_string == NULL || (filename_ext != temp_string)) {
+ repr->setAttribute("inkscape:export-filename", filename_ext.c_str());
modified = true;
}
}
@@ -1113,12 +1112,10 @@ void Export::onExport ()
modified = true;
}
temp_string = repr->attribute("inkscape:export-ydpi");
- if (temp_string == NULL || xdpi != atof(temp_string)) {
+ if (temp_string == NULL || ydpi != atof(temp_string)) {
sp_repr_set_svg_double(repr, "inkscape:export-ydpi", ydpi);
modified = true;
}
- g_free(dir);
- g_free(docdir);
}
DocumentUndo::setUndoSensitive(doc, saved);
@@ -1130,10 +1127,7 @@ void Export::onExport ()
default:
break;
}
-
- g_free (filename_ext);
g_free (path);
-
}
} // end of sp_export_export_clicked()
@@ -1800,10 +1794,8 @@ void Export::onFilenameModified()
{
if (strcmp(original_name, filename_entry.get_text().c_str())==0) {
filename_modified = false;
-// g_message("Modified: FALSE\n");
} else {
filename_modified = true;
-// g_message("Modified: TRUE\n");
}
return;
diff --git a/src/ui/dialog/export.h b/src/ui/dialog/export.h
index 1277f06f5..51b969b5e 100644
--- a/src/ui/dialog/export.h
+++ b/src/ui/dialog/export.h
@@ -170,7 +170,7 @@ private:
* Inkscape selection change callback
*/
void onSelectionChanged ();
- void onSelectioModified (guint flags);
+ void onSelectionModified (guint flags);
/**
* Filename modified callback
@@ -190,7 +190,7 @@ private:
/**
* Progress dialog callbacks
*/
- GtkWidget * create_progress_dialog (gchar *progress_text);
+ GtkWidget * create_progress_dialog (Glib::ustring progress_text);
static unsigned int onProgressCallback (float value, void *data);
static void onProgressCancel ( GtkWidget *widget, GObject *base );
static gint onProgressDelete ( GtkWidget *widget, GdkEvent *event, GObject *base );
@@ -200,7 +200,7 @@ private:
*/
void set_default_filename ();
gchar* create_filepath_from_id (const gchar *id, const gchar *file_entry_text);
- gchar *filename_add_extension (const gchar *filename, const gchar *extension);
+ Glib::ustring filename_add_extension (Glib::ustring filename, Glib::ustring extension);
gchar *absolutize_path_from_document_location (SPDocument *doc, const gchar *filename);
/*
diff --git a/src/ui/dialog/filedialogimpl-gtkmm.cpp b/src/ui/dialog/filedialogimpl-gtkmm.cpp
index ab936c941..6cdd202bb 100644
--- a/src/ui/dialog/filedialogimpl-gtkmm.cpp
+++ b/src/ui/dialog/filedialogimpl-gtkmm.cpp
@@ -1457,7 +1457,7 @@ FileExportDialogImpl::FileExportDialogImpl( Gtk::Window& parentWindow,
selectionButton.set_group(scopeGroup);
scopeBox.pack_start(selectionButton);
- customButton.set_label(_("Custom"));
+ customButton.set_label(C_("Export dialog", "Custom"));
customButton.set_group(scopeGroup);
scopeBox.pack_start(customButton);
diff --git a/src/ui/dialog/filedialogimpl-win32.cpp b/src/ui/dialog/filedialogimpl-win32.cpp
index 7dd619fa6..089ec1737 100644
--- a/src/ui/dialog/filedialogimpl-win32.cpp
+++ b/src/ui/dialog/filedialogimpl-win32.cpp
@@ -948,7 +948,7 @@ void FileOpenDialogImplWin32::free_preview()
DestroyIcon(_preview_file_icon);
_preview_file_icon = NULL;
- _preview_bitmap_image.clear();
+ _preview_bitmap_image.reset();
_preview_emf_image = false;
_mutex->unlock();
}
@@ -1714,7 +1714,7 @@ void FileSaveDialogImplWin32::GetSaveFileName_thread()
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = current_directory_string;
ofn.lpstrTitle = _title;
- ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLEHOOK;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING;
ofn.lpstrFilter = _filter;
ofn.nFilterIndex = _filter_index;
ofn.lpfnHook = GetSaveFileName_hookproc;
diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp
index da99594bb..dd3e90b2c 100644
--- a/src/ui/dialog/filter-effects-dialog.cpp
+++ b/src/ui/dialog/filter-effects-dialog.cpp
@@ -66,6 +66,7 @@
#include <gtkmm/paned.h>
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/stock.h>
+#include <gdkmm/general.h>
using namespace Inkscape::Filters;
@@ -1606,6 +1607,7 @@ bool FilterEffectsDialog::PrimitiveList::on_expose_signal(GdkEventExpose* e)
Gdk::Rectangle clip(e->area.x, e->area.y, e->area.width, e->area.height);
Glib::RefPtr<Gdk::Window> win = get_bin_window();
Glib::RefPtr<Gdk::GC> darkgc = get_style()->get_dark_gc(Gtk::STATE_NORMAL);
+ Cairo::RefPtr<Cairo::Context> cr = get_bin_window()->create_cairo_context();
SPFilterPrimitive* prim = get_selected();
int row_count = get_model()->children().size();
@@ -1617,14 +1619,25 @@ bool FilterEffectsDialog::PrimitiveList::on_expose_signal(GdkEventExpose* e)
if(row) {
get_cell_area(get_model()->get_path(row), *get_column(1), rct);
get_visible_rect(vis);
-
text_start_x = rct.get_x() + rct.get_width() - get_input_type_width() * FPInputConverter._length + 1;
- for(unsigned int i = 0; i < FPInputConverter._length; ++i) {
+
+ for(unsigned int i = 0; i < FPInputConverter._length; ++i) {
_vertical_layout->set_text(_(FPInputConverter.get_label((FilterPrimitiveInput)i).c_str()));
const int x = text_start_x + get_input_type_width() * i;
- get_bin_window()->draw_rectangle(get_style()->get_bg_gc(Gtk::STATE_NORMAL), true, x, 0, get_input_type_width(), vis.get_height());
- get_bin_window()->draw_layout(get_style()->get_text_gc(Gtk::STATE_NORMAL), x + 1, 0, _vertical_layout);
- get_bin_window()->draw_line(darkgc, x, 0, x, vis.get_height());
+ cr->save();
+ cr->rectangle(x, 0, get_input_type_width(), vis.get_height());
+ Gdk::Cairo::set_source_color(cr, get_style()->get_bg(Gtk::STATE_NORMAL));
+ cr->fill_preserve();
+ Gdk::Cairo::set_source_color(cr, get_style()->get_text(Gtk::STATE_NORMAL));
+ cr->move_to(x+get_input_type_width(), 0);
+ cr->rotate_degrees(90);
+ _vertical_layout->show_in_cairo_context(cr);
+ Gdk::Cairo::set_source_color(cr, get_style()->get_dark(Gtk::STATE_NORMAL));
+ cr->set_line_width(1.0);
+ cr->move_to(x, 0);
+ cr->line_to(x, vis.get_height());
+ cr->stroke();
+ cr->restore();
}
}
@@ -1640,10 +1653,16 @@ bool FilterEffectsDialog::PrimitiveList::on_expose_signal(GdkEventExpose* e)
// Outline the bottom of the connection area
const int outline_x = x + fheight * (row_count - row_index);
- get_bin_window()->draw_line(darkgc, x, y + h, outline_x, y + h);
-
+ cr->save();
+ Gdk::Cairo::set_source_color(cr, get_style()->get_dark(Gtk::STATE_NORMAL));
+ cr->set_line_width(1.0);
+ cr->move_to(x, y + h);
+ cr->line_to(outline_x, y + h);
// Side outline
- get_bin_window()->draw_line(darkgc, outline_x, y - 1, outline_x, y + h);
+ cr->line_to(outline_x, y - 1);
+
+ cr->stroke();
+ cr->restore();
std::vector<Gdk::Point> con_poly;
int con_drag_y = 0;
@@ -1693,10 +1712,15 @@ bool FilterEffectsDialog::PrimitiveList::on_expose_signal(GdkEventExpose* e)
// Draw drag connection
if(row_prim == prim && _in_drag) {
- get_bin_window()->draw_line(get_style()->get_black_gc(), outline_x, con_drag_y,
- mx, con_drag_y);
- get_bin_window()->draw_line(get_style()->get_black_gc(), mx, con_drag_y, mx, my);
- }
+ cr->save();
+ Gdk::Cairo::set_source_color(cr, get_style()->get_black());
+ cr->set_line_width(1.0);
+ cr->move_to(outline_x, con_drag_y);
+ cr->line_to(mx, con_drag_y);
+ cr->line_to(mx, my);
+ cr->stroke();
+ cr->restore();
+ }
}
return true;
@@ -1708,32 +1732,37 @@ void FilterEffectsDialog::PrimitiveList::draw_connection(const Gtk::TreeIter& in
{
int src_id = 0;
Gtk::TreeIter res = find_result(input, attr, src_id);
- Glib::RefPtr<Gdk::GC> darkgc = get_style()->get_black_gc();
- Glib::RefPtr<Gdk::GC> lightgc = get_style()->get_dark_gc(Gtk::STATE_NORMAL);
- Glib::RefPtr<Gdk::GC> gc;
+ Cairo::RefPtr<Cairo::Context> cr = get_bin_window()->create_cairo_context();
const bool is_first = input == get_model()->children().begin();
const bool is_merge = SP_IS_FEMERGE((SPFilterPrimitive*)(*input)[_columns.primitive]);
const bool use_default = !res && !is_merge;
+ cr->set_line_width(1);
if(res == input || (use_default && is_first)) {
// Draw straight connection to a standard input
// Draw a lighter line for an implicit connection to a standard input
const int tw = get_input_type_width();
gint end_x = text_start_x + tw * src_id + (int)(tw * 0.5f) + 1;
- gc = (use_default && is_first) ? lightgc : darkgc;
- get_bin_window()->draw_rectangle(gc, true, end_x-2, y1-2, 5, 5);
- get_bin_window()->draw_line(gc, x1, y1, end_x, y1);
+
+ if(use_default && is_first)
+ Gdk::Cairo::set_source_color(cr, get_style()->get_dark(Gtk::STATE_NORMAL));
+ else
+ Gdk::Cairo::set_source_color(cr, get_style()->get_black());
+
+ cr->rectangle(end_x-2, y1-2, 5, 5);
+ cr->fill_preserve();
+ cr->move_to(x1, y1);
+ cr->line_to(end_x, y1);
+ cr->stroke();
}
else {
// Draw an 'L'-shaped connection to another filter primitive
// If no connection is specified, draw a light connection to the previous primitive
- gc = use_default ? lightgc : darkgc;
-
- if(use_default) {
- res = input;
- --res;
- }
+ if(use_default) {
+ res = input;
+ --res;
+ }
if(res) {
Gdk::Rectangle rct;
@@ -1747,9 +1776,12 @@ void FilterEffectsDialog::PrimitiveList::draw_connection(const Gtk::TreeIter& in
const int y2 = rct.get_y() + rct.get_height();
// Draw a bevelled 'L'-shaped connection
- get_bin_window()->draw_line(get_style()->get_black_gc(), x1, y1, x2-fheight/4, y1);
- get_bin_window()->draw_line(get_style()->get_black_gc(), x2-fheight/4, y1, x2, y1-fheight/4);
- get_bin_window()->draw_line(get_style()->get_black_gc(), x2, y1-fheight/4, x2, y2);
+ Gdk::Cairo::set_source_color(cr, get_style()->get_black());
+ cr->move_to(x1, y1);
+ cr->line_to(x2-fheight/4, y1);
+ cr->line_to(x2, y1-fheight/4);
+ cr->line_to(x2, y2);
+ cr->stroke();
}
}
}
diff --git a/src/ui/dialog/find.cpp b/src/ui/dialog/find.cpp
index f5745e02b..5fd6e18d8 100644
--- a/src/ui/dialog/find.cpp
+++ b/src/ui/dialog/find.cpp
@@ -436,7 +436,7 @@ Find::item_style_match (SPItem *item, const gchar *text, bool exact, bool casema
return found;
}
-bool Find::item_attr_match(SPItem *item, const gchar *text, bool exact, bool casematch, bool replace/*=false*/)
+bool Find::item_attr_match(SPItem *item, const gchar *text, bool exact, bool /*casematch*/, bool replace/*=false*/)
{
bool found = false;
@@ -492,7 +492,7 @@ bool Find::item_attrvalue_match(SPItem *item, const gchar *text, bool exact, boo
}
-bool Find::item_font_match(SPItem *item, const gchar *text, bool exact, bool casematch, bool replace/*=false*/)
+bool Find::item_font_match(SPItem *item, const gchar *text, bool exact, bool casematch, bool /*replace*/ /*=false*/)
{
bool ret = false;
diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp
index 269266083..b038ae60d 100644
--- a/src/ui/dialog/inkscape-preferences.cpp
+++ b/src/ui/dialog/inkscape-preferences.cpp
@@ -129,7 +129,6 @@ InkscapePreferences::InkscapePreferences()
initPageRendering();
initPageSpellcheck();
-
signalPresent().connect(sigc::mem_fun(*this, &InkscapePreferences::_presentPages));
//calculate the size request for this dialog
@@ -364,7 +363,7 @@ void InkscapePreferences::initPageTools()
AddGradientCheckbox(_page_zoom, "/tools/zoom", false);
//Measure
- this->AddPage(_page_measure, _("Measure"), iter_tools, PREFS_PAGE_TOOLS_MEASURE);
+ this->AddPage(_page_measure, C_("Measurement tool", "Measure"), iter_tools, PREFS_PAGE_TOOLS_MEASURE);
PrefCheckButton* cb = Gtk::manage( new PrefCheckButton);
cb->init ( _("Ignore first and last points"), "/tools/measure/ignore_1st_and_last", true);
_page_measure.add_line( false, "", *cb, "", _("The start and end of the measurement tool's control line will not be considered for calculating lengths. Only lengths between actual curve intersections will be displayed."));
@@ -1344,38 +1343,41 @@ void InkscapePreferences::initPageSpellcheck()
GetModuleFileName(NULL, exeName, MAX_PATH);
char *slashPos = strrchr(exeName, '\\');
if (slashPos)
+ {
*slashPos = '\0';
- g_print ("%s\n", exeName);
+ }
+ // g_print ("%s\n", exeName);
aspell_config_replace(config, "prefix", exeName);
#endif
- /* the returned pointer should _not_ need to be deleted */
- AspellDictInfoList *dlist = get_aspell_dict_info_list(config);
-
- /* config is no longer needed */
- delete_aspell_config(config);
-
- AspellDictInfoEnumeration *dels = aspell_dict_info_list_elements(dlist);
-
- languages.push_back(Glib::ustring(_("None")));
- langValues.push_back(Glib::ustring(""));
-
- const AspellDictInfo *entry;
- int en_index = 0;
- int i = 0;
- while ( (entry = aspell_dict_info_enumeration_next(dels)) != 0)
- {
- languages.push_back(Glib::ustring(entry->name));
- langValues.push_back(Glib::ustring(entry->name));
- if (!strcmp (entry->name, "en"))
- en_index = i;
- i ++;
- }
-
- delete_aspell_dict_info_enumeration(dels);
+ /* the returned pointer should _not_ need to be deleted */
+ AspellDictInfoList *dlist = get_aspell_dict_info_list(config);
+
+ /* config is no longer needed */
+ delete_aspell_config(config);
+
+ AspellDictInfoEnumeration *dels = aspell_dict_info_list_elements(dlist);
+
+ languages.push_back(Glib::ustring(_("None")));
+ langValues.push_back(Glib::ustring(""));
+
+ const AspellDictInfo *entry;
+ int en_index = 0;
+ int i = 0;
+ while ( (entry = aspell_dict_info_enumeration_next(dels)) != 0)
+ {
+ languages.push_back(Glib::ustring(entry->name));
+ langValues.push_back(Glib::ustring(entry->name));
+ if (!strcmp (entry->name, "en"))
+ {
+ en_index = i;
+ }
+ i++;
+ }
+ delete_aspell_dict_info_enumeration(dels);
- _spell_language.init( "/dialogs/spellcheck/lang", &languages[0], &langValues[0], languages.size(), languages[en_index]);
+ _spell_language.init( "/dialogs/spellcheck/lang", &languages[0], &langValues[0], languages.size(), languages[en_index]);
_page_spellcheck.add_line( false, _("Language:"), _spell_language, "",
_("Set the main spell check language"), false);
diff --git a/src/ui/dialog/layers.h b/src/ui/dialog/layers.h
index 0a6f683dd..7959d0e6e 100644
--- a/src/ui/dialog/layers.h
+++ b/src/ui/dialog/layers.h
@@ -109,7 +109,11 @@ private:
std::vector<Gtk::Widget*> _watchingNonBottom;
Gtk::TreeView _tree;
+#if WITH_GTKMM_3_0
+ Gtk::ButtonBox _buttonsRow;
+#else
Gtk::HButtonBox _buttonsRow;
+#endif
Gtk::ScrolledWindow _scroller;
Gtk::Menu _popupMenu;
Inkscape::UI::Widget::SpinButton _spinBtn;
diff --git a/src/ui/dialog/livepatheffect-editor.cpp b/src/ui/dialog/livepatheffect-editor.cpp
index 161d92b09..1f252c089 100644
--- a/src/ui/dialog/livepatheffect-editor.cpp
+++ b/src/ui/dialog/livepatheffect-editor.cpp
@@ -32,11 +32,14 @@
#include "live_effects/lpeobject.h"
#include "live_effects/lpeobject-reference.h"
#include "path-chemistry.h"
+#include "selection-chemistry.h"
#include "selection.h"
#include "sp-item-group.h"
#include "sp-lpe-item.h"
#include "sp-path.h"
#include "sp-rect.h"
+#include "sp-use.h"
+#include "sp-text.h"
#include "sp-shape.h"
#include "ui/icon-names.h"
#include "ui/widget/imagetoggler.h"
@@ -284,6 +287,22 @@ LivePathEffectEditor::onSelectionChanged(Inkscape::Selection *sel)
button_up.set_sensitive(false);
button_down.set_sensitive(false);
}
+ } else if ( SP_IS_USE(item) ) {
+ // test whether linked object is supported by the CLONE_ORIGINAL LPE
+ SPItem *orig = sp_use_get_original( SP_USE(item) );
+ if ( SP_IS_SHAPE(orig) ||
+ SP_IS_TEXT(orig) )
+ {
+ // Note that an SP_USE cannot have an LPE applied, so we only need to worry about the "add effect" case.
+ set_sensitize_all(true);
+ showText(_("Click add button to convert clone"));
+ button_remove.set_sensitive(false);
+ button_up.set_sensitive(false);
+ button_down.set_sensitive(false);
+ } else {
+ showText(_("Select a path or shape"));
+ set_sensitize_all(false);
+ }
} else {
showText(_("Select a path or shape"));
set_sensitize_all(false);
@@ -369,37 +388,75 @@ LivePathEffectEditor::setDesktop(SPDesktop *desktop)
void
LivePathEffectEditor::onAdd()
{
- using Inkscape::UI::Dialog::LivePathEffectAdd;
- LivePathEffectAdd::show(current_desktop);
-
- if ( !LivePathEffectAdd::isApplied()) {
- return;
- }
-
- const Util::EnumData<LivePathEffect::EffectType>* data = LivePathEffectAdd::getActiveData();
- if (!data) {
- return;
- }
-
Inkscape::Selection *sel = _getSelection();
if ( sel && !sel->isEmpty() ) {
SPItem *item = sel->singleItem();
- if ( item && SP_IS_LPE_ITEM(item) ) {
- SPDocument *doc = current_desktop->doc();
+ if (item) {
+ if ( SP_IS_LPE_ITEM(item) ) {
+ // show effectlist dialog
+ using Inkscape::UI::Dialog::LivePathEffectAdd;
+ LivePathEffectAdd::show(current_desktop);
+ if ( !LivePathEffectAdd::isApplied()) {
+ return;
+ }
- // If item is a SPRect, convert it to path first:
- if ( SP_IS_RECT(item) ) {
- sp_selected_path_to_curves(current_desktop, false);
- item = sel->singleItem(); // get new item
- }
+ SPDocument *doc = current_desktop->doc();
- LivePathEffect::Effect::createAndApply(data->key.c_str(), doc, item);
+ const Util::EnumData<LivePathEffect::EffectType>* data = LivePathEffectAdd::getActiveData();
+ if (!data) {
+ return;
+ }
- DocumentUndo::done(doc, SP_VERB_DIALOG_LIVE_PATH_EFFECT,
- _("Create and apply path effect"));
+ // If item is a SPRect, convert it to path first:
+ if ( SP_IS_RECT(item) ) {
+ sp_selected_path_to_curves(current_desktop, false);
+ item = sel->singleItem(); // get new item
+ }
- lpe_list_locked = false;
- onSelectionChanged(sel);
+ LivePathEffect::Effect::createAndApply(data->key.c_str(), doc, item);
+
+ DocumentUndo::done(doc, SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Create and apply path effect"));
+
+ lpe_list_locked = false;
+ onSelectionChanged(sel);
+ }
+ else if ( SP_IS_USE(item) ) {
+ // item is a clone. do not show effectlist dialog.
+ // convert to path, apply CLONE_ORIGINAL LPE, link it to the cloned path
+
+ // test whether linked object is supported by the CLONE_ORIGINAL LPE
+ SPItem *orig = sp_use_get_original( SP_USE(item) );
+ if ( SP_IS_SHAPE(orig) ||
+ SP_IS_TEXT(orig) )
+ {
+ // select original
+ sel->set(orig);
+
+ // delete clone but remember its id and transform
+ gchar *id = g_strdup(item->getRepr()->attribute("id"));
+ gchar *transform = g_strdup(item->getRepr()->attribute("transform"));
+ item->deleteObject(false);
+ item = NULL;
+
+ // run sp_selection_clone_original_path_lpe
+ sp_selection_clone_original_path_lpe(current_desktop);
+ item = sel->singleItem();
+ item->getRepr()->setAttribute("id", id);
+ item->getRepr()->setAttribute("transform", transform);
+ g_free(id);
+ g_free(transform);
+
+ /// \todo Add the LPE stack of the original path?
+
+ SPDocument *doc = current_desktop->doc();
+ DocumentUndo::done(doc, SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Create and apply Clone original path effect"));
+
+ lpe_list_locked = false;
+ onSelectionChanged(sel);
+ }
+ }
}
}
}
diff --git a/src/ui/dialog/livepatheffect-editor.h b/src/ui/dialog/livepatheffect-editor.h
index 11ab8ea89..beebbc698 100644
--- a/src/ui/dialog/livepatheffect-editor.h
+++ b/src/ui/dialog/livepatheffect-editor.h
@@ -102,7 +102,11 @@ private:
void on_visibility_toggled( Glib::ustring const& str );
+#if WITH_GTKMM_3_0
+ Gtk::ButtonBox toolbar_hbox;
+#else
Gtk::HButtonBox toolbar_hbox;
+#endif
Gtk::Button button_add;
Gtk::Button button_remove;
Gtk::Button button_up;
diff --git a/src/ui/dialog/ocaldialogs.cpp b/src/ui/dialog/ocaldialogs.cpp
index c766bae9d..4c9245f5c 100644
--- a/src/ui/dialog/ocaldialogs.cpp
+++ b/src/ui/dialog/ocaldialogs.cpp
@@ -310,7 +310,7 @@ LoadingBox::LoadingBox() : Gtk::EventBox()
signal_expose_event().connect(sigc::mem_fun(*this, &LoadingBox::_on_expose_event), false);
}
-bool LoadingBox::_on_expose_event(GdkEventExpose* event)
+bool LoadingBox::_on_expose_event(GdkEventExpose* /*event*/)
{
Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context();
@@ -342,7 +342,7 @@ bool LoadingBox::_on_expose_event(GdkEventExpose* event)
void LoadingBox::start()
{
// Timeout hasn't been stopped, so must be disconnected
- if ((draw_spinner != false) & (timeout != NULL)) {
+ if ((draw_spinner != false) && timeout) {
timeout.disconnect();
}
@@ -447,7 +447,7 @@ void PreviewWidget::clear()
image->hide();
}
-bool PreviewWidget::_on_expose_event(GdkEventExpose* event)
+bool PreviewWidget::_on_expose_event(GdkEventExpose* /*event*/)
{
Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context();
@@ -532,11 +532,11 @@ SearchEntry::SearchEntry() : Gtk::Entry()
gtk_entry_set_icon_from_stock(gobj(), GTK_ENTRY_ICON_SECONDARY, NULL);
}
-void SearchEntry::_on_icon_pressed(Gtk::EntryIconPosition icon_position, const GdkEventButton* event)
+void SearchEntry::_on_icon_pressed(Gtk::EntryIconPosition icon_position, const GdkEventButton* /*event*/)
{
if (icon_position == Gtk::ENTRY_ICON_SECONDARY) {
grab_focus();
- set_text("");
+ delete_text(0, -1);
} else if (icon_position == Gtk::ENTRY_ICON_PRIMARY) {
select_region(0, -1);
grab_focus();
@@ -558,7 +558,7 @@ BaseBox::BaseBox() : Gtk::EventBox()
set_visible_window(false);
}
-bool BaseBox::_on_expose_event(GdkEventExpose* event)
+bool BaseBox::_on_expose_event(GdkEventExpose* /*event*/)
{
Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context();
@@ -595,7 +595,7 @@ LogoArea::LogoArea() : Gtk::EventBox()
set_visible_window(false);
}
-bool LogoArea::_on_expose_event(GdkEventExpose* event)
+bool LogoArea::_on_expose_event(GdkEventExpose* /*event*/)
{
if (draw_logo) {
int x = get_allocation().get_x();
@@ -863,8 +863,8 @@ void ImportDialog::on_thumbnail_downloaded(Glib::ustring path, bool success)
/*
* Callback for row activated
*/
-void ImportDialog::on_list_results_row_activated(const Gtk::TreeModel::Path& path,
- Gtk::TreeViewColumn* column)
+void ImportDialog::on_list_results_row_activated(const Gtk::TreeModel::Path& /*path*/,
+ Gtk::TreeViewColumn* /*column*/)
{
on_list_results_cursor_changed();
button_import->signal_clicked();
@@ -1075,12 +1075,14 @@ void ImportDialog::update_label_no_search_results()
{
Glib::ustring keywords = Glib::Markup::escape_text(entry_search->get_text());
Gdk::Color grey = entry_search->get_style()->get_text_aa(entry_search->get_state());
-
+ Glib::ustring msg_one = Glib::ustring::compose(
+ _("No clipart named <b>%1</b> was found."),
+ keywords);
+ Glib::ustring msg_two = _("Please make sure all keywords are spelled correctly,"
+ " or try again with different keywords.");
Glib::ustring markup = Glib::ustring::compose(
- "<span size=\"large\">%1 <b>%2</b> %3</span>\n<span color=\"%4\">%5</span>",
- _("No clipart named"), keywords, _("was found."), grey.to_string(),
- _("Please make sure all keywords are spelled correctly, or try again with different keywords."));
-
+ "<span size=\"large\">%1</span>\n<span color=\"%2\">%3</span>",
+ msg_one, grey.to_string(), msg_two);
label_not_found->set_markup(markup);
}
diff --git a/src/ui/dialog/ocaldialogs.h b/src/ui/dialog/ocaldialogs.h
index 5d4ac43ad..9e471b7b5 100644
--- a/src/ui/dialog/ocaldialogs.h
+++ b/src/ui/dialog/ocaldialogs.h
@@ -59,7 +59,7 @@ public:
/**
* Constructor
*/
- FileDialogBase(const Glib::ustring &title, Gtk::Window& parent) : Gtk::Window(Gtk::WINDOW_TOPLEVEL)
+ FileDialogBase(const Glib::ustring &title, Gtk::Window& /*parent*/) : Gtk::Window(Gtk::WINDOW_TOPLEVEL)
{
set_title(title);
sp_transientize((GtkWidget*) gobj());
diff --git a/src/ui/dialog/spellcheck.h b/src/ui/dialog/spellcheck.h
index 74d5b76e6..8eb240097 100644
--- a/src/ui/dialog/spellcheck.h
+++ b/src/ui/dialog/spellcheck.h
@@ -221,7 +221,11 @@ private:
* Dialogs widgets
*/
Gtk::Label banner_label;
+#if WITH_GTKMM_3_0
+ Gtk::ButtonBox banner_hbox;
+#else
Gtk::HButtonBox banner_hbox;
+#endif
Gtk::ScrolledWindow scrolled_window;
Gtk::TreeView tree_view;
Glib::RefPtr<Gtk::ListStore> model;
diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp
index 29492db55..092887541 100644
--- a/src/ui/dialog/swatches.cpp
+++ b/src/ui/dialog/swatches.cpp
@@ -420,11 +420,11 @@ void _loadPaletteFile( gchar const *filename )
inHeader = false;
ptr = block;
Glib::ustring name("");
- int r = 0;
- int g = 0;
- int b = 0;
skipWhitespace(ptr);
if ( *ptr ) {
+ int r = 0;
+ int g = 0;
+ int b = 0;
hasErr = parseNum(ptr, r);
if ( !hasErr ) {
skipWhitespace(ptr);
@@ -666,14 +666,14 @@ SwatchesPanel::~SwatchesPanel()
}
}
-void SwatchesPanel::setOrientation( Gtk::AnchorType how )
+void SwatchesPanel::setOrientation(SPAnchorType how)
{
// Must call the parent class or bad things might happen
Inkscape::UI::Widget::Panel::setOrientation( how );
if ( _holder )
{
- _holder->setOrientation( Gtk::ANCHOR_SOUTH );
+ _holder->setOrientation(SP_ANCHOR_SOUTH);
}
}
diff --git a/src/ui/dialog/swatches.h b/src/ui/dialog/swatches.h
index 0ff795ac3..ca4c1687d 100644
--- a/src/ui/dialog/swatches.h
+++ b/src/ui/dialog/swatches.h
@@ -11,6 +11,7 @@
#define SEEN_DIALOGS_SWATCHES_H
#include "ui/widget/panel.h"
+#include "enums.h"
namespace Inkscape {
namespace UI {
@@ -34,7 +35,7 @@ public:
static SwatchesPanel& getInstance();
- virtual void setOrientation( Gtk::AnchorType how );
+ virtual void setOrientation(SPAnchorType how);
virtual void setDesktop( SPDesktop* desktop );
virtual SPDesktop* getDesktop() {return _currentDesktop;}
diff --git a/src/ui/dialog/text-edit.cpp b/src/ui/dialog/text-edit.cpp
index c64bd22c6..b09096e63 100644
--- a/src/ui/dialog/text-edit.cpp
+++ b/src/ui/dialog/text-edit.cpp
@@ -245,7 +245,7 @@ void TextEdit::onSelectionModified(guint flags )
onReadSelection (style, content);
}
-void TextEdit::onReadSelection ( gboolean dostyle, gboolean docontent )
+void TextEdit::onReadSelection ( gboolean dostyle, gboolean /*docontent*/ )
{
if (blocked)
return;
@@ -643,7 +643,7 @@ void TextEdit::onToggle()
}
-void TextEdit::onLineSpacingChange(GtkComboBox* widget, gpointer data)
+void TextEdit::onLineSpacingChange(GtkComboBox* /*widget*/, gpointer data)
{
TextEdit *self = static_cast<TextEdit *>(data);
if (!self || self->blocked)
diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp
index ae1ebf5ca..5c39a2b22 100644
--- a/src/ui/dialog/xml-tree.cpp
+++ b/src/ui/dialog/xml-tree.cpp
@@ -48,6 +48,11 @@
#include "widgets/sp-xmlview-content.h"
#include "widgets/sp-xmlview-tree.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Return 0xff0d
+#endif
+
namespace Inkscape {
namespace UI {
namespace Dialog {
@@ -65,7 +70,6 @@ XmlTree::XmlTree (void) :
attributes (NULL),
content (NULL),
attr_name (),
- attr_value (),
status (""),
tree_toolbar(),
xml_element_new_button ( _("New element node")),
@@ -167,6 +171,7 @@ XmlTree::XmlTree (void) :
Gtk::ScrolledWindow *tree_scroller = new Gtk::ScrolledWindow();
tree_scroller->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
+ tree_scroller->set_shadow_type(Gtk::SHADOW_IN);
tree_scroller->add(*Gtk::manage(Glib::wrap(GTK_WIDGET(tree))));
left_box.pack_start(*tree_scroller);
@@ -227,11 +232,11 @@ XmlTree::XmlTree (void) :
text_container.add(*Gtk::manage(Glib::wrap(GTK_WIDGET(content))));
/* Signal handlers */
- g_signal_connect( G_OBJECT(tree), "tree_select_row", G_CALLBACK(on_tree_select_row), this );
- g_signal_connect( G_OBJECT(tree), "tree_unselect_row", G_CALLBACK(on_tree_unselect_row), this);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree));
+ g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (on_tree_select_row), this);
g_signal_connect_after( G_OBJECT(tree), "tree_move", G_CALLBACK(after_tree_move), this);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (on_attr_select_row), this);
g_signal_connect( G_OBJECT(attributes), "row-value-changed", G_CALLBACK(on_attr_row_changed), this);
@@ -287,8 +292,6 @@ XmlTree::~XmlTree (void)
Inkscape::GC::release(_message_stack);
_message_stack = NULL;
_message_changed_connection.~connection();
-
- //status = "";
}
void XmlTree::setDesktop(SPDesktop *desktop)
@@ -336,7 +339,7 @@ bool XmlTree::sp_xml_tree_key_press(GdkEventKey *event)
/* fixme: if you need to add more xml-tree-specific callbacks, you should probably upgrade
* the sp_shortcut mechanism to take into account windows. */
- if (shortcut == (SP_SHORTCUT_CONTROL_MASK | GDK_Return)) {
+ if (shortcut == (SP_SHORTCUT_CONTROL_MASK | GDK_KEY_Return)) {
cmd_set_attr();
return true;
}
@@ -394,8 +397,6 @@ void XmlTree::set_tree_repr(Inkscape::XML::Node *repr)
return;
}
- gtk_clist_freeze(GTK_CLIST(tree));
-
sp_xmlview_tree_set_repr(tree, repr);
if (repr) {
set_tree_select(get_dt_select());
@@ -403,8 +404,6 @@ void XmlTree::set_tree_repr(Inkscape::XML::Node *repr)
set_tree_select(NULL);
}
- gtk_clist_thaw(GTK_CLIST(tree));
-
propagate_tree_select(selected_repr);
}
@@ -419,26 +418,29 @@ void XmlTree::set_tree_select(Inkscape::XML::Node *repr)
selected_repr = repr;
if (repr) {
- GtkCTreeNode *node;
+ GtkTreeIter node;
Inkscape::GC::anchor(selected_repr);
- node = sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), repr);
- if (node) {
- GtkCTreeNode *parent;
+ if (sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), repr, &node)) {
- gtk_ctree_select(GTK_CTREE(tree), node);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_selection_unselect_all (selection);
- parent = GTK_CTREE_ROW(node)->parent;
- while (parent) {
- gtk_ctree_expand(GTK_CTREE(tree), parent);
- parent = GTK_CTREE_ROW(parent)->parent;
- }
+ GtkTreePath* path = gtk_tree_model_get_path(GTK_TREE_MODEL(tree->store), &node);
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW(tree), path);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, TRUE, 0.66, 0.0);
+ gtk_tree_path_free(path);
- gtk_ctree_node_moveto(GTK_CTREE(tree), node, 0, 0.66, 0.0);
+ gtk_tree_selection_select_iter(selection, &node);
+
+ } else {
+ g_message("XmlTree::set_tree_select : Couldnt find repr node");
}
} else {
- gtk_clist_unselect_all(GTK_CLIST(tree));
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_selection_unselect_all (selection);
+
on_tree_unselect_row_disable();
on_tree_unselect_row_hide();
}
@@ -508,76 +510,67 @@ void XmlTree::set_dt_select(Inkscape::XML::Node *repr)
} // end of set_dt_select()
-void XmlTree::on_tree_select_row(GtkCTree *tree,
- GtkCTreeNode *node,
- gint column,
- gpointer data)
+/*void XmlTree::on_tree_select_row(GtkCTree *tree,
+ GtkCTreeNode *node,
+ gint column,
+ gpointer data)*/
+void XmlTree::on_tree_select_row(GtkTreeSelection *selection, gpointer data)
{
- XmlTree *self = (XmlTree *)data;
+ XmlTree *self = static_cast<XmlTree *>(data);
- Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
- g_assert(repr != NULL);
+ GtkTreeIter iter;
+ GtkTreeModel *model;
if (self->selected_repr) {
Inkscape::GC::release(self->selected_repr);
self->selected_repr = NULL;
}
- self->selected_repr = repr;
- Inkscape::GC::anchor(self->selected_repr);
- self->propagate_tree_select(self->selected_repr);
- self->set_dt_select(self->selected_repr);
-
- self->tree_reset_context();
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ // Nothing selected, update widgets
+ self->propagate_tree_select(NULL);
+ self->set_dt_select(NULL);
+ self->on_tree_unselect_row_disable();
+ self->on_tree_unselect_row_hide();
+ self->on_attr_unselect_row_clear_text();
+ return;
+ }
- self->on_tree_select_row_enable(node);
-}
+ Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(self->tree), &iter);
+ g_assert(repr != NULL);
-void XmlTree::on_tree_unselect_row(GtkCTree *tree,
- GtkCTreeNode *node,
- gint column,
- gpointer data)
-{
- XmlTree *self = (XmlTree *)data;
- if (self->blocked) {
- return;
- }
+ self->selected_repr = repr;
+ Inkscape::GC::anchor(self->selected_repr);
+ self->propagate_tree_select(self->selected_repr);
- Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
- self->propagate_tree_select(NULL);
- self->set_dt_select(NULL);
+ self->set_dt_select(self->selected_repr);
- if (self->selected_repr && (self->selected_repr == repr)) {
- Inkscape::GC::release(self->selected_repr);
- self->selected_repr = NULL;
- self->selected_attr = 0;
- }
+ self->tree_reset_context();
- self->on_tree_unselect_row_disable();
- self->on_tree_unselect_row_hide();
- self->on_attr_unselect_row_clear_text();
+ self->on_tree_select_row_enable(&iter);
}
-
-void XmlTree::after_tree_move(GtkCTree */*tree*/,
- GtkCTreeNode *node,
- GtkCTreeNode *new_parent,
- GtkCTreeNode *new_sibling,
- gpointer data)
+void XmlTree::after_tree_move(SPXMLViewTree * /*attributes*/, gpointer value, gpointer data)
{
- XmlTree *self = (XmlTree *)data;
+ XmlTree *self = static_cast<XmlTree *>(data);
+ guint val = GPOINTER_TO_UINT(value);
- if (GTK_CTREE_ROW(node)->parent == new_parent &&
- GTK_CTREE_ROW(node)->sibling == new_sibling)
- {
+ if (val) {
DocumentUndo::done(self->current_document, SP_VERB_DIALOG_XML_EDITOR,
- _("Drag XML subtree"));
+ _("Drag XML subtree"));
} else {
- DocumentUndo::cancel(self->current_document);
+ //DocumentUndo::cancel(self->current_document);
+ /*
+ * There was a problem with drag & drop,
+ * data is probably not synchronized, so reload the tree
+ */
+ SPDocument *document = self->current_document;
+ self->set_tree_document(NULL);
+ self->set_tree_document(document);
}
}
@@ -588,13 +581,13 @@ void XmlTree::_set_status_message(Inkscape::MessageType /*type*/, const gchar *m
}
}
-void XmlTree::on_tree_select_row_enable(GtkCTreeNode *node)
+void XmlTree::on_tree_select_row_enable(GtkTreeIter *node)
{
if (!node) {
return;
}
- Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
+ Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(tree), node);
Inkscape::XML::Node *parent=repr->parent();
//on_tree_select_row_enable_if_mutable
@@ -613,11 +606,10 @@ void XmlTree::on_tree_select_row_enable(GtkCTreeNode *node)
//on_tree_select_row_enable_if_has_grandparent
{
- GtkCTreeNode *parent = GTK_CTREE_ROW(node)->parent;
-
- if (parent) {
- GtkCTreeNode *grandparent = GTK_CTREE_ROW(parent)->parent;
- if (grandparent) {
+ GtkTreeIter parent;
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &parent, node)) {
+ GtkTreeIter grandparent;
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &grandparent, &parent)) {
unindent_node_button.set_sensitive(true);
} else {
unindent_node_button.set_sensitive(false);
@@ -683,20 +675,23 @@ void XmlTree::on_tree_select_row_enable(GtkCTreeNode *node)
}
-gboolean XmlTree::xml_tree_node_mutable(GtkCTreeNode *node)
+gboolean XmlTree::xml_tree_node_mutable(GtkTreeIter *node)
{
// top-level is immutable, obviously
- if (!GTK_CTREE_ROW(node)->parent) {
+ GtkTreeIter parent;
+ if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &parent, node)) {
return false;
}
+
// if not in base level (where namedview, defs, etc go), we're mutable
- if (GTK_CTREE_ROW(GTK_CTREE_ROW(node)->parent)->parent) {
+ GtkTreeIter child;
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &child, &parent)) {
return true;
}
Inkscape::XML::Node *repr;
- repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
+ repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(tree), node);
g_assert(repr);
// don't let "defs" or "namedview" disappear
@@ -732,7 +727,7 @@ void XmlTree::on_tree_unselect_row_hide()
void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data)
{
- XmlTree *self = (XmlTree *)data;
+ XmlTree *self = static_cast<XmlTree *>(data);
GtkTreeIter iter;
GtkTreeModel *model;
@@ -747,37 +742,50 @@ void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data)
return;
}
- self->attr_value.grab_focus ();
-
- self->xml_attribute_delete_button.set_sensitive(true);
-
- const gchar *name;
- const gchar *value;
- gint attr;
- gtk_tree_model_get (model, &iter, 0, &name, 1, &value, 2, &attr, -1);
+ gchar *name = 0;
+ gchar *value = 0;
+ guint attr = 0;
+ gtk_tree_model_get (model, &iter, ATTR_COL_NAME, &name, ATTR_COL_VALUE, &value, ATTR_COL_ATTR, &attr, -1);
self->attr_name.set_text(name);
self->attr_value.get_buffer()->set_text(value);
- self->selected_attr = attr;
+ self->attr_value.grab_focus ();
+ self->xml_attribute_delete_button.set_sensitive(true);
+
+ self->selected_attr = attr;
self->attr_reset_context(self->selected_attr);
+ if (name) {
+ g_free(name);
+ }
+
+ if (value) {
+ g_free(value);
+ }
}
-void XmlTree::on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * name, gpointer data)
+void XmlTree::on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * name, gpointer /*data*/)
{
// Reselect the selected row if the data changes to refresh the attribute and value edit boxes.
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
GtkTreeIter iter;
GtkTreeModel *model;
- const gchar *attr_name;
+ gchar *attr_name = 0;
if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
gtk_tree_model_get (model, &iter, 0, &attr_name, -1);
- if (!strcmp(name, attr_name)) {
- gtk_tree_selection_unselect_all(selection);
- gtk_tree_selection_select_iter(selection, &iter);
+ if (gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter) ) {
+ if (!strcmp(name, attr_name)) {
+ gtk_tree_selection_unselect_all(selection);
+ gtk_tree_selection_select_iter(selection, &iter);
+ }
}
}
+
+ if (attr_name) {
+ g_free(attr_name);
+ attr_name = 0;
+ }
}
void XmlTree::on_attr_unselect_row_clear_text()
@@ -821,7 +829,7 @@ void XmlTree::on_document_replaced(SPDesktop *dt, SPDocument *doc)
set_tree_document(doc);
}
-void XmlTree::on_document_uri_set(gchar const */*uri*/, SPDocument *document)
+void XmlTree::on_document_uri_set(gchar const * /*uri*/, SPDocument * /*document*/)
{
/*
* Seems to be no way to set the title on a docked dialog
@@ -836,7 +844,7 @@ void XmlTree::on_document_uri_set(gchar const */*uri*/, SPDocument *document)
gboolean XmlTree::quit_on_esc (GtkWidget *w, GdkEventKey *event, GObject */*tbl*/)
{
switch (get_group0_keyval (event)) {
- case GDK_Escape: // defocus
+ case GDK_KEY_Escape: // defocus
gtk_widget_destroy(w);
return TRUE;
}
@@ -899,7 +907,7 @@ void XmlTree::cmd_new_element_node()
gchar *new_name = g_strdup(name_entry->get_text().c_str());
- if (selected_repr != NULL && new_name) {
+ if (new_name) {
Inkscape::XML::Document *xml_doc = current_document->getReprDoc();
Inkscape::XML::Node *new_repr;
new_repr = xml_doc->createElement(new_name);
@@ -946,10 +954,13 @@ void XmlTree::cmd_duplicate_node()
DocumentUndo::done(current_document, SP_VERB_DIALOG_XML_EDITOR,
_("Duplicate node"));
- GtkCTreeNode *node = sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), dup);
+ GtkTreeIter node;
+
+ if (sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), dup, &node)) {
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_selection_select_iter(selection, &node);
+ } else {
- if (node) {
- gtk_ctree_select(GTK_CTREE(tree), node);
}
}
diff --git a/src/ui/dialog/xml-tree.h b/src/ui/dialog/xml-tree.h
index bf43f5ae8..ee1dadc14 100644
--- a/src/ui/dialog/xml-tree.h
+++ b/src/ui/dialog/xml-tree.h
@@ -83,7 +83,7 @@ private:
/**
* Is the selected tree node editable
*/
- gboolean xml_tree_node_mutable(GtkCTreeNode *node);
+ gboolean xml_tree_node_mutable(GtkTreeIter *node);
/**
* Callback to close the add dialog on Escape key
@@ -113,17 +113,12 @@ private:
/**
* Callback for a node in the tree being selected
*/
- static void on_tree_select_row(GtkCTree *tree, GtkCTreeNode *node, gint column, gpointer data);
-
- /**
- * Callback when no node in the tree is selected
- */
- static void on_tree_unselect_row(GtkCTree *tree, GtkCTreeNode *node, gint column, gpointer data);
+ static void on_tree_select_row(GtkTreeSelection *selection, gpointer data);
/**
* Callback when a node is moved in the tree
*/
- static void after_tree_move(GtkCTree *tree, GtkCTreeNode *node, GtkCTreeNode *new_parent, GtkCTreeNode *new_sibling, gpointer data);
+ static void after_tree_move(SPXMLViewTree *attributes, gpointer value, gpointer data);
/**
* Callback for when attribute selection changes
@@ -138,7 +133,7 @@ private:
/**
* Enable widgets based on current selections
*/
- void on_tree_select_row_enable(GtkCTreeNode *node);
+ void on_tree_select_row_enable(GtkTreeIter *node);
void on_tree_unselect_row_disable();
void on_tree_unselect_row_hide();
void on_attr_unselect_row_disable();
diff --git a/src/ui/previewfillable.h b/src/ui/previewfillable.h
index 07fbc4fc5..d5f609a0b 100644
--- a/src/ui/previewfillable.h
+++ b/src/ui/previewfillable.h
@@ -15,6 +15,7 @@
#include "previewable.h"
#include "../widgets/eek-preview.h"
+#include "enums.h"
namespace Inkscape {
namespace UI {
@@ -28,7 +29,7 @@ public:
virtual void freezeUpdates() = 0;
virtual void thawUpdates() = 0;
virtual void setStyle( ::PreviewSize size, ViewType type, guint ratio) = 0;
- virtual void setOrientation( Gtk::AnchorType how ) = 0;
+ virtual void setOrientation(SPAnchorType how) = 0;
virtual ::PreviewSize getPreviewSize() const = 0;
virtual ViewType getPreviewType() const = 0;
virtual guint getPreviewRatio() const = 0;
diff --git a/src/ui/previewholder.cpp b/src/ui/previewholder.cpp
index 9e69778b7..d8f1a21a9 100644
--- a/src/ui/previewholder.cpp
+++ b/src/ui/previewholder.cpp
@@ -34,7 +34,7 @@ PreviewHolder::PreviewHolder() :
_insides(0),
_prefCols(0),
_updatesFrozen(false),
- _anchor(Gtk::ANCHOR_CENTER),
+ _anchor(SP_ANCHOR_CENTER),
_baseSize(PREVIEW_SIZE_SMALL),
_ratio(100),
_view(VIEW_TYPE_LIST),
@@ -63,7 +63,7 @@ void PreviewHolder::clear()
items.clear();
_prefCols = 0;
// Kludge to restore scrollbars
- if ( !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == Gtk::ANCHOR_NORTH || _anchor == Gtk::ANCHOR_SOUTH) ) {
+ if ( !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == SP_ANCHOR_NORTH || _anchor == SP_ANCHOR_SOUTH) ) {
dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
}
rebuildUI();
@@ -136,29 +136,29 @@ void PreviewHolder::setStyle( ::PreviewSize size, ViewType view, guint ratio )
_view = view;
_ratio = ratio;
// Kludge to restore scrollbars
- if ( !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == Gtk::ANCHOR_NORTH || _anchor == Gtk::ANCHOR_SOUTH) ) {
+ if ( !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == SP_ANCHOR_NORTH || _anchor == SP_ANCHOR_SOUTH) ) {
dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_NEVER );
}
rebuildUI();
}
}
-void PreviewHolder::setOrientation( Gtk::AnchorType how )
+void PreviewHolder::setOrientation(SPAnchorType how)
{
if ( _anchor != how )
{
_anchor = how;
switch ( _anchor )
{
- case Gtk::ANCHOR_NORTH:
- case Gtk::ANCHOR_SOUTH:
+ case SP_ANCHOR_NORTH:
+ case SP_ANCHOR_SOUTH:
{
dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, _wrap ? Gtk::POLICY_AUTOMATIC : Gtk::POLICY_NEVER );
}
break;
- case Gtk::ANCHOR_EAST:
- case Gtk::ANCHOR_WEST:
+ case SP_ANCHOR_EAST:
+ case SP_ANCHOR_WEST:
{
dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC );
}
@@ -179,8 +179,8 @@ void PreviewHolder::setWrap( bool b )
_wrap = b;
switch ( _anchor )
{
- case Gtk::ANCHOR_NORTH:
- case Gtk::ANCHOR_SOUTH:
+ case SP_ANCHOR_NORTH:
+ case SP_ANCHOR_SOUTH:
{
dynamic_cast<Gtk::ScrolledWindow*>(_scroller)->set_policy( Gtk::POLICY_AUTOMATIC, _wrap ? Gtk::POLICY_AUTOMATIC : Gtk::POLICY_NEVER );
}
@@ -206,7 +206,7 @@ void PreviewHolder::on_size_allocate( Gtk::Allocation& allocation )
// g_message(" anchor:%d", _anchor);
Gtk::VBox::on_size_allocate( allocation );
- if ( _insides && !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == Gtk::ANCHOR_NORTH || _anchor == Gtk::ANCHOR_SOUTH) ) {
+ if ( _insides && !_wrap && (_view != VIEW_TYPE_LIST) && (_anchor == SP_ANCHOR_NORTH || _anchor == SP_ANCHOR_SOUTH) ) {
Gtk::Requisition req = _insides->size_request();
gint delta = allocation.get_width() - req.width;
@@ -232,7 +232,7 @@ void PreviewHolder::calcGridSize( const Gtk::Widget* thing, int itemCount, int&
width = itemCount;
height = 1;
- if ( _anchor == Gtk::ANCHOR_SOUTH || _anchor == Gtk::ANCHOR_NORTH ) {
+ if ( _anchor == SP_ANCHOR_SOUTH || _anchor == SP_ANCHOR_NORTH ) {
Gtk::Requisition req = _scroller->size_request();
int currW = _scroller->get_width();
if ( currW > req.width ) {
diff --git a/src/ui/previewholder.h b/src/ui/previewholder.h
index c396cef19..5a0dfc267 100644
--- a/src/ui/previewholder.h
+++ b/src/ui/previewholder.h
@@ -18,6 +18,7 @@
#include <gtkmm/table.h>
#include "previewfillable.h"
#include "../widgets/eek-preview.h"
+#include "enums.h"
namespace Inkscape {
namespace UI {
@@ -33,7 +34,7 @@ public:
virtual void freezeUpdates();
virtual void thawUpdates();
virtual void setStyle( ::PreviewSize size, ViewType view, guint ratio );
- virtual void setOrientation( Gtk::AnchorType how );
+ virtual void setOrientation(SPAnchorType how);
virtual int getColumnPref() const { return _prefCols; }
virtual void setColumnPref( int cols );
virtual ::PreviewSize getPreviewSize() const { return _baseSize; }
@@ -56,7 +57,7 @@ private:
Gtk::Table *_insides;
int _prefCols;
bool _updatesFrozen;
- Gtk::AnchorType _anchor;
+ SPAnchorType _anchor;
::PreviewSize _baseSize;
guint _ratio;
ViewType _view;
diff --git a/src/ui/tool/control-point-selection.cpp b/src/ui/tool/control-point-selection.cpp
index b39a78979..e4899691a 100644
--- a/src/ui/tool/control-point-selection.cpp
+++ b/src/ui/tool/control-point-selection.cpp
@@ -21,6 +21,109 @@
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_b 0x062
+#define GDK_KEY_B 0x042
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_h 0x068
+#define GDK_KEY_H 0x048
+#define GDK_KEY_i 0x069
+#define GDK_KEY_I 0x049
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_k 0x06b
+#define GDK_KEY_K 0x04b
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_v 0x076
+#define GDK_KEY_V 0x056
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_KP_Space 0xff80
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#define GDK_KEY_KP_Add 0xffab
+#define GDK_KEY_KP_Subtract 0xffad
+#endif
+
namespace Inkscape {
namespace UI {
@@ -579,7 +682,7 @@ void ControlPointSelection::_commitHandlesTransform(CommitEvent ce)
signal_commit.emit(ce);
}
-bool ControlPointSelection::event(SPEventContext *event_context, GdkEvent *event)
+bool ControlPointSelection::event(SPEventContext * /*event_context*/, GdkEvent *event)
{
// implement generic event handling that should apply for all control point selections here;
// for example, keyboard moves and transformations. This way this functionality doesn't need
@@ -593,43 +696,43 @@ bool ControlPointSelection::event(SPEventContext *event_context, GdkEvent *event
switch(shortcut_key(event->key)) {
// moves
- case GDK_Up:
- case GDK_KP_Up:
- case GDK_KP_8:
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_8:
return _keyboardMove(event->key, Geom::Point(0, 1));
- case GDK_Down:
- case GDK_KP_Down:
- case GDK_KP_2:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ case GDK_KEY_KP_2:
return _keyboardMove(event->key, Geom::Point(0, -1));
- case GDK_Right:
- case GDK_KP_Right:
- case GDK_KP_6:
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
+ case GDK_KEY_KP_6:
return _keyboardMove(event->key, Geom::Point(1, 0));
- case GDK_Left:
- case GDK_KP_Left:
- case GDK_KP_4:
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
+ case GDK_KEY_KP_4:
return _keyboardMove(event->key, Geom::Point(-1, 0));
// rotates
- case GDK_bracketleft:
+ case GDK_KEY_bracketleft:
return _keyboardRotate(event->key, 1);
- case GDK_bracketright:
+ case GDK_KEY_bracketright:
return _keyboardRotate(event->key, -1);
// scaling
- case GDK_less:
- case GDK_comma:
+ case GDK_KEY_less:
+ case GDK_KEY_comma:
return _keyboardScale(event->key, -1);
- case GDK_greater:
- case GDK_period:
+ case GDK_KEY_greater:
+ case GDK_KEY_period:
return _keyboardScale(event->key, 1);
// TODO: skewing
// flipping
// NOTE: H is horizontal flip, while Shift+H switches transform handle mode!
- case GDK_h:
- case GDK_H:
+ case GDK_KEY_h:
+ case GDK_KEY_H:
if (held_shift(event->key)) {
toggleTransformHandlesMode();
return true;
@@ -637,8 +740,8 @@ bool ControlPointSelection::event(SPEventContext *event_context, GdkEvent *event
// any modifiers except shift should cause no action
if (held_any_modifiers(event->key)) break;
return _keyboardFlip(Geom::X);
- case GDK_v:
- case GDK_V:
+ case GDK_KEY_v:
+ case GDK_KEY_V:
if (held_any_modifiers(event->key)) break;
return _keyboardFlip(Geom::Y);
default: break;
diff --git a/src/ui/tool/control-point.cpp b/src/ui/tool/control-point.cpp
index 8525e92f4..15af21777 100644
--- a/src/ui/tool/control-point.cpp
+++ b/src/ui/tool/control-point.cpp
@@ -27,6 +27,12 @@
#include "ui/tool/event-utils.h"
#include "ui/tool/transform-handle-set.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#endif
+
namespace Inkscape {
namespace UI {
@@ -132,7 +138,7 @@ ControlPoint::ColorSet invisible_cset = {
* @param group The canvas group the point's canvas item should be created in
*/
ControlPoint::ControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
- Gtk::AnchorType anchor, SPCtrlShapeType shape,
+ SPAnchorType anchor, SPCtrlShapeType shape,
unsigned int size, ColorSet *cset, SPCanvasGroup *group)
: _desktop (d)
, _canvas_item (NULL)
@@ -142,7 +148,7 @@ ControlPoint::ControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
{
_canvas_item = sp_canvas_item_new(
group ? group : sp_desktop_controls (_desktop), SP_TYPE_CTRL,
- "anchor", (GtkAnchorType) anchor, "size", (gdouble) size, "shape", shape,
+ "anchor", (SPAnchorType) anchor, "size", (gdouble) size, "shape", shape,
"filled", TRUE, "fill_color", _cset->normal.fill,
"stroked", TRUE, "stroke_color", _cset->normal.stroke,
"mode", SP_CTRL_MODE_XOR, NULL);
@@ -160,7 +166,7 @@ ControlPoint::ControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
* @param group The canvas group the point's canvas item should be created in
*/
ControlPoint::ControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
- Gtk::AnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pixbuf,
+ SPAnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pixbuf,
ColorSet *cset, SPCanvasGroup *group)
: _desktop (d)
, _canvas_item (NULL)
@@ -169,7 +175,7 @@ ControlPoint::ControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
{
_canvas_item = sp_canvas_item_new(
group ? group : sp_desktop_controls(_desktop), SP_TYPE_CTRL,
- "anchor", (GtkAnchorType) anchor, "size", (gdouble) pixbuf->get_width(),
+ "anchor", (SPAnchorType) anchor, "size", (gdouble) pixbuf->get_width(),
"shape", SP_CTRL_SHAPE_BITMAP, "pixbuf", pixbuf->gobj(),
"filled", TRUE, "fill_color", _cset->normal.fill,
"stroked", TRUE, "stroke_color", _cset->normal.stroke,
@@ -262,9 +268,9 @@ SPCtrlShapeType ControlPoint::_shape() const
return ret;
}
-GtkAnchorType ControlPoint::_anchor() const
+SPAnchorType ControlPoint::_anchor() const
{
- GtkAnchorType ret;
+ SPAnchorType ret;
g_object_get(_canvas_item, "anchor", &ret, NULL);
return ret;
}
@@ -288,7 +294,7 @@ void ControlPoint::_setShape(SPCtrlShapeType shape)
g_object_set(_canvas_item, "shape", shape, NULL);
}
-void ControlPoint::_setAnchor(GtkAnchorType anchor)
+void ControlPoint::_setAnchor(SPAnchorType anchor)
{
g_object_set(_canvas_item, "anchor", anchor, NULL);
}
@@ -440,7 +446,7 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
case GDK_KEY_PRESS:
switch (get_group0_keyval(&event->key))
{
- case GDK_Escape: {
+ case GDK_KEY_Escape: {
// ignore Escape if this is not a drag
if (!_drag_initiated) break;
@@ -480,7 +486,7 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
ungrabbed(NULL); // ungrabbed handlers can handle a NULL event
snapprefs.setSnapEnabledGlobally(snap_save);
} return true;
- case GDK_Tab:
+ case GDK_KEY_Tab:
{// Downcast from ControlPoint to TransformHandle, if possible
// This is an ugly hack; we should have the transform handle intercept the keystrokes itself
TransformHandle *th = dynamic_cast<TransformHandle*>(this);
@@ -490,7 +496,7 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
}
break;
}
- case GDK_ISO_Left_Tab:
+ case GDK_KEY_ISO_Left_Tab:
{// Downcast from ControlPoint to TransformHandle, if possible
// This is an ugly hack; we should have the transform handle intercept the keystrokes itself
TransformHandle *th = dynamic_cast<TransformHandle*>(this);
diff --git a/src/ui/tool/control-point.h b/src/ui/tool/control-point.h
index f37ff1451..8d1b778a7 100644
--- a/src/ui/tool/control-point.h
+++ b/src/ui/tool/control-point.h
@@ -19,8 +19,7 @@
#include <2geom/point.h>
#include "util/accumulators.h"
#include "display/sodipodi-ctrl.h"
-
-#include <gtkmm/enums.h>
+#include "enums.h"
class SPDesktop;
class SPEventContext;
@@ -97,9 +96,9 @@ public:
virtual bool _eventHandler(SPEventContext *event_context, GdkEvent *event);
protected:
- ControlPoint(SPDesktop *d, Geom::Point const &initial_pos, Gtk::AnchorType anchor,
+ ControlPoint(SPDesktop *d, Geom::Point const &initial_pos, SPAnchorType anchor,
SPCtrlShapeType shape, unsigned int size, ColorSet *cset = 0, SPCanvasGroup *group = 0);
- ControlPoint(SPDesktop *d, Geom::Point const &initial_pos, Gtk::AnchorType anchor,
+ ControlPoint(SPDesktop *d, Geom::Point const &initial_pos, SPAnchorType anchor,
Glib::RefPtr<Gdk::Pixbuf> pixbuf, ColorSet *cset = 0, SPCanvasGroup *group = 0);
/// @name Handle control point events in subclasses
@@ -142,12 +141,12 @@ protected:
unsigned int _size() const;
SPCtrlShapeType _shape() const;
- GtkAnchorType _anchor() const;
+ SPAnchorType _anchor() const;
Glib::RefPtr<Gdk::Pixbuf> _pixbuf();
void _setSize(unsigned int size);
void _setShape(SPCtrlShapeType shape);
- void _setAnchor(GtkAnchorType anchor);
+ void _setAnchor(SPAnchorType anchor);
void _setPixbuf(Glib::RefPtr<Gdk::Pixbuf>);
/// @}
diff --git a/src/ui/tool/curve-drag-point.cpp b/src/ui/tool/curve-drag-point.cpp
index e932c022d..8754681df 100644
--- a/src/ui/tool/curve-drag-point.cpp
+++ b/src/ui/tool/curve-drag-point.cpp
@@ -38,7 +38,7 @@ bool CurveDragPoint::_segment_was_degenerate = false;
CurveDragPoint::CurveDragPoint(PathManipulator &pm)
: ControlPoint(pm._multi_path_manipulator._path_data.node_data.desktop, Geom::Point(),
- Gtk::ANCHOR_CENTER, SP_CTRL_SHAPE_CIRCLE, 1.0, &invisible_cset,
+ SP_ANCHOR_CENTER, SP_CTRL_SHAPE_CIRCLE, 1.0, &invisible_cset,
pm._multi_path_manipulator._path_data.dragpoint_group)
, _pm(pm)
{
diff --git a/src/ui/tool/event-utils.cpp b/src/ui/tool/event-utils.cpp
index f71f0ab12..9d4b3e8e7 100644
--- a/src/ui/tool/event-utils.cpp
+++ b/src/ui/tool/event-utils.cpp
@@ -14,6 +14,72 @@
#include "display/sp-canvas.h"
#include "ui/tool/event-utils.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
+
namespace Inkscape {
namespace UI {
@@ -107,16 +173,16 @@ unsigned state_after_event(GdkEvent *event)
case GDK_KEY_PRESS:
state = event->key.state;
switch(shortcut_key(event->key)) {
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
state |= GDK_SHIFT_MASK;
break;
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
state |= GDK_CONTROL_MASK;
break;
- case GDK_Alt_L:
- case GDK_Alt_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
state |= GDK_MOD1_MASK;
break;
default: break;
@@ -125,16 +191,16 @@ unsigned state_after_event(GdkEvent *event)
case GDK_KEY_RELEASE:
state = event->key.state;
switch(shortcut_key(event->key)) {
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
state &= ~GDK_SHIFT_MASK;
break;
- case GDK_Control_L:
- case GDK_Control_R:
+ case GDK_KEY_Control_L:
+ case GDK_KEY_Control_R:
state &= ~GDK_CONTROL_MASK;
break;
- case GDK_Alt_L:
- case GDK_Alt_R:
+ case GDK_KEY_Alt_L:
+ case GDK_KEY_Alt_R:
state &= ~GDK_MOD1_MASK;
break;
default: break;
diff --git a/src/ui/tool/modifier-tracker.cpp b/src/ui/tool/modifier-tracker.cpp
index bbef0d469..ea247d4fb 100644
--- a/src/ui/tool/modifier-tracker.cpp
+++ b/src/ui/tool/modifier-tracker.cpp
@@ -12,6 +12,73 @@
#include <gdk/gdkkeysyms.h>
#include "ui/tool/event-utils.h"
#include "ui/tool/modifier-tracker.h"
+#include <gtk/gtk.h>
+
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#endif
namespace Inkscape {
namespace UI {
@@ -30,44 +97,44 @@ bool ModifierTracker::event(GdkEvent *event)
switch (event->type) {
case GDK_KEY_PRESS:
switch (shortcut_key(event->key)) {
- case GDK_Shift_L:
+ case GDK_KEY_Shift_L:
_left_shift = true;
break;
- case GDK_Shift_R:
+ case GDK_KEY_Shift_R:
_right_shift = true;
break;
- case GDK_Control_L:
+ case GDK_KEY_Control_L:
_left_ctrl = true;
break;
- case GDK_Control_R:
+ case GDK_KEY_Control_R:
_right_ctrl = true;
break;
- case GDK_Alt_L:
+ case GDK_KEY_Alt_L:
_left_alt = true;
break;
- case GDK_Alt_R:
+ case GDK_KEY_Alt_R:
_right_alt = true;
break;
}
break;
case GDK_KEY_RELEASE:
switch (shortcut_key(event->key)) {
- case GDK_Shift_L:
+ case GDK_KEY_Shift_L:
_left_shift = false;
break;
- case GDK_Shift_R:
+ case GDK_KEY_Shift_R:
_right_shift = false;
break;
- case GDK_Control_L:
+ case GDK_KEY_Control_L:
_left_ctrl = false;
break;
- case GDK_Control_R:
+ case GDK_KEY_Control_R:
_right_ctrl = false;
break;
- case GDK_Alt_L:
+ case GDK_KEY_Alt_L:
_left_alt = false;
break;
- case GDK_Alt_R:
+ case GDK_KEY_Alt_R:
_right_alt = false;
break;
}
diff --git a/src/ui/tool/multi-path-manipulator.cpp b/src/ui/tool/multi-path-manipulator.cpp
index 597a151c0..2be96afad 100644
--- a/src/ui/tool/multi-path-manipulator.cpp
+++ b/src/ui/tool/multi-path-manipulator.cpp
@@ -31,6 +31,115 @@
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Left 0xff51
+#define GDK_KEY_KP_Left 0xff96
+#define GDK_KEY_Right 0xff53
+#define GDK_KEY_KP_Right 0xff98
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#define GDK_KEY_Home 0xff50
+#define GDK_KEY_KP_Home 0xff95
+#define GDK_KEY_End 0xff57
+#define GDK_KEY_KP_End 0xff9c
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_b 0x062
+#define GDK_KEY_B 0x042
+#define GDK_KEY_c 0x063
+#define GDK_KEY_C 0x043
+#define GDK_KEY_d 0x064
+#define GDK_KEY_D 0x044
+#define GDK_KEY_g 0x067
+#define GDK_KEY_G 0x047
+#define GDK_KEY_h 0x068
+#define GDK_KEY_H 0x048
+#define GDK_KEY_i 0x069
+#define GDK_KEY_I 0x049
+#define GDK_KEY_j 0x06a
+#define GDK_KEY_J 0x04a
+#define GDK_KEY_k 0x06b
+#define GDK_KEY_K 0x04b
+#define GDK_KEY_l 0x06c
+#define GDK_KEY_L 0x04c
+#define GDK_KEY_q 0x071
+#define GDK_KEY_Q 0x051
+#define GDK_KEY_r 0x072
+#define GDK_KEY_R 0x052
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_u 0x075
+#define GDK_KEY_U 0x055
+#define GDK_KEY_v 0x076
+#define GDK_KEY_V 0x056
+#define GDK_KEY_w 0x077
+#define GDK_KEY_W 0x057
+#define GDK_KEY_x 0x078
+#define GDK_KEY_X 0x058
+#define GDK_KEY_y 0x079
+#define GDK_KEY_Y 0x059
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Control_L 0xffe3
+#define GDK_KEY_Control_R 0xffe4
+#define GDK_KEY_Alt_L 0xffe9
+#define GDK_KEY_Alt_R 0xffea
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#define GDK_KEY_Meta_L 0xffe7
+#define GDK_KEY_Meta_R 0xffe8
+#define GDK_KEY_KP_0 0xffb0
+#define GDK_KEY_KP_1 0xffb1
+#define GDK_KEY_KP_2 0xffb2
+#define GDK_KEY_KP_3 0xffb3
+#define GDK_KEY_KP_4 0xffb4
+#define GDK_KEY_KP_5 0xffb5
+#define GDK_KEY_KP_6 0xffb6
+#define GDK_KEY_KP_7 0xffb7
+#define GDK_KEY_KP_8 0xffb8
+#define GDK_KEY_KP_9 0xffb9
+#define GDK_KEY_F1 0xffbe
+#define GDK_KEY_F2 0xffbf
+#define GDK_KEY_F3 0xffc0
+#define GDK_KEY_F4 0xffc1
+#define GDK_KEY_F5 0xffc2
+#define GDK_KEY_F6 0xffc3
+#define GDK_KEY_F7 0xffc4
+#define GDK_KEY_F8 0xffc5
+#define GDK_KEY_F9 0xffc6
+#define GDK_KEY_F10 0xffc7
+#define GDK_KEY_F11 0xffc8
+#define GDK_KEY_Insert 0xff63
+#define GDK_KEY_KP_Insert 0xff9e
+#define GDK_KEY_Delete 0xffff
+#define GDK_KEY_KP_Delete 0xff9f
+#define GDK_KEY_BackSpace 0xff08
+#define GDK_KEY_Return 0xff0d
+#define GDK_KEY_KP_Enter 0xff8d
+#define GDK_KEY_space 0x020
+#define GDK_KEY_KP_Space 0xff80
+#define GDK_KEY_Tab 0xff09
+#define GDK_KEY_ISO_Left_Tab 0xfe20
+#define GDK_KEY_bracketleft 0x05b
+#define GDK_KEY_bracketright 0x05d
+#define GDK_KEY_braceleft 0x07b
+#define GDK_KEY_braceright 0x07d
+#define GDK_KEY_less 0x03c
+#define GDK_KEY_greater 0x03e
+#define GDK_KEY_comma 0x02c
+#define GDK_KEY_period 0x02e
+#define GDK_KEY_KP_Add 0xffab
+#define GDK_KEY_KP_Subtract 0xffad
+#endif
+
#ifdef USE_GNU_HASHES
namespace __gnu_cxx {
template<>
@@ -581,21 +690,21 @@ bool MultiPathManipulator::event(SPEventContext *event_context, GdkEvent *event)
switch (key) {
// single handle functions
// rotation
- case GDK_bracketleft:
- case GDK_braceleft:
+ case GDK_KEY_bracketleft:
+ case GDK_KEY_braceleft:
pm.rotateHandle(n, which, 1, one_pixel);
break;
- case GDK_bracketright:
- case GDK_braceright:
+ case GDK_KEY_bracketright:
+ case GDK_KEY_braceright:
pm.rotateHandle(n, which, -1, one_pixel);
break;
// adjust length
- case GDK_period:
- case GDK_greater:
+ case GDK_KEY_period:
+ case GDK_KEY_greater:
pm.scaleHandle(n, which, 1, one_pixel);
break;
- case GDK_comma:
- case GDK_less:
+ case GDK_KEY_comma:
+ case GDK_KEY_less:
pm.scaleHandle(n, which, -1, one_pixel);
break;
default:
@@ -611,13 +720,13 @@ bool MultiPathManipulator::event(SPEventContext *event_context, GdkEvent *event)
switch (event->type) {
case GDK_KEY_PRESS:
switch (key) {
- case GDK_Insert:
- case GDK_KP_Insert:
+ case GDK_KEY_Insert:
+ case GDK_KEY_KP_Insert:
// Insert - insert nodes in the middle of selected segments
insertNodes();
return true;
- case GDK_i:
- case GDK_I:
+ case GDK_KEY_i:
+ case GDK_KEY_I:
if (held_only_shift(event->key)) {
// Shift+I - insert nodes (alternate keybinding for Mac keyboards
// that don't have the Insert key)
@@ -625,14 +734,14 @@ bool MultiPathManipulator::event(SPEventContext *event_context, GdkEvent *event)
return true;
}
break;
- case GDK_d:
- case GDK_D:
+ case GDK_KEY_d:
+ case GDK_KEY_D:
if (held_only_shift(event->key)) {
duplicateNodes();
return true;
}
- case GDK_j:
- case GDK_J:
+ case GDK_KEY_j:
+ case GDK_KEY_J:
if (held_only_shift(event->key)) {
// Shift+J - join nodes
joinNodes();
@@ -644,17 +753,17 @@ bool MultiPathManipulator::event(SPEventContext *event_context, GdkEvent *event)
return true;
}
break;
- case GDK_b:
- case GDK_B:
+ case GDK_KEY_b:
+ case GDK_KEY_B:
if (held_only_shift(event->key)) {
// Shift+B - break nodes
breakNodes();
return true;
}
break;
- case GDK_Delete:
- case GDK_KP_Delete:
- case GDK_BackSpace:
+ case GDK_KEY_Delete:
+ case GDK_KEY_KP_Delete:
+ case GDK_KEY_BackSpace:
if (held_shift(event->key)) break;
if (held_alt(event->key)) {
// Alt+Delete - delete segments
@@ -669,55 +778,55 @@ bool MultiPathManipulator::event(SPEventContext *event_context, GdkEvent *event)
deleteNodes(del_preserves_shape ^ held_control(event->key));
}
return true;
- case GDK_c:
- case GDK_C:
+ case GDK_KEY_c:
+ case GDK_KEY_C:
if (held_only_shift(event->key)) {
// Shift+C - make nodes cusp
setNodeType(NODE_CUSP);
return true;
}
break;
- case GDK_s:
- case GDK_S:
+ case GDK_KEY_s:
+ case GDK_KEY_S:
if (held_only_shift(event->key)) {
// Shift+S - make nodes smooth
setNodeType(NODE_SMOOTH);
return true;
}
break;
- case GDK_a:
- case GDK_A:
+ case GDK_KEY_a:
+ case GDK_KEY_A:
if (held_only_shift(event->key)) {
// Shift+A - make nodes auto-smooth
setNodeType(NODE_AUTO);
return true;
}
break;
- case GDK_y:
- case GDK_Y:
+ case GDK_KEY_y:
+ case GDK_KEY_Y:
if (held_only_shift(event->key)) {
// Shift+Y - make nodes symmetric
setNodeType(NODE_SYMMETRIC);
return true;
}
break;
- case GDK_r:
- case GDK_R:
+ case GDK_KEY_r:
+ case GDK_KEY_R:
if (held_only_shift(event->key)) {
// Shift+R - reverse subpaths
reverseSubpaths();
return true;
}
break;
- case GDK_l:
- case GDK_L:
+ case GDK_KEY_l:
+ case GDK_KEY_L:
if (held_only_shift(event->key)) {
// Shift+L - make segments linear
setSegmentType(SEGMENT_STRAIGHT);
return true;
}
- case GDK_u:
- case GDK_U:
+ case GDK_KEY_u:
+ case GDK_KEY_U:
if (held_only_shift(event->key)) {
// Shift+L - make segments curves
setSegmentType(SEGMENT_CUBIC_BEZIER);
diff --git a/src/ui/tool/node-tool.cpp b/src/ui/tool/node-tool.cpp
index 3c1e7de71..95cf7aebb 100644
--- a/src/ui/tool/node-tool.cpp
+++ b/src/ui/tool/node-tool.cpp
@@ -43,6 +43,14 @@
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_a 0x061
+#define GDK_KEY_A 0x041
+#define GDK_KEY_h 0x068
+#define GDK_KEY_H 0x048
+#endif
+
/** @struct InkNodeTool
*
* Node tool event context.
@@ -503,7 +511,7 @@ gint ink_node_tool_root_handler(SPEventContext *event_context, GdkEvent *event)
case GDK_KEY_PRESS:
switch (get_group0_keyval(&event->key))
{
- case GDK_Escape: // deselect everything
+ case GDK_KEY_Escape: // deselect everything
if (nt->_selected_nodes->empty()) {
selection->clear();
} else {
@@ -511,8 +519,8 @@ gint ink_node_tool_root_handler(SPEventContext *event_context, GdkEvent *event)
}
ink_node_tool_update_tip(nt, event);
return TRUE;
- case GDK_a:
- case GDK_A:
+ case GDK_KEY_a:
+ case GDK_KEY_A:
if (held_control(event->key) && held_alt(event->key)) {
nt->_selected_nodes->selectAll();
// Ctrl+A is handled in selection-chemistry.cpp via verb
@@ -520,8 +528,8 @@ gint ink_node_tool_root_handler(SPEventContext *event_context, GdkEvent *event)
return TRUE;
}
break;
- case GDK_h:
- case GDK_H:
+ case GDK_KEY_h:
+ case GDK_KEY_H:
if (held_only_control(event->key)) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setBool("/tools/nodes/show_handles", !nt->show_handles);
diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp
index 8e39ec05a..1d3acb4a5 100644
--- a/src/ui/tool/node.cpp
+++ b/src/ui/tool/node.cpp
@@ -33,6 +33,15 @@
#include "ui/tool/path-manipulator.h"
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_s 0x073
+#define GDK_KEY_S 0x053
+#define GDK_KEY_Page_Up 0xff55
+#define GDK_KEY_KP_Page_Up 0xff9a
+#define GDK_KEY_Page_Down 0xff56
+#define GDK_KEY_KP_Page_Down 0xff9b
+#endif
+
namespace Inkscape {
namespace UI {
@@ -81,7 +90,7 @@ double Handle::_saved_length = 0.0;
bool Handle::_drag_out = false;
Handle::Handle(NodeSharedData const &data, Geom::Point const &initial_pos, Node *parent)
- : ControlPoint(data.desktop, initial_pos, Gtk::ANCHOR_CENTER, SP_CTRL_SHAPE_CIRCLE, 7.0,
+ : ControlPoint(data.desktop, initial_pos, SP_ANCHOR_CENTER, SP_CTRL_SHAPE_CIRCLE, 7.0,
&handle_colors, data.handle_group)
, _parent(parent)
, _degenerate(true)
@@ -232,8 +241,8 @@ bool Handle::_eventHandler(SPEventContext *event_context, GdkEvent *event)
case GDK_KEY_PRESS:
switch (shortcut_key(event->key))
{
- case GDK_s:
- case GDK_S:
+ case GDK_KEY_s:
+ case GDK_KEY_S:
if (held_only_shift(event->key) && _parent->_type == NODE_CUSP) {
// when Shift+S is pressed when hovering over a handle belonging to a cusp node,
// hold this handle in place; otherwise process normally
@@ -473,7 +482,7 @@ Glib::ustring Handle::_getDragTip(GdkEventMotion */*event*/)
* The method move() keeps node type invariants during translations.
*/
Node::Node(NodeSharedData const &data, Geom::Point const &initial_pos)
- : SelectableControlPoint(data.desktop, initial_pos, Gtk::ANCHOR_CENTER,
+ : SelectableControlPoint(data.desktop, initial_pos, SP_ANCHOR_CENTER,
SP_CTRL_SHAPE_DIAMOND, 9.0, *data.selection, &node_colors, data.node_group)
, _front(data, initial_pos, this)
, _back(data, initial_pos, this)
@@ -803,10 +812,10 @@ bool Node::_eventHandler(SPEventContext *event_context, GdkEvent *event)
case GDK_KEY_PRESS:
switch (shortcut_key(event->key))
{
- case GDK_Page_Up:
+ case GDK_KEY_Page_Up:
dir = 1;
break;
- case GDK_Page_Down:
+ case GDK_KEY_Page_Down:
dir = -1;
break;
default: goto bail_out;
diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp
index cded702b4..97e25069f 100644
--- a/src/ui/tool/path-manipulator.cpp
+++ b/src/ui/tool/path-manipulator.cpp
@@ -158,7 +158,7 @@ PathManipulator::~PathManipulator()
}
/** Handle motion events to update the position of the curve drag point. */
-bool PathManipulator::event(SPEventContext *event_context, GdkEvent *event)
+bool PathManipulator::event(SPEventContext * /*event_context*/, GdkEvent *event)
{
if (empty()) return false;
diff --git a/src/ui/tool/selectable-control-point.cpp b/src/ui/tool/selectable-control-point.cpp
index c92dcaaae..cec2e7b07 100644
--- a/src/ui/tool/selectable-control-point.cpp
+++ b/src/ui/tool/selectable-control-point.cpp
@@ -27,7 +27,7 @@ static SelectableControlPoint::ColorSet default_scp_color_set = {
};
SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
- Gtk::AnchorType anchor, SPCtrlShapeType shape, unsigned int size,
+ SPAnchorType anchor, SPCtrlShapeType shape, unsigned int size,
ControlPointSelection &sel, ColorSet *cset, SPCanvasGroup *group)
: ControlPoint (d, initial_pos, anchor, shape, size,
cset ? reinterpret_cast<ControlPoint::ColorSet*>(cset)
@@ -37,7 +37,7 @@ SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const &
_selection.allPoints().insert(this);
}
SelectableControlPoint::SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
- Gtk::AnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pixbuf,
+ SPAnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pixbuf,
ControlPointSelection &sel, ColorSet *cset, SPCanvasGroup *group)
: ControlPoint (d, initial_pos, anchor, pixbuf,
cset ? reinterpret_cast<ControlPoint::ColorSet*>(cset)
diff --git a/src/ui/tool/selectable-control-point.h b/src/ui/tool/selectable-control-point.h
index 9467aef74..8ecb39a79 100644
--- a/src/ui/tool/selectable-control-point.h
+++ b/src/ui/tool/selectable-control-point.h
@@ -35,11 +35,11 @@ public:
}
protected:
SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
- Gtk::AnchorType anchor, SPCtrlShapeType shape,
+ SPAnchorType anchor, SPCtrlShapeType shape,
unsigned int size, ControlPointSelection &sel, ColorSet *cset = 0,
SPCanvasGroup *group = 0);
SelectableControlPoint(SPDesktop *d, Geom::Point const &initial_pos,
- Gtk::AnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pixbuf,
+ SPAnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pixbuf,
ControlPointSelection &sel, ColorSet *cset = 0, SPCanvasGroup *group = 0);
virtual void _setState(State state);
diff --git a/src/ui/tool/selector.cpp b/src/ui/tool/selector.cpp
index 25d22ecdc..6820b7635 100644
--- a/src/ui/tool/selector.cpp
+++ b/src/ui/tool/selector.cpp
@@ -19,6 +19,10 @@
#include <gdk/gdkkeysyms.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#endif
+
namespace Inkscape {
namespace UI {
@@ -29,7 +33,7 @@ namespace UI {
class SelectorPoint : public ControlPoint {
public:
SelectorPoint(SPDesktop *d, SPCanvasGroup *group, Selector *s)
- : ControlPoint(d, Geom::Point(0,0), Gtk::ANCHOR_CENTER, SP_CTRL_SHAPE_SQUARE,
+ : ControlPoint(d, Geom::Point(0,0), SP_ANCHOR_CENTER, SP_CTRL_SHAPE_SQUARE,
1, &invisible_cset, group)
, _selector(s)
, _cancel(false)
@@ -49,7 +53,7 @@ public:
protected:
virtual bool _eventHandler(SPEventContext *event_context, GdkEvent *event) {
- if (event->type == GDK_KEY_PRESS && shortcut_key(event->key) == GDK_Escape &&
+ if (event->type == GDK_KEY_PRESS && shortcut_key(event->key) == GDK_KEY_Escape &&
sp_canvas_item_is_visible(_rubber))
{
_cancel = true;
diff --git a/src/ui/tool/transform-handle-set.cpp b/src/ui/tool/transform-handle-set.cpp
index 2cf6fe55a..b4a27170a 100644
--- a/src/ui/tool/transform-handle-set.cpp
+++ b/src/ui/tool/transform-handle-set.cpp
@@ -38,20 +38,20 @@ namespace Inkscape {
namespace UI {
namespace {
-Gtk::AnchorType corner_to_anchor(unsigned c) {
+SPAnchorType corner_to_anchor(unsigned c) {
switch (c % 4) {
- case 0: return Gtk::ANCHOR_NE;
- case 1: return Gtk::ANCHOR_NW;
- case 2: return Gtk::ANCHOR_SW;
- default: return Gtk::ANCHOR_SE;
+ case 0: return SP_ANCHOR_NE;
+ case 1: return SP_ANCHOR_NW;
+ case 2: return SP_ANCHOR_SW;
+ default: return SP_ANCHOR_SE;
}
}
-Gtk::AnchorType side_to_anchor(unsigned s) {
+SPAnchorType side_to_anchor(unsigned s) {
switch (s % 4) {
- case 0: return Gtk::ANCHOR_N;
- case 1: return Gtk::ANCHOR_W;
- case 2: return Gtk::ANCHOR_S;
- default: return Gtk::ANCHOR_E;
+ case 0: return SP_ANCHOR_N;
+ case 1: return SP_ANCHOR_W;
+ case 2: return SP_ANCHOR_S;
+ default: return SP_ANCHOR_E;
}
}
@@ -82,7 +82,7 @@ ControlPoint::ColorSet center_cset = {
} // anonymous namespace
/** Base class for node transform handles to simplify implementation */
-TransformHandle::TransformHandle(TransformHandleSet &th, Gtk::AnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pb)
+TransformHandle::TransformHandle(TransformHandleSet &th, SPAnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pb)
: ControlPoint(th._desktop, Geom::Point(), anchor, pb, &thandle_cset,
th._transform_handle_group)
, _th(th)
@@ -180,7 +180,7 @@ void TransformHandle::ungrabbed(GdkEventButton *)
class ScaleHandle : public TransformHandle {
public:
- ScaleHandle(TransformHandleSet &th, Gtk::AnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pb)
+ ScaleHandle(TransformHandleSet &th, SPAnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pb)
: TransformHandle(th, anchor, pb)
{}
protected:
@@ -603,7 +603,7 @@ double SkewHandle::_last_angle = 0;
class RotationCenter : public ControlPoint {
public:
RotationCenter(TransformHandleSet &th)
- : ControlPoint(th._desktop, Geom::Point(), Gtk::ANCHOR_CENTER, _get_pixbuf(),
+ : ControlPoint(th._desktop, Geom::Point(), SP_ANCHOR_CENTER, _get_pixbuf(),
&center_cset, th._transform_handle_group)
, _th(th)
{
diff --git a/src/ui/tool/transform-handle-set.h b/src/ui/tool/transform-handle-set.h
index f5f208e6f..cd1a61da2 100644
--- a/src/ui/tool/transform-handle-set.h
+++ b/src/ui/tool/transform-handle-set.h
@@ -16,6 +16,7 @@
#include <2geom/forward.h>
#include "ui/tool/commit-events.h"
#include "ui/tool/manipulator.h"
+#include "enums.h"
class SPDesktop;
class CtrlRect;
@@ -81,7 +82,7 @@ private:
/** Base class for node transform handles to simplify implementation */
class TransformHandle : public ControlPoint {
public:
- TransformHandle(TransformHandleSet &th, Gtk::AnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pb);
+ TransformHandle(TransformHandleSet &th, SPAnchorType anchor, Glib::RefPtr<Gdk::Pixbuf> pb);
void getNextClosestPoint(bool reverse);
protected:
diff --git a/src/ui/widget/dock-item.h b/src/ui/widget/dock-item.h
index 75ffea1a0..608badb62 100644
--- a/src/ui/widget/dock-item.h
+++ b/src/ui/widget/dock-item.h
@@ -15,7 +15,11 @@
#include <gtkmm/frame.h>
#include <gtkmm/window.h>
+#if WITH_EXT_GDL
+#include <gdl/gdl.h>
+#else
#include "libgdl/gdl.h"
+#endif
namespace Gtk {
class HButtonBox;
diff --git a/src/ui/widget/panel.cpp b/src/ui/widget/panel.cpp
index 0989c7d0d..45c4e5f07 100644
--- a/src/ui/widget/panel.cpp
+++ b/src/ui/widget/panel.cpp
@@ -88,7 +88,7 @@ void Panel::_popper(GdkEventButton* event)
void Panel::_init()
{
Glib::ustring tmp("<");
- _anchor = Gtk::ANCHOR_CENTER;
+ _anchor = SP_ANCHOR_CENTER;
guint panel_size = 0, panel_mode = 0, panel_ratio = 100;
bool panel_wrap = 0;
@@ -269,13 +269,13 @@ void Panel::setLabel(Glib::ustring const &label)
_tab_title.set_label(_label);
}
-void Panel::setOrientation(Gtk::AnchorType how)
+void Panel::setOrientation(SPAnchorType how)
{
if (_anchor != how) {
_anchor = how;
switch (_anchor) {
- case Gtk::ANCHOR_NORTH:
- case Gtk::ANCHOR_SOUTH:
+ case SP_ANCHOR_NORTH:
+ case SP_ANCHOR_SOUTH:
{
if (_menu_desired) {
_menu_popper.reference();
diff --git a/src/ui/widget/panel.h b/src/ui/widget/panel.h
index c1942ef05..2d92d65c9 100644
--- a/src/ui/widget/panel.h
+++ b/src/ui/widget/panel.h
@@ -18,8 +18,9 @@
#include <gtkmm/button.h>
#include <gtkmm/eventbox.h>
#include <gtkmm/label.h>
-
+#include "enums.h"
#include <vector>
+#include <map>
class SPDesktop;
class SPDocument;
@@ -80,7 +81,7 @@ public:
int const &getVerb() const;
Glib::ustring const &getApplyLabel() const;
- virtual void setOrientation(Gtk::AnchorType how);
+ virtual void setOrientation(SPAnchorType how);
virtual void present(); //< request to be present
@@ -126,7 +127,7 @@ protected:
*/
Glib::ustring const _prefs_path;
bool _menu_desired;
- Gtk::AnchorType _anchor;
+ SPAnchorType _anchor;
/* Signals */
sigc::signal<void, int> _signal_response;
diff --git a/src/ui/widget/registered-widget.h b/src/ui/widget/registered-widget.h
index 52a44114d..2a7843a51 100644
--- a/src/ui/widget/registered-widget.h
+++ b/src/ui/widget/registered-widget.h
@@ -12,11 +12,11 @@
#ifndef INKSCAPE_UI_WIDGET_REGISTERED_WIDGET__H_
#define INKSCAPE_UI_WIDGET_REGISTERED_WIDGET__H_
+#include "ui/widget/scalar.h"
#include <2geom/affine.h>
#include "xml/node.h"
#include "registry.h"
-#include "ui/widget/scalar.h"
#include "ui/widget/scalar-unit.h"
#include "ui/widget/point.h"
#include "ui/widget/text.h"
@@ -30,6 +30,8 @@
#include "desktop-handles.h"
#include "sp-namedview.h"
+#include <gtkmm/checkbutton.h>
+
class SPUnit;
class SPDocument;
diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp
index ab7b99237..c81385dd7 100644
--- a/src/ui/widget/selected-style.cpp
+++ b/src/ui/widget/selected-style.cpp
@@ -164,10 +164,10 @@ SelectedStyle::SelectedStyle(bool /*layout*/)
_na[i].show_all();
__na[i] = (_("Nothing selected"));
- _none[i].set_markup (_("<i>None</i>"));
+ _none[i].set_markup (C_("Fill and stroke", "<i>None</i>"));
sp_set_font_size_smaller (GTK_WIDGET(_none[i].gobj()));
_none[i].show_all();
- __none[i] = (i == SS_FILL)? (_("No fill")) : (_("No stroke"));
+ __none[i] = (i == SS_FILL)? (C_("Fill and stroke", "No fill")) : (C_("Fill and stroke", "No stroke"));
_pattern[i].set_markup (_("Pattern"));
sp_set_font_size_smaller (GTK_WIDGET(_pattern[i].gobj()));
@@ -1259,7 +1259,11 @@ RotateableSwatch::do_motion(double by, guint modifier) {
g_object_unref (bitmap);
g_object_unref (mask);
gdk_window_set_cursor(gtk_widget_get_window(w), cr);
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cr);
+#else
gdk_cursor_unref(cr);
+#endif
cr_set = true;
}
}
@@ -1314,7 +1318,11 @@ RotateableSwatch::do_release(double by, guint modifier) {
GtkWidget *w = GTK_WIDGET(gobj());
gdk_window_set_cursor(gtk_widget_get_window(w), NULL);
if (cr) {
+#if GTK_CHECK_VERSION(3,0,0)
+ g_object_unref(cr);
+#else
gdk_cursor_unref (cr);
+#endif
cr = NULL;
}
cr_set = false;
diff --git a/src/ui/widget/spinbutton.cpp b/src/ui/widget/spinbutton.cpp
index 60b7856f6..8ba8d413d 100644
--- a/src/ui/widget/spinbutton.cpp
+++ b/src/ui/widget/spinbutton.cpp
@@ -17,6 +17,12 @@
#include "util/expression-evaluator.h"
#include "event-context.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_z 0x07a
+#define GDK_KEY_Z 0x05a
+#endif
+
namespace Inkscape {
namespace UI {
namespace Widget {
@@ -64,12 +70,12 @@ bool SpinButton::on_my_focus_in_event(GdkEventFocus* /*event*/)
bool SpinButton::on_my_key_press_event(GdkEventKey* event)
{
switch (get_group0_keyval (event)) {
- case GDK_Escape:
+ case GDK_KEY_Escape:
undo();
return true; // I consumed the event
break;
- case GDK_z:
- case GDK_Z:
+ case GDK_KEY_z:
+ case GDK_KEY_Z:
if (event->state & GDK_CONTROL_MASK) {
undo();
return true; // I consumed the event
diff --git a/src/ui/widget/style-swatch.cpp b/src/ui/widget/style-swatch.cpp
index 0ecf2dd5e..1ee26e803 100644
--- a/src/ui/widget/style-swatch.cpp
+++ b/src/ui/widget/style-swatch.cpp
@@ -298,9 +298,9 @@ StyleSwatch::setStyle(SPStyle *query)
place->set_tooltip_text(tip);
g_free (tip);
} else if (paint->set && paint->isNone()) {
- _value[i].set_markup(_("<i>None</i>"));
+ _value[i].set_markup(C_("Fill and stroke", "<i>None</i>"));
place->add(_value[i]);
- place->set_tooltip_text((i == SS_FILL)? (_("No fill")) : (_("No stroke")));
+ place->set_tooltip_text((i == SS_FILL)? (C_("Fill and stroke", "No fill")) : (C_("Fill and stroke", "No stroke")));
if (i == SS_STROKE) has_stroke = false;
} else if (!paint->set) {
_value[i].set_markup(_("<b>Unset</b>"));
diff --git a/src/ui/widget/zoom-status.cpp b/src/ui/widget/zoom-status.cpp
index fa8191671..579449744 100644
--- a/src/ui/widget/zoom-status.cpp
+++ b/src/ui/widget/zoom-status.cpp
@@ -106,7 +106,7 @@ ZoomStatus::on_value_changed()
double zoom_factor = pow(2, get_value());
Geom::Rect const d = _dt->get_display_area();
_dt->zoom_absolute(d.midpoint()[Geom::X], d.midpoint()[Geom::Y], zoom_factor);
- gtk_widget_grab_focus(static_cast<GtkWidget*>((void*)_dt->canvas)); /// \todo this no love song
+ gtk_widget_grab_focus(static_cast<GtkWidget*>((void*)_dt->canvas));
_upd_f = false;
}
diff --git a/src/verbs.cpp b/src/verbs.cpp
index d7e5f6841..1b57ad4ff 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -84,6 +84,11 @@
#include <gtk/gtk.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_KP_Add 0xffab
+#define GDK_KEY_KP_Subtract 0xffad
+#endif
+
using Inkscape::DocumentUndo;
//#ifdef WITH_INKBOARD
@@ -961,6 +966,18 @@ void EditVerb::perform(SPAction *action, void *data)
case SP_VERB_EDIT_SELECT_ALL:
SelectionHelper::selectAll(dt);
break;
+ case SP_VERB_EDIT_SELECT_SAME_FILL_STROKE:
+ SelectionHelper::selectSameFillStroke(dt);
+ break;
+ case SP_VERB_EDIT_SELECT_SAME_FILL_COLOR:
+ SelectionHelper::selectSameFillColor(dt);
+ break;
+ case SP_VERB_EDIT_SELECT_SAME_STROKE_COLOR:
+ SelectionHelper::selectSameStrokeColor(dt);
+ break;
+ case SP_VERB_EDIT_SELECT_SAME_STROKE_STYLE:
+ SelectionHelper::selectSameStrokeStyle(dt);
+ break;
case SP_VERB_EDIT_INVERT:
SelectionHelper::invert(dt);
break;
@@ -1644,7 +1661,7 @@ void ZoomVerb::perform(SPAction *action, void *data)
case SP_VERB_ZOOM_IN:
{
gint mul = 1 + gobble_key_events(
- GDK_KP_Add, 0); // with any mask
+ GDK_KEY_KP_Add, 0); // with any mask
// While drawing with the pen/pencil tool, zoom towards the end of the unfinished path
if (tools_isactive(dt, TOOLS_FREEHAND_PENCIL) || tools_isactive(dt, TOOLS_FREEHAND_PEN)) {
SPCurve *rc = SP_DRAW_CONTEXT(ec)->red_curve;
@@ -1662,7 +1679,7 @@ void ZoomVerb::perform(SPAction *action, void *data)
case SP_VERB_ZOOM_OUT:
{
gint mul = 1 + gobble_key_events(
- GDK_KP_Subtract, 0); // with any mask
+ GDK_KEY_KP_Subtract, 0); // with any mask
// While drawing with the pen/pencil tool, zoom away from the end of the unfinished path
if (tools_isactive(dt, TOOLS_FREEHAND_PENCIL) || tools_isactive(dt, TOOLS_FREEHAND_PEN)) {
SPCurve *rc = SP_DRAW_CONTEXT(ec)->red_curve;
@@ -2288,6 +2305,14 @@ Verb *Verb::_base_verbs[] = {
N_("Select all objects or all nodes"), GTK_STOCK_SELECT_ALL),
new EditVerb(SP_VERB_EDIT_SELECT_ALL_IN_ALL_LAYERS, "EditSelectAllInAllLayers", N_("Select All in All La_yers"),
N_("Select all objects in all visible and unlocked layers"), INKSCAPE_ICON("edit-select-all-layers")),
+ new EditVerb(SP_VERB_EDIT_SELECT_SAME_FILL_STROKE, "EditSelectSameFillStroke", N_("Fill _and Stroke"),
+ N_("Select all objects with the same fill and stroke as the selected objects"), GTK_STOCK_SELECT_ALL),
+ new EditVerb(SP_VERB_EDIT_SELECT_SAME_FILL_COLOR, "EditSelectSameFillColor", N_("_Fill Color"),
+ N_("Select all objects with the same fill as the selected objects"), GTK_STOCK_SELECT_ALL),
+ new EditVerb(SP_VERB_EDIT_SELECT_SAME_STROKE_COLOR, "EditSelectSameStrokeColor", N_("_Stroke Color"),
+ N_("Select all objects with the same stroke as the selected objects"), GTK_STOCK_SELECT_ALL),
+ new EditVerb(SP_VERB_EDIT_SELECT_SAME_STROKE_STYLE, "EditSelectSameStrokeStyle", N_("Stroke St_yle"),
+ N_("Select all objects with the same stroke style (width, dsh, markers) as the selected objects"), GTK_STOCK_SELECT_ALL),
new EditVerb(SP_VERB_EDIT_INVERT, "EditInvert", N_("In_vert Selection"),
N_("Invert selection (unselect what is selected and select everything else)"), INKSCAPE_ICON("edit-select-invert")),
new EditVerb(SP_VERB_EDIT_INVERT_IN_ALL_LAYERS, "EditInvertInAllLayers", N_("Invert in All Layers"),
@@ -2490,7 +2515,7 @@ Verb *Verb::_base_verbs[] = {
N_("Create and edit gradients"), INKSCAPE_ICON("color-gradient")),
new ContextVerb(SP_VERB_CONTEXT_ZOOM, "ToolZoom", N_("Zoom"),
N_("Zoom in or out"), INKSCAPE_ICON("zoom")),
- new ContextVerb(SP_VERB_CONTEXT_MEASURE, "ToolMeasure", N_("Measure"),
+ new ContextVerb(SP_VERB_CONTEXT_MEASURE, "ToolMeasure", NC_("Measurement tool", "Measure"),
N_("Measurement tool"), INKSCAPE_ICON("tool-measure")),
new ContextVerb(SP_VERB_CONTEXT_DROPPER, "ToolDropper", N_("Dropper"),
N_("Pick colors from image"), INKSCAPE_ICON("color-picker")),
diff --git a/src/verbs.h b/src/verbs.h
index 979a578d5..1a9efdb81 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -87,6 +87,10 @@ enum {
SP_VERB_EDIT_CLEAR_ALL,
SP_VERB_EDIT_SELECT_ALL,
SP_VERB_EDIT_SELECT_ALL_IN_ALL_LAYERS,
+ SP_VERB_EDIT_SELECT_SAME_FILL_STROKE,
+ SP_VERB_EDIT_SELECT_SAME_FILL_COLOR,
+ SP_VERB_EDIT_SELECT_SAME_STROKE_COLOR,
+ SP_VERB_EDIT_SELECT_SAME_STROKE_STYLE,
SP_VERB_EDIT_INVERT,
SP_VERB_EDIT_INVERT_IN_ALL_LAYERS,
SP_VERB_EDIT_SELECT_NEXT,
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index bb1a0908c..44d3c2f9a 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -253,7 +253,14 @@ Geom::Point
SPDesktopWidget::window_get_pointer()
{
gint x,y;
- gdk_window_get_pointer(gtk_widget_get_window(GTK_WIDGET(canvas)), &x, &y, NULL);
+ GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(canvas));
+
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkDisplay *display = gdk_window_get_display(window);
+ gdk_window_get_device_position(window, display->core_pointer, &x, &y, NULL);
+#else
+ gdk_window_get_pointer(window, &x, &y, NULL);
+#endif
return Geom::Point(x,y);
}
@@ -325,10 +332,20 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
dtw->_interaction_disabled_counter = 0;
/* Main table */
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(dtw->vbox), FALSE);
+#else
dtw->vbox = gtk_vbox_new (FALSE, 0);
+#endif
gtk_container_add( GTK_CONTAINER(dtw), GTK_WIDGET(dtw->vbox) );
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->statusbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(dtw->statusbar), FALSE);
+#else
dtw->statusbar = gtk_hbox_new (FALSE, 0);
+#endif
//gtk_widget_set_usize (dtw->statusbar, -1, BOTTOM_BAR_HEIGHT);
gtk_box_pack_end (GTK_BOX (dtw->vbox), dtw->statusbar, FALSE, TRUE, 0);
@@ -336,11 +353,16 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
using Inkscape::UI::Dialogs::SwatchesPanel;
dtw->panels = new SwatchesPanel("/embedded/swatches");
- dtw->panels->setOrientation( Gtk::ANCHOR_SOUTH );
+ dtw->panels->setOrientation(SP_ANCHOR_SOUTH);
gtk_box_pack_end( GTK_BOX( dtw->vbox ), GTK_WIDGET(dtw->panels->gobj()), FALSE, TRUE, 0 );
}
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(dtw->hbox), FALSE);
+#else
dtw->hbox = gtk_hbox_new(FALSE, 0);
+#endif
gtk_box_pack_end( GTK_BOX (dtw->vbox), dtw->hbox, TRUE, TRUE, 0 );
gtk_widget_show(dtw->hbox);
@@ -395,7 +417,12 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_table_attach (GTK_TABLE (canvas_tbl), dtw->hscrollbar, 1, 2, 2, 3, (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_SHRINK), 0, 0);
/* Vertical scrollbar and the sticky zoom button */
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->vscrollbar_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(dtw->vscrollbar_box), FALSE);
+#else
dtw->vscrollbar_box = gtk_vbox_new (FALSE, 0);
+#endif
dtw->sticky_zoom = sp_button_new_from_data ( Inkscape::ICON_SIZE_DECORATION,
SP_BUTTON_TYPE_TOGGLE,
NULL,
@@ -573,7 +600,13 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_label_set_markup (GTK_LABEL (dtw->select_status), _("<b>Welcome to Inkscape!</b> Use shape or freehand tools to create objects; use selector (arrow) to move or transform them."));
// space label 2 pixels from left edge
gtk_container_add (GTK_CONTAINER (dtw->select_status_eventbox), dtw->select_status);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_box_pack_start(GTK_BOX(dtw->statusbar),
+ gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0),
+ FALSE, FALSE, 2);
+#else
gtk_box_pack_start (GTK_BOX (dtw->statusbar), gtk_hbox_new(FALSE, 0), FALSE, FALSE, 2);
+#endif
gtk_box_pack_start (GTK_BOX (dtw->statusbar), dtw->select_status_eventbox, TRUE, TRUE, 0);
gtk_widget_show_all (dtw->vbox);
diff --git a/src/widgets/eek-preview.cpp b/src/widgets/eek-preview.cpp
index 36281f4d8..134cf9342 100644
--- a/src/widgets/eek-preview.cpp
+++ b/src/widgets/eek-preview.cpp
@@ -233,28 +233,38 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
allocation.width, allocation.height);
}
- GdkGC *gc = gdk_gc_new( gtk_widget_get_window (widget) );
EekPreview* preview = EEK_PREVIEW(widget);
GdkColor fg = {0, preview->_r, preview->_g, preview->_b};
gdk_colormap_alloc_color( gdk_colormap_get_system(), &fg, FALSE, TRUE );
- gdk_gc_set_foreground( gc, &fg );
gtk_widget_get_allocation (widget, &allocation);
+ cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(widget));
- gdk_draw_rectangle( gtk_widget_get_window (widget),
- gc,
- TRUE,
- insetX, insetY,
- allocation.width - (insetX * 2), allocation.height - (insetY * 2) );
+ GdkRectangle rect = {insetX,
+ insetY,
+ allocation.width - (insetX * 2),
+ allocation.height - (insetY * 2)};
+
+ gdk_cairo_set_source_color(cr, &fg);
+ gdk_cairo_rectangle(cr, &rect);
+ cairo_paint(cr);
+ cairo_destroy(cr);
if ( preview->_previewPixbuf ) {
GtkDrawingArea* da = &(preview->drawing);
- GdkDrawable* drawable = (GdkDrawable*) gtk_widget_get_window(GTK_WIDGET(da));
+ GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(da));
+ GdkDrawable* drawable = (GdkDrawable*) window;
gint w = 0;
gint h = 0;
- gdk_drawable_get_size(drawable, &w, &h);
- if ((w != preview->_scaledW) || (h != preview->_scaledH)) {
+#if GTK_CHECK_VERSION(2,24,0)
+ w = gdk_window_get_width(window);
+ h = gdk_window_get_height(window);
+#else
+ gdk_drawable_get_size(drawable, &w, &h);
+#endif
+
+ if ((w != preview->_scaledW) || (h != preview->_scaledH)) {
if (preview->_scaled) {
g_object_unref(preview->_scaled);
}
@@ -264,7 +274,10 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
}
GdkPixbuf* pix = (preview->_scaled) ? preview->_scaled : preview->_previewPixbuf;
- gdk_draw_pixbuf( drawable, 0, pix, 0, 0, 0, 0, w, h, GDK_RGB_DITHER_NONE, 0, 0 );
+ cairo_t* cr2 = gdk_cairo_create(drawable);
+ gdk_cairo_set_source_pixbuf(cr2, pix, 0, 0);
+ cairo_paint(cr2);
+ cairo_destroy(cr);
}
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
index 5aa8d3d00..ff361a6b8 100644
--- a/src/widgets/font-selector.cpp
+++ b/src/widgets/font-selector.cpp
@@ -176,7 +176,12 @@ static void sp_font_selector_init(SPFontSelector *fsel)
gtk_widget_show(f);
gtk_box_pack_start(GTK_BOX (fsel), f, TRUE, TRUE, 0);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(vb);
gtk_container_set_border_width(GTK_CONTAINER (vb), 4);
gtk_container_add(GTK_CONTAINER(f), vb);
@@ -201,11 +206,26 @@ static void sp_font_selector_init(SPFontSelector *fsel)
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(fsel->style_treeview));
g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (sp_font_selector_style_select_row), fsel);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 4);
+#endif
gtk_widget_show(hb);
gtk_box_pack_start(GTK_BOX(vb), hb, FALSE, FALSE, 0);
+/*
+This would introduce dependency on gtk version 2.24 which is currently not available in
+Trisquel GNU/Linux 4.5.1 (released on May 25th, 2011)
+This conditional and its #else block can be deleted in the future.
+*/
+#if GTK_CHECK_VERSION(2, 24,0)
+ fsel->size = gtk_combo_box_text_new_with_entry ();
+#else
fsel->size = gtk_combo_box_entry_new_text ();
+#endif
+
gtk_widget_set_tooltip_text (fsel->size, _("Font size (px)"));
gtk_widget_set_size_request(fsel->size, 90, -1);
g_signal_connect (G_OBJECT(fsel->size), "changed", G_CALLBACK (sp_font_selector_size_changed), fsel);
@@ -216,9 +236,13 @@ static void sp_font_selector_init(SPFontSelector *fsel)
gtk_box_pack_end(GTK_BOX (hb), l, FALSE, FALSE, 0);
for (unsigned int n = 0; sizes[n]; ++n)
- {
- gtk_combo_box_append_text (GTK_COMBO_BOX(fsel->size), sizes[n]);
- }
+ {
+#if GTK_CHECK_VERSION(2, 24,0)
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fsel->size), sizes[n]);
+#else
+ gtk_combo_box_append_text (GTK_COMBO_BOX(fsel->size), sizes[n]);
+#endif
+ }
gtk_widget_show_all (fsel->size);
@@ -304,7 +328,12 @@ static void sp_font_selector_style_select_row (GtkTreeSelection *selection,
static void sp_font_selector_size_changed( GtkComboBox */*cbox*/, SPFontSelector *fsel )
{
- char *text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (fsel->size));
+ char *text = NULL;
+#if GTK_CHECK_VERSION(2, 24,0)
+ text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (fsel->size));
+#else
+ text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (fsel->size));
+#endif
gfloat old_size = fsel->fontsize;
gchar *endptr;
@@ -375,7 +404,7 @@ static void sp_font_selector_emit_set (SPFontSelector *fsel)
fsel->font->Unref();
}
fsel->font = font;
- gtk_signal_emit(GTK_OBJECT(fsel), fs_signals[FONT_SET], fsel->font);
+ g_signal_emit(GTK_OBJECT(fsel), fs_signals[FONT_SET], 0, fsel->font);
}
fsel->fontsize_dirty = false;
if (font) {
diff --git a/src/widgets/gradient-selector.cpp b/src/widgets/gradient-selector.cpp
index e67d93388..e820beac6 100644
--- a/src/widgets/gradient-selector.cpp
+++ b/src/widgets/gradient-selector.cpp
@@ -133,7 +133,12 @@ static void sp_gradient_selector_init(SPGradientSelector *sel)
g_signal_connect (G_OBJECT (sel->vectors), "vector_set", G_CALLBACK (sp_gradient_selector_vector_set), sel);
/* Create box for buttons */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new( FALSE, 0 );
+#endif
sel->nonsolid.push_back(hb);
gtk_box_pack_start( GTK_BOX(sel), hb, FALSE, FALSE, 0 );
@@ -152,7 +157,12 @@ static void sp_gradient_selector_init(SPGradientSelector *sel)
gtk_widget_show_all(hb);
/* Spread selector */
+#if GTK_CHECK_VERSION(3,0,0)
+ hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
hb = gtk_hbox_new( FALSE, 0 );
+#endif
sel->nonsolid.push_back(hb);
gtk_widget_show(hb);
gtk_box_pack_start( GTK_BOX(sel), hb, FALSE, FALSE, 0 );
diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp
index 465c426fc..e239457fd 100644
--- a/src/widgets/gradient-toolbar.cpp
+++ b/src/widgets/gradient-toolbar.cpp
@@ -16,8 +16,8 @@
# include "config.h"
#endif
+#include "ui/widget/color-preview.h"
#include "verbs.h"
-#include <gtk/gtk.h>
#include "macros.h"
#include "widgets/button.h"
@@ -51,7 +51,6 @@
#include "../ink-comboboxentry-action.h"
#include "sp-stop.h"
-#include "ui/widget/color-preview.h"
#include "svg/css-ostringstream.h"
#include "svg/svg-color.h"
#include "desktop-style.h"
@@ -176,7 +175,6 @@ gboolean gr_vector_list(GtkWidget *combo_box, SPDesktop *desktop, bool selection
gl = g_slist_reverse (gl);
guint pos = 0;
- guint idx = 0;
if (!gl) {
// The document has no gradients
@@ -206,6 +204,7 @@ gboolean gr_vector_list(GtkWidget *combo_box, SPDesktop *desktop, bool selection
sensitive = FALSE;
}
+ guint idx = 0;
while (gl) {
SPGradient *gradient = SP_GRADIENT (gl->data);
gl = g_slist_remove (gl, gradient);
@@ -940,14 +939,14 @@ static void gr_stop_set_offset (GtkComboBox */*widget*/, GtkWidget *data)
* Callback functions for user actions
*/
-static void gr_new_type_changed( EgeSelectOneAction *act, GObject *tbl )
+static void gr_new_type_changed( EgeSelectOneAction *act, GObject * /*tbl*/ )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
gint typemode = ege_select_one_action_get_active( act ) == 0 ? SP_GRADIENT_TYPE_LINEAR : SP_GRADIENT_TYPE_RADIAL;
prefs->setInt("/tools/gradient/newgradient", typemode);
}
-static void gr_new_fillstroke_changed( EgeSelectOneAction *act, GObject *tbl )
+static void gr_new_fillstroke_changed( EgeSelectOneAction *act, GObject * /*tbl*/ )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool fillmode = ege_select_one_action_get_active( act ) == 0;
@@ -1011,7 +1010,7 @@ void gr_spread_change (EgeSelectOneAction *act, GtkWidget *widget)
/*
* User selected a stop from the combobox
*/
-static void gr_stop_combo_changed (GtkComboBox *widget, GtkWidget *data)
+static void gr_stop_combo_changed (GtkComboBox * /*widget*/, GtkWidget *data)
{
if (blocked) {
return;
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index 3d6d5a8f2..8348f7045 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -289,7 +289,6 @@ static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs)
gl = g_slist_reverse(gl);
gint pos = 0;
- gint idx = 0;
if (!gvs->doc) {
gtk_list_store_append (gvs->store, &iter);
@@ -307,6 +306,7 @@ static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs)
gtk_widget_set_sensitive (gvs->combo_box, FALSE);
} else {
+ gint idx = 0;
while (gl) {
SPGradient *gr;
gr = SP_GRADIENT(gl->data);
@@ -457,7 +457,7 @@ static gboolean blocked = FALSE;
static void grad_edit_dia_stop_added_or_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node */*child*/, Inkscape::XML::Node */*ref*/, gpointer data)
{
GtkWidget *vb = GTK_WIDGET(data);
- SPGradient *gradient = (SPGradient *)g_object_get_data(G_OBJECT(vb), "gradient");
+ SPGradient *gradient = static_cast<SPGradient *>(g_object_get_data(G_OBJECT(vb), "gradient"));
update_stop_list(vb, gradient, NULL);
}
@@ -596,7 +596,7 @@ static void update_stop_list( GtkWidget *vb, SPGradient *gradient, SPStop *new_s
// user selected existing stop from list
-static void sp_grad_edit_combo_box_changed (GtkComboBox *widget, GtkWidget *tbl)
+static void sp_grad_edit_combo_box_changed (GtkComboBox * /*widget*/, GtkWidget *tbl)
{
SPStop *stop = get_selected_stop(tbl);
if (!stop) {
@@ -792,7 +792,12 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
g_return_val_if_fail(!gradient || SP_IS_GRADIENT(gradient), NULL);
+#if GTK_CHECK_VERSION(3,0,0)
+ vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, PAD);
+ gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
+#else
vb = gtk_vbox_new(FALSE, PAD);
+#endif
g_signal_connect(G_OBJECT(vb), "destroy", G_CALLBACK(sp_gradient_vector_widget_destroy), NULL);
w = sp_gradient_image_new(gradient);
@@ -825,7 +830,12 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(sp_grad_edit_combo_box_changed), vb);
/* Add and Remove buttons */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+#endif
// TRANSLATORS: "Stop" means: a "phase" of a gradient
GtkWidget *b = gtk_button_new_with_label(_("Add stop"));
gtk_widget_show(b);
@@ -842,7 +852,12 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
gtk_box_pack_start(GTK_BOX(vb),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
/* Offset Slider and stuff */
+#if GTK_CHECK_VERSION(3,0,0)
+ hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
hb = gtk_hbox_new(FALSE, 0);
+#endif
/* Label */
GtkWidget *l = gtk_label_new(_("Offset:"));
@@ -863,7 +878,11 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
gtk_adjustment_set_value(Offset_adj, stop->offset);
/* Slider */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *slider = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, Offset_adj);
+#else
GtkWidget *slider = gtk_hscale_new(Offset_adj);
+#endif
gtk_scale_set_draw_value( GTK_SCALE(slider), FALSE );
gtk_widget_show(slider);
gtk_box_pack_start(GTK_BOX(hb),slider, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
@@ -996,14 +1015,14 @@ static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradien
SPGradient *old;
- old = (SPGradient*)g_object_get_data(G_OBJECT(widget), "gradient");
+ old = static_cast<SPGradient*>(g_object_get_data(G_OBJECT(widget), "gradient"));
if (old != gradient) {
sigc::connection *release_connection;
sigc::connection *modified_connection;
- release_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_release_connection");
- modified_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_modified_connection");
+ release_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(widget), "gradient_release_connection"));
+ modified_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(widget), "gradient_modified_connection"));
if (old) {
g_assert( release_connection != NULL );
diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp
index d67160483..3f34c8ad1 100644
--- a/src/widgets/paint-selector.cpp
+++ b/src/widgets/paint-selector.cpp
@@ -167,7 +167,7 @@ sp_paint_selector_class_init(SPPaintSelectorClass *klass)
G_STRUCT_OFFSET(SPPaintSelectorClass, mode_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1, GTK_TYPE_UINT);
+ G_TYPE_NONE, 1, G_TYPE_UINT);
psel_signals[GRABBED] = g_signal_new("grabbed",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
@@ -202,7 +202,7 @@ sp_paint_selector_class_init(SPPaintSelectorClass *klass)
G_STRUCT_OFFSET(SPPaintSelectorClass, fillrule_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1, GTK_TYPE_UINT);
+ G_TYPE_NONE, 1, G_TYPE_UINT);
object_class->destroy = sp_paint_selector_destroy;
}
@@ -216,7 +216,12 @@ sp_paint_selector_init(SPPaintSelector *psel)
psel->mode = static_cast<SPPaintSelector::Mode>(-1); // huh? do you mean 0xff? -- I think this means "not in the enum"
/* Paint style button box */
+#if GTK_CHECK_VERSION(3,0,0)
+ psel->style = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(psel->style), FALSE);
+#else
psel->style = gtk_hbox_new(FALSE, 0);
+#endif
gtk_widget_show(psel->style);
gtk_container_set_border_width(GTK_CONTAINER(psel->style), 4);
gtk_box_pack_start(GTK_BOX(psel), psel->style, FALSE, FALSE, 0);
@@ -239,7 +244,12 @@ sp_paint_selector_init(SPPaintSelector *psel)
/* Fillrule */
{
+#if GTK_CHECK_VERSION(3,0,0)
+ psel->fillrulebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(psel->fillrulebox), FALSE);
+#else
psel->fillrulebox = gtk_hbox_new(FALSE, 0);
+#endif
gtk_box_pack_end(GTK_BOX(psel->style), psel->fillrulebox, FALSE, FALSE, 0);
GtkWidget *w;
@@ -268,12 +278,22 @@ sp_paint_selector_init(SPPaintSelector *psel)
/* Frame */
psel->label = gtk_label_new("");
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *lbbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(lbbox), FALSE);
+#else
GtkWidget *lbbox = gtk_hbox_new(FALSE, 4);
+#endif
gtk_widget_show(psel->label);
gtk_box_pack_start(GTK_BOX(lbbox), psel->label, false, false, 4);
gtk_box_pack_start(GTK_BOX(psel), lbbox, false, false, 4);
+#if GTK_CHECK_VERSION(3,0,0)
+ psel->frame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(psel->frame), FALSE);
+#else
psel->frame = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(psel->frame);
//gtk_container_set_border_width(GTK_CONTAINER(psel->frame), 0);
gtk_box_pack_start(GTK_BOX(psel), psel->frame, TRUE, TRUE, 0);
@@ -657,7 +677,12 @@ static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelec
sp_paint_selector_clear_frame(psel);
/* Create new color selector */
/* Create vbox */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(vb);
/* Color selector */
@@ -820,7 +845,12 @@ sp_pattern_menu_build (GtkWidget *m, GSList *pattern_list, SPDocument */*source*
gchar const *patid = repr->attribute("id");
g_object_set_data (G_OBJECT(i), "pattern", (void *) patid);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 4);
+#endif
gtk_widget_show(hb);
// create label
@@ -955,7 +985,7 @@ void SPPaintSelector::updatePatternList( SPPattern *pattern )
GtkMenu *m = GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(mnu)));
- GList *kids = GTK_MENU_SHELL(m)->children;
+ GList *kids = gtk_container_get_children(GTK_CONTAINER(m));
int patpos = 0;
int i = 0;
@@ -993,11 +1023,21 @@ static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSel
sp_paint_selector_clear_frame(psel);
/* Create vbox */
+#if GTK_CHECK_VERSION(3,0,0)
+ tbl = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(tbl), FALSE);
+#else
tbl = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(tbl);
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+#endif
GtkWidget *mnu = gtk_option_menu_new();
ink_pattern_menu(mnu);
@@ -1011,7 +1051,12 @@ static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSel
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 0);
+#endif
GtkWidget *l = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(l), _("Use the <b>Node tool</b> to adjust position, scale, and rotation of the pattern on canvas. Use <b>Object &gt; Pattern &gt; Objects to Pattern</b> to create a new pattern from selection."));
gtk_label_set_line_wrap(GTK_LABEL(l), true);
diff --git a/src/widgets/select-toolbar.cpp b/src/widgets/select-toolbar.cpp
index 3185e7373..e23d4f84b 100644
--- a/src/widgets/select-toolbar.cpp
+++ b/src/widgets/select-toolbar.cpp
@@ -470,7 +470,12 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
g_object_set_data(G_OBJECT(spw), "dtw", sp_desktop_canvas(desktop));
// The vb frame holds all other widgets and is used to set sensitivity depending on selection state.
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_hbox_new(FALSE, 0);
+#endif
gtk_widget_show(vb);
gtk_container_add(GTK_CONTAINER(spw), vb);
diff --git a/src/widgets/shrink-wrap-button.cpp b/src/widgets/shrink-wrap-button.cpp
index ba422034e..8d5bad21c 100644
--- a/src/widgets/shrink-wrap-button.cpp
+++ b/src/widgets/shrink-wrap-button.cpp
@@ -21,7 +21,11 @@ void minimum_size(GtkWidget *widget, GtkRequisition *requisition, void *) {
GtkWidget *child(gtk_bin_get_child(GTK_BIN(widget)));
if (child) {
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(child, requisition, NULL);
+#else
gtk_widget_size_request(child, requisition);
+#endif
} else {
requisition->width = 0;
requisition->height = 0;
diff --git a/src/widgets/sp-color-notebook.cpp b/src/widgets/sp-color-notebook.cpp
index f9cda297f..863e8b762 100644
--- a/src/widgets/sp-color-notebook.cpp
+++ b/src/widgets/sp-color-notebook.cpp
@@ -323,7 +323,12 @@ void ColorNotebook::init()
row++;
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *rgbabox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(rgbabox), FALSE);
+#else
GtkWidget *rgbabox = gtk_hbox_new (FALSE, 0);
+#endif
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
/* Create color management icons */
diff --git a/src/widgets/sp-color-slider.cpp b/src/widgets/sp-color-slider.cpp
index 5ec6d57df..b74be502b 100644
--- a/src/widgets/sp-color-slider.cpp
+++ b/src/widgets/sp-color-slider.cpp
@@ -171,7 +171,7 @@ sp_color_slider_destroy (GtkObject *object)
if (slider->adjustment) {
g_signal_handlers_disconnect_matched (G_OBJECT (slider->adjustment), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, slider);
- gtk_object_unref (GTK_OBJECT (slider->adjustment));
+ g_object_unref (slider->adjustment);
slider->adjustment = NULL;
}
@@ -343,11 +343,11 @@ void sp_color_slider_set_adjustment(SPColorSlider *slider, GtkAdjustment *adjust
if (slider->adjustment != adjustment) {
if (slider->adjustment) {
g_signal_handlers_disconnect_matched (G_OBJECT (slider->adjustment), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, slider);
- gtk_object_unref (GTK_OBJECT (slider->adjustment));
+ g_object_unref (slider->adjustment);
}
slider->adjustment = adjustment;
- gtk_object_ref (GTK_OBJECT (adjustment));
+ g_object_ref (adjustment);
g_object_ref_sink (adjustment);
g_signal_connect (G_OBJECT (adjustment), "changed",
@@ -585,30 +585,40 @@ sp_color_slider_paint (SPColorSlider *slider, GdkRectangle *area)
if (gdk_rectangle_intersect (area, &aarea, &apaint)) {
/* Draw arrow */
gdk_rectangle_intersect (&carea, &apaint, &apaint);
- gdk_gc_set_clip_rectangle(style->white_gc, &apaint);
- gdk_gc_set_clip_rectangle(style->black_gc, &apaint);
+ cairo_t* cr = gdk_cairo_create(window);
+ gdk_cairo_rectangle(cr, &apaint);
+ cairo_clip(cr);
x = aarea.x;
y1 = carea.y;
y2 = aarea.y + aarea.height - 1;
w = aarea.width;
+ cairo_set_line_width(cr, 1.0);
+
while ( w > 0 )
{
- gdk_draw_line(window, style->white_gc, x, y1, x + w - 1, y1 );
- gdk_draw_line(window, style->white_gc, x, y2, x + w - 1, y2 );
+ gdk_cairo_set_source_color(cr, &style->white);
+ cairo_move_to(cr, x - 0.5, y1 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y1 + 0.5);
+ cairo_move_to(cr, x - 0.5, y2 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y2 + 0.5);
+ cairo_stroke(cr);
w -=2;
x++;
if ( w > 0 )
{
- gdk_draw_line(window, style->black_gc, x, y1, x + w - 1, y1 );
- gdk_draw_line(window, style->black_gc, x, y2, x + w - 1, y2 );
+ gdk_cairo_set_source_color(cr, &style->black);
+ cairo_move_to(cr, x - 0.5, y1 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y1 + 0.5);
+ cairo_move_to(cr, x - 0.5, y2 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y2 + 0.5);
+ cairo_stroke(cr);
}
y1++;
y2--;
}
- gdk_gc_set_clip_rectangle(style->white_gc, NULL);
- gdk_gc_set_clip_rectangle(style->black_gc, NULL);
+ cairo_destroy(cr);
}
}
diff --git a/src/widgets/sp-widget.cpp b/src/widgets/sp-widget.cpp
index aa4c85851..8645d90f7 100644
--- a/src/widgets/sp-widget.cpp
+++ b/src/widgets/sp-widget.cpp
@@ -234,7 +234,7 @@ sp_widget_new_global (Inkscape::Application *inkscape)
spw = (SPWidget*)g_object_new (SP_TYPE_WIDGET, NULL);
if (!sp_widget_construct_global (spw, inkscape)) {
- gtk_object_unref (GTK_OBJECT (spw));
+ g_object_unref (spw);
return NULL;
}
diff --git a/src/widgets/sp-xmlview-attr-list.cpp b/src/widgets/sp-xmlview-attr-list.cpp
index 1c92476fa..0b4dcce32 100644
--- a/src/widgets/sp-xmlview-attr-list.cpp
+++ b/src/widgets/sp-xmlview-attr-list.cpp
@@ -36,8 +36,6 @@ static Inkscape::XML::NodeEventVector repr_events = {
NULL /* order_changed */
};
-enum {COL_NAME=0, COL_VALUE, COL_ATTR};
-
GtkWidget *
sp_xmlview_attr_list_new (Inkscape::XML::Node * repr)
{
@@ -45,20 +43,24 @@ sp_xmlview_attr_list_new (Inkscape::XML::Node * repr)
attr_list = (SPXMLViewAttrList*)g_object_new (SP_TYPE_XMLVIEW_ATTR_LIST, NULL);
- attr_list->store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ attr_list->store = gtk_list_store_new (ATTR_N_COLS, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING );
gtk_tree_view_set_model (GTK_TREE_VIEW(attr_list), GTK_TREE_MODEL(attr_list->store));
+ // Attribute name column
+ int colpos = 0;
GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_NAME, _("Attribute"), cell, "text", 0, NULL);
- GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_NAME);
+ gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), colpos, _("Name"), cell, "text", ATTR_COL_NAME, NULL);
+ GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), colpos);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_sort_column_id (column, COL_NAME);
- gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE(attr_list->store), COL_NAME, GTK_SORT_ASCENDING);
+ gtk_tree_view_column_set_sort_column_id (column, colpos);
+ gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE(attr_list->store), ATTR_COL_NAME, GTK_SORT_ASCENDING);
gtk_cell_renderer_set_padding (cell, 2, 0);
+ // Attribute value column
+ colpos = 1;
cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_VALUE, _("Value"), cell, "text", COL_VALUE, NULL);
- column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_VALUE);
+ gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), colpos, _("Value"), cell, "text", ATTR_COL_VALUE, NULL);
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), colpos);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_cell_renderer_set_padding (cell, 2, 0);
@@ -117,14 +119,14 @@ sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass)
parent_class = (GtkTreeViewClass*)g_type_class_peek_parent (klass);
- g_signal_new ( "row-value-changed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (SPXMLViewAttrListClass, row_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT);
+ g_signal_new ( "row-value-changed",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (SPXMLViewAttrListClass, row_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
}
void
@@ -141,24 +143,28 @@ sp_xmlview_attr_list_destroy (GtkObject * object)
list = SP_XMLVIEW_ATTR_LIST (object);
+ g_object_unref(list->store);
sp_xmlview_attr_list_set_repr (list, NULL);
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
-void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, gchar *name)
+void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, const gchar *name)
{
GtkTreeIter iter;
- const gchar *n;
gboolean match = false;
gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(list->store), &iter );
while ( valid ) {
- gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, COL_NAME, &n, -1);
+ gchar *n = 0;
+ gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, ATTR_COL_NAME, &n, -1);
if (!strcmp(n, name)) {
match = true;
break;
}
valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list->store), &iter);
+ if (n) {
+ g_free(n);
+ }
}
if (match) {
@@ -181,29 +187,31 @@ event_attr_changed (Inkscape::XML::Node * /*repr*/,
list = SP_XMLVIEW_ATTR_LIST (data);
GtkTreeIter iter;
- const gchar *n;
gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(list->store), &iter );
gboolean match = false;
while ( valid ) {
- gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, COL_NAME, &n, -1);
+ gchar *n = 0;
+ gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, ATTR_COL_NAME, &n, -1);
if (!strcmp(n, name)) {
match = true;
break;
}
row++;
valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list->store), &iter);
+ if (n) {
+ g_free(n);
+ }
}
if (match) {
if (new_value) {
- gtk_list_store_set (list->store, &iter, COL_NAME, name, COL_VALUE, new_value, COL_ATTR, GINT_TO_POINTER (g_quark_from_string (name)), -1);
+ gtk_list_store_set (list->store, &iter, ATTR_COL_NAME, name, ATTR_COL_VALUE, new_value, ATTR_COL_ATTR, g_quark_from_string (name), -1);
} else {
gtk_list_store_remove (list->store, &iter);
}
} else if (new_value != NULL) {
gtk_list_store_append (list->store, &iter);
- gtk_list_store_set (list->store, &iter, COL_NAME, name, COL_VALUE, new_value, COL_ATTR, GINT_TO_POINTER (g_quark_from_string (name)), -1);
-
+ gtk_list_store_set (list->store, &iter, ATTR_COL_NAME, name, ATTR_COL_VALUE, new_value, ATTR_COL_ATTR, g_quark_from_string (name), -1);
}
// send a "changed" signal so widget owners will know I've updated
diff --git a/src/widgets/sp-xmlview-attr-list.h b/src/widgets/sp-xmlview-attr-list.h
index 485ea0114..8b1dae49b 100644
--- a/src/widgets/sp-xmlview-attr-list.h
+++ b/src/widgets/sp-xmlview-attr-list.h
@@ -45,7 +45,9 @@ GtkWidget * sp_xmlview_attr_list_new (Inkscape::XML::Node * repr);
#define SP_XMLVIEW_ATTR_LIST_GET_REPR(list) (SP_XMLVIEW_ATTR_LIST (list)->repr)
void sp_xmlview_attr_list_set_repr (SPXMLViewAttrList * list, Inkscape::XML::Node * repr);
-void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, gchar *name);
+void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, const gchar *name);
+/* Attribute list store columns */
+enum {ATTR_COL_NAME=0, ATTR_COL_ATTR=1, ATTR_COL_VALUE=2, ATTR_N_COLS=3 };
#endif
diff --git a/src/widgets/sp-xmlview-tree.cpp b/src/widgets/sp-xmlview-tree.cpp
index b867b1044..ade5bec39 100644
--- a/src/widgets/sp-xmlview-tree.cpp
+++ b/src/widgets/sp-xmlview-tree.cpp
@@ -1,7 +1,7 @@
#define __SP_XMLVIEW_TREE_C__
/*
- * Specialization of GtkCTree for the XML tree view
+ * Specialization of GtkTreeView for the XML tree view
*
* Authors:
* MenTaLguY <mental@rydia.net>
@@ -19,20 +19,20 @@
struct NodeData {
SPXMLViewTree * tree;
- GtkCTreeNode * node;
+ GtkTreeRowReference *rowref;
Inkscape::XML::Node * repr;
};
-#define NODE_DATA(node) ((NodeData *)(GTK_CTREE_ROW ((node))->row.data))
+enum { STORE_TEXT_COL = 0, STORE_DATA_COL, STORE_REPR_COL, STORE_N_COLS };
static void sp_xmlview_tree_class_init (SPXMLViewTreeClass * klass);
static void sp_xmlview_tree_init (SPXMLViewTree * tree);
static void sp_xmlview_tree_destroy (GtkObject * object);
-static NodeData * node_data_new (SPXMLViewTree * tree, GtkCTreeNode * node, Inkscape::XML::Node * repr);
+static NodeData * node_data_new (SPXMLViewTree * tree, GtkTreeIter * node, GtkTreeRowReference *rowref, Inkscape::XML::Node * repr);
static void node_data_free (gpointer data);
-static GtkCTreeNode * add_node (SPXMLViewTree * tree, GtkCTreeNode * parent, GtkCTreeNode * before, Inkscape::XML::Node * repr);
+static GtkTreeRowReference * add_node (SPXMLViewTree * tree, GtkTreeIter * parent, GtkTreeIter * before, Inkscape::XML::Node * repr);
static void element_child_added (Inkscape::XML::Node * repr, Inkscape::XML::Node * child, Inkscape::XML::Node * ref, gpointer data);
static void element_attr_changed (Inkscape::XML::Node * repr, const gchar * key, const gchar * old_value, const gchar * new_value, bool is_interactive, gpointer data);
@@ -43,15 +43,19 @@ static void text_content_changed (Inkscape::XML::Node * repr, const gchar * old_
static void comment_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data);
static void pi_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data);
-static void tree_move (GtkCTree * tree, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * new_sibling);
+static void ref_to_sibling (NodeData *node, Inkscape::XML::Node * ref, GtkTreeIter *);
+static void repr_to_child (NodeData *node, Inkscape::XML::Node * repr, GtkTreeIter *);
+static Inkscape::XML::Node * sibling_to_ref (GtkTreeView * tree, GtkTreeIter * parent, GtkTreeIter * sibling);
+static gboolean tree_model_iter_compare(GtkTreeModel* store, GtkTreeIter * iter1, GtkTreeIter * iter2);
+GtkTreeRowReference *tree_iter_to_ref (SPXMLViewTree * tree, GtkTreeIter* iter);
+static void tree_ref_to_iter (SPXMLViewTree * tree, GtkTreeIter* iter, GtkTreeRowReference *ref);
-static gboolean check_drag (GtkCTree * tree, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * new_sibling);
+gboolean search_equal_func (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data);
+gboolean foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
-static GtkCTreeNode * ref_to_sibling (GtkCTreeNode * parent, Inkscape::XML::Node * ref);
-static GtkCTreeNode * repr_to_child (GtkCTreeNode * parent, Inkscape::XML::Node * repr);
-static Inkscape::XML::Node * sibling_to_ref (GtkCTreeNode * parent, GtkCTreeNode * sibling);
-
-static gint match_node_data_by_repr(gconstpointer data_p, gconstpointer repr);
+void on_row_changed(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
+void on_drag_data_received(GtkWidget *wgt, GdkDragContext *context, int x, int y, GtkSelectionData *seldata, guint info, guint time, gpointer userdata);
+gboolean do_drag_motion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time, gpointer user_data);
static const Inkscape::XML::NodeEventVector element_repr_events = {
element_child_added,
@@ -85,44 +89,35 @@ static const Inkscape::XML::NodeEventVector pi_repr_events = {
NULL /* order_changed */
};
-static GtkCTreeClass * parent_class = NULL;
+static GtkTreeViewClass * parent_class = NULL;
GtkWidget *
sp_xmlview_tree_new (Inkscape::XML::Node * repr, void * /*factory*/, void * /*data*/)
{
SPXMLViewTree * tree;
- tree = (SPXMLViewTree*)g_object_new (SP_TYPE_XMLVIEW_TREE, "n_columns", 1, "tree_column", 0, NULL);
+ tree = (SPXMLViewTree*)g_object_new (SP_TYPE_XMLVIEW_TREE, NULL);
- gtk_clist_column_titles_hide (GTK_CLIST (tree));
- gtk_ctree_set_line_style (GTK_CTREE (tree), GTK_CTREE_LINES_NONE);
- gtk_ctree_set_expander_style (GTK_CTREE (tree), GTK_CTREE_EXPANDER_TRIANGLE);
- gtk_clist_set_column_auto_resize (GTK_CLIST (tree), 0, TRUE);
- gtk_clist_set_reorderable (GTK_CLIST (tree), TRUE);
- gtk_ctree_set_drag_compare_func (GTK_CTREE (tree), check_drag);
+ tree->store = gtk_tree_store_new (STORE_N_COLS, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
+ gtk_tree_view_set_model (GTK_TREE_VIEW(tree), GTK_TREE_MODEL(tree->store));
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tree), FALSE);
+ gtk_tree_view_set_reorderable (GTK_TREE_VIEW(tree), TRUE);
+ gtk_tree_view_set_enable_search (GTK_TREE_VIEW(tree), TRUE);
+ gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(tree), search_equal_func, NULL, NULL);
- sp_xmlview_tree_set_repr (tree, repr);
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+ GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", STORE_TEXT_COL, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+ gtk_cell_renderer_set_padding (renderer, 2, 0);
+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- return (GtkWidget *) tree;
-}
+ sp_xmlview_tree_set_repr (tree, repr);
-void
-sp_xmlview_tree_set_repr (SPXMLViewTree * tree, Inkscape::XML::Node * repr)
-{
- if ( tree->repr == repr ) return;
- gtk_clist_freeze (GTK_CLIST (tree));
- if (tree->repr) {
- gtk_clist_clear (GTK_CLIST (tree));
- Inkscape::GC::release(tree->repr);
- }
- tree->repr = repr;
- if (repr) {
- GtkCTreeNode * node;
- Inkscape::GC::anchor(repr);
- node = add_node (tree, NULL, NULL, repr);
- gtk_ctree_expand (GTK_CTREE (tree), node);
- }
- gtk_clist_thaw (GTK_CLIST (tree));
+ g_signal_connect(G_OBJECT(tree->store), "row-changed", G_CALLBACK(on_row_changed), tree);
+ g_signal_connect(GTK_TREE_VIEW(tree), "drag_data_received", G_CALLBACK(on_drag_data_received), tree);
+ g_signal_connect(GTK_TREE_VIEW(tree), "drag-motion", G_CALLBACK(do_drag_motion), tree);
+
+ return (GtkWidget *) tree;
}
GType
@@ -141,9 +136,10 @@ sp_xmlview_tree_get_type (void)
(GInstanceInitFunc) sp_xmlview_tree_init,
NULL
};
- type = g_type_register_static (GTK_TYPE_CTREE, "SPXMLViewTree", &info, (GTypeFlags)0);
+ type = g_type_register_static (GTK_TYPE_TREE_VIEW, "SPXMLViewTree", &info, (GTypeFlags)0);
}
+
return type;
}
@@ -153,9 +149,17 @@ sp_xmlview_tree_class_init (SPXMLViewTreeClass * klass)
GtkObjectClass * object_class;
object_class = (GtkObjectClass *) klass;
- parent_class = (GtkCTreeClass *) g_type_class_peek_parent (klass);
-
- GTK_CTREE_CLASS (object_class)->tree_move = tree_move;
+ parent_class = (GtkTreeViewClass *) g_type_class_peek_parent (klass);
+
+ // Signal for when a tree drag and drop has completed
+ g_signal_new ( "tree_move",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__UINT,
+ G_TYPE_NONE, 1,
+ G_TYPE_UINT);
object_class->destroy = sp_xmlview_tree_destroy;
}
@@ -165,6 +169,7 @@ sp_xmlview_tree_init (SPXMLViewTree * tree)
{
tree->repr = NULL;
tree->blocked = 0;
+ tree->dndactive = FALSE;
}
void
@@ -179,24 +184,31 @@ sp_xmlview_tree_destroy (GtkObject * object)
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
-GtkCTreeNode *
-add_node (SPXMLViewTree * tree, GtkCTreeNode * parent, GtkCTreeNode * before, Inkscape::XML::Node * repr)
+/*
+ * Add a new row to the tree
+ */
+GtkTreeRowReference *
+add_node (SPXMLViewTree * tree, GtkTreeIter *parent, GtkTreeIter *before, Inkscape::XML::Node * repr)
{
- NodeData * data;
- GtkCTreeNode * node;
+ NodeData * data = NULL;
const Inkscape::XML::NodeEventVector * vec;
static const gchar *default_text[] = { "???" };
g_assert (tree != NULL);
g_assert (repr != NULL);
- node = gtk_ctree_insert_node (GTK_CTREE (tree), parent, before, (gchar **)default_text, 2, NULL, NULL, NULL, NULL, ( repr->type() != Inkscape::XML::ELEMENT_NODE ), FALSE);
- g_assert (node != NULL);
+ if (before && !gtk_tree_store_iter_is_valid(tree->store, before)) {
+ before = NULL;
+ }
+
+ GtkTreeIter iter;
+ gtk_tree_store_insert_before (tree->store, &iter, parent, before);
- data = node_data_new (tree, node, repr);
- g_assert (data != NULL);
+ GtkTreeRowReference *rowref = tree_iter_to_ref (tree, &iter);
+ data = node_data_new (tree, &iter, rowref, repr);
+ g_assert (data != NULL);
- gtk_ctree_node_set_row_data_full (GTK_CTREE (tree), data->node, data, node_data_free);
+ gtk_tree_store_set (tree->store, &iter, STORE_TEXT_COL, default_text, STORE_DATA_COL, data, STORE_REPR_COL, repr, -1);
if ( repr->type() == Inkscape::XML::TEXT_NODE ) {
vec = &text_repr_events;
@@ -211,29 +223,25 @@ add_node (SPXMLViewTree * tree, GtkCTreeNode * parent, GtkCTreeNode * before, In
}
if (vec) {
- gtk_clist_freeze (GTK_CLIST (tree));
- /* cheat a little to get the id upated properly */
+ /* cheat a little to get the id updated properly */
if (repr->type() == Inkscape::XML::ELEMENT_NODE) {
element_attr_changed (repr, "id", NULL, NULL, false, data);
}
sp_repr_add_listener (repr, vec, data);
sp_repr_synthesize_events (repr, vec, data);
- gtk_clist_thaw (GTK_CLIST (tree));
}
- return node;
+ return rowref;
}
-NodeData *
-node_data_new (SPXMLViewTree * tree, GtkCTreeNode * node, Inkscape::XML::Node * repr)
+NodeData *node_data_new(SPXMLViewTree * tree, GtkTreeIter * /*node*/, GtkTreeRowReference *rowref, Inkscape::XML::Node *repr)
{
- NodeData * data;
- data = g_new (NodeData, 1);
- data->tree = tree;
- data->node = node;
- data->repr = repr;
- Inkscape::GC::anchor(repr);
- return data;
+ NodeData *data = g_new(NodeData, 1);
+ data->tree = tree;
+ data->rowref = rowref;
+ data->repr = repr;
+ Inkscape::GC::anchor(repr);
+ return data;
}
void
@@ -250,15 +258,17 @@ void
element_child_added (Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node * child, Inkscape::XML::Node * ref, gpointer ptr)
{
NodeData * data;
- GtkCTreeNode * before;
+ GtkTreeIter before;
data = (NodeData *) ptr;
if (data->tree->blocked) return;
- before = ref_to_sibling (data->node, ref);
+ ref_to_sibling (data, ref, &before);
- add_node (data->tree, data->node, before, child);
+ GtkTreeIter data_iter;
+ tree_ref_to_iter(data->tree, &data_iter, data->rowref);
+ add_node (data->tree, &data_iter, &before, child);
}
void
@@ -285,7 +295,10 @@ element_attr_changed (Inkscape::XML::Node * repr, const gchar * key, const gchar
} else {
label = g_strdup_printf ("<%s>", repr->name());
}
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
g_free (label);
}
@@ -293,30 +306,34 @@ void
element_child_removed (Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node * child, Inkscape::XML::Node * /*ref*/, gpointer ptr)
{
NodeData * data;
-
data = (NodeData *) ptr;
if (data->tree->blocked) return;
- gtk_ctree_remove_node (GTK_CTREE (data->tree), repr_to_child (data->node, child));
+ GtkTreeIter iter;
+ repr_to_child (data, child, &iter);
+ gtk_tree_store_remove (GTK_TREE_STORE(data->tree->store), &iter);
+
}
void
element_order_changed (Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node * child, Inkscape::XML::Node * /*oldref*/, Inkscape::XML::Node * newref, gpointer ptr)
{
NodeData * data;
- GtkCTreeNode * before, * node;
-
+ GtkTreeIter before, node;
data = (NodeData *) ptr;
if (data->tree->blocked) return;
- before = ref_to_sibling (data->node, newref);
- node = repr_to_child (data->node, child);
-
- if ( before == node ) before = GTK_CTREE_ROW (before)->sibling;
+ ref_to_sibling (data, newref, &before);
+ repr_to_child (data, child, &node);
- parent_class->tree_move (GTK_CTREE (data->tree), node, data->node, before);
+ if (gtk_tree_store_iter_is_valid(data->tree->store, &before)) {
+ gtk_tree_store_move_before (data->tree->store, &node, &before);
+ } else {
+ repr_to_child (data, newref, &before);
+ gtk_tree_store_move_after (data->tree->store, &node, &before);
+ }
}
void
@@ -330,7 +347,10 @@ text_content_changed (Inkscape::XML::Node * /*repr*/, const gchar * /*old_conten
if (data->tree->blocked) return;
label = g_strdup_printf ("\"%s\"", new_content);
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
+
g_free (label);
}
@@ -345,7 +365,10 @@ comment_content_changed (Inkscape::XML::Node */*repr*/, const gchar * /*old_cont
if (data->tree->blocked) return;
label = g_strdup_printf ("<!--%s-->", new_content);
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
+
g_free (label);
}
@@ -360,102 +383,339 @@ pi_content_changed(Inkscape::XML::Node *repr, const gchar * /*old_content*/, con
if (data->tree->blocked) return;
label = g_strdup_printf ("<?%s %s?>", repr->name(), new_content);
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
+
g_free (label);
}
-void
-tree_move (GtkCTree * tree, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * new_sibling)
+
+/*
+ * Save the source path on drag start, will need it in on_row_changed() when moving a row
+ */
+void on_drag_data_received(GtkWidget * /*wgt*/, GdkDragContext * /*context*/, int /*x*/, int /*y*/,
+ GtkSelectionData * /*seldata*/, guint /*info*/, guint /*time*/,
+ gpointer userdata)
{
- GtkCTreeNode * old_parent;
- Inkscape::XML::Node * ref;
+ SPXMLViewTree *tree = static_cast<SPXMLViewTree *>(userdata);
+ if (!tree) {
+ return;
+ }
+
+ if (tree->dndactive) {
+ return;
+ }
+
+ GtkTreeModel *model = 0;
+ GtkTreeIter iter;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+
+ tree->dndactive = TRUE;
+
+ GtkTreeIter parent_iter;
+ GtkTreeRowReference *parent_ref = NULL;
+ if (gtk_tree_model_iter_parent(model, &parent_iter, &iter)) {
+ parent_ref = tree_iter_to_ref (tree, &parent_iter);
+ }
+
+ g_object_set_data(G_OBJECT(tree), "drag-src-path", parent_ref);
+ }
+}
- old_parent = GTK_CTREE_ROW (node)->parent;
- if ( !old_parent || !new_parent ) return;
+/*
+ * Main drag & drop function
+ * Get the old and new paths, and change the Inkscape::XML::Node repr's
+ */
+void on_row_changed(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
+{
+ SPXMLViewTree *tree = (SPXMLViewTree *)user_data;
+
+ if (!tree->dndactive) {
+ return;
+ }
+ tree->dndactive = FALSE;
+
+ Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(tree), iter);
+ GtkTreeIter new_parent;
+ if (!gtk_tree_model_iter_parent(tree_model, &new_parent, iter)) {
+ //No parent of drop location
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(0) );
+ return;
+ }
+
+ GtkTreeRowReference *old_parent_ref = (GtkTreeRowReference *)g_object_get_data (G_OBJECT (tree), "drag-src-path");
+ if (!old_parent_ref) {
+ //No drag source location
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(0) );
+ return;
+ }
+
+ GtkTreeIter old_parent;
+ tree_ref_to_iter(tree, &old_parent, old_parent_ref);
+ if (!gtk_tree_store_iter_is_valid(GTK_TREE_STORE(tree_model), &old_parent)){
+ //Drag source parent is not valid
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(0) );
+ return;
+ }
+
+ // Find the sibling node before iter
+ GtkTreeIter before_iter;
+ Inkscape::XML::Node *before_repr = NULL;
+ GtkTreeIter tmp_iter;
+
+ gboolean valid = gtk_tree_model_iter_children(tree_model, &tmp_iter, &new_parent);
+ while (valid && tree_model_iter_compare (tree_model, &tmp_iter, iter)) {
+ before_iter = tmp_iter;
+ valid = gtk_tree_model_iter_next(tree_model, &tmp_iter);
+ }
+
+ // If before_iter is invalid, before_repr stays as NULL which is ok
+ if (gtk_tree_store_iter_is_valid(GTK_TREE_STORE(tree_model), &before_iter)) {
+ gtk_tree_model_get (tree_model, &before_iter, STORE_REPR_COL, &before_repr, -1);
+ }
+
+ // Drop onto oneself causes assert in changeOrder() below, ignore
+ if (repr == before_repr)
+ return;
+
+ SP_XMLVIEW_TREE (tree)->blocked++;
+ if (!tree_model_iter_compare (tree_model, &new_parent, &old_parent)) {
+ sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(tree), &old_parent)->changeOrder(repr, before_repr);
+ } else {
+ sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(tree), &old_parent)->removeChild(repr);
+ sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(tree), &new_parent)->addChild(repr, before_repr);
+ }
+ SP_XMLVIEW_TREE (tree)->blocked--;
+
+ // Reselect the dragged row
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW(tree), path);
+ //gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(tree), path, NULL, true, 0.66, 0.0);
+ gtk_tree_selection_select_iter(selection, iter);
+
+ // Signal that a drag and drop has completed successfully
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(1) );
+}
- ref = sibling_to_ref (new_parent, new_sibling);
+/*
+ * Set iter to ref or node data's child with the same repr or first child
+ */
+void ref_to_sibling (NodeData *data, Inkscape::XML::Node *repr, GtkTreeIter *iter)
+{
+ if (repr) {
+ repr_to_child (data, repr, iter);
+ gtk_tree_model_iter_next (GTK_TREE_MODEL(data->tree->store), iter);
+ } else {
+ GtkTreeIter data_iter;
+ tree_ref_to_iter(data->tree, &data_iter, data->rowref);
+ gtk_tree_model_iter_children(GTK_TREE_MODEL(data->tree->store), iter, &data_iter);
+ }
+}
- gtk_clist_freeze (GTK_CLIST (tree));
+/*
+ * Set iter to the node data's child with the same repr
+ */
+void repr_to_child (NodeData *data, Inkscape::XML::Node * repr, GtkTreeIter *iter)
+{
+ GtkTreeIter data_iter;
+ tree_ref_to_iter(data->tree, &data_iter, data->rowref);
- SP_XMLVIEW_TREE (tree)->blocked++;
- if (new_parent == old_parent) {
- NODE_DATA (old_parent)->repr->changeOrder(NODE_DATA (node)->repr, ref);
- } else {
- NODE_DATA (old_parent)->repr->removeChild(NODE_DATA (node)->repr);
- NODE_DATA (new_parent)->repr->addChild(NODE_DATA (node)->repr, ref);
+ gboolean valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(data->tree->store), iter, &data_iter);
+ while (valid && sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(data->tree), iter) != repr) {
+ valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(data->tree->store), iter);
}
- SP_XMLVIEW_TREE (tree)->blocked--;
+}
- parent_class->tree_move (tree, node, new_parent, new_sibling);
+/*
+ * Get a matching GtkTreeRowReference for a GtkTreeIter
+ */
+GtkTreeRowReference *tree_iter_to_ref (SPXMLViewTree * tree, GtkTreeIter* iter)
+{
+ GtkTreePath* path = gtk_tree_model_get_path(GTK_TREE_MODEL(tree->store), iter);
+ GtkTreeRowReference *ref = gtk_tree_row_reference_new(GTK_TREE_MODEL(tree->store), path);
+ gtk_tree_path_free(path);
- gtk_clist_thaw (GTK_CLIST (tree));
+ return ref;
}
-GtkCTreeNode *
-ref_to_sibling (GtkCTreeNode * parent, Inkscape::XML::Node * ref)
+/*
+ * Get a matching GtkTreeIter for a GtkTreeRowReference
+ */
+void tree_ref_to_iter (SPXMLViewTree * tree, GtkTreeIter* iter, GtkTreeRowReference *ref)
{
- if (ref) {
- GtkCTreeNode * before;
- before = repr_to_child (parent, ref);
- g_assert (before != NULL);
- before = GTK_CTREE_ROW (before)->sibling;
- return before;
- } else {
- return GTK_CTREE_ROW (parent)->children;
- }
+ GtkTreePath* path = gtk_tree_row_reference_get_path(ref);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(tree->store), iter, path);
}
-GtkCTreeNode *
-repr_to_child (GtkCTreeNode * parent, Inkscape::XML::Node * repr)
+/*
+ * Compare 2 GtkTreeIter and return 0 if they are equal
+ */
+gboolean tree_model_iter_compare(GtkTreeModel* store, GtkTreeIter * iter1, GtkTreeIter * iter2)
{
- GtkCTreeNode * child;
- child = GTK_CTREE_ROW (parent)->children;
- while ( child && NODE_DATA (child)->repr != repr ) {
- child = GTK_CTREE_ROW (child)->sibling;
- }
- return child;
+ GtkTreePath *path1 = gtk_tree_model_get_path(store, iter1);
+ GtkTreePath *path2 = gtk_tree_model_get_path(store, iter2);
+
+ gboolean result = gtk_tree_path_compare( path1, path2);
+
+ gtk_tree_path_free(path1);
+ gtk_tree_path_free(path2);
+
+ return result;
+
}
+/*
+ * Return the node of parent iter's child sibling or NULL if sibling is the first child
+ */
Inkscape::XML::Node *
-sibling_to_ref (GtkCTreeNode * parent, GtkCTreeNode * sibling)
+sibling_to_ref (GtkTreeView * tree, GtkTreeIter * parent, GtkTreeIter * sibling)
{
- GtkCTreeNode * child;
- child = GTK_CTREE_ROW (parent)->children;
- if ( child == sibling ) return NULL;
- while ( child && GTK_CTREE_ROW (child)->sibling != sibling ) {
- child = GTK_CTREE_ROW (child)->sibling;
+ GtkTreeIter child;
+ GtkTreeModel* store = gtk_tree_view_get_model(tree);
+
+ gboolean valid = gtk_tree_model_iter_children(store, &child, parent);
+
+ if (! tree_model_iter_compare(store, &child, sibling)) {
+ return NULL;
}
- return NODE_DATA (child)->repr;
-}
-gboolean
-check_drag (GtkCTree * /*tree*/, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * /*new_sibling*/)
-{
- GtkCTreeNode * old_parent;
+ while (valid && tree_model_iter_compare(store, &child, sibling)) {
+ valid = gtk_tree_model_iter_next(store, &child);
+ }
- old_parent = GTK_CTREE_ROW (node)->parent;
+ if (!gtk_tree_store_iter_is_valid(GTK_TREE_STORE(store), &child)) {
+ return NULL;
+ }
- if (!old_parent || !new_parent) return FALSE;
- if (NODE_DATA (new_parent)->repr->type() != Inkscape::XML::ELEMENT_NODE) return FALSE;
+ return sp_xmlview_tree_node_get_repr (tree, &child);
+}
- /* fixme: we need add_child/remove_child/etc repr events without side-effects, so we can check here and give better visual feedback */
+/*
+ * Disable drag and drop target on : root node and non-element nodes
+ */
+gboolean do_drag_motion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time, gpointer user_data)
+{
+ GtkTreePath *path = NULL;
+ GtkTreeViewDropPosition pos;
+ gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(widget), x, y, &path, &pos);
+
+ int action = 0;
+
+ if (path) {
+ action = GDK_ACTION_MOVE;
+
+ SPXMLViewTree *tree = (SPXMLViewTree *)user_data;
+ GtkTreeIter iter;
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(tree->store), &iter, path);
+ if (sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(widget), &iter)->type() != Inkscape::XML::ELEMENT_NODE) {
+ action = 0;
+ }
+
+ if (!gtk_tree_path_up(path)) {
+ action = 0;
+ }
+ if (!gtk_tree_path_up(path)) {
+ action = 0;
+ }
+ if (!path) {
+ action = 0;
+ }
+ }
+
+ gtk_tree_path_free(path);
+ gdk_drag_status (context, (GdkDragAction)action, time);
+
+ return (action == 0);
+}
- return TRUE;
+/*
+ * Set the tree selection and scroll to the row with the given repr
+ */
+void
+sp_xmlview_tree_set_repr (SPXMLViewTree * tree, Inkscape::XML::Node * repr)
+{
+ if ( tree->repr == repr ) return;
+ if (tree->repr) {
+ gtk_tree_store_clear(tree->store);
+ Inkscape::GC::release(tree->repr);
+ }
+ tree->repr = repr;
+ if (repr) {
+ GtkTreeRowReference * rowref;
+ Inkscape::GC::anchor(repr);
+ rowref = add_node (tree, NULL, NULL, repr);
+ GtkTreePath *path = gtk_tree_row_reference_get_path(rowref);
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW(tree), path);
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(tree), path, NULL, true, 0.5, 0.0);
+ gtk_tree_path_free(path);
+ }
}
+/*
+ * Return the repr at a given GtkTreeIter position
+ */
Inkscape::XML::Node *
-sp_xmlview_tree_node_get_repr (SPXMLViewTree * /*tree*/, GtkCTreeNode * node)
+sp_xmlview_tree_node_get_repr (GtkTreeView *tree, GtkTreeIter * iter)
{
- return NODE_DATA (node)->repr;
+ Inkscape::XML::Node *repr;
+ GtkTreeModel *model = gtk_tree_view_get_model(tree);
+ gtk_tree_model_get (model, iter, STORE_REPR_COL, &repr, -1);
+
+ return repr;
}
-GtkCTreeNode *
-sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr)
+
+/*
+ * Find a GtkTreeIter position in the tree by repr
+ */
+gboolean
+sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr, GtkTreeIter *iter)
{
- return gtk_ctree_find_by_row_data_custom (GTK_CTREE (tree), NULL, repr, match_node_data_by_repr);
+ /*
+ * Use a NodeData here to pass in the repr to the foreach function and store a rowref if found,
+ * if found we can return the iter
+ */
+ NodeData anode;
+ anode.tree = tree;
+ anode.repr = repr;
+ anode.rowref = NULL;
+
+ gtk_tree_model_foreach(GTK_TREE_MODEL(tree->store), foreach_func, &anode);
+ if (anode.rowref != NULL) {
+ tree_ref_to_iter(tree, iter, anode.rowref);
+ return TRUE;
+ }
+
+ return FALSE;
}
-gint
-match_node_data_by_repr(gconstpointer data_p, gconstpointer repr)
+gboolean foreach_func(GtkTreeModel *model, GtkTreePath * /*path*/, GtkTreeIter *iter, gpointer user_data)
{
- return ((const NodeData *)data_p)->repr != (const Inkscape::XML::Node *)repr;
+ NodeData *anode = static_cast<NodeData *>(user_data);
+ Inkscape::XML::Node *iter_repr;
+ gtk_tree_model_get (model, iter, STORE_REPR_COL, &iter_repr, -1);
+ if (anode->repr == iter_repr) {
+ GtkTreeRowReference *rowref = tree_iter_to_ref (anode->tree, iter);
+ anode->rowref = rowref;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*
+ * Callback function for string searches in the tree
+ * Return a match on any substring
+ */
+gboolean search_equal_func(GtkTreeModel *model, gint /*column*/, const gchar *key, GtkTreeIter *iter, gpointer /*search_data*/)
+{
+ gchar *text = 0;
+ gtk_tree_model_get(model, iter, STORE_TEXT_COL, &text, -1);
+
+ gboolean match = (strstr(text, key) != NULL);
+
+ g_free(text);
+
+ return !match;
}
diff --git a/src/widgets/sp-xmlview-tree.h b/src/widgets/sp-xmlview-tree.h
index 5d228f982..36b76f5d9 100644
--- a/src/widgets/sp-xmlview-tree.h
+++ b/src/widgets/sp-xmlview-tree.h
@@ -2,7 +2,7 @@
#define __SP_XMLVIEW_TREE_H__
/*
- * Specialization of GtkCTree for the XML editor
+ * Specialization of GtkTreeView for the XML editor
*
* Authors:
* MenTaLguY <mental@rydia.net>
@@ -29,15 +29,16 @@ struct SPXMLViewTreeClass;
struct SPXMLViewTree
{
- GtkCTree tree;
-
+ GtkTreeView tree;
+ GtkTreeStore *store;
Inkscape::XML::Node * repr;
gint blocked;
+ gboolean dndactive;
};
struct SPXMLViewTreeClass
{
- GtkCTreeClass parent_class;
+ GtkTreeViewClass parent_class;
};
GType sp_xmlview_tree_get_type (void);
@@ -47,9 +48,8 @@ GtkWidget * sp_xmlview_tree_new (Inkscape::XML::Node * repr, void * factory, voi
void sp_xmlview_tree_set_repr (SPXMLViewTree * tree, Inkscape::XML::Node * repr);
-Inkscape::XML::Node * sp_xmlview_tree_node_get_repr (SPXMLViewTree * tree, GtkCTreeNode * node);
-GtkCTreeNode * sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr);
-
+Inkscape::XML::Node * sp_xmlview_tree_node_get_repr (GtkTreeView * tree, GtkTreeIter * node);
+gboolean sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr, GtkTreeIter *node);
#endif
diff --git a/src/widgets/stroke-marker-selector.cpp b/src/widgets/stroke-marker-selector.cpp
index a39ebf8be..9b2c3bb42 100644
--- a/src/widgets/stroke-marker-selector.cpp
+++ b/src/widgets/stroke-marker-selector.cpp
@@ -177,14 +177,21 @@ const gchar * MarkerComboBox::get_active_marker_uri()
gchar const *marker = "";
if (strcmp(markid, "none")) {
- bool stockid = get_active()->get_value(marker_columns.isstock);
-
- gchar *markurn = g_strdup(markid);
- if (stockid) markurn = g_strconcat("urn:inkscape:marker:",markid,NULL);
- SPObject *mark = get_stock_item(markurn);
- g_free(markurn);
- if (mark) {
- Inkscape::XML::Node *repr = mark->getRepr();
+ bool stockid = get_active()->get_value(marker_columns.isstock);
+
+ gchar *markurn;
+ if (stockid)
+ {
+ markurn = g_strconcat("urn:inkscape:marker:",markid,NULL);
+ }
+ else
+ {
+ markurn = g_strdup(markid);
+ }
+ SPObject *mark = get_stock_item(markurn);
+ g_free(markurn);
+ if (mark) {
+ Inkscape::XML::Node *repr = mark->getRepr();
marker = g_strconcat("url(#", repr->attribute("id"), ")", NULL);
}
} else {
@@ -211,7 +218,7 @@ void MarkerComboBox::set_selected(const gchar *name) {
iter != marker_store->children().end(); ++iter) {
Gtk::TreeModel::Row row = (*iter);
if (row[marker_columns.marker] &&
- !strcmp(row[marker_columns.marker], name)) {
+ !strcmp(row[marker_columns.marker], name)) {
set_active(iter);
if (strcmp(name, "none"))
set_history(row);
@@ -373,15 +380,13 @@ MarkerComboBox::create_marker_image(unsigned psize, gchar const *mname,
}
/* Update to renderable state */
- double sf = 0.8;
-
gchar *cache_name = g_strconcat(combo_id, mname, NULL);
Glib::ustring key = svg_preview_cache.cache_key(source->getURI(), cache_name, psize);
g_free (cache_name);
Glib::RefPtr<Gdk::Pixbuf> pixbuf = Glib::wrap(svg_preview_cache.get_preview_from_cache(key));
if (!pixbuf) {
- pixbuf = Glib::wrap(render_pixbuf(drawing, sf, *dbox, psize));
+ pixbuf = Glib::wrap(render_pixbuf(drawing, 0.8, *dbox, psize));
svg_preview_cache.set_preview_in_cache(key, pixbuf->gobj());
}
@@ -405,7 +410,7 @@ void MarkerComboBox::prepareImageRenderer( Gtk::TreeModel::const_iterator const
image_renderer.property_pixbuf() = empty_image->get_pixbuf();
}
-gboolean MarkerComboBox::separator_cb (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) {
+gboolean MarkerComboBox::separator_cb (GtkTreeModel *model, GtkTreeIter *iter, gpointer /*data*/) {
gboolean sep = FALSE;
gtk_tree_model_get(model, iter, 5, &sep, -1);
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 38a581cdc..58c7958ba 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -113,6 +113,10 @@
#include "toolbox.h"
#include <gtk/gtk.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#endif
+
//#define DEBUG_TEXT
using Inkscape::UnitTracker;
@@ -860,7 +864,7 @@ GtkWidget * sp_toolbox_button_new_from_verb_with_doubleclick(GtkWidget *t, Inksc
unsigned int shortcut = sp_shortcut_get_primary(verb);
- if (shortcut != GDK_VoidSymbol) {
+ if (shortcut != GDK_KEY_VoidSymbol) {
gchar *key = sp_shortcut_get_label(shortcut);
gchar *tip = g_strdup_printf ("%s (%s)", action->tip, key);
if ( t ) {
@@ -1058,14 +1062,24 @@ static GtkWidget* toolboxNewCommon( GtkWidget* tb, BarId id, GtkPositionType han
GtkWidget *ToolboxFactory::createToolToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_TOOL, GTK_POS_TOP );
}
GtkWidget *ToolboxFactory::createAuxToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_AUX, GTK_POS_LEFT );
}
@@ -1076,14 +1090,24 @@ GtkWidget *ToolboxFactory::createAuxToolbox()
GtkWidget *ToolboxFactory::createCommandsToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_COMMANDS, GTK_POS_LEFT );
}
GtkWidget *ToolboxFactory::createSnapToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_SNAP, GTK_POS_LEFT );
}
@@ -3091,7 +3115,12 @@ static void sp_stb_defaults( GtkWidget * /*widget*/, GObject *dataKludge )
// public:
void sp_toolbox_add_label(GtkWidget *tbl, gchar const *title, bool wide)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *boxl = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(boxl), FALSE);
+#else
GtkWidget *boxl = gtk_hbox_new(FALSE, 0);
+#endif
if (wide) {
gtk_widget_set_size_request(boxl, MODE_LABEL_WIDTH, -1);
}
diff --git a/src/xml/repr-css.cpp b/src/xml/repr-css.cpp
index 4fb1223de..19f3f1d6c 100644
--- a/src/xml/repr-css.cpp
+++ b/src/xml/repr-css.cpp
@@ -89,6 +89,77 @@ SPCSSAttr *sp_repr_css_attr(Node *repr, gchar const *attr)
return css;
}
+
+/**
+ * Attempt to parse the passed string as a hexadecimal RGB or RGBA color.
+ * @param text The Glib::ustring to parse
+ * @return New CSS style representation if the parsing was successful, NULL otherwise
+ */
+SPCSSAttr *sp_repr_css_attr_parse_color_to_fill(const Glib::ustring &text)
+{
+// TODO reuse existing code instead of replicating here.
+ Glib::ustring::size_type len = text.bytes();
+ char *str = const_cast<char *>(text.data());
+ bool attempt_alpha = false;
+ if ( !str || ( *str == '\0' ) ) {
+ return NULL; // this is OK due to boolean short-circuit
+ }
+
+ // those conditionals guard against parsing e.g. the string "fab" as "fab000"
+ // (incomplete color) and "45fab71" as "45fab710" (incomplete alpha)
+ if ( *str == '#' ) {
+ if ( len < 7 ) {
+ return NULL;
+ }
+ if ( len >= 9 ) {
+ attempt_alpha = true;
+ }
+ } else {
+ if ( len < 6 ) {
+ return NULL;
+ }
+ if ( len >= 8 ) {
+ attempt_alpha = true;
+ }
+ }
+
+ unsigned int color = 0, alpha = 0xff;
+
+ // skip a leading #, if present
+ if ( *str == '#' ) {
+ ++str;
+ }
+
+ // try to parse first 6 digits
+ int res = sscanf(str, "%6x", &color);
+ if ( res && ( res != EOF ) ) {
+ if (attempt_alpha) {// try to parse alpha if there's enough characters
+ sscanf(str + 6, "%2x", &alpha);
+ if ( !res || res == EOF ) {
+ alpha = 0xff;
+ }
+ }
+
+ SPCSSAttr *color_css = sp_repr_css_attr_new();
+
+ // print and set properties
+ gchar color_str[16];
+ g_snprintf(color_str, 16, "#%06x", color);
+ sp_repr_css_set_property(color_css, "fill", color_str);
+
+ float opacity = static_cast<float>(alpha)/static_cast<float>(0xff);
+ if (opacity > 1.0) {
+ opacity = 1.0; // safeguard
+ }
+ Inkscape::CSSOStringStream opcss;
+ opcss << opacity;
+ sp_repr_css_set_property(color_css, "fill-opacity", opcss.str().data());
+ return color_css;
+ }
+ return NULL;
+}
+
+
/**
* Adds an attribute to an existing SPCSAttr with the cascaded value including all parents.
*/
diff --git a/src/xml/repr.h b/src/xml/repr.h
index 3eee45385..86a798e3e 100644
--- a/src/xml/repr.h
+++ b/src/xml/repr.h
@@ -70,6 +70,7 @@ bool sp_repr_save_rebased_file(Inkscape::XML::Document *doc, gchar const *filena
SPCSSAttr *sp_repr_css_attr_new(void);
void sp_repr_css_attr_unref(SPCSSAttr *css);
SPCSSAttr *sp_repr_css_attr(Inkscape::XML::Node *repr, gchar const *attr);
+SPCSSAttr *sp_repr_css_attr_parse_color_to_fill(const Glib::ustring &text);
SPCSSAttr *sp_repr_css_attr_inherited(Inkscape::XML::Node *repr, gchar const *attr);
gchar const *sp_repr_css_property(SPCSSAttr *css, gchar const *name, gchar const *defval);
diff --git a/src/xml/simple-document.h b/src/xml/simple-document.h
index ff1d94b0c..7cbe50dda 100644
--- a/src/xml/simple-document.h
+++ b/src/xml/simple-document.h
@@ -66,7 +66,8 @@ public:
protected:
SimpleDocument(SimpleDocument const &doc)
: Node(), SimpleNode(doc), Document(), NodeObserver(),
- _in_transaction(false) {}
+ _in_transaction(false),
+ _is_CData(false){}
SimpleNode *_duplicate(Document* /*doc*/) const
{
diff --git a/src/zoom-context.cpp b/src/zoom-context.cpp
index 45de37652..6676733d7 100644
--- a/src/zoom-context.cpp
+++ b/src/zoom-context.cpp
@@ -25,6 +25,16 @@
#include "zoom-context.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Up 0xff52
+#define GDK_KEY_Down 0xff54
+#define GDK_KEY_KP_Up 0xff97
+#define GDK_KEY_KP_Down 0xff99
+#define GDK_KEY_Shift_L 0xffe1
+#define GDK_KEY_Shift_R 0xffe2
+#endif
+
static void sp_zoom_context_class_init(SPZoomContextClass *klass);
static void sp_zoom_context_init(SPZoomContext *zoom_context);
static void sp_zoom_context_setup(SPEventContext *ec);
@@ -215,22 +225,22 @@ static gint sp_zoom_context_root_handler(SPEventContext *event_context, GdkEvent
}
case GDK_KEY_PRESS:
switch (get_group0_keyval (&event->key)) {
- case GDK_Escape:
+ case GDK_KEY_Escape:
Inkscape::Rubberband::get(desktop)->stop();
xp = yp = 0;
escaped = true;
ret = TRUE;
break;
- case GDK_Up:
- case GDK_Down:
- case GDK_KP_Up:
- case GDK_KP_Down:
+ case GDK_KEY_Up:
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Up:
+ case GDK_KEY_KP_Down:
// prevent the zoom field from activation
if (!MOD__CTRL_ONLY)
ret = TRUE;
break;
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
event_context->cursor_shape = cursor_zoom_out_xpm;
sp_event_context_update_cursor(event_context);
break;
@@ -240,8 +250,8 @@ static gint sp_zoom_context_root_handler(SPEventContext *event_context, GdkEvent
break;
case GDK_KEY_RELEASE:
switch (get_group0_keyval (&event->key)) {
- case GDK_Shift_L:
- case GDK_Shift_R:
+ case GDK_KEY_Shift_L:
+ case GDK_KEY_Shift_R:
event_context->cursor_shape = cursor_zoom_xpm;
sp_event_context_update_cursor(event_context);
break;