diff options
author | fluxgen <fluxgen> | 2001-12-13 20:43:31 (GMT) |
---|---|---|
committer | fluxgen <fluxgen> | 2001-12-13 20:43:31 (GMT) |
commit | c5fdccd430ec5f5624c51e173e45e332401deec8 (patch) | |
tree | 217e1332eb8edf1909e920e48b57db8d25f3da3a | |
parent | 046d23487290f96cbefe953fb122baae87175318 (diff) | |
download | fluxbox_paul-c5fdccd430ec5f5624c51e173e45e332401deec8.zip fluxbox_paul-c5fdccd430ec5f5624c51e173e45e332401deec8.tar.bz2 |
Created class Misc and moved all free functions in misc.cc into it
and added strdup.
Moved struct FFont from Theme.hh into class Misc and renamed it to struct Font.
Changed FontAlignement names to upercase
-rw-r--r-- | src/misc.cc | 108 |
1 files changed, 43 insertions, 65 deletions
diff --git a/src/misc.cc b/src/misc.cc index 481705c..28a63e3 100644 --- a/src/misc.cc +++ b/src/misc.cc | |||
@@ -25,42 +25,29 @@ | |||
25 | #include <stdlib.h> | 25 | #include <stdlib.h> |
26 | #include <string.h> | 26 | #include <string.h> |
27 | #include <stdio.h> | 27 | #include <stdio.h> |
28 | #include <iostream> | ||
29 | #include <X11/Xutil.h> | ||
30 | using namespace std; | ||
31 | |||
32 | //------- strdup ------------------------ | ||
33 | //TODO: comment this | ||
34 | //---------------------------------------- | ||
35 | char *Misc::strdup(const char *s) { | ||
36 | int l = strlen(s) + 1; | ||
37 | char *n = new char[l]; | ||
38 | strncpy(n, s, l); | ||
39 | return n; | ||
40 | } | ||
28 | 41 | ||
29 | // ----- start code stealing ---- | ||
30 | 42 | ||
31 | // ---------------------------------------------------------------------- | 43 | // ---------------------------------------------------------------------- |
32 | // xvertext, Copyright (c) 1992 Alan Richardson (mppa3@uk.ac.sussex.syma) | 44 | // xvertext, Copyright (c) 1992 Alan Richardson (mppa3@uk.ac.sussex.syma) |
33 | // ---------------------------------------------------------------------- | 45 | // ---------------------------------------------------------------------- |
34 | 46 | ||
35 | int xv_errno; //TODO: ? | ||
36 | |||
37 | static char *my_strdup(char *str); | ||
38 | |||
39 | //------- getTabAlignmentString ---------- | ||
40 | //Routine to mimic `strdup()' (some machines don't have it) | ||
41 | //---------------------------------------- | ||
42 | static char *my_strdup(char *str) | ||
43 | { | ||
44 | char *s; | ||
45 | |||
46 | if (str == NULL) return NULL; | ||
47 | |||
48 | s = (char *)malloc((unsigned)(strlen(str)+1)); | ||
49 | /* this error is highly unlikely ... */ | ||
50 | if (s == NULL) { | ||
51 | fprintf(stderr, "Fatal error: my_strdup(): Couldn't do malloc!\n"); | ||
52 | exit(1); | ||
53 | } | ||
54 | |||
55 | strcpy(s, str); | ||
56 | return s; | ||
57 | } | ||
58 | |||
59 | //------- XRotLoadFont ------------------- | 47 | //------- XRotLoadFont ------------------- |
60 | // Load the rotated version of a given font | 48 | // Load the rotated version of a given font |
61 | //---------------------------------------- | 49 | //---------------------------------------- |
62 | XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle) | 50 | Misc::XRotFontStruct *Misc::XRotLoadFont(Display *dpy, char *fontname, float angle) { |
63 | { | ||
64 | char val; | 51 | char val; |
65 | XImage *I1, *I2; | 52 | XImage *I1, *I2; |
66 | Pixmap canvas; | 53 | Pixmap canvas; |
@@ -97,17 +84,17 @@ XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle) | |||
97 | /* load the font ... */ | 84 | /* load the font ... */ |
98 | fontstruct = XLoadQueryFont(dpy, fontname); | 85 | fontstruct = XLoadQueryFont(dpy, fontname); |
99 | if (fontstruct == NULL) { | 86 | if (fontstruct == NULL) { |
100 | xv_errno = XV_NOFONT; | 87 | cerr<<"Fluxbox::Misc: No font"<<endl; |
101 | return NULL; | 88 | return 0; |
102 | } | 89 | } |
103 | 90 | ||
104 | XSetFont(dpy, font_gc, fontstruct->fid); | 91 | XSetFont(dpy, font_gc, fontstruct->fid); |
105 | 92 | ||
106 | /* allocate space for rotated font ... */ | 93 | /* allocate space for rotated font ... */ |
107 | rotfont = (XRotFontStruct *)malloc((unsigned)sizeof(XRotFontStruct)); | 94 | rotfont = new XRotFontStruct; |
108 | if (rotfont == NULL) { | 95 | if (rotfont == 0) { |
109 | xv_errno = XV_NOMEM; | 96 | cerr<<"Fluxbox::Misc: out of memory"<<endl; |
110 | return NULL; | 97 | return 0; |
111 | } | 98 | } |
112 | 99 | ||
113 | /* determine which characters are defined in font ... */ | 100 | /* determine which characters are defined in font ... */ |
@@ -119,7 +106,7 @@ XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle) | |||
119 | if (max_char>126) max_char = 126; | 106 | if (max_char>126) max_char = 126; |
120 | 107 | ||
121 | /* some overall font data ... */ | 108 | /* some overall font data ... */ |
122 | rotfont->name = my_strdup(fontname); | 109 | rotfont->name = Misc::strdup(fontname); |
123 | rotfont->dir = dir; | 110 | rotfont->dir = dir; |
124 | rotfont->min_char = min_char; | 111 | rotfont->min_char = min_char; |
125 | rotfont->max_char = max_char; | 112 | rotfont->max_char = max_char; |
@@ -171,18 +158,14 @@ XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle) | |||
171 | boxlen/2 - descent, text, 1); | 158 | boxlen/2 - descent, text, 1); |
172 | 159 | ||
173 | /* reserve memory for first XImage ... */ | 160 | /* reserve memory for first XImage ... */ |
174 | vertdata = (unsigned char *) malloc((unsigned)(vert_len*vert_h)); | 161 | vertdata = new unsigned char[vert_len*vert_h]; //(unsigned char *) malloc((unsigned)(vert_len*vert_h)); |
175 | if (vertdata == NULL) { | 162 | |
176 | xv_errno = XV_NOMEM; | ||
177 | return NULL; | ||
178 | } | ||
179 | |||
180 | /* create the XImage ... */ | 163 | /* create the XImage ... */ |
181 | I1 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, | 164 | I1 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, |
182 | 0, (char *)vertdata, vert_w, vert_h, 8, 0); | 165 | 0, (char *)vertdata, vert_w, vert_h, 8, 0); |
183 | 166 | ||
184 | if (I1 == NULL) { | 167 | if (I1 == NULL) { |
185 | xv_errno = XV_NOXIMAGE; | 168 | cerr<<"Fluxbox::Misc: Cant create ximage."<<endl; |
186 | return NULL; | 169 | return NULL; |
187 | } | 170 | } |
188 | 171 | ||
@@ -209,19 +192,15 @@ XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle) | |||
209 | rotfont->per_char[ichar-32].glyph.bit_h = bit_h; | 192 | rotfont->per_char[ichar-32].glyph.bit_h = bit_h; |
210 | 193 | ||
211 | /* reserve memory for the rotated image ... */ | 194 | /* reserve memory for the rotated image ... */ |
212 | bitdata = (unsigned char *)calloc((unsigned)(bit_h*bit_len), 1); | 195 | bitdata = new unsigned char[bit_h*bit_len]; //(unsigned char *)calloc((unsigned)(bit_h*bit_len), 1); |
213 | if (bitdata == NULL) { | ||
214 | xv_errno = XV_NOMEM; | ||
215 | return NULL; | ||
216 | } | ||
217 | 196 | ||
218 | /* create the image ... */ | 197 | /* create the image ... */ |
219 | I2 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, 0, | 198 | I2 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, 0, |
220 | (char *)bitdata, bit_w, bit_h, 8, 0); | 199 | (char *)bitdata, bit_w, bit_h, 8, 0); |
221 | 200 | ||
222 | if (I2 == NULL) { | 201 | if (I2 == NULL) { |
223 | xv_errno = XV_NOXIMAGE; | 202 | cerr<<"Font::Misc: Cant create ximage!"<<endl; |
224 | return NULL; | 203 | return 0; |
225 | } | 204 | } |
226 | 205 | ||
227 | I2->byte_order = I2->bitmap_bit_order = MSBFirst; | 206 | I2->byte_order = I2->bitmap_bit_order = MSBFirst; |
@@ -275,27 +254,27 @@ XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle) | |||
275 | // Free the resources associated with a | 254 | // Free the resources associated with a |
276 | // rotated font | 255 | // rotated font |
277 | //---------------------------------------- | 256 | //---------------------------------------- |
278 | void XRotUnloadFont(Display *dpy, XRotFontStruct *rotfont) | 257 | void Misc::XRotUnloadFont(Display *dpy, XRotFontStruct *rotfont) |
279 | { | 258 | { |
280 | int ichar; | 259 | int ichar; |
281 | 260 | ||
282 | if (rotfont->dir == 0) | 261 | if (rotfont->dir == 0) |
283 | XFreeFont(dpy, rotfont->xfontstruct); | 262 | XFreeFont(dpy, rotfont->xfontstruct); |
284 | else { | 263 | else { |
285 | /* loop through each character, freeing its pixmap ... */ | 264 | /* loop through each character, freeing its pixmap ... */ |
286 | for (ichar = rotfont->min_char-32; ichar <= rotfont->max_char-32; | 265 | for (ichar = rotfont->min_char-32; ichar <= rotfont->max_char-32; |
287 | ichar++) | 266 | ichar++) |
288 | XFreePixmap(dpy, rotfont->per_char[ichar].glyph.bm); | 267 | XFreePixmap(dpy, rotfont->per_char[ichar].glyph.bm); |
289 | } | 268 | } |
290 | /* rotfont should never be referenced again ... */ | 269 | |
291 | free((char *)rotfont->name); | 270 | delete rotfont->name; |
292 | free((char *)rotfont); | 271 | delete rotfont; |
293 | } | 272 | } |
294 | 273 | ||
295 | //------- XRotTextWidth ------------------ | 274 | //------- XRotTextWidth ------------------ |
296 | // Returns the width of a rotated string | 275 | // Returns the width of a rotated string |
297 | //---------------------------------------- | 276 | //---------------------------------------- |
298 | unsigned int XRotTextWidth(XRotFontStruct *rotfont, char *str, int len) | 277 | unsigned int Misc::XRotTextWidth(XRotFontStruct *rotfont, char *str, int len) |
299 | { | 278 | { |
300 | int i, width = 0, ichar; | 279 | int i, width = 0, ichar; |
301 | 280 | ||
@@ -320,7 +299,7 @@ unsigned int XRotTextWidth(XRotFontStruct *rotfont, char *str, int len) | |||
320 | //------- XRotDrawString ----------------- | 299 | //------- XRotDrawString ----------------- |
321 | // A front end to XRotDrawString : mimics XDrawString | 300 | // A front end to XRotDrawString : mimics XDrawString |
322 | //---------------------------------------- | 301 | //---------------------------------------- |
323 | void XRotDrawString(Display *dpy, XRotFontStruct *rotfont, Drawable drawable, | 302 | void Misc::XRotDrawString(Display *dpy, XRotFontStruct *rotfont, Drawable drawable, |
324 | GC gc, int x, int y, char *str, int len) | 303 | GC gc, int x, int y, char *str, int len) |
325 | { | 304 | { |
326 | static GC my_gc = 0; | 305 | static GC my_gc = 0; |
@@ -385,9 +364,8 @@ void XRotDrawString(Display *dpy, XRotFontStruct *rotfont, Drawable drawable, | |||
385 | } | 364 | } |
386 | } | 365 | } |
387 | 366 | ||
388 | // ---- stop code stealing ---- | ||
389 | 367 | ||
390 | void DrawString(Display *display, Window w, GC gc, FFont *font, | 368 | void Misc::DrawString(Display *display, Window w, GC gc, Misc::Font *font, |
391 | unsigned int text_w, unsigned int size_w, | 369 | unsigned int text_w, unsigned int size_w, |
392 | unsigned int bevel_w, char *text) { | 370 | unsigned int bevel_w, char *text) { |
393 | //Draw title string | 371 | //Draw title string |
@@ -414,11 +392,11 @@ void DrawString(Display *display, Window w, GC gc, FFont *font, | |||
414 | } | 392 | } |
415 | 393 | ||
416 | switch (font->justify) { | 394 | switch (font->justify) { |
417 | case FFont::Right: | 395 | case Misc::Font::RIGHT: |
418 | dx += size_w - l; | 396 | dx += size_w - l; |
419 | break; | 397 | break; |
420 | 398 | ||
421 | case FFont::Center: | 399 | case Misc::Font::CENTER: |
422 | dx += (size_w - l) / 2; | 400 | dx += (size_w - l) / 2; |
423 | break; | 401 | break; |
424 | default: | 402 | default: |
@@ -442,7 +420,7 @@ void DrawString(Display *display, Window w, GC gc, FFont *font, | |||
442 | } | 420 | } |
443 | 421 | ||
444 | 422 | ||
445 | void DrawRotString(Display *display, Window w, GC gc, XRotFontStruct *font, | 423 | void Misc::DrawRotString(Display *display, Window w, GC gc, XRotFontStruct *font, |
446 | unsigned int align, unsigned int text_w, | 424 | unsigned int align, unsigned int text_w, |
447 | unsigned int size_w, unsigned int size_h, | 425 | unsigned int size_w, unsigned int size_h, |
448 | unsigned int bevel_w, char *text) { | 426 | unsigned int bevel_w, char *text) { |
@@ -462,11 +440,11 @@ void DrawRotString(Display *display, Window w, GC gc, XRotFontStruct *font, | |||
462 | } | 440 | } |
463 | } | 441 | } |
464 | 442 | ||
465 | if (align == FFont::Right) | 443 | if (align == Misc::Font::RIGHT) |
466 | size_h = l; | 444 | size_h = l; |
467 | else if (align == FFont::Center) | 445 | else if (align == Misc::Font::CENTER) |
468 | size_h = (size_h + l) / 2; | 446 | size_h = (size_h + l) / 2; |
469 | else | 447 | else //LEFT |
470 | size_h -= (dx * 4); | 448 | size_h -= (dx * 4); |
471 | 449 | ||
472 | // To get it in the "center" of the tab | 450 | // To get it in the "center" of the tab |