forked from thjaeger/easystroke
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gesture.h
124 lines (109 loc) · 3.98 KB
/
gesture.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
* Copyright (c) 2008-2009, Thomas Jaeger <ThJaeger@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef __GESTURE_H__
#define __GESTURE_H__
#include "stroke.h"
#include <gdkmm.h>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/version.hpp>
#include <boost/serialization/split_member.hpp>
#include <X11/X.h>
#define STROKE_SIZE 64
class Stroke;
class PreStroke;
typedef boost::shared_ptr<Stroke> RStroke;
typedef boost::shared_ptr<PreStroke> RPreStroke;
struct Triple {
float x;
float y;
Time t;
};
typedef boost::shared_ptr<Triple> RTriple;
void update_triple(RTriple e, float x, float y, Time t);
RTriple create_triple(float x, float y, Time t);
class PreStroke;
class Stroke {
friend class PreStroke;
friend class boost::serialization::access;
friend class Stats;
public:
struct Point {
double x;
double y;
Point operator+(const Point &p) {
Point sum = { x + p.x, y + p.y };
return sum;
}
Point operator-(const Point &p) {
Point sum = { x - p.x, y - p.y };
return sum;
}
Point operator*(const double a) {
Point product = { x * a, y * a };
return product;
}
template<class Archive> void serialize(Archive & ar, const unsigned int version) {
ar & x; ar & y;
if (version == 0) {
double time;
ar & time;
}
}
};
private:
Stroke(PreStroke &s, int trigger_, int button_, unsigned int modifiers_, bool timeout_);
Glib::RefPtr<Gdk::Pixbuf> draw_(int size, double width = 2.0, bool inv = false) const;
mutable Glib::RefPtr<Gdk::Pixbuf> pb[2];
static Glib::RefPtr<Gdk::Pixbuf> drawEmpty_(int);
static Glib::RefPtr<Gdk::Pixbuf> pbEmpty;
BOOST_SERIALIZATION_SPLIT_MEMBER()
template<class Archive> void load(Archive & ar, const unsigned int version);
template<class Archive> void save(Archive & ar, const unsigned int version) const;
public:
int trigger;
int button;
unsigned int modifiers;
bool timeout;
boost::shared_ptr<stroke_t> stroke;
Stroke() : trigger(0), button(0), modifiers(AnyModifier), timeout(false) {}
static RStroke create(PreStroke &s, int trigger_, int button_, unsigned int modifiers_, bool timeout_) {
return RStroke(new Stroke(s, trigger_, button_, modifiers_, timeout_));
}
Glib::RefPtr<Gdk::Pixbuf> draw(int size, double width = 2.0, bool inv = false) const;
void draw(Cairo::RefPtr<Cairo::Surface> surface, int x, int y, int w, int h, double width = 2.0, bool inv = false) const;
void draw_svg(std::string filename) const;
bool show_icon();
static RStroke trefoil();
static int compare(RStroke, RStroke, double &);
static Glib::RefPtr<Gdk::Pixbuf> drawEmpty(int);
static Glib::RefPtr<Gdk::Pixbuf> drawDebug(RStroke, RStroke, int);
unsigned int size() const { return stroke ? stroke_get_size(stroke.get()) : 0; }
bool trivial() const { return size() == 0 && button == 0; }
Point points(int n) const { Point p; stroke_get_point(stroke.get(), n, &p.x, &p.y); return p; }
double time(int n) const { return stroke_get_time(stroke.get(), n); }
bool is_timeout() const { return timeout; }
};
BOOST_CLASS_VERSION(Stroke, 5)
BOOST_CLASS_VERSION(Stroke::Point, 1)
class PreStroke : public std::vector<RTriple> {
public:
static RPreStroke create() { return RPreStroke(new PreStroke()); }
void add(RTriple p) { push_back(p); }
bool valid() const { return size() > 2; }
};
#endif