Add multi-monitor offset. (#141842, John Ehresman)

2004-05-05  Tor Lillqvist  <tml@iki.fi>

	* gdk/win32/gdkdnd-win32.c (gdk_drag_find_window_for_screen): Add
	multi-monitor offset. (#141842, John Ehresman)
This commit is contained in:
Tor Lillqvist
2004-05-05 02:29:36 +00:00
committed by Tor Lillqvist
parent 9da7e8bde3
commit e69970bd65
41 changed files with 22 additions and 10335 deletions

View File

@@ -1,3 +1,8 @@
2004-05-05 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkdnd-win32.c (gdk_drag_find_window_for_screen): Add
multi-monitor offset. (#141842, John Ehresman)
2004-05-04 Federico Mena Quintero <federico@ximian.com>
Fixes #139562, based on a patch by Christian Neumair.

View File

@@ -1,3 +1,8 @@
2004-05-05 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkdnd-win32.c (gdk_drag_find_window_for_screen): Add
multi-monitor offset. (#141842, John Ehresman)
2004-05-04 Federico Mena Quintero <federico@ximian.com>
Fixes #139562, based on a patch by Christian Neumair.

View File

@@ -1,3 +1,8 @@
2004-05-05 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkdnd-win32.c (gdk_drag_find_window_for_screen): Add
multi-monitor offset. (#141842, John Ehresman)
2004-05-04 Federico Mena Quintero <federico@ximian.com>
Fixes #139562, based on a patch by Christian Neumair.

View File

@@ -1,3 +1,8 @@
2004-05-05 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkdnd-win32.c (gdk_drag_find_window_for_screen): Add
multi-monitor offset. (#141842, John Ehresman)
2004-05-04 Federico Mena Quintero <federico@ximian.com>
Fixes #139562, based on a patch by Christian Neumair.

View File

@@ -1,392 +0,0 @@
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <gtk/gtk.h>
#include <demos.h>
static GtkTextBuffer *info_buffer;
static GtkTextBuffer *source_buffer;
static gchar *current_file = NULL;
enum {
TITLE_COLUMN,
FILENAME_COLUMN,
FUNC_COLUMN,
ITALIC_COLUMN,
NUM_COLUMNS
};
gboolean
read_line (FILE *stream, GString *str)
{
int n_read = 0;
flockfile (stream);
g_string_truncate (str, 0);
while (1)
{
int c;
c = getc_unlocked (stream);
if (c == EOF)
goto done;
else
n_read++;
switch (c)
{
case '\r':
case '\n':
{
int next_c = getc_unlocked (stream);
if (!(next_c == EOF ||
(c == '\r' && next_c == '\n') ||
(c == '\n' && next_c == '\r')))
ungetc (next_c, stream);
goto done;
}
default:
g_string_append_c (str, c);
}
}
done:
funlockfile (stream);
return n_read > 0;
}
void
load_file (const gchar *filename)
{
FILE *file;
GtkTextIter start, end;
GString *buffer = g_string_new (NULL);
int state = 0;
gboolean in_para = 0;
if (current_file && !strcmp (current_file, filename))
return;
g_free (current_file);
current_file = g_strdup (filename);
gtk_text_buffer_get_bounds (info_buffer, &start, &end);
gtk_text_buffer_delete (info_buffer, &start, &end);
gtk_text_buffer_get_bounds (source_buffer, &start, &end);
gtk_text_buffer_delete (source_buffer, &start, &end);
file = fopen (filename, "r");
if (!file)
{
g_warning ("Cannot open %s: %s\n", filename, g_strerror (errno));
return;
}
gtk_text_buffer_get_iter_at_offset (info_buffer, &start, 0);
while (read_line (file, buffer))
{
gchar *p = buffer->str;
gchar *q;
switch (state)
{
case 0:
/* Reading title */
while (*p == '/' || *p == '*' || isspace (*p))
p++;
q = p + strlen (p);
while (q > p && isspace (*(q - 1)))
q--;
if (q > p)
{
int len_chars = g_utf8_pointer_to_offset (p, q);
end = start;
g_assert (strlen (p) >= q - p);
gtk_text_buffer_insert (info_buffer, &end, p, q - p);
start = end;
gtk_text_iter_backward_chars (&start, len_chars);
gtk_text_buffer_apply_tag_by_name (info_buffer, "title", &start, &end);
start = end;
state++;
}
break;
case 1:
/* Reading body of info section */
while (isspace (*p))
p++;
if (*p == '*' && *(p + 1) == '/')
{
gtk_text_buffer_get_iter_at_offset (source_buffer, &start, 0);
state++;
}
else
{
int len;
while (*p == '*' || isspace (*p))
p++;
len = strlen (p);
while (isspace (*(p + len - 1)))
len--;
if (len > 0)
{
if (in_para)
gtk_text_buffer_insert (info_buffer, &start, " ", 1);
g_assert (strlen (p) >= len);
gtk_text_buffer_insert (info_buffer, &start, p, len);
in_para = 1;
}
else
{
gtk_text_buffer_insert (info_buffer, &start, "\n", 1);
in_para = 0;
}
}
break;
case 2:
/* Skipping blank lines */
while (isspace (*p))
p++;
if (*p)
{
p = buffer->str;
state++;
/* Fall through */
}
else
break;
case 3:
/* Reading program body */
gtk_text_buffer_insert (source_buffer, &start, p, -1);
gtk_text_buffer_insert (info_buffer, &start, "\n", 1);
break;
}
}
gtk_text_buffer_get_bounds (source_buffer, &start, &end);
gtk_text_buffer_apply_tag_by_name (info_buffer, "source", &start, &end);
}
gboolean
button_press_event_cb (GtkTreeView *tree_view,
GdkEventButton *event,
GtkTreeModel *model)
{
if (event->type == GDK_2BUTTON_PRESS)
{
GtkTreePath *path = NULL;
gtk_tree_view_get_path_at_pos (tree_view,
event->window,
event->x,
event->y,
&path,
NULL);
if (path)
{
GtkTreeIter iter;
gboolean italic;
GVoidFunc func;
gtk_tree_model_get_iter (model, &iter, path);
gtk_tree_store_get (GTK_TREE_STORE (model),
&iter,
FUNC_COLUMN, &func,
ITALIC_COLUMN, &italic,
-1);
(func) ();
gtk_tree_store_set (GTK_TREE_STORE (model),
&iter,
ITALIC_COLUMN, !italic,
-1);
gtk_tree_path_free (path);
}
gtk_signal_emit_stop_by_name (GTK_OBJECT (tree_view),
"button_press_event");
return TRUE;
}
return FALSE;
}
static void
selection_cb (GtkTreeSelection *selection,
GtkTreeModel *model)
{
GtkTreeIter iter;
GValue value = {0, };
if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
return;
gtk_tree_model_get_value (model, &iter,
FILENAME_COLUMN,
&value);
load_file (g_value_get_string (&value));
g_value_unset (&value);
}
static GtkWidget *
create_text (GtkTextBuffer **buffer,
gboolean is_source)
{
GtkWidget *scrolled_window;
GtkWidget *text_view;
PangoFontDescription *font_desc;
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_SHADOW_IN);
text_view = gtk_text_view_new ();
gtk_container_add (GTK_CONTAINER (scrolled_window), text_view);
*buffer = gtk_text_buffer_new (NULL);
gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), *buffer);
gtk_text_view_set_editable (GTK_TEXT_VIEW (text_view), FALSE);
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE);
if (is_source)
{
font_desc = pango_font_description_from_string ("Courier 10");
gtk_widget_modify_font (text_view, font_desc);
pango_font_description_free (font_desc);
}
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text_view), !is_source);
return scrolled_window;
}
/* Technically a list, but if we do go to 80 demos, we may want to move to a tree */
static GtkWidget *
create_tree (void)
{
GtkTreeSelection *selection;
GtkCellRenderer *cell;
GtkWidget *tree_view;
GtkTreeViewColumn *column;
GtkTreeStore *model;
GtkTreeIter iter;
gint i;
model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection),
GTK_TREE_SELECTION_SINGLE);
gtk_widget_set_usize (tree_view, 200, -1);
for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
{
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
gtk_tree_store_set (GTK_TREE_STORE (model),
&iter,
TITLE_COLUMN, testgtk_demos[i].title,
FILENAME_COLUMN, testgtk_demos[i].filename,
FUNC_COLUMN, testgtk_demos[i].func,
ITALIC_COLUMN, FALSE,
-1);
}
cell = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes ("Widget",
cell,
"text", TITLE_COLUMN,
"italic", ITALIC_COLUMN,
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),
GTK_TREE_VIEW_COLUMN (column));
gtk_signal_connect (GTK_OBJECT (selection), "selection_changed", selection_cb, model);
gtk_signal_connect (GTK_OBJECT (tree_view), "button_press_event", GTK_SIGNAL_FUNC (button_press_event_cb), model);
return tree_view;
}
int
main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *notebook;
GtkWidget *hbox;
GtkWidget *tree;
GtkTextTag *tag;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), hbox);
tree = create_tree ();
gtk_box_pack_start (GTK_BOX (hbox), tree, FALSE, FALSE, 0);
notebook = gtk_notebook_new ();
gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_text (&info_buffer, FALSE),
gtk_label_new ("Info"));
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_text (&source_buffer, TRUE),
gtk_label_new ("Source"));
tag = gtk_text_buffer_create_tag (info_buffer, "title");
gtk_object_set (GTK_OBJECT (tag),
"font", "Sans 18",
NULL);
tag = gtk_text_buffer_create_tag (info_buffer, "source");
gtk_object_set (GTK_OBJECT (tag),
"font", "Courier 10",
"pixels_above_lines", 0,
"pixels_below_lines", 0,
NULL);
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
gtk_widget_show_all (window);
load_file (testgtk_demos[0].filename);
gtk_main ();
return 0;
}

View File

@@ -1362,8 +1362,8 @@ gdk_drag_find_window_for_screen (GdkDragContext *context,
{
find_window_enum_arg a;
a.x = x_root;
a.y = y_root;
a.x = x_root - _gdk_offset_x;
a.y = y_root - _gdk_offset_y;
a.ignore = drag_window ? GDK_WINDOW_HWND (drag_window) : NULL;
a.result = NULL;

File diff suppressed because it is too large Load Diff

View File

@@ -1,151 +0,0 @@
/* eggiconlist.h
* Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __EGG_ICON_LIST_H__
#define __EGG_ICON_LIST_H__
#include <gtk/gtkcontainer.h>
G_BEGIN_DECLS
#define EGG_TYPE_ICON_LIST (egg_icon_list_get_type ())
#define EGG_ICON_LIST(obj) (GTK_CHECK_CAST ((obj), EGG_TYPE_ICON_LIST, EggIconList))
#define EGG_ICON_LIST_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EGG_TYPE_ICON_LIST, EggIconListClass))
#define EGG_IS_ICON_LIST(obj) (GTK_CHECK_TYPE ((obj), EGG_TYPE_ICON_LIST))
#define EGG_IS_ICON_LIST_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), EGG_TYPE_ICON_LIST))
#define EGG_ICON_LIST_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), EGG_TYPE_ICON_LIST, EggIconListClass))
#define EGG_TYPE_ICON_LIST_ITEM (egg_icon_list_item_get_type ())
typedef struct _EggIconList EggIconList;
typedef struct _EggIconListClass EggIconListClass;
typedef struct _EggIconListPrivate EggIconListPrivate;
typedef struct _EggIconListItem EggIconListItem;
typedef void (* EggIconListForeachFunc) (EggIconList *icon_list,
EggIconListItem *item,
gpointer data);
typedef gint (* EggIconListItemCompareFunc) (EggIconList *icon_list,
EggIconListItem *a,
EggIconListItem *b,
gpointer user_data);
struct _EggIconList
{
GtkContainer parent;
EggIconListPrivate *priv;
};
struct _EggIconListClass
{
GtkContainerClass parent_class;
void (* set_scroll_adjustments) (EggIconList *icon_list,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
void (* item_activated) (EggIconList *icon_list,
EggIconListItem *item);
void (* selection_changed) (EggIconList *icon_list);
void (* item_added) (EggIconList *icon_list,
EggIconListItem *item);
void (* item_removed) (EggIconList *icon_list,
EggIconListItem *item);
void (* item_changed) (EggIconList *icon_list,
EggIconListItem *item);
/* Key binding signals */
void (* select_all) (EggIconList *icon_list);
void (* unselect_all) (EggIconList *icon_list);
void (* select_cursor_item) (EggIconList *icon_list);
void (* toggle_cursor_item) (EggIconList *icon_list);
};
GType egg_icon_list_get_type (void);
GType egg_icon_list_item_get_type (void);
GtkWidget *egg_icon_list_new (void);
EggIconListItem * egg_icon_list_item_new (GdkPixbuf *icon,
const gchar *label);
void egg_icon_list_item_ref (EggIconListItem *item);
void egg_icon_list_item_unref (EggIconListItem *item);
void egg_icon_list_item_set_data (EggIconListItem *item,
gpointer data);
void egg_icon_list_item_set_data_full (EggIconListItem *item,
gpointer data,
GDestroyNotify destroy_notify);
gpointer egg_icon_list_item_get_data (EggIconListItem *item);
void egg_icon_list_item_set_label (EggIconListItem *item,
const char *label);
G_CONST_RETURN gchar *egg_icon_list_item_get_label (EggIconListItem *item);
void egg_icon_list_item_set_icon (EggIconListItem *item,
GdkPixbuf *icon);
GdkPixbuf * egg_icon_list_item_get_icon (EggIconListItem *item);
void egg_icon_list_append_item (EggIconList *icon_list,
EggIconListItem *item);
void egg_icon_list_prepend_item (EggIconList *icon_list,
EggIconListItem *item);
void egg_icon_list_insert_item_before (EggIconList *icon_list,
EggIconListItem *sibling,
EggIconListItem *item);
void egg_icon_list_insert_item_after (EggIconList *icon_list,
EggIconListItem *sibling,
EggIconListItem *item);
void egg_icon_list_remove_item (EggIconList *icon_list,
EggIconListItem *item);
void egg_icon_list_clear (EggIconList *icon_list);
EggIconListItem * egg_icon_list_get_item_at_pos (EggIconList *icon_list,
gint x,
gint y);
gint egg_icon_list_get_item_count (EggIconList *icon_list);
void egg_icon_list_foreach (EggIconList *icon_list,
EggIconListForeachFunc func,
gpointer data);
GList * egg_icon_list_get_selected (EggIconList *icon_list);
void egg_icon_list_selected_foreach (EggIconList *icon_list,
EggIconListForeachFunc func,
gpointer data);
void egg_icon_list_set_selection_mode (EggIconList *icon_list,
GtkSelectionMode mode);
GtkSelectionMode egg_icon_list_get_selection_mode (EggIconList *icon_list);
void egg_icon_list_select_item (EggIconList *icon_list,
EggIconListItem *item);
void egg_icon_list_unselect_item (EggIconList *icon_list,
EggIconListItem *item);
gboolean egg_icon_list_item_is_selected (EggIconListItem *item);
void egg_icon_list_select_all (EggIconList *icon_list);
void egg_icon_list_unselect_all (EggIconList *icon_list);
void egg_icon_list_set_sorted (EggIconList *icon_list,
gboolean sorted);
gboolean egg_icon_list_get_sorted (EggIconList *icon_list);
void egg_icon_list_set_sort_func (EggIconList *icon_list,
EggIconListItemCompareFunc func,
gpointer data,
GDestroyNotify destroy_notify);
void egg_icon_list_set_sort_order (EggIconList *icon_list,
GtkSortType order);
GtkSortType egg_icon_list_get_sort_order (EggIconList *icon_list);
void egg_icon_list_item_activated (EggIconList *icon_list,
EggIconListItem *item);
/* For accessibility */
GList *egg_icon_list_get_items (EggIconList *icon_list);
G_END_DECLS
#endif /* __EGG_ICON_LIST_H__ */

View File

@@ -1,367 +0,0 @@
2004-03-20 Raymond Penners <raymond@dotsphinx.com>
* all: Renamed GTK-Wimp to MS-Windows Engine
2004-03-11 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.5.4 ===
2004-03-10 Dom Lachowicz <cinamod@hotmail.com>
* configure.in: Bump version number (0.5.4)
2004-02-25 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Fix
http://bugzilla.gnome.org/show_bug.cgi?id=135098
http://sourceforge.net/tracker/index.php?func=detail&aid=895762&group_id=76416&atid=547655
2004-01-25 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.5.3 ===
2004-01-20 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Fix disappearing text in Gimp option menus.
Fix background color on XP menus.
2004-01-20 Dom Lachowicz <cinamod@hotmail.com>
* src/xp_theme.h
* src/xp_theme.c
* src/wimp_style.c: Remove UXTHEME_HAS_LINES stuff. I played around
with line drawing, and the results were absolutely dreadful.
2003-12-30 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c
* src/xp_theme.c
* src/xp_theme.h
* src/xp_theme_defs.h: Toward 853775, get toolbar button borders correct
2003-12-30 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Fix bug 852354 to my liking
2003-12-01 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Fix coloration for the expander's +/- part. Was
the wrong color when selected or selected+insensitive
2003-11-26 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Fix coloration for several GIMP widgets,
specifically their own OptionMenu-like widget.
2003-11-24 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Get the coloration correct for menu bars (XP theme
was showing white foreground instead of gray)
* configure.in: Post-release version number bump
2003-11-19 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.5.2 ===
2003-11-14 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Protect against buffer overflows when grabbing
fonts and generating RC strings. Get the Progress and Status
widget backgrounds to behave properly on themes like "Brick".
2003-11-05 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Toolbar steppers get drawn ETCHED_IN when
pressed now. More consistent with Win32 behavior.
* src/Theme/gtk-2.0/gtkrc: Make menubars have shadow=NONE. More
consistent with Win32 behavior, though Win32 apps tend to differ
in this area. Setup menu and toolbar icon sizes to be compatible
with win32
2003-11-04 Dom Lachowicz <cinamod@hotmail.com>
* src/xp_theme.c: Move Raymond's scrollbar work into wimp_style.c
* src/wimp_style.c: Get the colorations better for other windows
schemes, such as brick. Based on some work by Jernej Simonèiè
<jernej.simoncic@guest.arnes.si>
2003-11-01 Raymond Penners <raymond@dotsphinx.com>
* src/xp_theme.c: Do not display XP scrollbar grippers on tiny
scrollbars.
2003-10-23 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.5.1 ===
2003-10-23 Dom Lachowicz <cinamod@hotmail.com>
* src/xp_theme_defs.h: Update to include definitions for my latest
work.
2003-10-22 Raymond Penners <raymond@dotsphinx.com>
* src/*.[ch]: Code formatting & XP constants renaming.
2003-10-21 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Use theme colors, use theme metrics
(disabled), use theme fonts, theme menu items, menu separators,
draw status bar resize grips.
* src/xp_theme.c: Ditto.
2003-10-20 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: Added grippers to XP scrollbars.
2003-10-20 Dom Lachowicz <cinamod@hotmail.com>
* configure.in: Bump version to the next release number (0.5.1)
2003-10-18 Raymond Penners <raymond@dotsphinx.com>
* src/Theme/gtk-2.0/gtkrc: "GtkToolBar" should read "GtkToolbar"
* src/*: Attempted to fix the grippers for the GNAT Programming
System. Things behave a tiny bit better now. See #ifdef GNATS_HACK
2003-10-17 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: Horizontal/vertical scrollbars were mixed up,
fixed.
2003-04-15 Arnaud Charlet <charlet@ACT-Europe.FR>
* src/*.c: The handling of selected radio button was broken.
* src/xp_theme_defs.h: When building with gcc, the tree expanders
were inverted.
2003-10-08 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.5.0 ===
2003-10-07 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: Tabs not located on top of the notebook are
now (again) no longer rendered using XP theming.
* src/xp_theme.c: Added a more lightweight method to cope with
theme changes. Added a crude theme switch detection scheme in the
case that GTK+ does not implement gdk_window_add_filter properly
(GTK+ 2.2.0?).
2003-10-07 Dom Lachowicz <cinamod@hotmail.com>
* Added new mingw based build system, tidied up other missing bits
* src/xp_theme.c: Tidied up some return cases
2003-10-07 Raymond Penners <raymond@dotsphinx.com>
* src/xp_theme.c: We now properly use IsThemeActive().
* src/xp_theme_defs.h: Renamed from xp_theme_dfns.h
2003-10-06 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style_main.c: Catch system settings changes, disable
theme and color changes as they're too experimental
* src/wimp_style.[ch]: Export some things, make them accept 0 args
* src/xp_theme_dfns.h: New file. WinXP's UXTHEME constants, for
building on platforms without them
* src/xp_theme.c: Should be able to build on Win32 != [WinXP,2k3]
now
2003-10-03 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c wimp_style_main.c: Refactor how we're doing
styles. Much faster, lower memory consumption
2003-10-03 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style_main.c: Catch theme and color changes. Needs more
testing and fine-tuning
2003-10-02 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Deallocate used HDCs
2003-10-01 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Only set the delays if the param is
installed. Silly gtk - installing those 3 params only in the
menus...
2003-09-25 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Set a delay on popdown menus
2003-09-22 Dom Lachowicz <cinamod@hotmail.com>
* src/xp_theme.c: Make a string array const
2003-09-20 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.4.3 ===
* src/wimp_style.c: The Gaim buddy icons were missing due to
recent tree expander changes, not the clipping area. Fixed.
* src/xp_theme.c: Re-enabled clipping area, I am confident it
should not cause any problems now.
2003-09-18 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.4.2 ===
2003-09-16 Dom Lachowicz <cinamod@hotmail.com>
* src/xp_theme.c: Ignore cliprect for now
2003-09-15 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.4.1 ===
* src/wimp_style.c: Fixed typ-o (gtk-double-cliNk-time), adjusted
cursor blink time to cope with Windows semantics (GTK+ uses cycle
time), fixed clipping area computation. Fixed XP tree expanders to
cope with clipping area, and made non-XP tree expanders look
pixel-perfect.
2003-09-15 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Fix a few more console messages, implement
caret blinking
* src/xp_theme.*: Stub out line drawing. Apparently, documented
bits are missing from MS's implementation. Go figure...
2003-09-14 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: Fixed console message complaining about
"default_border".
* src/wimp_style.c: Due to a bug lots of console message
complaining about "unexpected keyword `fg'" occured, fixed.
2003-09-11 Dom Lachowicz <cinamod@hotmail.com>
* src/Theme/gtk-2.0/gtkrc: Remove unused cruft wrt GtkScrollbars
2003-09-11 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.4.0 ===
* src/wimp_style.c: Notebook tabs were no longer properly drawn,
fixed.
2003-09-08 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Honor scrollbar sizes, radio/check button
sizes, paned sizes
2003-09-03 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Honor tooltip color, font
2003-09-02 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: We now honor font preferences being bold or
italic
2003-08-29 Dom Lachowicz <cinamod@hotmail.com>
* src/*.c: Theme GTK toolbar arrows to XP chevrons, once my GTK
patch is committed.
* src/wimp_style.c: Enable proper fonts/sizes for menus, status
bars. Tooltips are waiting for my GTK patches, though.
2003-08-28 Dom Lachowicz <cinamod@hotmail.com>
* src/wimp_style.c: Change how we draw handle boxes in the non-XP
case. This does not yet apply to GtkHandleBoxes
2003-08-26 Dom Lachowicz <cinamod@hotmail.com>
* src/*.c: Tooltips should do XP-style theming. Handle Boxes/Panes
do XP style REBAR theming (TODO: non-XP version of the above for
handleboxes). Toolbars should draw the REBAR part
properly. Preparation for using the Toolbar class. Menubars and
Toolbars now are etched-in to mimic Windows'
behavior. HandleBoxes' shadow types should also be correct now,
compared to OfficeXP applications.
2003-08-26 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.3.0 ===
2003-08-23 Raymond Penners <raymond@dotsphinx.com>
* src/*.c: Merged Dom Lachowicz's patches, now tooltips and
progress bars nicely adhere to the system colors as well.
* src/xp_theme.c: There was a mixup in drawing the proper checkbox
state, fixed (Gaim bug #790305).
2003-08-20 Raymond Penners <raymond@dotsphinx.com>
* src/Theme/gtk-2.0/gtkrc: Disabled the colored, alternating
rules for GtkTreeViews to match the Windows behaviour.
* */Makefile.msc: Provided MS-VC++ make files.
* src/xp_theme.c: The open/close tree expander symbols were
accidentally switched, fixed (Gaim bug #790300).
2003-08-11 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: The menu background color now follows XP's
color scheme.
2003-08-07 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.2.0 ===
2003-08-06 Raymond Penners <raymond@dotsphinx.com>
* src/*.c: Added XP theming support for progress bars.
2003-08-05 Raymond Penners <raymond@dotsphinx.com>
* src/xp_theme.c: Internal redesign: extracted XP specific theming
from wimp_style.c, improved code.
* src/wimp_style.c: Added XP theming support for list headers, and
entry widgets.
2003-08-03 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: Improved system color handling, added XP
theming support for option menus.
2003-04-15 Raymond Penners <raymond@dotsphinx.com>
* src/wimp_style.c: Tabs not located on top of the notebook are
not rendered properly using XP theming. Added fallback to non-XP
theming behaviour if the tabs are not located on top (to be
removed when full notebook support is in).
2003-04-15 Arnaud Charlet <charlet@ACT-Europe.FR>
* src/wimp_style.c: Add handling of expander. Fix colors for combo
box items. Add native rendering of radio buttons. Fix handling of
default buttons. Add native rendering of tree expanders.
2003-03-18 Raymond Penners <raymond@dotsphinx.com>
* === Released 0.1.0 ===

View File

@@ -1,25 +0,0 @@
SUBDIRS=Theme
EXTRA_DIST=Makefile.msc
INCLUDES=$(MSW_CFLAGS)
enginedir=$(libdir)/gtk-2.0/$(GTK_VERSION)/engines
engine_LTLIBRARIES = libms-windows-engine.la
libms_windows_engine_la_SOURCES = \
msw_rc_style.c \
msw_rc_style.h \
msw_style.c \
msw_style.h \
msw_theme_main.c \
xp_theme.c \
xp_theme_defs.h \
xp_theme.h
libms_windows_engine_la_LDFLAGS = \
-avoid-version -module -no-undefined -export-dynamic
libms_windows_engine_la_LIBADD= $(MSW_LIBS)

View File

@@ -1,71 +0,0 @@
# Makefile.msc -- Makefile for MS-VC++ (-*- makefile -*-)
#
# Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
#
# $Id$
!INCLUDE ../Makefile.msc.config
##
# Target
TARGET=libms-windows-engine.dll
OBJS = \
msw_style.obj \
msw_theme_main.obj \
msw_rc_style.obj \
xp_theme.obj
##
# GTK
#
GTK_CFLAGS=\
-I$(GTK_DIR)/include/gtk-2.0 \
-I$(GTK_DIR)/lib/gtk-2.0/include \
-I$(GTK_DIR)/include/atk-1.0 \
-I$(GTK_DIR)/include/pango-1.0 \
-I$(GTK_DIR)/include/glib-2.0 \
-I$(GTK_DIR)/lib/glib-2.0/include
GTK_LDFLAGS=/libpath:$(GTK_DIR)/lib
GTK_LIBS= \
gtk-win32-2.0.lib \
gdk-win32-2.0.lib \
atk-1.0.lib \
gdk_pixbuf-2.0.lib \
pangowin32-1.0.lib \
pango-1.0.lib \
gobject-2.0.lib \
gmodule-2.0.lib \
glib-2.0.lib \
intl.lib \
iconv.lib
##
# WIN32
#
WIN32_LIBS = \
gdi32.lib \
user32.lib
WIN32_CFLAGS=-I"$(SDK_DIR)"
WIN32_LDFLAGS=/DLL /SUBSYSTEM:WINDOWS
##
# Target
#
LIBS=$(GTK_LIBS) $(WIN32_LIBS)
CFLAGS=$(WIN32_CFLAGS) $(GTK_CFLAGS)
LDFLAGS= $(WIN32_LDFLAGS) $(GTK_LDFLAGS)
all: $(TARGET)
$(TARGET): $(OBJS)
link $(LDFLAGS) $(LIBS) /OUT:$@ $(OBJS)
install: $(TARGET)
copy $(TARGET) "$(INSTALL_DIR)"
clean:
del *.obj *.dll *.exp *.lib

View File

@@ -1 +0,0 @@
SUBDIRS=gtk-2.0

View File

@@ -1,4 +0,0 @@
themedir = $(datadir)/themes/gtk-2.0
theme_DATA=gtkrc
EXTRA_DIST=$(theme_DATA)

View File

@@ -1,21 +0,0 @@
# TODO: we should probably obtain these from a Win32 IconMetrics struct
gtk-icon-sizes="gtk-menu=16,16:gtk-small-toolbar=18,18:gtk-large-toolbar=24,24:gtk-dnd=32,32"
style "msw-default"
{
GtkWidget::interior_focus = 1
GtkOptionMenu::indicator_size = { 9, 5 }
GtkOptionMenu::indicator_spacing = { 7, 5, 2, 2 }
GtkMenuBar::shadow-type = none
GtkToolbar::shadow-type = etched-in
GtkHandleBox::shadow-type = none
GtkSpinButton::shadow-type = in
GtkTreeView::allow-rules = 0
GtkTreeView::expander_size = 11
engine "ms-windows-engine"
{
}
}
class "*" style "msw-default"

View File

@@ -1,78 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
* Includes code adapted from redmond95 by Owen Taylor, and
* gtk-nativewin by Evan Martin
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "msw_style.h"
#include "msw_rc_style.h"
static void msw_rc_style_init (MswRcStyle *style);
static void msw_rc_style_class_init (MswRcStyleClass *klass);
static GtkStyle *msw_rc_style_create_style (GtkRcStyle *rc_style);
static GtkRcStyleClass *parent_class;
GType msw_type_rc_style = 0;
void
msw_rc_style_register_type (GTypeModule *module)
{
static const GTypeInfo object_info =
{
sizeof (MswRcStyleClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) msw_rc_style_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (MswRcStyle),
0, /* n_preallocs */
(GInstanceInitFunc) msw_rc_style_init,
};
msw_type_rc_style = g_type_module_register_type (module,
GTK_TYPE_RC_STYLE,
"MswRcStyle",
&object_info, 0);
}
static void
msw_rc_style_init (MswRcStyle *style)
{
}
static void
msw_rc_style_class_init (MswRcStyleClass *klass)
{
GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
rc_style_class->create_style = msw_rc_style_create_style;
}
/* Create an empty style suitable to this RC style
*/
static GtkStyle *
msw_rc_style_create_style (GtkRcStyle *rc_style)
{
return GTK_STYLE (g_object_new (MSW_TYPE_STYLE, NULL));
}

View File

@@ -1,54 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
* Includes code adapted from redmond95 by Owen Taylor, and
* gtk-nativewin by Evan Martin
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef MSW_RC_STYLE_H
#define MSW_RC_STYLE_H
#include <gtk/gtkrc.h>
typedef struct _MswRcStyle MswRcStyle;
typedef struct _MswRcStyleClass MswRcStyleClass;
extern GType msw_type_rc_style;
#define MSW_TYPE_RC_STYLE msw_type_rc_style
#define MSW_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MSW_TYPE_RC_STYLE, MswRcStyle))
#define MSW_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MSW_TYPE_RC_STYLE, MswRcStyleClass))
#define MSW_IS_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MSW_TYPE_RC_STYLE))
#define MSW_IS_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MSW_TYPE_RC_STYLE))
#define MSW_RC_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MSW_TYPE_RC_STYLE, MswRcStyleClass))
struct _MswRcStyle
{
GtkRcStyle parent_instance;
GList *img_list;
};
struct _MswRcStyleClass
{
GtkRcStyleClass parent_class;
};
void msw_rc_style_register_type (GTypeModule *module);
#endif /* MSW_TYPE_RC_STYLE */

File diff suppressed because it is too large Load Diff

View File

@@ -1,54 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
* Includes code adapted from redmond95 by Owen Taylor, and
* gtk-nativewin by Evan Martin
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef MSW_STYLE_H
#define MSW_STYLE_H
#include <gtk/gtkstyle.h>
typedef struct _MswStyle MswStyle;
typedef struct _MswStyleClass MswStyleClass;
extern GType msw_type_style;
#define MSW_TYPE_STYLE msw_type_style
#define MSW_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), MSW_TYPE_STYLE, MswStyle))
#define MSW_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MSW_TYPE_STYLE, MswStyleClass))
#define MSW_IS_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), MSW_TYPE_STYLE))
#define MSW_IS_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MSW_TYPE_STYLE))
#define MSW_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MSW_TYPE_STYLE, MswStyleClass))
struct _MswStyle
{
GtkStyle parent_instance;
};
struct _MswStyleClass
{
GtkStyleClass parent_class;
};
void msw_style_register_type (GTypeModule *module);
void msw_style_init (void);
void msw_style_setup_system_settings (void);
#endif /* MSW_TYPE_STYLE */

View File

@@ -1,102 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
* Includes code adapted from redmond95 by Owen Taylor, and
* gtk-nativewin by Evan Martin
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <windows.h>
#include <gmodule.h>
#include <gtk/gtk.h>
#include "msw_style.h"
#include "msw_rc_style.h"
#ifndef WM_THEMECHANGED
#define WM_THEMECHANGED 0x031A /* winxp only */
#endif
/* TODO - look into whether we need to handle these:
*
* WM_STYLECHANGED
* WM_PALETTECHANGED
*/
static GdkFilterReturn
global_filter_func (void *xevent,
GdkEvent *event,
gpointer data)
{
MSG *msg = (MSG *) xevent;
switch (msg->message)
{
#if ENABLE_THEME_CHANGING
/* catch theme changes */
case WM_THEMECHANGED:
case WM_SYSCOLORCHANGE:
xp_theme_reset ();
msw_style_init ();
/* force all gtkwidgets to redraw */
gtk_rc_reparse_all_for_settings (gtk_settings_get_default(), TRUE);
return GDK_FILTER_REMOVE;
#endif
case WM_SETTINGCHANGE:
/* catch cursor blink, etc... changes */
msw_style_setup_system_settings ();
return GDK_FILTER_REMOVE;
default:
return GDK_FILTER_CONTINUE;
}
}
G_MODULE_EXPORT void
theme_init (GTypeModule *module)
{
msw_rc_style_register_type (module);
msw_style_register_type (module);
msw_style_init ();
gdk_window_add_filter (NULL, global_filter_func, NULL);
}
G_MODULE_EXPORT void
theme_exit (void)
{
gdk_window_remove_filter (NULL, global_filter_func, NULL);
}
G_MODULE_EXPORT GtkRcStyle *
theme_create_rc_style (void)
{
return GTK_RC_STYLE (g_object_new (MSW_TYPE_RC_STYLE, NULL));
}
/* The following function will be called by GTK+ when the module
* is loaded and checks to see if we are compatible with the
* version of GTK+ that loads us.
*/
G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module);
const gchar*
g_module_check_init (GModule *module)
{
return gtk_check_version (GTK_MAJOR_VERSION,
GTK_MINOR_VERSION,
GTK_MICRO_VERSION - GTK_INTERFACE_AGE);
}

View File

@@ -1,787 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "xp_theme.h"
#include <windows.h>
#include <math.h>
#include <string.h>
#include <gdk/gdkwin32.h>
#include <stdio.h>
#ifdef DONT_HAVE_UXTHEME_H
#include "xp_theme_defs.h"
#else
#include <uxtheme.h>
#include <tmschema.h>
#endif
static const LPCWSTR class_descriptors[] =
{
L"Scrollbar", /* XP_THEME_CLASS_SCROLLBAR */
L"Button", /* XP_THEME_CLASS_BUTTON */
L"Header", /* XP_THEME_CLASS_HEADER */
L"ComboBox", /* XP_THEME_CLASS_COMBOBOX */
L"Tab", /* XP_THEME_CLASS_TAB */
L"Edit", /* XP_THEME_CLASS_EDIT */
L"TreeView", /* XP_THEME_CLASS_TREEVIEW */
L"Spin", /* XP_THEME_CLASS_SPIN */
L"Progress", /* XP_THEME_CLASS_PROGRESS */
L"Tooltip", /* XP_THEME_CLASS_TOOLTIP */
L"Rebar", /* XP_THEME_CLASS_REBAR */
L"Toolbar", /* XP_THEME_CLASS_TOOLBAR */
L"Globals", /* XP_THEME_CLASS_GLOBALS */
L"Menu", /* XP_THEME_CLASS_MENU */
L"Window", /* XP_THEME_CLASS_WINDOW */
L"Status" /* XP_THEME_CLASS_STATUS */
};
static const short element_part_map[]=
{
BP_CHECKBOX,
BP_CHECKBOX,
BP_PUSHBUTTON,
HP_HEADERITEM,
CP_DROPDOWNBUTTON,
TABP_BODY,
TABP_TABITEM,
TABP_TABITEMLEFTEDGE,
TABP_PANE,
SBP_THUMBBTNHORZ,
SBP_THUMBBTNVERT,
SBP_ARROWBTN,
SBP_ARROWBTN,
SBP_ARROWBTN,
SBP_ARROWBTN,
SBP_GRIPPERHORZ,
SBP_GRIPPERVERT,
SBP_LOWERTRACKHORZ,
SBP_LOWERTRACKVERT,
EP_EDITTEXT,
BP_PUSHBUTTON,
SPNP_UP,
SPNP_DOWN,
BP_RADIOBUTTON,
BP_RADIOBUTTON,
TVP_GLYPH,
TVP_GLYPH,
PP_CHUNK,
PP_CHUNKVERT,
PP_BAR,
PP_BARVERT,
TTP_STANDARD,
RP_BAND,
RP_GRIPPER,
RP_GRIPPERVERT,
RP_CHEVRON,
TP_BUTTON,
MP_MENUITEM,
MP_SEPARATOR,
SP_GRIPPER,
SP_PANE
};
static HINSTANCE uxtheme_dll = NULL;
static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
(HTHEME hTheme, int iFontID, OUT LOGFONT *plf);
typedef int (FAR PASCAL *GetThemeSysSizeFunc)
(HTHEME hTheme, int iSizeId);
typedef COLORREF (FAR PASCAL *GetThemeSysColorFunc)(HTHEME hTheme, int iColorID);
typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
(HWND hwnd, LPCWSTR pszClassList);
typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc)
(HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
const RECT *pRect, const RECT *pClipRect);
typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFlags);
typedef BOOL (FAR PASCAL *IsThemeActiveFunc)(VOID);
static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
static GetThemeSysColorFunc get_theme_sys_color_func = NULL;
static GetThemeSysSizeFunc get_theme_sys_metric_func = NULL;
static OpenThemeDataFunc open_theme_data_func = NULL;
static CloseThemeDataFunc close_theme_data_func = NULL;
static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
static IsThemeActiveFunc is_theme_active_func = NULL;
static gboolean was_theming_active = FALSE;
static void
xp_theme_close_open_handles (void)
{
int i;
for (i=0; i < XP_THEME_CLASS__SIZEOF; i++)
{
if (open_themes[i])
{
close_theme_data_func (open_themes[i]);
open_themes[i] = NULL;
}
}
}
void
xp_theme_init (void)
{
if (uxtheme_dll)
return;
memset(open_themes, 0, sizeof(open_themes));
uxtheme_dll = LoadLibrary("uxtheme.dll");
if (!uxtheme_dll) {
was_theming_active = FALSE;
return;
}
is_theme_active_func = (IsThemeActiveFunc) GetProcAddress(uxtheme_dll, "IsThemeActive");
open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");
close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");
draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");
enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");
get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");
get_theme_sys_color_func = (GetThemeSysColorFunc) GetProcAddress(uxtheme_dll, "GetThemeSysColor");
get_theme_sys_metric_func = (GetThemeSysSizeFunc) GetProcAddress(uxtheme_dll, "GetThemeSysSize");
if (is_theme_active_func)
{
was_theming_active = (*is_theme_active_func) ();
}
}
void
xp_theme_reset (void)
{
xp_theme_close_open_handles ();
was_theming_active = is_theme_active_func
? (*is_theme_active_func) () : FALSE;
}
void
xp_theme_exit (void)
{
if (! uxtheme_dll)
return;
xp_theme_close_open_handles ();
FreeLibrary (uxtheme_dll);
uxtheme_dll = NULL;
is_theme_active_func = NULL;
open_theme_data_func = NULL;
close_theme_data_func = NULL;
draw_theme_background_func = NULL;
enable_theme_dialog_texture_func = NULL;
get_theme_sys_font_func = NULL;
get_theme_sys_color_func = NULL;
get_theme_sys_metric_func = NULL;
}
static HTHEME
xp_theme_get_handle_by_class (XpThemeClass klazz)
{
if (!open_themes[klazz] && open_theme_data_func)
{
open_themes[klazz] = open_theme_data_func(NULL, class_descriptors[klazz]);
}
return open_themes[klazz];
}
static HTHEME
xp_theme_get_handle_by_element (XpThemeElement element)
{
HTHEME ret = NULL;
XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
switch(element)
{
case XP_THEME_ELEMENT_TOOLTIP:
klazz = XP_THEME_CLASS_TOOLTIP;
break;
case XP_THEME_ELEMENT_REBAR:
case XP_THEME_ELEMENT_REBAR_GRIPPER_H:
case XP_THEME_ELEMENT_REBAR_GRIPPER_V:
case XP_THEME_ELEMENT_REBAR_CHEVRON:
klazz = XP_THEME_CLASS_REBAR;
break;
case XP_THEME_ELEMENT_STATUS_GRIPPER:
case XP_THEME_ELEMENT_STATUS_PANE:
klazz = XP_THEME_CLASS_STATUS;
break;
case XP_THEME_ELEMENT_TOOLBAR_BUTTON:
klazz = XP_THEME_CLASS_TOOLBAR;
break;
case XP_THEME_ELEMENT_MENU_ITEM:
case XP_THEME_ELEMENT_MENU_SEPARATOR:
klazz = XP_THEME_CLASS_MENU;
break;
case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
case XP_THEME_ELEMENT_CHECKBOX:
case XP_THEME_ELEMENT_BUTTON:
case XP_THEME_ELEMENT_DEFAULT_BUTTON:
case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:
case XP_THEME_ELEMENT_RADIO_BUTTON:
klazz = XP_THEME_CLASS_BUTTON;
break;
case XP_THEME_ELEMENT_LIST_HEADER:
klazz = XP_THEME_CLASS_HEADER;
break;
case XP_THEME_ELEMENT_COMBOBUTTON:
klazz = XP_THEME_CLASS_COMBOBOX;
break;
case XP_THEME_ELEMENT_BODY:
case XP_THEME_ELEMENT_TAB_ITEM:
case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
case XP_THEME_ELEMENT_TAB_PANE:
klazz = XP_THEME_CLASS_TAB;
break;
case XP_THEME_ELEMENT_SCROLLBAR_V:
case XP_THEME_ELEMENT_SCROLLBAR_H:
case XP_THEME_ELEMENT_ARROW_UP:
case XP_THEME_ELEMENT_ARROW_DOWN:
case XP_THEME_ELEMENT_ARROW_LEFT:
case XP_THEME_ELEMENT_ARROW_RIGHT:
case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V:
case XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H:
case XP_THEME_ELEMENT_TROUGH_V:
case XP_THEME_ELEMENT_TROUGH_H:
klazz = XP_THEME_CLASS_SCROLLBAR;
break;
case XP_THEME_ELEMENT_EDIT_TEXT:
klazz = XP_THEME_CLASS_EDIT;
break;
case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
klazz = XP_THEME_CLASS_SPIN;
break;
case XP_THEME_ELEMENT_PROGRESS_BAR_H:
case XP_THEME_ELEMENT_PROGRESS_BAR_V:
case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
klazz = XP_THEME_CLASS_PROGRESS;
break;
case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
klazz = XP_THEME_CLASS_TREEVIEW;
break;
}
if (klazz != XP_THEME_CLASS__SIZEOF)
{
ret = xp_theme_get_handle_by_class (klazz);
}
return ret;
}
static int
xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
{
int ret;
switch(element)
{
case XP_THEME_ELEMENT_TOOLTIP:
ret = TTSS_NORMAL;
break;
case XP_THEME_ELEMENT_REBAR:
case XP_THEME_ELEMENT_REBAR_GRIPPER_H:
case XP_THEME_ELEMENT_REBAR_GRIPPER_V:
ret = CHEVS_NORMAL;
break;
case XP_THEME_ELEMENT_STATUS_GRIPPER:
case XP_THEME_ELEMENT_STATUS_PANE:
ret = 1;
break;
case XP_THEME_ELEMENT_REBAR_CHEVRON:
switch (state)
{
case GTK_STATE_PRELIGHT:
ret = CHEVS_HOT;
break;
case GTK_STATE_SELECTED:
case GTK_STATE_ACTIVE:
ret = CHEVS_PRESSED;
break;
default:
ret = CHEVS_NORMAL;
}
break;
case XP_THEME_ELEMENT_TOOLBAR_BUTTON:
switch (state)
{
case GTK_STATE_ACTIVE:
ret = TS_PRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = TS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = TS_DISABLED;
break;
default:
ret = TS_NORMAL;
}
break;
case XP_THEME_ELEMENT_TAB_PANE:
ret = 1;
break;
case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
case XP_THEME_ELEMENT_TAB_ITEM:
switch(state)
{
case GTK_STATE_PRELIGHT:
ret = TIS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = TIS_DISABLED;
break;
case GTK_STATE_SELECTED:
case GTK_STATE_ACTIVE:
ret = TIS_NORMAL;
break;
default:
ret = TIS_SELECTED;
}
break;
case XP_THEME_ELEMENT_EDIT_TEXT:
switch(state)
{
case GTK_STATE_PRELIGHT:
ret = ETS_FOCUSED;
break;
case GTK_STATE_INSENSITIVE:
ret = ETS_READONLY;
break;
case GTK_STATE_SELECTED:
case GTK_STATE_ACTIVE:
default:
ret = ETS_NORMAL;
}
break;
case XP_THEME_ELEMENT_SCROLLBAR_H:
case XP_THEME_ELEMENT_SCROLLBAR_V:
case XP_THEME_ELEMENT_TROUGH_H:
case XP_THEME_ELEMENT_TROUGH_V:
switch(state)
{
case GTK_STATE_SELECTED:
case GTK_STATE_ACTIVE:
ret = SCRBS_PRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = SCRBS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = SCRBS_DISABLED;
break;
default:
ret = SCRBS_NORMAL;
}
break;
case XP_THEME_ELEMENT_ARROW_DOWN:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = ABS_DOWNPRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = ABS_DOWNHOT;
break;
case GTK_STATE_INSENSITIVE:
ret = ABS_DOWNDISABLED;
break;
default:
ret = ABS_DOWNNORMAL;
}
break;
case XP_THEME_ELEMENT_ARROW_UP:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = ABS_UPPRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = ABS_UPHOT;
break;
case GTK_STATE_INSENSITIVE:
ret = ABS_UPDISABLED;
break;
default:
ret = ABS_UPNORMAL;
}
break;
case XP_THEME_ELEMENT_ARROW_LEFT:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = ABS_LEFTPRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = ABS_LEFTHOT;
break;
case GTK_STATE_INSENSITIVE:
ret = ABS_LEFTDISABLED;
break;
default:
ret = ABS_LEFTNORMAL;
}
break;
case XP_THEME_ELEMENT_ARROW_RIGHT:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = ABS_RIGHTPRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = ABS_RIGHTHOT;
break;
case GTK_STATE_INSENSITIVE:
ret = ABS_RIGHTDISABLED;
break;
default:
ret = ABS_RIGHTNORMAL;
}
break;
case XP_THEME_ELEMENT_CHECKBOX:
case XP_THEME_ELEMENT_RADIO_BUTTON:
switch(state)
{
case GTK_STATE_SELECTED:
ret = CBS_UNCHECKEDPRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = CBS_UNCHECKEDHOT;
break;
case GTK_STATE_INSENSITIVE:
ret = CBS_UNCHECKEDDISABLED;
break;
default:
ret = CBS_UNCHECKEDNORMAL;
}
break;
case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
case XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON:
switch(state)
{
case GTK_STATE_SELECTED:
ret = CBS_CHECKEDPRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = CBS_CHECKEDHOT;
break;
case GTK_STATE_INSENSITIVE:
ret = CBS_CHECKEDDISABLED;
break;
default:
ret = CBS_CHECKEDNORMAL;
}
break;
XP_THEME_ELEMENT_DEFAULT_BUTTON:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = PBS_PRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = PBS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = PBS_DISABLED;
break;
default:
ret = PBS_DEFAULTED;
}
break;
case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = DNS_PRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = DNS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = DNS_DISABLED;
break;
default:
ret = DNS_NORMAL;
}
break;
case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = UPS_PRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = UPS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = UPS_DISABLED;
break;
default:
ret = UPS_NORMAL;
}
break;
case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
ret = GLPS_OPENED;
break;
case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
ret = GLPS_CLOSED;
break;
case XP_THEME_ELEMENT_PROGRESS_BAR_H:
case XP_THEME_ELEMENT_PROGRESS_BAR_V:
case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
ret = 1;
break;
case XP_THEME_ELEMENT_MENU_ITEM:
case XP_THEME_ELEMENT_MENU_SEPARATOR:
switch(state) {
case GTK_STATE_SELECTED:
ret = MS_SELECTED;
break;
case GTK_STATE_INSENSITIVE:
ret = MS_DEMOTED;
break;
default:
ret = MS_NORMAL;
}
break;
default:
switch(state)
{
case GTK_STATE_ACTIVE:
ret = PBS_PRESSED;
break;
case GTK_STATE_PRELIGHT:
ret = PBS_HOT;
break;
case GTK_STATE_INSENSITIVE:
ret = PBS_DISABLED;
break;
default:
ret = PBS_NORMAL;
}
}
return ret;
}
gboolean
xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
int x, int y, int width, int height,
GtkStateType state_type, GdkRectangle *area)
{
HTHEME theme;
RECT rect, clip, *pClip;
int xoff, yoff, state;
HDC dc;
GdkDrawable *drawable;
int part_state;
if (! xp_theme_is_drawable (element))
return FALSE;
theme = xp_theme_get_handle_by_element(element);
if (!theme)
return FALSE;
/* FIXME: Recheck its function */
enable_theme_dialog_texture_func(GDK_WINDOW_HWND(win), ETDT_ENABLETAB);
if (!GDK_IS_WINDOW(win))
{
xoff = 0;
yoff = 0;
drawable = win;
}
else
{
gdk_window_get_internal_paint_info(win, &drawable, &xoff, &yoff);
}
rect.left = x - xoff;
rect.top = y - yoff;
rect.right = rect.left + width;
rect.bottom = rect.top + height;
if (area)
{
clip.left = area->x - xoff;
clip.top = area->y - yoff;
clip.right = clip.left + area->width;
clip.bottom = clip.top + area->height;
pClip = &clip;
}
else
{
pClip = NULL;
}
gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
dc = gdk_win32_hdc_get(drawable, style->dark_gc[state_type], 0);
if (!dc)
return FALSE;
part_state = xp_theme_map_gtk_state(element, state_type);
#ifdef GNATS_HACK
if (element == XP_THEME_ELEMENT_REBAR_GRIPPER_V
|| element == XP_THEME_ELEMENT_REBAR_GRIPPER_H)
{
/* Hack alert: when XP draws a gripper, it does not seem to fill
up the whole rectangle. It only fills the gripper line
itself. Therefore we manually fill up the background here
ourselves. I still have to look into this a bit further, as
tests with GNAT Programming System show some awkward
interference between this FillRect and the subsequent
DrawThemeBackground(). */
FillRect (dc, &rect, (HBRUSH) (COLOR_3DFACE+1));
}
#endif
draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, pClip);
gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);
return TRUE;
}
gboolean
xp_theme_is_drawable (XpThemeElement element)
{
if (is_theme_active_func)
{
gboolean active = (*is_theme_active_func) ();
/* A bit of a hack, but it at least detects theme
switches between XP and classic looks on systems
using older GTK+ version (2.2.0-?) that do not
support theme switch detection (gdk_window_add_filter). */
if (active != was_theming_active)
{
xp_theme_reset ();
}
if (active)
{
return (xp_theme_get_handle_by_element (element) != NULL);
}
}
return FALSE;
}
gboolean
xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf)
{
int themeFont;
if (get_theme_sys_font_func != NULL)
{
HTHEME theme = xp_theme_get_handle_by_class(klazz);
if (!theme)
return FALSE;
switch (fontId)
{
case XP_THEME_FONT_CAPTION:
themeFont = TMT_CAPTIONFONT; break;
case XP_THEME_FONT_MENU:
themeFont = TMT_MENUFONT; break;
case XP_THEME_FONT_STATUS:
themeFont = TMT_STATUSFONT; break;
case XP_THEME_FONT_MESSAGE:
default:
themeFont = TMT_MSGBOXFONT; break;
}
/* if theme is NULL, it will just return the GetSystemFont() value */
return ((*get_theme_sys_font_func)(theme, themeFont, lf) == S_OK);
}
return FALSE;
}
gboolean
xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor)
{
if (get_theme_sys_color_func != NULL)
{
HTHEME theme = xp_theme_get_handle_by_class(klazz);
/* if theme is NULL, it will just return the GetSystemColor() value */
*pColor = (*get_theme_sys_color_func)(theme, colorId);
return TRUE;
}
return FALSE;
}
gboolean
xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal)
{
if (get_theme_sys_metric_func != NULL)
{
HTHEME theme = xp_theme_get_handle_by_class(klazz);
/* if theme is NULL, it will just return the GetSystemMetrics() value */
*pVal = (*get_theme_sys_metric_func)(theme, metricId);
return TRUE;
}
return FALSE;
}

View File

@@ -1,114 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Raymond Penners <raymond@dotsphinx.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef XP_THEME_H
#define XP_THEME_H
#include <windows.h>
#include <gtk/gtk.h>
typedef enum
{
XP_THEME_CLASS_SCROLLBAR = 0,
XP_THEME_CLASS_BUTTON,
XP_THEME_CLASS_HEADER,
XP_THEME_CLASS_COMBOBOX,
XP_THEME_CLASS_TAB,
XP_THEME_CLASS_EDIT,
XP_THEME_CLASS_TREEVIEW,
XP_THEME_CLASS_SPIN,
XP_THEME_CLASS_PROGRESS,
XP_THEME_CLASS_TOOLTIP,
XP_THEME_CLASS_REBAR,
XP_THEME_CLASS_TOOLBAR,
XP_THEME_CLASS_GLOBALS,
XP_THEME_CLASS_MENU,
XP_THEME_CLASS_WINDOW,
XP_THEME_CLASS_STATUS,
XP_THEME_CLASS__SIZEOF
} XpThemeClass;
typedef enum
{
XP_THEME_ELEMENT_PRESSED_CHECKBOX = 0,
XP_THEME_ELEMENT_CHECKBOX,
XP_THEME_ELEMENT_BUTTON,
XP_THEME_ELEMENT_LIST_HEADER,
XP_THEME_ELEMENT_COMBOBUTTON,
XP_THEME_ELEMENT_BODY,
XP_THEME_ELEMENT_TAB_ITEM,
XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE,
XP_THEME_ELEMENT_TAB_PANE,
XP_THEME_ELEMENT_SCROLLBAR_H,
XP_THEME_ELEMENT_SCROLLBAR_V,
XP_THEME_ELEMENT_ARROW_UP,
XP_THEME_ELEMENT_ARROW_DOWN,
XP_THEME_ELEMENT_ARROW_LEFT,
XP_THEME_ELEMENT_ARROW_RIGHT,
XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_H,
XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V,
XP_THEME_ELEMENT_TROUGH_H,
XP_THEME_ELEMENT_TROUGH_V,
XP_THEME_ELEMENT_EDIT_TEXT,
XP_THEME_ELEMENT_DEFAULT_BUTTON,
XP_THEME_ELEMENT_SPIN_BUTTON_UP,
XP_THEME_ELEMENT_SPIN_BUTTON_DOWN,
XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON,
XP_THEME_ELEMENT_RADIO_BUTTON,
XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED,
XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED,
XP_THEME_ELEMENT_PROGRESS_BAR_H,
XP_THEME_ELEMENT_PROGRESS_BAR_V,
XP_THEME_ELEMENT_PROGRESS_TROUGH_H,
XP_THEME_ELEMENT_PROGRESS_TROUGH_V,
XP_THEME_ELEMENT_TOOLTIP,
XP_THEME_ELEMENT_REBAR,
XP_THEME_ELEMENT_REBAR_GRIPPER_H,
XP_THEME_ELEMENT_REBAR_GRIPPER_V,
XP_THEME_ELEMENT_REBAR_CHEVRON,
XP_THEME_ELEMENT_TOOLBAR_BUTTON,
XP_THEME_ELEMENT_MENU_ITEM,
XP_THEME_ELEMENT_MENU_SEPARATOR,
XP_THEME_ELEMENT_STATUS_GRIPPER,
XP_THEME_ELEMENT_STATUS_PANE,
XP_THEME_ELEMENT__SIZEOF
} XpThemeElement;
typedef enum
{
XP_THEME_FONT_CAPTION,
XP_THEME_FONT_MENU,
XP_THEME_FONT_STATUS,
XP_THEME_FONT_MESSAGE
} XpThemeFont;
void xp_theme_init (void);
void xp_theme_reset (void);
void xp_theme_exit (void);
gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element,
GtkStyle *style, int x, int y, int width,
int height, GtkStateType state_type,
GdkRectangle *area);
gboolean xp_theme_is_drawable (XpThemeElement element);
gboolean xp_theme_get_system_font (XpThemeClass klazz, XpThemeFont fontId, LOGFONT *lf);
gboolean xp_theme_get_system_color (XpThemeClass klazz, int colorId, DWORD * pColor);
gboolean xp_theme_get_system_metric (XpThemeClass klazz, int metricId, int * pVal);
#endif /* XP_THEME_H */

View File

@@ -1,177 +0,0 @@
/* MS-Windows Engine (aka GTK-Wimp)
*
* Copyright (C) 2003, 2004 Dom Lachowicz <cinamod@hotmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
* These are the real values of these UXTHEME constants, provided so that we can
* compile/link on Win32 platforms that aren't WinXP, and also build against
* MinGW 1.0/1.1, which also doesn't have these things defined in its header files
*/
#ifndef XP_THEME_DFNS_H
#define XP_THEME_DFNS_H
typedef HANDLE HTHEME;
#define ETDT_ENABLE 0x00000002
#define ETDT_USETABTEXTURE 0x00000004
#define ETDT_ENABLETAB (ETDT_ENABLE | ETDT_USETABTEXTURE)
#define BP_PUSHBUTTON 1
#define BP_CHECKBOX 3
#define HP_HEADERITEM 1
#define CP_DROPDOWNBUTTON 1
#define TABP_TABITEM 1
#define TABP_TABITEMLEFTEDGE 2
#define TABP_PANE 9
#define TABP_BODY 10
#define SBP_ARROWBTN 1
#define SBP_THUMBBTNHORZ 2
#define SBP_THUMBBTNVERT 3
#define SBP_LOWERTRACKHORZ 5
#define SBP_LOWERTRACKVERT 6
#define SBP_GRIPPERHORZ 8
#define SBP_GRIPPERVERT 9
#define EP_EDITTEXT 1
#define SPNP_UP 1
#define SPNP_DOWN 2
#define BP_RADIOBUTTON 2
#define TVP_GLYPH 2
#define PP_BAR 1
#define PP_BARVERT 2
#define PP_CHUNK 3
#define PP_CHUNKVERT 4
#define TTP_STANDARD 1
#define RP_GRIPPER 1
#define RP_GRIPPERVERT 2
#define RP_BAND 3
#define RP_CHEVRON 4
#define TP_BUTTON 1
#define TS_NORMAL 1
#define TS_HOT 2
#define TS_PRESSED 3
#define TS_DISABLED 4
#define TTSS_NORMAL 1
#define CHEVS_NORMAL 1
#define CHEVS_HOT 2
#define CHEVS_PRESSED 3
#define TIS_NORMAL 1
#define TIS_HOT 2
#define TIS_SELECTED 3
#define TIS_DISABLED 4
#define ETS_NORMAL 1
#define ETS_FOCUSED 5
#define ETS_READONLY 6
#define SCRBS_NORMAL 1
#define SCRBS_HOT 2
#define SCRBS_PRESSED 3
#define SCRBS_DISABLED 4
#define ABS_UPNORMAL 1
#define ABS_UPHOT 2
#define ABS_UPPRESSED 3
#define ABS_UPDISABLED 4
#define ABS_DOWNNORMAL 5
#define ABS_DOWNHOT 6
#define ABS_DOWNPRESSED 7
#define ABS_DOWNDISABLED 8
#define ABS_LEFTNORMAL 9
#define ABS_LEFTHOT 10
#define ABS_LEFTPRESSED 11
#define ABS_LEFTDISABLED 12
#define ABS_RIGHTNORMAL 13
#define ABS_RIGHTHOT 14
#define ABS_RIGHTPRESSED 15
#define ABS_RIGHTDISABLED 16
#define CBS_UNCHECKEDNORMAL 1
#define CBS_UNCHECKEDHOT 2
#define CBS_UNCHECKEDPRESSED 3
#define CBS_UNCHECKEDDISABLED 4
#define CBS_CHECKEDNORMAL 5
#define CBS_CHECKEDHOT 6
#define CBS_CHECKEDPRESSED 7
#define CBS_CHECKEDDISABLED 8
#define PBS_NORMAL 1
#define PBS_HOT 2
#define PBS_PRESSED 3
#define PBS_DISABLED 4
#define PBS_DEFAULTED 5
#define DNS_NORMAL 1
#define DNS_HOT 2
#define DNS_PRESSED 3
#define DNS_DISABLED 4
#define UPS_NORMAL 1
#define UPS_HOT 2
#define UPS_PRESSED 3
#define UPS_DISABLED 4
#define GLPS_CLOSED 1
#define GLPS_OPENED 2
#define MP_MENUITEM 1
#define MP_SEPARATOR 6
#define MS_NORMAL 1
#define MS_SELECTED 2
#define MS_DEMOTED 3
#define SP_PANE 1
#define SP_GRIPPER 2
#define TMT_CAPTIONFONT 801
#define TMT_MENUFONT 803
#define TMT_STATUSFONT 804
#define TMT_MSGBOXFONT 805
#if UXTHEME_HAS_LINES
#error unknown/undocumented uxtheme values
/* #define GP_LINEHORZ */
/* #define GP_LINEVERT */
/* #define LHS_RAISED */
/* #define LHS_SUNKEN */
/* #define LHS_FLAT */
/* #define LVS_RAISED */
/* #define LVS_SUNKEN */
/* #define LHS_FLAT */
#endif /* UXTHEME_HAS_LINES */
#endif /* XP_THEME_DFNS_H */

View File

@@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
.libs
*.lo
*.la

View File

@@ -1,271 +0,0 @@
Thu Mar 18 10:07:15 2004 Owen Taylor <otaylor@redhat.com>
* pixbuf-draw.c (match_theme_image): Fix ./-> typo.
(Federic Crozat)
Wed Mar 17 16:38:00 2004 Owen Taylor <otaylor@redhat.com>
* pixbuf-draw.c (match_theme_image): Fix problem with
NULL details. (#112066, MINAMI Hirokazu, Matthias Clasen)
2003-07-15 Mark McLoughlin <mark@skynet.ie>
* pixbuf-render.c: make pixbuf_cache static to avoid
possible symbol conflicts.
2003-03-02 Tor Lillqvist <tml@iki.fi>
* Makefile.am: Use -no-undefined on Windows.
Fri Sep 6 20:32:45 2002 Owen Taylor <otaylor@redhat.com>
* pixbuf-draw.c: Account for the possibility of detail == NULL
(#89561, Hongli Lai, Luca Barbato)
Sun Apr 21 14:10:04 2002 Owen Taylor <otaylor@redhat.com>
* pixbuf-rc-style.c pixbuf.h pixbuf-draw.c: Add a fake STEPPER
function that is used for drawing scrollbar steppers,
so that themes that want to draw the button and arrow
separately can override the default handling.
* pixbuf-draw.c: Remove draw_polygon() since it was
just a cut-and-paste of the default one. Remove
some unused code.
2002-03-07 James Henstridge <james@daa.com.au>
* Makefile.am (libpixmap_la_LIBADD): link pixbuf engine against
the gtk+ libraries, so that it can be used with programs that
dlopen gtk+ without the RTLD_GLOBAL flag (such as scripting
languages and mozilla).
Thu Feb 7 00:21:21 2002 Owen Taylor <otaylor@redhat.com>
* pixbuf-render.c (pixbuf_render): Add gradient
rendering -- if the source width/height is zero,
render a gradient from the surrounding values.
Mon Jan 28 15:34:43 2002 Owen Taylor <otaylor@redhat.com>
* pixbuf-render.c (compute_hint): Fix hint computation
again.
Mon Jan 28 12:17:07 2002 Owen Taylor <otaylor@redhat.com>
* pixbuf-render.c (compute_hint): Fix problems in computing
MISSING hint.
Sun Jan 27 23:58:13 2002 Owen Taylor <otaylor@redhat.com>
* pixbuf-render.c (compute_hint): Optimize the case
where a component is entirely transparent by skipping
drawing it.
* pixbuf-rc-style.c (theme_parse_image): Catch case
where background or overlay border/stretch are specified
without a background image.
* pixbuf-render.c (theme_pixbuf_destroy): Actually free
the structure and filename.
=================== Move back into gtk-engines ====================
Sat Jan 19 02:45:17 2002 Owen Taylor <otaylor@redhat.com>
* src/pixbuf-render.c (theme_pixbuf_compute_hints): Catch
invalid borders, and warn.
Sat Jan 19 00:32:14 2002 Owen Taylor <otaylor@redhat.com>
* examples/*: Add an extrodinarily ugly example.
* src/pixbuf-draw.c (draw_simple_image): Never shape
the window, even if we are allowed to. Shaping is
ugly -- if the widget isn't NO_WINDOW (most are),
you'll just have to draw it rectangular.
* src/pixbuf-render.c (pixbuf_render): Always use
gdk_pixbuf_render_alpha() with FULL_ALPHA() as the
type.
* pixbuf.h src/pixbuf-render.c (theme_pixbuf_compute_hints): To
speed up scaling, cache whether pixbufs have constant rows
or constant columns.
* src/pixbuf-render.c (pixbuf_render): Speed up scaling
by using the hints from compute_hints().
Fri Jan 18 20:49:48 2002 Owen Taylor <otaylor@redhat.com>
* configure.in: Use pkg-config to get the binray version
of GTK+ that we use for an install path.
Fri Jan 18 18:14:11 2002 Owen Taylor <otaylor@redhat.com>
* src/pixbuf-draw.c (draw_focus): Fix for changes to draw_focus.
2001-09-21 Hans Breuer <hans@breuer.org>
* src/pixbuf-rc-style-c : GtkRcStyle::parse has a GtkSettings
parameter now. Pass it through theme_parse_file () to use it
gtk_rc_find_pixmap_in_path ()
* src/pixbuf-draw.c : the font field from GtkStyle is private
now, use accessor gtk_style_get_font ()
* makefile.msc : compile on win32, use it if you have a _real_
fast computer or want to see gtk in slow motion :-)
Thu May 3 05:36:06 2001 Owen Taylor <otaylor@redhat.com>
* pixbuf.h: Fix trailing comma on enumeration. (#54071)
2001-03-05 Michael Natterer <mitch@gimp.org>
* src/pixbuf-draw.c: made the "parent_class" pointer static.
(Owen, I just commented out the draw methods which don't exist any
more to make it compile).
2001-02-20 Sven Neumann <sven@convergence.de>
* src/pixbuf-draw.c (draw_vline): use draw_vline method of
parent_class, not draw_hline
Wed Nov 15 21:56:28 2000 Owen Taylor <otaylor@redhat.com>
* src/pixbuf-*: A few updates for GTypePlugin.
Tue Jul 18 12:13:19 2000 Owen Taylor <otaylor@redhat.com>
Updates to work with GTK+-2.0 theme engine architecture.
It won't even sort of work with GTK+-1.2 any more.
* configure.in src/Makefile.am: Look for GTK+-2.0,
install engine into GTK+-2.0 location.
* src/pixbuf-style.h src/pixbuf-rc-style.[ch]: New
files for GtkRcStyle and GtkStyle subclasses. Parsing,
etc, moves to pixbuf-rc-style.[ch]
* src/pixbuf-draw.c: Chain up to parent implementation
when images aren't found for a certain element.
Sun Jul 9 18:15:58 2000 Owen Taylor <otaylor@redhat.com>
* configure.in (ACLOCAL): Add -Wall for gcc.
* src/pixbuf-render.c (pixbuf_render): Fix problem
using gdk_rectangle_intersect() from GTK+-1.2.
* src/pixbuf-render.c src/pixbuf-draw.c: Remove
direct access to pixbuf internals.
Mon Mar 6 11:44:58 2000 Owen Taylor <otaylor@redhat.com>
* docs/gap-geometry.fig: Moved into docs/ subdir
* Makefile.am configure.in autogen.sh src/Makefile.am:
automakify
* src/pixbuf.h src/pixbuf-render.c src/pixbuf-draw.c
src/pixbuf-main.c: Move sources into subdir and
rename.
Mon Mar 6 11:02:07 2000 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_pixbuf.c: Handle drawing transparency without a
mask correctly.
* pixmap_theme_main.c pixmap_theme_draw.c: Remove duplicate
includes.
Sun Feb 6 21:34:30 2000 Owen Taylor <otaylor@redhat.com>
* Started ChangeLog for pixbuf engine, check sources
into CVS.
========== ChangeLog for pixmap engine ===================
1999-11-22 Martin Baulig <martin@home-of-linux.org>
* pixmap_theme_main.c (theme_duplicate_style): Really copy the
`src_data->img_list', not just the pointer that points to it.
Tue Oct 5 15:13:29 1999 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_draw.c (apply_theme_image): Don't set
background pixmap on pixmaps.
1999-02-14 Raja R Harinath <harinath@cs.umn.edu>
* Theme/gtk/Makefile.am.in (Makefile.am): Handle the case when
files are deleted.
Thu Feb 11 21:16:53 1999 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_main.c (theme_data_unref): Free the
theme data structure as well as the contents.
1999-02-03 Raja R Harinath <harinath@cs.umn.edu>
* Theme/gtk/Makefile.am.in: New file. Theme/gtk/Makefile.am is
generated from this file when new *.png files are added.
1999-01-23 Miguel de Icaza <miguel@nuclecu.unam.mx>
* pixmap_theme_main.c (theme_init): Turn on pixmap cache.
Mon Jan 18 13:37:23 1999 Owen Taylor <otaylor@redhat.com>
* Theme/gtk/gtkrc: Give buttons a gray background
color so they look a little less funny when initially
drawing.
Wed Jan 13 18:58:25 1999 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_draw.c: Fixed pervasive mis-bracketing
that was causing drawing if the drawn region and
clipping region did NOT intersect, and a couple
of errors in computing source and destination
regions.
1998-11-09 Federico Mena Quintero <federico@nuclecu.unam.mx>
* pixmap_theme_draw.c: #include <math.h>
1998-11-07 Raja R Harinath <harinath@cs.umn.edu>
* Theme/gtk/Makefile.am (theme_DATA):
Update to new directory contents.
* configure.in: Remove.
Fri Nov 6 17:26:12 1998 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_main.c: Removed some debugging
printf's.
* Theme/gtk/notebook1.c Theme/gtk/menubar.png: new
bigger pixmaps to reduce pixelation.
* Theme/gtk/gtkrc: Reorganized to use several styles
instead of one huge style. Change clist backgrounds
to be prettier.
Thu Nov 5 10:23:46 1998 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_draw.c (draw_shadow_gap): Fixed hard-coded
gap_side of '0'.
Mon Nov 2 14:46:02 1998 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_draw.c (apply_theme_image_shadow_gap): Removed
several hundred lines of duplicated code with a bit of
reoriganization.
Wed Oct 28 16:18:04 1998 Owen Taylor <otaylor@redhat.com>
* pixmap_theme_main.c (theme_symbols): Removed lots
and lots of white space.

View File

@@ -1,25 +0,0 @@
if OS_WIN32
no_undefined = -no-undefined
endif
INCLUDES = $(GTK_CFLAGS)
enginedir = $(libdir)/gtk-2.0/$(GTK_VERSION)/engines
engine_LTLIBRARIES = libpixmap.la
libpixmap_la_SOURCES = \
pixbuf-draw.c \
pixbuf-main.c \
pixbuf-render.c \
pixbuf-rc-style.c \
pixbuf-rc-style.h \
pixbuf-style.h \
pixbuf.h
libpixmap_la_LDFLAGS = -avoid-version -module $(no_undefined)
libpixmap_la_LIBADD = $(GTK_LIBS)
dist-hook:
cp -pr examples $(distdir); \
find $(distdir)/examples -name 'CVS' -print | xargs rm -rf

View File

@@ -1,17 +0,0 @@
The code in this directory is a GTK+ theme engine based on the earlier
pixmap theme engine.
The config files are meant to be compatible, but instead of rendering
using Imlib, it renders using GdkPixbuf. This makes the memory
management much more understandable, and also allows us to use
GdkPixbuf's high quality scaling.
Most of the code was reworked/rewritten in the process to make it more
understandable and maintainable.
There are lots of bugs here, a considersable number of bugs. But it's
cleaned up a great deal from the older pixmap engine. Please don't
make it uglier again.
Owen Taylor <otaylor@redhat.com>
6 February 2000

View File

@@ -1,14 +0,0 @@
gtk-2.0/triangle-background.png is copyright Owen Taylor, 1997
and may be used without restriction as long as this attribution
is reproduced.
images/bc.pnm images/bc-dark.pnm images/bc-light.png are
from the BrushedMetalClean theme; I believe Tuomas Kuosmanen
and Carsten Haitzler had something to do with the original
BrushedMetal artwork.
This theme is truly hideous for a reason ... to demonstrate
that alpha-compositing is going on.
Owen Taylor
19 Jan 2002x

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 836 B

View File

@@ -1,65 +0,0 @@
style "default"
{
fg[NORMAL] = "#ffffff"
fg[PRELIGHT] = "#ffffff"
bg_pixmap[NORMAL] = "triangle_background.png"
# bg_pixmap[NORMAL] = "bc.png"
bg_pixmap[PRELIGHT] = "bc-light.png"
bg_pixmap[ACTIVE] = "bc-dark.png" bg_pixmap[INSENSITIVE] = "bc.png"
}
class "GtkWidget" style "default"
style "bubble-button"
{
engine "pixmap"
{
image
{
function = BOX
file = "bubble-blue.png"
border = { 8, 8, 8, 8 }
stretch = TRUE
}
}
}
# common default
class "GtkButton" style "bubble-button"
style "bubble-range"
{
GtkRange::slider_width = 16
GtkRange::stepper_size = 16
engine "pixmap"
{
image
{
function = BOX
file = "bubble-blue.png"
border = { 8, 8, 8, 8 }
stretch = TRUE
}
}
}
# common default
class "GtkRange" style "bubble-range"
style "bubble-menuitem"
{
engine "pixmap"
{
image
{
function = BOX
file = "bubble-blue.png"
border = { 8, 8, 8, 8 }
stretch = TRUE
}
}
}
# common default
class "GtkMenuItem" style "bubble-menuitem"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1,57 +0,0 @@
/* GTK+ Pixbuf Engine
* Copyright (C) 1998-2000 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
* Carsten Haitzler <raster@rasterman.com>
*/
#include "pixbuf.h"
#include "pixbuf-style.h"
#include "pixbuf-rc-style.h"
#include <gmodule.h>
G_MODULE_EXPORT void
theme_init (GTypeModule *module)
{
pixbuf_rc_style_register_type (module);
pixbuf_style_register_type (module);
}
G_MODULE_EXPORT void
theme_exit (void)
{
}
G_MODULE_EXPORT GtkRcStyle *
theme_create_rc_style (void)
{
return GTK_RC_STYLE (g_object_new (PIXBUF_TYPE_RC_STYLE, NULL));
}
/* The following function will be called by GTK+ when the module
* is loaded and checks to see if we are compatible with the
* version of GTK+ that loads us.
*/
G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module);
const gchar*
g_module_check_init (GModule *module)
{
return gtk_check_version (GTK_MAJOR_VERSION,
GTK_MINOR_VERSION,
GTK_MICRO_VERSION - GTK_INTERFACE_AGE);
}

View File

@@ -1,815 +0,0 @@
/* GTK+ Pixbuf Engine
* Copyright (C) 1998-2000 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
* Carsten Haitzler <raster@rasterman.com>
*/
#include "pixbuf.h"
#include "pixbuf-style.h"
#include "pixbuf-rc-style.h"
static void pixbuf_rc_style_init (PixbufRcStyle *style);
static void pixbuf_rc_style_class_init (PixbufRcStyleClass *klass);
static void pixbuf_rc_style_finalize (GObject *object);
static guint pixbuf_rc_style_parse (GtkRcStyle *rc_style,
GtkSettings *settings,
GScanner *scanner);
static void pixbuf_rc_style_merge (GtkRcStyle *dest,
GtkRcStyle *src);
static GtkStyle *pixbuf_rc_style_create_style (GtkRcStyle *rc_style);
static void theme_image_unref (ThemeImage *data);
static struct
{
gchar *name;
guint token;
}
theme_symbols[] =
{
{ "image", TOKEN_IMAGE },
{ "function", TOKEN_FUNCTION },
{ "file", TOKEN_FILE },
{ "stretch", TOKEN_STRETCH },
{ "recolorable", TOKEN_RECOLORABLE },
{ "border", TOKEN_BORDER },
{ "detail", TOKEN_DETAIL },
{ "state", TOKEN_STATE },
{ "shadow", TOKEN_SHADOW },
{ "gap_side", TOKEN_GAP_SIDE },
{ "gap_file", TOKEN_GAP_FILE },
{ "gap_border", TOKEN_GAP_BORDER },
{ "gap_start_file", TOKEN_GAP_START_FILE },
{ "gap_start_border", TOKEN_GAP_START_BORDER },
{ "gap_end_file", TOKEN_GAP_END_FILE },
{ "gap_end_border", TOKEN_GAP_END_BORDER },
{ "overlay_file", TOKEN_OVERLAY_FILE },
{ "overlay_border", TOKEN_OVERLAY_BORDER },
{ "overlay_stretch", TOKEN_OVERLAY_STRETCH },
{ "arrow_direction", TOKEN_ARROW_DIRECTION },
{ "orientation", TOKEN_ORIENTATION },
{ "HLINE", TOKEN_D_HLINE },
{ "VLINE", TOKEN_D_VLINE },
{ "SHADOW", TOKEN_D_SHADOW },
{ "POLYGON", TOKEN_D_POLYGON },
{ "ARROW", TOKEN_D_ARROW },
{ "DIAMOND", TOKEN_D_DIAMOND },
{ "OVAL", TOKEN_D_OVAL },
{ "STRING", TOKEN_D_STRING },
{ "BOX", TOKEN_D_BOX },
{ "FLAT_BOX", TOKEN_D_FLAT_BOX },
{ "CHECK", TOKEN_D_CHECK },
{ "OPTION", TOKEN_D_OPTION },
{ "CROSS", TOKEN_D_CROSS },
{ "RAMP", TOKEN_D_RAMP },
{ "TAB", TOKEN_D_TAB },
{ "SHADOW_GAP", TOKEN_D_SHADOW_GAP },
{ "BOX_GAP", TOKEN_D_BOX_GAP },
{ "EXTENSION", TOKEN_D_EXTENSION },
{ "FOCUS", TOKEN_D_FOCUS },
{ "SLIDER", TOKEN_D_SLIDER },
{ "ENTRY", TOKEN_D_ENTRY },
{ "HANDLE", TOKEN_D_HANDLE },
{ "STEPPER", TOKEN_D_STEPPER },
{ "TRUE", TOKEN_TRUE },
{ "FALSE", TOKEN_FALSE },
{ "TOP", TOKEN_TOP },
{ "UP", TOKEN_UP },
{ "BOTTOM", TOKEN_BOTTOM },
{ "DOWN", TOKEN_DOWN },
{ "LEFT", TOKEN_LEFT },
{ "RIGHT", TOKEN_RIGHT },
{ "NORMAL", TOKEN_NORMAL },
{ "ACTIVE", TOKEN_ACTIVE },
{ "PRELIGHT", TOKEN_PRELIGHT },
{ "SELECTED", TOKEN_SELECTED },
{ "INSENSITIVE", TOKEN_INSENSITIVE },
{ "NONE", TOKEN_NONE },
{ "IN", TOKEN_IN },
{ "OUT", TOKEN_OUT },
{ "ETCHED_IN", TOKEN_ETCHED_IN },
{ "ETCHED_OUT", TOKEN_ETCHED_OUT },
{ "HORIZONTAL", TOKEN_HORIZONTAL },
{ "VERTICAL", TOKEN_VERTICAL },
};
static GtkRcStyleClass *parent_class;
GType pixbuf_type_rc_style = 0;
void
pixbuf_rc_style_register_type (GTypeModule *module)
{
static const GTypeInfo object_info =
{
sizeof (PixbufRcStyleClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) pixbuf_rc_style_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (PixbufRcStyle),
0, /* n_preallocs */
(GInstanceInitFunc) pixbuf_rc_style_init,
};
pixbuf_type_rc_style = g_type_module_register_type (module,
GTK_TYPE_RC_STYLE,
"PixbufRcStyle",
&object_info, 0);
}
static void
pixbuf_rc_style_init (PixbufRcStyle *style)
{
}
static void
pixbuf_rc_style_class_init (PixbufRcStyleClass *klass)
{
GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
rc_style_class->parse = pixbuf_rc_style_parse;
rc_style_class->merge = pixbuf_rc_style_merge;
rc_style_class->create_style = pixbuf_rc_style_create_style;
object_class->finalize = pixbuf_rc_style_finalize;
}
static void
pixbuf_rc_style_finalize (GObject *object)
{
PixbufRcStyle *rc_style = PIXBUF_RC_STYLE (object);
g_list_foreach (rc_style->img_list, (GFunc) theme_image_unref, NULL);
g_list_free (rc_style->img_list);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static guint
theme_parse_file(GtkSettings *settings,
GScanner *scanner,
ThemePixbuf **theme_pb)
{
guint token;
gchar *pixmap;
/* Skip 'blah_file' */
token = g_scanner_get_next_token(scanner);
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_STRING)
return G_TOKEN_STRING;
if (!*theme_pb)
*theme_pb = theme_pixbuf_new ();
pixmap = gtk_rc_find_pixmap_in_path(settings, scanner, scanner->value.v_string);
if (pixmap)
{
theme_pixbuf_set_filename (*theme_pb, pixmap);
g_free (pixmap);
}
return G_TOKEN_NONE;
}
static guint
theme_parse_border (GScanner *scanner,
ThemePixbuf **theme_pb)
{
guint token;
gint left, right, top, bottom;
/* Skip 'blah_border' */
token = g_scanner_get_next_token(scanner);
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_LEFT_CURLY)
return G_TOKEN_LEFT_CURLY;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_INT)
return G_TOKEN_INT;
left = scanner->value.v_int;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_COMMA)
return G_TOKEN_COMMA;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_INT)
return G_TOKEN_INT;
right = scanner->value.v_int;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_COMMA)
return G_TOKEN_COMMA;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_INT)
return G_TOKEN_INT;
top = scanner->value.v_int;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_COMMA)
return G_TOKEN_COMMA;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_INT)
return G_TOKEN_INT;
bottom = scanner->value.v_int;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_RIGHT_CURLY)
return G_TOKEN_RIGHT_CURLY;
if (!*theme_pb)
*theme_pb = theme_pixbuf_new ();
theme_pixbuf_set_border (*theme_pb, left, right, top, bottom);
return G_TOKEN_NONE;
}
static guint
theme_parse_stretch(GScanner *scanner,
ThemePixbuf **theme_pb)
{
guint token;
gboolean stretch;
/* Skip 'blah_stretch' */
token = g_scanner_get_next_token(scanner);
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_TRUE)
stretch = TRUE;
else if (token == TOKEN_FALSE)
stretch = FALSE;
else
return TOKEN_TRUE;
if (!*theme_pb)
*theme_pb = theme_pixbuf_new ();
theme_pixbuf_set_stretch (*theme_pb, stretch);
return G_TOKEN_NONE;
}
static guint
theme_parse_recolorable(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_RECOLORABLE)
return TOKEN_RECOLORABLE;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_TRUE)
data->recolorable = 1;
else if (token == TOKEN_FALSE)
data->recolorable = 0;
else
return TOKEN_TRUE;
return G_TOKEN_NONE;
}
static guint
theme_parse_function(GScanner * scanner,
ThemeImage *data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_FUNCTION)
return TOKEN_FUNCTION;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if ((token >= TOKEN_D_HLINE) && (token <= TOKEN_D_STEPPER))
data->match_data.function = token;
return G_TOKEN_NONE;
}
static guint
theme_parse_detail(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_DETAIL)
return TOKEN_DETAIL;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_STRING)
return G_TOKEN_STRING;
if (data->match_data.detail)
g_free (data->match_data.detail);
data->match_data.detail = g_strdup(scanner->value.v_string);
return G_TOKEN_NONE;
}
static guint
theme_parse_state(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_STATE)
return TOKEN_STATE;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_NORMAL)
data->match_data.state = GTK_STATE_NORMAL;
else if (token == TOKEN_ACTIVE)
data->match_data.state = GTK_STATE_ACTIVE;
else if (token == TOKEN_PRELIGHT)
data->match_data.state = GTK_STATE_PRELIGHT;
else if (token == TOKEN_SELECTED)
data->match_data.state = GTK_STATE_SELECTED;
else if (token == TOKEN_INSENSITIVE)
data->match_data.state = GTK_STATE_INSENSITIVE;
else
return TOKEN_NORMAL;
data->match_data.flags |= THEME_MATCH_STATE;
return G_TOKEN_NONE;
}
static guint
theme_parse_shadow(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_SHADOW)
return TOKEN_SHADOW;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_NONE)
data->match_data.shadow = GTK_SHADOW_NONE;
else if (token == TOKEN_IN)
data->match_data.shadow = GTK_SHADOW_IN;
else if (token == TOKEN_OUT)
data->match_data.shadow = GTK_SHADOW_OUT;
else if (token == TOKEN_ETCHED_IN)
data->match_data.shadow = GTK_SHADOW_ETCHED_IN;
else if (token == TOKEN_ETCHED_OUT)
data->match_data.shadow = GTK_SHADOW_ETCHED_OUT;
else
return TOKEN_NONE;
data->match_data.flags |= THEME_MATCH_SHADOW;
return G_TOKEN_NONE;
}
static guint
theme_parse_arrow_direction(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_ARROW_DIRECTION)
return TOKEN_ARROW_DIRECTION;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_UP)
data->match_data.arrow_direction = GTK_ARROW_UP;
else if (token == TOKEN_DOWN)
data->match_data.arrow_direction = GTK_ARROW_DOWN;
else if (token == TOKEN_LEFT)
data->match_data.arrow_direction = GTK_ARROW_LEFT;
else if (token == TOKEN_RIGHT)
data->match_data.arrow_direction = GTK_ARROW_RIGHT;
else
return TOKEN_UP;
data->match_data.flags |= THEME_MATCH_ARROW_DIRECTION;
return G_TOKEN_NONE;
}
static guint
theme_parse_gap_side(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_GAP_SIDE)
return TOKEN_GAP_SIDE;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_TOP)
data->match_data.gap_side = GTK_POS_TOP;
else if (token == TOKEN_BOTTOM)
data->match_data.gap_side = GTK_POS_BOTTOM;
else if (token == TOKEN_LEFT)
data->match_data.gap_side = GTK_POS_LEFT;
else if (token == TOKEN_RIGHT)
data->match_data.gap_side = GTK_POS_RIGHT;
else
return TOKEN_TOP;
data->match_data.flags |= THEME_MATCH_GAP_SIDE;
return G_TOKEN_NONE;
}
static guint
theme_parse_orientation(GScanner * scanner,
ThemeImage * data)
{
guint token;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_ORIENTATION)
return TOKEN_ORIENTATION;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_EQUAL_SIGN)
return G_TOKEN_EQUAL_SIGN;
token = g_scanner_get_next_token(scanner);
if (token == TOKEN_HORIZONTAL)
data->match_data.orientation = GTK_ORIENTATION_HORIZONTAL;
else if (token == TOKEN_VERTICAL)
data->match_data.orientation = GTK_ORIENTATION_VERTICAL;
else
return TOKEN_HORIZONTAL;
data->match_data.flags |= THEME_MATCH_ORIENTATION;
return G_TOKEN_NONE;
}
static void
theme_image_ref (ThemeImage *data)
{
data->refcount++;
}
static void
theme_image_unref (ThemeImage *data)
{
data->refcount--;
if (data->refcount == 0)
{
if (data->match_data.detail)
g_free (data->match_data.detail);
if (data->background)
theme_pixbuf_destroy (data->background);
if (data->overlay)
theme_pixbuf_destroy (data->overlay);
if (data->gap_start)
theme_pixbuf_destroy (data->gap_start);
if (data->gap)
theme_pixbuf_destroy (data->gap);
if (data->gap_end)
theme_pixbuf_destroy (data->gap_end);
g_free (data);
}
}
static guint
theme_parse_image(GtkSettings *settings,
GScanner *scanner,
PixbufRcStyle *pixbuf_style,
ThemeImage **data_return)
{
guint token;
ThemeImage *data;
data = NULL;
token = g_scanner_get_next_token(scanner);
if (token != TOKEN_IMAGE)
return TOKEN_IMAGE;
token = g_scanner_get_next_token(scanner);
if (token != G_TOKEN_LEFT_CURLY)
return G_TOKEN_LEFT_CURLY;
data = g_malloc(sizeof(ThemeImage));
data->refcount = 1;
data->background = NULL;
data->overlay = NULL;
data->gap_start = NULL;
data->gap = NULL;
data->gap_end = NULL;
data->recolorable = FALSE;
data->match_data.function = 0;
data->match_data.detail = NULL;
data->match_data.flags = 0;
token = g_scanner_peek_next_token(scanner);
while (token != G_TOKEN_RIGHT_CURLY)
{
switch (token)
{
case TOKEN_FUNCTION:
token = theme_parse_function(scanner, data);
break;
case TOKEN_RECOLORABLE:
token = theme_parse_recolorable(scanner, data);
break;
case TOKEN_DETAIL:
token = theme_parse_detail(scanner, data);
break;
case TOKEN_STATE:
token = theme_parse_state(scanner, data);
break;
case TOKEN_SHADOW:
token = theme_parse_shadow(scanner, data);
break;
case TOKEN_GAP_SIDE:
token = theme_parse_gap_side(scanner, data);
break;
case TOKEN_ARROW_DIRECTION:
token = theme_parse_arrow_direction(scanner, data);
break;
case TOKEN_ORIENTATION:
token = theme_parse_orientation(scanner, data);
break;
case TOKEN_FILE:
token = theme_parse_file(settings, scanner, &data->background);
break;
case TOKEN_BORDER:
token = theme_parse_border(scanner, &data->background);
break;
case TOKEN_STRETCH:
token = theme_parse_stretch(scanner, &data->background);
break;
case TOKEN_GAP_FILE:
token = theme_parse_file(settings, scanner, &data->gap);
break;
case TOKEN_GAP_BORDER:
token = theme_parse_border(scanner, &data->gap);
break;
case TOKEN_GAP_START_FILE:
token = theme_parse_file(settings, scanner, &data->gap_start);
break;
case TOKEN_GAP_START_BORDER:
token = theme_parse_border(scanner, &data->gap_start);
break;
case TOKEN_GAP_END_FILE:
token = theme_parse_file(settings, scanner, &data->gap_end);
break;
case TOKEN_GAP_END_BORDER:
token = theme_parse_border(scanner, &data->gap_end);
break;
case TOKEN_OVERLAY_FILE:
token = theme_parse_file(settings, scanner, &data->overlay);
break;
case TOKEN_OVERLAY_BORDER:
token = theme_parse_border(scanner, &data->overlay);
break;
case TOKEN_OVERLAY_STRETCH:
token = theme_parse_stretch(scanner, &data->overlay);
break;
default:
g_scanner_get_next_token(scanner);
token = G_TOKEN_RIGHT_CURLY;
break;
}
if (token != G_TOKEN_NONE)
{
/* error - cleanup for exit */
theme_image_unref (data);
*data_return = NULL;
return token;
}
token = g_scanner_peek_next_token(scanner);
}
token = g_scanner_get_next_token(scanner);
if (data->background && !data->background->filename)
{
g_scanner_warn (scanner, "Background image options specified without filename");
theme_pixbuf_destroy (data->background);
data->background = NULL;
}
if (data->overlay && !data->overlay->filename)
{
g_scanner_warn (scanner, "Overlay image options specified without filename");
theme_pixbuf_destroy (data->overlay);
data->overlay = NULL;
}
if (token != G_TOKEN_RIGHT_CURLY)
{
/* error - cleanup for exit */
theme_image_unref (data);
*data_return = NULL;
return G_TOKEN_RIGHT_CURLY;
}
/* everything is fine now - insert yer cruft */
*data_return = data;
return G_TOKEN_NONE;
}
static guint
pixbuf_rc_style_parse (GtkRcStyle *rc_style,
GtkSettings *settings,
GScanner *scanner)
{
static GQuark scope_id = 0;
PixbufRcStyle *pixbuf_style = PIXBUF_RC_STYLE (rc_style);
guint old_scope;
guint token;
gint i;
ThemeImage *img;
/* Set up a new scope in this scanner. */
if (!scope_id)
scope_id = g_quark_from_string("pixbuf_theme_engine");
/* If we bail out due to errors, we *don't* reset the scope, so the
* error messaging code can make sense of our tokens.
*/
old_scope = g_scanner_set_scope(scanner, scope_id);
/* Now check if we already added our symbols to this scope
* (in some previous call to theme_parse_rc_style for the
* same scanner.
*/
if (!g_scanner_lookup_symbol(scanner, theme_symbols[0].name))
{
g_scanner_freeze_symbol_table(scanner);
for (i = 0; i < G_N_ELEMENTS (theme_symbols); i++)
g_scanner_scope_add_symbol(scanner, scope_id,
theme_symbols[i].name,
GINT_TO_POINTER(theme_symbols[i].token));
g_scanner_thaw_symbol_table(scanner);
}
/* We're ready to go, now parse the top level */
token = g_scanner_peek_next_token(scanner);
while (token != G_TOKEN_RIGHT_CURLY)
{
switch (token)
{
case TOKEN_IMAGE:
img = NULL;
token = theme_parse_image(settings, scanner, pixbuf_style, &img);
break;
default:
g_scanner_get_next_token(scanner);
token = G_TOKEN_RIGHT_CURLY;
break;
}
if (token != G_TOKEN_NONE)
return token;
else
pixbuf_style->img_list = g_list_append(pixbuf_style->img_list, img);
token = g_scanner_peek_next_token(scanner);
}
g_scanner_get_next_token(scanner);
g_scanner_set_scope(scanner, old_scope);
return G_TOKEN_NONE;
}
static void
pixbuf_rc_style_merge (GtkRcStyle *dest,
GtkRcStyle *src)
{
if (PIXBUF_IS_RC_STYLE (src))
{
PixbufRcStyle *pixbuf_dest = PIXBUF_RC_STYLE (dest);
PixbufRcStyle *pixbuf_src = PIXBUF_RC_STYLE (src);
GList *tmp_list1, *tmp_list2;
if (pixbuf_src->img_list)
{
/* Copy src image list and append to dest image list */
tmp_list2 = g_list_last (pixbuf_dest->img_list);
tmp_list1 = pixbuf_src->img_list;
while (tmp_list1)
{
if (tmp_list2)
{
tmp_list2->next = g_list_alloc();
tmp_list2->next->data = tmp_list1->data;
tmp_list2->next->prev = tmp_list2;
tmp_list2 = tmp_list2->next;
}
else
{
pixbuf_dest->img_list = g_list_append (NULL, tmp_list1->data);
tmp_list2 = pixbuf_dest->img_list;
}
theme_image_ref (tmp_list1->data);
tmp_list1 = tmp_list1->next;
}
}
}
parent_class->merge (dest, src);
}
/* Create an empty style suitable to this RC style
*/
static GtkStyle *
pixbuf_rc_style_create_style (GtkRcStyle *rc_style)
{
return GTK_STYLE (g_object_new (PIXBUF_TYPE_STYLE, NULL));
}

View File

@@ -1,49 +0,0 @@
/* GTK+ Pixbuf Engine
* Copyright (C) 1998-2000 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
* Carsten Haitzler <raster@rasterman.com>
*/
#include <gtk/gtkrc.h>
typedef struct _PixbufRcStyle PixbufRcStyle;
typedef struct _PixbufRcStyleClass PixbufRcStyleClass;
extern GType pixbuf_type_rc_style;
#define PIXBUF_TYPE_RC_STYLE pixbuf_type_rc_style
#define PIXBUF_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PIXBUF_TYPE_RC_STYLE, PixbufRcStyle))
#define PIXBUF_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIXBUF_TYPE_RC_STYLE, PixbufRcStyleClass))
#define PIXBUF_IS_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PIXBUF_TYPE_RC_STYLE))
#define PIXBUF_IS_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIXBUF_TYPE_RC_STYLE))
#define PIXBUF_RC_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIXBUF_TYPE_RC_STYLE, PixbufRcStyleClass))
struct _PixbufRcStyle
{
GtkRcStyle parent_instance;
GList *img_list;
};
struct _PixbufRcStyleClass
{
GtkRcStyleClass parent_class;
};
void pixbuf_rc_style_register_type (GTypeModule *module);

View File

@@ -1,803 +0,0 @@
/* GTK+ Pixbuf Engine
* Copyright (C) 1998-2000 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
* Carsten Haitzler <raster@rasterman.com>
*/
#include <string.h>
#include "pixbuf.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
static GCache *pixbuf_cache = NULL;
static GdkPixbuf *
bilinear_gradient (GdkPixbuf *src,
gint src_x,
gint src_y,
gint width,
gint height)
{
guint n_channels = gdk_pixbuf_get_n_channels (src);
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
guchar *src_pixels = gdk_pixbuf_get_pixels (src);
guchar *p1, *p2, *p3, *p4;
guint dest_rowstride;
guchar *dest_pixels;
GdkPixbuf *result;
int i, j, k;
p1 = src_pixels + (src_y - 1) * src_rowstride + (src_x - 1) * n_channels;
p2 = p1 + n_channels;
p3 = src_pixels + src_y * src_rowstride + (src_x - 1) * n_channels;
p4 = p3 + n_channels;
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
width, height);
dest_rowstride = gdk_pixbuf_get_rowstride (result);
dest_pixels = gdk_pixbuf_get_pixels (result);
for (i = 0; i < height; i++)
{
guchar *p = dest_pixels + dest_rowstride *i;
guint v[4];
gint dv[4];
for (k = 0; k < n_channels; k++)
{
guint start = ((height - i) * p1[k] + (1 + i) * p3[k]) / (height + 1);
guint end = ((height - i) * p2[k] + (1 + i) * p4[k]) / (height + 1);
dv[k] = (((gint)end - (gint)start) << 16) / (width + 1);
v[k] = (start << 16) + dv[k] + 0x8000;
}
for (j = width; j; j--)
{
for (k = 0; k < n_channels; k++)
{
*(p++) = v[k] >> 16;
v[k] += dv[k];
}
}
}
return result;
}
static GdkPixbuf *
horizontal_gradient (GdkPixbuf *src,
gint src_x,
gint src_y,
gint width,
gint height)
{
guint n_channels = gdk_pixbuf_get_n_channels (src);
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
guchar *src_pixels = gdk_pixbuf_get_pixels (src);
guint dest_rowstride;
guchar *dest_pixels;
GdkPixbuf *result;
int i, j, k;
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
width, height);
dest_rowstride = gdk_pixbuf_get_rowstride (result);
dest_pixels = gdk_pixbuf_get_pixels (result);
for (i = 0; i < height; i++)
{
guchar *p = dest_pixels + dest_rowstride *i;
guchar *p1 = src_pixels + (src_y + i) * src_rowstride + (src_x - 1) * n_channels;
guchar *p2 = p1 + n_channels;
guint v[4];
gint dv[4];
for (k = 0; k < n_channels; k++)
{
dv[k] = (((gint)p2[k] - (gint)p1[k]) << 16) / (width + 1);
v[k] = (p1[k] << 16) + dv[k] + 0x8000;
}
for (j = width; j; j--)
{
for (k = 0; k < n_channels; k++)
{
*(p++) = v[k] >> 16;
v[k] += dv[k];
}
}
}
return result;
}
static GdkPixbuf *
vertical_gradient (GdkPixbuf *src,
gint src_x,
gint src_y,
gint width,
gint height)
{
guint n_channels = gdk_pixbuf_get_n_channels (src);
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
guchar *src_pixels = gdk_pixbuf_get_pixels (src);
guchar *top_pixels, *bottom_pixels;
guint dest_rowstride;
guchar *dest_pixels;
GdkPixbuf *result;
int i, j;
top_pixels = src_pixels + (src_y - 1) * src_rowstride + (src_x) * n_channels;
bottom_pixels = top_pixels + src_rowstride;
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
width, height);
dest_rowstride = gdk_pixbuf_get_rowstride (result);
dest_pixels = gdk_pixbuf_get_pixels (result);
for (i = 0; i < height; i++)
{
guchar *p = dest_pixels + dest_rowstride *i;
guchar *p1 = top_pixels;
guchar *p2 = bottom_pixels;
for (j = width * n_channels; j; j--)
*(p++) = ((height - i) * *(p1++) + (1 + i) * *(p2++)) / (height + 1);
}
return result;
}
static GdkPixbuf *
replicate_single (GdkPixbuf *src,
gint src_x,
gint src_y,
gint width,
gint height)
{
guint n_channels = gdk_pixbuf_get_n_channels (src);
guchar *pixels = (gdk_pixbuf_get_pixels (src) +
src_y * gdk_pixbuf_get_rowstride (src) +
src_x * n_channels);
guchar r = *(pixels++);
guchar g = *(pixels++);
guchar b = *(pixels++);
guint dest_rowstride;
guchar *dest_pixels;
guchar a = 0;
GdkPixbuf *result;
int i, j;
if (n_channels == 4)
a = *(pixels++);
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
width, height);
dest_rowstride = gdk_pixbuf_get_rowstride (result);
dest_pixels = gdk_pixbuf_get_pixels (result);
for (i = 0; i < height; i++)
{
guchar *p = dest_pixels + dest_rowstride *i;
for (j = 0; j < width; j++)
{
*(p++) = r;
*(p++) = g;
*(p++) = b;
if (n_channels == 4)
*(p++) = a;
}
}
return result;
}
static GdkPixbuf *
replicate_rows (GdkPixbuf *src,
gint src_x,
gint src_y,
gint width,
gint height)
{
guint n_channels = gdk_pixbuf_get_n_channels (src);
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
guchar *pixels = (gdk_pixbuf_get_pixels (src) + src_y * src_rowstride + src_x * n_channels);
guchar *dest_pixels;
GdkPixbuf *result;
guint dest_rowstride;
int i;
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
width, height);
dest_rowstride = gdk_pixbuf_get_rowstride (result);
dest_pixels = gdk_pixbuf_get_pixels (result);
for (i = 0; i < height; i++)
memcpy (dest_pixels + dest_rowstride * i, pixels, n_channels * width);
return result;
}
static GdkPixbuf *
replicate_cols (GdkPixbuf *src,
gint src_x,
gint src_y,
gint width,
gint height)
{
guint n_channels = gdk_pixbuf_get_n_channels (src);
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
guchar *pixels = (gdk_pixbuf_get_pixels (src) + src_y * src_rowstride + src_x * n_channels);
guchar *dest_pixels;
GdkPixbuf *result;
guint dest_rowstride;
int i, j;
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
width, height);
dest_rowstride = gdk_pixbuf_get_rowstride (result);
dest_pixels = gdk_pixbuf_get_pixels (result);
for (i = 0; i < height; i++)
{
guchar *p = dest_pixels + dest_rowstride * i;
guchar *q = pixels + src_rowstride * i;
guchar r = *(q++);
guchar g = *(q++);
guchar b = *(q++);
guchar a = 0;
if (n_channels == 4)
a = *(q++);
for (j = 0; j < width; j++)
{
*(p++) = r;
*(p++) = g;
*(p++) = b;
if (n_channels == 4)
*(p++) = a;
}
}
return result;
}
/* Scale the rectangle (src_x, src_y, src_width, src_height)
* onto the rectangle (dest_x, dest_y, dest_width, dest_height)
* of the destination, clip by clip_rect and render
*/
static void
pixbuf_render (GdkPixbuf *src,
guint hints,
GdkWindow *window,
GdkBitmap *mask,
GdkRectangle *clip_rect,
gint src_x,
gint src_y,
gint src_width,
gint src_height,
gint dest_x,
gint dest_y,
gint dest_width,
gint dest_height)
{
GdkPixbuf *tmp_pixbuf;
GdkRectangle rect;
int x_offset, y_offset;
gboolean has_alpha = gdk_pixbuf_get_has_alpha (src);
gint src_rowstride = gdk_pixbuf_get_rowstride (src);
gint src_n_channels = gdk_pixbuf_get_n_channels (src);
if (dest_width <= 0 || dest_height <= 0)
return;
rect.x = dest_x;
rect.y = dest_y;
rect.width = dest_width;
rect.height = dest_height;
if (hints & THEME_MISSING)
return;
/* FIXME: Because we use the mask to shape windows, we don't use
* clip_rect to clip what we draw to the mask, only to clip
* what we actually draw. But this leads to the horrible ineffiency
* of scale the whole image to get a little bit of it.
*/
if (!mask && clip_rect)
{
if (!gdk_rectangle_intersect (clip_rect, &rect, &rect))
return;
}
if (dest_width == src_width && dest_height == src_height)
{
tmp_pixbuf = g_object_ref (src);
x_offset = src_x + rect.x - dest_x;
y_offset = src_y + rect.y - dest_y;
}
else if (src_width == 0 && src_height == 0)
{
tmp_pixbuf = bilinear_gradient (src, src_x, src_y, dest_width, dest_height);
x_offset = rect.x - dest_x;
y_offset = rect.y - dest_y;
}
else if (src_width == 0 && dest_height == src_height)
{
tmp_pixbuf = horizontal_gradient (src, src_x, src_y, dest_width, dest_height);
x_offset = rect.x - dest_x;
y_offset = rect.y - dest_y;
}
else if (src_height == 0 && dest_width == src_width)
{
tmp_pixbuf = vertical_gradient (src, src_x, src_y, dest_width, dest_height);
x_offset = rect.x - dest_x;
y_offset = rect.y - dest_y;
}
else if ((hints & THEME_CONSTANT_COLS) && (hints & THEME_CONSTANT_ROWS))
{
tmp_pixbuf = replicate_single (src, src_x, src_y, dest_width, dest_height);
x_offset = rect.x - dest_x;
y_offset = rect.y - dest_y;
}
else if (dest_width == src_width && (hints & THEME_CONSTANT_COLS))
{
tmp_pixbuf = replicate_rows (src, src_x, src_y, dest_width, dest_height);
x_offset = rect.x - dest_x;
y_offset = rect.y - dest_y;
}
else if (dest_height == src_height && (hints & THEME_CONSTANT_ROWS))
{
tmp_pixbuf = replicate_cols (src, src_x, src_y, dest_width, dest_height);
x_offset = rect.x - dest_x;
y_offset = rect.y - dest_y;
}
else
{
double x_scale = (double)dest_width / src_width;
double y_scale = (double)dest_height / src_height;
guchar *pixels;
GdkPixbuf *partial_src;
pixels = (gdk_pixbuf_get_pixels (src)
+ src_y * src_rowstride
+ src_x * src_n_channels);
partial_src = gdk_pixbuf_new_from_data (pixels, GDK_COLORSPACE_RGB,
has_alpha,
8, src_width, src_height,
src_rowstride,
NULL, NULL);
tmp_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
has_alpha, 8,
rect.width, rect.height);
gdk_pixbuf_scale (partial_src, tmp_pixbuf,
0, 0, rect.width, rect.height,
dest_x - rect.x, dest_y - rect.y,
x_scale, y_scale,
GDK_INTERP_BILINEAR);
gdk_pixbuf_unref (partial_src);
x_offset = 0;
y_offset = 0;
}
if (mask)
{
gdk_pixbuf_render_threshold_alpha (tmp_pixbuf, mask,
x_offset, y_offset,
rect.x, rect.y,
rect.width, rect.height,
128);
}
gdk_pixbuf_render_to_drawable_alpha (tmp_pixbuf, window,
x_offset, y_offset,
rect.x, rect.y,
rect.width, rect.height,
GDK_PIXBUF_ALPHA_FULL, 128,
GDK_RGB_DITHER_NORMAL,
0, 0);
gdk_pixbuf_unref (tmp_pixbuf);
}
ThemePixbuf *
theme_pixbuf_new (void)
{
ThemePixbuf *result = g_new0 (ThemePixbuf, 1);
result->filename = NULL;
result->pixbuf = NULL;
result->stretch = TRUE;
result->border_left = 0;
result->border_right = 0;
result->border_bottom = 0;
result->border_top = 0;
return result;
}
void
theme_pixbuf_destroy (ThemePixbuf *theme_pb)
{
theme_pixbuf_set_filename (theme_pb, NULL);
g_free (theme_pb);
}
void
theme_pixbuf_set_filename (ThemePixbuf *theme_pb,
const char *filename)
{
if (theme_pb->pixbuf)
{
g_cache_remove (pixbuf_cache, theme_pb->pixbuf);
theme_pb->pixbuf = NULL;
}
if (theme_pb->filename)
g_free (theme_pb->filename);
if (filename)
theme_pb->filename = g_strdup (filename);
else
theme_pb->filename = NULL;
}
static guint
compute_hint (GdkPixbuf *pixbuf,
gint x0,
gint x1,
gint y0,
gint y1)
{
int i, j;
int hints = THEME_CONSTANT_ROWS | THEME_CONSTANT_COLS | THEME_MISSING;
int n_channels = gdk_pixbuf_get_n_channels (pixbuf);
guchar *data = gdk_pixbuf_get_pixels (pixbuf);
int rowstride = gdk_pixbuf_get_rowstride (pixbuf);
if (x0 == x1 || y0 == y1)
return 0;
for (i = y0; i < y1; i++)
{
guchar *p = data + i * rowstride + x0 * n_channels;
guchar r = p[0];
guchar g = p[1];
guchar b = p[2];
guchar a = 0;
if (n_channels == 4)
a = p[3];
for (j = x0; j < x1 ; j++)
{
if (n_channels != 4 || p[3] != 0)
{
hints &= ~THEME_MISSING;
if (!(hints & THEME_CONSTANT_ROWS))
goto cols;
}
if (r != *(p++) ||
g != *(p++) ||
b != *(p++) ||
(n_channels != 4 && a != *(p++)))
{
hints &= ~THEME_CONSTANT_ROWS;
if (!(hints & THEME_MISSING))
goto cols;
}
}
}
cols:
for (i = y0 + 1; i < y1; i++)
{
guchar *base = data + y0 * rowstride + x0 * n_channels;
guchar *p = data + i * rowstride + x0 * n_channels;
if (memcmp (p, base, n_channels * (x1 - x0)) != 0)
{
hints &= ~THEME_CONSTANT_COLS;
return hints;
}
}
return hints;
}
static void
theme_pixbuf_compute_hints (ThemePixbuf *theme_pb)
{
int i, j;
gint width = gdk_pixbuf_get_width (theme_pb->pixbuf);
gint height = gdk_pixbuf_get_height (theme_pb->pixbuf);
if (theme_pb->border_left + theme_pb->border_right > width ||
theme_pb->border_top + theme_pb->border_bottom > height)
{
g_warning ("Invalid borders specified for theme pixmap:\n"
" %s,\n"
"borders don't fit within the image", theme_pb->filename);
if (theme_pb->border_left + theme_pb->border_right > width)
{
theme_pb->border_left = width / 2;
theme_pb->border_right = (width + 1) / 2;
}
if (theme_pb->border_bottom + theme_pb->border_top > height)
{
theme_pb->border_top = height / 2;
theme_pb->border_bottom = (height + 1) / 2;
}
}
for (i = 0; i < 3; i++)
{
gint y0, y1;
switch (i)
{
case 0:
y0 = 0;
y1 = theme_pb->border_top;
break;
case 1:
y0 = theme_pb->border_top;
y1 = height - theme_pb->border_bottom;
break;
default:
y0 = height - theme_pb->border_bottom;
y1 = height;
break;
}
for (j = 0; j < 3; j++)
{
gint x0, x1;
switch (j)
{
case 0:
x0 = 0;
x1 = theme_pb->border_left;
break;
case 1:
x0 = theme_pb->border_left;
x1 = width - theme_pb->border_right;
break;
default:
x0 = width - theme_pb->border_right;
x1 = width;
break;
}
theme_pb->hints[i][j] = compute_hint (theme_pb->pixbuf, x0, x1, y0, y1);
}
}
}
void
theme_pixbuf_set_border (ThemePixbuf *theme_pb,
gint left,
gint right,
gint top,
gint bottom)
{
theme_pb->border_left = left;
theme_pb->border_right = right;
theme_pb->border_top = top;
theme_pb->border_bottom = bottom;
if (theme_pb->pixbuf)
theme_pixbuf_compute_hints (theme_pb);
}
void
theme_pixbuf_set_stretch (ThemePixbuf *theme_pb,
gboolean stretch)
{
theme_pb->stretch = stretch;
if (theme_pb->pixbuf)
theme_pixbuf_compute_hints (theme_pb);
}
GdkPixbuf *
pixbuf_cache_value_new (gchar *filename)
{
GError *err = NULL;
GdkPixbuf *result = gdk_pixbuf_new_from_file (filename, &err);
if (!result)
{
g_warning ("Pixbuf theme: Cannot load pixmap file %s: %s\n",
filename, err->message);
g_error_free (err);
}
return result;
}
GdkPixbuf *
theme_pixbuf_get_pixbuf (ThemePixbuf *theme_pb)
{
if (!theme_pb->pixbuf)
{
if (!pixbuf_cache)
pixbuf_cache = g_cache_new ((GCacheNewFunc)pixbuf_cache_value_new,
(GCacheDestroyFunc)gdk_pixbuf_unref,
(GCacheDupFunc)g_strdup,
(GCacheDestroyFunc)g_free,
g_str_hash, g_direct_hash, g_str_equal);
theme_pb->pixbuf = g_cache_insert (pixbuf_cache, theme_pb->filename);
if (theme_pb->stretch)
theme_pixbuf_compute_hints (theme_pb);
}
return theme_pb->pixbuf;
}
void
theme_pixbuf_render (ThemePixbuf *theme_pb,
GdkWindow *window,
GdkBitmap *mask,
GdkRectangle *clip_rect,
guint component_mask,
gboolean center,
gint x,
gint y,
gint width,
gint height)
{
GdkPixbuf *pixbuf = theme_pixbuf_get_pixbuf (theme_pb);
gint src_x[4], src_y[4], dest_x[4], dest_y[4];
gint pixbuf_width = gdk_pixbuf_get_width (pixbuf);
gint pixbuf_height = gdk_pixbuf_get_height (pixbuf);
if (!pixbuf)
return;
if (theme_pb->stretch)
{
src_x[0] = 0;
src_x[1] = theme_pb->border_left;
src_x[2] = pixbuf_width - theme_pb->border_right;
src_x[3] = pixbuf_width;
src_y[0] = 0;
src_y[1] = theme_pb->border_top;
src_y[2] = pixbuf_height - theme_pb->border_bottom;
src_y[3] = pixbuf_height;
dest_x[0] = x;
dest_x[1] = x + theme_pb->border_left;
dest_x[2] = x + width - theme_pb->border_right;
dest_x[3] = x + width;
dest_y[0] = y;
dest_y[1] = y + theme_pb->border_top;
dest_y[2] = y + height - theme_pb->border_bottom;
dest_y[3] = y + height;
if (component_mask & COMPONENT_ALL)
component_mask = (COMPONENT_ALL - 1) & ~component_mask;
#define RENDER_COMPONENT(X1,X2,Y1,Y2) \
pixbuf_render (pixbuf, theme_pb->hints[Y1][X1], window, mask, clip_rect, \
src_x[X1], src_y[Y1], \
src_x[X2] - src_x[X1], src_y[Y2] - src_y[Y1], \
dest_x[X1], dest_y[Y1], \
dest_x[X2] - dest_x[X1], dest_y[Y2] - dest_y[Y1]);
if (component_mask & COMPONENT_NORTH_WEST)
RENDER_COMPONENT (0, 1, 0, 1);
if (component_mask & COMPONENT_NORTH)
RENDER_COMPONENT (1, 2, 0, 1);
if (component_mask & COMPONENT_NORTH_EAST)
RENDER_COMPONENT (2, 3, 0, 1);
if (component_mask & COMPONENT_WEST)
RENDER_COMPONENT (0, 1, 1, 2);
if (component_mask & COMPONENT_CENTER)
RENDER_COMPONENT (1, 2, 1, 2);
if (component_mask & COMPONENT_EAST)
RENDER_COMPONENT (2, 3, 1, 2);
if (component_mask & COMPONENT_SOUTH_WEST)
RENDER_COMPONENT (0, 1, 2, 3);
if (component_mask & COMPONENT_SOUTH)
RENDER_COMPONENT (1, 2, 2, 3);
if (component_mask & COMPONENT_SOUTH_EAST)
RENDER_COMPONENT (2, 3, 2, 3);
}
else
{
if (center)
{
x += (width - pixbuf_width) / 2;
y += (height - pixbuf_height) / 2;
pixbuf_render (pixbuf, 0, window, NULL, clip_rect,
0, 0,
pixbuf_width, pixbuf_height,
x, y,
pixbuf_width, pixbuf_height);
}
else
{
GdkPixmap *tmp_pixmap;
GdkGC *tmp_gc;
GdkGCValues gc_values;
tmp_pixmap = gdk_pixmap_new (window,
pixbuf_width,
pixbuf_height,
-1);
tmp_gc = gdk_gc_new (tmp_pixmap);
gdk_pixbuf_render_to_drawable (pixbuf, tmp_pixmap, tmp_gc,
0, 0,
0, 0,
pixbuf_width, pixbuf_height,
GDK_RGB_DITHER_NORMAL,
0, 0);
gdk_gc_unref (tmp_gc);
gc_values.fill = GDK_TILED;
gc_values.tile = tmp_pixmap;
tmp_gc = gdk_gc_new_with_values (window,
&gc_values, GDK_GC_FILL | GDK_GC_TILE);
if (clip_rect)
gdk_draw_rectangle (window, tmp_gc, TRUE,
clip_rect->x, clip_rect->y, clip_rect->width, clip_rect->height);
else
gdk_draw_rectangle (window, tmp_gc, TRUE, x, y, width, height);
gdk_gc_unref (tmp_gc);
gdk_pixmap_unref (tmp_pixmap);
}
}
}

View File

@@ -1,49 +0,0 @@
/* GTK+ Pixbuf Engine
* Copyright (C) 1998-2000 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
* Carsten Haitzler <raster@rasterman.com>
*/
#include <gtk/gtkstyle.h>
typedef struct _PixbufStyle PixbufStyle;
typedef struct _PixbufStyleClass PixbufStyleClass;
extern GType pixbuf_type_style;
#define PIXBUF_TYPE_STYLE pixbuf_type_style
#define PIXBUF_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PIXBUF_TYPE_STYLE, PixbufStyle))
#define PIXBUF_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIXBUF_TYPE_STYLE, PixbufStyleClass))
#define PIXBUF_IS_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PIXBUF_TYPE_STYLE))
#define PIXBUF_IS_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIXBUF_TYPE_STYLE))
#define PIXBUF_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIXBUF_TYPE_STYLE, PixbufStyleClass))
struct _PixbufStyle
{
GtkStyle parent_instance;
};
struct _PixbufStyleClass
{
GtkStyleClass parent_class;
};
void pixbuf_style_register_type (GTypeModule *module);

View File

@@ -1,196 +0,0 @@
/* GTK+ Pixbuf Engine
* Copyright (C) 1998-2000 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
* Carsten Haitzler <raster@rasterman.com>
*/
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
/* internals */
typedef struct _ThemeData ThemeData;
typedef struct _ThemeImage ThemeImage;
typedef struct _ThemeMatchData ThemeMatchData;
typedef struct _ThemePixbuf ThemePixbuf;
enum
{
TOKEN_IMAGE = G_TOKEN_LAST + 1,
TOKEN_FUNCTION,
TOKEN_FILE,
TOKEN_STRETCH,
TOKEN_RECOLORABLE,
TOKEN_BORDER,
TOKEN_DETAIL,
TOKEN_STATE,
TOKEN_SHADOW,
TOKEN_GAP_SIDE,
TOKEN_GAP_FILE,
TOKEN_GAP_BORDER,
TOKEN_GAP_START_FILE,
TOKEN_GAP_START_BORDER,
TOKEN_GAP_END_FILE,
TOKEN_GAP_END_BORDER,
TOKEN_OVERLAY_FILE,
TOKEN_OVERLAY_BORDER,
TOKEN_OVERLAY_STRETCH,
TOKEN_ARROW_DIRECTION,
TOKEN_D_HLINE,
TOKEN_D_VLINE,
TOKEN_D_SHADOW,
TOKEN_D_POLYGON,
TOKEN_D_ARROW,
TOKEN_D_DIAMOND,
TOKEN_D_OVAL,
TOKEN_D_STRING,
TOKEN_D_BOX,
TOKEN_D_FLAT_BOX,
TOKEN_D_CHECK,
TOKEN_D_OPTION,
TOKEN_D_CROSS,
TOKEN_D_RAMP,
TOKEN_D_TAB,
TOKEN_D_SHADOW_GAP,
TOKEN_D_BOX_GAP,
TOKEN_D_EXTENSION,
TOKEN_D_FOCUS,
TOKEN_D_SLIDER,
TOKEN_D_ENTRY,
TOKEN_D_HANDLE,
TOKEN_D_STEPPER,
TOKEN_TRUE,
TOKEN_FALSE,
TOKEN_TOP,
TOKEN_UP,
TOKEN_BOTTOM,
TOKEN_DOWN,
TOKEN_LEFT,
TOKEN_RIGHT,
TOKEN_NORMAL,
TOKEN_ACTIVE,
TOKEN_PRELIGHT,
TOKEN_SELECTED,
TOKEN_INSENSITIVE,
TOKEN_NONE,
TOKEN_IN,
TOKEN_OUT,
TOKEN_ETCHED_IN,
TOKEN_ETCHED_OUT,
TOKEN_ORIENTATION,
TOKEN_HORIZONTAL,
TOKEN_VERTICAL
};
typedef enum
{
COMPONENT_NORTH_WEST = 1 << 0,
COMPONENT_NORTH = 1 << 1,
COMPONENT_NORTH_EAST = 1 << 2,
COMPONENT_WEST = 1 << 3,
COMPONENT_CENTER = 1 << 4,
COMPONENT_EAST = 1 << 5,
COMPONENT_SOUTH_EAST = 1 << 6,
COMPONENT_SOUTH = 1 << 7,
COMPONENT_SOUTH_WEST = 1 << 8,
COMPONENT_ALL = 1 << 9
} ThemePixbufComponent;
typedef enum {
THEME_MATCH_GAP_SIDE = 1 << 0,
THEME_MATCH_ORIENTATION = 1 << 1,
THEME_MATCH_STATE = 1 << 2,
THEME_MATCH_SHADOW = 1 << 3,
THEME_MATCH_ARROW_DIRECTION = 1 << 4
} ThemeMatchFlags;
typedef enum {
THEME_CONSTANT_ROWS = 1 << 0,
THEME_CONSTANT_COLS = 1 << 1,
THEME_MISSING = 1 << 2
} ThemeRenderHints;
struct _ThemePixbuf
{
gchar *filename;
GdkPixbuf *pixbuf;
gboolean stretch;
gint border_left;
gint border_right;
gint border_bottom;
gint border_top;
guint hints[3][3];
};
struct _ThemeMatchData
{
guint function; /* Mandatory */
gchar *detail;
ThemeMatchFlags flags;
GtkPositionType gap_side;
GtkOrientation orientation;
GtkStateType state;
GtkShadowType shadow;
GtkArrowType arrow_direction;
};
struct _ThemeImage
{
guint refcount;
ThemePixbuf *background;
ThemePixbuf *overlay;
ThemePixbuf *gap_start;
ThemePixbuf *gap;
ThemePixbuf *gap_end;
gchar recolorable;
ThemeMatchData match_data;
};
ThemePixbuf *theme_pixbuf_new (void);
void theme_pixbuf_destroy (ThemePixbuf *theme_pb);
void theme_pixbuf_set_filename (ThemePixbuf *theme_pb,
const char *filename);
GdkPixbuf * theme_pixbuf_get_pixbuf (ThemePixbuf *theme_pb);
void theme_pixbuf_set_border (ThemePixbuf *theme_pb,
gint left,
gint right,
gint top,
gint bottom);
void theme_pixbuf_set_stretch (ThemePixbuf *theme_pb,
gboolean stretch);
void theme_pixbuf_render (ThemePixbuf *theme_pb,
GdkWindow *window,
GdkBitmap *mask,
GdkRectangle *clip_rect,
guint component_mask,
gboolean center,
gint dest_x,
gint dest_y,
gint dest_width,
gint dest_height);
extern GtkStyleClass pixmap_default_class;