File indexing completed on 2024-03-24 05:49:51
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 #include "config.h" 0024 0025 #include "qt_settings.h" 0026 0027 #include <qtcurve-utils/color.h> 0028 #include <qtcurve-utils/log.h> 0029 #include <qtcurve-utils/dirs.h> 0030 #include <qtcurve-utils/strs.h> 0031 #include <qtcurve-utils/process.h> 0032 0033 #include <common/config_file.h> 0034 #include "helpers.h" 0035 #include <dirent.h> 0036 #include <locale.h> 0037 #include <gmodule.h> 0038 0039 namespace QtCurve { 0040 0041 QtCPalette qtcPalette; 0042 Options opts; 0043 0044 #define MAX_APP_NAME_LEN 32 0045 0046 #define KDE_CFG_DIR "/share/config/" 0047 #define KDE4_SYS_CFG_DIR "/share/kde4/config/" 0048 #define KDEGLOBALS_FILE "kdeglobals" 0049 #define KDEGLOBALS_SYS_FILE "system.kdeglobals" 0050 0051 #define qtc_gtkrc_printf(str_buff, args...) \ 0052 gtk_rc_parse_string(str_buff.printf(args)) 0053 0054 static char* 0055 getKdeHome() 0056 { 0057 static uniqueStr dir = [] { 0058 size_t len = 0; 0059 const char *const args[] = {"kde4-config", "--localprefix", nullptr}; 0060 char *res = qtcPopenStdout("kde4-config", args, 300, &len); 0061 if (res && res[strspn(res, " \t\b\n\f\v")]) { 0062 if (res[len - 1] == '\n') { 0063 res[len - 1] = '\0'; 0064 } 0065 return res; 0066 } 0067 if ((res = getenv(getuid() ? "KDEHOME" : "KDEROOTHOME"))) { 0068 return strdup(res); 0069 } 0070 // according to kdecore/kernel/kstandarddirs.h, ~/.kde is the default for KDEHOME 0071 // distributions using the default should not have to patch this code. 0072 return Str::cat(getHome(), ".kde"); 0073 }; 0074 return dir.get(); 0075 } 0076 0077 static const char* 0078 kdeFile(const char *f) 0079 { 0080 static Str::Buff<1024> buff; 0081 return buff.cat(getKdeHome(), KDE_CFG_DIR, f); 0082 } 0083 0084 static const char* 0085 kde4Globals() 0086 { 0087 return kdeFile(KDEGLOBALS_FILE); 0088 } 0089 0090 static const char* 0091 kde5Globals() 0092 { 0093 static Str::Buff<1024> buff; 0094 return buff.cat(getHome(), ".config/", KDEGLOBALS_FILE);; 0095 } 0096 0097 static const char* 0098 kwinrc() 0099 { 0100 return kdeFile("kwinrc"); 0101 } 0102 0103 #define HICOLOR_ICONS "hicolor" 0104 #define HICOLOR_LEN 7 0105 #define ICON_FOLDER "/share/icons/" 0106 #define ICON_FOLDER_SLEN 13 0107 #define DEFAULT_ICON_PREFIX "/usr/share/icons" 0108 #define DEFAULT_ICON_PREFIX_LEN 16 0109 0110 static GdkColor 0111 setGdkColor(int r, int g, int b) 0112 { 0113 GdkColor col; 0114 0115 col.red = toGtkColor(r); 0116 col.green = toGtkColor(g); 0117 col.blue = toGtkColor(b); 0118 return col; 0119 } 0120 0121 #define DEFAULT_KDE_ACT_PAL \ 0122 "active=#000000^e#dddfe4^e#ffffff^e#ffffff^e#555555^e#c7c7c7^e" \ 0123 "#000000^e#ffffff^e#000000^e#ffffff^e#efefef^e#000000^e#678db2^e" \ 0124 "#ffffff^e#0000ee^e#52188b^e" 0125 0126 #define DEFAULT_KDE_DIS_PAL \ 0127 "disabled=#000000^e#dddfe4^e#ffffff^e#ffffff^e#555555^e#c7c7c7^e" \ 0128 "#c7c7c7^e#ffffff^e#000000^e#ffffff^e#efefef^e#000000^e#678db2^e" \ 0129 "#ffffff^e#0000ee^e#52188b^e" 0130 0131 #ifdef READ_INACTIVE_PAL 0132 #define DEFAULT_KDE_INACT_PAL \ 0133 "inactive=#000000^e#dddfe4^e#ffffff^e#ffffff^e#555555^e#c7c7c7^e" \ 0134 "#000000^e#ffffff^e#000000^e#ffffff^e#efefef^e#000000^e#678db2^e" \ 0135 "#ffffff^e#0000ee^e#52188b^e" 0136 #endif 0137 0138 #define DEFAULT_KDE_FONT "Sans Serif" 0139 #define DEFAULT_KDE_FONT_SIZE 10.0 0140 #define MAX_LINE_LEN 1024 0141 0142 QtData qtSettings; 0143 0144 #define defaultIcons() ("oxygen") 0145 0146 enum { 0147 SECT_NONE = 0x000001, 0148 SECT_PALETTE = 0x000002, 0149 SECT_GENERAL = 0x000004, 0150 SECT_KDE = 0x000008, 0151 SECT_ICONS = 0x000010, 0152 SECT_TOOLBAR_STYLE = 0x000020, 0153 SECT_MAIN_TOOLBAR_ICONS = 0x000040, 0154 SECT_SMALL_ICONS = 0x000080, 0155 0156 SECT_KDE4_COL_BUTTON = 0x000100, 0157 SECT_KDE4_COL_SEL = 0x000200, 0158 SECT_KDE4_COL_TOOLTIP = 0x000400, 0159 SECT_KDE4_COL_VIEW = 0x000800, 0160 SECT_KDE4_COL_WINDOW = 0x001000, 0161 0162 SECT_KDE4_EFFECT_DISABLED = 0x002000, 0163 SECT_KDE4_EFFECT_INACTIVE = 0x004000, 0164 0165 SECT_KDE4_COL_WM = 0x008000, 0166 0167 SECT_KWIN_COMPOS = 0x010000 0168 }; 0169 0170 #define ALL_KDE4_PAL_SETTINGS \ 0171 (SECT_KDE4_COL_BUTTON | SECT_KDE4_COL_SEL | SECT_KDE4_COL_TOOLTIP | \ 0172 SECT_KDE4_COL_VIEW | SECT_KDE4_COL_WINDOW | \ 0173 SECT_KDE4_EFFECT_DISABLED | SECT_KDE4_EFFECT_INACTIVE | SECT_KDE4_COL_WM) 0174 /* 0175 Qt uses the following predefined weights: 0176 Light = 25, 0177 Normal = 50, 0178 DemiBold = 63, 0179 Bold = 75, 0180 Black = 87 0181 0182 ...need to categorize mid way, i.e. 0->37 = light, 38->56 = normal, etc... 0183 */ 0184 0185 enum { 0186 WEIGHT_NORMAL = 38, /* Less than this = light */ 0187 WEIGHT_DEMIBOLD = 57, 0188 WEIGHT_BOLD = 69, 0189 WEIGHT_BLACK = 81 0190 }; 0191 0192 static const char* 0193 weightStr(int w) 0194 { 0195 if (w < WEIGHT_NORMAL) { 0196 return "light"; 0197 } else if (w < WEIGHT_DEMIBOLD) { 0198 return ""; 0199 } else if (w < WEIGHT_BOLD) { 0200 return "demibold"; 0201 } else if (w < WEIGHT_BLACK) { 0202 return "bold"; 0203 } else { 0204 return "black"; 0205 } 0206 } 0207 0208 static const char* 0209 italicStr(int i) 0210 { 0211 return i ? "Italic" : ""; 0212 } 0213 0214 enum { 0215 RD_ACT_PALETTE = 0x000001, 0216 RD_DIS_PALETTE = 0x000002, 0217 RD_INACT_PALETTE = 0x000004, 0218 RD_FONT = 0x000008, 0219 RD_CONTRAST = 0x000010, 0220 RD_ICONS = 0x000020, 0221 RD_TOOLBAR_STYLE = 0x000040, 0222 RD_TOOLBAR_ICON_SIZE = 0x000080, 0223 RD_BUTTON_ICONS = 0x000100, 0224 RD_SMALL_ICON_SIZE = 0x000200, 0225 RD_LIST_COLOR = 0x000400, 0226 #ifdef QTC_GTK2_STYLE_SUPPORT 0227 RD_STYLE = 0x000800, 0228 #else 0229 RD_STYLE = 0x000000, 0230 #endif 0231 RD_LIST_SHADE = 0x001000, 0232 RD_KDE4_PAL = 0x002000, 0233 0234 RD_MENU_FONT = 0x004000, 0235 RD_TB_FONT = 0x008000, 0236 0237 RD_DRAG_DIST = 0x010000, 0238 RD_DRAG_TIME = 0x020000 0239 }; 0240 0241 #ifdef QTC_GTK2_STYLE_SUPPORT 0242 static char* 0243 themeFileSub(const char *prefix, const char *name, Str::Buff &str_buff, 0244 const char *sub) 0245 { 0246 if (isRegFile(str_buff.cat(prefix, "/", sub, "/", name, THEME_SUFFIX))) { 0247 return str_buff.get(); 0248 } 0249 return nullptr; 0250 } 0251 0252 static char* 0253 themeFile(const char *prefix, const char *name, Str::Buff &str_buff) 0254 { 0255 char *f = themeFileSub(prefix, name, str_buff, THEME_DIR); 0256 if (!f) { 0257 f = themeFileSub(prefix, name, str_buff, THEME_DIR4); 0258 } 0259 return f; 0260 } 0261 #endif 0262 0263 typedef enum { 0264 BackgroundAlternate, 0265 BackgroundNormal, 0266 DecorationFocus, 0267 DecorationHover, 0268 ForegroundNormal, 0269 0270 UnknownColor 0271 } ColorType; 0272 0273 typedef enum // Taken from "kcolorscheme.cpp" 0274 { 0275 // Effects 0276 Intensity = 0, 0277 Color = 1, 0278 Contrast = 2, 0279 // Intensity 0280 IntensityNoEffect = 0, 0281 IntensityShade = 1, 0282 IntensityDarken = 2, 0283 IntensityLighten = 3, 0284 // Color 0285 ColorNoEffect = 0, 0286 ColorDesaturate = 1, 0287 ColorFade = 2, 0288 ColorTint = 3, 0289 // Contrast 0290 ContrastNoEffect = 0, 0291 ContrastFade = 1, 0292 ContrastTint = 2 0293 } ColAdjustEffects; 0294 0295 typedef struct 0296 { 0297 double amount; 0298 ColAdjustEffects effect; 0299 } ColAdjust; 0300 0301 typedef struct { 0302 GdkColor col; 0303 ColAdjust intensity, 0304 color, 0305 contrast; 0306 bool enabled; 0307 } ColorEffect; 0308 0309 typedef enum 0310 { 0311 EFF_DISABLED, 0312 EFF_INACTIVE 0313 } Effect; 0314 0315 static ColorType getColorType(const char *line) 0316 { 0317 if(0==strncasecmp(line, "BackgroundAlternate=", 20)) 0318 return BackgroundAlternate; 0319 if(0==strncasecmp(line, "BackgroundNormal=", 17)) 0320 return BackgroundNormal; 0321 if(0==strncasecmp(line, "ForegroundNormal=", 17)) 0322 return ForegroundNormal; 0323 if(0==strncasecmp(line, "DecorationFocus=", 16)) 0324 return DecorationFocus; 0325 if(0==strncasecmp(line, "DecorationHover=", 16)) 0326 return DecorationHover; 0327 return UnknownColor; 0328 } 0329 0330 static GdkColor readColor(const char *line) 0331 { 0332 const char *eq = strchr(line, '='); 0333 GdkColor col; 0334 int red; 0335 int green; 0336 int blue; 0337 0338 if (eq && ++eq && *eq != '\0' && 0339 sscanf(eq, "%d,%d,%d", &red, &green, &blue) == 3) { 0340 col.red = toGtkColor(red); 0341 col.green = toGtkColor(green); 0342 col.blue = toGtkColor(blue); 0343 } else { 0344 col.red = col.blue = col.green = 0; 0345 } 0346 return col; 0347 } 0348 0349 static int readInt(const char *line, int offset) 0350 { 0351 return line[offset]!='\0' ? atoi(&line[offset]) : 0; 0352 } 0353 0354 static double readDouble(const char *line, int offset) 0355 { 0356 return line[offset]!='\0' ? g_ascii_strtod(&line[offset], nullptr) : 0; 0357 } 0358 0359 static bool 0360 readBool(const char *line, int offset) 0361 { 0362 return line[offset]!='\0' ? 0==strncasecmp(&line[offset], "true", 4) : false; 0363 } 0364 0365 typedef struct 0366 { 0367 int weight, 0368 italic, 0369 fixedW; 0370 float size; 0371 char family[MAX_CONFIG_INPUT_LINE_LEN+1]; 0372 } QtFontDetails; 0373 0374 static void initFont(QtFontDetails *f, bool setFamily) 0375 { 0376 f->weight = WEIGHT_NORMAL, 0377 f->italic = 0; 0378 f->fixedW = 0; 0379 f->size = DEFAULT_KDE_FONT_SIZE; 0380 if (setFamily) { 0381 strcpy(f->family, DEFAULT_KDE_FONT); 0382 } else { 0383 f->family[0] = '\0'; 0384 } 0385 } 0386 0387 static void 0388 parseFontLine(const char *line, QtFontDetails *font) 0389 { 0390 int n = -1; 0391 char *l; 0392 char fontLine[MAX_CONFIG_INPUT_LINE_LEN+1]; 0393 QtFontDetails rc; 0394 0395 initFont(&rc, false); 0396 memcpy(fontLine, line, MAX_CONFIG_INPUT_LINE_LEN + 1); 0397 l = strtok(fontLine, "="); 0398 0399 while (l) { 0400 switch (n) { 0401 case 0: { 0402 /* Family - and foundry(maybe!) (ignore X11 and XFT) */ 0403 if (char *dash = strchr(l, '-')) { 0404 *dash = '\0'; 0405 l = ++dash; 0406 } 0407 strcpy(rc.family, l); 0408 break; 0409 } 0410 case 1: /* Point size */ 0411 sscanf(l, "%f", &rc.size); 0412 break; 0413 case 4: /* Weight */ 0414 sscanf(l, "%d", &rc.weight); 0415 break; 0416 case 5: /* Slant */ 0417 sscanf(l, "%d", &rc.italic); 0418 break; 0419 case 8: /* Spacing */ 0420 sscanf(l, "%d", &rc.fixedW); 0421 break; 0422 default: 0423 break; 0424 } 0425 0426 n++; 0427 if (n>8 && font->family[0]) { 0428 font->weight = rc.weight; 0429 font->italic = rc.italic; 0430 font->fixedW = rc.fixedW; 0431 font->size = rc.size; 0432 strcpy(font->family, rc.family); 0433 break; 0434 } 0435 l = strtok(nullptr, ","); 0436 } 0437 } 0438 0439 static void 0440 setFont(QtFontDetails *font, int f) 0441 { 0442 if (qtSettings.fonts[f]) { 0443 free(qtSettings.fonts[f]); 0444 qtSettings.fonts[f] = nullptr; 0445 } 0446 if (f == FONT_GENERAL && qtSettings.fonts[FONT_BOLD]) { 0447 free(qtSettings.fonts[FONT_BOLD]); 0448 qtSettings.fonts[FONT_BOLD] = nullptr; 0449 } 0450 0451 qtSettings.fonts[f] = (char*)malloc(strlen(font->family) + 1 + 0452 strlen(weightStr(font->weight)) + 1 + 0453 strlen(italicStr(font->italic)) + 1 + 0454 20 /* point size */ + 1); 0455 0456 sprintf(qtSettings.fonts[f], "%s %s %s %f", font->family, 0457 weightStr(font->weight), italicStr(font->italic), font->size); 0458 0459 /* Qt uses a bold font for progressbars, try to mimic this... */ 0460 if (f == FONT_GENERAL && font->weight >= WEIGHT_NORMAL && 0461 font->weight < WEIGHT_DEMIBOLD) { 0462 qtSettings.fonts[FONT_BOLD] = 0463 (char*)malloc(strlen(font->family) + 1 + 0464 strlen(weightStr(WEIGHT_BOLD)) + 1 + 0465 strlen(italicStr(font->italic)) + 1 + 0466 20 /* point size */ + 1); 0467 0468 sprintf(qtSettings.fonts[FONT_BOLD], "%s %s %s %f", font->family, 0469 weightStr(WEIGHT_BOLD), italicStr(font->italic), font->size); 0470 } 0471 if (qtSettings.debug) { 0472 fprintf(stderr, DEBUG_PREFIX"Font[%d] - %s\n", f, qtSettings.fonts[f]); 0473 } 0474 } 0475 0476 #define MIX(a, b, bias) (a + ((b - a) * bias)) 0477 GdkColor mixColors(const GdkColor *c1, const GdkColor *c2, double bias) 0478 { 0479 if (bias <= 0.0 || std::isnan(bias)) 0480 return *c1; 0481 if (bias >= 1.0) 0482 return *c2; 0483 0484 double r1 = c1->red / 65535.0; 0485 double g1 = c1->green / 65535.0; 0486 double b1 = c1->blue / 65535.0; 0487 double r2 = c2->red / 65535.0; 0488 double g2 = c2->green / 65535.0; 0489 double b2 = c2->blue / 65535.0; 0490 GdkColor col; 0491 col.red = int(65535.0 * MIX(r1, r2, bias)); 0492 col.green = int(65535.0 * MIX(g1, g2, bias)); 0493 col.blue = int(65535.0 * MIX(b1, b2, bias)); 0494 return col; 0495 } 0496 0497 static void readKwinrc() 0498 { 0499 if (FILE *f = fopen(kwinrc(), "r")) { 0500 int section = SECT_NONE; 0501 char line[MAX_CONFIG_INPUT_LINE_LEN + 1]; 0502 0503 if (qtSettings.debug) 0504 fprintf(stderr, DEBUG_PREFIX "Reading kwinrc\n"); 0505 0506 while(nullptr!=fgets(line, MAX_CONFIG_INPUT_LINE_LEN, f)) 0507 if(line[0]=='[') 0508 { 0509 if(0==strncasecmp(line, "[Compositing]", 13)) 0510 section=SECT_KWIN_COMPOS; 0511 else 0512 section=SECT_NONE; 0513 } 0514 else if (SECT_KWIN_COMPOS==section && 0==strncasecmp(line, "Backend=", 8)) 0515 { 0516 if (strstr(line, "=XRender")) 0517 opts.square|=SQUARE_POPUP_MENUS|SQUARE_TOOLTIPS; 0518 break; 0519 } 0520 fclose(f); 0521 } 0522 } 0523 0524 static void readKdeGlobals(const char *rc, int rd, bool first) 0525 { 0526 ColorEffect effects[2]; 0527 int found = 0; 0528 int colorsFound = 0; 0529 char line[MAX_CONFIG_INPUT_LINE_LEN+1]; 0530 FILE *f=fopen(rc, "r"); 0531 QtFontDetails fonts[FONT_NUM_STD]; 0532 0533 for (int i = 0;i < FONT_NUM_STD;++i) { 0534 initFont(&fonts[i], true); 0535 } 0536 0537 if(first) 0538 { 0539 // Set defaults! 0540 effects[EFF_DISABLED].col.red=112; 0541 effects[EFF_DISABLED].col.green=111; 0542 effects[EFF_DISABLED].col.blue=110; 0543 effects[EFF_DISABLED].color.amount=0.0; 0544 effects[EFF_DISABLED].color.effect=ColorNoEffect; 0545 effects[EFF_DISABLED].contrast.amount=0.65; 0546 effects[EFF_DISABLED].contrast.effect=ContrastFade; 0547 effects[EFF_DISABLED].intensity.amount=0.1; 0548 effects[EFF_DISABLED].intensity.effect=IntensityDarken; 0549 effects[EFF_DISABLED].enabled=true; 0550 effects[EFF_INACTIVE].col.red=112; 0551 effects[EFF_INACTIVE].col.green=111; 0552 effects[EFF_INACTIVE].col.blue=110; 0553 effects[EFF_INACTIVE].color.amount=0.0; 0554 effects[EFF_INACTIVE].color.effect=ColorNoEffect; 0555 effects[EFF_INACTIVE].contrast.amount=0.0; 0556 effects[EFF_INACTIVE].contrast.effect=ContrastNoEffect; 0557 effects[EFF_INACTIVE].intensity.amount=0.0; 0558 effects[EFF_INACTIVE].intensity.effect=IntensityNoEffect; 0559 effects[EFF_INACTIVE].enabled=false; 0560 0561 qtSettings.colors[PAL_ACTIVE][COLOR_BUTTON]=setGdkColor(232, 231, 230); 0562 qtSettings.colors[PAL_ACTIVE][COLOR_BUTTON_TEXT]=setGdkColor(20, 19, 18); 0563 qtSettings.colors[PAL_ACTIVE][COLOR_SELECTED]=setGdkColor(65, 139, 212); 0564 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT_SELECTED]=setGdkColor(255, 255, 255); 0565 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP]=setGdkColor(192, 218, 255); 0566 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP_TEXT]=setGdkColor(20, 19, 18); 0567 qtSettings.colors[PAL_ACTIVE][COLOR_BACKGROUND]=setGdkColor(255, 255, 255); 0568 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT]=setGdkColor(20, 19, 18); 0569 qtSettings.colors[PAL_ACTIVE][COLOR_LV]=setGdkColor(248, 247, 246); 0570 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW]=setGdkColor(233, 232, 232); 0571 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_TEXT]=setGdkColor(20, 19, 18); 0572 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_BORDER]=qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW]; 0573 qtSettings.colors[PAL_INACTIVE][COLOR_WINDOW_BORDER]=qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW]; 0574 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_BORDER_TEXT]=qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_TEXT]; 0575 qtSettings.colors[PAL_INACTIVE][COLOR_WINDOW_BORDER_TEXT]=qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_TEXT]; 0576 0577 qtSettings.colors[PAL_ACTIVE][COLOR_FOCUS]=setGdkColor( 43, 116, 199); 0578 qtSettings.colors[PAL_ACTIVE][COLOR_HOVER]=setGdkColor(119, 183, 255); 0579 } 0580 0581 if(f) 0582 { 0583 int section=SECT_NONE; 0584 0585 if(qtSettings.debug) 0586 fprintf(stderr, DEBUG_PREFIX"Reading kdeglobals - %s\n", rc); 0587 0588 while(found!=rd && nullptr!=fgets(line, MAX_CONFIG_INPUT_LINE_LEN, f)) 0589 if(line[0]=='[') 0590 { 0591 if(0==strncasecmp(line, "[Icons]", 7)) 0592 section=SECT_ICONS; 0593 else if(0==strncasecmp(line, "[Toolbar style]", 15)) 0594 section=SECT_TOOLBAR_STYLE; 0595 else if(0==strncasecmp(line, "[MainToolbarIcons]", 18)) 0596 section=SECT_MAIN_TOOLBAR_ICONS; 0597 else if(0==strncasecmp(line, "[SmallIcons]", 12)) 0598 section=SECT_SMALL_ICONS; 0599 else if(0==strncasecmp(line, "[Colors:View]", 13)) 0600 section=SECT_KDE4_COL_VIEW; 0601 else if(0==strncasecmp(line, "[Colors:Button]", 15)) 0602 section=SECT_KDE4_COL_BUTTON; 0603 else if(0==strncasecmp(line, "[Colors:Selection]", 18)) 0604 section=SECT_KDE4_COL_SEL; 0605 else if(0==strncasecmp(line, "[Colors:Tooltip]", 16)) 0606 section=SECT_KDE4_COL_TOOLTIP; 0607 else if(0==strncasecmp(line, "[Colors:Window]", 15)) 0608 section=SECT_KDE4_COL_WINDOW; 0609 else if(0==strncasecmp(line, "[ColorEffects:Disabled]", 23)) 0610 section=SECT_KDE4_EFFECT_DISABLED; 0611 else if(0==strncasecmp(line, "[ColorEffects:Inactive]", 23)) 0612 section=SECT_KDE4_EFFECT_INACTIVE; 0613 else if(0==strncasecmp(line, "[General]", 9)) 0614 section=SECT_GENERAL; 0615 else if(0==strncasecmp(line, "[KDE]", 5)) 0616 section=SECT_KDE; 0617 else if(0==strncasecmp(line, "[WM]", 4)) 0618 section=SECT_KDE4_COL_WM; 0619 else 0620 { 0621 section=SECT_NONE; 0622 if(colorsFound==ALL_KDE4_PAL_SETTINGS) 0623 found|=RD_KDE4_PAL; 0624 if(found==rd) 0625 break; 0626 } 0627 } 0628 else if (SECT_ICONS==section && rd&RD_ICONS && !(found&RD_ICONS) && 0629 0==strncasecmp(line, "Theme=", 6)) { 0630 char *eq = strstr(line, "="); 0631 0632 if(eq && ++eq) { 0633 unsigned int len = strlen(eq); 0634 0635 qtSettings.icons = (char*)realloc(qtSettings.icons, 0636 len + 1); 0637 strcpy(qtSettings.icons, eq); 0638 if('\n'==qtSettings.icons[len-1]) 0639 qtSettings.icons[len-1]='\0'; 0640 } 0641 found|=RD_ICONS; 0642 } 0643 else if (SECT_SMALL_ICONS==section && rd&RD_SMALL_ICON_SIZE && !(found&RD_SMALL_ICON_SIZE) && 0644 0==strncasecmp(line, "Size=", 5)) 0645 { 0646 int size=readInt(line, 5); 0647 0648 if(0!=size) 0649 { 0650 qtSettings.iconSizes.smlTbSize=size; 0651 qtSettings.iconSizes.btnSize=size; 0652 qtSettings.iconSizes.mnuSize=size; 0653 found|=RD_SMALL_ICON_SIZE; 0654 } 0655 } 0656 else if (SECT_TOOLBAR_STYLE==section && rd&RD_TOOLBAR_STYLE && 0657 !(found&RD_TOOLBAR_STYLE) && 0658 0==strncasecmp(line, "ToolButtonStyle=", 16)) { 0659 char *eq = strstr(line, "="); 0660 0661 if(eq && ++eq) 0662 { 0663 if(0==strncasecmp(eq, "IconOnly", 8)) 0664 qtSettings.toolbarStyle=GTK_TOOLBAR_ICONS; 0665 else if(0==strncasecmp(eq, "TextOnly", 8)) 0666 qtSettings.toolbarStyle=GTK_TOOLBAR_TEXT; 0667 else if (0==strncasecmp(eq, "TextBesideIcon", 14)) 0668 qtSettings.toolbarStyle=GTK_TOOLBAR_BOTH_HORIZ; 0669 else if (0==strncasecmp(eq, "TextUnderIcon", 13)) 0670 qtSettings.toolbarStyle=GTK_TOOLBAR_BOTH; 0671 found|=RD_TOOLBAR_STYLE; 0672 } 0673 } 0674 else if (SECT_MAIN_TOOLBAR_ICONS==section && rd&RD_TOOLBAR_ICON_SIZE && 0675 !(found&RD_TOOLBAR_ICON_SIZE) && 0==strncasecmp(line, "Size=", 5)) 0676 { 0677 qtSettings.iconSizes.tbSize = readInt(line, 5); 0678 found|=RD_TOOLBAR_ICON_SIZE; 0679 } 0680 else if (SECT_KDE==section && rd&RD_BUTTON_ICONS && !(found&RD_BUTTON_ICONS) && 0681 0==strncasecmp(line, "ShowIconsOnPushButtons=", 23)) 0682 { 0683 qtSettings.buttonIcons=readBool(line, 23); 0684 found|=RD_BUTTON_ICONS; 0685 } 0686 // else if (SECT_KDE==section && rd&RD_DRAG_DIST && !(found&RD_DRAG_DIST) && 0687 // 0==strncasecmp(line, "StartDragDist=", 14)) 0688 // { 0689 // qtSettings.startDragDist=readInt(line, 14); 0690 // found|=RD_DRAG_DIST; 0691 // } 0692 else if (SECT_KDE==section && rd&RD_DRAG_TIME && !(found&RD_DRAG_TIME) && 0693 0==strncasecmp(line, "StartDragTime=", 14)) 0694 { 0695 qtSettings.startDragTime=readInt(line, 14); 0696 found|=RD_DRAG_TIME; 0697 } 0698 else if (SECT_KDE4_COL_WM==section && rd&RD_KDE4_PAL && 0699 !(found&RD_KDE4_PAL)) { 0700 colorsFound|=section; 0701 if(0==strncasecmp(line, "activeBackground=", 17)) 0702 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_BORDER]=readColor(line); 0703 else if(0==strncasecmp(line, "activeForeground=", 17)) 0704 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_BORDER_TEXT]=readColor(line); 0705 else if(0==strncasecmp(line, "inactiveBackground=", 19)) 0706 qtSettings.colors[PAL_INACTIVE][COLOR_WINDOW_BORDER]=readColor(line); 0707 else if(0==strncasecmp(line, "inactiveForeground=", 19)) 0708 qtSettings.colors[PAL_INACTIVE][COLOR_WINDOW_BORDER_TEXT]=readColor(line); 0709 } else if (section>=SECT_KDE4_COL_BUTTON && 0710 section<=SECT_KDE4_COL_WINDOW && 0711 rd&RD_KDE4_PAL && !(found&RD_KDE4_PAL)) { 0712 ColorType colorType=getColorType(line); 0713 0714 colorsFound|=section; 0715 if(UnknownColor!=colorType) 0716 { 0717 GdkColor color=readColor(line); 0718 0719 switch(section) 0720 { 0721 case SECT_KDE4_COL_BUTTON: 0722 switch(colorType) { 0723 case BackgroundNormal: 0724 qtSettings.colors[PAL_ACTIVE][COLOR_BUTTON]=color; 0725 break; 0726 case ForegroundNormal: 0727 qtSettings.colors[PAL_ACTIVE][COLOR_BUTTON_TEXT]=color; 0728 break; 0729 case DecorationFocus: 0730 qtSettings.colors[PAL_ACTIVE][COLOR_FOCUS]=color; 0731 break; 0732 case DecorationHover: 0733 qtSettings.colors[PAL_ACTIVE][COLOR_HOVER]=color; 0734 break; 0735 default: 0736 break; 0737 } 0738 break; 0739 case SECT_KDE4_COL_SEL: 0740 if(BackgroundNormal==colorType) 0741 qtSettings.colors[PAL_ACTIVE][COLOR_SELECTED]=color; 0742 else if(ForegroundNormal==colorType) 0743 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT_SELECTED]=color; 0744 break; 0745 case SECT_KDE4_COL_TOOLTIP: 0746 if(BackgroundNormal==colorType) 0747 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP]=color; 0748 else if(ForegroundNormal==colorType) 0749 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP_TEXT]=color; 0750 break; 0751 case SECT_KDE4_COL_VIEW: 0752 if(BackgroundNormal==colorType) 0753 qtSettings.colors[PAL_ACTIVE][COLOR_BACKGROUND]=color; 0754 else if(ForegroundNormal==colorType) 0755 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT]=color; 0756 else if(BackgroundAlternate==colorType) 0757 qtSettings.colors[PAL_ACTIVE][COLOR_LV]=color; 0758 break; 0759 case SECT_KDE4_COL_WINDOW: 0760 if(BackgroundNormal==colorType) 0761 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW]=color; 0762 else if(ForegroundNormal==colorType) 0763 qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_TEXT]=color; 0764 break; 0765 default: 0766 break; 0767 } 0768 } 0769 } else if (SECT_GENERAL==section && rd&RD_FONT && !(found&RD_FONT) && 0770 0==strncasecmp(line, "font=", 5)) { 0771 parseFontLine(line, &fonts[FONT_GENERAL]); 0772 found|=RD_FONT; 0773 } 0774 else if (SECT_GENERAL==section && rd&RD_MENU_FONT && !(found&RD_MENU_FONT) && 0775 0==strncasecmp(line, "menuFont=", 9)) 0776 { 0777 parseFontLine(line, &fonts[FONT_MENU]); 0778 found|=RD_MENU_FONT; 0779 } 0780 else if (SECT_GENERAL==section && rd&RD_TB_FONT && !(found&RD_TB_FONT) && 0781 0==strncasecmp(line, "toolBarFont=", 12)) 0782 { 0783 parseFontLine(line, &fonts[FONT_TOOLBAR]); 0784 found|=RD_TB_FONT; 0785 } else if (rd&RD_CONTRAST && !(found&RD_CONTRAST) && 0786 SECT_KDE==section && 0==strncasecmp(line, "contrast=", 9)) { 0787 opts.contrast=readInt(line, 9); 0788 if(opts.contrast>10 || opts.contrast<0) 0789 opts.contrast=DEFAULT_CONTRAST; 0790 found|=RD_CONTRAST; 0791 } 0792 #ifdef QTC_GTK2_STYLE_SUPPORT 0793 else if(SECT_GENERAL==section && rd&RD_STYLE && !(found&RD_STYLE) && 0794 0==strncasecmp(line, "widgetStyle=", 12)) { 0795 int len=strlen(line); 0796 qtSettings.styleName=realloc(qtSettings.styleName, strlen(&line[12])+1); 0797 if('\n'==line[len-1]) 0798 line[len-1]='\0'; 0799 strcpy(qtSettings.styleName, &line[12]); 0800 found|=RD_STYLE; 0801 } 0802 #endif 0803 else if((SECT_KDE4_EFFECT_DISABLED==section || 0804 SECT_KDE4_EFFECT_INACTIVE==section) && 0805 rd&RD_KDE4_PAL && !(found&RD_KDE4_PAL)) { 0806 colorsFound|=section; 0807 Effect eff=SECT_KDE4_EFFECT_DISABLED==section ? EFF_DISABLED : EFF_INACTIVE; 0808 if(0==strncasecmp(line, "Color=", 6)) 0809 effects[eff].col=readColor(line); 0810 else if(0==strncasecmp(line, "ColorAmount=", 12)) 0811 effects[eff].color.amount=readDouble(line, 12); 0812 else if(0==strncasecmp(line, "ColorEffect=", 12)) 0813 effects[eff].color.effect = 0814 (ColAdjustEffects)readInt(line, 12); 0815 else if(0==strncasecmp(line, "ContrastAmount=", 15)) 0816 effects[eff].contrast.amount=readDouble(line, 15); 0817 else if(0==strncasecmp(line, "ContrastEffect=", 15)) 0818 effects[eff].contrast.effect = 0819 (ColAdjustEffects)readInt(line, 15); 0820 else if(0==strncasecmp(line, "IntensityAmount=", 16)) 0821 effects[eff].intensity.amount=readDouble(line, 16); 0822 else if(0==strncasecmp(line, "IntensityEffect=", 16)) 0823 effects[eff].intensity.effect = 0824 (ColAdjustEffects)readInt(line, 16); 0825 else if(0==strncasecmp(line, "Enable=", 7)) 0826 effects[eff].enabled=readBool(line, 7); 0827 else if(0==strncasecmp(line, "ChangeSelectionColor=", 21)) 0828 qtSettings.inactiveChangeSelectionColor=readBool(line, 21); 0829 } 0830 else if(SECT_GENERAL==section && rd&RD_LIST_SHADE && !(found&RD_LIST_SHADE) && 0831 0==strncasecmp(line, "shadeSortColumn=", 16)) 0832 { 0833 qtSettings.shadeSortedList=readBool(line, 16); 0834 found|=RD_LIST_SHADE; 0835 } 0836 else if(found==rd) 0837 break; 0838 0839 fclose(f); 0840 } 0841 else if (!first) 0842 { 0843 // don't repeat the settings below, as that would probably override settings read from file. 0844 return; 0845 } 0846 0847 int eff = 0; 0848 double contrast = 0.1 * opts.contrast; 0849 double y; 0850 0851 contrast = (1.0 > contrast ? (-1.0 < contrast ? contrast : -1.0) : 1.0); 0852 y = qtcColorLuma(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW]); 0853 0854 if(y<0.006) 0855 qtSettings.colors[PAL_ACTIVE][COLOR_MID]=qtcColorShade(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW], 0.01 + 0.20 * contrast, 0.0); 0856 else if(y>0.93) 0857 qtSettings.colors[PAL_ACTIVE][COLOR_MID]=qtcColorShade(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW], -0.02 - 0.20 * contrast, 0.0); 0858 else { 0859 double darkAmount = (-y) * (0.55 + contrast * 0.35); 0860 0861 qtSettings.colors[PAL_ACTIVE][COLOR_MID]=qtcColorShade(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW], (0.35 + 0.15 * y) * darkAmount, 0.0); 0862 } 0863 0864 for (eff=0; eff<2; ++eff) { 0865 int p=0==eff ? PAL_DISABLED : PAL_INACTIVE; 0866 memcpy(qtSettings.colors[p], qtSettings.colors[PAL_ACTIVE], sizeof(GdkColor) * COLOR_NUMCOLORS_STD); 0867 if(effects[eff].enabled) { 0868 int col; 0869 for(col=0; col<COLOR_NUMCOLORS_STD; ++col) { 0870 switch(effects[eff].intensity.effect) { 0871 case IntensityShade: 0872 qtSettings.colors[p][col] = qtcColorShade(&qtSettings.colors[p][col], effects[eff].intensity.amount, 0.0); 0873 break; 0874 case IntensityDarken: 0875 qtSettings.colors[p][col] = qtcColorDarken(&qtSettings.colors[p][col], effects[eff].intensity.amount, 1.0); 0876 break; 0877 case IntensityLighten: 0878 qtSettings.colors[p][col] = 0879 qtcColorLighten( 0880 &qtSettings.colors[p][col], 0881 effects[eff].intensity.amount, 1.0); 0882 default: 0883 break; 0884 } 0885 switch (effects[eff].color.effect) { 0886 case ColorDesaturate: 0887 qtSettings.colors[p][col] = qtcColorDarken(&qtSettings.colors[p][col], 0.0, 1.0 - effects[eff].color.amount); 0888 break; 0889 case ColorFade: 0890 qtSettings.colors[p][col] = qtcColorMix(&qtSettings.colors[p][col], &effects[eff].col, effects[eff].color.amount); 0891 break; 0892 case ColorTint: 0893 qtSettings.colors[p][col] = qtcColorTint(&qtSettings.colors[p][col], &effects[eff].col, effects[eff].color.amount); 0894 default: 0895 break; 0896 } 0897 0898 if (COLOR_BUTTON_TEXT==col || COLOR_TEXT==col || 0899 COLOR_WINDOW_TEXT==col || COLOR_TOOLTIP_TEXT==col) { 0900 int other = (COLOR_BUTTON_TEXT==col ? COLOR_BUTTON : 0901 COLOR_WINDOW_TEXT==col ? COLOR_WINDOW : 0902 COLOR_TEXT==col ? COLOR_BACKGROUND : 0903 COLOR_TOOLTIP); 0904 0905 switch (effects[eff].contrast.effect) { 0906 case ContrastFade: 0907 qtSettings.colors[p][col]=qtcColorMix(&qtSettings.colors[p][col], 0908 &qtSettings.colors[PAL_DISABLED][other], 0909 effects[eff].contrast.amount); 0910 break; 0911 case ContrastTint: 0912 qtSettings.colors[p][col]=qtcColorTint(&qtSettings.colors[p][col], 0913 &qtSettings.colors[PAL_DISABLED][other], 0914 effects[eff].contrast.amount); 0915 default: 0916 break; 0917 } 0918 } 0919 } 0920 } 0921 } 0922 0923 qtSettings.colors[PAL_INACTIVE][COLOR_SELECTED]=qtSettings.colors[PAL_ACTIVE][COLOR_SELECTED]; 0924 #if 0 // Use alpha values instead... 0925 if(qtSettings.inactiveChangeSelectionColor) 0926 if(effects[PAL_INACTIVE].enabled) 0927 qtSettings.colors[PAL_INACTIVE][COLOR_SELECTED]=qtcColorTint(&qtSettings.colors[PAL_INACTIVE][COLOR_WINDOW], 0928 &qtSettings.colors[PAL_ACTIVE][COLOR_SELECTED], 0929 0.4); 0930 else 0931 qtSettings.inactiveChangeSelectionColor=false; 0932 #endif 0933 0934 if(rd&RD_ICONS && !qtSettings.icons) 0935 { 0936 qtSettings.icons=(char *)realloc(qtSettings.icons, strlen(defaultIcons())+1); 0937 strcpy(qtSettings.icons, defaultIcons()); 0938 } 0939 if(rd&RD_TOOLBAR_STYLE && !(found&RD_TOOLBAR_STYLE)) 0940 qtSettings.toolbarStyle=GTK_TOOLBAR_ICONS; 0941 if(rd&RD_BUTTON_ICONS && !(found&RD_BUTTON_ICONS)) 0942 qtSettings.buttonIcons=true; 0943 if(rd&RD_LIST_SHADE && !(found&RD_LIST_SHADE)) 0944 qtSettings.shadeSortedList=true; 0945 //if(rd&RD_FONT && (found&RD_FONT || (!qtSettings.fonts[FONT_GENERAL] && kde4))) /* No need to check if read in */ 0946 if(rd&RD_FONT && found&RD_FONT) 0947 setFont(&fonts[FONT_GENERAL], FONT_GENERAL); 0948 if(rd&RD_MENU_FONT && found&RD_MENU_FONT) 0949 setFont(&fonts[FONT_MENU], FONT_MENU); 0950 if(rd&RD_TB_FONT && found&RD_TB_FONT) 0951 setFont(&fonts[FONT_TOOLBAR], FONT_TOOLBAR); 0952 } 0953 0954 static int qt_refs = 0; 0955 0956 static const char* 0957 kdeIconsPrefix() 0958 { 0959 static uniqueStr dir = [] { 0960 size_t len = 0; 0961 const char *const args[] = {"kde4-config", "--install", "icon", 0962 nullptr}; 0963 char *res = qtcPopenStdout("kde4-config", args, 300, &len); 0964 if (res && res[strspn(res, " \t\b\n\f\v")]) { 0965 if (res[len - 1]=='\n') { 0966 res[len - 1]='\0'; 0967 } 0968 return res; 0969 } 0970 return strdup(QTC_KDE4_ICONS_PREFIX && 0971 strlen(QTC_KDE4_ICONS_PREFIX) > 2 ? 0972 QTC_KDE4_ICONS_PREFIX : DEFAULT_ICON_PREFIX); 0973 }; 0974 return dir.get(); 0975 } 0976 0977 static char* 0978 getIconPath() 0979 { 0980 static Str::Buff<1024> buff; 0981 0982 const char *kdeHome = getKdeHome(); 0983 const char *kdePrefix = kdeIconsPrefix(); 0984 const char *defIcons = defaultIcons(); 0985 bool nonDefIcons = qtSettings.icons && strcmp(qtSettings.icons, defIcons); 0986 bool addDefaultPrefix = strcmp(kdePrefix, DEFAULT_ICON_PREFIX); 0987 0988 buff.cat("pixmap_path \""); 0989 if (nonDefIcons) { 0990 buff.append(kdeHome, ICON_FOLDER, qtSettings.icons, ":", 0991 kdePrefix, "/", qtSettings.icons, ":"); 0992 if (addDefaultPrefix) { 0993 buff.append(DEFAULT_ICON_PREFIX, "/", qtSettings.icons, ":"); 0994 } 0995 } 0996 buff.append(kdeHome, ICON_FOLDER, defIcons, ":", 0997 kdePrefix, "/", defIcons, ":"); 0998 if (addDefaultPrefix) { 0999 buff.append(DEFAULT_ICON_PREFIX, "/", defIcons, ":"); 1000 } 1001 buff.append(kdeHome, ICON_FOLDER, HICOLOR_ICONS, ":", 1002 kdePrefix, "/", HICOLOR_ICONS, ":"); 1003 if (addDefaultPrefix) { 1004 buff.append(DEFAULT_ICON_PREFIX, "/", HICOLOR_ICONS); 1005 } else { 1006 auto len = strlen(buff.get()); 1007 if (buff[len] == ':') { 1008 buff[len] = 0; 1009 } 1010 } 1011 buff.append("\""); 1012 if (qtSettings.debug) { 1013 fprintf(stderr, DEBUG_PREFIX "%s\n", buff.get()); 1014 } 1015 return buff.get(); 1016 } 1017 1018 static bool 1019 checkFileVersion(const char *fname, const char *versionStr, int versionStrLen) 1020 { 1021 FILE *f = fopen(fname, "r"); 1022 bool diff = true; 1023 1024 if (f) { 1025 if (access(fname, W_OK) != 0) { 1026 /* If file is not writeable, then just pretend no difference */ 1027 diff = false; 1028 } else { 1029 static const int constVLen = 32; 1030 char line[constVLen + 1]; 1031 int numChars = qtcMin(constVLen, versionStrLen - 1); 1032 diff = (fgets(line, numChars + 1, f) == nullptr || 1033 memcmp(versionStr, line, numChars)); 1034 } 1035 fclose(f); 1036 } 1037 return !diff; 1038 } 1039 1040 static bool 1041 isMozApp(const char *app, const char *check) 1042 { 1043 if (strcmp(app, check) == 0) { 1044 return true; 1045 } else if (Str::startsWith(app, check)) { 1046 int app_len=strlen(app), 1047 check_len=strlen(check); 1048 1049 if(check_len+4 == app_len && 0==strcmp(&app[check_len], "-bin")) 1050 return true; 1051 1052 /* OK check for xulrunner-1.9 */ 1053 { 1054 float dummy; 1055 if(app_len>(check_len+1) && 1==sscanf(&app[check_len+1], "%f", &dummy)) 1056 return true; 1057 } 1058 } 1059 1060 return false; 1061 } 1062 1063 static bool 1064 excludedApp(Strings config) 1065 { 1066 if (qtSettings.appName && config) { 1067 for (int i = 0;config[i];++i) { 1068 if (strcmp("gtk", config[i]) == 0 || 1069 strcmp(qtSettings.appName, config[i]) == 0) { 1070 return true; 1071 } 1072 } 1073 } 1074 return false; 1075 } 1076 1077 static QtcDebug 1078 debugLevel() 1079 { 1080 if (const char *dbg = getenv("QTCURVE_DEBUG")) { 1081 switch (atoi(dbg)) { 1082 case 1: 1083 return DEBUG_SETTINGS; 1084 case 2: 1085 return DEBUG_ALL; 1086 default: 1087 return DEBUG_NONE; 1088 } 1089 } 1090 return DEBUG_NONE; 1091 } 1092 1093 bool 1094 qtSettingsInit() 1095 { 1096 if (0 == qt_refs++) { 1097 static int lastRead = 0; 1098 int now = time(nullptr); 1099 qtSettings.app = GTK_APP_UNKNOWN; 1100 if (abs(now - lastRead) > 1) { 1101 char *locale = setlocale(LC_NUMERIC, nullptr); 1102 char *path = nullptr; 1103 Str::Buff<4096> str_buff; 1104 char *tmpStr = nullptr; 1105 GtkSettings *settings=nullptr; 1106 1107 setlocale(LC_NUMERIC, "C"); 1108 qtSettings.icons=nullptr; 1109 memset(qtSettings.fonts, 0, sizeof(char *)*FONT_NUM_TOTAL); 1110 qtSettings.iconSizes.smlTbSize=16; 1111 qtSettings.iconSizes.tbSize=22; 1112 qtSettings.iconSizes.dndSize=32; 1113 qtSettings.iconSizes.btnSize=16; 1114 qtSettings.iconSizes.mnuSize=16; 1115 qtSettings.iconSizes.dlgSize=32; 1116 qtSettings.colors[PAL_ACTIVE][COLOR_LV]=setGdkColor(0, 0, 0); 1117 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP_TEXT]=setGdkColor(0, 0, 0); 1118 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP]=setGdkColor(0xFF, 0xFF, 192); 1119 #ifdef QTC_GTK2_STYLE_SUPPORT 1120 qtSettings.styleName=nullptr; 1121 #endif 1122 qtSettings.inactiveChangeSelectionColor=false; 1123 qtSettings.appName=nullptr; 1124 /* qtSettings.startDragDist=4; */ 1125 qtSettings.startDragTime=500; 1126 qtSettings.debug=debugLevel(); 1127 opts.contrast=DEFAULT_CONTRAST; 1128 for (int i = 0;i < FONT_NUM_TOTAL;++i) { 1129 qtSettings.fonts[i] = nullptr; 1130 } 1131 1132 qtSettings.qt4 = false; 1133 // TODO: blacklist logic 1134 qtSettings.useAlpha = 1135 (opts.bgndOpacity < 100 || opts.dlgOpacity < 100 || 1136 opts.menuBgndOpacity < 100 || 1137 !(opts.square & SQUARE_POPUP_MENUS) || 1138 !(opts.square & SQUARE_TOOLTIPS)); 1139 1140 lastRead=now; 1141 1142 { 1143 int f=0; 1144 const char *files[]={QTC_GTK2_THEME_DIR"/kdeglobals", /* QtCurve supplied kdeglobals file */ 1145 "/etc/kderc", 1146 "/etc/kde4/kdeglobals", 1147 "/etc/kde4rc", 1148 QTC_KDE4_PREFIX KDE4_SYS_CFG_DIR KDEGLOBALS_FILE, 1149 QTC_KDE4_PREFIX KDE4_SYS_CFG_DIR 1150 KDEGLOBALS_SYS_FILE, 1151 kde4Globals(), 1152 kde5Globals(), 1153 nullptr}; 1154 1155 for(f=0; 0!=files[f]; ++f) 1156 readKdeGlobals(files[f], RD_ICONS|RD_SMALL_ICON_SIZE|RD_TOOLBAR_STYLE|RD_MENU_FONT|RD_TB_FONT| 1157 RD_TOOLBAR_ICON_SIZE|RD_BUTTON_ICONS|RD_LIST_SHADE| 1158 (RD_KDE4_PAL|RD_FONT|RD_CONTRAST|RD_STYLE|RD_DRAG_DIST|RD_DRAG_TIME), 1159 0==f); 1160 } 1161 1162 #ifdef QTC_GTK2_STYLE_SUPPORT 1163 /* Only for testing - allows me to simulate Qt's -style parameter. 1164 e.g start Gtk2 app as follows: 1165 1166 QTC_STYLE=qtc_klearlooks gtk-demo 1167 */ 1168 if (const char *env = getenv("QTC_STYLE")) { 1169 if (*env) { 1170 qtSettings.styleName = Str::fill(qtSettings.styleName, env); 1171 } 1172 } 1173 1174 char *rcFile = nullptr; 1175 /* Is the user using a non-default QtCurve style? */ 1176 if (qtSettings.styleName && 1177 Str::startsWith(qtSettings.styleName, THEME_PREFIX)) { 1178 rcFile = themeFile(getKdeHome(), qtSettings.styleName, 1179 str_buff); 1180 1181 if (!rcFile) { 1182 rcFile = themeFile(QTC_KDE4_PREFIX, qtSettings.styleName, 1183 str_buff); 1184 } 1185 } 1186 1187 qtcReadConfig(rcFile, &opts, nullptr); 1188 #else 1189 qtcReadConfig(nullptr, &opts, nullptr); 1190 #endif 1191 /* Focus is messed up if not using glow focus*/ 1192 if (!opts.gtkComboMenus && opts.focus != FOCUS_GLOW) 1193 opts.gtkComboMenus = true; 1194 #if 0 1195 if (opts.inactiveHighlight) { 1196 generateMidColor(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW], 1197 &qtSettings.colors[PAL_ACTIVE][COLOR_SELECTED], 1198 &qtSettings.inactiveSelectCol, 1199 INACTIVE_HIGHLIGHT_FACTOR); 1200 } else { 1201 qtSettings.inactiveSelectCol = 1202 qtSettings.colors[PAL_INACTIVE][COLOR_SELECTED]; 1203 } 1204 #endif 1205 /* Check if we're firefox... */ 1206 if ((qtSettings.appName = getProgName())) { 1207 bool firefox = (isMozApp(qtSettings.appName, "firefox") || 1208 isMozApp(qtSettings.appName, "iceweasel") || 1209 isMozApp(qtSettings.appName, "swiftfox") || 1210 isMozApp(qtSettings.appName, "xulrunner") || 1211 isMozApp(qtSettings.appName, "abrowser")); 1212 bool thunderbird = 1213 (!firefox && (isMozApp(qtSettings.appName, "thunderbird") || 1214 isMozApp(qtSettings.appName, "icedove"))); 1215 bool mozThunderbird = 1216 (!thunderbird && !firefox && 1217 isMozApp(qtSettings.appName, "mozilla-thunderbird")); 1218 bool seamonkey = (!thunderbird && !firefox && !mozThunderbird && 1219 isMozApp(qtSettings.appName, "seamonkey")); 1220 1221 if (firefox || thunderbird || mozThunderbird || seamonkey) { 1222 qtSettings.app = (firefox ? GTK_APP_NEW_MOZILLA : 1223 GTK_APP_MOZILLA); 1224 if (qtSettings.app == GTK_APP_MOZILLA) 1225 qtSettings.app = GTK_APP_NEW_MOZILLA; 1226 if (qtSettings.app != GTK_APP_NEW_MOZILLA && 1227 opts.menuitemAppearance == APPEARANCE_FADE && 1228 (thunderbird || mozThunderbird)) { 1229 opts.menuitemAppearance = APPEARANCE_FLAT; 1230 } 1231 } else if (strcmp(qtSettings.appName, "soffice.bin") == 0) { 1232 qtSettings.app = GTK_APP_OPEN_OFFICE; 1233 } else if (strcmp(qtSettings.appName, "vmplayer") == 0) { 1234 qtSettings.app = GTK_APP_VMPLAYER; 1235 } else if (Str::startsWith(qtSettings.appName, "gimp")) { 1236 qtSettings.app = GTK_APP_GIMP; 1237 } else if (strcmp(qtSettings.appName, "java") == 0) { 1238 qtSettings.app = GTK_APP_JAVA; 1239 } else if (strcmp(qtSettings.appName, "evolution") == 0) { 1240 qtSettings.app = GTK_APP_EVOLUTION; 1241 } else if (strcmp(qtSettings.appName, "eclipse") == 0) { 1242 qtSettings.app = GTK_APP_JAVA_SWT; 1243 } else if (strcmp(qtSettings.appName, "ghb") == 0) { 1244 qtSettings.app = GTK_APP_GHB; 1245 } 1246 } 1247 1248 if(qtSettings.debug) 1249 fprintf(stderr, DEBUG_PREFIX"Application name: \"%s\"\n", qtSettings.appName ? qtSettings.appName : "<unknown>"); 1250 1251 /* Eclipse sets a application name, so if this is set then we're not a Swing java app */ 1252 if(GTK_APP_JAVA==qtSettings.app && g_get_application_name() && 0!=strcmp(g_get_application_name(), "<unknown>")) 1253 qtSettings.app=GTK_APP_JAVA_SWT; 1254 1255 if(GTK_APP_JAVA==qtSettings.app) 1256 opts.sliderStyle=SLIDER_PLAIN; 1257 1258 if (oneOf(qtSettings.app, GTK_APP_JAVA, GTK_APP_JAVA_SWT, 1259 GTK_APP_OPEN_OFFICE) || isMozilla()) { 1260 opts.square |= SQUARE_POPUP_MENUS; 1261 opts.bgndAppearance = APPEARANCE_FLAT; 1262 opts.bgndImage.type = IMG_NONE; 1263 if (FRAME_SHADED == opts.groupBox) 1264 opts.groupBox = FRAME_PLAIN; 1265 opts.gbFactor = 0; 1266 opts.highlightScrollViews = false; 1267 } 1268 1269 if(!qtcIsFlat(opts.bgndAppearance) && excludedApp(opts.noBgndGradientApps)) 1270 opts.bgndAppearance=APPEARANCE_FLAT; 1271 1272 if(IMG_NONE!=opts.bgndImage.type && excludedApp(opts.noBgndImageApps)) 1273 opts.bgndImage.type=IMG_NONE; 1274 1275 if (oneOf(qtSettings.app, GTK_APP_OPEN_OFFICE, GTK_APP_JAVA, 1276 GTK_APP_JAVA_SWT) || isMozilla()) { 1277 opts.bgndOpacity = opts.dlgOpacity = opts.menuBgndOpacity = 100; 1278 qtSettings.useAlpha = false; 1279 } 1280 1281 if(excludedApp(opts.noBgndOpacityApps)) 1282 opts.bgndOpacity=opts.dlgOpacity=100; 1283 1284 if(excludedApp(opts.noMenuBgndOpacityApps)) 1285 opts.menuBgndOpacity=100, qtSettings.useAlpha=false; 1286 1287 /* Disable usage of alpha channel for older configs, unless app is uing opacity... */ 1288 if(qtSettings.useAlpha && opts.version<qtcMakeVersion(1, 7, 2) && 100==opts.menuBgndOpacity && 100==opts.dlgOpacity && 100==opts.bgndOpacity) 1289 qtSettings.useAlpha=false; 1290 1291 if(opts.menuStripe && excludedApp(opts.noMenuStripeApps)) 1292 opts.menuStripe=SHADE_NONE; 1293 1294 if (GTK_APP_JAVA != qtSettings.app) { 1295 /* KDE's "apply colors to non-KDE apps" messes up firefox, 1296 (and progress bar text) so need to fix this! */ 1297 /* ...and inactive highlight!!! */ 1298 GdkColor *highlightedMenuCol = 1299 (opts.useHighlightForMenu ? 1300 &qtSettings.colors[PAL_ACTIVE][COLOR_TEXT_SELECTED] : 1301 &qtSettings.colors[PAL_ACTIVE][COLOR_TEXT]); 1302 qtc_gtkrc_printf(str_buff, "style \"" RC_SETTING "MTxt\"" 1303 " {fg[ACTIVE]=\"#%02X%02X%02X\"" 1304 " fg[PRELIGHT]=\"#%02X%02X%02X\"}" 1305 " style \"" RC_SETTING "PTxt\"" 1306 " {fg[ACTIVE]=\"#%02X%02X%02X\"" 1307 " fg[PRELIGHT]=\"#%02X%02X%02X\"}" 1308 " class \"*MenuItem\" style \"" RC_SETTING 1309 "MTxt\" widget_class \"*.*MenuItem*\" " 1310 "style \"" RC_SETTING "MTxt\" " 1311 " widget_class \"*.*ProgressBar\" " 1312 "style \"" RC_SETTING "PTxt\"", 1313 toQtColor(highlightedMenuCol->red), 1314 toQtColor(highlightedMenuCol->green), 1315 toQtColor(highlightedMenuCol->blue), 1316 toQtColor(highlightedMenuCol->red), 1317 toQtColor(highlightedMenuCol->green), 1318 toQtColor(highlightedMenuCol->blue), 1319 toQtColor(qtSettings.colors[PAL_ACTIVE] 1320 [COLOR_TEXT_SELECTED].red), 1321 toQtColor(qtSettings.colors[PAL_ACTIVE] 1322 [COLOR_TEXT_SELECTED].green), 1323 toQtColor(qtSettings.colors[PAL_ACTIVE] 1324 [COLOR_TEXT_SELECTED].blue), 1325 toQtColor(qtSettings.colors[PAL_ACTIVE] 1326 [COLOR_TEXT_SELECTED].red), 1327 toQtColor(qtSettings.colors[PAL_ACTIVE] 1328 [COLOR_TEXT_SELECTED].green), 1329 toQtColor(qtSettings.colors[PAL_ACTIVE] 1330 [COLOR_TEXT_SELECTED].blue)); 1331 if (GTK_APP_OPEN_OFFICE == qtSettings.app) { 1332 GdkColor *active = nullptr; 1333 GdkColor *inactive = nullptr; 1334 1335 if (SHADE_WINDOW_BORDER == opts.shadeMenubars) { 1336 active = (&qtSettings.colors[PAL_ACTIVE][ 1337 opts.useHighlightForMenu ? 1338 COLOR_TEXT_SELECTED : 1339 COLOR_WINDOW_BORDER_TEXT]); 1340 inactive = &qtSettings.colors[PAL_ACTIVE][ 1341 COLOR_WINDOW_BORDER_TEXT]; 1342 } else if (opts.customMenuTextColor) { 1343 active = &opts.customMenuSelTextColor; 1344 inactive = &opts.customMenuNormTextColor; 1345 } else if (SHADE_BLEND_SELECTED == opts.shadeMenubars || 1346 SHADE_SELECTED == opts.shadeMenubars || 1347 (SHADE_CUSTOM == opts.shadeMenubars && 1348 TOO_DARK(qtcPalette.menubar[ORIGINAL_SHADE]))) { 1349 active = &qtSettings.colors[PAL_ACTIVE][ 1350 COLOR_TEXT_SELECTED]; 1351 inactive = &qtSettings.colors[PAL_ACTIVE][ 1352 COLOR_TEXT_SELECTED]; 1353 } 1354 1355 if (active && inactive) { 1356 qtc_gtkrc_printf( 1357 str_buff, "style \"" RC_SETTING "MnuTxt\"" 1358 " {fg[NORMAL]=\"#%02X%02X%02X\" " 1359 "fg[PRELIGHT]=\"#%02X%02X%02X\" " 1360 "fg[ACTIVE]=\"#%02X%02X%02X\" " 1361 "fg[SELECTED]=\"#%02X%02X%02X\" " 1362 "text[NORMAL]=\"#%02X%02X%02X\"} " 1363 "widget_class \"*<GtkMenuBar>*\" style \"" 1364 RC_SETTING "MnuTxt\" %s", toQtColor(inactive->red), 1365 toQtColor(inactive->green), 1366 toQtColor(inactive->blue), toQtColor(active->red), 1367 toQtColor(active->green), toQtColor(active->blue), 1368 toQtColor(active->red), toQtColor(active->green), 1369 toQtColor(active->blue), toQtColor(active->red), 1370 toQtColor(active->green), toQtColor(active->blue), 1371 toQtColor(inactive->red), 1372 toQtColor(inactive->green), 1373 toQtColor(inactive->blue), 1374 opts.shadePopupMenu ? 1375 " widget_class \"*<GtkMenuItem>*\" style \"" 1376 RC_SETTING "MnuTxt\" " : " "); 1377 } 1378 } 1379 } 1380 1381 if (GTK_APP_VMPLAYER == qtSettings.app) { 1382 opts.shadeMenubars = SHADE_NONE; 1383 opts.menubarHiding = HIDE_NONE; 1384 opts.statusbarHiding = HIDE_NONE; 1385 } 1386 1387 if (opts.mapKdeIcons && qtSettings.icons) { 1388 qtc_gtkrc_printf(str_buff, "gtk-icon-theme-name=\"%s\"", 1389 qtSettings.icons); 1390 } 1391 1392 if(opts.mapKdeIcons && (path = getIconPath())) 1393 { 1394 const char *iconTheme=qtSettings.icons ? qtSettings.icons : "XX"; 1395 /* '#' VERSION ' '<kde version> <..nums above..>\0 */ 1396 int versionLen = (1 + strlen(qtcVersion()) + 1 + 1397 strlen(iconTheme) + 1 + 2 + 6 * 2 + 1); 1398 char *version = (char*)malloc(versionLen); 1399 1400 tmpStr = getConfFile("gtk-icons", tmpStr); 1401 sprintf(version, "#%s %s %02X%02X%02X%02X%02X%02X%02X", 1402 qtcVersion(), iconTheme, 4, 1403 qtSettings.iconSizes.smlTbSize, 1404 qtSettings.iconSizes.tbSize, 1405 qtSettings.iconSizes.dndSize, 1406 qtSettings.iconSizes.btnSize, 1407 qtSettings.iconSizes.mnuSize, 1408 qtSettings.iconSizes.dlgSize); 1409 1410 if (!checkFileVersion(tmpStr, version, versionLen)) { 1411 static const char *constCmdStrFmt = "perl " QTC_GTK2_THEME_DIR "/map_kde_icons.pl " QTC_GTK2_THEME_DIR "/icons%d %s %d %d %d %d %d %d %d %s %s > %s.%d && mv %s.%d %s"; 1412 1413 const char *kdeprefix = kdeIconsPrefix(); 1414 int fileNameLen = strlen(tmpStr); 1415 char *cmdStr = (char*)malloc(strlen(constCmdStrFmt) + 2 + 1416 4 * 6 + 2 + strlen(iconTheme) + 1417 (kdeprefix ? 1418 strlen(kdeprefix) : 1419 DEFAULT_ICON_PREFIX_LEN) + 1420 fileNameLen * 3 + 64 + 1421 strlen(qtcVersion()) + 1); 1422 1423 sprintf(cmdStr, constCmdStrFmt, 4, 1424 kdeprefix ? kdeprefix : DEFAULT_ICON_PREFIX, 4, 1425 qtSettings.iconSizes.smlTbSize, 1426 qtSettings.iconSizes.tbSize, 1427 qtSettings.iconSizes.dndSize, 1428 qtSettings.iconSizes.btnSize, 1429 qtSettings.iconSizes.mnuSize, 1430 qtSettings.iconSizes.dlgSize, 1431 iconTheme, qtcVersion(), tmpStr, getpid(), 1432 tmpStr, getpid(), tmpStr); 1433 system(cmdStr); 1434 free(cmdStr); 1435 } 1436 free(version); 1437 gtk_rc_parse_string(path); 1438 gtk_rc_parse(tmpStr); 1439 } 1440 1441 if((settings=gtk_settings_get_default())) 1442 { 1443 if(qtSettings.fonts[FONT_GENERAL]) 1444 g_object_set(settings, "gtk-font-name", qtSettings.fonts[FONT_GENERAL], nullptr); 1445 1446 gtk_settings_set_long_property(settings, "gtk-toolbar-style", qtSettings.toolbarStyle, "KDE-Settings"); 1447 if(qtSettings.debug) fprintf(stderr, DEBUG_PREFIX "gtk-toolbar-style %d\n", qtSettings.toolbarStyle); 1448 if (gtk_check_version(2, 4, 0) == nullptr) { 1449 /* The following settings only apply for GTK>=2.4.0 */ 1450 if(qtSettings.debug) fprintf(stderr, DEBUG_PREFIX "gtk-button-images %d\n", qtSettings.buttonIcons); 1451 gtk_settings_set_long_property(settings, "gtk-button-images", qtSettings.buttonIcons, "KDE-Settings"); 1452 #if 0 1453 if(opts.drawStatusBarFrames) 1454 gtk_rc_parse_string("style \"" RC_SETTING "StBar\"" 1455 "{ GtkStatusbar::shadow-type = 1 }" /*GtkStatusbar::has-resize-grip = false }" */ 1456 "class \"GtkStatusbar\" style" 1457 " \"" RC_SETTING "StBar\""); 1458 else 1459 gtk_rc_parse_string("style \"" RC_SETTING "SBar\"" 1460 "{ GtkStatusbar::shadow-type = 0 }" /*GtkStatusbar::has-resize-grip = false }" */ 1461 "class \"GtkStatusbar\" style" 1462 " \"" RC_SETTING "SBar\""); 1463 #endif 1464 } 1465 1466 /* The following settings only apply for GTK>=2.6.0 */ 1467 if(!opts.gtkButtonOrder && nullptr==gtk_check_version(2, 6, 0)) 1468 g_object_set(settings, "gtk-alternative-button-order", true, nullptr); 1469 1470 gtk_settings_set_long_property(settings, "gtk-menu-popup-delay", opts.menuDelay, "KDE-Settings"); 1471 } 1472 1473 if(qtSettings.fonts[FONT_GENERAL]) 1474 { 1475 static const char *constFormat="style \"" RC_SETTING "Fnt\" {font_name=\"%s\"} " 1476 "widget_class \"*\" style \"" RC_SETTING "Fnt\" "; 1477 tmpStr=(char *)realloc(tmpStr, strlen(constFormat)+strlen(qtSettings.fonts[FONT_GENERAL])+1); 1478 1479 sprintf(tmpStr, constFormat, qtSettings.fonts[FONT_GENERAL]); 1480 gtk_rc_parse_string(tmpStr); 1481 } 1482 1483 if(qtSettings.fonts[FONT_BOLD] && qtSettings.fonts[FONT_GENERAL] && strcmp(qtSettings.fonts[FONT_BOLD], qtSettings.fonts[FONT_GENERAL])) 1484 { 1485 static const char *constBoldPrefix="style \"" RC_SETTING "BFnt\"{font_name=\""; 1486 static const char *constBoldSuffix="\"} class \"GtkProgress\" style \"" RC_SETTING "BFnt\" " 1487 "widget_class \"*GtkProgress*\" style \"" RC_SETTING "BFnt\" "; 1488 1489 if(opts.gbLabel&GB_LBL_BOLD) 1490 { 1491 static const char *constStdPrefix="style \"" RC_SETTING "Fnt\"{font_name=\""; 1492 static const char *constStdSuffix="\"} "; 1493 static const char *constGrpBoxBoldSuffix="widget_class \"*Frame.GtkLabel\" style \"" RC_SETTING "BFnt\" " 1494 "widget_class \"*Statusbar.*Frame.GtkLabel\" style \"" RC_SETTING "Fnt\""; 1495 tmpStr=(char *)realloc(tmpStr, strlen(constStdPrefix)+strlen(qtSettings.fonts[FONT_GENERAL])+strlen(constStdSuffix)+ 1496 strlen(constBoldPrefix)+strlen(qtSettings.fonts[FONT_BOLD])+ 1497 (opts.boldProgress ? strlen(constBoldSuffix) : strlen(constStdSuffix))+ 1498 strlen(constGrpBoxBoldSuffix)+1); 1499 1500 sprintf(tmpStr, "%s%s%s%s%s%s%s", 1501 constStdPrefix, qtSettings.fonts[FONT_GENERAL], constStdSuffix, 1502 constBoldPrefix, qtSettings.fonts[FONT_BOLD], opts.boldProgress ? constBoldSuffix : constStdSuffix, 1503 constGrpBoxBoldSuffix); 1504 } 1505 else if(opts.boldProgress) 1506 { 1507 tmpStr=(char *)realloc(tmpStr, strlen(constBoldPrefix)+strlen(qtSettings.fonts[FONT_BOLD])+strlen(constBoldSuffix)+1); 1508 sprintf(tmpStr, "%s%s%s", constBoldPrefix, qtSettings.fonts[FONT_BOLD], constBoldSuffix); 1509 } 1510 1511 gtk_rc_parse_string(tmpStr); 1512 } 1513 1514 if(qtSettings.fonts[FONT_MENU] && qtSettings.fonts[FONT_GENERAL] && strcmp(qtSettings.fonts[FONT_MENU], qtSettings.fonts[FONT_GENERAL])) 1515 { 1516 static const char *constFormat="style \"" RC_SETTING "MFnt\" {font_name=\"%s\"} " 1517 "widget_class \"*.*MenuItem.*\" style \"" RC_SETTING "MFnt\" "; 1518 tmpStr=(char *)realloc(tmpStr, strlen(constFormat)+strlen(qtSettings.fonts[FONT_MENU])+1); 1519 1520 sprintf(tmpStr, constFormat, qtSettings.fonts[FONT_MENU]); 1521 gtk_rc_parse_string(tmpStr); 1522 } 1523 1524 if(qtSettings.fonts[FONT_TOOLBAR] && qtSettings.fonts[FONT_GENERAL] && strcmp(qtSettings.fonts[FONT_TOOLBAR], qtSettings.fonts[FONT_GENERAL])) 1525 { 1526 static const char *constFormat="style \"" RC_SETTING "TbFnt\" {font_name=\"%s\"} " 1527 "widget_class \"*.*Toolbar.*\" style \"" RC_SETTING "TbFnt\" "; 1528 tmpStr=(char *)realloc(tmpStr, strlen(constFormat)+strlen(qtSettings.fonts[FONT_TOOLBAR])+1); 1529 1530 sprintf(tmpStr, constFormat, qtSettings.fonts[FONT_TOOLBAR]); 1531 gtk_rc_parse_string(tmpStr); 1532 } 1533 1534 if((opts.thin&THIN_MENU_ITEMS)) 1535 gtk_rc_parse_string("style \"" RC_SETTING "Mi\" {xthickness = 1 ythickness = 2 } " 1536 "class \"*MenuItem\" style \"" RC_SETTING "Mi\""); 1537 1538 /* Set password character... */ 1539 /* 1540 { 1541 static const char *constPasswdStrFormat="style \"QtCPasswd\" { GtkEntry::invisible-char='$' } class \"*\" style \"QtCPasswd\""; 1542 1543 tmpStr=(char *)realloc(tmpStr, strlen(constPasswdStrFormat)+16); 1544 sprintf(tmpStr, constPasswdStrFormat, opts.passwordChar); 1545 gtk_rc_parse_string(tmpStr); 1546 } 1547 */ 1548 /* For some reason Firefox 3beta4 goes mad if GtkComboBoxEntry::appears-as-list = 1 !!!! */ 1549 if(isMozilla()) 1550 gtk_rc_parse_string("style \"" RC_SETTING "Mz\" { GtkComboBoxEntry::appears-as-list = 0 } class \"*\" style \"" RC_SETTING "Mz\""); 1551 else if(!opts.gtkComboMenus) 1552 { 1553 gtk_rc_parse_string("style \"" RC_SETTING "Cmb\" { GtkComboBox::appears-as-list = 1 } class \"*\" style \"" RC_SETTING "Cmb\""); 1554 gtk_rc_parse_string("style \"" RC_SETTING "Cmbf\" { xthickness=5 } widget_class \"*.GtkComboBox.GtkFrame\" style \"" RC_SETTING "Cmbf\""); 1555 } 1556 1557 if (oneOf(qtSettings.app, GTK_APP_MOZILLA, GTK_APP_JAVA) || 1558 (opts.scrollbarType == SCROLLBAR_NONE && isMozilla())) { 1559 opts.scrollbarType = SCROLLBAR_WINDOWS; 1560 } else { 1561 static const char *constSbStrFormat="style \"" RC_SETTING "SBt\" " 1562 "{ GtkScrollbar::has-backward-stepper=%d " 1563 "GtkScrollbar::has-forward-stepper=%d " 1564 "GtkScrollbar::has-secondary-backward-stepper=%d " 1565 "GtkScrollbar::has-secondary-forward-stepper=%d } " 1566 "class \"*\" style \"" RC_SETTING "SBt\""; 1567 tmpStr=(char *)realloc(tmpStr, strlen(constSbStrFormat)+1); 1568 1569 if(GTK_APP_OPEN_OFFICE==qtSettings.app) 1570 { 1571 if(SCROLLBAR_NEXT==opts.scrollbarType) 1572 opts.scrollbarType=SCROLLBAR_KDE; 1573 else if(SCROLLBAR_NONE==opts.scrollbarType) 1574 opts.scrollbarType=SCROLLBAR_WINDOWS; 1575 } 1576 1577 switch(opts.scrollbarType) 1578 { 1579 default: 1580 case SCROLLBAR_KDE: 1581 sprintf(tmpStr, constSbStrFormat, 1, 1, 1, 0); 1582 break; 1583 case SCROLLBAR_WINDOWS: 1584 sprintf(tmpStr, constSbStrFormat, 1, 1, 0, 0); 1585 break; 1586 case SCROLLBAR_PLATINUM: 1587 sprintf(tmpStr, constSbStrFormat, 0, 1, 1, 0); 1588 break; 1589 case SCROLLBAR_NEXT: 1590 sprintf(tmpStr, constSbStrFormat, 1, 0, 0, 1); 1591 break; 1592 case SCROLLBAR_NONE: 1593 sprintf(tmpStr, constSbStrFormat, 0, 0, 0, 0); 1594 break; 1595 } 1596 1597 gtk_rc_parse_string(tmpStr); 1598 } 1599 1600 /* Set cursor colours... */ 1601 const char *constStrFormat="style \"" RC_SETTING "Crsr\" " 1602 "{ GtkWidget::cursor-color=\"#%02X%02X%02X\" " 1603 "GtkWidget::secondary-cursor-color=\"#%02X%02X%02X\" } " 1604 "class \"*\" style \"" RC_SETTING "Crsr\""; 1605 tmpStr=(char *)realloc(tmpStr, strlen(constStrFormat)+1); 1606 1607 sprintf(tmpStr, constStrFormat, 1608 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].red>>8, 1609 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].green>>8, 1610 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].blue>>8, 1611 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].red>>8, 1612 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].green>>8, 1613 qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].blue>>8); 1614 gtk_rc_parse_string(tmpStr); 1615 1616 if(!opts.gtkScrollViews && nullptr!=gtk_check_version(2, 12, 0)) 1617 opts.gtkScrollViews=true; 1618 1619 bool doEffect=EFFECT_NONE!=opts.buttonEffect; 1620 int thickness=2; 1621 1622 constStrFormat = 1623 "style \"" RC_SETTING "Etch2\" " 1624 "{ xthickness = 3 ythickness = %d} " 1625 "class \"*Button\" style \"" RC_SETTING "Etch2\"" 1626 "class \"*GtkOptionMenu\" style \"" RC_SETTING "Etch2\""; 1627 1628 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 2); 1629 sprintf(tmpStr, constStrFormat, (opts.thin & THIN_BUTTONS) || 1630 !doEffect ? 1 : 2); 1631 gtk_rc_parse_string(tmpStr); 1632 1633 constStrFormat = 1634 "style \"" RC_SETTING "EtchE\" { xthickness = %d " 1635 "ythickness = %d } style \"" RC_SETTING "EtchS\" " 1636 "{ xthickness = %d ythickness = %d } widget_class " 1637 "\"*Toolbar*GtkSpinButton\" style \"" RC_SETTING "EtchE\" " 1638 "class \"*GtkEntry\" style \"" RC_SETTING "EtchE\" " 1639 "widget_class \"*Toolbar*Entry\" style \"" RC_SETTING "EtchE\" " 1640 "class \"*GtkSpinButton\" style \"" RC_SETTING "EtchS\" "; 1641 1642 int thick = /*opts.etchEntry && doEffect ?*/ 4 /*: 3*/; 1643 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 8); 1644 sprintf(tmpStr, constStrFormat, thick, thick, thick, thick); 1645 gtk_rc_parse_string(tmpStr); 1646 1647 if (isMozilla()) { 1648 constStrFormat = 1649 "style \"" RC_SETTING "EtchEM\" { xthickness = %d " 1650 "ythickness = %d } widget_class " 1651 "\"*GtkFixed*GtkSpinButton\" style \"" RC_SETTING 1652 "EtchEM\" widget_class \"*GtkFixed*Entry\" style \"" 1653 RC_SETTING "EtchEM\" "; 1654 1655 int thick = opts.etchEntry && doEffect ? 3 : 2; 1656 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 4); 1657 sprintf(tmpStr, constStrFormat, thick, thick); 1658 gtk_rc_parse_string(tmpStr); 1659 } 1660 1661 if(!opts.gtkScrollViews) 1662 gtk_rc_parse_string("style \"" RC_SETTING "SV\"" 1663 " { GtkScrolledWindow::scrollbar-spacing = 0 " 1664 " GtkScrolledWindow::scrollbars-within-bevel = 1 } " 1665 "class \"GtkScrolledWindow\" style \"" RC_SETTING "SV\""); 1666 else if(opts.etchEntry) 1667 gtk_rc_parse_string("style \"" RC_SETTING "SV\"" 1668 " { GtkScrolledWindow::scrollbar-spacing = 2 } " 1669 "class \"GtkScrolledWindow\" style \"" RC_SETTING "SV\""); 1670 1671 /* Scrolled windows */ 1672 if((opts.square&SQUARE_SCROLLVIEW)) 1673 thickness=!opts.highlightScrollViews && (opts.gtkScrollViews || opts.thinSbarGroove || !opts.borderSbarGroove) ? 1 : 2; 1674 else if(opts.etchEntry) 1675 thickness=3; 1676 1677 constStrFormat = 1678 "style \"" RC_SETTING "SVt\" { xthickness = %d " 1679 "ythickness = %d } class \"*GtkScrolledWindow\" style \"" 1680 RC_SETTING "SVt\""; 1681 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 1); 1682 sprintf(tmpStr, constStrFormat, thickness, thickness); 1683 gtk_rc_parse_string(tmpStr); 1684 1685 constStrFormat = 1686 "style \"" RC_SETTING "Pbar\" { xthickness = %d " 1687 "ythickness = %d } widget_class \"*GtkProgressBar\" style \"" 1688 RC_SETTING "Pbar\""; 1689 int pthickness = (opts.fillProgress ? 1690 doEffect && opts.borderProgress ? 1 : 0 : 1691 doEffect ? 2 : 1); 1692 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 1); 1693 sprintf(tmpStr, constStrFormat, pthickness, pthickness); 1694 gtk_rc_parse_string(tmpStr); 1695 1696 constStrFormat = 1697 "style \"" RC_SETTING "TT\" { xthickness = 4 " 1698 "ythickness = 4 bg[NORMAL] = \"#%02X%02X%02X\" " 1699 "fg[NORMAL] = \"#%02X%02X%02X\"} widget \"gtk-tooltips*\" " 1700 "style \"" RC_SETTING "TT\" widget \"gtk-tooltip*\" style \"" 1701 RC_SETTING "TT\""; 1702 1703 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 1); 1704 sprintf(tmpStr, constStrFormat, 1705 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP].red), 1706 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP].green), 1707 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP].blue), 1708 toQtColor( 1709 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP_TEXT].red), 1710 toQtColor( 1711 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP_TEXT].green), 1712 toQtColor( 1713 qtSettings.colors[PAL_ACTIVE][COLOR_TOOLTIP_TEXT].blue)); 1714 gtk_rc_parse_string(tmpStr); 1715 1716 if( EFFECT_NONE==opts.buttonEffect) 1717 gtk_rc_parse_string("style \"" RC_SETTING "Cmb\" { xthickness = 4 ythickness = 2 }" 1718 "widget_class \"*.GtkCombo.GtkEntry\" style \"" RC_SETTING "Cmb\""); 1719 1720 if(opts.round>=ROUND_FULL && EFFECT_NONE!=opts.buttonEffect) 1721 gtk_rc_parse_string("style \"" RC_SETTING "Swt\" { xthickness = 3 ythickness = 2 }" 1722 "widget_class \"*.SwtFixed.GtkCombo.GtkButton\" style \"" RC_SETTING "Swt\"" 1723 "widget_class \"*.SwtFixed.GtkCombo.GtkEntry\" style \"" RC_SETTING "Swt\""); 1724 1725 1726 gtk_rc_parse_string("style \"" RC_SETTING "MnuTb\" " 1727 "{ xthickness=1 ythickness=1" 1728 " GtkButton::focus-padding=0 GtkWidget::focus-line-width=0} " 1729 "class \"*GtkMenuToolButton\" style \"" RC_SETTING "MnuTb\"" 1730 "widget_class \"*.GtkMenuToolButton.*Box.GtkToggleButton\" style \"" RC_SETTING "MnuTb\""); 1731 1732 if(!opts.popupBorder) 1733 gtk_rc_parse_string("style \"" RC_SETTING "M\" { xthickness=0 ythickness=0 }\n" 1734 "class \"*GtkMenu\" style \"" RC_SETTING "M\""); 1735 else if(!qtcDrawMenuBorder(opts) && !opts.borderMenuitems && 1736 opts.square & SQUARE_POPUP_MENUS) 1737 gtk_rc_parse_string("style \"" RC_SETTING "M\" { xthickness=1 ythickness=1 }\n" 1738 "class \"*GtkMenu\" style \"" RC_SETTING "M\""); 1739 1740 constStrFormat = 1741 "style \"" RC_SETTING "Tree\" { GtkTreeView::odd-row-color = " 1742 "\"#%02X%02X%02X\" GtkTreeView::even-row-color = " 1743 "\"#%02X%02X%02X\"} widget \"*GtkTreeView*\" style \"" 1744 RC_SETTING "Tree\""; 1745 int alt = haveAlternateListViewCol() ? COLOR_LV : COLOR_BACKGROUND; 1746 1747 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 1); 1748 sprintf(tmpStr, constStrFormat, 1749 toQtColor(qtSettings.colors[PAL_ACTIVE][alt].red), 1750 toQtColor(qtSettings.colors[PAL_ACTIVE][alt].green), 1751 toQtColor(qtSettings.colors[PAL_ACTIVE][alt].blue), 1752 toQtColor( 1753 qtSettings.colors[PAL_ACTIVE][COLOR_BACKGROUND].red), 1754 toQtColor( 1755 qtSettings.colors[PAL_ACTIVE][COLOR_BACKGROUND].green), 1756 toQtColor( 1757 qtSettings.colors[PAL_ACTIVE][COLOR_BACKGROUND].blue)); 1758 gtk_rc_parse_string(tmpStr); 1759 1760 if (!opts.useHighlightForMenu) { 1761 constStrFormat = 1762 "style \"" RC_SETTING "Mnu\" { text[ACTIVE] = " 1763 "\"#%02X%02X%02X\" text[SELECTED] = \"#%02X%02X%02X\" } " 1764 " class \"*MenuItem\" style \"" RC_SETTING "Mnu\"" 1765 " widget_class \"*MenuBar*MenuItem\" style \"" RC_SETTING 1766 "Mnu\" widget_class \"*.GtkAccelMenuItem\" style \"" 1767 RC_SETTING "Mnu\" widget_class \"*.GtkRadioMenuItem\" " 1768 "style \"" RC_SETTING "Mnu\" widget_class " 1769 "\"*.GtkCheckMenuItem\" style \"" RC_SETTING "Mnu\"" 1770 " widget_class \"*.GtkImageMenuItem\" style \"" RC_SETTING 1771 "Mnu\""; 1772 1773 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 1); 1774 sprintf(tmpStr, constStrFormat, 1775 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].red), 1776 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].green), 1777 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].blue), 1778 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].red), 1779 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].green), 1780 toQtColor(qtSettings.colors[PAL_ACTIVE][COLOR_TEXT].blue)); 1781 gtk_rc_parse_string(tmpStr); 1782 } 1783 1784 /* Mozilla seems to assume that all scrolledviews are square :-( 1785 So, set the xthickness and ythickness to 1, and in qtcurve.c draw these as square */ 1786 if(isMozilla()) 1787 gtk_rc_parse_string("style \"" RC_SETTING "SVm\"" 1788 " { xthickness=1 ythickness=1 } " 1789 "widget_class \"GtkWindow.GtkFixed.GtkScrolledWindow\" style \"" RC_SETTING "SVm\""); 1790 1791 if(TAB_MO_GLOW==opts.tabMouseOver) 1792 gtk_rc_parse_string("style \"" RC_SETTING "Tab\" { GtkNotebook::tab-overlap = 0 } class \"*GtkNotebook\" style \"" RC_SETTING "Tab\""); 1793 1794 if (!opts.useHighlightForMenu && 1795 GTK_APP_OPEN_OFFICE == qtSettings.app) { 1796 constStrFormat = 1797 "style \"" RC_SETTING "OOMnu\" " 1798 "{ bg[SELECTED] = \"#%02X%02X%02X\" } " 1799 " class \"*Menu*\" style \"" RC_SETTING "OOMnu\" " 1800 " widget_class \"*Menu*\" style \"" RC_SETTING "OOMnu\" "; 1801 1802 1803 shadeColors(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW], qtcPalette.background); 1804 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat)+1); 1805 sprintf(tmpStr, constStrFormat, 1806 toQtColor(qtcPalette.background[4].red), 1807 toQtColor(qtcPalette.background[4].green), 1808 toQtColor(qtcPalette.background[4].blue)); 1809 gtk_rc_parse_string(tmpStr); 1810 } 1811 1812 if (DEFAULT_SLIDER_WIDTH != opts.sliderWidth) { 1813 constStrFormat = 1814 "style \"" RC_SETTING "SbarW\" " 1815 "{ GtkRange::slider_width = %d GtkRange::stepper_size = %d " 1816 " GtkScrollbar::min_slider_length = %d } " 1817 " class \"*\" style \"" RC_SETTING "SbarW\" "; 1818 1819 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 16); 1820 sprintf(tmpStr, constStrFormat, opts.sliderWidth, 1821 opts.sliderWidth, opts.sliderWidth+1); 1822 gtk_rc_parse_string(tmpStr); 1823 } 1824 1825 bool customSliderW = opts.sliderWidth != DEFAULT_SLIDER_WIDTH; 1826 int glowSize = (opts.buttonEffect != EFFECT_NONE && 1827 opts.coloredMouseOver == MO_GLOW ? 2 : 0); 1828 int length = (SLIDER_CIRCULAR==opts.sliderStyle ? 1829 CIRCULAR_SLIDER_SIZE : 1830 SLIDER_TRIANGULAR == opts.sliderStyle ? 11 : 1831 SLIDER_PLAIN_ROTATED == opts.sliderStyle || 1832 SLIDER_ROUND_ROTATED == opts.sliderStyle ? 1833 (customSliderW ? SLIDER_SIZE - 2 : 13) : 1834 (customSliderW ? SLIDER_SIZE + 6 : 21)) + glowSize; 1835 int width = (SLIDER_CIRCULAR == opts.sliderStyle ? 1836 CIRCULAR_SLIDER_SIZE : 1837 SLIDER_TRIANGULAR == opts.sliderStyle ? 18 : 1838 SLIDER_PLAIN_ROTATED == opts.sliderStyle || 1839 SLIDER_ROUND_ROTATED == opts.sliderStyle ? 1840 (customSliderW ? SLIDER_SIZE + 6 : 21) : 1841 (customSliderW ? SLIDER_SIZE - 2 : 13)) + glowSize; 1842 1843 constStrFormat = 1844 "style \"" RC_SETTING "Sldr\" " 1845 "{GtkScale::slider_length = %d GtkScale::slider_width = %d} " 1846 "class \"*\" style \"" RC_SETTING "Sldr\""; 1847 1848 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 8); 1849 sprintf(tmpStr, constStrFormat, length, width); 1850 gtk_rc_parse_string(tmpStr); 1851 1852 if(!opts.menuIcons) 1853 gtk_rc_parse_string("gtk-menu-images=0"); 1854 1855 if(opts.hideShortcutUnderline) 1856 gtk_rc_parse_string("gtk-auto-mnemonics=1"); 1857 1858 if(LINE_1DOT==opts.splitters) 1859 gtk_rc_parse_string("style \"" RC_SETTING "Spl\" { GtkPaned::handle_size=7 GtkPaned::handle_width = 7 } " 1860 "class \"*GtkWidget\" style \"" RC_SETTING "Spl\""); 1861 1862 if (oneOf(opts.bgndImage.type, IMG_PLAIN_RINGS, 1863 IMG_BORDERED_RINGS, IMG_SQUARE_RINGS) || 1864 oneOf(opts.menuBgndImage.type, IMG_PLAIN_RINGS, 1865 IMG_BORDERED_RINGS, IMG_SQUARE_RINGS)) { 1866 qtcCalcRingAlphas(&qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW]); 1867 } 1868 1869 if (isMozilla()) 1870 opts.crSize = CR_SMALL_SIZE; 1871 1872 if (opts.crSize != CR_LARGE_SIZE) { 1873 constStrFormat = 1874 "style \"" RC_SETTING "CRSize\" " 1875 "{ GtkCheckButton::indicator_size = %d }" 1876 " class \"*\" style \"" RC_SETTING "CRSize\" "; 1877 tmpStr = (char*)realloc(tmpStr, strlen(constStrFormat) + 16); 1878 sprintf(tmpStr, constStrFormat, opts.crSize); 1879 gtk_rc_parse_string(tmpStr); 1880 } 1881 1882 #if 0 1883 // Remove because, in KDE4 at least, if have two locked toolbars together then the last/first items are too close 1884 if(TB_NONE==opts.toolbarBorders) 1885 gtk_rc_parse_string("style \"" RC_SETTING "TbB\" { xthickness = 0 ythickness = 0 GtkToolbar::internal-padding = 0 }" 1886 " widget_class \"*<GtkToolbar>\" style \"" RC_SETTING "TbB\""); 1887 #endif 1888 1889 if(TBTN_RAISED==opts.tbarBtns || TBTN_JOINED==opts.tbarBtns) 1890 gtk_rc_parse_string("style \"" RC_SETTING "TbJ\" { GtkToolbar::button-relief = 1 } " 1891 "widget_class \"*<GtkToolbar>\" style \"" RC_SETTING "TbJ\""); 1892 1893 free(tmpStr); 1894 1895 if(opts.shadeMenubarOnlyWhenActive && SHADE_WINDOW_BORDER==opts.shadeMenubars && 1896 EQUAL_COLOR(qtSettings.colors[PAL_ACTIVE][COLOR_WINDOW_BORDER], qtSettings.colors[PAL_INACTIVE][COLOR_WINDOW_BORDER])) 1897 opts.shadeMenubarOnlyWhenActive=false; 1898 1899 if (!(opts.square&SQUARE_POPUP_MENUS) || !(opts.square&SQUARE_TOOLTIPS)) 1900 { 1901 readKwinrc(); 1902 } 1903 setlocale(LC_NUMERIC, locale); 1904 } 1905 return true; 1906 } 1907 return false; 1908 } 1909 1910 #if 0 1911 static void qtSettingsExit() 1912 { 1913 qt_refs--; 1914 if (!qt_refs) { 1915 for(int i = 0;i < FONT_NUM_TOTAL;++i) { 1916 free(qtSettings.fonts[i]); 1917 qtSettings.fonts[i] = nullptr; 1918 } 1919 free(qtSettings.icons); 1920 qtSettings.icons = nullptr; 1921 } 1922 } 1923 #endif 1924 1925 #define SET_COLOR_PAL(st, rc, itm, ITEM, state, QTP_COL, PAL, USE_DIS) \ 1926 st->itm[state]=rc->color_flags[state]&ITEM \ 1927 ? rc->itm[state] \ 1928 : qtSettings.colors[state==GTK_STATE_INSENSITIVE && USE_DIS\ 1929 ? PAL_DISABLED \ 1930 : PAL ][QTP_COL]; 1931 1932 #define SET_COLOR_PAL_ACT(st, rc, itm, ITEM, state, QTP_COL) \ 1933 st->itm[state]=rc->color_flags[state]&ITEM \ 1934 ? rc->itm[state] \ 1935 : qtSettings.colors[PAL_ACTIVE][QTP_COL]; 1936 1937 #define SET_COLOR_X(st, rc, itm, ITEM, state, QTP_COL, USE_DIS) \ 1938 SET_COLOR_PAL(st, rc, itm, ITEM, state, QTP_COL, PAL_ACTIVE, USE_DIS) 1939 1940 #define SET_COLOR(st, rc, itm, ITEM, state, QTP_COL) \ 1941 SET_COLOR_PAL(st, rc, itm, ITEM, state, QTP_COL, PAL_ACTIVE, true) 1942 1943 void qtSettingsSetColors(GtkStyle *style, GtkRcStyle *rc_style) 1944 { 1945 SET_COLOR(style, rc_style, bg, GTK_RC_BG, GTK_STATE_NORMAL, COLOR_WINDOW) 1946 SET_COLOR(style, rc_style, bg, GTK_RC_BG, GTK_STATE_SELECTED, COLOR_SELECTED) 1947 SET_COLOR_X(style, rc_style, bg, GTK_RC_BG, GTK_STATE_INSENSITIVE, COLOR_WINDOW, false) 1948 SET_COLOR(style, rc_style, bg, GTK_RC_BG, GTK_STATE_ACTIVE, COLOR_MID) 1949 SET_COLOR(style, rc_style, bg, GTK_RC_BG, GTK_STATE_PRELIGHT, COLOR_WINDOW) 1950 1951 SET_COLOR(style, rc_style, base, GTK_RC_BASE, GTK_STATE_NORMAL, COLOR_BACKGROUND) 1952 SET_COLOR(style, rc_style, base, GTK_RC_BASE, GTK_STATE_SELECTED, COLOR_SELECTED) 1953 SET_COLOR_PAL_ACT(style, rc_style, base, GTK_RC_BASE, GTK_STATE_INSENSITIVE, COLOR_WINDOW) 1954 SET_COLOR(style, rc_style, base, GTK_RC_BASE, GTK_STATE_ACTIVE, COLOR_SELECTED) 1955 if(qtSettings.inactiveChangeSelectionColor) 1956 style->base[GTK_STATE_ACTIVE]=qtSettings.colors[PAL_INACTIVE][COLOR_SELECTED]; 1957 SET_COLOR(style, rc_style, base, GTK_RC_BASE, GTK_STATE_PRELIGHT, COLOR_BACKGROUND) 1958 1959 SET_COLOR(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_NORMAL, COLOR_TEXT) 1960 SET_COLOR(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_SELECTED, COLOR_TEXT_SELECTED) 1961 SET_COLOR(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_INSENSITIVE, COLOR_TEXT) 1962 SET_COLOR(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_ACTIVE, COLOR_TEXT_SELECTED) 1963 1964 // if(opts.inactiveHighlight) 1965 // SET_COLOR(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_ACTIVE, COLOR_TEXT) 1966 // else 1967 // SET_COLOR_PAL(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_ACTIVE, COLOR_TEXT_SELECTED, PAL_INACTIVE) 1968 1969 SET_COLOR(style, rc_style, text, GTK_RC_TEXT, GTK_STATE_PRELIGHT, COLOR_TEXT) 1970 1971 SET_COLOR(style, rc_style, fg, GTK_RC_FG, GTK_STATE_NORMAL, COLOR_WINDOW_TEXT) 1972 SET_COLOR(style, rc_style, fg, GTK_RC_FG, GTK_STATE_SELECTED, COLOR_TEXT_SELECTED) 1973 // if (isMozilla()) 1974 SET_COLOR(style, rc_style, fg, GTK_RC_FG, GTK_STATE_INSENSITIVE, COLOR_TEXT) 1975 // else 1976 // SET_COLOR(style, rc_style, fg, GTK_RC_FG, GTK_STATE_INSENSITIVE, COLOR_MID) 1977 SET_COLOR(style, rc_style, fg, GTK_RC_FG, GTK_STATE_ACTIVE, COLOR_WINDOW_TEXT) 1978 SET_COLOR(style, rc_style, fg, GTK_RC_FG, GTK_STATE_PRELIGHT, COLOR_WINDOW_TEXT) 1979 } 1980 1981 }