File indexing completed on 2024-04-21 05:46:53

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/options.h>
0029 #include <qtcurve-utils/color.h>
0030 
0031 /*
0032     The following #define disables the rounding when scrollbar type==none.
0033 #define SIMPLE_SCROLLBARS
0034 */
0035 
0036 /*
0037     The following #define controls whether a scrollbar's slider should overlap
0038     the scrollbar buttons when at min/max. This removes the thick looking line
0039     between the slider and the buttons.
0040 */
0041 #define INCREASE_SB_SLIDER
0042 
0043 #include <glib.h>
0044 #include <gtk/gtk.h>
0045 #include <gdk/gdk.h>
0046 
0047 typedef char **Strings;
0048 
0049 #define SETTINGS_GROUP        "Settings"
0050 #define KWIN_GROUP            "KWin"
0051 
0052 /* qtc_<theme name>.themerc support */
0053 #define THEME_DIR    "/share/apps/kstyle/themes/"
0054 #define THEME_DIR4   "/share/kde4/apps/kstyle/themes/"
0055 #define THEME_PREFIX "qtc_"
0056 #define THEME_SUFFIX ".themerc"
0057 #define BORDER_SIZE_FILE "windowBorderSizes"
0058 
0059 #define LV_SIZE      7
0060 
0061 #define LARGE_ARR_WIDTH  7
0062 #define LARGE_ARR_HEIGHT 4
0063 #define SMALL_ARR_WIDTH  5
0064 #define SMALL_ARR_HEIGHT 3
0065 
0066 #define NUM_EXTRA_SHADES 3
0067 
0068 enum {
0069     ALPHA_ETCH_LIGHT = 0,
0070     ALPHA_ETCH_DARK,
0071     NUM_STD_ALPHAS
0072 };
0073 
0074 #define TOTAL_SHADES (QTC_NUM_STD_SHADES + NUM_EXTRA_SHADES)
0075 #define ORIGINAL_SHADE   TOTAL_SHADES
0076 
0077 #define SHADE_ORIG_HIGHLIGHT QTC_NUM_STD_SHADES
0078 #define SHADE_4_HIGHLIGHT (QTC_NUM_STD_SHADES + 1)
0079 #define SHADE_2_HIGHLIGHT (QTC_NUM_STD_SHADES + 2)
0080 
0081 #define DEFAULT_CONTRAST 7
0082 
0083 #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))
0084 #define SLIDER_SIZE (opts.sliderWidth<DEFAULT_SLIDER_WIDTH ? DEFAULT_SLIDER_WIDTH-2 : opts.sliderWidth)
0085 #define CIRCULAR_SLIDER_SIZE 15
0086 #define GLOW_MO           1 /*ORIGINAL_SHADE*/
0087 #define GLOW_DEFBTN       1
0088 #define GLOW_ALPHA(DEF)   ((DEF) ? 0.5 : 0.65)
0089 #define DEF_BNT_TINT      0.4
0090 #define ENTRY_INNER_ALPHA 0.4
0091 #define INACTIVE_SEL_ALPHA 0.5
0092 
0093 #define BLEND_TITLEBAR     (opts.menubarAppearance==opts.titlebarAppearance && opts.menubarAppearance==opts.inactiveTitlebarAppearance && \
0094                            !(opts.windowBorder&WINDOW_BORDER_BLEND_TITLEBAR) && SHADE_WINDOW_BORDER==opts.shadeMenubars && opts.windowDrag)
0095 
0096 #define STD_BORDER_BR      2
0097 #define PBAR_BORDER        4
0098 #define ARROW_MO_SHADE     4
0099 #define LOWER_BORDER_ALPHA 0.35
0100 #define BORDER_VAL(E) (/*(E) ?*/ QTC_STD_BORDER/* : DISABLED_BORDER*/)
0101 #define SLIDER_MO_BORDER_VAL 3
0102 
0103 #define FRAME_DARK_SHADOW 2
0104 #define FOCUS_SHADE(SEL)         (FOCUS_GLOW==opts.focus ? GLOW_MO : ((SEL) ? 3 : ORIGINAL_SHADE))
0105 #define MENU_STRIPE_SHADE (opts.lighterPopupMenuBgnd ? ORIGINAL_SHADE : 2)
0106 #define MENU_SEP_SHADE    (opts.lighterPopupMenuBgnd ? 4 : 3)
0107 
0108 #define BGND_STRIPE_SHADE 0.95
0109 
0110 #define INVERT_SHADE(A) (1.0+(1.0-(A)))
0111 
0112 #define TOOLBAR_SEP_GAP        (opts.fadeLines ? 5 : 6)
0113 #define FADE_SIZE              0.4
0114 
0115 #define IS_GLASS(A) QtCurve::oneOf(A, APPEARANCE_DULL_GLASS, APPEARANCE_SHINY_GLASS)
0116 #define IS_CUSTOM(A) ((A)>=APPEARANCE_CUSTOM1 && (A)<(APPEARANCE_CUSTOM1+NUM_CUSTOM_GRAD))
0117 
0118 #define MENUBAR_DARK_LIMIT (160<<8)
0119 #define TOO_DARK(A) ((A).red<MENUBAR_DARK_LIMIT || (A).green<MENUBAR_DARK_LIMIT || (A).blue<MENUBAR_DARK_LIMIT)
0120 
0121 #define TO_FACTOR(A) ((100.0+((double)(A)))/100.0)
0122 #define DEFAULT_HIGHLIGHT_FACTOR                   3
0123 #define DEFAULT_SPLITTER_HIGHLIGHT_FACTOR          3
0124 #define DEFAULT_CR_HIGHLIGHT_FACTOR                0
0125 #define DEFAULT_EXPANDER_HIGHLIGHT_FACTOR          3
0126 #define MAX_HIGHLIGHT_FACTOR                      50
0127 #define MIN_HIGHLIGHT_FACTOR                     -50
0128 #define MENUBAR_DARK_FACTOR        TO_FACTOR(-3)
0129 #define LV_HEADER_DARK_FACTOR      TO_FACTOR(-10)
0130 #define DEF_POPUPMENU_LIGHT_FACTOR                 2
0131 #define MIN_LIGHTER_POPUP_MENU                  -100
0132 #define MAX_LIGHTER_POPUP_MENU                   100
0133 
0134 #define MIN_GB_FACTOR -50
0135 #define MAX_GB_FACTOR  50
0136 #define DEF_GB_FACTOR  -3
0137 
0138 #define TO_ALPHA(A) (std::abs(A) / 100.0)
0139 #define DEF_COLOR_SEL_TAB_FACTOR  25
0140 #define MIN_COLOR_SEL_TAB_FACTOR   0
0141 #define MAX_COLOR_SEL_TAB_FACTOR 100
0142 
0143 #define DEF_TAB_BGND         0
0144 #define MIN_TAB_BGND        -5
0145 #define MAX_TAB_BGND         5
0146 
0147 #define DEFAULT_MENU_DELAY 225
0148 #define MIN_MENU_DELAY       1
0149 #define MAX_MENU_DELAY     500
0150 
0151 #define DEFAULT_SLIDER_WIDTH  15
0152 #define MIN_SLIDER_WIDTH_ROUND 7
0153 #define MIN_SLIDER_WIDTH_THIN_GROOVE 9
0154 #define MIN_SLIDER_WIDTH       5
0155 #define MAX_SLIDER_WIDTH      31
0156 
0157 #define SIZE_GRIP_SIZE 12
0158 
0159 #define USE_GLOW_FOCUS(mouseOver) (FOCUS_GLOW==opts.focus && (MO_GLOW!=opts.coloredMouseOver || !(mouseOver)))
0160 
0161 #define MENUBAR_GLASS_SELECTED_DARK_FACTOR 0.9
0162 #define MENUITEM_FADE_SIZE 48
0163 
0164 #define NUM_SPLITTER_DASHES 21
0165 
0166 #define ETCH_WIDGET(w)                                                  \
0167     (QtCurve::oneOf(w, WIDGET_STD_BUTTON, WIDGET_DEF_BUTTON,            \
0168                     WIDGET_TOGGLE_BUTTON, WIDGET_SLIDER_TROUGH,         \
0169                     WIDGET_CHECKBOX, WIDGET_RADIO_BUTTON,               \
0170                     WIDGET_FILLED_SLIDER_TROUGH, WIDGET_COMBO,          \
0171                     WIDGET_TOOLBAR_BUTTON, WIDGET_UNCOLOURED_MO_BUTTON) || \
0172      ((w) == WIDGET_SLIDER && opts.coloredMouseOver == MO_GLOW))
0173 
0174 #define SLIDER(w) QtCurve::oneOf(w, WIDGET_SB_SLIDER, WIDGET_SLIDER)
0175 #define CIRCULAR_SLIDER(w) (WIDGET_SLIDER==(w) && SLIDER_CIRCULAR==opts.sliderStyle)
0176 
0177 #define MODIFY_AGUA_X(A, X) (APPEARANCE_AGUA==(A) ?  (X) : (A))
0178 #define MODIFY_AGUA(A)      MODIFY_AGUA_X((A), APPEARANCE_AGUA_MOD)
0179 #define AGUA_MAX 32.0
0180 #define AGUA_MID_SHADE 0.85
0181 
0182 #define COLORED_BORDER_SIZE 3
0183 #define PROGRESS_CHUNK_WIDTH 10
0184 #define STRIPE_WIDTH 10
0185 #define DRAW_LIGHT_BORDER(SUKEN, WIDGET, APP)                           \
0186     (!(SUKEN) && (qtcGetGradient(APP, &opts)->border == GB_LIGHT) &&    \
0187      (WIDGET) != WIDGET_MENU_ITEM && !IS_TROUGH(WIDGET) &&              \
0188      ((WIDGET) != WIDGET_DEF_BUTTON || opts.defBtnIndicator != IND_COLORED))
0189 
0190 #define DRAW_3D_FULL_BORDER(SUNKEN, APP) \
0191     (!(SUNKEN) && GB_3D_FULL==qtcGetGradient((APP), &opts)->border)
0192 
0193 #define DRAW_3D_BORDER(SUNKEN, APP) \
0194     (!(SUNKEN) && GB_3D==qtcGetGradient((APP), &opts)->border)
0195 
0196 #define DRAW_SHINE(SUNKEN, APP) \
0197     (!(SUNKEN) && GB_SHINE==qtcGetGradient((APP), &opts)->border)
0198 
0199 #define LIGHT_BORDER(APP) (APPEARANCE_DULL_GLASS==(APP) ? 1 : 0)
0200 
0201 #define PROGRESS_ANIMATION 100
0202 #define MIN_SLIDER_SIZE(A) (LINE_DOTS==(A) ? 24 : 20)
0203 
0204 #define CR_SMALL_SIZE 13
0205 #define CR_LARGE_SIZE 15
0206 
0207 #define TAB_APP(A)                                                      \
0208     (QtCurve::oneOf(A, APPEARANCE_BEVELLED, APPEARANCE_SPLIT_GRADIENT) ?      \
0209      APPEARANCE_GRADIENT : (A))
0210 #define NORM_TAB_APP TAB_APP(opts.tabAppearance)
0211 #define SEL_TAB_APP  TAB_APP(opts.activeTabAppearance)
0212 
0213 #define SLIDER_MO_SHADE  (SHADE_SELECTED==opts.shadeSliders ? 1 : (SHADE_BLEND_SELECTED==opts.shadeSliders ? 0 : ORIGINAL_SHADE))
0214 #define SLIDER_MO_PLASTIK_BORDER (SHADE_SELECTED==opts.shadeSliders || SHADE_BLEND_SELECTED==opts.shadeSliders ? 2 : 1)
0215 #define SLIDER_MO_LEN    (SLIDER_TRIANGULAR==opts.sliderStyle ? 2 : (SHADE_SELECTED==opts.shadeSliders || SHADE_BLEND_SELECTED==opts.shadeSliders ? 4 : 3))
0216 
0217 #define CR_MO_FILL          1
0218 #define MO_DEF_BTN          2
0219 #define MO_PLASTIK_DARK(W)  (WIDGET_DEF_BUTTON==(W) && IND_COLORED==opts.defBtnIndicator ? 3 : 2) /*? 2 : 1) */
0220 #define MO_PLASTIK_LIGHT(W) (WIDGET_DEF_BUTTON==(W) && IND_COLORED==opts.defBtnIndicator ? 4 : 1) /*? 2 : 0) */
0221 
0222 #define MO_STD_DARK(W)                                          \
0223     (opts.coloredMouseOver == MO_GLOW ? 1 : MO_PLASTIK_DARK(W))
0224 #define MO_STD_LIGHT(W, S)                                              \
0225     (opts.coloredMouseOver == MO_GLOW ? 1 : MO_PLASTIK_LIGHT(W))
0226 
0227 #define FOCUS_ALPHA              0.08
0228 #define BORDER_BLEND_ALPHA(W)                                         \
0229     (QtCurve::oneOf(W, WIDGET_ENTRY, WIDGET_SCROLLVIEW,               \
0230                     WIDGET_SPIN, WIDGET_COMBO_BUTTON) ? 0.4 : 0.7)
0231 
0232 #define ETCH_TOP_ALPHA           0.055
0233 #define ETCH_BOTTOM_ALPHA        0.1
0234 #define ETCH_RADIO_TOP_ALPHA     0.09
0235 
0236 #define RINGS_INNER_ALPHA(T) qtc_ring_alpha[IMG_PLAIN_RINGS==(T) ? 1 : 0] //(IMG_PLAIN_RINGS==opts.bgndImage.type ? 0.25 :  0.125)
0237 #define RINGS_OUTER_ALPHA    qtc_ring_alpha[2] //0.5
0238 #define RINGS_WIDTH(T)       (IMG_SQUARE_RINGS==T ? 260 : 450)
0239 #define RINGS_HEIGHT(T)      (IMG_SQUARE_RINGS==T ? 220 : 360)
0240 
0241 #define RINGS_SQUARE_LARGE_ALPHA (RINGS_OUTER_ALPHA*0.675)
0242 #define RINGS_SQUARE_SMALL_ALPHA (RINGS_OUTER_ALPHA*0.50)
0243 #define RINGS_SQUARE_LINE_WIDTH  20.0
0244 #define RINGS_SQUARE_RADIUS      18.0
0245 #define RINGS_SQUARE_LARGE_SIZE  120.0
0246 #define RINGS_SQUARE_SMALL_SIZE  100.0
0247 #define GLOW_PROG_ALPHA 0.55
0248 
0249 typedef enum {
0250     WINDOW_BORDER_COLOR_TITLEBAR_ONLY            = 0x01, // colorTitlebarOnly
0251     WINDOW_BORDER_USE_MENUBAR_COLOR_FOR_TITLEBAR = 0x02, // titlebarMenuColor
0252     WINDOW_BORDER_ADD_LIGHT_BORDER               = 0x04, // titlebarBorder
0253     WINDOW_BORDER_BLEND_TITLEBAR                 = 0x08, // titlebarBlend
0254     WINDOW_BORDER_SEPARATOR                      = 0x10,
0255     WINDOW_BORDER_FILL_TITLEBAR                  = 0x20
0256 } EWindowBorder;
0257 
0258 typedef enum {
0259     IMG_NONE,
0260     IMG_BORDERED_RINGS,
0261     IMG_PLAIN_RINGS,
0262     IMG_SQUARE_RINGS,
0263     IMG_FILE
0264 } EImageType;
0265 
0266 typedef struct {
0267     const char *file;
0268     GdkPixbuf *img;
0269 } QtCPixmap;
0270 
0271 typedef enum {
0272     PP_TL,
0273     PP_TM,
0274     PP_TR,
0275     PP_BL,
0276     PP_BM,
0277     PP_BR,
0278     PP_LM,
0279     PP_RM,
0280     PP_CENTRED,
0281 } EPixPos;
0282 
0283 typedef struct {
0284     EImageType type;
0285     bool       loaded,
0286                onBorder;
0287     QtCPixmap  pixmap;
0288     int        width,
0289                height;
0290     EPixPos    pos;
0291 } QtCImage;
0292 
0293 typedef enum {
0294     THIN_BUTTONS    = 0x0001,
0295     THIN_MENU_ITEMS = 0x0002,
0296     THIN_FRAMES     = 0x0004
0297 } EThinFlags;
0298 
0299 typedef enum {
0300     SQUARE_NONE               = 0x0000,
0301     SQUARE_ENTRY              = 0x0001,
0302     SQUARE_PROGRESS           = 0x0002,
0303     SQUARE_SCROLLVIEW         = 0x0004,
0304     SQUARE_LISTVIEW_SELECTION = 0x0008,
0305     SQUARE_FRAME              = 0x0010,
0306     SQUARE_TAB_FRAME          = 0x0020,
0307     SQUARE_SLIDER             = 0x0040,
0308     SQUARE_SB_SLIDER          = 0x0080,
0309     SQUARE_WINDOWS            = 0x0100,
0310     SQUARE_TOOLTIPS           = 0x0200,
0311     SQUARE_POPUP_MENUS        = 0x0400,
0312 
0313     SQUARE_ALL                = 0xFFFF
0314 } ESquare;
0315 
0316 typedef enum {
0317     WM_DRAG_NONE             = 0,
0318     WM_DRAG_MENUBAR          = 1,
0319     WM_DRAG_MENU_AND_TOOLBAR = 2,
0320     WM_DRAG_ALL              = 3
0321 } EWmDrag;
0322 
0323 typedef enum
0324 {
0325     EFFECT_NONE,
0326     EFFECT_ETCH,
0327     EFFECT_SHADOW
0328 } EEffect;
0329 
0330 typedef enum
0331 {
0332     PIX_CHECK,
0333     PIX_BLANK
0334 } EPixmap;
0335 
0336 typedef enum {
0337     WIDGET_TAB_TOP,
0338     WIDGET_TAB_BOT,
0339     WIDGET_STD_BUTTON,
0340     WIDGET_DEF_BUTTON,
0341     WIDGET_TOOLBAR_BUTTON,
0342     WIDGET_LISTVIEW_HEADER,
0343     WIDGET_SLIDER,
0344     WIDGET_SLIDER_TROUGH,
0345     WIDGET_FILLED_SLIDER_TROUGH,
0346     WIDGET_SB_SLIDER,
0347     WIDGET_SB_BUTTON,
0348     WIDGET_SB_BGND,
0349     WIDGET_TROUGH,
0350     WIDGET_CHECKBOX,
0351     WIDGET_RADIO_BUTTON,
0352     WIDGET_COMBO,
0353     WIDGET_COMBO_BUTTON,
0354     WIDGET_MENU_ITEM,
0355     WIDGET_PROGRESSBAR,
0356     WIDGET_PBAR_TROUGH,
0357     WIDGET_ENTRY_PROGRESSBAR,
0358     WIDGET_TOGGLE_BUTTON,
0359     WIDGET_SPIN_UP,
0360     WIDGET_SPIN_DOWN,
0361     WIDGET_UNCOLOURED_MO_BUTTON,
0362     WIDGET_SPIN,
0363     WIDGET_ENTRY,
0364     WIDGET_SCROLLVIEW,
0365     WIDGET_SELECTION,
0366     WIDGET_FRAME,
0367     WIDGET_NO_ETCH_BTN,
0368     WIDGET_MENU_BUTTON,        // Qt4 only
0369     WIDGET_FOCUS,
0370     WIDGET_TAB_FRAME,
0371     WIDGET_TOOLTIP,
0372     WIDGET_OTHER
0373 } EWidget;
0374 
0375 typedef enum
0376 {
0377     APP_ALLOW_BASIC,
0378     APP_ALLOW_FADE,
0379     APP_ALLOW_STRIPED,
0380     APP_ALLOW_NONE
0381 } EAppAllow;
0382 
0383 #define IS_SLIDER(w) QtCurve::oneOf(w, WIDGET_SLIDER, WIDGET_SB_SLIDER)
0384 #define IS_TROUGH(w) QtCurve::oneOf(w, WIDGET_SLIDER_TROUGH,            \
0385                                     WIDGET_PBAR_TROUGH, WIDGET_TROUGH,  \
0386                                     WIDGET_FILLED_SLIDER_TROUGH)
0387 #define IS_TOGGLE_BUTTON(W) QtCurve::oneOf(W, WIDGET_TOGGLE_BUTTON, \
0388                                            WIDGET_CHECKBOX)
0389 
0390 typedef enum {
0391     IND_CORNER,
0392     IND_FONT_COLOR,
0393     IND_COLORED,
0394     IND_TINT,
0395     IND_GLOW,
0396     IND_DARKEN,
0397     IND_SELECTED,
0398     IND_NONE
0399 } EDefBtnIndicator;
0400 
0401 typedef enum
0402 {
0403     LINE_NONE,
0404     LINE_SUNKEN,
0405     LINE_FLAT,
0406     LINE_DOTS,
0407     LINE_1DOT,
0408     LINE_DASHES,
0409 } ELine;
0410 
0411 typedef enum
0412 {
0413     TB_NONE,
0414     TB_LIGHT,
0415     TB_DARK,
0416     TB_LIGHT_ALL,
0417     TB_DARK_ALL
0418 } ETBarBorder;
0419 
0420 typedef enum
0421 {
0422     TBTN_STANDARD,
0423     TBTN_RAISED,
0424     TBTN_JOINED
0425 } ETBarBtn;
0426 
0427 typedef enum
0428 {
0429     BORDER_FLAT,
0430     BORDER_RAISED,
0431     BORDER_SUNKEN,
0432     BORDER_LIGHT
0433 } EBorder;
0434 
0435 /*
0436     This whole EShade enum is a complete mess!
0437     For menubars, we dont blend - so blend is selected, and selected is darken
0438     For check/radios - we dont blend, so blend is selected, and we dont allow darken
0439 */
0440 typedef enum {
0441     SHADE_NONE,
0442     SHADE_CUSTOM,
0443     SHADE_SELECTED,
0444     SHADE_BLEND_SELECTED,
0445     SHADE_DARKEN,
0446     SHADE_WINDOW_BORDER
0447 } EShade;
0448 
0449 typedef enum {
0450     ECOLOR_BASE,
0451     ECOLOR_BACKGROUND,
0452     ECOLOR_DARK,
0453 } EColor;
0454 
0455 typedef enum {
0456     ROUND_NONE,
0457     ROUND_SLIGHT,
0458     ROUND_FULL,
0459     ROUND_EXTRA,
0460     ROUND_MAX
0461 } ERound;
0462 
0463 typedef enum {
0464     GB_LBL_BOLD = 0x01,
0465     GB_LBL_CENTRED = 0x02,
0466     GB_LBL_INSIDE = 0x04,
0467     GB_LBL_OUTSIDE = 0x08
0468 } EGBLabel;
0469 
0470 typedef enum {
0471     MO_NONE,
0472     MO_COLORED,
0473     MO_COLORED_THICK,
0474     MO_PLASTIK,
0475     MO_GLOW
0476 } EMouseOver;
0477 
0478 typedef enum {
0479     STRIPE_NONE,
0480     STRIPE_PLAIN,
0481     STRIPE_DIAGONAL,
0482     STRIPE_FADE
0483 } EStripe;
0484 
0485 typedef enum {
0486     SLIDER_PLAIN,
0487     SLIDER_ROUND,
0488     SLIDER_PLAIN_ROTATED,
0489     SLIDER_ROUND_ROTATED,
0490     SLIDER_TRIANGULAR,
0491     SLIDER_CIRCULAR
0492 } ESliderStyle;
0493 
0494 typedef enum {
0495     FOCUS_STANDARD,
0496     FOCUS_RECTANGLE,
0497     FOCUS_FULL,
0498     FOCUS_FILLED,
0499     FOCUS_LINE,
0500     FOCUS_GLOW,
0501     FOCUS_NONE
0502 } EFocus;
0503 
0504 typedef enum {
0505     TAB_MO_TOP,
0506     TAB_MO_BOTTOM,
0507     TAB_MO_GLOW
0508 } ETabMo;
0509 
0510 typedef enum {
0511     GT_HORIZ,
0512     GT_VERT
0513 } EGradType;
0514 
0515 typedef enum {
0516     GLOW_NONE,
0517     GLOW_START,
0518     GLOW_MIDDLE,
0519     GLOW_END
0520 } EGlow;
0521 
0522 enum
0523 {
0524     HIDE_NONE     = 0x00,
0525     HIDE_KEYBOARD = 0x01,
0526     HIDE_KWIN     = 0x02
0527 };
0528 
0529 typedef struct {
0530     double pos,
0531            val,
0532            alpha;
0533 } GradientStop;
0534 
0535 typedef struct {
0536     int titleHeight,
0537         toolTitleHeight,
0538         bottom,
0539         sides;
0540 } WindowBorders;
0541 
0542 typedef struct {
0543     EGradientBorder  border;
0544     int              numStops;
0545     GradientStop     *stops;
0546 } Gradient;
0547 
0548 #define USE_CUSTOM_SHADES(A) ((A).customShades[0]>0.00001)
0549 #define USE_CUSTOM_ALPHAS(A) ((A).customAlphas[0]>0.00001)
0550 
0551 typedef struct {
0552     int              version,
0553                      contrast,
0554                      passwordChar,
0555                      highlightFactor,
0556                      lighterPopupMenuBgnd,
0557                      menuDelay,
0558                      sliderWidth,
0559                      tabBgnd,
0560                      colorSelTab,
0561                      expanderHighlight,
0562                      crHighlight,
0563                      splitterHighlight,
0564                      crSize,
0565                      gbFactor,
0566                      gbLabel,
0567                      thin;
0568     ERound           round;
0569     bool             embolden,
0570                      highlightTab,
0571                      roundAllTabs,
0572                      animatedProgress,
0573                      customMenuTextColor,
0574                      menubarMouseOver,
0575                      useHighlightForMenu,
0576                      shadeMenubarOnlyWhenActive,
0577                      lvButton,
0578                      drawStatusBarFrames,
0579                      fillSlider,
0580                      roundMbTopOnly,
0581                      gtkScrollViews,
0582                      stdSidebarButtons,
0583                      toolbarTabs,
0584                      gtkComboMenus,
0585                      mapKdeIcons,
0586                      gtkButtonOrder,
0587                      fadeLines,
0588                      reorderGtkButtons,
0589                      borderMenuitems,
0590                      colorMenubarMouseOver,
0591                      darkerBorders,
0592                      vArrows,
0593                      xCheck,
0594                      crButton,
0595                      smallRadio,
0596                      fillProgress,
0597                      comboSplitter,
0598                      highlightScrollViews,
0599                      etchEntry,
0600                      colorSliderMouseOver,
0601                      thinSbarGroove,
0602                      flatSbarButtons,
0603                      borderSbarGroove,
0604                      borderProgress,
0605                      popupBorder,
0606                      unifySpinBtns,
0607                      unifyCombo,
0608                      unifySpin,
0609                      borderTab,
0610                      borderInactiveTab,
0611                      doubleGtkComboArrow,
0612                      menuIcons,
0613                      forceAlternateLvCols,
0614                      invertBotTab,
0615                      boldProgress,
0616                      coloredTbarMo,
0617                      borderSelection,
0618                      stripedSbar,
0619                      shadePopupMenu,
0620                      hideShortcutUnderline;
0621     EFrame           groupBox;
0622     EGlow            glowProgress;
0623     bool             lvLines;
0624     EGradType        bgndGrad,
0625                      menuBgndGrad;
0626     int              menubarHiding,
0627                      statusbarHiding,
0628                      square,
0629                      windowDrag,
0630                      windowBorder,
0631                      bgndOpacity,
0632                      menuBgndOpacity,
0633                      dlgOpacity,
0634                      shadowSize;
0635     EStripe          stripedProgress;
0636     ESliderStyle     sliderStyle;
0637     EMouseOver       coloredMouseOver;
0638     ETBarBorder      toolbarBorders;
0639     ETBarBtn         tbarBtns;
0640     EDefBtnIndicator defBtnIndicator;
0641     ELine            sliderThumbs,
0642                      handles,
0643                      toolbarSeparators,
0644                      splitters;
0645     ETabMo           tabMouseOver;
0646 /* NOTE: If add an appearance setting, increase the number of custmo gradients to match! */
0647     EAppearance      appearance,
0648                      bgndAppearance,
0649                      menuBgndAppearance,
0650                      menubarAppearance,
0651                      menuitemAppearance,
0652                      toolbarAppearance,
0653                      lvAppearance,
0654                      tabAppearance,
0655                      activeTabAppearance,
0656                      sliderAppearance,
0657                      titlebarAppearance,
0658                      inactiveTitlebarAppearance,
0659                      selectionAppearance,
0660                      menuStripeAppearance,
0661                      progressAppearance,
0662                      progressGrooveAppearance,
0663                      grooveAppearance,
0664                      sunkenAppearance,
0665                      sbarBgndAppearance,
0666                      sliderFill,
0667                      tooltipAppearance,
0668                      tbarBtnAppearance;
0669     EShade           shadeSliders,
0670                      shadeMenubars,
0671                      menuStripe,
0672                      shadeCheckRadio,
0673                      comboBtn,
0674                      sortedLv,
0675                      crColor,
0676                      progressColor;
0677     EColor           progressGrooveColor;
0678     EEffect          buttonEffect,
0679                      tbarBtnEffect;
0680     EScrollbar       scrollbarType;
0681     EFocus           focus;
0682     GdkColor customMenubarsColor,
0683                      customSlidersColor,
0684                      customMenuNormTextColor,
0685                      customMenuSelTextColor,
0686                      customMenuStripeColor,
0687                      customCheckRadioColor,
0688                      customComboBtnColor,
0689                      customSortedLvColor,
0690                      customCrBgndColor,
0691                      customProgressColor;
0692     Shading shading;
0693     double           customShades[QTC_NUM_STD_SHADES],
0694                      customAlphas[NUM_STD_ALPHAS];
0695     Gradient         *customGradient[NUM_CUSTOM_GRAD];
0696     QtCPixmap        bgndPixmap;
0697     QtCPixmap        menuBgndPixmap;
0698     QtCImage         bgndImage,
0699                      menuBgndImage;
0700     /* NOTE: If add any more settings here, need to alter
0701        copyOpts/freeOpts/defaultSettings in config_file.c */
0702     Strings          noBgndGradientApps,
0703                      noBgndOpacityApps,
0704                      noMenuBgndOpacityApps,
0705                      noBgndImageApps;
0706     Strings          noMenuStripeApps;
0707     // for completeness, unused:
0708     bool             onlyTicksInMenu;
0709     bool             buttonStyleMenuSections;
0710     int              menuCloseDelay;
0711 } Options;
0712 
0713 void qtcSetupGradient(Gradient *grad, EGradientBorder border, int numStops, ...);
0714 const Gradient *qtcGetGradient(EAppearance app, const Options *opts);
0715 
0716 QTC_ALWAYS_INLINE static inline bool
0717 qtcDrawMenuBorder(const Options &opts)
0718 {
0719     return (opts.menuBgndAppearance != APPEARANCE_FLAT &&
0720             opts.version >= qtcMakeVersion(1, 7) &&
0721             qtcUseBorder(qtcGetGradient(opts.menuBgndAppearance,
0722                                         &opts)->border));
0723 }
0724 
0725 QTC_ALWAYS_INLINE static inline bool
0726 qtcIsCustomBgnd(const Options &opts)
0727 {
0728     return (!qtcIsFlatBgnd(opts.bgndAppearance) ||
0729             opts.bgndImage.type != IMG_NONE ||
0730             opts.bgndOpacity != 100 || opts.dlgOpacity != 100);
0731 }
0732 
0733 EAppearance qtcWidgetApp(EWidget w, const Options *opts);
0734 
0735 #define tint(COLA, COLB, FACTOR) qtcColorTint((COLA), (COLB), (FACTOR))
0736 #define midColor(COLA, COLB) qtcColorMix((COLA), (COLB), 0.5)
0737 
0738 typedef enum {
0739     RADIUS_SELECTION,
0740     RADIUS_INTERNAL,
0741     RADIUS_EXTERNAL,
0742     RADIUS_ETCH
0743 } ERadius;
0744 
0745 #define MIN_ROUND_MAX_HEIGHT 12
0746 #define MIN_ROUND_MAX_WIDTH 24
0747 #define BGND_SHINE_SIZE 300
0748 #define BGND_SHINE_STEPS 8
0749 
0750 #define MIN_ROUND_FULL_SIZE 8
0751 #define MIN_ROUND_EXTRA_SIZE(W)                                         \
0752     (QtCurve::oneOf(W, WIDGET_SPIN_UP, WIDGET_SPIN_DOWN, WIDGET_SPIN) ? 7 : 14)
0753 
0754 namespace QtCurve {
0755 
0756 static inline bool
0757 widgetIsButton(EWidget w)
0758 {
0759     return oneOf(w, WIDGET_STD_BUTTON, WIDGET_DEF_BUTTON, WIDGET_TOGGLE_BUTTON,
0760                  WIDGET_CHECKBOX, WIDGET_RADIO_BUTTON, WIDGET_RADIO_BUTTON,
0761                  WIDGET_COMBO, WIDGET_COMBO_BUTTON,
0762                  WIDGET_UNCOLOURED_MO_BUTTON, WIDGET_TOOLBAR_BUTTON);
0763 }
0764 
0765 static inline bool
0766 isMaxRoundWidget(EWidget w)
0767 {
0768     return oneOf(w, WIDGET_STD_BUTTON, WIDGET_DEF_BUTTON, WIDGET_TOGGLE_BUTTON);
0769 }
0770 
0771 static inline bool
0772 isExtraRoundWidget(EWidget w)
0773 {
0774     return noneOf(w, WIDGET_MENU_ITEM, WIDGET_TAB_FRAME, WIDGET_PBAR_TROUGH,
0775                   WIDGET_PROGRESSBAR);
0776 }
0777 
0778 static inline int
0779 sbSliderMOLen(const Options &opts, int len)
0780 {
0781     if (len < 22 && opts.round < ROUND_FULL)
0782         return 2;
0783     if (len < 32 || noneOf(opts.shadeSliders, SHADE_SELECTED,
0784                            SHADE_BLEND_SELECTED))
0785         return 4;
0786     return 6;
0787 }
0788 
0789 }
0790 
0791 #define EXTRA_INNER_RADIUS   4
0792 #define EXTRA_OUTER_RADIUS   5
0793 #define EXTRA_ETCH_RADIUS    6
0794 #define FULL_INNER_RADIUS    2
0795 #define FULL_OUTER_RADIUS    3
0796 #define FULL_ETCH_RADIUS     4
0797 #define SLIGHT_INNER_RADIUS  1
0798 #define SLIGHT_OUTER_RADIUS  2
0799 #define SLIGHT_ETCH_RADIUS   3
0800 
0801 #define MAX_RADIUS_INTERNAL 9.0
0802 #define MAX_RADIUS_EXTERNAL (MAX_RADIUS_INTERNAL + 2.0)
0803 
0804 ERound qtcGetWidgetRound(const Options *opts, int w, int h, EWidget widget);
0805 double qtcGetRadius(const Options *opts, int w, int h, EWidget widget,
0806                     ERadius rad);
0807 
0808 #endif // __COMMON_H__