Blame modules/engines/ms-windows/msw_style.c

Packit 98cdb6
/* MS-Windows Engine (aka GTK-Wimp)
Packit 98cdb6
 *
Packit 98cdb6
 * Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
Packit 98cdb6
 * Copyright (C) 2006 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
Packit 98cdb6
 * Includes code adapted from redmond95 by Owen Taylor, and
Packit 98cdb6
 * gtk-nativewin by Evan Martin
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Library General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Library General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Library General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * Useful resources:
Packit 98cdb6
 *
Packit 98cdb6
 *  http://lxr.mozilla.org/seamonkey/source/widget/src/windows/nsNativeThemeWin.cpp
Packit 98cdb6
 *  http://lxr.mozilla.org/seamonkey/source/widget/src/windows/nsLookAndFeel.cpp
Packit 98cdb6
 *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/functions/drawthemebackground.asp
Packit 98cdb6
 *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/pantdraw_4b3g.asp
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/* Include first, else we get redefinition warnings about STRICT */
Packit 98cdb6
#include "pango/pangowin32.h"
Packit 98cdb6
Packit 98cdb6
#include "msw_style.h"
Packit 98cdb6
#include "xp_theme.h"
Packit 98cdb6
Packit 98cdb6
#include <windows.h>
Packit 98cdb6
#include <math.h>
Packit 98cdb6
#include <string.h>
Packit 98cdb6
#include <stdio.h>
Packit 98cdb6
Packit 98cdb6
#include "gdk/gdk.h"
Packit 98cdb6
#include "gtk/gtk.h"
Packit 98cdb6
Packit 98cdb6
#ifdef BUILDING_STANDALONE
Packit 98cdb6
#include "gdk/gdkwin32.h"
Packit 98cdb6
#else
Packit 98cdb6
#include "gdk/win32/gdkwin32.h"
Packit 98cdb6
#endif
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
#define DETAIL(xx)   ((detail) && (!strcmp(xx, detail)))
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
/* Default values, not normally used
Packit 98cdb6
 */
Packit 98cdb6
static const GtkRequisition default_option_indicator_size = { 9, 8 };
Packit 98cdb6
static const GtkBorder default_option_indicator_spacing = { 7, 5, 2, 2 };
Packit 98cdb6
Packit 98cdb6
static GtkStyleClass *parent_class;
Packit 98cdb6
static HBRUSH g_dither_brush = NULL;
Packit 98cdb6
Packit 98cdb6
static HPEN g_light_pen = NULL;
Packit 98cdb6
static HPEN g_dark_pen = NULL;
Packit 98cdb6
Packit 98cdb6
typedef enum
Packit 98cdb6
{
Packit 98cdb6
  CHECK_AA,
Packit 98cdb6
  CHECK_BASE,
Packit 98cdb6
  CHECK_BLACK,
Packit 98cdb6
  CHECK_DARK,
Packit 98cdb6
  CHECK_LIGHT,
Packit 98cdb6
  CHECK_MID,
Packit 98cdb6
  CHECK_TEXT,
Packit 98cdb6
  CHECK_INCONSISTENT,
Packit 98cdb6
  RADIO_BASE,
Packit 98cdb6
  RADIO_BLACK,
Packit 98cdb6
  RADIO_DARK,
Packit 98cdb6
  RADIO_LIGHT,
Packit 98cdb6
  RADIO_MID,
Packit 98cdb6
  RADIO_TEXT
Packit 98cdb6
} Part;
Packit 98cdb6
Packit 98cdb6
#define PART_SIZE 13
Packit 98cdb6
Packit 98cdb6
static const unsigned char check_aa_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_base_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_black_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_dark_bits[] = {
Packit 98cdb6
  0xff, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_light_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0xfe, 0x1f, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_mid_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_text_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x03, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00,
Packit 98cdb6
  0xd8, 0x01, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x70, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char check_inconsistent_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char radio_base_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0xf0, 0x01, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
Packit 98cdb6
  0xfc, 0x07, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00,
Packit 98cdb6
  0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char radio_black_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00,
Packit 98cdb6
  0x0c, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char radio_dark_bits[] = {
Packit 98cdb6
  0xf0, 0x01, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char radio_light_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00,
Packit 98cdb6
  0xf0, 0x01, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char radio_mid_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
Packit 98cdb6
  0x0c, 0x06, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
static const unsigned char radio_text_bits[] = {
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0xe0, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00,
Packit 98cdb6
  0xf0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00,
Packit 98cdb6
  0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Packit 98cdb6
  0x00, 0x00, 0x00, 0x00
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
static struct
Packit 98cdb6
{
Packit 98cdb6
  const unsigned char *bits;
Packit 98cdb6
  cairo_surface_t *bmap;
Packit 98cdb6
} parts[] = {
Packit 98cdb6
  { check_aa_bits, NULL           },
Packit 98cdb6
  { check_base_bits, NULL         },
Packit 98cdb6
  { check_black_bits, NULL        },
Packit 98cdb6
  { check_dark_bits, NULL         },
Packit 98cdb6
  { check_light_bits, NULL        },
Packit 98cdb6
  { check_mid_bits, NULL          },
Packit 98cdb6
  { check_text_bits, NULL         },
Packit 98cdb6
  { check_inconsistent_bits, NULL },
Packit 98cdb6
  { radio_base_bits, NULL         },
Packit 98cdb6
  { radio_black_bits, NULL        },
Packit 98cdb6
  { radio_dark_bits, NULL         },
Packit 98cdb6
  { radio_light_bits, NULL        },
Packit 98cdb6
  { radio_mid_bits, NULL          },
Packit 98cdb6
  { radio_text_bits, NULL         }
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
_cairo_draw_line (cairo_t  *cr,
Packit 98cdb6
                  GdkColor *color,
Packit 98cdb6
                  gint      x1,
Packit 98cdb6
                  gint      y1,
Packit 98cdb6
                  gint      x2,
Packit 98cdb6
                  gint      y2)
Packit 98cdb6
{
Packit 98cdb6
  cairo_save (cr);
Packit 98cdb6
Packit 98cdb6
  gdk_cairo_set_source_color (cr, color);
Packit 98cdb6
  cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
Packit 98cdb6
  cairo_set_line_width (cr, 1.0);
Packit 98cdb6
Packit 98cdb6
  cairo_move_to (cr, x1 + 0.5, y1 + 0.5);
Packit 98cdb6
  cairo_line_to (cr, x2 + 0.5, y2 + 0.5);
Packit 98cdb6
  cairo_stroke (cr);
Packit 98cdb6
Packit 98cdb6
  cairo_restore (cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
_cairo_draw_rectangle (cairo_t *cr,
Packit 98cdb6
                       GdkColor *color,
Packit 98cdb6
                       gboolean filled,
Packit 98cdb6
                       gint x,
Packit 98cdb6
                       gint y,
Packit 98cdb6
                       gint width,
Packit 98cdb6
                       gint height)
Packit 98cdb6
{
Packit 98cdb6
  gdk_cairo_set_source_color (cr, color);
Packit 98cdb6
Packit 98cdb6
  if (filled)
Packit 98cdb6
    {
Packit 98cdb6
      cairo_rectangle (cr, x, y, width, height);
Packit 98cdb6
      cairo_fill (cr);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      cairo_rectangle (cr, x + 0.5, y + 0.5, width, height);
Packit 98cdb6
      cairo_stroke (cr);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
get_system_font (XpThemeClass klazz, XpThemeFont type, LOGFONTW *out_lf)
Packit 98cdb6
{
Packit 98cdb6
  if (xp_theme_get_system_font (klazz, type, out_lf))
Packit 98cdb6
    {
Packit 98cdb6
      return TRUE;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      /* Use wide char versions here, as the theming functions only support
Packit 98cdb6
       * wide chars versions of the structures. */
Packit 98cdb6
      NONCLIENTMETRICSW ncm;
Packit 98cdb6
Packit 98cdb6
      ncm.cbSize = sizeof (NONCLIENTMETRICSW);
Packit 98cdb6
Packit 98cdb6
      if (SystemParametersInfoW (SPI_GETNONCLIENTMETRICS,
Packit 98cdb6
				sizeof (NONCLIENTMETRICSW), &ncm, 0))
Packit 98cdb6
	{
Packit 98cdb6
	  if (type == XP_THEME_FONT_CAPTION)
Packit 98cdb6
	    *out_lf = ncm.lfCaptionFont;
Packit 98cdb6
	  else if (type == XP_THEME_FONT_MENU)
Packit 98cdb6
	    *out_lf = ncm.lfMenuFont;
Packit 98cdb6
	  else if (type == XP_THEME_FONT_STATUS)
Packit 98cdb6
	    *out_lf = ncm.lfStatusFont;
Packit 98cdb6
	  else
Packit 98cdb6
	    *out_lf = ncm.lfMessageFont;
Packit 98cdb6
Packit 98cdb6
	  return TRUE;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static char *
Packit 98cdb6
sys_font_to_pango_font (XpThemeClass klazz, XpThemeFont type, char *buf,
Packit 98cdb6
			size_t bufsiz)
Packit 98cdb6
{
Packit 98cdb6
  LOGFONTW lf;
Packit 98cdb6
Packit 98cdb6
  if (get_system_font (klazz, type, &lf))
Packit 98cdb6
    {
Packit 98cdb6
      PangoFontDescription *desc = NULL;
Packit 98cdb6
      int pt_size;
Packit 98cdb6
      const char *font;
Packit 98cdb6
Packit 98cdb6
      desc = pango_win32_font_description_from_logfontw (&lf);
Packit 98cdb6
      if (!desc)
Packit 98cdb6
	return NULL;
Packit 98cdb6
Packit 98cdb6
      font = pango_font_description_to_string (desc);
Packit 98cdb6
      pt_size = pango_font_description_get_size (desc);
Packit 98cdb6
Packit 98cdb6
      if (!(font && *font))
Packit 98cdb6
	{
Packit 98cdb6
	  pango_font_description_free (desc);
Packit 98cdb6
	  return NULL;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (pt_size == 0)
Packit 98cdb6
	{
Packit 98cdb6
	  HDC hDC;
Packit 98cdb6
	  HWND hwnd;
Packit 98cdb6
Packit 98cdb6
	  hwnd = GetDesktopWindow ();
Packit 98cdb6
	  hDC = GetDC (hwnd);
Packit 98cdb6
Packit 98cdb6
	  if (hDC)
Packit 98cdb6
	    pt_size = -MulDiv (lf.lfHeight, 72, GetDeviceCaps (hDC, LOGPIXELSY));
Packit 98cdb6
	  else
Packit 98cdb6
	    pt_size = 10;
Packit 98cdb6
Packit 98cdb6
	  if (hDC)
Packit 98cdb6
	    ReleaseDC (hwnd, hDC);
Packit 98cdb6
Packit 98cdb6
	  g_snprintf (buf, bufsiz, "%s %d", font, pt_size);
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  g_snprintf (buf, bufsiz, "%s", font);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (desc)
Packit 98cdb6
	pango_font_description_free (desc);
Packit 98cdb6
Packit 98cdb6
      return buf;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* missing from ms's header files */
Packit 98cdb6
#ifndef SPI_GETMENUSHOWDELAY
Packit 98cdb6
#define SPI_GETMENUSHOWDELAY 106
Packit 98cdb6
#endif
Packit 98cdb6
Packit 98cdb6
/* I don't know the proper XP theme class for things like
Packit 98cdb6
   HIGHLIGHTTEXT, so we'll just define it to be "BUTTON"
Packit 98cdb6
   for now */
Packit 98cdb6
#define XP_THEME_CLASS_TEXT XP_THEME_CLASS_BUTTON
Packit 98cdb6
Packit 98cdb6
#define WIN95_VERSION   0x400
Packit 98cdb6
#define WIN2K_VERSION   0x500
Packit 98cdb6
#define WINXP_VERSION   0x501
Packit 98cdb6
#define WIN2K3_VERSION  0x502
Packit 98cdb6
#define VISTA_VERSION   0x600
Packit 98cdb6
Packit 98cdb6
static gint32
Packit 98cdb6
get_windows_version ()
Packit 98cdb6
{
Packit 98cdb6
  static gint32 version = 0;
Packit 98cdb6
  static gboolean have_version = FALSE;
Packit 98cdb6
Packit 98cdb6
  if (!have_version)
Packit 98cdb6
    {
Packit 98cdb6
      OSVERSIONINFOEX osvi;
Packit 98cdb6
      have_version = TRUE;
Packit 98cdb6
Packit 98cdb6
      ZeroMemory (&osvi, sizeof (OSVERSIONINFOEX));
Packit 98cdb6
      osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX);
Packit 98cdb6
Packit 98cdb6
      GetVersionEx((OSVERSIONINFO*) &osvi);
Packit 98cdb6
Packit 98cdb6
      version = (osvi.dwMajorVersion & 0xff) << 8 | (osvi.dwMinorVersion & 0xff);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return version;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
setup_menu_settings (GtkSettings *settings)
Packit 98cdb6
{
Packit 98cdb6
  int menu_delay;
Packit 98cdb6
  GObjectClass *klazz = G_OBJECT_GET_CLASS (G_OBJECT (settings));
Packit 98cdb6
Packit 98cdb6
  if (get_windows_version () > WIN95_VERSION)
Packit 98cdb6
    {
Packit 98cdb6
      if (SystemParametersInfo (SPI_GETMENUSHOWDELAY, 0, &menu_delay, 0))
Packit 98cdb6
	{
Packit 98cdb6
	  if (klazz)
Packit 98cdb6
	    {
Packit 98cdb6
	      if (g_object_class_find_property
Packit 98cdb6
		  (klazz, "gtk-menu-bar-popup-delay"))
Packit 98cdb6
		{
Packit 98cdb6
		  g_object_set (settings,
Packit 98cdb6
				"gtk-menu-bar-popup-delay", 0, NULL);
Packit 98cdb6
		}
Packit 98cdb6
	      if (g_object_class_find_property
Packit 98cdb6
		  (klazz, "gtk-menu-popup-delay"))
Packit 98cdb6
		{
Packit 98cdb6
		  g_object_set (settings,
Packit 98cdb6
				"gtk-menu-popup-delay", menu_delay, NULL);
Packit 98cdb6
		}
Packit 98cdb6
	      if (g_object_class_find_property
Packit 98cdb6
		  (klazz, "gtk-menu-popdown-delay"))
Packit 98cdb6
		{
Packit 98cdb6
		  g_object_set (settings,
Packit 98cdb6
				"gtk-menu-popdown-delay", menu_delay, NULL);
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
msw_style_setup_system_settings (void)
Packit 98cdb6
{
Packit 98cdb6
  GtkSettings *settings;
Packit 98cdb6
  int cursor_blink_time;
Packit 98cdb6
Packit 98cdb6
  settings = gtk_settings_get_default ();
Packit 98cdb6
  if (!settings)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  cursor_blink_time = GetCaretBlinkTime ();
Packit 98cdb6
  g_object_set (settings, "gtk-cursor-blink", cursor_blink_time > 0, NULL);
Packit 98cdb6
Packit 98cdb6
  if (cursor_blink_time > 0)
Packit 98cdb6
    {
Packit 98cdb6
      g_object_set (settings, "gtk-cursor-blink-time",
Packit 98cdb6
		    2 * cursor_blink_time, NULL);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_object_set (settings, "gtk-double-click-distance",
Packit 98cdb6
		GetSystemMetrics (SM_CXDOUBLECLK), NULL);
Packit 98cdb6
  g_object_set (settings, "gtk-double-click-time", GetDoubleClickTime (),
Packit 98cdb6
		NULL);
Packit 98cdb6
  g_object_set (settings, "gtk-dnd-drag-threshold",
Packit 98cdb6
		GetSystemMetrics (SM_CXDRAG), NULL);
Packit 98cdb6
Packit 98cdb6
  setup_menu_settings (settings);
Packit 98cdb6
Packit 98cdb6
  /*
Packit 98cdb6
     http://developer.gnome.org/doc/API/2.0/gtk/GtkSettings.html
Packit 98cdb6
     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/systemparametersinfo.asp
Packit 98cdb6
     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
setup_system_font (GtkStyle *style)
Packit 98cdb6
{
Packit 98cdb6
  char buf[256], *font;		/* It's okay, lfFaceName is smaller than 32
Packit 98cdb6
				   chars */
Packit 98cdb6
Packit 98cdb6
  if ((font = sys_font_to_pango_font (XP_THEME_CLASS_TEXT,
Packit 98cdb6
				      XP_THEME_FONT_MESSAGE,
Packit 98cdb6
				      buf, sizeof (buf))) != NULL)
Packit 98cdb6
    {
Packit 98cdb6
      if (style->font_desc)
Packit 98cdb6
	{
Packit 98cdb6
	  pango_font_description_free (style->font_desc);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      style->font_desc = pango_font_description_from_string (font);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
sys_color_to_gtk_color (XpThemeClass klazz, int id, GdkColor * pcolor)
Packit 98cdb6
{
Packit 98cdb6
  DWORD color;
Packit 98cdb6
Packit 98cdb6
  if (!xp_theme_get_system_color (klazz, id, &color))
Packit 98cdb6
    color = GetSysColor (id);
Packit 98cdb6
Packit 98cdb6
  pcolor->pixel = color;
Packit 98cdb6
  pcolor->red = (GetRValue (color) << 8) | GetRValue (color);
Packit 98cdb6
  pcolor->green = (GetGValue (color) << 8) | GetGValue (color);
Packit 98cdb6
  pcolor->blue = (GetBValue (color) << 8) | GetBValue (color);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static int
Packit 98cdb6
get_system_metric (XpThemeClass klazz, int id)
Packit 98cdb6
{
Packit 98cdb6
  int rval;
Packit 98cdb6
Packit 98cdb6
  if (!xp_theme_get_system_metric (klazz, id, &rval))
Packit 98cdb6
    rval = GetSystemMetrics (id);
Packit 98cdb6
Packit 98cdb6
  return rval;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
setup_msw_rc_style (void)
Packit 98cdb6
{
Packit 98cdb6
  char buf[1024], font_buf[256], *font_ptr;
Packit 98cdb6
  char menu_bar_prelight_str[128];
Packit 98cdb6
Packit 98cdb6
  GdkColor menu_color;
Packit 98cdb6
  GdkColor menu_text_color;
Packit 98cdb6
  GdkColor tooltip_back;
Packit 98cdb6
  GdkColor tooltip_fore;
Packit 98cdb6
  GdkColor btn_fore;
Packit 98cdb6
  GdkColor btn_face;
Packit 98cdb6
  GdkColor progress_back;
Packit 98cdb6
Packit 98cdb6
  GdkColor fg_prelight;
Packit 98cdb6
  GdkColor bg_prelight;
Packit 98cdb6
  GdkColor base_prelight;
Packit 98cdb6
  GdkColor text_prelight;
Packit 98cdb6
Packit 98cdb6
  /* Prelight */
Packit 98cdb6
  sys_color_to_gtk_color (get_windows_version () >= VISTA_VERSION ? XP_THEME_CLASS_MENU : XP_THEME_CLASS_TEXT,
Packit 98cdb6
			  get_windows_version () >= VISTA_VERSION ? COLOR_MENUTEXT : COLOR_HIGHLIGHTTEXT,
Packit 98cdb6
			  &fg_prelight);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT, &bg_prelight);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT,
Packit 98cdb6
			  &base_prelight);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHTTEXT,
Packit 98cdb6
			  &text_prelight);
Packit 98cdb6
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_MENU, COLOR_MENUTEXT,
Packit 98cdb6
			  &menu_text_color);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_MENU, COLOR_MENU, &menu_color);
Packit 98cdb6
Packit 98cdb6
  /* tooltips */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TOOLTIP, COLOR_INFOTEXT,
Packit 98cdb6
			  &tooltip_fore);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TOOLTIP, COLOR_INFOBK,
Packit 98cdb6
			  &tooltip_back);
Packit 98cdb6
Packit 98cdb6
  /* text on push buttons. TODO: button shadows, backgrounds, and
Packit 98cdb6
     highlights */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNTEXT, &btn_fore);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE, &btn_face);
Packit 98cdb6
Packit 98cdb6
  /* progress bar background color */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_PROGRESS, COLOR_HIGHLIGHT,
Packit 98cdb6
			  &progress_back);
Packit 98cdb6
Packit 98cdb6
  /* Enable coloring for menus. */
Packit 98cdb6
  font_ptr =
Packit 98cdb6
    sys_font_to_pango_font (XP_THEME_CLASS_MENU, XP_THEME_FONT_MENU,
Packit 98cdb6
			    font_buf, sizeof (font_buf));
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-menu\" = \"msw-default\"\n" "{\n"
Packit 98cdb6
	      "GtkMenuItem::toggle-spacing = 8\n"
Packit 98cdb6
	      "fg[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
	      "bg[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
	      "text[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
	      "base[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
	      "fg[NORMAL] = { %d, %d, %d }\n"
Packit 98cdb6
	      "bg[NORMAL] = { %d, %d, %d }\n" "%s = \"%s\"\n"
Packit 98cdb6
	      "}widget_class \"*MenuItem*\" style \"msw-menu\"\n"
Packit 98cdb6
	      "widget_class \"*GtkMenu\" style \"msw-menu\"\n"
Packit 98cdb6
	      "widget_class \"*GtkMenuShell*\" style \"msw-menu\"\n",
Packit 98cdb6
	      fg_prelight.red, fg_prelight.green, fg_prelight.blue,
Packit 98cdb6
	      bg_prelight.red, bg_prelight.green, bg_prelight.blue,
Packit 98cdb6
	      text_prelight.red, text_prelight.green, text_prelight.blue,
Packit 98cdb6
	      base_prelight.red, base_prelight.green, base_prelight.blue,
Packit 98cdb6
	      menu_text_color.red, menu_text_color.green,
Packit 98cdb6
	      menu_text_color.blue, menu_color.red, menu_color.green,
Packit 98cdb6
	      menu_color.blue, (font_ptr ? "font_name" : "#"),
Packit 98cdb6
	      (font_ptr ? font_ptr : " font name should go here"));
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  if (xp_theme_is_active ())
Packit 98cdb6
    {
Packit 98cdb6
      *menu_bar_prelight_str = '\0';
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      g_snprintf (menu_bar_prelight_str, sizeof (menu_bar_prelight_str),
Packit 98cdb6
		  "fg[PRELIGHT] = { %d, %d, %d }\n",
Packit 98cdb6
		  menu_text_color.red, menu_text_color.green,
Packit 98cdb6
		  menu_text_color.blue);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* Enable coloring for menu bars. */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-menu-bar\" = \"msw-menu\"\n"
Packit 98cdb6
	      "{\n"
Packit 98cdb6
	      "bg[NORMAL] = { %d, %d, %d }\n"
Packit 98cdb6
	      "%s" "GtkMenuBar::shadow-type = %d\n"
Packit 98cdb6
	      /*
Packit 98cdb6
	         FIXME: This should be enabled once gtk+ support
Packit 98cdb6
	         GtkMenuBar::prelight-item style property.
Packit 98cdb6
	       */
Packit 98cdb6
	      /* "GtkMenuBar::prelight-item = 1\n" */
Packit 98cdb6
	      "}widget_class \"*MenuBar*\" style \"msw-menu-bar\"\n",
Packit 98cdb6
	      btn_face.red, btn_face.green, btn_face.blue,
Packit 98cdb6
	      menu_bar_prelight_str, xp_theme_is_active ()? 0 : 2);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-toolbar\" = \"msw-default\"\n"
Packit 98cdb6
	      "{\n"
Packit 98cdb6
	      "GtkHandleBox::shadow-type = %s\n"
Packit 98cdb6
	      "GtkToolbar::shadow-type = %s\n"
Packit 98cdb6
	      "}widget_class \"*HandleBox*\" style \"msw-toolbar\"\n",
Packit 98cdb6
	      "etched-in", "etched-in");
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* enable tooltip fonts */
Packit 98cdb6
  font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_STATUS, XP_THEME_FONT_STATUS,
Packit 98cdb6
				     font_buf, sizeof (font_buf));
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-tooltips-caption\" = \"msw-default\"\n"
Packit 98cdb6
	      "{fg[NORMAL] = { %d, %d, %d }\n" "%s = \"%s\"\n"
Packit 98cdb6
	      "}widget \"gtk-tooltips.GtkLabel\" style \"msw-tooltips-caption\"\n"
Packit 98cdb6
	      "widget \"gtk-tooltip.GtkLabel\" style \"msw-tooltips-caption\"\n",
Packit 98cdb6
	      tooltip_fore.red, tooltip_fore.green, tooltip_fore.blue,
Packit 98cdb6
	      (font_ptr ? "font_name" : "#"),
Packit 98cdb6
	      (font_ptr ? font_ptr : " font name should go here"));
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-tooltips\" = \"msw-default\"\n"
Packit 98cdb6
	      "{bg[NORMAL] = { %d, %d, %d }\n"
Packit 98cdb6
	      "}widget \"gtk-tooltips*\" style \"msw-tooltips\"\n"
Packit 98cdb6
	      "widget \"gtk-tooltip*\" style \"msw-tooltips\"\n",
Packit 98cdb6
	      tooltip_back.red, tooltip_back.green, tooltip_back.blue);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* enable font theming for status bars */
Packit 98cdb6
  font_ptr = sys_font_to_pango_font (XP_THEME_CLASS_STATUS, XP_THEME_FONT_STATUS,
Packit 98cdb6
				     font_buf, sizeof (font_buf));
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-status\" = \"msw-default\"\n" "{%s = \"%s\"\n"
Packit 98cdb6
	      "bg[NORMAL] = { %d, %d, %d }\n"
Packit 98cdb6
	      "}widget_class \"*Status*\" style \"msw-status\"\n",
Packit 98cdb6
	      (font_ptr ? "font_name" : "#"),
Packit 98cdb6
	      (font_ptr ? font_ptr : " font name should go here"),
Packit 98cdb6
	      btn_face.red, btn_face.green, btn_face.blue);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* enable coloring for text on buttons
Packit 98cdb6
   * TODO: use GetThemeMetric for the border and outside border */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
              "style \"msw-button\" = \"msw-default\"\n"
Packit 98cdb6
              "{\n"
Packit 98cdb6
              "bg[NORMAL] = { %d, %d, %d }\n"
Packit 98cdb6
              "bg[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
              "bg[INSENSITIVE] = { %d, %d, %d }\n"
Packit 98cdb6
              "fg[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
              "GtkButton::default-border = { 0, 0, 0, 0 }\n"
Packit 98cdb6
              "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n"
Packit 98cdb6
              "GtkButton::child-displacement-x = %d\n"
Packit 98cdb6
              "GtkButton::child-displacement-y = %d\n"
Packit 98cdb6
              "GtkWidget::focus-padding = %d\n"
Packit 98cdb6
              "}widget_class \"*Button*\" style \"msw-button\"\n",
Packit 98cdb6
              btn_face.red, btn_face.green, btn_face.blue,
Packit 98cdb6
              btn_face.red, btn_face.green, btn_face.blue,
Packit 98cdb6
              btn_face.red, btn_face.green, btn_face.blue,
Packit 98cdb6
              btn_fore.red, btn_fore.green, btn_fore.blue,
Packit 98cdb6
              xp_theme_is_active ()? 0 : 1,
Packit 98cdb6
              xp_theme_is_active ()? 0 : 1,
Packit 98cdb6
              xp_theme_is_active ()? 1 : 2);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* enable coloring for progress bars */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-progress\" = \"msw-default\"\n"
Packit 98cdb6
	      "{bg[PRELIGHT] = { %d, %d, %d }\n"
Packit 98cdb6
	      "bg[NORMAL] = { %d, %d, %d }\n"
Packit 98cdb6
	      "}widget_class \"*Progress*\" style \"msw-progress\"\n",
Packit 98cdb6
	      progress_back.red,
Packit 98cdb6
	      progress_back.green,
Packit 98cdb6
	      progress_back.blue,
Packit 98cdb6
	      btn_face.red, btn_face.green, btn_face.blue);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* scrollbar thumb width and height */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-vscrollbar\" = \"msw-default\"\n"
Packit 98cdb6
	      "{GtkRange::slider-width = %d\n"
Packit 98cdb6
	      "GtkRange::stepper-size = %d\n"
Packit 98cdb6
	      "GtkRange::stepper-spacing = 0\n"
Packit 98cdb6
	      "GtkRange::trough_border = 0\n"
Packit 98cdb6
	      "GtkScale::slider-length = %d\n"
Packit 98cdb6
	      "GtkScrollbar::min-slider-length = 8\n"
Packit 98cdb6
	      "}widget_class \"*VScrollbar*\" style \"msw-vscrollbar\"\n"
Packit 98cdb6
	      "widget_class \"*VScale*\" style \"msw-vscrollbar\"\n",
Packit 98cdb6
	      GetSystemMetrics (SM_CYVTHUMB),
Packit 98cdb6
	      get_system_metric (XP_THEME_CLASS_SCROLLBAR, SM_CXVSCROLL), 11);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-hscrollbar\" = \"msw-default\"\n"
Packit 98cdb6
	      "{GtkRange::slider-width = %d\n"
Packit 98cdb6
	      "GtkRange::stepper-size = %d\n"
Packit 98cdb6
	      "GtkRange::stepper-spacing = 0\n"
Packit 98cdb6
	      "GtkRange::trough_border = 0\n"
Packit 98cdb6
	      "GtkScale::slider-length = %d\n"
Packit 98cdb6
	      "GtkScrollbar::min-slider-length = 8\n"
Packit 98cdb6
	      "}widget_class \"*HScrollbar*\" style \"msw-hscrollbar\"\n"
Packit 98cdb6
	      "widget_class \"*HScale*\" style \"msw-hscrollbar\"\n",
Packit 98cdb6
	      GetSystemMetrics (SM_CXHTHUMB),
Packit 98cdb6
	      get_system_metric (XP_THEME_CLASS_SCROLLBAR, SM_CYHSCROLL), 11);
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  gtk_rc_parse_string ("style \"msw-scrolled-window\" = \"msw-default\"\n"
Packit 98cdb6
		       "{GtkScrolledWindow::scrollbars-within-bevel = 1}\n"
Packit 98cdb6
		       "class \"GtkScrolledWindow\" style \"msw-scrolled-window\"\n");
Packit 98cdb6
Packit 98cdb6
  /* radio/check button sizes */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-checkbutton\" = \"msw-button\"\n"
Packit 98cdb6
	      "{GtkCheckButton::indicator-size = 13\n"
Packit 98cdb6
	      "}widget_class \"*CheckButton*\" style \"msw-checkbutton\"\n"
Packit 98cdb6
	      "widget_class \"*RadioButton*\" style \"msw-checkbutton\"\n");
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* size of combo box toggle button */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-combobox-button\" = \"msw-default\"\n"
Packit 98cdb6
	      "{\n"
Packit 98cdb6
	      "xthickness = 0\n"
Packit 98cdb6
	      "ythickness = 0\n"
Packit 98cdb6
	      "GtkButton::default-border = { 0, 0, 0, 0 }\n"
Packit 98cdb6
	      "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n"
Packit 98cdb6
	      "GtkButton::child-displacement-x = 0\n"
Packit 98cdb6
	      "GtkButton::child-displacement-y = 0\n"
Packit 98cdb6
	      "GtkWidget::focus-padding = 0\n"
Packit 98cdb6
	      "GtkWidget::focus-line-width = 0\n"
Packit 98cdb6
	      "}\n"
Packit 98cdb6
	      "widget_class \"*ComboBox*ToggleButton*\" style \"msw-combobox-button\"\n");
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-combobox\" = \"msw-default\"\n"
Packit 98cdb6
	      "{\n"
Packit 98cdb6
	      "GtkComboBox::shadow-type = in\n"
Packit 98cdb6
	      "xthickness = %d\n"
Packit 98cdb6
	      "ythickness = %d\n"
Packit 98cdb6
	      "}\n"
Packit 98cdb6
	      "class \"GtkComboBox\" style \"msw-combobox\"\n",
Packit 98cdb6
        xp_theme_is_active()? 1 : GetSystemMetrics (SM_CXEDGE),
Packit 98cdb6
        xp_theme_is_active()? 1 : GetSystemMetrics (SM_CYEDGE));
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* size of tree view header */
Packit 98cdb6
  g_snprintf (buf, sizeof (buf),
Packit 98cdb6
	      "style \"msw-header-button\" = \"msw-default\"\n"
Packit 98cdb6
	      "{\n"
Packit 98cdb6
	      "xthickness = 0\n"
Packit 98cdb6
	      "ythickness = 0\n"
Packit 98cdb6
	      "GtkWidget::draw-border = {0, 0, 0, 0}\n"
Packit 98cdb6
        "GtkButton::default-border = { 0, 0, 0, 0 }\n"
Packit 98cdb6
	      "GtkButton::default-outside-border = { 0, 0, 0, 0 }\n"
Packit 98cdb6
	      "GtkButton::child-displacement-x = 0\n"
Packit 98cdb6
	      "GtkButton::child-displacement-y = 0\n"
Packit 98cdb6
	      "GtkWidget::focus-padding = 0\n"
Packit 98cdb6
	      "GtkWidget::focus-line-width = 0\n"
Packit 98cdb6
	      "}\n"
Packit 98cdb6
	      "widget_class \"*TreeView*Button*\" style \"msw-header-button\"\n");
Packit 98cdb6
  gtk_rc_parse_string (buf);
Packit 98cdb6
Packit 98cdb6
  /* FIXME: This should be enabled once gtk+ support GtkNotebok::prelight-tab */
Packit 98cdb6
  /* enable prelight tab of GtkNotebook */
Packit 98cdb6
  /*
Packit 98cdb6
     g_snprintf (buf, sizeof (buf),
Packit 98cdb6
     "style \"msw-notebook\" = \"msw-default\"\n"
Packit 98cdb6
     "{GtkNotebook::prelight-tab=1\n"
Packit 98cdb6
     "}widget_class \"*Notebook*\" style \"msw-notebook\"\n");
Packit 98cdb6
     gtk_rc_parse_string (buf);
Packit 98cdb6
   */
Packit 98cdb6
Packit 98cdb6
  /* FIXME: This should be enabled once gtk+ support GtkTreeView::full-row-focus */
Packit 98cdb6
  /*
Packit 98cdb6
     g_snprintf (buf, sizeof (buf),
Packit 98cdb6
     "style \"msw-treeview\" = \"msw-default\"\n"
Packit 98cdb6
     "{GtkTreeView::full-row-focus=0\n"
Packit 98cdb6
     "}widget_class \"*TreeView*\" style \"msw-treeview\"\n");
Packit 98cdb6
     gtk_rc_parse_string (buf);
Packit 98cdb6
   */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
setup_system_styles (GtkStyle *style)
Packit 98cdb6
{
Packit 98cdb6
  int i;
Packit 98cdb6
Packit 98cdb6
  /* Default background */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE,
Packit 98cdb6
			  &style->bg[GTK_STATE_NORMAL]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT,
Packit 98cdb6
			  &style->bg[GTK_STATE_SELECTED]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE,
Packit 98cdb6
			  &style->bg[GTK_STATE_INSENSITIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE,
Packit 98cdb6
			  &style->bg[GTK_STATE_ACTIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE,
Packit 98cdb6
			  &style->bg[GTK_STATE_PRELIGHT]);
Packit 98cdb6
Packit 98cdb6
  /* Default base */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_WINDOW, COLOR_WINDOW,
Packit 98cdb6
			  &style->base[GTK_STATE_NORMAL]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHT,
Packit 98cdb6
			  &style->base[GTK_STATE_SELECTED]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE,
Packit 98cdb6
			  &style->base[GTK_STATE_INSENSITIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNFACE,
Packit 98cdb6
			  &style->base[GTK_STATE_ACTIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_WINDOW, COLOR_WINDOW,
Packit 98cdb6
			  &style->base[GTK_STATE_PRELIGHT]);
Packit 98cdb6
Packit 98cdb6
  /* Default text */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT,
Packit 98cdb6
			  &style->text[GTK_STATE_NORMAL]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHTTEXT,
Packit 98cdb6
			  &style->text[GTK_STATE_SELECTED]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_GRAYTEXT,
Packit 98cdb6
			  &style->text[GTK_STATE_INSENSITIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNTEXT,
Packit 98cdb6
			  &style->text[GTK_STATE_ACTIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT,
Packit 98cdb6
			  &style->text[GTK_STATE_PRELIGHT]);
Packit 98cdb6
Packit 98cdb6
  /* Default foreground */
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNTEXT,
Packit 98cdb6
			  &style->fg[GTK_STATE_NORMAL]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_HIGHLIGHTTEXT,
Packit 98cdb6
			  &style->fg[GTK_STATE_SELECTED]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_TEXT, COLOR_GRAYTEXT,
Packit 98cdb6
			  &style->fg[GTK_STATE_INSENSITIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_BTNTEXT,
Packit 98cdb6
                          &style->fg[GTK_STATE_ACTIVE]);
Packit 98cdb6
  sys_color_to_gtk_color (XP_THEME_CLASS_WINDOW, COLOR_WINDOWTEXT,
Packit 98cdb6
			  &style->fg[GTK_STATE_PRELIGHT]);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < 5; i++)
Packit 98cdb6
    {
Packit 98cdb6
      sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_3DSHADOW,
Packit 98cdb6
			      &style->dark[i]);
Packit 98cdb6
      sys_color_to_gtk_color (XP_THEME_CLASS_BUTTON, COLOR_3DHILIGHT,
Packit 98cdb6
			      &style->light[i]);
Packit 98cdb6
Packit 98cdb6
      style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;
Packit 98cdb6
      style->mid[i].green =
Packit 98cdb6
	(style->light[i].green + style->dark[i].green) / 2;
Packit 98cdb6
      style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2;
Packit 98cdb6
Packit 98cdb6
      style->text_aa[i].red = (style->text[i].red + style->base[i].red) / 2;
Packit 98cdb6
      style->text_aa[i].green =
Packit 98cdb6
	(style->text[i].green + style->base[i].green) / 2;
Packit 98cdb6
      style->text_aa[i].blue =
Packit 98cdb6
	(style->text[i].blue + style->base[i].blue) / 2;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
sanitize_size (GdkWindow *window, gint *width, gint *height)
Packit 98cdb6
{
Packit 98cdb6
  gboolean set_bg = FALSE;
Packit 98cdb6
Packit 98cdb6
  if ((*width == -1) && (*height == -1))
Packit 98cdb6
    {
Packit 98cdb6
      set_bg = GDK_IS_WINDOW (window);
Packit 98cdb6
      gdk_drawable_get_size (window, width, height);
Packit 98cdb6
    }
Packit 98cdb6
  else if (*width == -1)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_drawable_get_size (window, width, NULL);
Packit 98cdb6
    }
Packit 98cdb6
  else if (*height == -1)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_drawable_get_size (window, NULL, height);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return set_bg;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static XpThemeElement
Packit 98cdb6
map_gtk_progress_bar_to_xp (GtkProgressBar *progress_bar, gboolean trough)
Packit 98cdb6
{
Packit 98cdb6
  XpThemeElement ret;
Packit 98cdb6
Packit 98cdb6
  switch (gtk_progress_bar_get_orientation (progress_bar))
Packit 98cdb6
    {
Packit 98cdb6
    case GTK_PROGRESS_LEFT_TO_RIGHT:
Packit 98cdb6
    case GTK_PROGRESS_RIGHT_TO_LEFT:
Packit 98cdb6
      ret = trough
Packit 98cdb6
	? XP_THEME_ELEMENT_PROGRESS_TROUGH_H
Packit 98cdb6
	: XP_THEME_ELEMENT_PROGRESS_BAR_H;
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      ret = trough
Packit 98cdb6
	? XP_THEME_ELEMENT_PROGRESS_TROUGH_V
Packit 98cdb6
	: XP_THEME_ELEMENT_PROGRESS_BAR_V;
Packit 98cdb6
      break;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return ret;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
is_combo_box_child (GtkWidget *w)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *tmp;
Packit 98cdb6
Packit 98cdb6
  if (w == NULL)
Packit 98cdb6
    return FALSE;
Packit 98cdb6
Packit 98cdb6
  for (tmp = w->parent; tmp; tmp = tmp->parent)
Packit 98cdb6
    {
Packit 98cdb6
      if (GTK_IS_COMBO_BOX (tmp))
Packit 98cdb6
	return TRUE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_part (GdkDrawable *drawable,
Packit 98cdb6
           GdkColor *gc, GdkRectangle *area, gint x, gint y, Part part)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr = gdk_cairo_create (drawable);
Packit 98cdb6
Packit 98cdb6
  if (area)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_cairo_rectangle (cr, area);
Packit 98cdb6
      cairo_clip (cr);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (!parts[part].bmap)
Packit 98cdb6
    {
Packit 98cdb6
      parts[part].bmap = cairo_image_surface_create_for_data ((unsigned char *)parts[part].bits,
Packit 98cdb6
        					              CAIRO_FORMAT_A1,
Packit 98cdb6
        					              PART_SIZE, PART_SIZE, 4);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_cairo_set_source_color (cr, gc);
Packit 98cdb6
  cairo_mask_surface (cr, parts[part].bmap, x, y);
Packit 98cdb6
Packit 98cdb6
  cairo_destroy(cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_check (GtkStyle *style,
Packit 98cdb6
	    GdkWindow *window,
Packit 98cdb6
	    GtkStateType state,
Packit 98cdb6
	    GtkShadowType shadow,
Packit 98cdb6
	    GdkRectangle *area,
Packit 98cdb6
	    GtkWidget *widget,
Packit 98cdb6
	    const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  x -= (1 + PART_SIZE - width) / 2;
Packit 98cdb6
  y -= (1 + PART_SIZE - height) / 2;
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("check"))	/* Menu item */
Packit 98cdb6
    {
Packit 98cdb6
      if (shadow == GTK_SHADOW_IN)
Packit 98cdb6
	{
Packit 98cdb6
          draw_part (window, &style->black, area, x, y, CHECK_TEXT);
Packit 98cdb6
          draw_part (window, &style->dark[state], area, x, y, CHECK_AA);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      XpThemeElement theme_elt = XP_THEME_ELEMENT_CHECKBOX;
Packit 98cdb6
      switch (shadow)
Packit 98cdb6
	{
Packit 98cdb6
	case GTK_SHADOW_ETCHED_IN:
Packit 98cdb6
	  theme_elt = XP_THEME_ELEMENT_INCONSISTENT_CHECKBOX;
Packit 98cdb6
	  break;
Packit 98cdb6
Packit 98cdb6
	case GTK_SHADOW_IN:
Packit 98cdb6
	  theme_elt = XP_THEME_ELEMENT_PRESSED_CHECKBOX;
Packit 98cdb6
	  break;
Packit 98cdb6
Packit 98cdb6
	default:
Packit 98cdb6
	  break;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (!xp_theme_draw (window, theme_elt,
Packit 98cdb6
			  style, x, y, width, height, state, area))
Packit 98cdb6
	{
Packit 98cdb6
	  if (DETAIL("cellcheck"))
Packit 98cdb6
	    state = GTK_STATE_NORMAL;
Packit 98cdb6
Packit 98cdb6
          draw_part (window, &style->black, area, x, y, CHECK_BLACK);
Packit 98cdb6
          draw_part (window, &style->dark[state], area, x, y, CHECK_DARK);
Packit 98cdb6
          draw_part (window, &style->mid[state], area, x, y, CHECK_MID);
Packit 98cdb6
          draw_part (window, &style->light[state], area, x, y, CHECK_LIGHT);
Packit 98cdb6
          draw_part (window, &style->base[state], area, x, y, CHECK_BASE);
Packit 98cdb6
Packit 98cdb6
	  if (shadow == GTK_SHADOW_IN)
Packit 98cdb6
	    {
Packit 98cdb6
              draw_part (window, &style->text[state], area, x,
Packit 98cdb6
			 y, CHECK_TEXT);
Packit 98cdb6
              draw_part (window, &style->text_aa[state], area,
Packit 98cdb6
			 x, y, CHECK_AA);
Packit 98cdb6
	    }
Packit 98cdb6
	  else if (shadow == GTK_SHADOW_ETCHED_IN)
Packit 98cdb6
	    {
Packit 98cdb6
              draw_part (window, &style->text[state], area, x, y,
Packit 98cdb6
			 CHECK_INCONSISTENT);
Packit 98cdb6
              draw_part (window, &style->text_aa[state], area, x, y,
Packit 98cdb6
			 CHECK_AA);
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_expander (GtkStyle        *style,
Packit 98cdb6
               GdkWindow       *window,
Packit 98cdb6
               GtkStateType     state,
Packit 98cdb6
               GdkRectangle    *area,
Packit 98cdb6
               GtkWidget       *widget,
Packit 98cdb6
               const gchar     *detail,
Packit 98cdb6
               gint             x,
Packit 98cdb6
               gint             y,
Packit 98cdb6
               GtkExpanderStyle expander_style)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
  gint expander_size;
Packit 98cdb6
  gint expander_semi_size;
Packit 98cdb6
  XpThemeElement xp_expander;
Packit 98cdb6
  GtkOrientation orientation;
Packit 98cdb6
Packit 98cdb6
  gtk_widget_style_get (widget, "expander_size", &expander_size, NULL);
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("tool-palette-header"))
Packit 98cdb6
    {
Packit 98cdb6
      /* Expanders are usually drawn as little triangles and unfortunately
Packit 98cdb6
       * do not support rotated drawing modes. So a hack is applied (see
Packit 98cdb6
       * gtk_tool_item_group_header_expose_event_cb for details) when
Packit 98cdb6
       * drawing a GtkToolItemGroup's header for horizontal GtkToolShells,
Packit 98cdb6
       * forcing the triangle to point in the right direction. Except we
Packit 98cdb6
       * don't draw expanders as triangles on Windows. Usually, expanders
Packit 98cdb6
       * are represented as "+" and "-". It sucks for "+" to become "-" and
Packit 98cdb6
       * the inverse when we don't want to, so reverse the hack here. */
Packit 98cdb6
Packit 98cdb6
      orientation = gtk_tool_shell_get_orientation (GTK_TOOL_SHELL (widget));
Packit 98cdb6
Packit 98cdb6
      if (orientation == GTK_ORIENTATION_HORIZONTAL)
Packit 98cdb6
          expander_style = GTK_EXPANDER_EXPANDED - expander_style;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  switch (expander_style)
Packit 98cdb6
    {
Packit 98cdb6
    case GTK_EXPANDER_COLLAPSED:
Packit 98cdb6
    case GTK_EXPANDER_SEMI_COLLAPSED:
Packit 98cdb6
      xp_expander = XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED;
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case GTK_EXPANDER_EXPANDED:
Packit 98cdb6
    case GTK_EXPANDER_SEMI_EXPANDED:
Packit 98cdb6
      xp_expander = XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED;
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      g_assert_not_reached ();
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if ((expander_size % 2) == 0)
Packit 98cdb6
    expander_size--;
Packit 98cdb6
Packit 98cdb6
  if (expander_size > 2)
Packit 98cdb6
    expander_size -= 2;
Packit 98cdb6
Packit 98cdb6
  if (area)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_cairo_rectangle (cr, area);
Packit 98cdb6
      cairo_clip (cr);
Packit 98cdb6
      gdk_cairo_set_source_color (cr, &style->fg[state]);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  expander_semi_size = expander_size / 2;
Packit 98cdb6
  x -= expander_semi_size;
Packit 98cdb6
  y -= expander_semi_size;
Packit 98cdb6
Packit 98cdb6
  if (!xp_theme_draw (window, xp_expander, style,
Packit 98cdb6
		      x, y, expander_size, expander_size, state, area))
Packit 98cdb6
    {
Packit 98cdb6
      HDC dc;
Packit 98cdb6
      RECT rect;
Packit 98cdb6
      HPEN pen;
Packit 98cdb6
      HGDIOBJ old_pen;
Packit 98cdb6
      XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state, &dc_info, x, y, expander_size,
Packit 98cdb6
			  expander_size, &rect);
Packit 98cdb6
      FrameRect (dc, &rect, GetSysColorBrush (COLOR_GRAYTEXT));
Packit 98cdb6
      InflateRect (&rect, -1, -1);
Packit 98cdb6
      FillRect (dc, &rect,
Packit 98cdb6
		GetSysColorBrush (state ==
Packit 98cdb6
				  GTK_STATE_INSENSITIVE ? COLOR_BTNFACE :
Packit 98cdb6
				  COLOR_WINDOW));
Packit 98cdb6
Packit 98cdb6
      InflateRect (&rect, -1, -1);
Packit 98cdb6
Packit 98cdb6
      pen = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_WINDOWTEXT));
Packit 98cdb6
      old_pen = SelectObject (dc, pen);
Packit 98cdb6
Packit 98cdb6
      MoveToEx (dc, rect.left, rect.top - 2 + expander_semi_size, NULL);
Packit 98cdb6
      LineTo (dc, rect.right, rect.top - 2 + expander_semi_size);
Packit 98cdb6
Packit 98cdb6
      if (expander_style == GTK_EXPANDER_COLLAPSED ||
Packit 98cdb6
	  expander_style == GTK_EXPANDER_SEMI_COLLAPSED)
Packit 98cdb6
	{
Packit 98cdb6
	  MoveToEx (dc, rect.left - 2 + expander_semi_size, rect.top, NULL);
Packit 98cdb6
	  LineTo (dc, rect.left - 2 + expander_semi_size, rect.bottom);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      SelectObject (dc, old_pen);
Packit 98cdb6
      DeleteObject (pen);
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  cairo_destroy(cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_option (GtkStyle *style,
Packit 98cdb6
	     GdkWindow *window,
Packit 98cdb6
	     GtkStateType state,
Packit 98cdb6
	     GtkShadowType shadow,
Packit 98cdb6
	     GdkRectangle *area,
Packit 98cdb6
	     GtkWidget *widget,
Packit 98cdb6
	     const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  x -= (1 + PART_SIZE - width) / 2;
Packit 98cdb6
  y -= (1 + PART_SIZE - height) / 2;
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("option"))	/* Menu item */
Packit 98cdb6
    {
Packit 98cdb6
      if (shadow == GTK_SHADOW_IN)
Packit 98cdb6
	{
Packit 98cdb6
          draw_part (window, &style->fg[state], area, x, y, RADIO_TEXT);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_draw (window, shadow == GTK_SHADOW_IN
Packit 98cdb6
			 ? XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON
Packit 98cdb6
			 : XP_THEME_ELEMENT_RADIO_BUTTON,
Packit 98cdb6
			 style, x, y, width, height, state, area))
Packit 98cdb6
	{
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  if (DETAIL("cellradio"))
Packit 98cdb6
	    state = GTK_STATE_NORMAL;
Packit 98cdb6
Packit 98cdb6
          draw_part (window, &style->black, area, x, y, RADIO_BLACK);
Packit 98cdb6
          draw_part (window, &style->dark[state], area, x, y, RADIO_DARK);
Packit 98cdb6
          draw_part (window, &style->mid[state], area, x, y, RADIO_MID);
Packit 98cdb6
          draw_part (window, &style->light[state], area, x, y, RADIO_LIGHT);
Packit 98cdb6
          draw_part (window, &style->base[state], area, x, y, RADIO_BASE);
Packit 98cdb6
Packit 98cdb6
	  if (shadow == GTK_SHADOW_IN)
Packit 98cdb6
            draw_part (window, &style->text[state], area, x, y, RADIO_TEXT);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_varrow (GdkWindow *window,
Packit 98cdb6
             GdkColor *gc,
Packit 98cdb6
	     GtkShadowType shadow_type,
Packit 98cdb6
	     GdkRectangle *area,
Packit 98cdb6
	     GtkArrowType arrow_type, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  gint steps, extra;
Packit 98cdb6
  gint y_start, y_increment;
Packit 98cdb6
  gint i;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  
Packit 98cdb6
  cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
  if (area)
Packit 98cdb6
    {
Packit 98cdb6
       gdk_cairo_rectangle (cr, area);
Packit 98cdb6
       cairo_clip (cr);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  width = width + width % 2 - 1;	/* Force odd */
Packit 98cdb6
  steps = 1 + width / 2;
Packit 98cdb6
  extra = height - steps;
Packit 98cdb6
Packit 98cdb6
  if (arrow_type == GTK_ARROW_DOWN)
Packit 98cdb6
    {
Packit 98cdb6
      y_start = y;
Packit 98cdb6
      y_increment = 1;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      y_start = y + height - 1;
Packit 98cdb6
      y_increment = -1;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_cairo_set_source_color (cr, gc);
Packit 98cdb6
  cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
Packit 98cdb6
  cairo_set_line_width (cr, 1.0);
Packit 98cdb6
  cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
Packit 98cdb6
Packit 98cdb6
  cairo_move_to (cr, x + 0.5, y_start + extra * y_increment + 0.5);
Packit 98cdb6
  cairo_line_to (cr, x + width - 1 + 0.5, y_start + extra * y_increment + 0.5);
Packit 98cdb6
  cairo_line_to (cr, x + (height - 1 - extra) + 0.5, y_start + (height - 1) * y_increment + 0.5);
Packit 98cdb6
  cairo_close_path (cr);
Packit 98cdb6
  cairo_stroke_preserve (cr);
Packit 98cdb6
  cairo_fill (cr);
Packit 98cdb6
Packit 98cdb6
  cairo_destroy(cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_harrow (GdkWindow *window,
Packit 98cdb6
             GdkColor *gc,
Packit 98cdb6
	     GtkShadowType shadow_type,
Packit 98cdb6
	     GdkRectangle *area,
Packit 98cdb6
	     GtkArrowType arrow_type, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  gint steps, extra;
Packit 98cdb6
  gint x_start, x_increment;
Packit 98cdb6
  gint i;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  
Packit 98cdb6
  cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
  if (area)
Packit 98cdb6
    {
Packit 98cdb6
       gdk_cairo_rectangle (cr, area);
Packit 98cdb6
       cairo_clip (cr);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  height = height + height % 2 - 1;	/* Force odd */
Packit 98cdb6
  steps = 1 + height / 2;
Packit 98cdb6
  extra = width - steps;
Packit 98cdb6
Packit 98cdb6
  if (arrow_type == GTK_ARROW_RIGHT)
Packit 98cdb6
    {
Packit 98cdb6
      x_start = x;
Packit 98cdb6
      x_increment = 1;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      x_start = x + width - 1;
Packit 98cdb6
      x_increment = -1;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_cairo_set_source_color (cr, gc);
Packit 98cdb6
  cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
Packit 98cdb6
  cairo_set_line_width (cr, 1.0);
Packit 98cdb6
  cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
Packit 98cdb6
Packit 98cdb6
  cairo_move_to (cr, x_start + extra * x_increment + 0.5, y + 0.5);
Packit 98cdb6
  cairo_line_to (cr, x_start + extra * x_increment + 0.5, y + height - 1 + 0.5);
Packit 98cdb6
  cairo_line_to (cr, x_start + (width - 1) * x_increment + 0.5, y + height - (width - 1 - extra) - 1 + 0.5);
Packit 98cdb6
  cairo_close_path (cr);
Packit 98cdb6
  cairo_stroke_preserve (cr);
Packit 98cdb6
  cairo_fill (cr);
Packit 98cdb6
Packit 98cdb6
  cairo_destroy(cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* This function makes up for some brokeness in gtkrange.c
Packit 98cdb6
 * where we never get the full arrow of the stepper button
Packit 98cdb6
 * and the type of button in a single drawing function.
Packit 98cdb6
 *
Packit 98cdb6
 * It doesn't work correctly when the scrollbar is squished
Packit 98cdb6
 * to the point we don't have room for full-sized steppers.
Packit 98cdb6
 */
Packit 98cdb6
static void
Packit 98cdb6
reverse_engineer_stepper_box (GtkWidget *range,
Packit 98cdb6
			      GtkArrowType arrow_type,
Packit 98cdb6
			      gint *x, gint *y, gint *width, gint *height)
Packit 98cdb6
{
Packit 98cdb6
  gint slider_width = 14, stepper_size = 14;
Packit 98cdb6
  gint box_width;
Packit 98cdb6
  gint box_height;
Packit 98cdb6
Packit 98cdb6
  if (range)
Packit 98cdb6
    {
Packit 98cdb6
      gtk_widget_style_get (range,
Packit 98cdb6
			    "slider_width", &slider_width,
Packit 98cdb6
			    "stepper_size", &stepper_size, NULL);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (arrow_type == GTK_ARROW_UP || arrow_type == GTK_ARROW_DOWN)
Packit 98cdb6
    {
Packit 98cdb6
      box_width = slider_width;
Packit 98cdb6
      box_height = stepper_size;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      box_width = stepper_size;
Packit 98cdb6
      box_height = slider_width;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  *x = *x - (box_width - *width) / 2;
Packit 98cdb6
  *y = *y - (box_height - *height) / 2;
Packit 98cdb6
  *width = box_width;
Packit 98cdb6
  *height = box_height;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static XpThemeElement
Packit 98cdb6
to_xp_arrow (GtkArrowType arrow_type)
Packit 98cdb6
{
Packit 98cdb6
  XpThemeElement xp_arrow;
Packit 98cdb6
Packit 98cdb6
  switch (arrow_type)
Packit 98cdb6
    {
Packit 98cdb6
    case GTK_ARROW_UP:
Packit 98cdb6
      xp_arrow = XP_THEME_ELEMENT_ARROW_UP;
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case GTK_ARROW_DOWN:
Packit 98cdb6
      xp_arrow = XP_THEME_ELEMENT_ARROW_DOWN;
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case GTK_ARROW_LEFT:
Packit 98cdb6
      xp_arrow = XP_THEME_ELEMENT_ARROW_LEFT;
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      xp_arrow = XP_THEME_ELEMENT_ARROW_RIGHT;
Packit 98cdb6
      break;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return xp_arrow;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_arrow (GtkStyle *style,
Packit 98cdb6
	    GdkWindow *window,
Packit 98cdb6
	    GtkStateType state,
Packit 98cdb6
	    GtkShadowType shadow,
Packit 98cdb6
	    GdkRectangle *area,
Packit 98cdb6
	    GtkWidget *widget,
Packit 98cdb6
	    const gchar *detail,
Packit 98cdb6
	    GtkArrowType arrow_type,
Packit 98cdb6
	    gboolean fill, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  const gchar *name;
Packit 98cdb6
  HDC dc;
Packit 98cdb6
  RECT rect;
Packit 98cdb6
  XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
  name = gtk_widget_get_name (widget);
Packit 98cdb6
Packit 98cdb6
  sanitize_size (window, &width, &height);
Packit 98cdb6
Packit 98cdb6
  if (GTK_IS_ARROW (widget) && is_combo_box_child (widget) && xp_theme_is_active ())
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("spinbutton"))
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_is_drawable (XP_THEME_ELEMENT_SPIN_BUTTON_UP))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      width -= 2;
Packit 98cdb6
      --height;
Packit 98cdb6
      if (arrow_type == GTK_ARROW_DOWN)
Packit 98cdb6
	++y;
Packit 98cdb6
      ++x;
Packit 98cdb6
Packit 98cdb6
      if (state == GTK_STATE_ACTIVE)
Packit 98cdb6
	{
Packit 98cdb6
	  ++x;
Packit 98cdb6
	  ++y;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      draw_varrow (window, &style->fg[state], shadow, area,
Packit 98cdb6
		   arrow_type, x, y, width, height);
Packit 98cdb6
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("vscrollbar") || DETAIL("hscrollbar"))
Packit 98cdb6
    {
Packit 98cdb6
      gboolean is_disabled = FALSE;
Packit 98cdb6
      UINT btn_type = 0;
Packit 98cdb6
      GtkScrollbar *scrollbar = GTK_SCROLLBAR (widget);
Packit 98cdb6
Packit 98cdb6
      gint box_x = x;
Packit 98cdb6
      gint box_y = y;
Packit 98cdb6
      gint box_width = width;
Packit 98cdb6
      gint box_height = height;
Packit 98cdb6
Packit 98cdb6
      reverse_engineer_stepper_box (widget, arrow_type,
Packit 98cdb6
				    &box_x, &box_y, &box_width, &box_height);
Packit 98cdb6
Packit 98cdb6
      if (gtk_range_get_adjustment(&scrollbar->range)->page_size >=
Packit 98cdb6
          (gtk_range_get_adjustment(&scrollbar->range)->upper -
Packit 98cdb6
           gtk_range_get_adjustment(&scrollbar->range)->lower))
Packit 98cdb6
	{
Packit 98cdb6
	  is_disabled = TRUE;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (xp_theme_draw (window, to_xp_arrow (arrow_type), style, box_x, box_y,
Packit 98cdb6
			 box_width, box_height, state, area))
Packit 98cdb6
	{
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  switch (arrow_type)
Packit 98cdb6
	    {
Packit 98cdb6
	    case GTK_ARROW_UP:
Packit 98cdb6
	      btn_type = DFCS_SCROLLUP;
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_ARROW_DOWN:
Packit 98cdb6
	      btn_type = DFCS_SCROLLDOWN;
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_ARROW_LEFT:
Packit 98cdb6
	      btn_type = DFCS_SCROLLLEFT;
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_ARROW_RIGHT:
Packit 98cdb6
	      btn_type = DFCS_SCROLLRIGHT;
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_ARROW_NONE:
Packit 98cdb6
	      break;
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  if (state == GTK_STATE_INSENSITIVE)
Packit 98cdb6
	    {
Packit 98cdb6
	      btn_type |= DFCS_INACTIVE;
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  if (widget)
Packit 98cdb6
	    {
Packit 98cdb6
	      sanitize_size (window, &width, &height);
Packit 98cdb6
Packit 98cdb6
	      dc = get_window_dc (style, window, state, &dc_info,
Packit 98cdb6
				  box_x, box_y, box_width, box_height, &rect);
Packit 98cdb6
	      DrawFrameControl (dc, &rect, DFC_SCROLL,
Packit 98cdb6
				btn_type | (shadow ==
Packit 98cdb6
					    GTK_SHADOW_IN ? (DFCS_PUSHED |
Packit 98cdb6
							     DFCS_FLAT) : 0));
Packit 98cdb6
	      release_window_dc (&dc_info);
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      /* draw the toolbar chevrons - waiting for GTK 2.4 */
Packit 98cdb6
      if (name && !strcmp (name, "gtk-toolbar-arrow"))
Packit 98cdb6
	{
Packit 98cdb6
	  if (xp_theme_draw
Packit 98cdb6
	      (window, XP_THEME_ELEMENT_REBAR_CHEVRON, style, x, y,
Packit 98cdb6
	       width, height, state, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      /* probably a gtk combo box on a toolbar */
Packit 98cdb6
      else if (0		/* widget->parent && GTK_IS_BUTTON
Packit 98cdb6
				   (widget->parent) */ )
Packit 98cdb6
	{
Packit 98cdb6
	  if (xp_theme_draw
Packit 98cdb6
	      (window, XP_THEME_ELEMENT_COMBOBUTTON, style, x - 3,
Packit 98cdb6
	       widget->allocation.y + 1, width + 5,
Packit 98cdb6
	       widget->allocation.height - 4, state, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (arrow_type == GTK_ARROW_UP || arrow_type == GTK_ARROW_DOWN)
Packit 98cdb6
	{
Packit 98cdb6
	  x += (width - 7) / 2;
Packit 98cdb6
	  y += (height - 5) / 2;
Packit 98cdb6
Packit 98cdb6
          draw_varrow (window, &style->fg[state], shadow, area,
Packit 98cdb6
		       arrow_type, x, y, 7, 5);
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  x += (width - 5) / 2;
Packit 98cdb6
	  y += (height - 7) / 2;
Packit 98cdb6
Packit 98cdb6
          draw_harrow (window, &style->fg[state], shadow, area,
Packit 98cdb6
		       arrow_type, x, y, 5, 7);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
option_menu_get_props (GtkWidget *widget,
Packit 98cdb6
		       GtkRequisition *indicator_size,
Packit 98cdb6
		       GtkBorder *indicator_spacing)
Packit 98cdb6
{
Packit 98cdb6
  GtkRequisition *tmp_size = NULL;
Packit 98cdb6
  GtkBorder *tmp_spacing = NULL;
Packit 98cdb6
Packit 98cdb6
  if (widget)
Packit 98cdb6
    gtk_widget_style_get (widget,
Packit 98cdb6
			  "indicator_size", &tmp_size,
Packit 98cdb6
			  "indicator_spacing", &tmp_spacing, NULL);
Packit 98cdb6
Packit 98cdb6
  if (tmp_size)
Packit 98cdb6
    {
Packit 98cdb6
      *indicator_size = *tmp_size;
Packit 98cdb6
      gtk_requisition_free (tmp_size);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      *indicator_size = default_option_indicator_size;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (tmp_spacing)
Packit 98cdb6
    {
Packit 98cdb6
      *indicator_spacing = *tmp_spacing;
Packit 98cdb6
      gtk_border_free (tmp_spacing);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      *indicator_spacing = default_option_indicator_spacing;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
is_toolbar_child (GtkWidget *wid)
Packit 98cdb6
{
Packit 98cdb6
  while (wid)
Packit 98cdb6
    {
Packit 98cdb6
      if (GTK_IS_TOOLBAR (wid) || GTK_IS_HANDLE_BOX (wid))
Packit 98cdb6
	return TRUE;
Packit 98cdb6
      else
Packit 98cdb6
	wid = wid->parent;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
is_menu_tool_button_child (GtkWidget *wid)
Packit 98cdb6
{
Packit 98cdb6
  while (wid)
Packit 98cdb6
    {
Packit 98cdb6
      if (GTK_IS_MENU_TOOL_BUTTON (wid))
Packit 98cdb6
	return TRUE;
Packit 98cdb6
      else
Packit 98cdb6
	wid = wid->parent;
Packit 98cdb6
    }
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static HPEN
Packit 98cdb6
get_light_pen ()
Packit 98cdb6
{
Packit 98cdb6
  if (!g_light_pen)
Packit 98cdb6
    {
Packit 98cdb6
      g_light_pen = CreatePen (PS_SOLID | PS_INSIDEFRAME, 1,
Packit 98cdb6
			       GetSysColor (COLOR_BTNHIGHLIGHT));
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return g_light_pen;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static HPEN
Packit 98cdb6
get_dark_pen ()
Packit 98cdb6
{
Packit 98cdb6
  if (!g_dark_pen)
Packit 98cdb6
    {
Packit 98cdb6
      g_dark_pen = CreatePen (PS_SOLID | PS_INSIDEFRAME, 1,
Packit 98cdb6
			      GetSysColor (COLOR_BTNSHADOW));
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return g_dark_pen;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_3d_border (HDC hdc, RECT *rc, gboolean sunken)
Packit 98cdb6
{
Packit 98cdb6
  HPEN pen1, pen2;
Packit 98cdb6
  HGDIOBJ old_pen;
Packit 98cdb6
Packit 98cdb6
  if (sunken)
Packit 98cdb6
    {
Packit 98cdb6
      pen1 = get_dark_pen ();
Packit 98cdb6
      pen2 = get_light_pen ();
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      pen1 = get_light_pen ();
Packit 98cdb6
      pen2 = get_dark_pen ();
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  MoveToEx (hdc, rc->left, rc->bottom - 1, NULL);
Packit 98cdb6
Packit 98cdb6
  old_pen = SelectObject (hdc, pen1);
Packit 98cdb6
  LineTo (hdc, rc->left, rc->top);
Packit 98cdb6
  LineTo (hdc, rc->right - 1, rc->top);
Packit 98cdb6
  SelectObject (hdc, old_pen);
Packit 98cdb6
Packit 98cdb6
  old_pen = SelectObject (hdc, pen2);
Packit 98cdb6
  LineTo (hdc, rc->right - 1, rc->bottom - 1);
Packit 98cdb6
  LineTo (hdc, rc->left, rc->bottom - 1);
Packit 98cdb6
  SelectObject (hdc, old_pen);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
draw_menu_item (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
Packit 98cdb6
		gint x, gint y, gint width, gint height,
Packit 98cdb6
		GtkStateType state_type, GdkRectangle *area)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *parent;
Packit 98cdb6
  GtkMenuShell *bar;
Packit 98cdb6
  HDC dc;
Packit 98cdb6
  RECT rect;
Packit 98cdb6
  XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
  if (xp_theme_is_active ())
Packit 98cdb6
    {
Packit 98cdb6
      return (xp_theme_draw (window, XP_THEME_ELEMENT_MENU_ITEM, style,
Packit 98cdb6
                             x, y, width, height, state_type, area));
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if ((parent = gtk_widget_get_parent (widget))
Packit 98cdb6
      && GTK_IS_MENU_BAR (parent) && !xp_theme_is_active ())
Packit 98cdb6
    {
Packit 98cdb6
      bar = GTK_MENU_SHELL (parent);
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
      if (state_type == GTK_STATE_PRELIGHT)
Packit 98cdb6
	{
Packit 98cdb6
	  draw_3d_border (dc, &rect, bar->active);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
      return TRUE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static HBRUSH
Packit 98cdb6
get_dither_brush (void)
Packit 98cdb6
{
Packit 98cdb6
  WORD pattern[8];
Packit 98cdb6
  HBITMAP pattern_bmp;
Packit 98cdb6
  int i;
Packit 98cdb6
Packit 98cdb6
  if (g_dither_brush)
Packit 98cdb6
    return g_dither_brush;
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < 8; i++)
Packit 98cdb6
    {
Packit 98cdb6
      pattern[i] = (WORD) (0x5555 << (i & 1));
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  pattern_bmp = CreateBitmap (8, 8, 1, 1, &pattern);
Packit 98cdb6
Packit 98cdb6
  if (pattern_bmp)
Packit 98cdb6
    {
Packit 98cdb6
      g_dither_brush = CreatePatternBrush (pattern_bmp);
Packit 98cdb6
      DeleteObject (pattern_bmp);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return g_dither_brush;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
draw_tool_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
Packit 98cdb6
		  gint x, gint y, gint width, gint height,
Packit 98cdb6
		  GtkStateType state_type, GdkRectangle *area)
Packit 98cdb6
{
Packit 98cdb6
  HDC dc;
Packit 98cdb6
  RECT rect;
Packit 98cdb6
  XpDCInfo dc_info;
Packit 98cdb6
  gboolean is_toggled = FALSE;
Packit 98cdb6
Packit 98cdb6
  if (xp_theme_is_active ())
Packit 98cdb6
    {
Packit 98cdb6
      return (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLBAR_BUTTON, style,
Packit 98cdb6
			     x, y, width, height, state_type, area));
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (GTK_IS_TOGGLE_BUTTON (widget))
Packit 98cdb6
    {
Packit 98cdb6
      if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
Packit 98cdb6
	{
Packit 98cdb6
	  is_toggled = TRUE;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (state_type != GTK_STATE_PRELIGHT
Packit 98cdb6
      && state_type != GTK_STATE_ACTIVE && !is_toggled)
Packit 98cdb6
    {
Packit 98cdb6
      return FALSE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
  if (state_type == GTK_STATE_PRELIGHT)
Packit 98cdb6
    {
Packit 98cdb6
      if (is_toggled)
Packit 98cdb6
	{
Packit 98cdb6
	  FillRect (dc, &rect, GetSysColorBrush (COLOR_BTNFACE));
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      draw_3d_border (dc, &rect, is_toggled);
Packit 98cdb6
    }
Packit 98cdb6
  else if (state_type == GTK_STATE_ACTIVE)
Packit 98cdb6
    {
Packit 98cdb6
      if (is_toggled && !is_menu_tool_button_child (widget->parent))
Packit 98cdb6
	{
Packit 98cdb6
	  SetTextColor (dc, GetSysColor (COLOR_3DHILIGHT));
Packit 98cdb6
	  SetBkColor (dc, GetSysColor (COLOR_BTNFACE));
Packit 98cdb6
	  FillRect (dc, &rect, get_dither_brush ());
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      draw_3d_border (dc, &rect, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_push_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
Packit 98cdb6
		  gint x, gint y, gint width, gint height,
Packit 98cdb6
		  GtkStateType state_type, gboolean is_default)
Packit 98cdb6
{
Packit 98cdb6
  HDC dc;
Packit 98cdb6
  RECT rect;
Packit 98cdb6
  XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
  if (GTK_IS_TOGGLE_BUTTON (widget))
Packit 98cdb6
    {
Packit 98cdb6
      if (state_type == GTK_STATE_PRELIGHT &&
Packit 98cdb6
	  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
Packit 98cdb6
	{
Packit 98cdb6
	  state_type = GTK_STATE_ACTIVE;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (state_type == GTK_STATE_ACTIVE)
Packit 98cdb6
    {
Packit 98cdb6
      if (GTK_IS_TOGGLE_BUTTON (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  DrawEdge (dc, &rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
Packit 98cdb6
	  SetTextColor (dc, GetSysColor (COLOR_3DHILIGHT));
Packit 98cdb6
	  SetBkColor (dc, GetSysColor (COLOR_BTNFACE));
Packit 98cdb6
	  FillRect (dc, &rect, get_dither_brush ());
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  FrameRect (dc, &rect, GetSysColorBrush (COLOR_WINDOWFRAME));
Packit 98cdb6
	  InflateRect (&rect, -1, -1);
Packit 98cdb6
	  FrameRect (dc, &rect, GetSysColorBrush (COLOR_BTNSHADOW));
Packit 98cdb6
	  InflateRect (&rect, -1, -1);
Packit 98cdb6
	  FillRect (dc, &rect, GetSysColorBrush (COLOR_BTNFACE));
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      if (is_default || gtk_widget_has_focus (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  FrameRect (dc, &rect, GetSysColorBrush (COLOR_WINDOWFRAME));
Packit 98cdb6
	  InflateRect (&rect, -1, -1);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      DrawFrameControl (dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  release_window_dc (&dc_info);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_box (GtkStyle *style,
Packit 98cdb6
	  GdkWindow *window,
Packit 98cdb6
	  GtkStateType state_type,
Packit 98cdb6
	  GtkShadowType shadow_type,
Packit 98cdb6
	  GdkRectangle *area,
Packit 98cdb6
	  GtkWidget *widget,
Packit 98cdb6
	  const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  if (is_combo_box_child (widget) && DETAIL("button"))
Packit 98cdb6
    {
Packit 98cdb6
      RECT rect;
Packit 98cdb6
      XpDCInfo dc_info;
Packit 98cdb6
      DWORD border;
Packit 98cdb6
      HDC dc;
Packit 98cdb6
      int cx;
Packit 98cdb6
Packit 98cdb6
      border = (GTK_TOGGLE_BUTTON (widget)->active ? DFCS_PUSHED | DFCS_FLAT : 0);
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
      DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLDOWN | border);
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
      if (xp_theme_is_active ()
Packit 98cdb6
	  && xp_theme_draw (window, XP_THEME_ELEMENT_COMBOBUTTON, style, x, y,
Packit 98cdb6
			    width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
      cx = GetSystemMetrics(SM_CXVSCROLL);
Packit 98cdb6
      x += width - cx;
Packit 98cdb6
      width = cx;
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width - cx, height, &rect);
Packit 98cdb6
      FillRect (dc, &rect, GetSysColorBrush (COLOR_WINDOW));
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
      return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("button") || DETAIL("buttondefault"))
Packit 98cdb6
    {
Packit 98cdb6
      if (GTK_IS_TREE_VIEW (widget->parent) || GTK_IS_CLIST (widget->parent))
Packit 98cdb6
      {
Packit 98cdb6
        if (xp_theme_draw
Packit 98cdb6
	      (window, XP_THEME_ELEMENT_LIST_HEADER, style, x, y,
Packit 98cdb6
	       width, height, state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      HDC dc;
Packit 98cdb6
	      RECT rect;
Packit 98cdb6
	      XpDCInfo dc_info;
Packit 98cdb6
	      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
	      DrawFrameControl (dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH |
Packit 98cdb6
				(state_type ==
Packit 98cdb6
				 GTK_STATE_ACTIVE ? (DFCS_PUSHED | DFCS_FLAT)
Packit 98cdb6
				 : 0));
Packit 98cdb6
	      release_window_dc (&dc_info);
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      else if (is_toolbar_child (widget->parent)
Packit 98cdb6
	       || (!GTK_IS_BUTTON (widget) ||
Packit 98cdb6
		   (GTK_RELIEF_NONE == gtk_button_get_relief (GTK_BUTTON (widget)))))
Packit 98cdb6
	{
Packit 98cdb6
	  if (draw_tool_button (window, widget, style, x, y,
Packit 98cdb6
				width, height, state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  gboolean is_default = gtk_widget_has_default (widget);
Packit 98cdb6
	  if (xp_theme_draw
Packit 98cdb6
	      (window,
Packit 98cdb6
	       is_default ? XP_THEME_ELEMENT_DEFAULT_BUTTON :
Packit 98cdb6
	       XP_THEME_ELEMENT_BUTTON, style, x, y, width, height,
Packit 98cdb6
	       state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  draw_push_button (window, widget, style,
Packit 98cdb6
			    x, y, width, height, state_type, is_default);
Packit 98cdb6
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("spinbutton"))
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_is_drawable (XP_THEME_ELEMENT_SPIN_BUTTON_UP))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("spinbutton_up") || DETAIL("spinbutton_down"))
Packit 98cdb6
    {
Packit 98cdb6
      if (!xp_theme_draw (window,
Packit 98cdb6
			  DETAIL("spinbutton_up")
Packit 98cdb6
			  ? XP_THEME_ELEMENT_SPIN_BUTTON_UP
Packit 98cdb6
			  : XP_THEME_ELEMENT_SPIN_BUTTON_DOWN,
Packit 98cdb6
			  style, x, y, width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  RECT rect;
Packit 98cdb6
	  XpDCInfo dc_info;
Packit 98cdb6
	  HDC dc;
Packit 98cdb6
Packit 98cdb6
	  dc = get_window_dc (style, window, state_type, &dc_info,
Packit 98cdb6
			      x, y, width, height, &rect);
Packit 98cdb6
	  DrawEdge (dc, &rect,
Packit 98cdb6
		    state_type ==
Packit 98cdb6
		    GTK_STATE_ACTIVE ? EDGE_SUNKEN : EDGE_RAISED, BF_RECT);
Packit 98cdb6
	  release_window_dc (&dc_info);
Packit 98cdb6
	}
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("slider"))
Packit 98cdb6
    {
Packit 98cdb6
      if (GTK_IS_SCROLLBAR (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  GtkScrollbar *scrollbar = GTK_SCROLLBAR (widget);
Packit 98cdb6
	  GtkOrientation orientation;
Packit 98cdb6
	  gboolean is_vertical;
Packit 98cdb6
Packit 98cdb6
          orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
Packit 98cdb6
Packit 98cdb6
          if (orientation == GTK_ORIENTATION_VERTICAL)
Packit 98cdb6
            is_vertical = TRUE;
Packit 98cdb6
          else
Packit 98cdb6
            is_vertical = FALSE;
Packit 98cdb6
Packit 98cdb6
	  if (xp_theme_draw (window,
Packit 98cdb6
			     is_vertical
Packit 98cdb6
			     ? XP_THEME_ELEMENT_SCROLLBAR_V
Packit 98cdb6
			     : XP_THEME_ELEMENT_SCROLLBAR_H,
Packit 98cdb6
			     style, x, y, width, height, state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      XpThemeElement gripper =
Packit 98cdb6
		(is_vertical ? XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V :
Packit 98cdb6
		 XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H);
Packit 98cdb6
Packit 98cdb6
	      /* Do not display grippers on tiny scroll bars,
Packit 98cdb6
	         the limit imposed is rather arbitrary, perhaps
Packit 98cdb6
	         we can fetch the gripper geometry from
Packit 98cdb6
	         somewhere and use that... */
Packit 98cdb6
	      if ((gripper ==
Packit 98cdb6
		   XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H
Packit 98cdb6
		   && width < 16)
Packit 98cdb6
		  || (gripper ==
Packit 98cdb6
		      XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V && height < 16))
Packit 98cdb6
		{
Packit 98cdb6
		  return;
Packit 98cdb6
		}
Packit 98cdb6
Packit 98cdb6
	      xp_theme_draw (window, gripper, style, x, y,
Packit 98cdb6
			     width, height, state_type, area);
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
              if (gtk_range_get_adjustment(&scrollbar->range)->page_size >=
Packit 98cdb6
        	  (gtk_range_get_adjustment(&scrollbar->range)->upper -
Packit 98cdb6
        	   gtk_range_get_adjustment(&scrollbar->range)->lower))
Packit 98cdb6
		{
Packit 98cdb6
		  return;
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("bar"))
Packit 98cdb6
    {
Packit 98cdb6
      if (widget && GTK_IS_PROGRESS_BAR (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  GtkProgressBar *progress_bar = GTK_PROGRESS_BAR (widget);
Packit 98cdb6
	  XpThemeElement xp_progress_bar =
Packit 98cdb6
	    map_gtk_progress_bar_to_xp (progress_bar, FALSE);
Packit 98cdb6
Packit 98cdb6
	  if (xp_theme_draw (window, xp_progress_bar, style, x, y,
Packit 98cdb6
			     width, height, state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  shadow_type = GTK_SHADOW_NONE;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("menuitem"))
Packit 98cdb6
    {
Packit 98cdb6
      shadow_type = GTK_SHADOW_NONE;
Packit 98cdb6
      if (draw_menu_item (window, widget, style,
Packit 98cdb6
			  x, y, width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("trough"))
Packit 98cdb6
    {
Packit 98cdb6
      if (widget && GTK_IS_PROGRESS_BAR (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  GtkProgressBar *progress_bar = GTK_PROGRESS_BAR (widget);
Packit 98cdb6
	  XpThemeElement xp_progress_bar =
Packit 98cdb6
	    map_gtk_progress_bar_to_xp (progress_bar, TRUE);
Packit 98cdb6
	  if (xp_theme_draw
Packit 98cdb6
	      (window, xp_progress_bar, style, x, y, width, height,
Packit 98cdb6
	       state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      /* Blank in classic Windows */
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      else if (widget && GTK_IS_SCROLLBAR (widget))
Packit 98cdb6
	{
Packit 98cdb6
          GtkOrientation orientation;
Packit 98cdb6
	  gboolean is_vertical;
Packit 98cdb6
Packit 98cdb6
          orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
Packit 98cdb6
Packit 98cdb6
          if (orientation == GTK_ORIENTATION_VERTICAL)
Packit 98cdb6
            is_vertical = TRUE;
Packit 98cdb6
          else
Packit 98cdb6
            is_vertical = FALSE;
Packit 98cdb6
Packit 98cdb6
	  if (xp_theme_draw (window,
Packit 98cdb6
			     is_vertical
Packit 98cdb6
			     ? XP_THEME_ELEMENT_TROUGH_V
Packit 98cdb6
			     : XP_THEME_ELEMENT_TROUGH_H,
Packit 98cdb6
			     style, x, y, width, height, state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      HDC dc;
Packit 98cdb6
	      RECT rect;
Packit 98cdb6
	      XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
	      sanitize_size (window, &width, &height);
Packit 98cdb6
	      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
	      SetTextColor (dc, GetSysColor (COLOR_3DHILIGHT));
Packit 98cdb6
	      SetBkColor (dc, GetSysColor (COLOR_BTNFACE));
Packit 98cdb6
	      FillRect (dc, &rect, get_dither_brush ());
Packit 98cdb6
Packit 98cdb6
	      release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
      else if (widget && GTK_IS_SCALE (widget))
Packit 98cdb6
	{
Packit 98cdb6
          GtkOrientation orientation;
Packit 98cdb6
Packit 98cdb6
          orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
Packit 98cdb6
Packit 98cdb6
	  if (!xp_theme_is_active ())
Packit 98cdb6
	    {
Packit 98cdb6
	      parent_class->draw_box (style, window, state_type,
Packit 98cdb6
				      GTK_SHADOW_NONE, area,
Packit 98cdb6
				      widget, detail, x, y, width, height);
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  if (orientation == GTK_ORIENTATION_VERTICAL)
Packit 98cdb6
	    {
Packit 98cdb6
	      if (xp_theme_draw
Packit 98cdb6
		  (window, XP_THEME_ELEMENT_SCALE_TROUGH_V,
Packit 98cdb6
		   style, (2 * x + width) / 2, y, 2, height,
Packit 98cdb6
		   state_type, area))
Packit 98cdb6
		{
Packit 98cdb6
		  return;
Packit 98cdb6
		}
Packit 98cdb6
Packit 98cdb6
	      parent_class->draw_box (style, window, state_type,
Packit 98cdb6
				      GTK_SHADOW_ETCHED_IN,
Packit 98cdb6
				      area, NULL, NULL,
Packit 98cdb6
				      (2 * x + width) / 2, y, 1, height);
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      if (xp_theme_draw
Packit 98cdb6
		  (window, XP_THEME_ELEMENT_SCALE_TROUGH_H,
Packit 98cdb6
		   style, x, (2 * y + height) / 2, width, 2,
Packit 98cdb6
		   state_type, area))
Packit 98cdb6
		{
Packit 98cdb6
		  return;
Packit 98cdb6
		}
Packit 98cdb6
Packit 98cdb6
	      parent_class->draw_box (style, window, state_type,
Packit 98cdb6
				      GTK_SHADOW_ETCHED_IN,
Packit 98cdb6
				      area, NULL, NULL, x,
Packit 98cdb6
				      (2 * y + height) / 2, width, 1);
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("optionmenu"))
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_draw (window, XP_THEME_ELEMENT_EDIT_TEXT,
Packit 98cdb6
			 style, x, y, width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("vscrollbar") || DETAIL("hscrollbar"))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("handlebox_bin") || DETAIL("toolbar") || DETAIL("menubar"))
Packit 98cdb6
    {
Packit 98cdb6
      sanitize_size (window, &width, &height);
Packit 98cdb6
      if (xp_theme_draw (window, XP_THEME_ELEMENT_REBAR,
Packit 98cdb6
			 style, x, y, width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("handlebox"))	/* grip */
Packit 98cdb6
    {
Packit 98cdb6
      if (!xp_theme_is_active ())
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else if (DETAIL("notebook") && GTK_IS_NOTEBOOK (widget))
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_draw (window, XP_THEME_ELEMENT_TAB_PANE, style,
Packit 98cdb6
			 x, y, width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      const gchar *name = gtk_widget_get_name (widget);
Packit 98cdb6
Packit 98cdb6
      if (name && !strcmp (name, "gtk-tooltips"))
Packit 98cdb6
	{
Packit 98cdb6
	  if (xp_theme_draw
Packit 98cdb6
	      (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width,
Packit 98cdb6
	       height, state_type, area))
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      HBRUSH brush;
Packit 98cdb6
	      RECT rect;
Packit 98cdb6
	      XpDCInfo dc_info;
Packit 98cdb6
	      HDC hdc;
Packit 98cdb6
Packit 98cdb6
	      hdc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
	      brush = GetSysColorBrush (COLOR_3DDKSHADOW);
Packit 98cdb6
Packit 98cdb6
	      if (brush)
Packit 98cdb6
		{
Packit 98cdb6
		  FrameRect (hdc, &rect, brush);
Packit 98cdb6
		}
Packit 98cdb6
Packit 98cdb6
	      InflateRect (&rect, -1, -1);
Packit 98cdb6
	      FillRect (hdc, &rect, (HBRUSH) (COLOR_INFOBK + 1));
Packit 98cdb6
Packit 98cdb6
	      release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_box (style, window, state_type, shadow_type, area,
Packit 98cdb6
			  widget, detail, x, y, width, height);
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("optionmenu"))
Packit 98cdb6
    {
Packit 98cdb6
      GtkRequisition indicator_size;
Packit 98cdb6
      GtkBorder indicator_spacing;
Packit 98cdb6
      gint vline_x;
Packit 98cdb6
Packit 98cdb6
      option_menu_get_props (widget, &indicator_size, &indicator_spacing);
Packit 98cdb6
Packit 98cdb6
      sanitize_size (window, &width, &height);
Packit 98cdb6
Packit 98cdb6
      if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
Packit 98cdb6
	{
Packit 98cdb6
	  vline_x =
Packit 98cdb6
	    x + indicator_size.width + indicator_spacing.left +
Packit 98cdb6
	    indicator_spacing.right;
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  vline_x = x + width - (indicator_size.width +
Packit 98cdb6
				 indicator_spacing.left +
Packit 98cdb6
				 indicator_spacing.right) - style->xthickness;
Packit 98cdb6
Packit 98cdb6
	  parent_class->draw_vline (style, window, state_type, area, widget,
Packit 98cdb6
				    detail,
Packit 98cdb6
				    y + style->ythickness + 1,
Packit 98cdb6
				    y + height - style->ythickness - 3, vline_x);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_tab (GtkStyle *style,
Packit 98cdb6
	  GdkWindow *window,
Packit 98cdb6
	  GtkStateType state,
Packit 98cdb6
	  GtkShadowType shadow,
Packit 98cdb6
	  GdkRectangle *area,
Packit 98cdb6
	  GtkWidget *widget,
Packit 98cdb6
	  const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  GtkRequisition indicator_size;
Packit 98cdb6
  GtkBorder indicator_spacing;
Packit 98cdb6
Packit 98cdb6
  gint arrow_height;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (style != NULL);
Packit 98cdb6
  g_return_if_fail (window != NULL);
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("optionmenutab"))
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_draw (window, XP_THEME_ELEMENT_COMBOBUTTON,
Packit 98cdb6
			 style, x - 5, widget->allocation.y + 1,
Packit 98cdb6
			 width + 10, widget->allocation.height - 2,
Packit 98cdb6
			 state, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  option_menu_get_props (widget, &indicator_size, &indicator_spacing);
Packit 98cdb6
Packit 98cdb6
  x += (width - indicator_size.width) / 2;
Packit 98cdb6
  arrow_height = (indicator_size.width + 1) / 2;
Packit 98cdb6
Packit 98cdb6
  y += (height - arrow_height) / 2;
Packit 98cdb6
Packit 98cdb6
  draw_varrow (window, &style->black, shadow, area, GTK_ARROW_DOWN,
Packit 98cdb6
	       x, y, indicator_size.width, arrow_height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Draw classic Windows tab - thanks Mozilla!
Packit 98cdb6
  (no system API for this, but DrawEdge can draw all the parts of a tab) */
Packit 98cdb6
static void
Packit 98cdb6
DrawTab (HDC hdc, const RECT R, gint32 aPosition, gboolean aSelected,
Packit 98cdb6
	 gboolean aDrawLeft, gboolean aDrawRight)
Packit 98cdb6
{
Packit 98cdb6
  gint32 leftFlag, topFlag, rightFlag, lightFlag, shadeFlag;
Packit 98cdb6
  RECT topRect, sideRect, bottomRect, lightRect, shadeRect;
Packit 98cdb6
  gint32 selectedOffset, lOffset, rOffset;
Packit 98cdb6
Packit 98cdb6
  selectedOffset = aSelected ? 1 : 0;
Packit 98cdb6
  lOffset = aDrawLeft ? 2 : 0;
Packit 98cdb6
  rOffset = aDrawRight ? 2 : 0;
Packit 98cdb6
Packit 98cdb6
  /* Get info for tab orientation/position (Left, Top, Right, Bottom) */
Packit 98cdb6
  switch (aPosition)
Packit 98cdb6
    {
Packit 98cdb6
    case BF_LEFT:
Packit 98cdb6
      leftFlag = BF_TOP;
Packit 98cdb6
      topFlag = BF_LEFT;
Packit 98cdb6
      rightFlag = BF_BOTTOM;
Packit 98cdb6
      lightFlag = BF_DIAGONAL_ENDTOPRIGHT;
Packit 98cdb6
      shadeFlag = BF_DIAGONAL_ENDBOTTOMRIGHT;
Packit 98cdb6
Packit 98cdb6
      SetRect (&topRect, R.left, R.top + lOffset, R.right,
Packit 98cdb6
	       R.bottom - rOffset);
Packit 98cdb6
      SetRect (&sideRect, R.left + 2, R.top, R.right - 2 + selectedOffset,
Packit 98cdb6
	       R.bottom);
Packit 98cdb6
      SetRect (&bottomRect, R.right - 2, R.top, R.right, R.bottom);
Packit 98cdb6
      SetRect (&lightRect, R.left, R.top, R.left + 3, R.top + 3);
Packit 98cdb6
      SetRect (&shadeRect, R.left + 1, R.bottom - 2, R.left + 2,
Packit 98cdb6
	       R.bottom - 1);
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case BF_TOP:
Packit 98cdb6
      leftFlag = BF_LEFT;
Packit 98cdb6
      topFlag = BF_TOP;
Packit 98cdb6
      rightFlag = BF_RIGHT;
Packit 98cdb6
      lightFlag = BF_DIAGONAL_ENDTOPRIGHT;
Packit 98cdb6
      shadeFlag = BF_DIAGONAL_ENDBOTTOMRIGHT;
Packit 98cdb6
Packit 98cdb6
      SetRect (&topRect, R.left + lOffset, R.top, R.right - rOffset,
Packit 98cdb6
	       R.bottom);
Packit 98cdb6
      SetRect (&sideRect, R.left, R.top + 2, R.right,
Packit 98cdb6
	       R.bottom - 1 + selectedOffset);
Packit 98cdb6
      SetRect (&bottomRect, R.left, R.bottom - 1, R.right, R.bottom);
Packit 98cdb6
      SetRect (&lightRect, R.left, R.top, R.left + 3, R.top + 3);
Packit 98cdb6
      SetRect (&shadeRect, R.right - 2, R.top + 1, R.right - 1, R.top + 2);
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case BF_RIGHT:
Packit 98cdb6
      leftFlag = BF_TOP;
Packit 98cdb6
      topFlag = BF_RIGHT;
Packit 98cdb6
      rightFlag = BF_BOTTOM;
Packit 98cdb6
      lightFlag = BF_DIAGONAL_ENDTOPLEFT;
Packit 98cdb6
      shadeFlag = BF_DIAGONAL_ENDBOTTOMLEFT;
Packit 98cdb6
Packit 98cdb6
      SetRect (&topRect, R.left, R.top + lOffset, R.right,
Packit 98cdb6
	       R.bottom - rOffset);
Packit 98cdb6
      SetRect (&sideRect, R.left + 2 - selectedOffset, R.top, R.right - 2,
Packit 98cdb6
	       R.bottom);
Packit 98cdb6
      SetRect (&bottomRect, R.left, R.top, R.left + 2, R.bottom);
Packit 98cdb6
      SetRect (&lightRect, R.right - 3, R.top, R.right - 1, R.top + 2);
Packit 98cdb6
      SetRect (&shadeRect, R.right - 2, R.bottom - 3, R.right, R.bottom - 1);
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case BF_BOTTOM:
Packit 98cdb6
      leftFlag = BF_LEFT;
Packit 98cdb6
      topFlag = BF_BOTTOM;
Packit 98cdb6
      rightFlag = BF_RIGHT;
Packit 98cdb6
      lightFlag = BF_DIAGONAL_ENDTOPLEFT;
Packit 98cdb6
      shadeFlag = BF_DIAGONAL_ENDBOTTOMLEFT;
Packit 98cdb6
Packit 98cdb6
      SetRect (&topRect, R.left + lOffset, R.top, R.right - rOffset,
Packit 98cdb6
	       R.bottom);
Packit 98cdb6
      SetRect (&sideRect, R.left, R.top + 2 - selectedOffset, R.right,
Packit 98cdb6
	       R.bottom - 2);
Packit 98cdb6
      SetRect (&bottomRect, R.left, R.top, R.right, R.top + 2);
Packit 98cdb6
      SetRect (&lightRect, R.left, R.bottom - 3, R.left + 2, R.bottom - 1);
Packit 98cdb6
      SetRect (&shadeRect, R.right - 2, R.bottom - 3, R.right, R.bottom - 1);
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      g_return_if_reached ();
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* Background */
Packit 98cdb6
  FillRect (hdc, &R, (HBRUSH) (COLOR_3DFACE + 1));
Packit 98cdb6
Packit 98cdb6
  /* Tab "Top" */
Packit 98cdb6
  DrawEdge (hdc, &topRect, EDGE_RAISED, BF_SOFT | topFlag);
Packit 98cdb6
Packit 98cdb6
  /* Tab "Bottom" */
Packit 98cdb6
  if (!aSelected)
Packit 98cdb6
    DrawEdge (hdc, &bottomRect, EDGE_RAISED, BF_SOFT | topFlag);
Packit 98cdb6
Packit 98cdb6
  /* Tab "Sides" */
Packit 98cdb6
  if (!aDrawLeft)
Packit 98cdb6
    leftFlag = 0;
Packit 98cdb6
  if (!aDrawRight)
Packit 98cdb6
    rightFlag = 0;
Packit 98cdb6
Packit 98cdb6
  DrawEdge (hdc, &sideRect, EDGE_RAISED, BF_SOFT | leftFlag | rightFlag);
Packit 98cdb6
Packit 98cdb6
  /* Tab Diagonal Corners */
Packit 98cdb6
  if (aDrawLeft)
Packit 98cdb6
    DrawEdge (hdc, &lightRect, EDGE_RAISED, BF_SOFT | lightFlag);
Packit 98cdb6
Packit 98cdb6
  if (aDrawRight)
Packit 98cdb6
    DrawEdge (hdc, &shadeRect, EDGE_RAISED, BF_SOFT | shadeFlag);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
get_notebook_tab_position (GtkNotebook *notebook,
Packit 98cdb6
                           gboolean *start,
Packit 98cdb6
                           gboolean *end)
Packit 98cdb6
{
Packit 98cdb6
  gboolean found_start = FALSE, found_end = FALSE;
Packit 98cdb6
  gint i, n_pages;
Packit 98cdb6
Packit 98cdb6
  /* default value */
Packit 98cdb6
  *start = TRUE;
Packit 98cdb6
  *end = FALSE;
Packit 98cdb6
Packit 98cdb6
  n_pages = gtk_notebook_get_n_pages (notebook);
Packit 98cdb6
  for (i = 0; i < n_pages; i++)
Packit 98cdb6
    {
Packit 98cdb6
      GtkWidget *tab_child;
Packit 98cdb6
      GtkWidget *tab_label;
Packit 98cdb6
      gboolean expand;
Packit 98cdb6
      GtkPackType pack_type;
Packit 98cdb6
      gboolean is_selected;
Packit 98cdb6
Packit 98cdb6
      tab_child = gtk_notebook_get_nth_page (notebook, i);
Packit 98cdb6
      is_selected = gtk_notebook_get_current_page (notebook) == i;
Packit 98cdb6
Packit 98cdb6
      /* Skip invisible tabs */
Packit 98cdb6
      tab_label = gtk_notebook_get_tab_label (notebook, tab_child);
Packit 98cdb6
      if (!tab_label || !GTK_WIDGET_VISIBLE (tab_label))
Packit 98cdb6
        continue;
Packit 98cdb6
Packit 98cdb6
      /* Mimics what the notebook does internally. */
Packit 98cdb6
      if (tab_label && !gtk_widget_get_child_visible (tab_label))
Packit 98cdb6
        {
Packit 98cdb6
          /* One child is hidden because scroll arrows are present.
Packit 98cdb6
           * So both corners are rounded. */
Packit 98cdb6
          *start = FALSE;
Packit 98cdb6
          *end = FALSE;
Packit 98cdb6
          return;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      gtk_notebook_query_tab_label_packing (notebook, tab_child, &expand,
Packit 98cdb6
                                            NULL, /* don't need fill */
Packit 98cdb6
                                            &pack_type);
Packit 98cdb6
Packit 98cdb6
      if (pack_type == GTK_PACK_START)
Packit 98cdb6
        {
Packit 98cdb6
          if (!found_start)
Packit 98cdb6
            {
Packit 98cdb6
              /* This is the first tab with PACK_START pack type */
Packit 98cdb6
              found_start = TRUE;
Packit 98cdb6
Packit 98cdb6
              if (is_selected)
Packit 98cdb6
                {
Packit 98cdb6
                  /* first PACK_START item is selected: set start to TRUE */
Packit 98cdb6
                  *start = TRUE;
Packit 98cdb6
Packit 98cdb6
                  if (expand && !found_end)
Packit 98cdb6
                    {
Packit 98cdb6
                      /* tentatively set end to TRUE: will be invalidated if we
Packit 98cdb6
                       * find other items */
Packit 98cdb6
                      *end = TRUE;
Packit 98cdb6
                    }
Packit 98cdb6
                }
Packit 98cdb6
              else
Packit 98cdb6
                {
Packit 98cdb6
                  *start = FALSE;
Packit 98cdb6
                }
Packit 98cdb6
            }
Packit 98cdb6
          else if (!found_end && !is_selected)
Packit 98cdb6
            {
Packit 98cdb6
              /* an unselected item exists, and no item with PACK_END pack type */
Packit 98cdb6
              *end = FALSE;
Packit 98cdb6
            }
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (pack_type == GTK_PACK_END)
Packit 98cdb6
        {
Packit 98cdb6
          if (!found_end)
Packit 98cdb6
            {
Packit 98cdb6
              /* This is the first tab with PACK_END pack type */
Packit 98cdb6
              found_end = TRUE;
Packit 98cdb6
Packit 98cdb6
              if (is_selected)
Packit 98cdb6
                {
Packit 98cdb6
                  /* first PACK_END item is selected: set end to TRUE */
Packit 98cdb6
                  *end = TRUE;
Packit 98cdb6
Packit 98cdb6
                  if (expand && !found_start)
Packit 98cdb6
                    {
Packit 98cdb6
                      /* tentatively set start to TRUE: will be invalidated if
Packit 98cdb6
                       * we find other items */
Packit 98cdb6
                      *start = TRUE;
Packit 98cdb6
                    }
Packit 98cdb6
                }
Packit 98cdb6
              else
Packit 98cdb6
                {
Packit 98cdb6
                *end = FALSE;
Packit 98cdb6
                }
Packit 98cdb6
            }
Packit 98cdb6
          else if (!found_start && !is_selected)
Packit 98cdb6
            {
Packit 98cdb6
              *start = FALSE;
Packit 98cdb6
            }
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
draw_themed_tab_button (GtkStyle *style,
Packit 98cdb6
			GdkWindow *window,
Packit 98cdb6
			GtkStateType state_type,
Packit 98cdb6
			GtkNotebook *notebook,
Packit 98cdb6
			gint x,
Packit 98cdb6
			gint y,
Packit 98cdb6
			gint width,
Packit 98cdb6
			gint height,
Packit 98cdb6
			gint gap_side)
Packit 98cdb6
{
Packit 98cdb6
  GdkPixmap *pixmap = NULL;
Packit 98cdb6
  GdkRectangle draw_rect, clip_rect;
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  gboolean start, stop;
Packit 98cdb6
  XpThemeElement element;
Packit 98cdb6
  gint d_w, d_h;
Packit 98cdb6
Packit 98cdb6
  get_notebook_tab_position (notebook, &start, &stop);
Packit 98cdb6
Packit 98cdb6
  if (state_type == GTK_STATE_NORMAL)
Packit 98cdb6
    {
Packit 98cdb6
      if (start && stop)
Packit 98cdb6
        {
Packit 98cdb6
          /* Both edges of the notebook are covered by the item */
Packit 98cdb6
          element = XP_THEME_ELEMENT_TAB_ITEM_BOTH_EDGE;
Packit 98cdb6
        }
Packit 98cdb6
      else if (start)
Packit 98cdb6
        {
Packit 98cdb6
          /* The start edge is covered by the item */
Packit 98cdb6
          element = XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE;
Packit 98cdb6
        }
Packit 98cdb6
      else if (stop)
Packit 98cdb6
        {
Packit 98cdb6
          /* the stop edge is reached by the item */
Packit 98cdb6
          element = XP_THEME_ELEMENT_TAB_ITEM_RIGHT_EDGE;
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          /* no edge should be aligned with the tab */
Packit 98cdb6
          element = XP_THEME_ELEMENT_TAB_ITEM;
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      /* Ideally, we should do the same here. Unfortunately, we don't have ways
Packit 98cdb6
       * to determine what tab widget is actually being drawn here, so we can't
Packit 98cdb6
       * determine its position relative to the borders */
Packit 98cdb6
      element = XP_THEME_ELEMENT_TAB_ITEM;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  draw_rect.x = x;
Packit 98cdb6
  draw_rect.y = y;
Packit 98cdb6
  draw_rect.width = width;
Packit 98cdb6
  draw_rect.height = height;
Packit 98cdb6
Packit 98cdb6
  /* Perform adjustments required to have the theme perfectly aligned */
Packit 98cdb6
  if (state_type == GTK_STATE_ACTIVE)
Packit 98cdb6
    {
Packit 98cdb6
      switch (gap_side)
Packit 98cdb6
        {
Packit 98cdb6
        case GTK_POS_TOP:
Packit 98cdb6
          draw_rect.x += 2;
Packit 98cdb6
          draw_rect.width -= 2;
Packit 98cdb6
          draw_rect.height -= 1;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_BOTTOM:
Packit 98cdb6
          draw_rect.x += 2;
Packit 98cdb6
          draw_rect.width -= 2;
Packit 98cdb6
          draw_rect.y += 1;
Packit 98cdb6
          draw_rect.height -= 1;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_LEFT:
Packit 98cdb6
          draw_rect.y += 2;
Packit 98cdb6
          draw_rect.height -= 2;
Packit 98cdb6
          draw_rect.width -= 1;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_RIGHT:
Packit 98cdb6
          draw_rect.y += 2;
Packit 98cdb6
          draw_rect.height -= 2;
Packit 98cdb6
          draw_rect.x += 1;
Packit 98cdb6
          draw_rect.width -= 1;
Packit 98cdb6
          break;
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      switch (gap_side)
Packit 98cdb6
        {
Packit 98cdb6
        case GTK_POS_TOP:
Packit 98cdb6
          draw_rect.height += 1;
Packit 98cdb6
          draw_rect.width += 2;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_BOTTOM:
Packit 98cdb6
          draw_rect.y -= 1;
Packit 98cdb6
          draw_rect.height += 1;
Packit 98cdb6
          draw_rect.width += 2;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_LEFT:
Packit 98cdb6
          draw_rect.width += 1;
Packit 98cdb6
          draw_rect.height += 2;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_RIGHT:
Packit 98cdb6
          draw_rect.x -= 1;
Packit 98cdb6
          draw_rect.width += 1;
Packit 98cdb6
          draw_rect.height += 2;
Packit 98cdb6
          break;
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  clip_rect = draw_rect;
Packit 98cdb6
Packit 98cdb6
  /* Take care of obvious case where the clipping is an empty region */
Packit 98cdb6
  if (clip_rect.width <= 0 || clip_rect.height <= 0)
Packit 98cdb6
    return TRUE;
Packit 98cdb6
Packit 98cdb6
  /* Simple case: tabs on top are just drawn as is */
Packit 98cdb6
  if (gap_side == GTK_POS_TOP)
Packit 98cdb6
    {
Packit 98cdb6
       return xp_theme_draw (window, element, style,
Packit 98cdb6
	                     draw_rect.x, draw_rect.y,
Packit 98cdb6
	                     draw_rect.width, draw_rect.height,
Packit 98cdb6
	                     state_type, &clip_rect);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* For other cases, we need to print the tab on a pixmap, and then rotate
Packit 98cdb6
   * it according to the gap side */
Packit 98cdb6
  if (gap_side == GTK_POS_LEFT || gap_side == GTK_POS_RIGHT)
Packit 98cdb6
    {
Packit 98cdb6
      /* pixmap will have width/height inverted as we'll rotate +- PI / 2 */
Packit 98cdb6
      d_w = draw_rect.height;
Packit 98cdb6
      d_h = draw_rect.width;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      d_w = draw_rect.width;
Packit 98cdb6
      d_h = draw_rect.height;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  pixmap = gdk_pixmap_new (window, d_w, d_h, -1);
Packit 98cdb6
Packit 98cdb6
  /* First copy the previously saved window background */
Packit 98cdb6
  cr = gdk_cairo_create (pixmap);
Packit 98cdb6
Packit 98cdb6
  /* pixmaps unfortunately don't handle the alpha channel. We then
Packit 98cdb6
   * paint it first in white, hoping the actual background is clear */
Packit 98cdb6
  cairo_set_source_rgb (cr, 1, 1, 1);
Packit 98cdb6
  cairo_paint (cr);
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
Packit 98cdb6
  if (!xp_theme_draw (pixmap, element, style, 0, 0, d_w, d_h, state_type, 0))
Packit 98cdb6
    {
Packit 98cdb6
      g_object_unref (pixmap);
Packit 98cdb6
      return FALSE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* Now we have the pixmap, we need to flip/rotate it according to its
Packit 98cdb6
   * final position. We'll do it using cairo on the dest window */
Packit 98cdb6
  cr = gdk_cairo_create (window);
Packit 98cdb6
  cairo_rectangle (cr, clip_rect.x, clip_rect.y,
Packit 98cdb6
                   clip_rect.width, clip_rect.height);
Packit 98cdb6
  cairo_clip (cr);
Packit 98cdb6
  cairo_translate(cr, draw_rect.x + draw_rect.width * 0.5,
Packit 98cdb6
                  draw_rect.y + draw_rect.height * 0.5);
Packit 98cdb6
Packit 98cdb6
  if (gap_side == GTK_POS_LEFT || gap_side == GTK_POS_RIGHT) {
Packit 98cdb6
    cairo_rotate (cr, G_PI/2.0);
Packit 98cdb6
  }
Packit 98cdb6
Packit 98cdb6
  if (gap_side == GTK_POS_LEFT || gap_side == GTK_POS_BOTTOM) {
Packit 98cdb6
    cairo_scale (cr, 1, -1);
Packit 98cdb6
  }
Packit 98cdb6
Packit 98cdb6
  cairo_translate(cr, -d_w * 0.5, -d_h * 0.5);
Packit 98cdb6
  gdk_cairo_set_source_pixmap (cr, pixmap, 0, 0);
Packit 98cdb6
  cairo_paint (cr);
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (pixmap);
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
draw_tab_button (GtkStyle *style,
Packit 98cdb6
		 GdkWindow *window,
Packit 98cdb6
		 GtkStateType state_type,
Packit 98cdb6
		 GtkShadowType shadow_type,
Packit 98cdb6
		 GdkRectangle *area,
Packit 98cdb6
		 GtkWidget *widget,
Packit 98cdb6
		 const gchar *detail,
Packit 98cdb6
		 gint x, gint y, gint width, gint height, gint gap_side)
Packit 98cdb6
{
Packit 98cdb6
  if (gap_side == GTK_POS_TOP || gap_side == GTK_POS_BOTTOM)
Packit 98cdb6
    {
Packit 98cdb6
      /* experimental tab-drawing code from mozilla */
Packit 98cdb6
      RECT rect;
Packit 98cdb6
      XpDCInfo dc_info;
Packit 98cdb6
      HDC dc;
Packit 98cdb6
      gint32 aPosition;
Packit 98cdb6
	  cairo_t *cr;
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
	  cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
      if (gap_side == GTK_POS_TOP)
Packit 98cdb6
	aPosition = BF_TOP;
Packit 98cdb6
      else if (gap_side == GTK_POS_BOTTOM)
Packit 98cdb6
	aPosition = BF_BOTTOM;
Packit 98cdb6
      else if (gap_side == GTK_POS_LEFT)
Packit 98cdb6
	aPosition = BF_LEFT;
Packit 98cdb6
      else
Packit 98cdb6
	aPosition = BF_RIGHT;
Packit 98cdb6
Packit 98cdb6
      if (state_type == GTK_STATE_PRELIGHT)
Packit 98cdb6
	state_type = GTK_STATE_NORMAL;
Packit 98cdb6
      if (area)
Packit 98cdb6
        {
Packit 98cdb6
           gdk_cairo_rectangle (cr, area);
Packit 98cdb6
           cairo_clip (cr);
Packit 98cdb6
           gdk_cairo_set_source_color (cr, &style->dark[state_type]);
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      DrawTab (dc, rect, aPosition,
Packit 98cdb6
	       state_type != GTK_STATE_PRELIGHT,
Packit 98cdb6
	       (gap_side != GTK_POS_LEFT), (gap_side != GTK_POS_RIGHT));
Packit 98cdb6
Packit 98cdb6
      cairo_destroy (cr);
Packit 98cdb6
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
      return TRUE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_extension (GtkStyle *style,
Packit 98cdb6
		GdkWindow *window,
Packit 98cdb6
		GtkStateType state_type,
Packit 98cdb6
		GtkShadowType shadow_type,
Packit 98cdb6
		GdkRectangle *area,
Packit 98cdb6
		GtkWidget *widget,
Packit 98cdb6
		const gchar *detail,
Packit 98cdb6
		gint x, gint y,
Packit 98cdb6
		gint width, gint height, GtkPositionType gap_side)
Packit 98cdb6
{
Packit 98cdb6
  if (widget && GTK_IS_NOTEBOOK (widget) && DETAIL("tab"))
Packit 98cdb6
    {
Packit 98cdb6
      GtkNotebook *notebook = GTK_NOTEBOOK (widget);
Packit 98cdb6
Packit 98cdb6
      /* draw_themed_tab_button and draw_tab_button expect to work with tab
Packit 98cdb6
       * position, instead of simply taking the "side of the gap" (gap_side).
Packit 98cdb6
       * The gap side, simply said, is the side of the tab that touches the notebook
Packit 98cdb6
       * frame and is always the exact opposite of the tab position... */
Packit 98cdb6
      int tab_pos = gtk_notebook_get_tab_pos (notebook);
Packit 98cdb6
Packit 98cdb6
      if (!draw_themed_tab_button (style, window, state_type,
Packit 98cdb6
				   notebook, x, y,
Packit 98cdb6
				   width, height, tab_pos))
Packit 98cdb6
	{
Packit 98cdb6
	  if (!draw_tab_button (style, window, state_type,
Packit 98cdb6
				shadow_type, area, widget,
Packit 98cdb6
				detail, x, y, width, height, tab_pos))
Packit 98cdb6
	    {
Packit 98cdb6
	      /* GtkStyle expects the usual gap_side */
Packit 98cdb6
	      parent_class->draw_extension (style, window, state_type,
Packit 98cdb6
					    shadow_type, area, widget, detail,
Packit 98cdb6
					    x, y, width, height,
Packit 98cdb6
					    gap_side);
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_box_gap (GtkStyle *style,
Packit 98cdb6
              GdkWindow *window,
Packit 98cdb6
              GtkStateType state_type,
Packit 98cdb6
	      GtkShadowType shadow_type,
Packit 98cdb6
	      GdkRectangle *area,
Packit 98cdb6
	      GtkWidget *widget,
Packit 98cdb6
	      const gchar *detail,
Packit 98cdb6
	      gint x,
Packit 98cdb6
	      gint y,
Packit 98cdb6
	      gint width,
Packit 98cdb6
	      gint height,
Packit 98cdb6
	      GtkPositionType gap_side,
Packit 98cdb6
	      gint gap_x,
Packit 98cdb6
	      gint gap_width)
Packit 98cdb6
{
Packit 98cdb6
  if (GTK_IS_NOTEBOOK (widget) && DETAIL("notebook"))
Packit 98cdb6
    {
Packit 98cdb6
      GtkNotebook *notebook = GTK_NOTEBOOK (widget);
Packit 98cdb6
Packit 98cdb6
      int side = gtk_notebook_get_tab_pos (notebook);
Packit 98cdb6
      int x2 = x, y2 = y;
Packit 98cdb6
      int w2 = width + style->xthickness, h2 = height + style->ythickness;
Packit 98cdb6
Packit 98cdb6
      switch (side)
Packit 98cdb6
        {
Packit 98cdb6
        case GTK_POS_TOP:
Packit 98cdb6
          y2 -= 1;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_BOTTOM:
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_LEFT:
Packit 98cdb6
          x2 -= 1;
Packit 98cdb6
          break;
Packit 98cdb6
        case GTK_POS_RIGHT:
Packit 98cdb6
          w2 += 1;
Packit 98cdb6
          break;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (xp_theme_draw (window, XP_THEME_ELEMENT_TAB_PANE, style,
Packit 98cdb6
			 x2, y2, w2, h2, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_box_gap (style, window, state_type, shadow_type,
Packit 98cdb6
			      area, widget, detail, x, y, width, height,
Packit 98cdb6
			      gap_side, gap_x, gap_width);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
is_popup_window_child (GtkWidget *widget)
Packit 98cdb6
{
Packit 98cdb6
  GtkWidget *top;
Packit 98cdb6
  GtkWindowType type = -1;
Packit 98cdb6
Packit 98cdb6
  top = gtk_widget_get_toplevel (widget);
Packit 98cdb6
Packit 98cdb6
  if (top && GTK_IS_WINDOW (top))
Packit 98cdb6
    {
Packit 98cdb6
      g_object_get (top, "type", &type, NULL);
Packit 98cdb6
Packit 98cdb6
      if (type == GTK_WINDOW_POPUP)
Packit 98cdb6
	{			/* Hack for combo boxes */
Packit 98cdb6
	  return TRUE;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_flat_box (GtkStyle *style, GdkWindow *window,
Packit 98cdb6
	       GtkStateType state_type, GtkShadowType shadow_type,
Packit 98cdb6
	       GdkRectangle *area, GtkWidget *widget,
Packit 98cdb6
	       const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  if (detail)
Packit 98cdb6
    {
Packit 98cdb6
      if (state_type == GTK_STATE_SELECTED &&
Packit 98cdb6
	  (!strncmp ("cell_even", detail, 9) || !strncmp ("cell_odd", detail, 8)))
Packit 98cdb6
	{
Packit 98cdb6
          GdkColor *gc = gtk_widget_has_focus (widget) ? &style->base[state_type] : &style->base[GTK_STATE_ACTIVE];
Packit 98cdb6
          cairo_t *cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
          _cairo_draw_rectangle (cr, gc, TRUE, x, y, width, height);
Packit 98cdb6
Packit 98cdb6
		  cairo_destroy (cr);
Packit 98cdb6
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
      else if (DETAIL("checkbutton"))
Packit 98cdb6
	{
Packit 98cdb6
	  if (state_type == GTK_STATE_PRELIGHT)
Packit 98cdb6
	    {
Packit 98cdb6
	      return;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_flat_box (style, window, state_type, shadow_type,
Packit 98cdb6
			       area, widget, detail, x, y, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
draw_menu_border (GdkWindow *win, GtkStyle *style,
Packit 98cdb6
		  gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  RECT rect;
Packit 98cdb6
  XpDCInfo dc_info;
Packit 98cdb6
  HDC dc;
Packit 98cdb6
Packit 98cdb6
  dc = get_window_dc (style, win, GTK_STATE_NORMAL, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
  if (!dc)
Packit 98cdb6
    return FALSE;
Packit 98cdb6
Packit 98cdb6
  if (xp_theme_is_active ())
Packit 98cdb6
    {
Packit 98cdb6
      FrameRect (dc, &rect, GetSysColorBrush (COLOR_3DSHADOW));
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      DrawEdge (dc, &rect, EDGE_RAISED, BF_RECT);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_shadow (GtkStyle *style,
Packit 98cdb6
	     GdkWindow *window,
Packit 98cdb6
	     GtkStateType state_type,
Packit 98cdb6
	     GtkShadowType shadow_type,
Packit 98cdb6
	     GdkRectangle *area,
Packit 98cdb6
	     GtkWidget *widget,
Packit 98cdb6
	     const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  gboolean is_handlebox;
Packit 98cdb6
  gboolean is_toolbar;
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("frame"))
Packit 98cdb6
    {
Packit 98cdb6
Packit 98cdb6
      HDC dc;
Packit 98cdb6
      RECT rect;
Packit 98cdb6
      XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
      if (is_combo_box_child (widget))
Packit 98cdb6
        {
Packit 98cdb6
          FillRect (dc, &rect, GetSysColorBrush (COLOR_WINDOW));
Packit 98cdb6
        }
Packit 98cdb6
      else if (is_popup_window_child (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  FrameRect (dc, &rect, GetSysColorBrush (COLOR_WINDOWFRAME));
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  switch (shadow_type)
Packit 98cdb6
	    {
Packit 98cdb6
	    case GTK_SHADOW_IN:
Packit 98cdb6
	      draw_3d_border (dc, &rect, TRUE);
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_SHADOW_OUT:
Packit 98cdb6
	      draw_3d_border (dc, &rect, FALSE);
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_SHADOW_ETCHED_IN:
Packit 98cdb6
	      draw_3d_border (dc, &rect, TRUE);
Packit 98cdb6
	      InflateRect (&rect, -1, -1);
Packit 98cdb6
	      draw_3d_border (dc, &rect, FALSE);
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_SHADOW_ETCHED_OUT:
Packit 98cdb6
	      draw_3d_border (dc, &rect, FALSE);
Packit 98cdb6
	      InflateRect (&rect, -1, -1);
Packit 98cdb6
	      draw_3d_border (dc, &rect, TRUE);
Packit 98cdb6
	      break;
Packit 98cdb6
Packit 98cdb6
	    case GTK_SHADOW_NONE:
Packit 98cdb6
	      break;
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
  if (DETAIL("entry") || DETAIL("combobox"))
Packit 98cdb6
    {
Packit 98cdb6
      if (shadow_type != GTK_SHADOW_IN)
Packit 98cdb6
	return;
Packit 98cdb6
Packit 98cdb6
      if (!xp_theme_draw (window, XP_THEME_ELEMENT_EDIT_TEXT, style,
Packit 98cdb6
			  x, y, width, height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  HDC dc;
Packit 98cdb6
	  RECT rect;
Packit 98cdb6
	  XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
	  dc = get_window_dc (style, window, state_type, &dc_info,
Packit 98cdb6
			      x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
	  DrawEdge (dc, &rect, EDGE_SUNKEN, BF_RECT);
Packit 98cdb6
	  release_window_dc (&dc_info);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("scrolled_window") &&
Packit 98cdb6
      xp_theme_draw (window, XP_THEME_ELEMENT_EDIT_TEXT, style,
Packit 98cdb6
		     x, y, width, height, state_type, area))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("spinbutton"))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("menu"))
Packit 98cdb6
    {
Packit 98cdb6
      if (draw_menu_border (window, style, x, y, width, height))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("handlebox"))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  is_handlebox = (DETAIL("handlebox_bin"));
Packit 98cdb6
  is_toolbar = (DETAIL("toolbar") || DETAIL("menubar"));
Packit 98cdb6
Packit 98cdb6
  if (is_toolbar || is_handlebox)
Packit 98cdb6
    {
Packit 98cdb6
      if (shadow_type == GTK_SHADOW_NONE)
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (widget)
Packit 98cdb6
	{
Packit 98cdb6
	  HDC dc;
Packit 98cdb6
	  RECT rect;
Packit 98cdb6
	  XpDCInfo dc_info;
Packit 98cdb6
	  HGDIOBJ old_pen = NULL;
Packit 98cdb6
	  GtkPositionType pos;
Packit 98cdb6
Packit 98cdb6
	  sanitize_size (window, &width, &height);
Packit 98cdb6
Packit 98cdb6
	  if (is_handlebox)
Packit 98cdb6
	    {
Packit 98cdb6
	      pos = gtk_handle_box_get_handle_position (GTK_HANDLE_BOX (widget));
Packit 98cdb6
	      /*
Packit 98cdb6
	         If the handle box is at left side,
Packit 98cdb6
	         we shouldn't draw its right border.
Packit 98cdb6
	         The same holds true for top, right, and bottom.
Packit 98cdb6
	       */
Packit 98cdb6
	      switch (pos)
Packit 98cdb6
		{
Packit 98cdb6
		case GTK_POS_LEFT:
Packit 98cdb6
		  pos = GTK_POS_RIGHT;
Packit 98cdb6
		  break;
Packit 98cdb6
Packit 98cdb6
		case GTK_POS_RIGHT:
Packit 98cdb6
		  pos = GTK_POS_LEFT;
Packit 98cdb6
		  break;
Packit 98cdb6
Packit 98cdb6
		case GTK_POS_TOP:
Packit 98cdb6
		  pos = GTK_POS_BOTTOM;
Packit 98cdb6
		  break;
Packit 98cdb6
Packit 98cdb6
		case GTK_POS_BOTTOM:
Packit 98cdb6
		  pos = GTK_POS_TOP;
Packit 98cdb6
		  break;
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      GtkWidget *parent = gtk_widget_get_parent (widget);
Packit 98cdb6
Packit 98cdb6
	      /* Dirty hack for toolbars contained in handle boxes */
Packit 98cdb6
	      if (GTK_IS_HANDLE_BOX (parent))
Packit 98cdb6
		{
Packit 98cdb6
		  pos = gtk_handle_box_get_handle_position (GTK_HANDLE_BOX (parent));
Packit 98cdb6
		}
Packit 98cdb6
	      else
Packit 98cdb6
		{
Packit 98cdb6
		  /*
Packit 98cdb6
		     Dirty hack:
Packit 98cdb6
		     Make pos != all legal enum vaules of GtkPositionType.
Packit 98cdb6
		     So every border will be draw.
Packit 98cdb6
		   */
Packit 98cdb6
		  pos = (GtkPositionType) - 1;
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
	  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
	  if (pos != GTK_POS_LEFT)
Packit 98cdb6
	    {
Packit 98cdb6
	      old_pen = SelectObject (dc, get_light_pen ());
Packit 98cdb6
	      MoveToEx (dc, rect.left, rect.top, NULL);
Packit 98cdb6
	      LineTo (dc, rect.left, rect.bottom);
Packit 98cdb6
	    }
Packit 98cdb6
	  if (pos != GTK_POS_TOP)
Packit 98cdb6
	    {
Packit 98cdb6
	      old_pen = SelectObject (dc, get_light_pen ());
Packit 98cdb6
	      MoveToEx (dc, rect.left, rect.top, NULL);
Packit 98cdb6
	      LineTo (dc, rect.right, rect.top);
Packit 98cdb6
	    }
Packit 98cdb6
	  if (pos != GTK_POS_RIGHT)
Packit 98cdb6
	    {
Packit 98cdb6
	      old_pen = SelectObject (dc, get_dark_pen ());
Packit 98cdb6
	      MoveToEx (dc, rect.right - 1, rect.top, NULL);
Packit 98cdb6
	      LineTo (dc, rect.right - 1, rect.bottom);
Packit 98cdb6
	    }
Packit 98cdb6
	  if (pos != GTK_POS_BOTTOM)
Packit 98cdb6
	    {
Packit 98cdb6
	      old_pen = SelectObject (dc, get_dark_pen ());
Packit 98cdb6
	      MoveToEx (dc, rect.left, rect.bottom - 1, NULL);
Packit 98cdb6
	      LineTo (dc, rect.right, rect.bottom - 1);
Packit 98cdb6
	    }
Packit 98cdb6
	  if (old_pen)
Packit 98cdb6
	    SelectObject (dc, old_pen);
Packit 98cdb6
	  release_window_dc (&dc_info);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (DETAIL("statusbar"))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_shadow (style, window, state_type, shadow_type, area,
Packit 98cdb6
			     widget, detail, x, y, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_hline (GtkStyle *style,
Packit 98cdb6
	    GdkWindow *window,
Packit 98cdb6
	    GtkStateType state_type,
Packit 98cdb6
	    GdkRectangle *area,
Packit 98cdb6
	    GtkWidget *widget,
Packit 98cdb6
	    const gchar *detail, gint x1, gint x2, gint y)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  
Packit 98cdb6
  cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
  if (xp_theme_is_active () && DETAIL("menuitem"))
Packit 98cdb6
    {
Packit 98cdb6
      gint cx, cy;
Packit 98cdb6
      gint new_y, new_height;
Packit 98cdb6
      gint y_offset;
Packit 98cdb6
Packit 98cdb6
      xp_theme_get_element_dimensions (XP_THEME_ELEMENT_MENU_SEPARATOR,
Packit 98cdb6
				       state_type,
Packit 98cdb6
				       &cx, &cy);
Packit 98cdb6
Packit 98cdb6
      /* Center the separator */
Packit 98cdb6
      y_offset = (area->height / 2) - (cy / 2);
Packit 98cdb6
      new_y = y_offset >= 0 ? area->y + y_offset : area->y;
Packit 98cdb6
      new_height = cy;
Packit 98cdb6
Packit 98cdb6
      if (xp_theme_draw
Packit 98cdb6
	  (window, XP_THEME_ELEMENT_MENU_SEPARATOR, style, x1, new_y, x2, new_height,
Packit 98cdb6
	   state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  if (area)
Packit 98cdb6
	    {
Packit 98cdb6
              gdk_cairo_rectangle (cr, area);
Packit 98cdb6
              cairo_clip (cr);
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
          _cairo_draw_line (cr, &style->dark[state_type], x1, y, x2, y);
Packit 98cdb6
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      if (style->ythickness == 2)
Packit 98cdb6
	{
Packit 98cdb6
	  if (area)
Packit 98cdb6
	    {
Packit 98cdb6
              gdk_cairo_rectangle (cr, area);
Packit 98cdb6
              cairo_clip (cr);
Packit 98cdb6
	    }
Packit 98cdb6
Packit 98cdb6
          _cairo_draw_line (cr, &style->dark[state_type], x1, y, x2, y);
Packit 98cdb6
	  ++y;
Packit 98cdb6
          _cairo_draw_line (cr, &style->light[state_type], x1, y, x2, y);
Packit 98cdb6
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  parent_class->draw_hline (style, window, state_type, area, widget,
Packit 98cdb6
				    detail, x1, x2, y);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_vline (GtkStyle *style,
Packit 98cdb6
	    GdkWindow *window,
Packit 98cdb6
	    GtkStateType state_type,
Packit 98cdb6
	    GdkRectangle *area,
Packit 98cdb6
	    GtkWidget *widget,
Packit 98cdb6
	    const gchar *detail, gint y1, gint y2, gint x)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  
Packit 98cdb6
  cr = gdk_cairo_create (window);
Packit 98cdb6
Packit 98cdb6
  if (style->xthickness == 2)
Packit 98cdb6
    {
Packit 98cdb6
      if (area)
Packit 98cdb6
	{
Packit 98cdb6
              gdk_cairo_rectangle (cr, area);
Packit 98cdb6
              cairo_clip (cr);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      _cairo_draw_line (cr, &style->dark[state_type], x, y1, x, y2);
Packit 98cdb6
      ++x;
Packit 98cdb6
      _cairo_draw_line (cr, &style->light[state_type], x, y1, x, y2);
Packit 98cdb6
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      parent_class->draw_vline (style, window, state_type, area, widget,
Packit 98cdb6
				detail, y1, y2, x);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  cairo_destroy (cr);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_slider (GtkStyle *style,
Packit 98cdb6
	     GdkWindow *window,
Packit 98cdb6
	     GtkStateType state_type,
Packit 98cdb6
	     GtkShadowType shadow_type,
Packit 98cdb6
	     GdkRectangle *area,
Packit 98cdb6
	     GtkWidget *widget,
Packit 98cdb6
	     const gchar *detail,
Packit 98cdb6
	     gint x,
Packit 98cdb6
	     gint y, gint width, gint height, GtkOrientation orientation)
Packit 98cdb6
{
Packit 98cdb6
  if (GTK_IS_SCALE (widget) &&
Packit 98cdb6
      xp_theme_draw (window, ((orientation == GTK_ORIENTATION_VERTICAL) ?
Packit 98cdb6
			      XP_THEME_ELEMENT_SCALE_SLIDER_V :
Packit 98cdb6
			      XP_THEME_ELEMENT_SCALE_SLIDER_H), style, x, y, width,
Packit 98cdb6
		     height, state_type, area))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_slider (style, window, state_type, shadow_type, area,
Packit 98cdb6
			     widget, detail, x, y, width, height,
Packit 98cdb6
			     orientation);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_resize_grip (GtkStyle *style,
Packit 98cdb6
		  GdkWindow *window,
Packit 98cdb6
		  GtkStateType state_type,
Packit 98cdb6
		  GdkRectangle *area,
Packit 98cdb6
		  GtkWidget *widget,
Packit 98cdb6
		  const gchar *detail,
Packit 98cdb6
		  GdkWindowEdge edge, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  cairo_t *cr;
Packit 98cdb6
  
Packit 98cdb6
  cr = gdk_cairo_create (window);
Packit 98cdb6
  
Packit 98cdb6
  if (DETAIL("statusbar"))
Packit 98cdb6
    {
Packit 98cdb6
      if (xp_theme_draw
Packit 98cdb6
	  (window, XP_THEME_ELEMENT_STATUS_GRIPPER, style, x, y, width,
Packit 98cdb6
	   height, state_type, area))
Packit 98cdb6
	{
Packit 98cdb6
          cairo_destroy (cr);
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  RECT rect;
Packit 98cdb6
	  XpDCInfo dc_info;
Packit 98cdb6
	  HDC dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
	  if (area)
Packit 98cdb6
            {
Packit 98cdb6
              gdk_cairo_rectangle (cr, area);
Packit 98cdb6
              cairo_clip (cr);
Packit 98cdb6
              gdk_cairo_set_source_color (cr, &style->dark[state_type]);
Packit 98cdb6
            }
Packit 98cdb6
Packit 98cdb6
	  DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
Packit 98cdb6
	  release_window_dc (&dc_info);
Packit 98cdb6
Packit 98cdb6
          cairo_destroy (cr);
Packit 98cdb6
	  return;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_resize_grip (style, window, state_type, area,
Packit 98cdb6
				  widget, detail, edge, x, y, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_handle (GtkStyle      *style,
Packit 98cdb6
             GdkWindow     *window,
Packit 98cdb6
             GtkStateType   state_type,
Packit 98cdb6
             GtkShadowType  shadow_type,
Packit 98cdb6
             GdkRectangle  *area,
Packit 98cdb6
             GtkWidget     *widget,
Packit 98cdb6
             const gchar   *detail,
Packit 98cdb6
             gint           x,
Packit 98cdb6
             gint           y,
Packit 98cdb6
             gint           width,
Packit 98cdb6
             gint           height,
Packit 98cdb6
             GtkOrientation orientation)
Packit 98cdb6
{
Packit 98cdb6
  if (is_toolbar_child (widget))
Packit 98cdb6
    {
Packit 98cdb6
      HDC dc;
Packit 98cdb6
      RECT rect;
Packit 98cdb6
      XpDCInfo dc_info;
Packit 98cdb6
      XpThemeElement hndl;
Packit 98cdb6
Packit 98cdb6
      sanitize_size (window, &width, &height);
Packit 98cdb6
Packit 98cdb6
      if (GTK_IS_HANDLE_BOX (widget))
Packit 98cdb6
	{
Packit 98cdb6
	  GtkPositionType pos;
Packit 98cdb6
	  pos = gtk_handle_box_get_handle_position (GTK_HANDLE_BOX (widget));
Packit 98cdb6
Packit 98cdb6
	  if (pos == GTK_POS_TOP || pos == GTK_POS_BOTTOM)
Packit 98cdb6
	      orientation = GTK_ORIENTATION_HORIZONTAL;
Packit 98cdb6
	  else
Packit 98cdb6
	      orientation = GTK_ORIENTATION_VERTICAL;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      if (orientation == GTK_ORIENTATION_VERTICAL)
Packit 98cdb6
	hndl = XP_THEME_ELEMENT_REBAR_GRIPPER_V;
Packit 98cdb6
      else
Packit 98cdb6
	hndl = XP_THEME_ELEMENT_REBAR_GRIPPER_H;
Packit 98cdb6
Packit 98cdb6
      if (xp_theme_draw (window, hndl, style, x, y, width, height, state_type, area))
Packit 98cdb6
	return;
Packit 98cdb6
Packit 98cdb6
      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
Packit 98cdb6
      if (orientation == GTK_ORIENTATION_VERTICAL)
Packit 98cdb6
	{
Packit 98cdb6
	  rect.left += 3;
Packit 98cdb6
	  rect.right = rect.left + 3;
Packit 98cdb6
	  rect.bottom -= 3;
Packit 98cdb6
	  rect.top += 3;
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  rect.top += 3;
Packit 98cdb6
	  rect.bottom = rect.top + 3;
Packit 98cdb6
	  rect.right -= 3;
Packit 98cdb6
	  rect.left += 3;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      draw_3d_border (dc, &rect, FALSE);
Packit 98cdb6
      release_window_dc (&dc_info);
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_focus (GtkStyle *style,
Packit 98cdb6
	    GdkWindow *window,
Packit 98cdb6
	    GtkStateType state_type,
Packit 98cdb6
	    GdkRectangle *area,
Packit 98cdb6
	    GtkWidget *widget,
Packit 98cdb6
	    const gchar *detail, gint x, gint y, gint width, gint height)
Packit 98cdb6
{
Packit 98cdb6
  HDC dc;
Packit 98cdb6
  RECT rect;
Packit 98cdb6
  XpDCInfo dc_info;
Packit 98cdb6
Packit 98cdb6
  if (!gtk_widget_get_can_focus (widget))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (is_combo_box_child (widget)
Packit 98cdb6
      && (GTK_IS_ARROW (widget) || GTK_IS_BUTTON (widget)))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
  if (GTK_IS_TREE_VIEW (widget->parent)	/* list view bheader */
Packit 98cdb6
      || GTK_IS_CLIST (widget->parent))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
Packit 98cdb6
  DrawFocusRect (dc, &rect);
Packit 98cdb6
  release_window_dc (&dc_info);
Packit 98cdb6
/*
Packit 98cdb6
    parent_class->draw_focus (style, window, state_type,
Packit 98cdb6
						     area, widget, detail, x, y, width, height);
Packit 98cdb6
*/
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
draw_layout (GtkStyle *style,
Packit 98cdb6
	     GdkWindow *window,
Packit 98cdb6
	     GtkStateType state_type,
Packit 98cdb6
	     gboolean use_text,
Packit 98cdb6
	     GdkRectangle *area,
Packit 98cdb6
	     GtkWidget *widget,
Packit 98cdb6
	     const gchar *detail,
Packit 98cdb6
	     gint old_x, gint old_y, PangoLayout *layout)
Packit 98cdb6
{
Packit 98cdb6
  GtkNotebook *notebook = NULL;
Packit 98cdb6
  gint x = old_x;
Packit 98cdb6
  gint y = old_y;
Packit 98cdb6
Packit 98cdb6
  /* In the XP theme, labels don't appear correctly centered inside
Packit 98cdb6
   * notebook tabs, so we give them a gentle nudge two pixels to the
Packit 98cdb6
   * right.  A little hackish, but what are 'ya gonna do?  -- Cody
Packit 98cdb6
   */
Packit 98cdb6
  if (xp_theme_is_active () && DETAIL("label"))
Packit 98cdb6
    {
Packit 98cdb6
      if (widget->parent != NULL)
Packit 98cdb6
	{
Packit 98cdb6
	  if (GTK_IS_NOTEBOOK (widget->parent))
Packit 98cdb6
	    {
Packit 98cdb6
	      int side;
Packit 98cdb6
	      notebook = GTK_NOTEBOOK (widget->parent);
Packit 98cdb6
	      side = gtk_notebook_get_tab_pos (notebook);
Packit 98cdb6
Packit 98cdb6
	      if (side == GTK_POS_TOP || side == GTK_POS_BOTTOM)
Packit 98cdb6
		{
Packit 98cdb6
		  x += 2;
Packit 98cdb6
		}
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_class->draw_layout (style, window, state_type,
Packit 98cdb6
			     use_text, area, widget, detail, x, y, layout);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
msw_style_init_from_rc (GtkStyle *style, GtkRcStyle *rc_style)
Packit 98cdb6
{
Packit 98cdb6
  setup_system_font (style);
Packit 98cdb6
  setup_menu_settings (gtk_settings_get_default ());
Packit 98cdb6
  setup_system_styles (style);
Packit 98cdb6
  parent_class->init_from_rc (style, rc_style);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
msw_style_class_init (MswStyleClass *klass)
Packit 98cdb6
{
Packit 98cdb6
  GtkStyleClass *style_class = GTK_STYLE_CLASS (klass);
Packit 98cdb6
Packit 98cdb6
  parent_class = g_type_class_peek_parent (klass);
Packit 98cdb6
Packit 98cdb6
  style_class->init_from_rc = msw_style_init_from_rc;
Packit 98cdb6
  style_class->draw_arrow = draw_arrow;
Packit 98cdb6
  style_class->draw_box = draw_box;
Packit 98cdb6
  style_class->draw_check = draw_check;
Packit 98cdb6
  style_class->draw_option = draw_option;
Packit 98cdb6
  style_class->draw_tab = draw_tab;
Packit 98cdb6
  style_class->draw_flat_box = draw_flat_box;
Packit 98cdb6
  style_class->draw_expander = draw_expander;
Packit 98cdb6
  style_class->draw_extension = draw_extension;
Packit 98cdb6
  style_class->draw_box_gap = draw_box_gap;
Packit 98cdb6
  style_class->draw_shadow = draw_shadow;
Packit 98cdb6
  style_class->draw_hline = draw_hline;
Packit 98cdb6
  style_class->draw_vline = draw_vline;
Packit 98cdb6
  style_class->draw_handle = draw_handle;
Packit 98cdb6
  style_class->draw_resize_grip = draw_resize_grip;
Packit 98cdb6
  style_class->draw_slider = draw_slider;
Packit 98cdb6
  style_class->draw_focus = draw_focus;
Packit 98cdb6
  style_class->draw_layout = draw_layout;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GType msw_type_style = 0;
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
msw_style_register_type (GTypeModule *module)
Packit 98cdb6
{
Packit 98cdb6
  const GTypeInfo object_info = {
Packit 98cdb6
    sizeof (MswStyleClass),
Packit 98cdb6
    (GBaseInitFunc) NULL,
Packit 98cdb6
    (GBaseFinalizeFunc) NULL,
Packit 98cdb6
    (GClassInitFunc) msw_style_class_init,
Packit 98cdb6
    NULL,			/* class_finalize */
Packit 98cdb6
    NULL,			/* class_data */
Packit 98cdb6
    sizeof (MswStyle),
Packit 98cdb6
    0,				/* n_preallocs */
Packit 98cdb6
    (GInstanceInitFunc) NULL,
Packit 98cdb6
  };
Packit 98cdb6
Packit 98cdb6
  msw_type_style = g_type_module_register_type (module,
Packit 98cdb6
						GTK_TYPE_STYLE,
Packit 98cdb6
						"MswStyle", &object_info, 0);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
msw_style_init (void)
Packit 98cdb6
{
Packit 98cdb6
  xp_theme_init ();
Packit 98cdb6
  msw_style_setup_system_settings ();
Packit 98cdb6
  setup_msw_rc_style ();
Packit 98cdb6
Packit 98cdb6
  if (g_light_pen)
Packit 98cdb6
    {
Packit 98cdb6
      DeleteObject (g_light_pen);
Packit 98cdb6
      g_light_pen = NULL;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (g_dark_pen)
Packit 98cdb6
    {
Packit 98cdb6
      DeleteObject (g_dark_pen);
Packit 98cdb6
      g_dark_pen = NULL;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
msw_style_finalize (void)
Packit 98cdb6
{
Packit 98cdb6
  if (g_dither_brush)
Packit 98cdb6
    {
Packit 98cdb6
      DeleteObject (g_dither_brush);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (g_light_pen)
Packit 98cdb6
    {
Packit 98cdb6
      DeleteObject (g_light_pen);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (g_dark_pen)
Packit 98cdb6
    {
Packit 98cdb6
      DeleteObject (g_dark_pen);
Packit 98cdb6
    }
Packit 98cdb6
}