/[svn]/gigedit/trunk/src/gigedit/global.h
ViewVC logotype

Contents of /gigedit/trunk/src/gigedit/global.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3155 - (show annotations) (download) (as text)
Sun May 7 15:32:43 2017 UTC (2 years, 6 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 7444 byte(s)
* Macro Editor: implemented reverse selected deletion of rows
* Macro Editor: Fixed "modified" state not being updated after
  clicking on "Apply" button.
* Macro Editor: Show implemented keyboard accelerators as
  symbols on the "Delete" (Ctrl+Del) and "Inverse Delete"
  (Alt+Del) buttons.
* Bumped version (1.0.0.svn37).

1 /* -*- c++ -*-
2 * Copyright (C) 2007-2017 Andreas Persson
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with program; see the file COPYING. If not, write to the Free
16 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17 * 02110-1301 USA.
18 */
19
20 #ifndef GIGEDIT_GLOBAL_H
21 #define GIGEDIT_GLOBAL_H
22
23 #if HAVE_CONFIG_H
24 # include <config.h>
25 #endif
26
27 #include <cstring>
28
29 #include <glibmmconfig.h>
30 // threads.h must be included first to be able to build with
31 // G_DISABLE_DEPRECATED
32 #if (GLIBMM_MAJOR_VERSION == 2 && GLIBMM_MINOR_VERSION == 31 && GLIBMM_MICRO_VERSION >= 2) || \
33 (GLIBMM_MAJOR_VERSION == 2 && GLIBMM_MINOR_VERSION > 31) || GLIBMM_MAJOR_VERSION > 2
34 #include <glibmm/threads.h>
35 #endif
36
37 #if !defined(WIN32)
38 # include <unistd.h>
39 # include <errno.h>
40 #endif
41
42 #include <sstream>
43 #include <map>
44
45 #ifdef LIBGIG_HEADER_FILE
46 # include LIBGIG_HEADER_FILE(gig.h)
47 #else
48 # include <gig.h>
49 #endif
50
51 //FIXME: for some reason AC GETTEXT check fails on the Mac cross compiler?
52 #if (HAVE_GETTEXT || defined(__APPLE__))
53 # include <libintl.h>
54 # define _(String) gettext(String)
55 #else
56 # define _(String) String
57 #endif
58
59 #if defined(WIN32) && !HAVE_CONFIG_H
60 # include "../../win32/libgigedit_private.h" // like config.h, automatically generated by Dev-C++
61 # define PACKAGE "gigedit"
62 # define VERSION VER_STRING // VER_STRING defined in libgig_private.h
63 #endif // WIN32
64
65 #define UNICODE_RIGHT_ARROW Glib::ustring(1, gunichar(0x2192))
66 #define UNICODE_LEFT_ARROW Glib::ustring(1, gunichar(0x2190))
67 #define UNICODE_SHIFT_KEY_SYMBOL Glib::ustring("\xe2\x87\xa7")
68 #if defined(__APPLE__)
69 # define UNICODE_ALT_KEY_SYMBOL Glib::ustring("\xe2\x8c\xa5")
70 #else
71 # define UNICODE_ALT_KEY_SYMBOL Glib::ustring("Alt")
72 #endif
73 #define UNICODE_ERASE_KEY_SYMBOL Glib::ustring("\xe2\x8c\xab")
74 #define UNICODE_CTRL_KEY_SYMBOL Glib::ustring("Ctrl")
75 #define UNICODE_CMD_KEY_SYMBOL Glib::ustring(1, gunichar(0x2318))
76 #if defined(__APPLE__)
77 # define UNICODE_PRIMARY_KEY_SYMBOL UNICODE_CMD_KEY_SYMBOL
78 #else
79 # define UNICODE_PRIMARY_KEY_SYMBOL UNICODE_CTRL_KEY_SYMBOL
80 #endif
81
82 // taken from gdk/gdkkeysyms.h
83 // (define on demand, to avoid unnecessary dev lib package build dependency)
84 #ifndef GDK_KEY_Control_L
85 # define GDK_KEY_Control_L 0xffe3
86 #endif
87 #ifndef GDK_KEY_Control_R
88 # define GDK_KEY_Control_R 0xffe4
89 #endif
90 #ifndef GDK_KEY_Left
91 # define GDK_KEY_Left 0xff51
92 #endif
93 #ifndef GDK_KEY_Right
94 # define GDK_KEY_Right 0xff53
95 #endif
96 #ifndef GDK_KEY_Up
97 # define GDK_KEY_Up 0xff52
98 #endif
99 #ifndef GDK_KEY_Down
100 # define GDK_KEY_Down 0xff54
101 #endif
102
103 #include <glibmm/convert.h>
104
105 #define GIG_STR_ENCODING "CP1252"
106
107 static inline
108 Glib::ustring gig_to_utf8(const gig::String& gig_string) {
109 return Glib::convert_with_fallback(gig_string, "UTF-8", GIG_STR_ENCODING, "?");
110 }
111
112 static inline
113 gig::String gig_from_utf8(const Glib::ustring& utf8_string) {
114 return Glib::convert_with_fallback(utf8_string, GIG_STR_ENCODING, "UTF-8", "?");
115 }
116
117 template<class T> inline std::string ToString(T o) {
118 std::stringstream ss;
119 ss << o;
120 return ss.str();
121 }
122
123 inline int getDimensionIndex(gig::dimension_t type, gig::Region* rgn) {
124 for (uint i = 0; i < rgn->Dimensions; ++i)
125 if (rgn->pDimensionDefinitions[i].dimension == type)
126 return i;
127 return -1;
128 }
129
130 inline int getDimensionRegionIndex(gig::DimensionRegion* dr) {
131 if (!dr) return -1;
132 gig::Region* rgn = (gig::Region*)dr->GetParent();
133 for (uint i = 0; i < 256; ++i)
134 if (rgn->pDimensionRegions[i] == dr)
135 return i;
136 return -1;
137 }
138
139 /// Find the number of bits required to hold the specified amount of zones.
140 inline int zoneCountToBits(int nZones) {
141 if (!nZones) return 0;
142 int iFinalBits = 0;
143 int zoneBits = nZones - 1;
144 for (; zoneBits > 1; iFinalBits += 2, zoneBits >>= 2);
145 iFinalBits += zoneBits;
146 return iFinalBits;
147 }
148
149 /**
150 * Returns the sum of all bits of all dimensions defined before the given
151 * dimensions (@a type). This allows to access cases of that particular
152 * dimension directly. If the supplied dimension @a type does not exist in the
153 * the supplied @a region, then this function returns -1 instead!
154 *
155 * @param type - dimension that shall be used
156 * @param rgn - parent region of that dimension
157 */
158 inline int baseBits(gig::dimension_t type, gig::Region* rgn) {
159 int previousBits = 0;
160 for (uint i = 0; i < rgn->Dimensions; ++i) {
161 if (rgn->pDimensionDefinitions[i].dimension == type) return previousBits;
162 previousBits += rgn->pDimensionDefinitions[i].bits;
163 }
164 return -1;
165 }
166
167 // key: dimension type, value: dimension's zone index
168 class DimensionCase : public std::map<gig::dimension_t,int> {
169 public:
170 bool isViolating(const DimensionCase& c) const {
171 for (DimensionCase::const_iterator it = begin(); it != end(); ++it) {
172 if (c.find(it->first) == c.end()) continue;
173 if (c.find(it->first)->second != it->second) return true;
174 }
175 return false;
176 }
177
178 // prevent passing gig::dimension_none from creating a new pair
179 // (TODO: other invalid gig::dimension_t values should be filtered here as well)
180 int& operator[](const gig::dimension_t& k) {
181 static int unused = 0;
182 if (k == gig::dimension_none) {
183 unused = 0;
184 return unused;
185 }
186 return std::map<gig::dimension_t,int>::operator[](k);
187 }
188 };
189
190 //TODO: this function and caseOfDimRegion() from dimregionchooser.h are duplicates, eliminate either one of them!
191 inline DimensionCase dimensionCaseOf(gig::DimensionRegion* dr) {
192 DimensionCase dimCase;
193 int idr = getDimensionRegionIndex(dr);
194 if (idr < 0) return dimCase;
195 gig::Region* rgn = (gig::Region*)dr->GetParent();
196 int bitpos = 0;
197 for (int d = 0; d < rgn->Dimensions; ++d) {
198 const gig::dimension_def_t& dimdef = rgn->pDimensionDefinitions[d];
199 const int zone = (idr >> bitpos) & ((1 << dimdef.bits) - 1);
200 dimCase[dimdef.dimension] = zone;
201 bitpos += rgn->pDimensionDefinitions[d].bits;
202 }
203 return dimCase;
204 }
205
206 inline std::vector<gig::DimensionRegion*> dimensionRegionsMatching(const DimensionCase& dimCase, gig::Region* rgn) {
207 std::vector<gig::DimensionRegion*> v;
208 for (int idr = 0; idr < 256; ++idr) {
209 if (!rgn->pDimensionRegions[idr]) continue;
210 DimensionCase c = dimensionCaseOf(rgn->pDimensionRegions[idr]);
211 if (!dimCase.isViolating(c)) v.push_back(rgn->pDimensionRegions[idr]);
212 }
213 return v;
214 }
215
216 inline gig::DimensionRegion* dimensionRegionMatching(const DimensionCase& dimCase, gig::Region* rgn) {
217 for (int idr = 0; idr < 256; ++idr) {
218 if (!rgn->pDimensionRegions[idr]) continue;
219 DimensionCase c = dimensionCaseOf(rgn->pDimensionRegions[idr]);
220 if (c == dimCase) return rgn->pDimensionRegions[idr];
221 }
222 return NULL;
223 }
224
225 #endif // GIGEDIT_GLOBAL_H

  ViewVC Help
Powered by ViewVC