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

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