aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Tiefenbruck <mark@fluxbox.org>2008-06-26 19:41:43 (GMT)
committerMark Tiefenbruck <mark@fluxbox.org>2008-06-26 19:41:43 (GMT)
commitc492daf2d9b3123e502bd3825434e0a34571297c (patch)
tree087f3bbaa05f615893d8725e2343fe328ccf03f7
parent05feaec548b6368d5cd122061ed0ec2e0d43191a (diff)
downloadfluxbox_pavel-c492daf2d9b3123e502bd3825434e0a34571297c.zip
fluxbox_pavel-c492daf2d9b3123e502bd3825434e0a34571297c.tar.bz2
remove dithering code
-rw-r--r--ChangeLog3
-rw-r--r--INSTALL6
-rw-r--r--configure.in14
-rw-r--r--src/FbTk/ImageControl.cc28
-rw-r--r--src/FbTk/ImageControl.hh13
-rw-r--r--src/FbTk/TextureRender.cc274
-rw-r--r--src/Screen.cc8
-rw-r--r--src/Screen.hh3
8 files changed, 11 insertions, 338 deletions
diff --git a/ChangeLog b/ChangeLog
index 32138a8..5b69240 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
1 (Format: Year/Month/Day) 1 (Format: Year/Month/Day)
2Changes for 1.1 2Changes for 1.1
3*08/06/26:
4 * Remove antiquated dithering code (Mark)
5 FbTk/ImageControl.cc/hh FbTk/TextureRender.cc Screen.cc/hh
3*08/06/20: 6*08/06/20:
4 * Move default window menu to ~/.fluxbox/windowmenu (Mark) 7 * Move default window menu to ~/.fluxbox/windowmenu (Mark)
5 configure.in data/Makefile.am data/windowmenu Screen.cc 8 configure.in data/Makefile.am data/windowmenu Screen.cc
diff --git a/INSTALL b/INSTALL
index a47d60f..ee8983e 100644
--- a/INSTALL
+++ b/INSTALL
@@ -75,12 +75,6 @@ every other line in rendered images. This support works only for gradient
75images. It is compiled in by default, but may be overridden by specifying 75images. It is compiled in by default, but may be overridden by specifying
76`--disable-interlace' on the configure script's command line. 76`--disable-interlace' on the configure script's command line.
77 77
78Fluxbox provides an alternative rendering algorithm for dithering on
79pseudocolor (8 bit) displays. A noticeable pattern is visible when using
80this; it's a matter of taste whether this looks better than the default
81algorithm. It is disabled by default, but may be overridden by specifying
82'--enable-ordered-pseudo' on the configure script's command line.
83
84Fluxbox uses a timer which allows it to periodically flush its pixmap 78Fluxbox uses a timer which allows it to periodically flush its pixmap
85cache. It is enabled by default, but may be overridden by specifying 79cache. It is enabled by default, but may be overridden by specifying
86'--disable-timed-cache' on the configure script's command line. 80'--disable-timed-cache' on the configure script's command line.
diff --git a/configure.in b/configure.in
index c778ab1..7fbe805 100644
--- a/configure.in
+++ b/configure.in
@@ -290,20 +290,6 @@ AC_ARG_ENABLE(
290) 290)
291AM_CONDITIONAL(NEWWMSPEC, test x$NEWWMSPEC = xtrue) 291AM_CONDITIONAL(NEWWMSPEC, test x$NEWWMSPEC = xtrue)
292 292
293dnl Check for ordered 8bpp dithering
294AC_MSG_CHECKING([whether to include Pseudocolor ordered dithering code])
295AC_ARG_ENABLE(ordered-pseudo,
296[ --enable-ordered-pseudo include code for ordered pseudocolor (8bpp)
297 dithering ([default=no])],
298 if test x$enableval = "xyes"; then
299 AC_MSG_RESULT([yes])
300 AC_DEFINE(ORDEREDPSEUDO, 1, "ordered dithering code")
301 else
302 AC_MSG_RESULT([no])
303 fi,
304 AC_MSG_RESULT([no])
305)
306
307dnl Check whether to include debugging code 293dnl Check whether to include debugging code
308DEBUG="" 294DEBUG=""
309AC_MSG_CHECKING([whether to include verbose debugging code]) 295AC_MSG_CHECKING([whether to include verbose debugging code])
diff --git a/src/FbTk/ImageControl.cc b/src/FbTk/ImageControl.cc
index d68ddb1..b9c3685 100644
--- a/src/FbTk/ImageControl.cc
+++ b/src/FbTk/ImageControl.cc
@@ -104,9 +104,8 @@ struct ImageControl::Cache {
104 unsigned long pixel1, pixel2, texture; 104 unsigned long pixel1, pixel2, texture;
105}; 105};
106 106
107ImageControl::ImageControl(int screen_num, bool dither, 107ImageControl::ImageControl(int screen_num,
108 int cpc, unsigned long cache_timeout, unsigned long cmax): 108 int cpc, unsigned long cache_timeout, unsigned long cmax):
109 m_dither(dither),
110 m_colors(0), 109 m_colors(0),
111 m_num_colors(0), 110 m_num_colors(0),
112 m_colors_per_channel(cpc) { 111 m_colors_per_channel(cpc) {
@@ -318,13 +317,6 @@ void ImageControl::colorTables(const unsigned char **rmt, const unsigned char **
318 if (bbit) *bbit = blue_bits; 317 if (bbit) *bbit = blue_bits;
319} 318}
320 319
321#ifdef NOT_USED
322void ImageControl::getXColorTable(XColor **c, int *n) {
323 if (c) *c = m_colors;
324 if (n) *n = m_num_colors;
325}
326#endif
327
328void ImageControl::getGradientBuffers(unsigned int w, 320void ImageControl::getGradientBuffers(unsigned int w,
329 unsigned int h, 321 unsigned int h,
330 unsigned int **xbuf, 322 unsigned int **xbuf,
@@ -380,15 +372,6 @@ void ImageControl::installRootColormap() {
380 XUngrabServer(disp); 372 XUngrabServer(disp);
381} 373}
382 374
383#ifdef NOT_USED
384void ImageControl::setColorsPerChannel(int cpc) {
385 if (cpc < 2) cpc = 2;
386 if (cpc > 6) cpc = 6;
387
388 m_colors_per_channel = cpc;
389}
390#endif
391
392unsigned long ImageControl::getSqrt(unsigned int x) const { 375unsigned long ImageControl::getSqrt(unsigned int x) const {
393 if (! sqrt_table) { 376 if (! sqrt_table) {
394 // build sqrt table for use with elliptic gradient 377 // build sqrt table for use with elliptic gradient
@@ -449,8 +432,6 @@ void ImageControl::createColorTable() {
449 432
450 if (bits_per_pixel == 0) 433 if (bits_per_pixel == 0)
451 bits_per_pixel = m_screen_depth; 434 bits_per_pixel = m_screen_depth;
452 if (bits_per_pixel >= 24)
453 setDither(false);
454 435
455 red_offset = green_offset = blue_offset = 0; 436 red_offset = green_offset = blue_offset = 0;
456 437
@@ -501,12 +482,7 @@ void ImageControl::createColorTable() {
501 482
502 m_colors = new XColor[m_num_colors]; 483 m_colors = new XColor[m_num_colors];
503 484
504 int bits = 256 / m_colors_per_channel; 485 int bits = 255 / (m_colors_per_channel - 1);
505
506#ifndef ORDEREDPSEUDO
507 bits = 255 / (m_colors_per_channel - 1);
508#endif // ORDEREDPSEUDO
509
510 red_bits = green_bits = blue_bits = bits; 486 red_bits = green_bits = blue_bits = bits;
511 487
512 for (unsigned int i = 0; i < 256; i++) { 488 for (unsigned int i = 0; i < 256; i++) {
diff --git a/src/FbTk/ImageControl.hh b/src/FbTk/ImageControl.hh
index a8e18b7..a9c2eb7 100644
--- a/src/FbTk/ImageControl.hh
+++ b/src/FbTk/ImageControl.hh
@@ -39,14 +39,10 @@ class Texture;
39/// Holds screen info, color tables and caches textures 39/// Holds screen info, color tables and caches textures
40class ImageControl: private NotCopyable { 40class ImageControl: private NotCopyable {
41public: 41public:
42 ImageControl(int screen_num, bool dither = false, int colors_per_channel = 4, 42 ImageControl(int screen_num, int colors_per_channel = 4,
43 unsigned long cache_timeout = 300000l, unsigned long cache_max = 200l); 43 unsigned long cache_timeout = 300000l, unsigned long cache_max = 200l);
44 virtual ~ImageControl(); 44 virtual ~ImageControl();
45 45
46 bool doDither() const { return m_dither; }
47#ifdef NOT_USED
48 int bitsPerPixel() const { return bits_per_pixel; }
49#endif
50 int depth() const { return m_screen_depth; } 46 int depth() const { return m_screen_depth; }
51 int colorsPerChannel() const { return m_colors_per_channel; } 47 int colorsPerChannel() const { return m_colors_per_channel; }
52 int screenNumber() const { return m_screen_num; } 48 int screenNumber() const { return m_screen_num; }
@@ -68,15 +64,8 @@ public:
68 void removeImage(Pixmap thepix); 64 void removeImage(Pixmap thepix);
69 void colorTables(const unsigned char **, const unsigned char **, const unsigned char **, 65 void colorTables(const unsigned char **, const unsigned char **, const unsigned char **,
70 int *, int *, int *, int *, int *, int *) const; 66 int *, int *, int *, int *, int *, int *) const;
71#ifdef NOT_USED
72 void getXColorTable(XColor **, int *);
73#endif
74 void getGradientBuffers(unsigned int, unsigned int, 67 void getGradientBuffers(unsigned int, unsigned int,
75 unsigned int **, unsigned int **); 68 unsigned int **, unsigned int **);
76 void setDither(bool d) { m_dither = d; }
77#ifdef NOT_USED
78 void setColorsPerChannel(int cpc);
79#endif
80 69
81 void cleanCache(); 70 void cleanCache();
82private: 71private:
diff --git a/src/FbTk/TextureRender.cc b/src/FbTk/TextureRender.cc
index 3ee5acd..73c1a94 100644
--- a/src/FbTk/TextureRender.cc
+++ b/src/FbTk/TextureRender.cc
@@ -340,280 +340,13 @@ XImage *TextureRender::renderXImage() {
340 image->data = 0; 340 image->data = 0;
341 341
342 unsigned char *d = new unsigned char[image->bytes_per_line * (height + 1)]; 342 unsigned char *d = new unsigned char[image->bytes_per_line * (height + 1)];
343 register unsigned int x, y, dithx, dithy, r, g, b, o, er, eg, eb, offset; 343 register unsigned int x, y, r, g, b, o, offset;
344 344
345 unsigned char *pixel_data = d, *ppixel_data = d; 345 unsigned char *pixel_data = d, *ppixel_data = d;
346 unsigned long pixel; 346 unsigned long pixel;
347 347
348 o = image->bits_per_pixel + ((image->byte_order == MSBFirst) ? 1 : 0); 348 o = image->bits_per_pixel + ((image->byte_order == MSBFirst) ? 1 : 0);
349 349
350 if (control.doDither()) {
351 unsigned char dither4[4][4] = {
352 {0, 4, 1, 5},
353 {6, 2, 7, 3},
354 {1, 5, 0, 4},
355 {7, 3, 6, 2} };
356
357#ifdef ORDEREDPSEUDO
358 unsigned char dither8[8][8] = {
359 { 0, 32, 8, 40, 2, 34, 10, 42 },
360 { 48, 16, 56, 24, 50, 18, 58, 26 },
361 { 12, 44, 4, 36, 14, 46, 6, 38 },
362 { 60, 28, 52, 20, 62, 30, 54, 22 },
363 { 3, 35, 11, 43, 1, 33, 9, 41 },
364 { 51, 19, 59, 27, 49, 17, 57, 25 },
365 { 15, 47, 7, 39, 13, 45, 5, 37 },
366 { 63, 31, 55, 23, 61, 29, 53, 21 } };
367#endif // ORDEREDPSEUDO
368
369 switch (control.visual()->c_class) {
370 case TrueColor:
371 // algorithm: ordered dithering... many many thanks to rasterman
372 // (raster@rasterman.com) for telling me about this... portions of this
373 // code is based off of his code in Imlib
374 for (y = 0, offset = 0; y < height; y++) {
375 dithy = y & 0x3;
376
377 for (x = 0; x < width; x++, offset++) {
378 dithx = x & 0x3;
379 r = red[offset];
380 g = green[offset];
381 b = blue[offset];
382
383 er = r & (red_bits - 1);
384 eg = g & (green_bits - 1);
385 eb = b & (blue_bits - 1);
386
387 r = red_table[r];
388 g = green_table[g];
389 b = blue_table[b];
390
391 if ((dither4[dithy][dithx] < er) && (r < red_table[255])) r++;
392 if ((dither4[dithy][dithx] < eg) && (g < green_table[255])) g++;
393 if ((dither4[dithy][dithx] < eb) && (b < blue_table[255])) b++;
394
395 pixel = (r << red_offset) | (g << green_offset) | (b << blue_offset);
396
397 switch (o) {
398 case 8: // 8bpp
399 *pixel_data++ = pixel;
400 break;
401
402 case 16: // 16bpp LSB
403 *pixel_data++ = pixel;
404 *pixel_data++ = pixel >> 8;
405 break;
406
407 case 17: // 16bpp MSB
408 *pixel_data++ = pixel >> 8;
409 *pixel_data++ = pixel;
410 break;
411
412 case 24: // 24bpp LSB
413 *pixel_data++ = pixel;
414 *pixel_data++ = pixel >> 8;
415 *pixel_data++ = pixel >> 16;
416 break;
417
418 case 25: // 24bpp MSB
419 *pixel_data++ = pixel >> 16;
420 *pixel_data++ = pixel >> 8;
421 *pixel_data++ = pixel;
422 break;
423
424 case 32: // 32bpp LSB
425 *pixel_data++ = pixel;
426 *pixel_data++ = pixel >> 8;
427 *pixel_data++ = pixel >> 16;
428 *pixel_data++ = pixel >> 24;
429 break;
430
431 case 33: // 32bpp MSB
432 *pixel_data++ = pixel >> 24;
433 *pixel_data++ = pixel >> 16;
434 *pixel_data++ = pixel >> 8;
435 *pixel_data++ = pixel;
436 break;
437 }
438 }
439
440 pixel_data = (ppixel_data += image->bytes_per_line);
441 }
442
443 break;
444
445 case StaticColor:
446 case PseudoColor: {
447#ifndef ORDEREDPSEUDO
448 short *terr,
449 *rerr = new short[width + 2],
450 *gerr = new short[width + 2],
451 *berr = new short[width + 2],
452 *nrerr = new short[width + 2],
453 *ngerr = new short[width + 2],
454 *nberr = new short[width + 2];
455 int rr, gg, bb, rer, ger, ber;
456 int dd = 255 / control.colorsPerChannel();
457
458 for (x = 0; x < width; x++) {
459 *(rerr + x) = *(red + x);
460 *(gerr + x) = *(green + x);
461 *(berr + x) = *(blue + x);
462 }
463
464 *(rerr + x) = *(gerr + x) = *(berr + x) = 0;
465#endif // ORDEREDPSEUDO
466
467 for (y = 0, offset = 0; y < height; y++) {
468#ifdef ORDEREDPSEUDO
469 dithy = y & 7;
470
471 for (x = 0; x < width; x++, offset++) {
472 dithx = x & 7;
473
474 r = red[offset];
475 g = green[offset];
476 b = blue[offset];
477
478 er = r & (red_bits - 1);
479 eg = g & (green_bits - 1);
480 eb = b & (blue_bits - 1);
481
482 r = red_table[r];
483 g = green_table[g];
484 b = blue_table[b];
485
486 if ((dither8[dithy][dithx] < er) && (r < red_table[255])) r++;
487 if ((dither8[dithy][dithx] < eg) && (g < green_table[255])) g++;
488 if ((dither8[dithy][dithx] < eb) && (b < blue_table[255])) b++;
489
490 pixel = (r * cpccpc) + (g * cpc) + b;
491 *(pixel_data++) = colors[pixel].pixel;
492 }
493
494 pixel_data = (ppixel_data += image->bytes_per_line);
495 }
496#else // !ORDEREDPSEUDO
497 if (y < (height - 1)) {
498 int i = offset + width;
499 for (x = 0; x < width; x++, i++) {
500 *(nrerr + x) = *(red + i);
501 *(ngerr + x) = *(green + i);
502 *(nberr + x) = *(blue + i);
503 }
504
505 *(nrerr + x) = *(red + (--i));
506 *(ngerr + x) = *(green + i);
507 *(nberr + x) = *(blue + i);
508 }
509
510 for (x = 0; x < width; x++) {
511 rr = rerr[x];
512 gg = gerr[x];
513 bb = berr[x];
514
515 if (rr > 255) rr = 255; else if (rr < 0) rr = 0;
516 if (gg > 255) gg = 255; else if (gg < 0) gg = 0;
517 if (bb > 255) bb = 255; else if (bb < 0) bb = 0;
518
519 r = red_table[rr];
520 g = green_table[gg];
521 b = blue_table[bb];
522
523 rer = rerr[x] - r*dd;
524 ger = gerr[x] - g*dd;
525 ber = berr[x] - b*dd;
526
527 pixel = (r * cpccpc) + (g * cpc) + b;
528 *pixel_data++ = colors[pixel].pixel;
529
530 r = rer >> 1;
531 g = ger >> 1;
532 b = ber >> 1;
533 rerr[x+1] += r;
534 gerr[x+1] += g;
535 berr[x+1] += b;
536 nrerr[x] += r;
537 ngerr[x] += g;
538 nberr[x] += b;
539 }
540
541 offset += width;
542
543 pixel_data = (ppixel_data += image->bytes_per_line);
544
545 terr = rerr;
546 rerr = nrerr;
547 nrerr = terr;
548
549 terr = gerr;
550 gerr = ngerr;
551 ngerr = terr;
552
553 terr = berr;
554 berr = nberr;
555 nberr = terr;
556 }
557
558 delete [] rerr;
559 delete [] gerr;
560 delete [] berr;
561 delete [] nrerr;
562 delete [] ngerr;
563 delete [] nberr;
564#endif // ORDEREDPSUEDO
565
566 } break;
567
568 /*
569 case StaticGray:
570 case GrayScale:
571 for (y = 0, offset = 0; y < height; y++) {
572 dithy = y & 0x3;
573
574 for (x = 0; x < width; x++, offset++) {
575 dithx = x & 0x3;
576
577 r = *(red + offset);
578 g = *(green + offset);
579 b = *(blue + offset);
580
581 er = r & 0x7;
582 eg = g & 0x7;
583 eb = b & 0x7;
584
585 if ((dither[dithy][dithx] < er) && (r < (256 - 8)))
586 r += 8;
587 if ((dither[dithy][dithx] < (eg << 1)) && (g < (256 - 4)))
588 g += 4;
589 if ((dither[dithy][dithx] < eb) && (b < (256 - 8)))
590 b += 8;
591
592 r = *(red_table + r);
593 g = *(green_table + g);
594 b = *(blue_table + b);
595
596 g = ((r * 30) + (g * 59) + (b * 11)) / 100;
597 *pixel_data++ = colors[g].pixel;
598 }
599
600 pixel_data = (ppixel_data += image->bytes_per_line);
601 }
602
603 break;
604 */
605
606 default:
607 _FB_USES_NLS;
608 cerr << "TextureRender::renderXImage(): " <<
609 _FBTK_CONSOLETEXT(Error, UnsupportedVisual, "Unsupported visual", "A visual is a technical term in X") << endl;
610 delete [] d;
611 XDestroyImage(image);
612 return (XImage *) 0;
613 }
614} else { // end do dither
615
616 // no dither:
617 switch (control.visual()->c_class) { 350 switch (control.visual()->c_class) {
618 case StaticColor: 351 case StaticColor:
619 case PseudoColor: 352 case PseudoColor:
@@ -714,10 +447,9 @@ XImage *TextureRender::renderXImage() {
714 XDestroyImage(image); 447 XDestroyImage(image);
715 return (XImage *) 0; 448 return (XImage *) 0;
716 } 449 }
717}
718 450
719image->data = (char *) d; 451 image->data = (char *) d;
720return image; 452 return image;
721} 453}
722 454
723 455
diff --git a/src/Screen.cc b/src/Screen.cc
index 475dddf..658252b 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -264,7 +264,6 @@ getString() const {
264BScreen::ScreenResource::ScreenResource(FbTk::ResourceManager &rm, 264BScreen::ScreenResource::ScreenResource(FbTk::ResourceManager &rm,
265 const string &scrname, 265 const string &scrname,
266 const string &altscrname): 266 const string &altscrname):
267 image_dither(rm, false, scrname+".imageDither", altscrname+".ImageDither"),
268 opaque_move(rm, false, scrname + ".opaqueMove", altscrname+".OpaqueMove"), 267 opaque_move(rm, false, scrname + ".opaqueMove", altscrname+".OpaqueMove"),
269 full_max(rm, false, scrname+".fullMaximization", altscrname+".FullMaximization"), 268 full_max(rm, false, scrname+".fullMaximization", altscrname+".FullMaximization"),
270 max_ignore_inc(rm, true, scrname+".maxIgnoreIncrement", altscrname+".MaxIgnoreIncrement"), 269 max_ignore_inc(rm, true, scrname+".maxIgnoreIncrement", altscrname+".MaxIgnoreIncrement"),
@@ -446,7 +445,7 @@ BScreen::BScreen(FbTk::ResourceManager &rm,
446 fluxbox->load_rc(*this); 445 fluxbox->load_rc(*this);
447 446
448 // setup image cache engine 447 // setup image cache engine
449 m_image_control.reset(new FbTk::ImageControl(scrn, true, 448 m_image_control.reset(new FbTk::ImageControl(scrn,
450 fluxbox->colorsPerChannel(), 449 fluxbox->colorsPerChannel(),
451 fluxbox->getCacheLife(), fluxbox->getCacheMax())); 450 fluxbox->getCacheLife(), fluxbox->getCacheMax()));
452 imageControl().installRootColormap(); 451 imageControl().installRootColormap();
@@ -479,8 +478,6 @@ BScreen::BScreen(FbTk::ResourceManager &rm,
479 m_menutheme->setDelayOpen(*resource.menu_delay); 478 m_menutheme->setDelayOpen(*resource.menu_delay);
480 m_menutheme->setDelayClose(*resource.menu_delay_close); 479 m_menutheme->setDelayClose(*resource.menu_delay_close);
481 480
482 imageControl().setDither(*resource.image_dither);
483
484 focusedWinFrameTheme()->reconfigSig().attach(this);// for geom window 481 focusedWinFrameTheme()->reconfigSig().attach(this);// for geom window
485 482
486 483
@@ -1775,9 +1772,6 @@ void BScreen::setupConfigmenu(FbTk::Menu &menu) {
1775 for (; it != it_end; ++it) 1772 for (; it != it_end; ++it)
1776 menu.insert(it->first, it->second); 1773 menu.insert(it->first, it->second);
1777 1774
1778 _BOOLITEM(menu, Configmenu, ImageDithering,
1779 "Image Dithering", "Image Dithering",
1780 resource.image_dither, save_and_reconfigure);
1781 _BOOLITEM(menu, Configmenu, OpaqueMove, 1775 _BOOLITEM(menu, Configmenu, OpaqueMove,
1782 "Opaque Window Moving", 1776 "Opaque Window Moving",
1783 "Window Moving with whole window visible (as opposed to outline moving)", 1777 "Window Moving with whole window visible (as opposed to outline moving)",
diff --git a/src/Screen.hh b/src/Screen.hh
index 3283710..bfdfd69 100644
--- a/src/Screen.hh
+++ b/src/Screen.hh
@@ -550,7 +550,7 @@ private:
550 ScreenResource(FbTk::ResourceManager &rm, const std::string &scrname, 550 ScreenResource(FbTk::ResourceManager &rm, const std::string &scrname,
551 const std::string &altscrname); 551 const std::string &altscrname);
552 552
553 FbTk::Resource<bool> image_dither, opaque_move, full_max, 553 FbTk::Resource<bool> opaque_move, full_max,
554 max_ignore_inc, max_disable_move, max_disable_resize, 554 max_ignore_inc, max_disable_move, max_disable_resize,
555 workspace_warping, show_window_pos, auto_raise, click_raises, 555 workspace_warping, show_window_pos, auto_raise, click_raises,
556 decorate_transient; 556 decorate_transient;
@@ -560,7 +560,6 @@ private:
560 FbTk::Resource<std::string> windowmenufile; 560 FbTk::Resource<std::string> windowmenufile;
561 FbTk::Resource<unsigned int> typing_delay; 561 FbTk::Resource<unsigned int> typing_delay;
562 FbTk::Resource<FollowModel> follow_model, user_follow_model; 562 FbTk::Resource<FollowModel> follow_model, user_follow_model;
563 bool ordered_dither;
564 FbTk::Resource<int> workspaces, edge_snap_threshold, focused_alpha, 563 FbTk::Resource<int> workspaces, edge_snap_threshold, focused_alpha,
565 unfocused_alpha, menu_alpha, menu_delay, menu_delay_close, 564 unfocused_alpha, menu_alpha, menu_delay, menu_delay_close,
566 tab_width, tooltip_delay; 565 tab_width, tooltip_delay;