File indexing completed on 2024-05-12 17:10:55

0001 /*
0002  * zootreeves theme engine
0003  *
0004  * zootreeves.c
0005  *
0006  * Copyright (C) 2006 Quinn Storm <livinglatexkali@gmail.com> (original legacy theme engine)
0007  * Copyright (C) 2006 Ben Reeves <john@reeves160.freeserve.co.uk>
0008  *
0009  * This program is free software; you can redistribute it and/or
0010  * modify it under the terms of the GNU General Public License
0011  * as published by the Free Software Foundation; either version 2
0012  * of the License, or (at your option) any later version.
0013  *
0014  * This program is distributed in the hope that it will be useful,
0015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0017  * GNU General Public License for more details.
0018  *
0019  * You should have received a copy of the GNU General Public License
0020  * along with this program; if not, write to the Free Software
0021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
0022  *
0023  */
0024 
0025 //zootreeves engine
0026 
0027 #include <emerald.h>
0028 #include <engine.h>
0029 #include "zootreeves_engine.h"
0030 
0031 #define SECT "zootreeves_settings"  
0032 
0033 #define DIP_ROUND_TRI  (1 << 4)
0034 
0035 
0036 typedef struct _pixmaps { 
0037     cairo_surface_t *titlebar_surface;
0038     cairo_surface_t *titlebar_surface_large;
0039     cairo_surface_t *titlebar_surface_buttons;
0040     gboolean    buttonpart_enabled;
0041     gboolean    buttonpart_repeat_enabled;
0042     gboolean    titlebarpart_repeat_enabled;
0043     gboolean    titlebarpart_enabled;
0044     gboolean    titlebar_enabled;
0045     gboolean    titlebar_repeat_enabled;
0046     
0047 } pixmaps;
0048 
0049 typedef struct _private_fs
0050 {
0051     alpha_color inner;
0052     alpha_color outer;
0053     alpha_color title_inner;
0054     alpha_color title_outer;
0055     alpha_color window_halo;
0056     alpha_color window_frame_halo;
0057     alpha_color window_highlight;
0058     gboolean    gradient_repeat_enabled;
0059     gboolean    gradient_repeat_direction_vertical;
0060     gboolean    gradient_repeat_direction_diagonal;
0061     alpha_color window_shadow;
0062     alpha_color separator_line;
0063     alpha_color contents_highlight;
0064     alpha_color contents_shadow;
0065     alpha_color contents_halo;
0066     double  gradient_repeat_height;
0067 } private_fs;
0068 
0069 typedef struct _private_ws
0070 {
0071     gboolean done_indent;
0072     gboolean round_top_left;
0073     gboolean enable_maximised_colors;
0074     gboolean round_top_right;
0075     gboolean round_bottom_left;
0076     gboolean round_bottom_right;
0077     gboolean show_border_minimised;
0078     gboolean round_tri;
0079     gboolean show_border_maximised;
0080     gboolean enable_bar_dip_button_part;
0081     gboolean enable_title_bar_dip;
0082     gboolean enable_left_bar_dip;
0083     gboolean enable_left_bar_dip_lower_part;
0084     gboolean gradient_repeat_disabled_maximised;
0085     int     left_bar_dip_offset;
0086     double      outer_maximised_alpha;
0087     decor_color_t outer_maximised_color;
0088     double      inner_maximised_alpha;
0089     decor_color_t inner_maximised_color;
0090     double  titlebar_radius;
0091     double  frame_radius;
0092     double  window_gap;
0093     int     minimised_border;
0094     int     title_bar_dip_title_width;
0095     int     title_bar_dip_radius;
0096     int     title_bar_dip_button_width;
0097     int     left_bar_dip_radius;
0098     pixmaps     pixmaps;
0099     
0100 } private_ws;
0101 
0102 void get_meta_info (EngineMetaInfo * emi)
0103 {
0104     emi->version = g_strdup("0.1");
0105     emi->description = g_strdup(_("Evolved from the legacy engine"));
0106     emi->last_compat = g_strdup("0.0"); // old themes marked still compatible for testing-NeOS
0107     emi->icon = gdk_pixbuf_new_from_inline(-1,my_pixbuf,TRUE,NULL);
0108 }
0109 
0110 void
0111 rounded_rectangle_independent (cairo_t *cr,
0112         double  x,
0113         double  y,
0114         double  w,
0115         double  h,
0116     double  title_bar_height,
0117         int    corner,
0118         window_settings * ws,
0119         double  left_top_radius,
0120         double  right_top_radius,
0121         double  left_bottom_radius,
0122         double  right_bottom_radius,
0123     double  radius_tri,
0124     int pane_1_width,
0125     int dip_gap,
0126     gboolean enable_dip,
0127     gboolean enable_button_part,
0128     gboolean left_bar_dip,
0129     int bottom_border_width,
0130     int left_bar_dip_radius,
0131         gboolean enable_left_bar_dip_lower_part,
0132     double  left_bar_dip_offset
0133 )
0134 {
0135 
0136     int left_top_radius_on = 1;
0137     int right_top_radius_on = 1;
0138     int left_bottom_radius_on = 1;
0139     int right_bottom_radius_on = 1;
0140     int radius_tri_on = 0;
0141 
0142 
0143     if (left_top_radius==0)
0144         left_top_radius_on=0;
0145 
0146     if (right_top_radius==0)
0147         right_top_radius_on=0;
0148 
0149     if (left_bottom_radius==0)
0150         left_bottom_radius_on=0;
0151 
0152     if (right_bottom_radius==0)
0153         right_bottom_radius_on=0;
0154 
0155     if (radius_tri!=0) {
0156         radius_tri_on=1;
0157     }
0158 
0159 
0160     int curve, radius2;
0161     double cx, cy;
0162 
0163     if (left_top_radius_on == 1) {
0164         if ((corner & CORNER_TOPLEFT))
0165             cairo_move_to (cr, x + left_top_radius, y);
0166         else
0167             cairo_move_to (cr, x, y);
0168     }
0169 
0170 
0171    
0172 
0173 
0174 
0175     if (radius_tri_on == 1 && (corner & DIP_ROUND_TRI)) {
0176 
0177     if (radius_tri > title_bar_height) {
0178       radius_tri = title_bar_height;
0179     }
0180 
0181     curve = 2;
0182 
0183     radius2 = title_bar_height - radius_tri;
0184 
0185         cairo_arc (cr, x + pane_1_width, y  + radius_tri, radius_tri, M_PI * 1.5, M_PI * curve);
0186     cairo_get_current_point (cr, &cx, &cy);
0187         cairo_arc_negative (cr, x +pane_1_width + (title_bar_height), cy, radius2, M_PI* (curve - 1), M_PI * 2.5);
0188 
0189 
0190     radius2 = title_bar_height - radius_tri;
0191 
0192     if (enable_button_part == TRUE) {
0193     //Can use h to offset x because it is a square - would be radius - radius2
0194         cairo_arc_negative (cr, x + pane_1_width + dip_gap - radius_tri - radius2, y + radius_tri, radius2, M_PI * 2.5, M_PI * 2.0);
0195     cairo_get_current_point (cr, &cx, &cy);
0196         cairo_arc (cr, cx + radius_tri, cy, radius_tri, M_PI * 1.0, M_PI * 1.5);
0197     } else {
0198      cairo_get_current_point (cr, &cx, &cy);
0199          cairo_line_to (cr, x + w, cy);
0200         }
0201 
0202     }
0203 
0204 
0205     if (enable_dip == TRUE && !(corner & DIP_ROUND_TRI)) {
0206 
0207     curve = 2;
0208 
0209     radius2 = title_bar_height - radius_tri;
0210 
0211         cairo_arc (cr, x + pane_1_width - radius_tri, y  + radius_tri, radius_tri, M_PI * 1.5, M_PI * curve);
0212     cairo_get_current_point (cr, &cx, &cy);
0213         cairo_line_to (cr, cx, cy + radius2);
0214         cairo_line_to (cr, cx + dip_gap, cy + radius2);
0215         //cairo_arc_negative (cr, x +pane_1_width + (title_bar_height), cy, radius2, M_PI* (curve - 1), M_PI * 2.5);
0216 
0217 
0218     if (enable_button_part == TRUE) {
0219      cairo_get_current_point (cr, &cx, &cy);
0220          cairo_line_to (cr, cx, cy - radius2);
0221      cairo_get_current_point (cr, &cx, &cy);
0222          cairo_arc (cr, cx + radius_tri, cy, radius_tri, M_PI, M_PI * 1.5);
0223          //cairo_arc (cr, cx + radius_tri, cy, radius_tri, M_PI * 1.0, M_PI * 1.5);
0224     } else {
0225      cairo_get_current_point (cr, &cx, &cy);
0226          cairo_line_to (cr, x + w, cy);
0227         }
0228 
0229     }
0230 
0231 
0232      if (enable_button_part == TRUE) {  
0233     if (right_top_radius_on == 1) {
0234             if ((corner & CORNER_TOPRIGHT)) {
0235                 cairo_arc (cr, x + w - right_top_radius, y + right_top_radius, right_top_radius,
0236                 M_PI * 1.5, M_PI * 2.0);
0237             } else
0238                 cairo_line_to (cr, x + w, y);
0239     }
0240      }
0241 
0242     if (right_bottom_radius_on == 1) {
0243     if ((corner & CORNER_BOTTOMRIGHT))
0244         cairo_arc (cr, x + w - right_bottom_radius, y + h - right_bottom_radius, right_bottom_radius,
0245                 0.0, M_PI * 0.5);
0246     else
0247         cairo_line_to (cr, x + w, y + h);
0248     }
0249 
0250     if (left_bottom_radius_on == 1 && (corner & CORNER_BOTTOMLEFT))
0251         cairo_arc (cr, x + left_bottom_radius, y + h - left_bottom_radius, left_bottom_radius,
0252                 M_PI * 0.5, M_PI);
0253     else
0254 
0255   if (enable_left_bar_dip_lower_part == FALSE && left_bar_dip == TRUE) {
0256         cairo_line_to (cr, x + (2 * left_bar_dip_radius), y + h);
0257   } else {
0258         cairo_line_to (cr, x, y + h);
0259   }
0260 
0261      if (left_bar_dip == FALSE) {
0262          if (left_top_radius_on == 1) {
0263             if ((corner & CORNER_TOPLEFT)) {
0264                 cairo_arc (cr, x + left_top_radius, y + left_top_radius, left_top_radius, M_PI, M_PI * 1.5);
0265             } else
0266                 cairo_line_to (cr, x, y);
0267         }  
0268      }
0269 
0270 
0271   if (left_bar_dip == TRUE) {
0272     left_bar_dip_offset =  (((h - bottom_border_width - title_bar_height + 1)  /100) * (100 - left_bar_dip_offset));
0273 
0274     cairo_get_current_point (cr, &cx, &cy);        
0275     cairo_line_to (cr, cx, cy - bottom_border_width + 2);
0276     cairo_get_current_point (cr, &cx, &cy);
0277 
0278     if (enable_left_bar_dip_lower_part == TRUE) {
0279         cairo_arc (cr, cx + left_bar_dip_radius, cy, left_bar_dip_radius, M_PI * 1.0, M_PI * 1.5);
0280 
0281      cairo_get_current_point (cr, &cx, &cy);
0282         cairo_arc_negative (cr, cx, cy - left_bar_dip_radius, left_bar_dip_radius, M_PI * 0.5, M_PI * 2.0);
0283     } else {
0284     cairo_line_to (cr, cx, cy - (2 * left_bar_dip_radius));
0285     }
0286 
0287     cairo_get_current_point (cr, &cx, &cy);
0288     cairo_line_to (cr, cx, cy - 1- left_bar_dip_offset + (4* left_bar_dip_radius));
0289 
0290     cairo_get_current_point (cr, &cx, &cy);
0291         cairo_arc_negative (cr, cx - left_bar_dip_radius, cy, left_bar_dip_radius, M_PI * 0, M_PI * 3.5);
0292 
0293     cairo_get_current_point (cr, &cx, &cy);
0294         cairo_arc (cr, cx, cy - left_bar_dip_radius, left_bar_dip_radius, M_PI * 2.5, M_PI * 3.0);
0295     
0296 
0297          if (left_top_radius_on == 1) {
0298             if ((corner & CORNER_TOPLEFT)) {
0299                 cairo_arc (cr, x + left_top_radius, y + left_top_radius, left_top_radius, M_PI, M_PI * 1.5);
0300             } else
0301                 cairo_line_to (cr, x, y);
0302         } 
0303     
0304     
0305     } 
0306 }
0307 
0308 
0309 void
0310 rounded_square (cairo_t *cr,
0311         double  x,
0312         double  y,
0313         double  w,
0314         double  h,
0315         int    corner,
0316         window_settings * ws,
0317         double  radius_top_left, 
0318     double  radius_top_right,
0319         double  radius_bottom_left, 
0320     double  radius_bottom_right,
0321     double  radius_top_right_tri,
0322     double  radius_top_left_tri,
0323     int always_allow,
0324     gboolean left_bar_dip,
0325     int left_bar_dip_radius,
0326         gboolean enable_left_bar_dip_lower_part,
0327     double left_bar_dip_offset
0328 )
0329 {
0330 
0331     // always_allow 1 = radius_top_left
0332     // always_allow 2 = radius_top_right
0333     // always_allow 3 = radius_bottom_left
0334     // always_allow 4 = radius_bottom_right
0335 
0336     int radius_top_left_on = 1;
0337     int radius_top_right_on = 1;
0338     int radius_bottom_left_on = 1;
0339     int radius_bottom_right_on = 1;
0340     int radius_top_right_tri_on = 1;
0341     int radius_top_left_tri_on = 1;
0342 
0343 
0344     if (radius_top_left!=0 && ((corner & CORNER_TOPLEFT) || always_allow == 1))
0345         radius_top_left_on=0;
0346 
0347     if (radius_top_right!=0 && ((corner & CORNER_TOPRIGHT) || always_allow == 2))
0348         radius_top_right_on=0;
0349 
0350     if (radius_bottom_left!=0 && ((corner & CORNER_BOTTOMLEFT) || always_allow == 3))
0351         radius_bottom_left_on=0;
0352 
0353     if (radius_bottom_right!=0 && ((corner & CORNER_BOTTOMRIGHT) || always_allow == 4))
0354         radius_bottom_right_on=0;
0355 
0356     if (radius_top_right_tri!=0 && (corner & DIP_ROUND_TRI)) {
0357     //Can't have both on at the same time!
0358         radius_top_right_tri_on=0;
0359         radius_top_right_on=1;
0360     }
0361 
0362     if (radius_top_left_tri!=0 && (corner & DIP_ROUND_TRI)) {
0363     //Can't have both on at the same time!
0364         radius_top_left_tri_on=0;
0365         radius_top_left_on=1;
0366     }
0367 
0368     double cx, cy;
0369     double curve, width, height;
0370         double radius2;
0371 
0372     if (left_bar_dip == TRUE) {
0373 
0374     left_bar_dip_offset = (h /100) * left_bar_dip_offset;
0375     //printf("Left bar heigth = %f, Dip bar offset = %f\n", h, left_bar_dip_offset);
0376     
0377     width = w;
0378     height = h;
0379 
0380     //if ((left_bar_dip_radius * 2) > left_bar_dip_radius) {
0381     //  radius_top_left = 0.5 * (radius_top_left - 1);
0382     //}
0383 
0384     //Fix this curve malarcy
0385     curve = 0.5;
0386 
0387         cairo_move_to (cr, x, y);
0388         //cairo_line_to (cr, x + 5, y + 5);
0389 
0390     cairo_line_to(cr, x, y + left_bar_dip_offset);
0391     cairo_get_current_point (cr, &cx, &cy);
0392         cairo_arc_negative (cr, cx + left_bar_dip_radius, cy, left_bar_dip_radius, M_PI * 1.0, M_PI * curve);
0393     cairo_get_current_point (cr, &cx, &cy);
0394     //x_width = radius - x_width;
0395     //printf("Width %f\n", a_width);
0396     //printf("Height %f\n", a_height);
0397 
0398 
0399         cairo_arc (cr, cx, cy + left_bar_dip_radius, left_bar_dip_radius, M_PI * (curve + 1), M_PI * 2.0);
0400 
0401     cairo_get_current_point (cr, &cx, &cy);
0402 
0403 
0404         //cairo_arc_negative (cr, cx, cy, radius, M_PI * (curve + 2.5), M_PI * 2.5);
0405 
0406     if (enable_left_bar_dip_lower_part == TRUE) {
0407             cairo_line_to (cr, cx, cy + height - left_bar_dip_offset  - (4* left_bar_dip_radius));
0408         cairo_get_current_point (cr, &cx, &cy);
0409             cairo_arc (cr, cx - left_bar_dip_radius, cy, left_bar_dip_radius, M_PI * 2.0, M_PI * (curve + 2.0));
0410         cairo_get_current_point (cr, &cx, &cy);
0411             cairo_arc_negative (cr, cx, cy + left_bar_dip_radius, left_bar_dip_radius, M_PI * 1.5, M_PI * (curve + 2.5));
0412         cairo_get_current_point (cr, &cx, &cy);
0413         cairo_line_to (cr, cx + width, cy);
0414         cairo_get_current_point (cr, &cx, &cy);
0415         cairo_line_to (cr, cx, cy - height);
0416         cairo_get_current_point (cr, &cx, &cy);
0417         cairo_line_to (cr, cx - width, cy);
0418     } else {
0419             cairo_line_to (cr, cx, cy + height - left_bar_dip_offset - (2* left_bar_dip_radius));
0420         cairo_get_current_point (cr, &cx, &cy);
0421         cairo_line_to (cr, cx + width - (2* left_bar_dip_radius), cy);
0422         cairo_get_current_point (cr, &cx, &cy);
0423         cairo_line_to (cr, cx, cy - height);
0424         cairo_get_current_point (cr, &cx, &cy);
0425         cairo_line_to (cr, cx - width + (2* left_bar_dip_radius), cy);
0426     }
0427     
0428 
0429 
0430     
0431 
0432 
0433      } else {
0434 
0435     if (radius_top_right_tri_on == 0) {
0436 
0437     if (radius_top_right_tri > h) {
0438       radius_top_right_tri = h;
0439     }
0440 
0441     curve = 2;
0442 
0443     radius2 = h - radius_top_right_tri;
0444 
0445         cairo_arc (cr, x + w + radius_top_right_tri- radius_top_right_tri, y  + radius_top_right_tri, radius_top_right_tri, M_PI * 1.5, M_PI * curve);
0446     cairo_get_current_point (cr, &cx, &cy);
0447         cairo_arc_negative (cr, x + w + radius_top_right_tri + (h - radius_top_right_tri), cy, radius2, M_PI* (curve - 1), M_PI * 2.5);
0448 
0449     cairo_get_current_point (cr, &cx, &cy);
0450         cairo_line_to (cr, cx - radius2 - radius_top_right_tri, cy);
0451         cairo_line_to (cr, cx - radius2 - radius_top_right_tri , y);
0452     }
0453 
0454     if (radius_top_left_tri_on == 0) {
0455 
0456     if (radius_top_left_tri > h) {
0457       radius_top_left_tri = h;
0458     }
0459 
0460     curve = 2;
0461 
0462     radius2 = h - radius_top_left_tri;
0463 
0464     //Can use h to offset x because it is a square - would be radius - radius2
0465         cairo_arc_negative (cr, x - radius2 - radius_top_left_tri, y + radius_top_left_tri, radius2, M_PI * 2.5, M_PI * 2.0);
0466     cairo_get_current_point (cr, &cx, &cy);
0467         cairo_arc (cr, cx + radius_top_left_tri, cy, radius_top_left_tri, M_PI * 1.0, M_PI * 1.5);
0468 
0469 
0470     //cairo_get_current_point (cr, &cx, &cy);
0471     cairo_get_current_point (cr, &cx, &cy);
0472         cairo_line_to (cr, cx, cy + radius2 + radius_top_left_tri);
0473         cairo_line_to (cr, cx - radius2 - radius_top_left_tri , cy + radius2 + radius_top_left_tri);
0474 
0475 
0476 
0477     }
0478 
0479 
0480     if (radius_top_left_on == 0) {  
0481         cairo_move_to (cr, x + radius_top_left, y);
0482     } else
0483         cairo_move_to (cr, x, y);
0484 
0485 
0486     if (radius_top_right_on == 0) {
0487         cairo_arc (cr, x + w - radius_top_right, y + radius_top_right, radius_top_right, M_PI * 1.5, M_PI * 2.0);
0488     } else
0489         cairo_line_to (cr, x + w, y);
0490 
0491     if (radius_bottom_right_on == 0) {
0492         cairo_arc (cr, x + w - radius_bottom_right, y + h - radius_bottom_right, radius_bottom_right,
0493                 0.0, M_PI * 0.5);
0494     } else
0495         cairo_line_to (cr, x + w, y + h);
0496 
0497     if (radius_bottom_left_on == 0) {
0498         cairo_arc (cr, x + radius_bottom_left, y + h - radius_bottom_left, radius_bottom_left,
0499                 M_PI * 0.5, M_PI);
0500     } else
0501         cairo_line_to (cr, x, y + h);
0502 
0503     if (radius_top_left_on == 0) {      
0504         cairo_arc (cr, x + radius_top_left, y + radius_top_left, radius_top_left, M_PI, M_PI * 1.5);
0505     } else
0506         cairo_line_to (cr, x, y);
0507 
0508     }
0509 }
0510 
0511 void
0512 fill_rounded_square (cairo_t       *cr,
0513         double        x,
0514         double        y,
0515         double        w,
0516         double        h,
0517         int       corner,
0518         alpha_color * c0,
0519         alpha_color * c1,
0520         int       gravity,
0521         window_settings * ws,
0522         double  radius_top_left, 
0523     double  radius_top_right,
0524         double  radius_bottom_left, 
0525     double  radius_bottom_right,
0526     double  radius_top_right_tri,
0527     double  radius_top_left_tri,
0528     int always_allow,
0529     gboolean left_bar_dip,
0530     int left_bar_dip_radius,
0531         gboolean enable_left_bar_dip_lower_part,
0532     double left_bar_dip_offset,
0533     int pattern_size,
0534     int gradient_repeat_direction,
0535     double common_gradient_starting_point_x,
0536     double common_gradient_starting_point_y,
0537         cairo_surface_t *surface,
0538     gboolean enable_pixmaps,
0539     gboolean repeat_pixmap
0540     )
0541 {
0542     cairo_pattern_t *pattern;
0543     int gradient_offset = 0;
0544 
0545     if (corner & DIP_ROUND_TRI && (radius_top_left_tri > 0)) {
0546     gradient_offset = h;
0547     }
0548 
0549 
0550     rounded_square (cr, x, y, w, h, corner,ws,radius_top_left, radius_top_right, radius_bottom_left, radius_bottom_right, radius_top_right_tri, radius_top_left_tri, always_allow, left_bar_dip, left_bar_dip_radius, enable_left_bar_dip_lower_part, left_bar_dip_offset);
0551 
0552 gboolean pattern_vert = TRUE;
0553     if (pattern_size == 0) {
0554     pattern_size = h;
0555         pattern_vert = FALSE;
0556     }
0557 
0558     if (gravity & SHADE_RIGHT)
0559     {
0560         common_gradient_starting_point_x = common_gradient_starting_point_x + w;
0561         w = -w;
0562     }
0563     else if (!(gravity & SHADE_LEFT))
0564     {
0565         common_gradient_starting_point_x = w = 0;
0566     }
0567 
0568     if (gravity & SHADE_BOTTOM)
0569     {
0570         common_gradient_starting_point_y = common_gradient_starting_point_y + h;
0571         h = -h;
0572     }
0573     else if (!(gravity & SHADE_TOP))
0574     {
0575         common_gradient_starting_point_y = h = 0;
0576     } 
0577 
0578   /*  if (w && h)
0579     {
0580         cairo_matrix_t matrix;
0581 
0582         pattern = cairo_pattern_create_radial (0.0, 0.0, 0.0, 0.0, 0.0, w);
0583 
0584         cairo_matrix_init_scale (&matrix, 1.0, w / h);
0585         cairo_matrix_translate (&matrix, -(x + w), -(y + h));
0586 
0587         cairo_pattern_set_matrix (pattern, &matrix);
0588     }
0589     else
0590     { */
0591 
0592 
0593 
0594    if (enable_pixmaps == FALSE) {
0595     if (gradient_repeat_direction == 1 && pattern_vert == TRUE) {
0596            pattern = cairo_pattern_create_linear (common_gradient_starting_point_x, common_gradient_starting_point_y, common_gradient_starting_point_x + pattern_size, common_gradient_starting_point_y);
0597            //pattern = cairo_pattern_create_linear (x + w, y + pattern_size, x, y);
0598     } else if (gradient_repeat_direction == 2 && pattern_vert == TRUE) {
0599            pattern = cairo_pattern_create_linear (common_gradient_starting_point_x, common_gradient_starting_point_y, common_gradient_starting_point_x + pattern_size, common_gradient_starting_point_y + pattern_size);
0600     } else  {
0601            pattern = cairo_pattern_create_linear (common_gradient_starting_point_x, common_gradient_starting_point_y, common_gradient_starting_point_x, common_gradient_starting_point_y + pattern_size);
0602     }
0603 
0604 
0605     cairo_pattern_add_color_stop_rgba (pattern, 0.0, c0->color.r, c0->color.g,
0606             c0->color.b,c0->alpha);
0607 
0608     cairo_pattern_add_color_stop_rgba (pattern, 1.0, c1->color.r, c1->color.g,
0609             c1->color.b,c1->alpha);
0610     cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REFLECT);
0611 
0612    } else {
0613 
0614 
0615     cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
0616     cairo_set_source_surface (cr, surface, x - gradient_offset, y);
0617     pattern = cairo_pattern_reference(cairo_get_source(cr));
0618     if (repeat_pixmap == TRUE) {
0619            cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
0620     } else { 
0621            cairo_pattern_set_extend(pattern, CAIRO_EXTEND_NONE);
0622     }
0623    }
0624 
0625     cairo_set_source (cr, pattern);
0626     cairo_fill (cr);
0627     cairo_pattern_destroy (pattern);
0628 }
0629 
0630 void engine_draw_frame (decor_t * d, cairo_t * cr)
0631 {
0632     double        x1, y1, x2, y2, h;
0633     int       top;
0634     alpha_color inner_color;
0635     alpha_color outer_color;
0636     alpha_color inner_title_color;
0637     alpha_color outer_title_color;
0638 
0639     frame_settings * fs = d->fs;
0640     private_fs * pfs = fs->engine_fs;
0641     window_settings * ws = fs->ws;
0642     private_ws * pws = ws->engine_ws;
0643 
0644    //printf("Higher - Red: %i, Green %i, Blue %i \n", pfs->window_frame_halo.color.r, pfs->window_frame_halo.color.g, pfs->window_frame_halo.color.b);
0645    //The bug has already appeared here, even though I havn't done anything to the color code so far
0646 
0647 
0648 
0649     gdouble pleft;
0650     gdouble ptop;
0651     gdouble pwidth;
0652     gdouble pheight;
0653     top = ws->win_extents.top + ws->titlebar_height;
0654 
0655     x1 = ws->left_space - ws->win_extents.left;
0656     y1 = ws->top_space - ws->win_extents.top;
0657     x2 = d->width - ws->right_space + ws->win_extents.right;
0658     y2 = d->height - ws->bottom_space + ws->win_extents.bottom;
0659     pleft=x1+ws->win_extents.left-0.5;
0660     ptop=y1+top-0.5;
0661     pwidth=x2-x1-ws->win_extents.left-ws->win_extents.right+1;
0662     pheight=y2-y1-top-ws->win_extents.bottom+1;
0663 
0664     h = d->height - ws->top_space - ws->titlebar_height - ws->bottom_space;
0665 
0666 
0667 
0668     int minimised_border;
0669     float window_gap = 0;
0670     //x offset due to left dip bar
0671     int left_bar_dip_offset = 0;
0672     gboolean maximised;
0673     gboolean enable_left_bar_dip = FALSE;   
0674 
0675     cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
0676 
0677    int corners = 
0678         ((pws->round_top_left)?CORNER_TOPLEFT:0) |
0679         ((pws->round_top_right)?CORNER_TOPRIGHT:0) |
0680         ((pws->round_tri)?DIP_ROUND_TRI:0) |
0681         ((pws->round_bottom_left)?CORNER_BOTTOMLEFT:0) |
0682         ((pws->round_bottom_right)?CORNER_BOTTOMRIGHT:0);
0683 
0684 
0685     if (d->state & (WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY | WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY)) {
0686     corners = 0;
0687     maximised = TRUE;
0688     enable_left_bar_dip = FALSE;
0689 
0690     if (pws->enable_maximised_colors == TRUE) {
0691       inner_color.alpha = pws->inner_maximised_alpha;
0692       inner_color.color = pws->inner_maximised_color;
0693       outer_color.alpha = pws->outer_maximised_alpha;
0694       outer_color.color = pws->outer_maximised_color;
0695       inner_title_color.alpha = pws->inner_maximised_alpha;
0696       inner_title_color.color = pws->inner_maximised_color;
0697       outer_title_color.alpha = pws->outer_maximised_alpha;
0698       outer_title_color.color = pws->outer_maximised_color;
0699     } else {
0700       inner_color = pfs->inner;
0701       outer_color = pfs->outer;
0702       inner_title_color = pfs->title_inner;
0703       outer_title_color = pfs->title_outer;
0704     }
0705 
0706     minimised_border = 0;
0707     window_gap = 0.5;
0708     
0709     } else {
0710     maximised = FALSE;
0711     minimised_border = pws->minimised_border;
0712     //printf("Setting large border widths");
0713     window_gap = pws->window_gap;
0714     inner_color = pfs->inner;
0715     outer_color = pfs->outer;
0716         inner_title_color = pfs->title_inner;
0717     outer_title_color = pfs->title_outer;
0718 
0719     if(pws->enable_left_bar_dip == TRUE && !(d->state & (WNCK_WINDOW_STATE_SHADED))) {
0720        enable_left_bar_dip = TRUE;
0721        left_bar_dip_offset = (2 * pws->left_bar_dip_radius);
0722        
0723        if (pws->done_indent == FALSE && ws->tobj_layout[0] != '(') {
0724         char *layout;
0725         layout = g_strdup_printf("(-%i)%s", left_bar_dip_offset,ws->tobj_layout);
0726         g_free(ws->tobj_layout);
0727         ws->tobj_layout = layout;
0728         pws->done_indent = TRUE; 
0729        }
0730 
0731        //sprintf(ws->tobj_layout, "(-%i)%s", left_bar_dip_offset, layout); 89
0732        //pango_layout_set_indent(d->layout, 20000);
0733        //pws->round_bottom_left = FALSE; 
0734     }
0735     }
0736 
0737 
0738  
0739 //   pfs->title_outer.alpha = 0.0;
0740    
0741 
0742 
0743 ////////////DRAW FRAME///////////////////////////////////////////
0744     // always_allow 1 = radius_top_left
0745     // always_allow 2 = radius_top_right
0746     // always_allow 3 = radius_bottom_left
0747     // always_allow 4 = radius_bottom_right
0748 
0749     double width = x2 - x1 + (window_gap * 2);
0750     double x_start = x1 - window_gap;
0751     double x_end = x2 + window_gap;
0752     double pane_1_width = pws->title_bar_dip_title_width;
0753     double title_bar_dip_dip_width = width - (pws->title_bar_dip_title_width + pws->title_bar_dip_button_width);
0754     gboolean enable_dip;
0755 
0756     //printf("Frame width: %f - Pane Width: %f\n", width, pane_1_width);
0757         //fflush(stdout);
0758 
0759     enable_dip = FALSE;
0760     gboolean do_button_part= TRUE;
0761     double title_bar_dip_radius = 0;
0762     double title_bar_dip_radius_offset = 0;
0763 
0764 //    printf("%s\n", d->tobj_item_state[TBT_TITLE]);
0765 //        if ((owidth=get_title_object_width(ws->tobj_layout[i],ws,d))==-1)
0766 
0767 //TIDY ALL THIS UP! -lazy
0768  //Maximised causes problems
0769   if (maximised == FALSE && pws->enable_bar_dip_button_part == FALSE) {
0770     do_button_part = FALSE;
0771   }
0772 
0773 
0774       if (pws->enable_title_bar_dip == TRUE && maximised == FALSE && ((pws->title_bar_dip_title_width + pws->title_bar_dip_button_width) < width)) {
0775         enable_dip = TRUE;
0776         title_bar_dip_radius = pws->title_bar_dip_radius;
0777         if(pws->round_tri == TRUE) {
0778               title_bar_dip_radius_offset = top - 0.5 + minimised_border;
0779         }
0780       } else {
0781         do_button_part= TRUE;
0782       }
0783 
0784 
0785 ////////////////////////////////////
0786     
0787 
0788 /*   ORDER radius_top_left, radius_top_right, radius_bottom_left, radius_bottom_right, radius_tri_left, radius_tri_right */
0789 
0790 
0791 int gradient_repeat_height;
0792 int gradient_repeat_direction=0;
0793 alpha_color lower_frame_gradient_inner;
0794 alpha_color lower_frame_gradient_outer;
0795   if ((pfs->gradient_repeat_enabled == TRUE && maximised == FALSE) | (pfs->gradient_repeat_enabled == TRUE && pws->gradient_repeat_disabled_maximised == FALSE && maximised == TRUE)) {
0796     gradient_repeat_height = pfs->gradient_repeat_height;
0797     //The bottom gradient is reversed so you have to flip it round
0798             lower_frame_gradient_inner = outer_color;
0799         lower_frame_gradient_outer = inner_color;
0800     if (pfs->gradient_repeat_direction_vertical == TRUE) {
0801        gradient_repeat_direction = 1;
0802     } else if (pfs->gradient_repeat_direction_diagonal == TRUE) {
0803        gradient_repeat_direction = 2;
0804     } else {
0805        gradient_repeat_direction = 0;
0806     }
0807   } else {
0808             lower_frame_gradient_inner = inner_color;
0809         lower_frame_gradient_outer = outer_color;
0810             gradient_repeat_height = 0;
0811   }
0812 
0813 
0814    if (enable_dip == TRUE) {
0815 #if 0
0816 
0817 ////////////////////////////////Trim text//////////////////////////////////////////
0818         PangoLayoutLine *line;
0819 
0820    int name_length = pane_1_width * 1000 - (2000 * ptop);
0821    pango_layout_set_width(d->layout, name_length);
0822    //char name[strlen(pango_layout_get_text(d->layout)) + 3];
0823    const char *name;
0824    name = pango_layout_get_text(d->layout);
0825    pango_layout_set_wrap (d->layout, PANGO_WRAP_CHAR);
0826 
0827 //////// //if anyone reports segfaults look at this first///////////////////////////
0828    if (pango_layout_get_line_count (d->layout) > 1) {
0829         line = pango_layout_get_line (d->layout, 0);
0830         name = g_strndup (name, line->length - 3);
0831     //name = strcat(name, "...");
0832     pango_layout_set_text (d->layout, name, line->length);
0833     }
0834  ///////////////////////////////////////////////////////////////////////////////////
0835 #endif
0836 
0837 ///////////////////////////////Pixmaps//////////////////////////////////////////
0838 gboolean pixmaps_titlebarpart_enabled = FALSE;
0839 gboolean pixmaps_buttonpart_enabled = FALSE;
0840 if (pws->pixmaps.titlebarpart_enabled == TRUE) {
0841     pixmaps_titlebarpart_enabled = TRUE;
0842 }
0843 
0844 if (pws->pixmaps.buttonpart_enabled == TRUE) {
0845     pixmaps_buttonpart_enabled = TRUE;
0846 }
0847 
0848 ///////////////////////////////////////////////////////////////////////////////////
0849 
0850 
0851     fill_rounded_square (cr,
0852             x_start - minimised_border - left_bar_dip_offset,
0853             y1 + 0.5 - minimised_border,
0854             pane_1_width + minimised_border - title_bar_dip_radius_offset,
0855             top - 0.5 + minimised_border,
0856             (CORNER_TOPRIGHT | CORNER_TOPLEFT | DIP_ROUND_TRI)  & corners,
0857             &inner_title_color,&outer_title_color,
0858             SHADE_TOP, ws,
0859             pws->titlebar_radius, title_bar_dip_radius, 0, 0, title_bar_dip_radius, 0, 2, FALSE, 0, FALSE, 0, gradient_repeat_height, gradient_repeat_direction, x1, y1, pws->pixmaps.titlebar_surface, pixmaps_titlebarpart_enabled, pws->pixmaps.titlebarpart_repeat_enabled);
0860 
0861   if (pws->enable_bar_dip_button_part == TRUE) {
0862    fill_rounded_square (cr,
0863             x_end - pws->title_bar_dip_button_width - left_bar_dip_offset + title_bar_dip_radius_offset,
0864             y1 + 0.5 - minimised_border,
0865             pws->title_bar_dip_button_width + minimised_border + left_bar_dip_offset - title_bar_dip_radius_offset,
0866             top - 0.5 + minimised_border,
0867             (CORNER_TOPLEFT | CORNER_TOPRIGHT | DIP_ROUND_TRI) & corners,
0868             &inner_title_color,&outer_title_color,
0869             SHADE_TOP, ws,
0870             title_bar_dip_radius, pws->titlebar_radius, 0, 0, 0, title_bar_dip_radius, 1, FALSE, 0, FALSE, 0, gradient_repeat_height, gradient_repeat_direction, x1, y1, pws->pixmaps.titlebar_surface_buttons, pixmaps_buttonpart_enabled, pws->pixmaps.buttonpart_repeat_enabled);
0871   }
0872 
0873 
0874 
0875    } else {
0876 
0877     fill_rounded_square (cr,
0878             x_start - minimised_border  - left_bar_dip_offset,
0879             y1 + 0.5 - minimised_border,
0880             width + (2* minimised_border) + left_bar_dip_offset,
0881             top - 0.5 + minimised_border,
0882             (CORNER_TOPLEFT | CORNER_TOPRIGHT) & corners,
0883             &inner_title_color,&outer_title_color,
0884             SHADE_TOP, ws,
0885             pws->titlebar_radius, pws->titlebar_radius, 0, 0, 0, 0, 0, FALSE, 0, FALSE, 0, gradient_repeat_height, gradient_repeat_direction, x1, y1, pws->pixmaps.titlebar_surface_large, pws->pixmaps.titlebar_enabled, pws->pixmaps.titlebar_repeat_enabled);
0886 
0887    }
0888 
0889 
0890 
0891  if ((maximised == FALSE && pws->show_border_minimised == TRUE) | (maximised == TRUE && pws->show_border_maximised == TRUE)) {
0892 
0893 
0894 
0895     fill_rounded_square (cr,
0896             x_start - minimised_border - left_bar_dip_offset,
0897             y1 + top,
0898             ws->win_extents.left + minimised_border + left_bar_dip_offset,
0899             h+window_gap + 1,
0900             0,
0901             &lower_frame_gradient_outer,&lower_frame_gradient_inner,
0902             SHADE_TOP, ws,
0903             10, 0, 0, 0, 0, 0, 0, enable_left_bar_dip, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset, gradient_repeat_height, gradient_repeat_direction, x1, y1, pws->pixmaps.titlebar_surface, FALSE, FALSE);
0904 
0905     fill_rounded_square (cr,
0906             x_end - ws->win_extents.right,
0907             y1 + top,
0908             ws->win_extents.right + minimised_border,
0909             h+window_gap +0.5,
0910             0,
0911             &lower_frame_gradient_outer,&lower_frame_gradient_inner,
0912             SHADE_TOP, ws,
0913             0, 0, 0, 0, 0, 0, 0, FALSE, 0, FALSE, 0, gradient_repeat_height, gradient_repeat_direction, x1, y1, pws->pixmaps.titlebar_surface, FALSE, FALSE);
0914 
0915 
0916     //Have to decrease the size of the bottom right corner as the left dip bar is cutting into it
0917     int tmp_minus = 0;
0918         if (pws->enable_left_bar_dip_lower_part == FALSE && enable_left_bar_dip == TRUE) {
0919             tmp_minus = (2 * pws->left_bar_dip_radius);
0920         }
0921 
0922     fill_rounded_square (cr,
0923             x1 - window_gap - minimised_border + tmp_minus - left_bar_dip_offset,
0924             y2 - ws->win_extents.bottom  + window_gap,
0925             x2 - x1 + ws->win_extents.left - ws->win_extents.right -tmp_minus + left_bar_dip_offset + (window_gap *2),
0926             ws->win_extents.bottom - 0.5 + minimised_border,
0927             (CORNER_BOTTOMLEFT | CORNER_BOTTOMRIGHT) & corners,
0928             &outer_color,&inner_color,
0929             SHADE_BOTTOM,ws,
0930             0, 0, 0, pws->frame_radius, pws->frame_radius, 0, 0, FALSE, 0, FALSE, 0, gradient_repeat_height, gradient_repeat_direction, x1, y1, pws->pixmaps.titlebar_surface, FALSE, FALSE);
0931 
0932 
0933     }
0934 
0935     cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
0936     /* =====================titlebar separator line */
0937 
0938   if (pfs->separator_line.alpha != 0) {
0939     cairo_set_source_alpha_color(cr,&pfs->separator_line);
0940     cairo_move_to (cr, x1 + 4.5, y1 + top - 0.5);
0941     cairo_rel_line_to (cr, x2 - x1 - 9, 0.0);
0942     cairo_stroke (cr);
0943   }
0944 
0945     //FRAME
0946 
0947      rounded_rectangle (cr,
0948             x1 + 0.5, y1 + 0.5,
0949             x2 - x1 - 1.0, y2 - y1 - 1.0,
0950             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
0951              CORNER_BOTTOMRIGHT) & corners,ws,
0952             pws->frame_radius);
0953 
0954     cairo_clip (cr);
0955 
0956     cairo_translate (cr, 1.0, 1.0);
0957 
0958 if (pfs->window_highlight.alpha != 0) {
0959    if (enable_dip == TRUE) {
0960     rounded_rectangle_independent (cr,
0961             x1 + 0.5 - minimised_border - window_gap - left_bar_dip_offset, 
0962         y1 - minimised_border,
0963             x2 - x1 + ( 2* (minimised_border +window_gap)) + left_bar_dip_offset,
0964         y2 - y1 - 1.0 + window_gap + ( 2* (minimised_border)),
0965         top - 0.5 + minimised_border,
0966             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
0967              CORNER_BOTTOMRIGHT | DIP_ROUND_TRI) & corners, ws,
0968             pws->titlebar_radius, pws->titlebar_radius, pws->frame_radius, pws->frame_radius, title_bar_dip_radius, minimised_border + pane_1_width - title_bar_dip_radius_offset, title_bar_dip_dip_width + (2* title_bar_dip_radius_offset), TRUE, do_button_part, enable_left_bar_dip, minimised_border + ws->win_extents.bottom, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset);
0969    } else {
0970 
0971     rounded_rectangle_independent (cr,
0972             x1 + 0.5 - minimised_border - window_gap - left_bar_dip_offset, 
0973         y1 - minimised_border,
0974             x2 - x1 + ( 2* (minimised_border +window_gap)) + left_bar_dip_offset,
0975         y2 - y1 - 1.0 + window_gap + ( 2* (minimised_border)),
0976         top - 0.5 + minimised_border,
0977             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
0978              CORNER_BOTTOMRIGHT | DIP_ROUND_TRI) & corners, ws,
0979             pws->titlebar_radius, pws->titlebar_radius, pws->frame_radius, pws->frame_radius, 0, 0, 0, FALSE, do_button_part, enable_left_bar_dip, minimised_border + ws->win_extents.bottom, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset);
0980 
0981    } 
0982 
0983 
0984 
0985 
0986     //HIGHLIGHT HERE
0987     cairo_set_source_alpha_color(cr,&pfs->window_highlight);
0988     cairo_stroke(cr);
0989 }
0990 
0991 if (pfs->window_shadow.alpha != 0) {
0992 
0993     cairo_reset_clip (cr);
0994     cairo_translate (cr, -2.0, -2.0);
0995 
0996    if (enable_dip == TRUE) {
0997     rounded_rectangle_independent (cr,
0998             x1 + 0.5 - minimised_border - window_gap - left_bar_dip_offset, 
0999         y1 + 1.5 - minimised_border,
1000             x2 - x1 + ( 2* (minimised_border +window_gap)) + left_bar_dip_offset,
1001         y2 - y1 - 1.0 + window_gap + ( 2* (minimised_border)),
1002         top - 0.5 + minimised_border,
1003             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
1004              CORNER_BOTTOMRIGHT | DIP_ROUND_TRI) & corners, ws,
1005             pws->titlebar_radius, pws->titlebar_radius, pws->frame_radius, pws->frame_radius, title_bar_dip_radius, minimised_border + pane_1_width - title_bar_dip_radius_offset, title_bar_dip_dip_width + (2 * title_bar_dip_radius_offset), TRUE, do_button_part, enable_left_bar_dip, minimised_border + ws->win_extents.bottom, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset);
1006    } else {
1007 
1008     rounded_rectangle_independent (cr,
1009             x1 + 0.5 - minimised_border - window_gap - left_bar_dip_offset, 
1010         y1 + 1.5 - minimised_border,
1011             x2 - x1 + ( 2* (minimised_border +window_gap)) + left_bar_dip_offset,
1012         y2 - y1 - 1.0 + window_gap + ( 2* (minimised_border)),
1013         top - 0.5 + minimised_border,
1014             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
1015              CORNER_BOTTOMRIGHT | DIP_ROUND_TRI) & corners, ws,
1016             pws->titlebar_radius, pws->titlebar_radius, pws->frame_radius, pws->frame_radius, 0, 0, 0, FALSE, do_button_part, enable_left_bar_dip, minimised_border + ws->win_extents.bottom, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset);
1017 
1018    }
1019 
1020 
1021 
1022     //SHADOW HERE
1023     cairo_set_source_alpha_color(cr,&pfs->window_shadow);
1024     cairo_stroke(cr);
1025 }
1026 
1027 
1028 if (pfs->window_frame_halo.alpha != 0) {
1029     printf("ok\n");
1030     cairo_reset_clip (cr);
1031     cairo_translate (cr, 1.0, 1.0);
1032 
1033    if (enable_dip == TRUE) {
1034     rounded_rectangle_independent (cr,
1035             x1 + 0.5 - minimised_border - window_gap - left_bar_dip_offset, 
1036         y1 + 0.5 - minimised_border,
1037             x2 - x1 + ( 2* (minimised_border +window_gap)) + left_bar_dip_offset,
1038         y2 - y1 - 1.0 + window_gap + ( 2* (minimised_border)),
1039         top - 0.5 + minimised_border,
1040             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
1041              CORNER_BOTTOMRIGHT | DIP_ROUND_TRI) & corners, ws,
1042             pws->titlebar_radius, pws->titlebar_radius, pws->frame_radius, pws->frame_radius, title_bar_dip_radius, minimised_border + pane_1_width - title_bar_dip_radius_offset, title_bar_dip_dip_width + (2* title_bar_dip_radius_offset), TRUE, do_button_part, enable_left_bar_dip, minimised_border + ws->win_extents.bottom, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset);
1043    } else {
1044 
1045     rounded_rectangle_independent (cr,
1046             x1 + 0.5 - minimised_border - window_gap - left_bar_dip_offset, 
1047         y1 + 0.5 - minimised_border,
1048             x2 - x1 + ( 2* (minimised_border +window_gap)) + left_bar_dip_offset,
1049         y2 - y1 - 1.5 + window_gap + ( 2* (minimised_border)),
1050         top - 0.5 + minimised_border,
1051             (CORNER_TOPLEFT | CORNER_TOPRIGHT | CORNER_BOTTOMLEFT |
1052              CORNER_BOTTOMRIGHT | DIP_ROUND_TRI) & corners, ws,
1053             pws->titlebar_radius, pws->titlebar_radius, pws->frame_radius, pws->frame_radius, 0, 0, 0, FALSE, do_button_part, enable_left_bar_dip, minimised_border + ws->win_extents.bottom, pws->left_bar_dip_radius, pws->enable_left_bar_dip_lower_part, pws->left_bar_dip_offset);
1054 
1055    }
1056 
1057     cairo_set_source_alpha_color(cr,&pfs->window_frame_halo);
1058     cairo_stroke (cr);
1059 
1060 }
1061 
1062  
1063 
1064     //INNER STUFF
1065 
1066       //TODO - make this a bit more pixel-perfect...but it works for now
1067 
1068   if (pfs->contents_shadow.alpha != 0) {
1069     cairo_set_line_width(cr,1.0);
1070 
1071     cairo_move_to(cr,pleft+pwidth+1.5,ptop-1);
1072     cairo_rel_line_to(cr,-pwidth-2.5,0);
1073     cairo_rel_line_to(cr,0,pheight+2.5);
1074     cairo_set_source_alpha_color(cr,&pfs->contents_shadow);
1075     cairo_stroke(cr);
1076   }
1077 
1078   if (pfs->contents_highlight.alpha != 0) {
1079     cairo_move_to(cr,pleft+pwidth+1,ptop-1.5);
1080     cairo_rel_line_to(cr,0,pheight+2.5);
1081     cairo_rel_line_to(cr,-pwidth-2.5,0);
1082     cairo_set_source_alpha_color(cr,&pfs->contents_highlight);
1083     cairo_stroke(cr);
1084   }
1085 
1086   if (pfs->contents_halo.alpha != 0) {
1087     cairo_move_to(cr,pleft,ptop);
1088     cairo_rel_line_to(cr,pwidth,0);
1089     cairo_rel_line_to(cr,0,pheight);
1090     cairo_rel_line_to(cr,-pwidth,0);
1091     cairo_rel_line_to(cr,0,-pheight);
1092     cairo_set_source_alpha_color(cr,&pfs->contents_halo);
1093     cairo_stroke(cr);
1094   }
1095 }
1096 void load_engine_settings(GKeyFile * f, window_settings * ws)
1097 {
1098     private_ws * pws = ws->engine_ws;
1099 
1100     PFACS(outer);
1101     PFACS(inner);
1102     PFACS(title_outer);
1103     PFACS(title_inner);
1104     PFACS(window_frame_halo);
1105     PFACS(window_highlight);
1106     PFACS(window_shadow);
1107     PFACS(separator_line);
1108     PFACS(contents_shadow);
1109     PFACS(contents_highlight);
1110     PFACS(contents_halo);
1111     load_color_setting(f,&pws->outer_maximised_color,"outer_maximised_color",SECT);
1112     load_color_setting(f,&pws->inner_maximised_color,"inner_maximised_color",SECT);
1113     load_bool_setting(f,&pws->enable_maximised_colors,"enable_maximised_colors",SECT);
1114     load_bool_setting(f,&pws->gradient_repeat_disabled_maximised, "gradient_repeat_disabled_maximised", SECT);
1115     load_bool_setting(f,&pws->enable_title_bar_dip,"enable_title_bar_dip",SECT);
1116     load_bool_setting(f,&pws->round_top_left,"round_top_left",SECT);
1117     load_bool_setting(f,&pws->round_top_right,"round_top_right",SECT);
1118     load_bool_setting(f,&pws->round_bottom_left,"round_bottom_left",SECT);
1119     load_bool_setting(f,&pws->round_bottom_right,"round_bottom_right",SECT);
1120     load_bool_setting(f,&pws->round_tri,"round_tri",SECT);
1121     load_bool_setting(f,&pws->enable_bar_dip_button_part,"enable_bar_dip_button_part",SECT);
1122     load_bool_setting(f,&pws->enable_left_bar_dip,"enable_left_bar_dip",SECT);
1123     load_bool_setting(f,&pws->show_border_minimised,"show_border_minimised",SECT);
1124     load_bool_setting(f,&pws->enable_left_bar_dip_lower_part,"enable_left_bar_dip_lower_part",SECT);
1125 
1126     load_float_setting(f,&pws->outer_maximised_alpha,"outer_maximised_alpha",SECT);
1127     load_float_setting(f,&pws->inner_maximised_alpha,"inner_maximised_alpha",SECT);
1128     load_float_setting(f,&pws->frame_radius,"frame_radius",SECT);
1129     load_float_setting(f,&pws->titlebar_radius,"titlebar_radius",SECT);
1130     load_float_setting(f,&pws->window_gap,"window_gap",SECT);
1131     load_int_setting(f,&pws->title_bar_dip_title_width,"title_bar_dip_title_width",SECT);
1132     load_int_setting(f,&pws->title_bar_dip_radius,"title_bar_dip_radius",SECT);
1133     load_int_setting(f,&pws->title_bar_dip_button_width,"title_bar_dip_button_width",SECT);
1134     load_int_setting(f,&pws->minimised_border,"minimised_border",SECT);
1135     load_int_setting(f,&pws->left_bar_dip_radius,"left_bar_dip_radius",SECT);
1136     load_int_setting(f,&pws->left_bar_dip_offset,"left_bar_dip_offset",SECT);
1137 
1138  load_bool_setting(f,&pws->pixmaps.titlebarpart_enabled,"pixmaps_titlebarpart_enabled",SECT);
1139  load_bool_setting(f,&pws->pixmaps.buttonpart_enabled,"pixmaps_buttonpart_enabled",SECT);
1140  load_bool_setting(f,&pws->pixmaps.titlebarpart_repeat_enabled,"pixmaps_titlebarpart_repeat_enabled",SECT);
1141  load_bool_setting(f,&pws->pixmaps.buttonpart_repeat_enabled,"pixmaps_buttonpart_repeat_enabled",SECT);
1142  load_bool_setting(f,&pws->pixmaps.titlebar_repeat_enabled,"pixmaps_titlebar_repeat_enabled",SECT);
1143  load_bool_setting(f,&pws->pixmaps.titlebar_enabled,"pixmaps_titlebar_enabled",SECT);
1144 
1145  pws->pixmaps.titlebar_surface = cairo_image_surface_create_from_png(make_filename("pixmaps","titlebarpart","png"));
1146  pws->pixmaps.titlebar_surface_buttons = cairo_image_surface_create_from_png(make_filename("pixmaps","buttonpart","png"));
1147  pws->pixmaps.titlebar_surface_large = cairo_image_surface_create_from_png(make_filename("pixmaps","titlebar","png"));
1148 
1149     load_bool_setting(f,&((private_fs *)ws->fs_act->engine_fs)->gradient_repeat_enabled,"active_gradient_repeat_enabled" ,SECT);
1150     load_bool_setting(f,&((private_fs *)ws->fs_inact->engine_fs)->gradient_repeat_enabled,"inactive_gradient_repeat_enabled" ,SECT);
1151 
1152 
1153     load_float_setting(f,&((private_fs *)ws->fs_act->engine_fs)->gradient_repeat_height,"active_gradient_repeat_height" ,SECT);
1154     load_float_setting(f,&((private_fs *)ws->fs_inact->engine_fs)->gradient_repeat_height,"inactive_gradient_repeat_height" ,SECT);
1155 
1156 
1157     load_bool_setting(f,&((private_fs *)ws->fs_act->engine_fs)->gradient_repeat_direction_vertical,"active_gradient_repeat_direction_vertical" ,SECT);
1158     load_bool_setting(f,&((private_fs *)ws->fs_inact->engine_fs)->gradient_repeat_direction_vertical,"inactive_gradient_repeat_direction_vertical" ,SECT);
1159 
1160     load_bool_setting(f,&((private_fs *)ws->fs_act->engine_fs)->gradient_repeat_direction_diagonal,"active_gradient_repeat_direction_diagonal" ,SECT);
1161     load_bool_setting(f,&((private_fs *)ws->fs_inact->engine_fs)->gradient_repeat_direction_diagonal,"inactive_gradient_repeat_direction_diagonal" ,SECT);
1162 
1163 
1164 
1165 }
1166 void init_engine(window_settings * ws)
1167 {
1168     private_fs * pfs;
1169     private_ws * pws;
1170 
1171     pws = malloc(sizeof(private_ws));
1172     ws->engine_ws = pws;
1173     bzero(pws,sizeof(private_ws));
1174     pws->round_top_left=TRUE;
1175     pws->round_top_right=TRUE;
1176     pws->round_bottom_left=TRUE;
1177     pws->round_bottom_right=TRUE;
1178     pws->round_tri=TRUE;
1179     pws->enable_maximised_colors=TRUE;
1180     pws->show_border_minimised=TRUE;
1181     pws->enable_bar_dip_button_part=TRUE;
1182     pws->show_border_maximised=TRUE;
1183     pws->enable_title_bar_dip=TRUE;
1184     pws->minimised_border=0;
1185     pws->enable_left_bar_dip=TRUE;
1186     pws->enable_left_bar_dip_lower_part=TRUE;
1187     pws->left_bar_dip_offset=0;
1188     pws->frame_radius=5.0;
1189     pws->titlebar_radius=5.0;
1190     pws->left_bar_dip_radius=7.5;
1191     pws->gradient_repeat_disabled_maximised=TRUE;
1192     pws->pixmaps.buttonpart_repeat_enabled=FALSE;
1193     pws->pixmaps.buttonpart_enabled = FALSE;
1194     pws->pixmaps.titlebarpart_repeat_enabled=FALSE;
1195     pws->pixmaps.titlebarpart_enabled = FALSE;
1196     pws->window_gap=15.0;
1197     pws->title_bar_dip_title_width=500;
1198     pws->title_bar_dip_button_width=100;
1199     pws->title_bar_dip_radius=20;
1200     pws->outer_maximised_alpha=0.5;
1201     pws->inner_maximised_alpha=0.5;
1202     pws->outer_maximised_color.r=40.0;
1203     pws->outer_maximised_color.g=40.0;
1204     pws->outer_maximised_color.b=40.0;
1205     pws->inner_maximised_color.r=40.0;
1206     pws->inner_maximised_color.g=40.0;
1207     pws->inner_maximised_color.b=40.0;
1208 
1209 
1210 
1211 
1212     pfs = malloc(sizeof(private_fs));
1213     ws->fs_act->engine_fs = pfs;
1214     bzero(pfs,sizeof(private_fs));
1215     ACOLOR(inner,0.8,0.8,0.8,0.5);
1216     ACOLOR(outer,0.8,0.8,0.8,0.5);
1217     ACOLOR(title_inner,0.8,0.8,0.8,0.8);
1218     ACOLOR(title_outer,0.8,0.8,0.8,0.8);
1219     ACOLOR(window_highlight,1.0,1.0,1.0,0.8);
1220     ACOLOR(window_shadow,0.6,0.6,0.6,0.8);
1221     ACOLOR(window_frame_halo,1.0,1.0,1.0,1.0);
1222     ACOLOR(separator_line,0.0,0.0,0.0,0.0);
1223     ACOLOR(contents_highlight,1.0,1.0,1.0,0.8);
1224     ACOLOR(contents_shadow,0.6,0.6,0.6,0.8);
1225     ACOLOR(contents_halo,0.8,0.8,0.8,0.8);
1226 
1227     pfs = malloc(sizeof(private_fs));
1228     bzero(pfs,sizeof(private_fs));
1229     ws->fs_inact->engine_fs = pfs;
1230 
1231 
1232     ACOLOR(inner,0.8,0.8,0.8,0.3);
1233     ACOLOR(outer,0.8,0.8,0.8,0.3);
1234     ACOLOR(title_inner,0.8,0.8,0.8,0.6);
1235     ACOLOR(title_outer,0.8,0.8,0.8,0.6);
1236     ACOLOR(window_highlight,1.0,1.0,1.0,0.7);
1237     ACOLOR(window_shadow,0.6,0.6,0.6,0.7);
1238     ACOLOR(window_frame_halo,1.0,1.0,1.0,1.0);
1239     ACOLOR(separator_line,0.0,0.0,0.0,0.0);
1240     ACOLOR(contents_highlight,1.0,1.0,1.0,0.8);
1241     ACOLOR(contents_shadow,0.6,0.6,0.6,0.8);
1242     ACOLOR(contents_halo,0.8,0.8,0.8,0.8);
1243 }
1244 void fini_engine(window_settings * ws)
1245 {
1246     free(ws->fs_act->engine_fs);
1247     free(ws->fs_inact->engine_fs);
1248 }
1249 #if 0
1250 void layout_layout_frame(GtkWidget * vbox)
1251 {
1252     GtkWidget * hbox;
1253     GtkWidget * junk;
1254 
1255 
1256 
1257     hbox = gtk_hbox_new(FALSE,2);
1258     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1259     gtk_box_pack_startC(hbox,gtk_label_new(_("Border Gap")),FALSE,FALSE,0);
1260     junk = scaler_new(0,20,0.5);
1261     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1262     register_setting(junk,ST_FLOAT,SECT,"window_gap");
1263 
1264     hbox = gtk_hbox_new(FALSE,2);
1265     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1266     junk = gtk_check_button_new_with_label(_("Show Border when maximised?"));
1267     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1268     register_setting(junk,ST_BOOL,SECT,"show_border_maximised");
1269 
1270     hbox = gtk_hbox_new(FALSE,2);
1271     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1272     junk = gtk_check_button_new_with_label(_("Show when minimised?"));
1273     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1274     register_setting(junk,ST_BOOL,SECT,"show_border_minimised");
1275 
1276     hbox = gtk_hbox_new(FALSE,2);
1277     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1278     gtk_box_pack_startC(hbox,gtk_label_new(_("Minimised Border Size")),FALSE,FALSE,0);
1279     junk = scaler_new(0,30,1);
1280     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1281     register_setting(junk,ST_FLOAT,SECT,"minimised_border");
1282 
1283 
1284 
1285 
1286 }
1287 
1288 void layout_left_bar_frame(GtkWidget * vbox)
1289 {
1290     GtkWidget * hbox;
1291     GtkWidget * junk;
1292 
1293     hbox = gtk_hbox_new(FALSE,2);
1294     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1295     junk = gtk_check_button_new_with_label(_("Enable Left Bar Dip?"));
1296     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1297     register_setting(junk,ST_BOOL,SECT,"enable_left_bar_dip");
1298 
1299     hbox = gtk_hbox_new(FALSE,2);
1300     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1301     gtk_box_pack_startC(hbox,gtk_label_new(_("Left Bar Radius")),FALSE,FALSE,0);
1302     junk = scaler_new(0,20,1);
1303     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1304     register_setting(junk,ST_INT,SECT,"left_bar_dip_radius");
1305 
1306     hbox = gtk_hbox_new(FALSE,2);
1307     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1308     junk = gtk_check_button_new_with_label(_("Enable Lower Bulge? (Useless at the moment, but will be used soon)"));
1309     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1310     register_setting(junk,ST_BOOL,SECT,"enable_left_bar_dip_lower_part");
1311 
1312     hbox = gtk_hbox_new(FALSE,2);
1313     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1314     gtk_box_pack_startC(hbox,gtk_label_new(_("Top Corner Offset (%)")),FALSE,FALSE,0);
1315     junk = scaler_new(0,90,1);
1316     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1317     register_setting(junk,ST_INT,SECT,"left_bar_dip_offset");
1318 
1319 
1320 
1321 
1322 
1323 }
1324 
1325 
1326 void layout_title_bar_frame(GtkWidget * vbox)
1327 {
1328     GtkWidget * hbox;
1329     GtkWidget * junk;
1330 
1331 
1332 
1333     hbox = gtk_hbox_new(FALSE,2);
1334     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1335     junk = gtk_check_button_new_with_label(_("Enable Title Bar Dip?"));
1336     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1337     register_setting(junk,ST_BOOL,SECT,"enable_title_bar_dip");
1338 
1339     hbox = gtk_hbox_new(FALSE,2);
1340     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1341     junk = gtk_check_button_new_with_label(_("Enable Button Part?"));
1342     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1343     register_setting(junk,ST_BOOL,SECT,"enable_bar_dip_button_part");
1344 
1345     hbox = gtk_hbox_new(FALSE,2);
1346     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1347     gtk_box_pack_startC(hbox,gtk_label_new(_("Title Part Width")),FALSE,FALSE,0);
1348     junk = scaler_new(80,800,1);
1349     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1350     register_setting(junk,ST_INT,SECT,"title_bar_dip_title_width");
1351 
1352     hbox = gtk_hbox_new(FALSE,2);
1353     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1354     gtk_box_pack_startC(hbox,gtk_label_new(_("Button Part Width)")),FALSE,FALSE,0);
1355     junk = scaler_new(10,800,1);
1356     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1357     register_setting(junk,ST_INT,SECT,"title_bar_dip_button_width");
1358 
1359     hbox = gtk_hbox_new(FALSE,2);
1360     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1361     gtk_box_pack_startC(hbox,gtk_label_new(_("Dip Corners Radius)")),FALSE,FALSE,0);
1362     junk = scaler_new(1,20,1);
1363     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1364     register_setting(junk,ST_INT,SECT,"title_bar_dip_radius");
1365 
1366     hbox = gtk_hbox_new(FALSE,2);
1367     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1368     junk = gtk_check_button_new_with_label(_("Round Inside Corners As well?"));
1369     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1370     register_setting(junk,ST_BOOL,SECT,"round_tri");
1371 
1372 
1373 }
1374 
1375 void layout_maximised_colors(GtkWidget * vbox)
1376 {
1377     GtkWidget * hbox;
1378     GtkWidget * junk;
1379     GtkWidget * scroller;
1380     GtkWidget * w;
1381 
1382     hbox = gtk_hbox_new(FALSE,2);
1383     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1384 
1385     junk = gtk_check_button_new_with_label(_("Enable Different Maximised Colors?"));
1386     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1387     register_setting(junk,ST_BOOL,SECT,"enable_maximised_colors");
1388 
1389     junk = gtk_check_button_new_with_label(_("Turn Off repeating gradients when maximised?"));
1390     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1391     register_setting(junk,ST_BOOL,SECT,"gradient_repeat_disabled_maximised");
1392 
1393     scroller = gtk_scrolled_window_new(NULL,NULL);
1394     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller),
1395             GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC);
1396     gtk_box_pack_startC(vbox,scroller,TRUE,TRUE,0);
1397     table_new(3,FALSE,FALSE);
1398 
1399     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroller),GTK_WIDGET(get_current_table()));
1400 
1401     make_labels("Colors");
1402     table_append_separator();
1403 
1404 
1405     w = gtk_label_new(_("Outer Frame Blend"));
1406     table_append(w,FALSE);
1407     w = gtk_color_button_new();
1408     table_append(w,FALSE);
1409     register_setting(w,ST_COLOR,SECT,"outer_maximised_color");
1410     w = scaler_new(0.0,1.0,0.01);
1411     table_append(w,TRUE);
1412     register_setting(w,ST_FLOAT,SECT,"outer_maximised_alpha");
1413 
1414     w = gtk_label_new(_("Inner Frame Blend"));
1415     table_append(w,FALSE);
1416     w = gtk_color_button_new();
1417     table_append(w,FALSE);
1418     register_setting(w,ST_COLOR,SECT,"inner_maximised_color");
1419     w = scaler_new(0.0,1.0,0.01);
1420     table_append(w,TRUE);
1421     register_setting(w,ST_FLOAT,SECT,"inner_maximised_alpha");
1422 
1423 
1424 
1425 }
1426 
1427 void layout_corners_frame(GtkWidget * vbox)
1428 {
1429     GtkWidget * hbox;
1430     GtkWidget * junk;
1431 
1432     junk = gtk_check_button_new_with_label(_("Round Top Left Corner?"));
1433     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1434     register_setting(junk,ST_BOOL,SECT,"round_top_left");
1435 
1436     junk = gtk_check_button_new_with_label(_("Round Top Right Corner"));
1437     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1438     register_setting(junk,ST_BOOL,SECT,"round_top_right");
1439 
1440     junk = gtk_check_button_new_with_label(_("Round Bottom Left Corner"));
1441     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1442     register_setting(junk,ST_BOOL,SECT,"round_bottom_left");
1443 
1444     junk = gtk_check_button_new_with_label(_("Round Bottom Right Corner"));
1445     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1446     register_setting(junk,ST_BOOL,SECT,"round_bottom_right");
1447 
1448     hbox = gtk_hbox_new(FALSE,2);
1449     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1450     gtk_box_pack_startC(hbox,gtk_label_new(_("Frame Rounding Radius")),FALSE,FALSE,0);
1451     junk = scaler_new(0,20,0.5);
1452     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1453     register_setting(junk,ST_FLOAT,SECT,"frame_radius");
1454 
1455     hbox = gtk_hbox_new(FALSE,2);
1456     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1457     gtk_box_pack_startC(hbox,gtk_label_new(_("Titlebar Rounding Radius")),FALSE,FALSE,0);
1458 
1459     junk = scaler_new(0,20,0.5);
1460     gtk_box_pack_startC(hbox,junk,TRUE,TRUE,0);
1461     register_setting(junk,ST_FLOAT,SECT,"titlebar_radius");
1462 
1463 }
1464 
1465 void add_border_slider(gchar * text,gchar * key,gint value)
1466 {
1467     GtkWidget * w;
1468     table_append(gtk_label_new(text),FALSE);
1469 
1470     w = scaler_new(0,20,1);
1471     table_append(w,TRUE);
1472     gtk_range_set_value(GTK_RANGE(w),value);
1473     register_setting(w,ST_INT,"borders",key);
1474 }
1475 
1476 
1477 
1478 void my_engine_settings(GtkWidget * hbox, gboolean active)
1479 {
1480     GtkWidget * vbox;
1481     GtkWidget * scroller;
1482     GtkWidget * junk;
1483 
1484 
1485     vbox = gtk_vbox_new(FALSE,2);
1486     gtk_box_pack_startC(hbox,vbox,TRUE,TRUE,0);
1487     gtk_box_pack_startC(vbox,gtk_label_new(active?"Active Window":"Inactive Window"),FALSE,FALSE,0);
1488     gtk_box_pack_startC(vbox,gtk_hseparator_new(),FALSE,FALSE,0);
1489     scroller = gtk_scrolled_window_new(NULL,NULL);
1490     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller),
1491             GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC);
1492     gtk_box_pack_startC(vbox,scroller,TRUE,TRUE,0);
1493     
1494     table_new(3,FALSE,FALSE);
1495 
1496     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroller),GTK_WIDGET(get_current_table()));
1497     
1498     make_labels(_("Colors"));
1499     table_append_separator();
1500     ACAV(_("Outer Frame Blend"),"outer",SECT);
1501     ACAV(_("Inner Frame Blend"),"inner",SECT);
1502     table_append_separator();
1503     ACAV(_("Outer Titlebar Blend"),"title_outer",SECT);
1504     ACAV(_("Inner Titlebar Blend"),"title_inner",SECT);
1505 
1506     table_append_separator();
1507 
1508     junk = gtk_label_new(_("Repeat Gradient?"));
1509     table_append(junk,FALSE);
1510     junk = gtk_label_new("");
1511     table_append(junk,FALSE);
1512     junk = gtk_check_button_new();
1513     table_append(junk,TRUE);
1514     gchar * key_line;
1515     key_line = g_strdup_printf(active?"active_%s":"inactive_%s","gradient_repeat_enabled");
1516     register_setting(junk,ST_BOOL,SECT,key_line);
1517 
1518     junk = gtk_label_new(_("Vertical Repeat?"));
1519     table_append(junk,FALSE);
1520     junk = gtk_label_new("");
1521     table_append(junk,FALSE);
1522     junk = gtk_check_button_new();
1523     table_append(junk,TRUE);
1524     key_line = g_strdup_printf(active?"active_%s":"inactive_%s","gradient_repeat_direction_vertical");
1525     register_setting(junk,ST_BOOL,SECT,key_line);
1526 
1527     junk = gtk_label_new(_("Diagonal Repeat?"));
1528     table_append(junk,FALSE);
1529     junk = gtk_label_new("");
1530     table_append(junk,FALSE);
1531     junk = gtk_check_button_new();
1532     table_append(junk,TRUE);
1533     key_line = g_strdup_printf(active?"active_%s":"inactive_%s","gradient_repeat_direction_diagonal");
1534     register_setting(junk,ST_BOOL,SECT,key_line);
1535 
1536 
1537     junk = gtk_label_new(_("Repeat Frequency"));
1538     table_append(junk,FALSE);
1539     junk = gtk_label_new("");
1540     table_append(junk,FALSE);
1541     junk = scaler_new(0,20,0.5);
1542     table_append(junk,TRUE);
1543     key_line = g_strdup_printf(active?"active_%s":"inactive_%s","gradient_repeat_height");
1544     register_setting(junk,ST_FLOAT,SECT,key_line);
1545     table_append_separator();
1546 
1547     
1548 
1549     ACAV(_("Titlebar Separator"),"separator_line",SECT);
1550     table_append_separator();
1551     ACAV(_("Frame Outline"),"window_frame_halo",SECT);
1552     ACAV(_("Frame Highlight"),"window_highlight",SECT);
1553     ACAV(_("Frame Shadow"),"window_shadow",SECT);
1554     table_append_separator();
1555     ACAV(_("Contents Outline"),"contents_halo",SECT);
1556     ACAV(_("Contents Highlight"),"contents_highlight",SECT);
1557     ACAV(_("Contents Shadow"),"contents_shadow",SECT);
1558 }
1559 void layout_engine_colors(GtkWidget * vbox)
1560 {
1561     GtkWidget * hbox;
1562     hbox = gtk_hbox_new(FALSE,2);
1563     gtk_box_pack_startC(vbox,hbox,TRUE,TRUE,0);
1564     my_engine_settings(hbox,TRUE);
1565     gtk_box_pack_startC(hbox,gtk_vseparator_new(),FALSE,FALSE,0);
1566     my_engine_settings(hbox,FALSE);
1567 }
1568 
1569 void layout_pixmaps(GtkWidget * vbox) {
1570     GtkWidget * file_selector;
1571     GtkFileFilter * filter;
1572     GtkWidget * junk;
1573     GtkWidget * title_bar_image;
1574     //SettingItem * set;
1575     GtkWidget * hbox;
1576 
1577 ///////////////////////
1578 
1579     junk = gtk_check_button_new_with_label(_("Enable Title Part Pixmap?"));
1580     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1581     register_setting(junk,ST_BOOL,SECT,"pixmaps_titlebarpart_enabled");
1582 
1583     junk = gtk_check_button_new_with_label(_("Repeat Title Part Pixmap?"));
1584     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1585     register_setting(junk,ST_BOOL,SECT,"pixmaps_titlebarpart_repeat_enabled");
1586 
1587     hbox = gtk_hbox_new(FALSE,2);
1588     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1589     
1590     junk = gtk_label_new(_("Title Bar Part Pixmap"));
1591     gtk_box_pack_startC(hbox,junk,FALSE,FALSE,0);
1592 
1593     file_selector=gtk_file_chooser_button_new(_("Choose Titlebar Part Pixmap"),
1594             GTK_FILE_CHOOSER_ACTION_OPEN);
1595     gtk_box_pack_startC(hbox,file_selector,TRUE,TRUE,0);
1596     filter = gtk_file_filter_new();
1597     gtk_file_filter_add_pattern(filter,"*.png");
1598     gtk_file_filter_set_name(filter,"PNG Images");
1599     gtk_file_filter_add_pixbuf_formats(filter);
1600     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_selector),filter);
1601     
1602     title_bar_image = gtk_image_new();
1603     
1604     /* set =*/ register_img_file_setting(file_selector,"pixmaps","titlebarpart",GTK_IMAGE(title_bar_image));
1605 ///////////////////////////
1606     gtk_box_pack_startC(hbox,gtk_vseparator_new(),FALSE,FALSE,0);
1607 ///////////////////////////
1608 
1609     junk = gtk_check_button_new_with_label(_("Enable Button Part Pixmap?"));
1610     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1611     register_setting(junk,ST_BOOL,SECT,"pixmaps_buttonpart_enabled");
1612 
1613     junk = gtk_check_button_new_with_label(_("Repeat Button Part Pixmap?"));
1614     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1615     register_setting(junk,ST_BOOL,SECT,"pixmaps_buttonpart_repeat_enabled");
1616 
1617 
1618     hbox = gtk_hbox_new(FALSE,2);
1619     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1620     
1621     junk = gtk_label_new(_("Button Part Pixmap"));
1622     gtk_box_pack_startC(hbox,junk,FALSE,FALSE,0);
1623 
1624     file_selector=gtk_file_chooser_button_new(_("Choose Button Part Pixmap"),
1625             GTK_FILE_CHOOSER_ACTION_OPEN);
1626     gtk_box_pack_startC(hbox,file_selector,TRUE,TRUE,0);
1627     filter = gtk_file_filter_new();
1628     gtk_file_filter_add_pattern(filter,"*.png");
1629     gtk_file_filter_set_name(filter,"PNG Images");
1630     gtk_file_filter_add_pixbuf_formats(filter);
1631     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_selector),filter);
1632     
1633     title_bar_image = gtk_image_new();
1634     
1635     /*set =*/ register_img_file_setting(file_selector,"pixmaps","buttonpart",GTK_IMAGE(title_bar_image));
1636 ///////////////////////////////////////
1637     gtk_box_pack_startC(hbox,gtk_vseparator_new(),FALSE,FALSE,0);
1638 ///////////////////////////
1639 
1640     junk = gtk_check_button_new_with_label(_("Enable Titlebar Pixmap?"));
1641     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1642     register_setting(junk,ST_BOOL,SECT,"pixmaps_titlebar_enabled");
1643 
1644     junk = gtk_check_button_new_with_label(_("Repeat Titlebar Pixmap?"));
1645     gtk_box_pack_startC(vbox,junk,FALSE,FALSE,0);
1646     register_setting(junk,ST_BOOL,SECT,"pixmaps_titlebar_repeat_enabled");
1647 
1648 
1649     hbox = gtk_hbox_new(FALSE,2);
1650     gtk_box_pack_startC(vbox,hbox,FALSE,FALSE,0);
1651     
1652     junk = gtk_label_new(_("Titlebar Pixmap"));
1653     gtk_box_pack_startC(hbox,junk,FALSE,FALSE,0);
1654 
1655     file_selector=gtk_file_chooser_button_new(_("Choose Titlebar Pixmap"),
1656             GTK_FILE_CHOOSER_ACTION_OPEN);
1657     gtk_box_pack_startC(hbox,file_selector,TRUE,TRUE,0);
1658     filter = gtk_file_filter_new();
1659     gtk_file_filter_add_pattern(filter,"*.png");
1660     gtk_file_filter_set_name(filter,"PNG Images");
1661     gtk_file_filter_add_pixbuf_formats(filter);
1662     gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_selector),filter);
1663     
1664     title_bar_image = gtk_image_new();
1665     
1666     /* set =*/ register_img_file_setting(file_selector,"pixmaps","titlebar",GTK_IMAGE(title_bar_image));
1667 ///////////////////////////////////////
1668     
1669 }
1670 void layout_engine_settings(GtkWidget * vbox)
1671 {
1672     GtkWidget * note;
1673     note = gtk_notebook_new();
1674     gtk_box_pack_startC(vbox,note,TRUE,TRUE,0);
1675     layout_engine_colors(build_notebook_page(_("Active/Inactive"),note));
1676     layout_maximised_colors(build_notebook_page(_("Maximised"),note));
1677     layout_corners_frame(build_notebook_page(_("Corners"),note));
1678     layout_layout_frame(build_notebook_page(_("Border Layout"),note));
1679     layout_title_bar_frame(build_notebook_page(_("Title Bar"),note));
1680     layout_left_bar_frame(build_notebook_page(_("Left Bar"),note));
1681     layout_pixmaps(build_notebook_page(_("Pixmaps"),note));
1682 }
1683 #endif