File indexing completed on 2024-04-28 17:04:14

0001 /*****************************************************************************
0002  *   Copyright 2003 - 2010 Craig Drummond <craig.p.drummond@gmail.com>       *
0003  *   Copyright 2013 - 2015 Yichao Yu <yyc1992@gmail.com>                     *
0004  *                                                                           *
0005  *   This program is free software; you can redistribute it and/or modify    *
0006  *   it under the terms of the GNU Lesser General Public License as          *
0007  *   published by the Free Software Foundation; either version 2.1 of the    *
0008  *   License, or (at your option) version 3, or any later version accepted   *
0009  *   by the membership of KDE e.V. (or its successor approved by the         *
0010  *   membership of KDE e.V.), which shall act as a proxy defined in          *
0011  *   Section 6 of version 3 of the license.                                  *
0012  *                                                                           *
0013  *   This program is distributed in the hope that it will be useful,         *
0014  *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
0015  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       *
0016  *   Lesser General Public License for more details.                         *
0017  *                                                                           *
0018  *   You should have received a copy of the GNU Lesser General Public        *
0019  *   License along with this library. If not,                                *
0020  *   see <http://www.gnu.org/licenses/>.                                     *
0021  *****************************************************************************/
0022 
0023 #ifndef __COMMON_H__
0024 #define __COMMON_H__
0025 
0026 #include "config.h"
0027 #include <qtcurve-utils/shade.h>
0028 #include <qtcurve-utils/utils.h>
0029 
0030 /*
0031     The following #define disables the rounding when scrollbar type==none.
0032 #define SIMPLE_SCROLLBARS
0033 */
0034 
0035 /*
0036     The following #define controls whether a scrollbar's slider should overlap
0037     the scrollbar buttons when at min/max. This removes the thick looking line
0038     between the slider and the buttons.
0039 */
0040 #define INCREASE_SB_SLIDER
0041 
0042 #include <QtConfig>
0043 #include <QApplication>
0044 #include <map>
0045 #include <set>
0046 #include <QString>
0047 #include <QPixmap>
0048 #include <QSet>
0049 
0050 class QColor;
0051 typedef QSet<QString> Strings;
0052 
0053 #define SETTINGS_GROUP        "Settings"
0054 #define KWIN_GROUP            "KWin"
0055 
0056 /* qtc_<theme name>.themerc support */
0057 #define KDE_PREFIX(V) (QTC_KDE4_PREFIX)
0058 #define THEME_DIR    "/share/apps/kstyle/themes/"
0059 #define THEME_DIR4   "/share/kde4/apps/kstyle/themes/"
0060 #define THEME_PREFIX "qtc_"
0061 #define THEME_SUFFIX ".themerc"
0062 #define BORDER_SIZE_FILE "windowBorderSizes"
0063 
0064 #define LV_SIZE      7
0065 
0066 #define LARGE_ARR_WIDTH  7
0067 #define LARGE_ARR_HEIGHT 4
0068 #define SMALL_ARR_WIDTH  5
0069 #define SMALL_ARR_HEIGHT 3
0070 
0071 #define NUM_EXTRA_SHADES 3
0072 
0073 enum {
0074     ALPHA_ETCH_LIGHT = 0,
0075     ALPHA_ETCH_DARK,
0076     NUM_STD_ALPHAS
0077 };
0078 
0079 #define TOTAL_SHADES (QTC_NUM_STD_SHADES + NUM_EXTRA_SHADES)
0080 #define ORIGINAL_SHADE   TOTAL_SHADES
0081 
0082 #define SHADE_ORIG_HIGHLIGHT (QTC_NUM_STD_SHADES)
0083 #define SHADE_4_HIGHLIGHT (QTC_NUM_STD_SHADES + 1)
0084 #define SHADE_2_HIGHLIGHT (QTC_NUM_STD_SHADES + 2)
0085 
0086 #define DEFAULT_CONTRAST 7
0087 
0088 #define THIN_SBAR_MOD  ((opts.sliderWidth<DEFAULT_SLIDER_WIDTH ? 3 : opts.sliderWidth>DEFAULT_SLIDER_WIDTH ? (opts.sliderWidth-9)/2 : 4)+(EFFECT_NONE==opts.buttonEffect ? 1 : 0))
0089 #define SLIDER_SIZE (opts.sliderWidth<DEFAULT_SLIDER_WIDTH ? DEFAULT_SLIDER_WIDTH-2 : opts.sliderWidth)
0090 #define CIRCULAR_SLIDER_SIZE 15
0091 #define GLOW_MO           1 /*ORIGINAL_SHADE*/
0092 #define GLOW_DEFBTN       1
0093 #define GLOW_ALPHA(DEF)   ((DEF) ? 0.5 : 0.65)
0094 #define DEF_BNT_TINT      0.4
0095 #define ENTRY_INNER_ALPHA 0.4
0096 #define INACTIVE_SEL_ALPHA 0.5
0097 
0098 #define SUNKEN_BEVEL_DARK_ALPHA(X)  (X.value()/800.0) // 0.25
0099 #define SUNKEN_BEVEL_LIGHT_ALPHA(X) (X.value()/500.0) // 0.40
0100 
0101 #define BLEND_TITLEBAR     (opts.menubarAppearance==opts.titlebarAppearance && opts.menubarAppearance==opts.inactiveTitlebarAppearance && \
0102                            !(opts.windowBorder&WINDOW_BORDER_BLEND_TITLEBAR) && SHADE_WINDOW_BORDER==opts.shadeMenubars && opts.windowDrag)
0103 
0104 #define PBAR_BORDER        4
0105 #define ARROW_MO_SHADE     4
0106 #define LOWER_BORDER_ALPHA 0.35
0107 #define BORDER_VAL(E) (/*(E) ?*/ QTC_STD_BORDER/* : DISABLED_BORDER*/)
0108 #define SLIDER_MO_BORDER_VAL 3
0109 
0110 #define FRAME_DARK_SHADOW 2
0111 #define FOCUS_SHADE(SEL)         (FOCUS_GLOW==opts.focus ? GLOW_MO : ((SEL) ? 3 : ORIGINAL_SHADE))
0112 #define MENU_STRIPE_SHADE (opts.lighterPopupMenuBgnd ? ORIGINAL_SHADE : 2)
0113 #define MENU_SEP_SHADE    (opts.lighterPopupMenuBgnd ? 4 : 3)
0114 
0115 #define BGND_STRIPE_SHADE 0.95
0116 
0117 #define INVERT_SHADE(A) (1.0+(1.0-(A)))
0118 
0119 #define TOOLBAR_SEP_GAP        (opts.fadeLines ? 5 : 6)
0120 #define FADE_SIZE              0.4
0121 
0122 #define IS_GLASS(A) QtCurve::oneOf(A, APPEARANCE_DULL_GLASS, APPEARANCE_SHINY_GLASS)
0123 #define IS_CUSTOM(A) ((A)>=APPEARANCE_CUSTOM1 && (A)<(APPEARANCE_CUSTOM1+NUM_CUSTOM_GRAD))
0124 
0125 #define MENUBAR_DARK_LIMIT 160
0126 #define TOO_DARK(A) ((A).red()<MENUBAR_DARK_LIMIT || (A).green()<MENUBAR_DARK_LIMIT || (A).blue()<MENUBAR_DARK_LIMIT)
0127 
0128 #define TO_FACTOR(A) ((100.0+((double)(A)))/100.0)
0129 #define DEFAULT_HIGHLIGHT_FACTOR                   3
0130 #define DEFAULT_SPLITTER_HIGHLIGHT_FACTOR          3
0131 #define DEFAULT_CR_HIGHLIGHT_FACTOR                0
0132 #define DEFAULT_EXPANDER_HIGHLIGHT_FACTOR          3
0133 #define MAX_HIGHLIGHT_FACTOR                      50
0134 #define MIN_HIGHLIGHT_FACTOR                     -50
0135 #define MENUBAR_DARK_FACTOR        TO_FACTOR(-3)
0136 #define LV_HEADER_DARK_FACTOR      TO_FACTOR(-10)
0137 #define DEF_POPUPMENU_LIGHT_FACTOR                 2
0138 #define MIN_LIGHTER_POPUP_MENU                  -100
0139 #define MAX_LIGHTER_POPUP_MENU                   100
0140 
0141 #define MIN_GB_FACTOR -50
0142 #define MAX_GB_FACTOR  50
0143 #define DEF_GB_FACTOR  -3
0144 
0145 #define TO_ALPHA(A) (std::abs(A) / 100.0)
0146 #define DEF_COLOR_SEL_TAB_FACTOR  25
0147 #define MIN_COLOR_SEL_TAB_FACTOR   0
0148 #define MAX_COLOR_SEL_TAB_FACTOR 100
0149 
0150 #define DEF_TAB_BGND         0
0151 #define MIN_TAB_BGND        -5
0152 #define MAX_TAB_BGND         5
0153 
0154 #define DEFAULT_MENU_DELAY 225
0155 #define MIN_MENU_DELAY       1
0156 #define MAX_MENU_DELAY     500
0157 
0158 #define DEFAULT_MENU_CLOSE_DELAY 300
0159 #define MIN_MENU_CLOSE_DELAY       0
0160 #define MAX_MENU_CLOSE_DELAY    5000
0161 
0162 #define DEFAULT_SLIDER_WIDTH  15
0163 #define MIN_SLIDER_WIDTH_ROUND 7
0164 #define MIN_SLIDER_WIDTH_THIN_GROOVE 9
0165 #define MIN_SLIDER_WIDTH       5
0166 #define MAX_SLIDER_WIDTH      31
0167 
0168 #define SIZE_GRIP_SIZE 12
0169 
0170 #define USE_GLOW_FOCUS(mouseOver) (FOCUS_GLOW==opts.focus && (MO_GLOW!=opts.coloredMouseOver || !(mouseOver)))
0171 
0172 #define MENUBAR_GLASS_SELECTED_DARK_FACTOR 0.9
0173 #define MENUITEM_FADE_SIZE 48
0174 
0175 #define NUM_SPLITTER_DASHES 21
0176 
0177 #define WIDGET_BUTTON(w)                                                \
0178     QtCurve::oneOf(w, WIDGET_STD_BUTTON, WIDGET_DEF_BUTTON, WIDGET_CHECKBOX,  \
0179                    WIDGET_RADIO_BUTTON, WIDGET_DIAL, WIDGET_COMBO,      \
0180                    WIDGET_COMBO_BUTTON, WIDGET_MDI_WINDOW_BUTTON,       \
0181                    WIDGET_TOOLBAR_BUTTON)
0182 #define ETCH_WIDGET(w)                                                  \
0183     (QtCurve::oneOf(w, WIDGET_STD_BUTTON, WIDGET_DEF_BUTTON,            \
0184                     WIDGET_SLIDER_TROUGH, WIDGET_CHECKBOX,              \
0185                     WIDGET_RADIO_BUTTON, WIDGET_DIAL,                   \
0186                     WIDGET_FILLED_SLIDER_TROUGH, WIDGET_MDI_WINDOW_BUTTON, \
0187                     WIDGET_TOOLBAR_BUTTON) ||                           \
0188      ((w) == WIDGET_SLIDER && opts.coloredMouseOver == MO_GLOW))
0189 
0190 #define SLIDER(w) QtCurve::oneOf(w, WIDGET_SB_SLIDER, WIDGET_SLIDER)
0191 #define CIRCULAR_SLIDER(w) (WIDGET_SLIDER==(w) && SLIDER_CIRCULAR==opts.sliderStyle)
0192 
0193 #define MODIFY_AGUA_X(A, X) (APPEARANCE_AGUA==(A) ?  (X) : (A))
0194 #define MODIFY_AGUA(A)      MODIFY_AGUA_X((A), APPEARANCE_AGUA_MOD)
0195 #define AGUA_MAX 32.0
0196 #define AGUA_MID_SHADE 0.85
0197 
0198 #define COLORED_BORDER_SIZE 3
0199 #define PROGRESS_CHUNK_WIDTH 10
0200 #define STRIPE_WIDTH 10
0201 #define DRAW_LIGHT_BORDER(SUKEN, WIDGET, APP)                           \
0202     (!(SUKEN) && (qtcGetGradient(APP, &opts)->border == GB_LIGHT) &&    \
0203      (WIDGET) != WIDGET_MENU_ITEM && !IS_TROUGH(WIDGET) &&              \
0204      ((WIDGET) != WIDGET_DEF_BUTTON || opts.defBtnIndicator != IND_COLORED))
0205 
0206 #define DRAW_3D_FULL_BORDER(SUNKEN, APP) \
0207     (!(SUNKEN) && GB_3D_FULL==qtcGetGradient((APP), &opts)->border)
0208 
0209 #define DRAW_3D_BORDER(SUNKEN, APP) \
0210     (!(SUNKEN) && GB_3D==qtcGetGradient((APP), &opts)->border)
0211 
0212 #define DRAW_SHINE(SUNKEN, APP) \
0213     (!(SUNKEN) && GB_SHINE==qtcGetGradient((APP), &opts)->border)
0214 
0215 #define LIGHT_BORDER(APP) (APPEARANCE_DULL_GLASS==(APP) ? 1 : 0)
0216 
0217 #define PROGRESS_ANIMATION 100
0218 #define MIN_SLIDER_SIZE(A) (LINE_DOTS==(A) ? 24 : 20)
0219 
0220 #define CR_SMALL_SIZE 13
0221 #define CR_LARGE_SIZE 15
0222 
0223 #define TAB_APP(A)                                                      \
0224     (QtCurve::oneOf(A, APPEARANCE_BEVELLED, APPEARANCE_SPLIT_GRADIENT) ?      \
0225      APPEARANCE_GRADIENT : (A))
0226 #define NORM_TAB_APP TAB_APP(opts.tabAppearance)
0227 #define SEL_TAB_APP  TAB_APP(opts.activeTabAppearance)
0228 
0229 #define SLIDER_MO_SHADE  (SHADE_SELECTED==opts.shadeSliders ? 1 : (SHADE_BLEND_SELECTED==opts.shadeSliders ? 0 : ORIGINAL_SHADE))
0230 #define SLIDER_MO_PLASTIK_BORDER                                        \
0231     (QtCurve::oneOf(opts.shadeSliders, SHADE_SELECTED, SHADE_BLEND_SELECTED) ? 2 : 1)
0232 #define SLIDER_MO_LEN                                   \
0233     (opts.sliderStyle == SLIDER_TRIANGULAR ? 2 :        \
0234      (QtCurve::oneOf(opts.shadeSliders, SHADE_SELECTED,       \
0235                SHADE_BLEND_SELECTED) ? 4 : 3))
0236 
0237 #define CR_MO_FILL          1
0238 #define MO_DEF_BTN          2
0239 #define MO_PLASTIK_DARK(W)  (WIDGET_DEF_BUTTON==(W) && IND_COLORED==opts.defBtnIndicator ? 3 : 2) /*? 2 : 1) */
0240 #define MO_PLASTIK_LIGHT(W) (WIDGET_DEF_BUTTON==(W) && IND_COLORED==opts.defBtnIndicator ? 4 : 1) /*? 2 : 0) */
0241 
0242 #define MO_STD_DARK(W)                                          \
0243     (opts.coloredMouseOver == MO_GLOW ? 1 : MO_PLASTIK_DARK(W))
0244 #define MO_STD_LIGHT(W, S)                                              \
0245     (opts.coloredMouseOver == MO_GLOW ? 1 : MO_PLASTIK_LIGHT(W))
0246 
0247 #define FOCUS_ALPHA              0.08
0248 #define BORDER_BLEND_ALPHA(W)                                   \
0249     (QtCurve::oneOf(W, WIDGET_ENTRY, WIDGET_SCROLLVIEW) ? 0.45 : 0.7)
0250 
0251 #define ETCH_TOP_ALPHA           0.055
0252 #define ETCH_BOTTOM_ALPHA        0.1
0253 // #define ETCH_RADIO_TOP_ALPHA     0.055
0254 #define ETCH_RADIO_TOP_ALPHA     0.09
0255 
0256 #define RINGS_INNER_ALPHA(T) qtc_ring_alpha[IMG_PLAIN_RINGS==(T) ? 1 : 0] //(IMG_PLAIN_RINGS==opts.bgndImage.type ? 0.25 :  0.125)
0257 #define RINGS_OUTER_ALPHA    qtc_ring_alpha[2] //0.5
0258 #define RINGS_WIDTH(T)       (IMG_SQUARE_RINGS==T ? 260 : 450)
0259 #define RINGS_HEIGHT(T)      (IMG_SQUARE_RINGS==T ? 220 : 360)
0260 
0261 #define RINGS_SQUARE_LARGE_ALPHA (RINGS_OUTER_ALPHA*0.675)
0262 #define RINGS_SQUARE_SMALL_ALPHA (RINGS_OUTER_ALPHA*0.50)
0263 #define RINGS_SQUARE_LINE_WIDTH  20.0
0264 #define RINGS_SQUARE_RADIUS      18.0
0265 #define RINGS_SQUARE_LARGE_SIZE  120.0
0266 #define RINGS_SQUARE_SMALL_SIZE  100.0
0267 #define GLOW_PROG_ALPHA 0.55
0268 
0269 #include <QStyle>
0270 typedef enum {
0271     QtC_Round = QStyle::PM_CustomBase,
0272     QtC_TitleAlignment,
0273     QtC_TitleBarButtons,
0274     QtC_TitleBarIcon,
0275     QtC_TitleBarIconColor,
0276     QtC_TitleBarEffect,
0277     QtC_BlendMenuAndTitleBar,
0278     QtC_ShadeMenubarOnlyWhenActive,
0279     QtC_ToggleButtons,
0280     QtC_MenubarColor,
0281     QtC_WindowBorder,
0282     QtC_CustomBgnd,
0283     QtC_TitleBarApp
0284 } QtCMetrics;
0285 
0286 #define QtC_StateKWin            ((QStyle::StateFlag)0x10000000)
0287 // PE_FrameWindow
0288 #define QtC_StateKWinNotFull     ((QStyle::StateFlag)0x20000000)
0289 // CC_TitleBar
0290 #define QtC_StateKWinFillBgnd    ((QStyle::StateFlag)0x20000000)
0291 #define QtC_StateKWinNoBorder    ((QStyle::StateFlag)0x40000000)
0292 #define QtC_StateKWinCompositing ((QStyle::StateFlag)0x80000000)
0293 #define QtC_StateKWinTabDrag     ((QStyle::StateFlag)0x00000001)
0294 
0295 #define QtC_PE_DrawBackground    ((QStyle::PrimitiveElement)(QStyle::PE_CustomBase+10000))
0296 
0297 #define CLOSE_COLOR              QColor(191, 82, 82)
0298 #define DARK_WINDOW_TEXT(A)  ((A).red()<230 || (A).green()<230 || (A).blue()<230)
0299 #define HOVER_BUTTON_ALPHA(A)    (DARK_WINDOW_TEXT(A) ? 0.25 : 0.65)
0300 #define WINDOW_TEXT_SHADOW_ALPHA(A) (EFFECT_SHADOW==(A) ? 0.10 : 0.60)
0301 #define WINDOW_SHADOW_COLOR(A)      (EFFECT_SHADOW==(A) ? Qt::black : Qt::white)
0302 
0303 #define QTCURVE_PREVIEW_CONFIG      "QTCURVE_PREVIEW_CONFIG"
0304 #define QTCURVE_PREVIEW_CONFIG_FULL "QTCURVE_PREVIEW_CONFIG_FULL"
0305 
0306 typedef enum {
0307     DWT_BUTTONS_AS_PER_TITLEBAR    = 0x0001,
0308     DWT_COLOR_AS_PER_TITLEBAR      = 0x0002,
0309     DWT_FONT_AS_PER_TITLEBAR       = 0x0004,
0310     DWT_TEXT_ALIGN_AS_PER_TITLEBAR = 0x0008,
0311     DWT_EFFECT_AS_PER_TITLEBAR     = 0x0010,
0312     DWT_ROUND_TOP_ONLY             = 0x0020,
0313     DWT_ICON_COLOR_AS_PER_TITLEBAR = 0x0040
0314 } EDwtSettingsFlags;
0315 
0316 typedef enum {
0317     TITLEBAR_BUTTON_ROUND                   = 0x0001,
0318     TITLEBAR_BUTTON_HOVER_FRAME             = 0x0002,
0319     TITLEBAR_BUTTON_HOVER_SYMBOL            = 0x0004,
0320     TITLEBAR_BUTTON_NO_FRAME                = 0x0008,
0321     TITLEBAR_BUTTON_COLOR                   = 0x0010,
0322     TITLEBAR_BUTTON_COLOR_INACTIVE          = 0x0020,
0323     TITLEBAR_BUTTON_COLOR_MOUSE_OVER        = 0x0040,
0324     TITLEBAR_BUTTON_STD_COLOR               = 0x0080,
0325     TITLEBAR_BUTTON_COLOR_SYMBOL            = 0x0100,
0326     TITLEBAR_BUTTON_HOVER_SYMBOL_FULL       = 0x0200,
0327     TITLEBAR_BUTTON_SUNKEN_BACKGROUND       = 0x0400,
0328     TITLEBAR_BUTTOM_ARROW_MIN_MAX           = 0x0800,
0329     TITLEBAR_BUTTOM_HIDE_ON_INACTIVE_WINDOW = 0x1000,
0330     TITLEBAR_BUTTON_ICON_COLOR              = 0x2000,
0331     TITLEBAR_BUTTON_USE_HOVER_COLOR         = 0x4000
0332 } ETitleBarButtonFlags;
0333 
0334 typedef enum {
0335     TITLEBAR_ICON_NONE,
0336     TITLEBAR_ICON_MENU_BUTTON,
0337     TITLEBAR_ICON_NEXT_TO_TITLE
0338 } ETitleBarIcon;
0339 
0340 typedef enum {
0341     TITLEBAR_CLOSE,
0342     TITLEBAR_MIN,
0343     TITLEBAR_MAX,
0344     TITLEBAR_HELP,
0345     TITLEBAR_MENU,
0346     TITLEBAR_SHADE,
0347     TITLEBAR_ALL_DESKTOPS,
0348     TITLEBAR_KEEP_ABOVE,
0349     TITLEBAR_KEEP_BELOW,
0350     NUM_TITLEBAR_BUTTONS
0351 } ETitleBarButtons;
0352 
0353 #define TBAR_VERSION_HACK        65535
0354 #define TBAR_BORDER_VERSION_HACK (TBAR_VERSION_HACK+1000)
0355 
0356 typedef std::map<int, QColor> TBCols;
0357 
0358 typedef enum
0359 {
0360     WINDOW_BORDER_COLOR_TITLEBAR_ONLY            = 0x01, // colorTitlebarOnly
0361     WINDOW_BORDER_USE_MENUBAR_COLOR_FOR_TITLEBAR = 0x02, // titlebarMenuColor
0362     WINDOW_BORDER_ADD_LIGHT_BORDER               = 0x04, // titlebarBorder
0363     WINDOW_BORDER_BLEND_TITLEBAR                 = 0x08, // titlebarBlend
0364     WINDOW_BORDER_SEPARATOR                      = 0x10,
0365     WINDOW_BORDER_FILL_TITLEBAR                  = 0x20
0366 } EWindowBorder;
0367 
0368 typedef enum
0369 {
0370     IMG_NONE,
0371     IMG_BORDERED_RINGS,
0372     IMG_PLAIN_RINGS,
0373     IMG_SQUARE_RINGS,
0374     IMG_FILE
0375 } EImageType;
0376 
0377 typedef struct {
0378     QString   file;
0379     QPixmap   img;
0380 } QtCPixmap;
0381 
0382 typedef enum {
0383     PP_TL,
0384     PP_TM,
0385     PP_TR,
0386     PP_BL,
0387     PP_BM,
0388     PP_BR,
0389     PP_LM,
0390     PP_RM,
0391     PP_CENTRED,
0392 } EPixPos;
0393 
0394 typedef struct
0395 {
0396     EImageType type;
0397     bool       loaded,
0398                onBorder;
0399     QtCPixmap  pixmap;
0400     int        width,
0401                height;
0402     EPixPos    pos;
0403 } QtCImage;
0404 
0405 typedef enum
0406 {
0407     THIN_BUTTONS    = 0x0001,
0408     THIN_MENU_ITEMS = 0x0002,
0409     THIN_FRAMES     = 0x0004
0410 } EThinFlags;
0411 
0412 typedef enum
0413 {
0414     SQUARE_NONE               = 0x0000,
0415     SQUARE_ENTRY              = 0x0001,
0416     SQUARE_PROGRESS           = 0x0002,
0417     SQUARE_SCROLLVIEW         = 0x0004,
0418     SQUARE_LISTVIEW_SELECTION = 0x0008,
0419     SQUARE_FRAME              = 0x0010,
0420     SQUARE_TAB_FRAME          = 0x0020,
0421     SQUARE_SLIDER             = 0x0040,
0422     SQUARE_SB_SLIDER          = 0x0080,
0423     SQUARE_WINDOWS            = 0x0100,
0424     SQUARE_TOOLTIPS           = 0x0200,
0425     SQUARE_POPUP_MENUS        = 0x0400,
0426 
0427     SQUARE_ALL                = 0xFFFF
0428 } ESquare;
0429 
0430 typedef enum
0431 {
0432     WM_DRAG_NONE             = 0,
0433     WM_DRAG_MENUBAR          = 1,
0434     WM_DRAG_MENU_AND_TOOLBAR = 2,
0435     WM_DRAG_ALL              = 3
0436 } EWmDrag;
0437 
0438 typedef enum
0439 {
0440     EFFECT_NONE,
0441     EFFECT_ETCH,
0442     EFFECT_SHADOW
0443 } EEffect;
0444 
0445 typedef enum {
0446     PIX_CHECK,
0447     PIX_DOT
0448 } EPixmap;
0449 
0450 typedef enum {
0451     WIDGET_TAB_TOP,
0452     WIDGET_TAB_BOT,
0453     WIDGET_STD_BUTTON,
0454     WIDGET_DEF_BUTTON,
0455     WIDGET_TOOLBAR_BUTTON,
0456     WIDGET_LISTVIEW_HEADER,
0457     WIDGET_SLIDER,
0458     WIDGET_SLIDER_TROUGH,
0459     WIDGET_FILLED_SLIDER_TROUGH,
0460     WIDGET_SB_SLIDER,
0461     WIDGET_SB_BUTTON,
0462     WIDGET_SB_BGND,
0463     WIDGET_TROUGH,
0464     WIDGET_CHECKBOX,
0465     WIDGET_RADIO_BUTTON,
0466     WIDGET_COMBO,
0467     WIDGET_COMBO_BUTTON,
0468     WIDGET_MENU_ITEM,
0469     WIDGET_PROGRESSBAR,
0470     WIDGET_PBAR_TROUGH,
0471 #ifndef QTC_UTILS_QT
0472     WIDGET_ENTRY_PROGRESSBAR,
0473     WIDGET_TOGGLE_BUTTON,
0474     WIDGET_SPIN_UP,
0475     WIDGET_SPIN_DOWN,
0476     WIDGET_UNCOLOURED_MO_BUTTON,
0477 #else // QTC_UTILS_QT
0478     WIDGET_CHECKBUTTON,        // Qt4 only
0479     WIDGET_MDI_WINDOW,         // Qt4 only
0480     WIDGET_MDI_WINDOW_TITLE,   // Qt4 only
0481     WIDGET_MDI_WINDOW_BUTTON,  // Qt4 only
0482     WIDGET_DOCK_WIDGET_TITLE,
0483     WIDGET_DIAL,
0484 #endif // QTC_UTILS_QT
0485     WIDGET_SPIN,
0486     WIDGET_ENTRY,
0487     WIDGET_SCROLLVIEW,
0488     WIDGET_SELECTION,
0489     WIDGET_FRAME,
0490     WIDGET_NO_ETCH_BTN,
0491     WIDGET_MENU_BUTTON,        // Qt4 only
0492     WIDGET_FOCUS,
0493     WIDGET_TAB_FRAME,
0494     WIDGET_TOOLTIP,
0495     WIDGET_OTHER
0496 } EWidget;
0497 
0498 typedef enum
0499 {
0500     APP_ALLOW_BASIC,
0501     APP_ALLOW_FADE,
0502     APP_ALLOW_STRIPED,
0503     APP_ALLOW_NONE
0504 } EAppAllow;
0505 
0506 #define IS_SLIDER(w) QtCurve::oneOf(w, WIDGET_SLIDER, WIDGET_SB_SLIDER)
0507 #define IS_TROUGH(w) QtCurve::oneOf(w, WIDGET_SLIDER_TROUGH, WIDGET_PBAR_TROUGH, \
0508                                     WIDGET_TROUGH, WIDGET_FILLED_SLIDER_TROUGH)
0509 
0510 typedef enum
0511 {
0512     IND_CORNER,
0513     IND_FONT_COLOR,
0514     IND_COLORED,
0515     IND_TINT,
0516     IND_GLOW,
0517     IND_DARKEN,
0518     IND_SELECTED,
0519     IND_NONE
0520 } EDefBtnIndicator;
0521 
0522 typedef enum
0523 {
0524     LINE_NONE,
0525     LINE_SUNKEN,
0526     LINE_FLAT,
0527     LINE_DOTS,
0528     LINE_1DOT,
0529     LINE_DASHES,
0530 } ELine;
0531 
0532 typedef enum
0533 {
0534     TB_NONE,
0535     TB_LIGHT,
0536     TB_DARK,
0537     TB_LIGHT_ALL,
0538     TB_DARK_ALL
0539 } ETBarBorder;
0540 
0541 typedef enum
0542 {
0543     TBTN_STANDARD,
0544     TBTN_RAISED,
0545     TBTN_JOINED
0546 } ETBarBtn;
0547 
0548 typedef enum
0549 {
0550     BORDER_FLAT,
0551     BORDER_RAISED,
0552     BORDER_SUNKEN,
0553     BORDER_LIGHT
0554 } EBorder;
0555 
0556 /*
0557     This whole EShade enum is a complete mess!
0558     For menubars, we dont blend - so blend is selected, and selected is darken
0559     For check/radios - we dont blend, so blend is selected, and we dont allow darken
0560 */
0561 typedef enum {
0562     SHADE_NONE,
0563     SHADE_CUSTOM,
0564     SHADE_SELECTED,
0565     SHADE_BLEND_SELECTED,
0566     SHADE_DARKEN,
0567     SHADE_WINDOW_BORDER
0568 } EShade;
0569 
0570 typedef enum {
0571     ECOLOR_BASE,
0572     ECOLOR_BACKGROUND,
0573     ECOLOR_DARK,
0574 } EColor;
0575 
0576 typedef enum {
0577     ROUND_NONE,
0578     ROUND_SLIGHT,
0579     ROUND_FULL,
0580     ROUND_EXTRA,
0581     ROUND_MAX
0582 } ERound;
0583 
0584 typedef enum {
0585     GB_LBL_BOLD = 0x01,
0586     GB_LBL_CENTRED = 0x02,
0587     GB_LBL_INSIDE = 0x04,
0588     GB_LBL_OUTSIDE = 0x08
0589 } EGBLabel;
0590 
0591 typedef enum {
0592     MO_NONE,
0593     MO_COLORED,
0594     MO_COLORED_THICK,
0595     MO_PLASTIK,
0596     MO_GLOW
0597 } EMouseOver;
0598 
0599 typedef enum {
0600     STRIPE_NONE,
0601     STRIPE_PLAIN,
0602     STRIPE_DIAGONAL,
0603     STRIPE_FADE
0604 } EStripe;
0605 
0606 typedef enum {
0607     SLIDER_PLAIN,
0608     SLIDER_ROUND,
0609     SLIDER_PLAIN_ROTATED,
0610     SLIDER_ROUND_ROTATED,
0611     SLIDER_TRIANGULAR,
0612     SLIDER_CIRCULAR
0613 } ESliderStyle;
0614 
0615 typedef enum {
0616     FOCUS_STANDARD,
0617     FOCUS_RECTANGLE,
0618     FOCUS_FULL,
0619     FOCUS_FILLED,
0620     FOCUS_LINE,
0621     FOCUS_GLOW,
0622     FOCUS_NONE
0623 } EFocus;
0624 
0625 typedef enum {
0626     TAB_MO_TOP,
0627     TAB_MO_BOTTOM,
0628     TAB_MO_GLOW
0629 } ETabMo;
0630 
0631 typedef enum {
0632     GT_HORIZ,
0633     GT_VERT
0634 } EGradType;
0635 
0636 typedef enum {
0637     GLOW_NONE,
0638     GLOW_START,
0639     GLOW_MIDDLE,
0640     GLOW_END
0641 } EGlow;
0642 
0643 enum {
0644     HIDE_NONE     = 0x00,
0645     HIDE_KEYBOARD = 0x01,
0646     HIDE_KWIN     = 0x02
0647 };
0648 
0649 typedef enum {
0650     ALIGN_LEFT,
0651     ALIGN_CENTER,
0652     ALIGN_FULL_CENTER,
0653     ALIGN_RIGHT
0654 } EAlign;
0655 
0656 struct GradientStop {
0657     GradientStop(double p=0.0, double v=0.0, double a=1.0) : pos(p), val(v), alpha(a) { }
0658 
0659     bool operator==(const GradientStop &o) const
0660     {
0661         return (qtcEqual(pos, o.pos) && qtcEqual(val, o.val) &&
0662                 qtcEqual(alpha, o.alpha));
0663     }
0664 
0665     bool operator<(const GradientStop &o) const
0666     {
0667         return pos<o.pos || (qtcEqual(pos, o.pos) &&
0668                              (val < o.val || (qtcEqual(val, o.val) &&
0669                                               alpha < o.alpha)));
0670     }
0671 
0672     double pos,
0673            val,
0674            alpha;
0675 };
0676 
0677 typedef struct
0678 {
0679     int titleHeight,
0680         toolTitleHeight,
0681         bottom,
0682         sides;
0683 } WindowBorders;
0684 
0685 struct GradientStopCont : public std::set<GradientStop>
0686 {
0687     GradientStopCont fix() const
0688     {
0689         GradientStopCont c(*this);
0690         if(size())
0691         {
0692             GradientStopCont::const_iterator   first(c.begin());
0693             GradientStopCont::reverse_iterator last(c.rbegin());
0694 
0695             if((*first).pos>0.001)
0696                 c.insert(GradientStop(0.0, 1.0));
0697             if((*last).pos<0.999)
0698                 c.insert(GradientStop(1.0, 1.0));
0699         }
0700         return c;
0701     }
0702 };
0703 struct Gradient {
0704     Gradient() :
0705         border(GB_3D)
0706     {
0707     }
0708 
0709     bool
0710     operator==(const Gradient &o) const
0711     {
0712         return border == o.border && stops == o.stops;
0713     }
0714 
0715     EGradientBorder border;
0716     GradientStopCont stops;
0717 };
0718 
0719 #define USE_CUSTOM_SHADES(A) ((A).customShades[0]>0.00001)
0720 #define USE_CUSTOM_ALPHAS(A) ((A).customAlphas[0]>0.00001)
0721 
0722 typedef std::map<EAppearance, Gradient> GradientCont;
0723 typedef struct {
0724     int              version,
0725                      contrast,
0726                      passwordChar,
0727                      highlightFactor,
0728                      lighterPopupMenuBgnd,
0729                      menuDelay,
0730                      menuCloseDelay,
0731                      sliderWidth,
0732                      tabBgnd,
0733                      colorSelTab,
0734                      expanderHighlight,
0735                      crHighlight,
0736                      splitterHighlight,
0737                      crSize,
0738                      gbFactor,
0739                      gbLabel,
0740                      thin;
0741     ERound           round;
0742     bool             embolden,
0743                      highlightTab,
0744                      roundAllTabs,
0745                      animatedProgress,
0746                      customMenuTextColor,
0747                      menubarMouseOver,
0748                      useHighlightForMenu,
0749                      shadeMenubarOnlyWhenActive,
0750                      lvButton,
0751                      drawStatusBarFrames,
0752                      fillSlider,
0753                      roundMbTopOnly,
0754                      gtkScrollViews,
0755                      stdSidebarButtons,
0756                      toolbarTabs,
0757                      gtkComboMenus,
0758                      mapKdeIcons,
0759                      gtkButtonOrder,
0760                      fadeLines,
0761                      reorderGtkButtons,
0762                      borderMenuitems,
0763                      colorMenubarMouseOver,
0764                      darkerBorders,
0765                      vArrows,
0766                      xCheck,
0767                      crButton,
0768                      smallRadio,
0769                      fillProgress,
0770                      comboSplitter,
0771                      highlightScrollViews,
0772                      etchEntry,
0773                      colorSliderMouseOver,
0774                      thinSbarGroove,
0775                      flatSbarButtons,
0776                      borderSbarGroove,
0777                      borderProgress,
0778                      popupBorder,
0779                      unifySpinBtns,
0780                      unifyCombo,
0781                      unifySpin,
0782                      borderTab,
0783                      borderInactiveTab,
0784                      doubleGtkComboArrow,
0785                      menuIcons,
0786                      stdBtnSizes,
0787                      xbar,
0788                      forceAlternateLvCols,
0789                      invertBotTab,
0790                      boldProgress,
0791                      coloredTbarMo,
0792                      borderSelection,
0793                      stripedSbar,
0794                      shadePopupMenu,
0795                      hideShortcutUnderline;
0796     EFrame           groupBox;
0797     EGlow            glowProgress;
0798     bool             lvLines;
0799     EGradType        bgndGrad,
0800                      menuBgndGrad;
0801     int              menubarHiding,
0802                      statusbarHiding,
0803                      square,
0804                      windowDrag,
0805                      windowBorder,
0806                      bgndOpacity,
0807                      menuBgndOpacity,
0808                      dlgOpacity,
0809                      shadowSize;
0810     int              dwtSettings;
0811     int              titlebarButtons;
0812     TBCols           titlebarButtonColors;
0813     ETitleBarIcon    titlebarIcon;
0814     EStripe          stripedProgress;
0815     ESliderStyle     sliderStyle;
0816     EMouseOver       coloredMouseOver;
0817     ETBarBorder      toolbarBorders;
0818     ETBarBtn         tbarBtns;
0819     EDefBtnIndicator defBtnIndicator;
0820     ELine            sliderThumbs,
0821                      handles,
0822                      toolbarSeparators,
0823                      splitters;
0824     ETabMo           tabMouseOver;
0825 /* NOTE: If add an appearance setting, increase the number of custmo gradients to match! */
0826     EAppearance      appearance,
0827                      bgndAppearance,
0828                      menuBgndAppearance,
0829                      menubarAppearance,
0830                      menuitemAppearance,
0831                      toolbarAppearance,
0832                      lvAppearance,
0833                      tabAppearance,
0834                      activeTabAppearance,
0835                      sliderAppearance,
0836                      titlebarAppearance,
0837                      inactiveTitlebarAppearance,
0838                      titlebarButtonAppearance,
0839                      dwtAppearance,
0840                      selectionAppearance,
0841                      menuStripeAppearance,
0842                      progressAppearance,
0843                      progressGrooveAppearance,
0844                      grooveAppearance,
0845                      sunkenAppearance,
0846                      sbarBgndAppearance,
0847                      sliderFill,
0848                      tooltipAppearance,
0849                      tbarBtnAppearance;
0850     EShade           shadeSliders,
0851                      shadeMenubars,
0852                      menuStripe,
0853                      shadeCheckRadio,
0854                      comboBtn,
0855                      sortedLv,
0856                      crColor,
0857                      progressColor;
0858     EColor           progressGrooveColor;
0859     EEffect          buttonEffect,
0860                      tbarBtnEffect;
0861     EScrollbar       scrollbarType;
0862     EFocus           focus;
0863     QColor customMenubarsColor,
0864                      customSlidersColor,
0865                      customMenuNormTextColor,
0866                      customMenuSelTextColor,
0867                      customMenuStripeColor,
0868                      customCheckRadioColor,
0869                      customComboBtnColor,
0870                      customSortedLvColor,
0871                      customCrBgndColor,
0872                      customProgressColor;
0873     Shading shading;
0874     EAlign           titlebarAlignment;
0875     EEffect          titlebarEffect;
0876     bool             centerTabText;
0877     double           customShades[QTC_NUM_STD_SHADES],
0878                      customAlphas[NUM_STD_ALPHAS];
0879     GradientCont     customGradient;
0880     QtCPixmap        bgndPixmap;
0881     QtCPixmap        menuBgndPixmap;
0882     QtCImage         bgndImage,
0883                      menuBgndImage;
0884     /* NOTE: If add any more settings here, need to alter copyOpts/freeOpts/defaultSettings in config_file.c */
0885     Strings          noBgndGradientApps,
0886                      noBgndOpacityApps,
0887                      noMenuBgndOpacityApps,
0888                      noBgndImageApps;
0889     Strings          noMenuStripeApps;
0890     Strings          menubarApps,
0891                      statusbarApps,
0892                      useQtFileDialogApps,
0893                      windowDragWhiteList,
0894                      windowDragBlackList,
0895                      nonnativeMenubarApps;
0896 #ifdef Q_OS_MAC
0897     // list of apps that have been forced to use a non-native menubar during this process lifetime
0898     // should only contain the name of the running executable.
0899     // NOT saved to disk!
0900     Strings          currentNonnativeMenubarApps;
0901 #endif
0902     bool             onlyTicksInMenu;
0903     bool             buttonStyleMenuSections;
0904 } Options;
0905 
0906 void qtcSetupGradient(Gradient *grad, EGradientBorder border, int numStops, ...);
0907 const Gradient *qtcGetGradient(EAppearance app, const Options *opts);
0908 
0909 QTC_ALWAYS_INLINE static inline bool
0910 qtcDrawMenuBorder(const Options &opts)
0911 {
0912     return (opts.menuBgndAppearance != APPEARANCE_FLAT &&
0913             opts.version >= qtcMakeVersion(1, 7) &&
0914             qtcUseBorder(qtcGetGradient(opts.menuBgndAppearance,
0915                                         &opts)->border));
0916 }
0917 
0918 QTC_ALWAYS_INLINE static inline bool
0919 qtcIsCustomBgnd(const Options &opts)
0920 {
0921     return (!qtcIsFlatBgnd(opts.bgndAppearance) ||
0922             opts.bgndImage.type != IMG_NONE ||
0923             opts.bgndOpacity != 100 || opts.dlgOpacity != 100);
0924 }
0925 
0926 #ifdef QTC_QT4_ENABLE_KDE
0927 #include <KDE/KColorUtils>
0928 #define tint(COLA, COLB, FACTOR) KColorUtils::tint((COLA), (COLB), (FACTOR))
0929 #define midColor(COLA, COLB) KColorUtils::mix((COLA), (COLB), 0.5)
0930 #else
0931 #include <qtcurve-utils/color.h>
0932 #define tint(COLA, COLB, FACTOR) qtcColorTint(&(COLA), &(COLB), (FACTOR))
0933 #define midColor(COLA, COLB) qtcColorMix(&(COLA), &(COLB), 0.5)
0934 #endif
0935 
0936 EAppearance qtcWidgetApp(EWidget w, const Options *opts, bool active=true);
0937 
0938 typedef enum
0939 {
0940     RADIUS_SELECTION,
0941     RADIUS_INTERNAL,
0942     RADIUS_EXTERNAL,
0943     RADIUS_ETCH
0944 } ERadius;
0945 
0946 #define MIN_ROUND_MAX_HEIGHT    12
0947 #define MIN_ROUND_MAX_WIDTH     24
0948 #define BGND_SHINE_SIZE 300
0949 #define BGND_SHINE_STEPS  8
0950 
0951 #define MIN_ROUND_FULL_SIZE     8
0952 #define MIN_ROUND_EXTRA_SIZE(W) (WIDGET_SPIN==(W) ? 7 : 14)
0953 
0954 namespace QtCurve {
0955 
0956 static inline bool
0957 isMaxRoundWidget(EWidget w)
0958 {
0959     return oneOf(w, WIDGET_STD_BUTTON, WIDGET_DEF_BUTTON);
0960 }
0961 
0962 static inline bool
0963 isExtraRoundWidget(EWidget w)
0964 {
0965     return noneOf(w, WIDGET_MENU_ITEM, WIDGET_TAB_FRAME, WIDGET_PBAR_TROUGH,
0966                   WIDGET_PROGRESSBAR, WIDGET_MDI_WINDOW,
0967                   WIDGET_MDI_WINDOW_TITLE);
0968 }
0969 
0970 static inline int
0971 sbSliderMOLen(const Options &opts, int len)
0972 {
0973     if (len < 22 && opts.round < ROUND_FULL)
0974         return 2;
0975     if (len < 32 || noneOf(opts.shadeSliders, SHADE_SELECTED,
0976                            SHADE_BLEND_SELECTED))
0977         return 4;
0978     return 6;
0979 }
0980 
0981 }
0982 
0983 #define EXTRA_INNER_RADIUS   3.5
0984 #define EXTRA_OUTER_RADIUS   4.5
0985 #define EXTRA_ETCH_RADIUS    5.5
0986 #define FULL_INNER_RADIUS    1.5
0987 #define FULL_OUTER_RADIUS    2.5
0988 #define FULL_ETCH_RADIUS     3.5
0989 #define SLIGHT_INNER_RADIUS  0.75
0990 #define SLIGHT_OUTER_RADIUS  1.75
0991 #define SLIGHT_ETCH_RADIUS   2.75
0992 
0993 #define MAX_RADIUS_INTERNAL 9.0
0994 #define MAX_RADIUS_EXTERNAL (MAX_RADIUS_INTERNAL+2.0)
0995 
0996 ERound qtcGetWidgetRound(const Options *opts, int w, int h, EWidget widget);
0997 double qtcGetRadius(const Options *opts, int w, int h, EWidget widget,
0998                     ERadius rad);
0999 
1000 #endif // __COMMON_H__