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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3157 - (hide annotations) (download) (as text)
Mon May 8 17:30:10 2017 UTC (6 years, 11 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 schoenebeck 1396 /* -*- c++ -*-
2 schoenebeck 3089 * Copyright (C) 2007-2017 Andreas Persson
3 schoenebeck 1396 *
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 schoenebeck 3151 #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 schoenebeck 2967 #if !defined(WIN32)
38     # include <unistd.h>
39     # include <errno.h>
40     #endif
41    
42 persson 2442 #include <sstream>
43 schoenebeck 3089 #include <map>
44 persson 2442
45 schoenebeck 3089 #ifdef LIBGIG_HEADER_FILE
46     # include LIBGIG_HEADER_FILE(gig.h)
47 schoenebeck 3157 # include LIBGIG_HEADER_FILE(Serialization.h)
48 schoenebeck 3089 #else
49     # include <gig.h>
50 schoenebeck 3157 # include <Serialization.h>
51 schoenebeck 3089 #endif
52    
53 schoenebeck 2474 //FIXME: for some reason AC GETTEXT check fails on the Mac cross compiler?
54     #if (HAVE_GETTEXT || defined(__APPLE__))
55 schoenebeck 1396 # 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 schoenebeck 2692 #define UNICODE_RIGHT_ARROW Glib::ustring(1, gunichar(0x2192))
68     #define UNICODE_LEFT_ARROW Glib::ustring(1, gunichar(0x2190))
69 schoenebeck 3155 #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 schoenebeck 2692
84 schoenebeck 3123 // 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 schoenebeck 3151 #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 persson 2442 template<class T> inline std::string ToString(T o) {
120     std::stringstream ss;
121     ss << o;
122     return ss.str();
123     }
124    
125 schoenebeck 3089 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 schoenebeck 2548 /// Find the number of bits required to hold the specified amount of zones.
142     inline int zoneCountToBits(int nZones) {
143 schoenebeck 2604 if (!nZones) return 0;
144 schoenebeck 2548 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 schoenebeck 3089 /**
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 schoenebeck 3123
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 schoenebeck 3089 };
191    
192 schoenebeck 3123 //TODO: this function and caseOfDimRegion() from dimregionchooser.h are duplicates, eliminate either one of them!
193 schoenebeck 3089 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 schoenebeck 3123 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 schoenebeck 1396 #endif // GIGEDIT_GLOBAL_H

  ViewVC Help
Powered by ViewVC