/[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 3157 - (show annotations) (download) (as text)
Mon May 8 17:30:10 2017 UTC (6 years, 10 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 7518 byte(s)
* Fixed potentially unhandled exceptions when app is loading
  its config file.
* WIP: Introduced user configurable list of macros which are
  auto assigned to keyboard accelerators (F1 ... F12) and
  saved along with the app's config file (added under new
  main menu bar section "Macro").
* Bumped version (1.0.0.svn38).

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 # include LIBGIG_HEADER_FILE(Serialization.h)
48 #else
49 # include <gig.h>
50 # include <Serialization.h>
51 #endif
52
53 //FIXME: for some reason AC GETTEXT check fails on the Mac cross compiler?
54 #if (HAVE_GETTEXT || defined(__APPLE__))
55 # include <libintl.h>
56 # define _(String) gettext(String)
57 #else
58 # define _(String) String
59 #endif
60
61 #if defined(WIN32) && !HAVE_CONFIG_H
62 # include "../../win32/libgigedit_private.h" // like config.h, automatically generated by Dev-C++
63 # define PACKAGE "gigedit"
64 # define VERSION VER_STRING // VER_STRING defined in libgig_private.h
65 #endif // WIN32
66
67 #define UNICODE_RIGHT_ARROW Glib::ustring(1, gunichar(0x2192))
68 #define UNICODE_LEFT_ARROW Glib::ustring(1, gunichar(0x2190))
69 #define UNICODE_SHIFT_KEY_SYMBOL Glib::ustring("\xe2\x87\xa7")
70 #if defined(__APPLE__)
71 # define UNICODE_ALT_KEY_SYMBOL Glib::ustring("\xe2\x8c\xa5")
72 #else
73 # define UNICODE_ALT_KEY_SYMBOL Glib::ustring("Alt")
74 #endif
75 #define UNICODE_ERASE_KEY_SYMBOL Glib::ustring("\xe2\x8c\xab")
76 #define UNICODE_CTRL_KEY_SYMBOL Glib::ustring("Ctrl")
77 #define UNICODE_CMD_KEY_SYMBOL Glib::ustring(1, gunichar(0x2318))
78 #if defined(__APPLE__)
79 # define UNICODE_PRIMARY_KEY_SYMBOL UNICODE_CMD_KEY_SYMBOL
80 #else
81 # define UNICODE_PRIMARY_KEY_SYMBOL UNICODE_CTRL_KEY_SYMBOL
82 #endif
83
84 // taken from gdk/gdkkeysyms.h
85 // (define on demand, to avoid unnecessary dev lib package build dependency)
86 #ifndef GDK_KEY_Control_L
87 # define GDK_KEY_Control_L 0xffe3
88 #endif
89 #ifndef GDK_KEY_Control_R
90 # define GDK_KEY_Control_R 0xffe4
91 #endif
92 #ifndef GDK_KEY_Left
93 # define GDK_KEY_Left 0xff51
94 #endif
95 #ifndef GDK_KEY_Right
96 # define GDK_KEY_Right 0xff53
97 #endif
98 #ifndef GDK_KEY_Up
99 # define GDK_KEY_Up 0xff52
100 #endif
101 #ifndef GDK_KEY_Down
102 # define GDK_KEY_Down 0xff54
103 #endif
104
105 #include <glibmm/convert.h>
106
107 #define GIG_STR_ENCODING "CP1252"
108
109 static inline
110 Glib::ustring gig_to_utf8(const gig::String& gig_string) {
111 return Glib::convert_with_fallback(gig_string, "UTF-8", GIG_STR_ENCODING, "?");
112 }
113
114 static inline
115 gig::String gig_from_utf8(const Glib::ustring& utf8_string) {
116 return Glib::convert_with_fallback(utf8_string, GIG_STR_ENCODING, "UTF-8", "?");
117 }
118
119 template<class T> inline std::string ToString(T o) {
120 std::stringstream ss;
121 ss << o;
122 return ss.str();
123 }
124
125 inline int getDimensionIndex(gig::dimension_t type, gig::Region* rgn) {
126 for (uint i = 0; i < rgn->Dimensions; ++i)
127 if (rgn->pDimensionDefinitions[i].dimension == type)
128 return i;
129 return -1;
130 }
131
132 inline int getDimensionRegionIndex(gig::DimensionRegion* dr) {
133 if (!dr) return -1;
134 gig::Region* rgn = (gig::Region*)dr->GetParent();
135 for (uint i = 0; i < 256; ++i)
136 if (rgn->pDimensionRegions[i] == dr)
137 return i;
138 return -1;
139 }
140
141 /// Find the number of bits required to hold the specified amount of zones.
142 inline int zoneCountToBits(int nZones) {
143 if (!nZones) return 0;
144 int iFinalBits = 0;
145 int zoneBits = nZones - 1;
146 for (; zoneBits > 1; iFinalBits += 2, zoneBits >>= 2);
147 iFinalBits += zoneBits;
148 return iFinalBits;
149 }
150
151 /**
152 * Returns the sum of all bits of all dimensions defined before the given
153 * dimensions (@a type). This allows to access cases of that particular
154 * dimension directly. If the supplied dimension @a type does not exist in the
155 * the supplied @a region, then this function returns -1 instead!
156 *
157 * @param type - dimension that shall be used
158 * @param rgn - parent region of that dimension
159 */
160 inline int baseBits(gig::dimension_t type, gig::Region* rgn) {
161 int previousBits = 0;
162 for (uint i = 0; i < rgn->Dimensions; ++i) {
163 if (rgn->pDimensionDefinitions[i].dimension == type) return previousBits;
164 previousBits += rgn->pDimensionDefinitions[i].bits;
165 }
166 return -1;
167 }
168
169 // key: dimension type, value: dimension's zone index
170 class DimensionCase : public std::map<gig::dimension_t,int> {
171 public:
172 bool isViolating(const DimensionCase& c) const {
173 for (DimensionCase::const_iterator it = begin(); it != end(); ++it) {
174 if (c.find(it->first) == c.end()) continue;
175 if (c.find(it->first)->second != it->second) return true;
176 }
177 return false;
178 }
179
180 // prevent passing gig::dimension_none from creating a new pair
181 // (TODO: other invalid gig::dimension_t values should be filtered here as well)
182 int& operator[](const gig::dimension_t& k) {
183 static int unused = 0;
184 if (k == gig::dimension_none) {
185 unused = 0;
186 return unused;
187 }
188 return std::map<gig::dimension_t,int>::operator[](k);
189 }
190 };
191
192 //TODO: this function and caseOfDimRegion() from dimregionchooser.h are duplicates, eliminate either one of them!
193 inline DimensionCase dimensionCaseOf(gig::DimensionRegion* dr) {
194 DimensionCase dimCase;
195 int idr = getDimensionRegionIndex(dr);
196 if (idr < 0) return dimCase;
197 gig::Region* rgn = (gig::Region*)dr->GetParent();
198 int bitpos = 0;
199 for (int d = 0; d < rgn->Dimensions; ++d) {
200 const gig::dimension_def_t& dimdef = rgn->pDimensionDefinitions[d];
201 const int zone = (idr >> bitpos) & ((1 << dimdef.bits) - 1);
202 dimCase[dimdef.dimension] = zone;
203 bitpos += rgn->pDimensionDefinitions[d].bits;
204 }
205 return dimCase;
206 }
207
208 inline std::vector<gig::DimensionRegion*> dimensionRegionsMatching(const DimensionCase& dimCase, gig::Region* rgn) {
209 std::vector<gig::DimensionRegion*> v;
210 for (int idr = 0; idr < 256; ++idr) {
211 if (!rgn->pDimensionRegions[idr]) continue;
212 DimensionCase c = dimensionCaseOf(rgn->pDimensionRegions[idr]);
213 if (!dimCase.isViolating(c)) v.push_back(rgn->pDimensionRegions[idr]);
214 }
215 return v;
216 }
217
218 inline gig::DimensionRegion* dimensionRegionMatching(const DimensionCase& dimCase, gig::Region* rgn) {
219 for (int idr = 0; idr < 256; ++idr) {
220 if (!rgn->pDimensionRegions[idr]) continue;
221 DimensionCase c = dimensionCaseOf(rgn->pDimensionRegions[idr]);
222 if (c == dimCase) return rgn->pDimensionRegions[idr];
223 }
224 return NULL;
225 }
226
227 #endif // GIGEDIT_GLOBAL_H

  ViewVC Help
Powered by ViewVC