summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-08-16 21:30:27 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-08-16 21:30:27 +0300
commit435058ef576b86b89ac23715b21495cdaf601288 (patch)
treed967c18438a82eef7a24496b3bd5df4e06a796a9
parent5318cdbf7e16a454f3b685f5ddd5a36a1d072772 (diff)
downloadmetacity-435058ef576b86b89ac23715b21495cdaf601288.tar.gz
libmetacity: use callback function to get button state
-rw-r--r--libmetacity/meta-theme-gtk.c60
-rw-r--r--libmetacity/meta-theme-impl-private.h5
-rw-r--r--libmetacity/meta-theme-impl.c58
-rw-r--r--libmetacity/meta-theme.c41
-rw-r--r--libmetacity/meta-theme.h7
-rw-r--r--src/ui/frames.c190
-rw-r--r--theme-viewer/theme-viewer-window.c109
7 files changed, 237 insertions, 233 deletions
diff --git a/libmetacity/meta-theme-gtk.c b/libmetacity/meta-theme-gtk.c
index 708526d6..9fcf25b2 100644
--- a/libmetacity/meta-theme-gtk.c
+++ b/libmetacity/meta-theme-gtk.c
@@ -734,64 +734,6 @@ get_class_from_button_function (MetaButtonFunction function)
}
static void
-get_button_rect (MetaButtonFunction function,
- const MetaFrameGeometry *fgeom,
- GdkRectangle *rect)
-{
- switch (function)
- {
- case META_BUTTON_FUNCTION_CLOSE:
- *rect = fgeom->close_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_SHADE:
- *rect = fgeom->shade_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_UNSHADE:
- *rect = fgeom->unshade_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_ABOVE:
- *rect = fgeom->above_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_UNABOVE:
- *rect = fgeom->unabove_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_STICK:
- *rect = fgeom->stick_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_UNSTICK:
- *rect = fgeom->unstick_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_MAXIMIZE:
- *rect = fgeom->max_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_MINIMIZE:
- *rect = fgeom->min_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_MENU:
- *rect = fgeom->menu_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_APPMENU:
- *rect = fgeom->appmenu_rect.visible;
- break;
-
- case META_BUTTON_FUNCTION_LAST:
- default:
- g_assert_not_reached ();
- break;
- }
-}
-
-static void
meta_theme_gtk_draw_frame (MetaThemeImpl *impl,
MetaFrameStyle *style,
MetaStyleInfo *style_info,
@@ -909,7 +851,7 @@ meta_theme_gtk_draw_frame (MetaThemeImpl *impl,
cairo_save (cr);
- get_button_rect (button_function, fgeom, &tmp_rect);
+ get_button_rect_for_function (button_function, fgeom, &tmp_rect);
button_rect.x = tmp_rect.x / scale;
button_rect.y = tmp_rect.y / scale;
diff --git a/libmetacity/meta-theme-impl-private.h b/libmetacity/meta-theme-impl-private.h
index 0144f797..14d90fda 100644
--- a/libmetacity/meta-theme-impl-private.h
+++ b/libmetacity/meta-theme-impl-private.h
@@ -89,6 +89,11 @@ MetaFrameStyleSet *meta_theme_impl_get_style_set (MetaThemeImpl *impl
MetaFrameType type);
G_GNUC_INTERNAL
+void get_button_rect_for_function (MetaButtonFunction function,
+ const MetaFrameGeometry *fgeom,
+ GdkRectangle *rect);
+
+G_GNUC_INTERNAL
void scale_border (GtkBorder *border,
double factor);
diff --git a/libmetacity/meta-theme-impl.c b/libmetacity/meta-theme-impl.c
index f5583baf..773392c2 100644
--- a/libmetacity/meta-theme-impl.c
+++ b/libmetacity/meta-theme-impl.c
@@ -132,6 +132,64 @@ meta_theme_impl_get_style_set (MetaThemeImpl *impl,
}
void
+get_button_rect_for_function (MetaButtonFunction function,
+ const MetaFrameGeometry *fgeom,
+ GdkRectangle *rect)
+{
+ switch (function)
+ {
+ case META_BUTTON_FUNCTION_CLOSE:
+ *rect = fgeom->close_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_SHADE:
+ *rect = fgeom->shade_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_UNSHADE:
+ *rect = fgeom->unshade_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_ABOVE:
+ *rect = fgeom->above_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_UNABOVE:
+ *rect = fgeom->unabove_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_STICK:
+ *rect = fgeom->stick_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_UNSTICK:
+ *rect = fgeom->unstick_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_MAXIMIZE:
+ *rect = fgeom->max_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_MINIMIZE:
+ *rect = fgeom->min_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_MENU:
+ *rect = fgeom->menu_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_APPMENU:
+ *rect = fgeom->appmenu_rect.visible;
+ break;
+
+ case META_BUTTON_FUNCTION_LAST:
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+void
scale_border (GtkBorder *border,
double factor)
{
diff --git a/libmetacity/meta-theme.c b/libmetacity/meta-theme.c
index 3643b51f..70aa2ea1 100644
--- a/libmetacity/meta-theme.c
+++ b/libmetacity/meta-theme.c
@@ -647,17 +647,18 @@ meta_theme_calc_geometry (MetaTheme *theme,
}
void
-meta_theme_draw_frame (MetaTheme *theme,
- const gchar *variant,
- cairo_t *cr,
- MetaFrameType type,
- MetaFrameFlags flags,
- gint client_width,
- gint client_height,
- const gchar *title,
- MetaButtonState button_states[META_BUTTON_FUNCTION_LAST],
- GdkPixbuf *mini_icon,
- GdkPixbuf *icon)
+meta_theme_draw_frame (MetaTheme *theme,
+ const gchar *variant,
+ cairo_t *cr,
+ MetaFrameType type,
+ MetaFrameFlags flags,
+ gint client_width,
+ gint client_height,
+ const gchar *title,
+ MetaButtonStateFunc func,
+ gpointer user_data,
+ GdkPixbuf *mini_icon,
+ GdkPixbuf *icon)
{
MetaFrameStyle *style;
MetaThemeImplClass *impl_class;
@@ -665,6 +666,8 @@ meta_theme_draw_frame (MetaTheme *theme,
gint title_height;
PangoLayout *title_layout;
MetaFrameGeometry fgeom;
+ gint i;
+ MetaButtonState button_states[META_BUTTON_FUNCTION_LAST];
g_return_if_fail (type < META_FRAME_TYPE_LAST);
@@ -683,6 +686,22 @@ meta_theme_draw_frame (MetaTheme *theme,
title_height, flags, client_width, client_height,
&theme->button_layout, type, &fgeom);
+ for (i = 0; i < META_BUTTON_FUNCTION_LAST; i++)
+ {
+ MetaButtonState state;
+ GdkRectangle rect;
+
+ get_button_rect_for_function (i, &fgeom, &rect);
+
+ state = META_BUTTON_STATE_NORMAL;
+ if (func != NULL)
+ state = (* func) (i, rect, user_data);
+
+ g_assert (state >= META_BUTTON_STATE_NORMAL && state < META_BUTTON_STATE_LAST);
+
+ button_states[i] = state;
+ }
+
impl_class->draw_frame (theme->impl, style, style_info, cr, &fgeom,
title_layout, flags, button_states, mini_icon, icon);
diff --git a/libmetacity/meta-theme.h b/libmetacity/meta-theme.h
index d515f898..369e56cf 100644
--- a/libmetacity/meta-theme.h
+++ b/libmetacity/meta-theme.h
@@ -30,6 +30,10 @@ G_BEGIN_DECLS
typedef struct _MetaButtonSpace MetaButtonSpace;
typedef struct _MetaFrameGeometry MetaFrameGeometry;
+typedef MetaButtonState (* MetaButtonStateFunc) (MetaButtonFunction function,
+ GdkRectangle rect,
+ gpointer user_data);
+
#define META_TYPE_THEME meta_theme_get_type ()
G_DECLARE_FINAL_TYPE (MetaTheme, meta_theme, META, THEME, GObject)
@@ -186,7 +190,8 @@ void meta_theme_draw_frame (MetaTheme *theme,
gint client_width,
gint client_height,
const gchar *title,
- MetaButtonState button_states[META_BUTTON_FUNCTION_LAST],
+ MetaButtonStateFunc func,
+ gpointer user_data,
GdkPixbuf *mini_icon,
GdkPixbuf *icon);
diff --git a/src/ui/frames.c b/src/ui/frames.c
index c37a09aa..b730928f 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -2268,120 +2268,147 @@ meta_frames_draw (GtkWidget *widget,
return TRUE;
}
-static void
-meta_frames_paint (MetaFrames *frames,
- MetaUIFrame *frame,
- cairo_t *cr)
+typedef struct
{
- MetaFrameFlags flags;
- MetaFrameType type;
- GdkPixbuf *mini_icon;
- GdkPixbuf *icon;
- int w, h;
- MetaButtonState button_states[META_BUTTON_FUNCTION_LAST];
+ MetaFrames *frames;
+ MetaUIFrame *frame;
+} ButtonStateData;
+
+static MetaButtonState
+update_button_state (MetaButtonFunction function,
+ GdkRectangle rect,
+ gpointer user_data)
+{
+ ButtonStateData *data;
+ MetaButtonState state;
Window grab_frame;
- int i;
MetaGrabOp grab_op;
+ MetaFrameControl control;
- for (i = 0; i < META_BUTTON_FUNCTION_LAST; i++)
- button_states[i] = META_BUTTON_STATE_NORMAL;
+ data = (ButtonStateData *) user_data;
- grab_frame = meta_core_get_grab_frame (frames->xdisplay);
- grab_op = meta_core_get_grab_op (frames->xdisplay);
- if (grab_frame != frame->xwindow)
+ state = META_BUTTON_STATE_NORMAL;
+
+ grab_frame = meta_core_get_grab_frame (data->frames->xdisplay);
+ grab_op = meta_core_get_grab_op (data->frames->xdisplay);
+ if (grab_frame != data->frame->xwindow)
grab_op = META_GRAB_OP_NONE;
+ control = data->frame->prelit_control;
+
/* Set prelight state */
- switch (frame->prelit_control)
+ if (control == META_FRAME_CONTROL_MENU &&
+ function == META_BUTTON_FUNCTION_MENU)
{
- case META_FRAME_CONTROL_MENU:
if (grab_op == META_GRAB_OP_CLICKING_MENU)
- button_states[META_BUTTON_FUNCTION_MENU] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_MENU] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_APPMENU:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_APPMENU &&
+ function == META_BUTTON_FUNCTION_APPMENU)
+ {
if (grab_op == META_GRAB_OP_CLICKING_MENU)
- button_states[META_BUTTON_FUNCTION_APPMENU] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_APPMENU] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_MINIMIZE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_MINIMIZE &&
+ function == META_BUTTON_FUNCTION_MINIMIZE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_MINIMIZE)
- button_states[META_BUTTON_FUNCTION_MINIMIZE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_MINIMIZE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_MAXIMIZE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_MAXIMIZE &&
+ function == META_BUTTON_FUNCTION_MAXIMIZE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_MAXIMIZE)
- button_states[META_BUTTON_FUNCTION_MAXIMIZE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_MAXIMIZE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_UNMAXIMIZE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_UNMAXIMIZE &&
+ function == META_BUTTON_FUNCTION_MAXIMIZE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_UNMAXIMIZE)
- button_states[META_BUTTON_FUNCTION_MAXIMIZE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_MAXIMIZE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_SHADE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_SHADE &&
+ function == META_BUTTON_FUNCTION_SHADE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_SHADE)
- button_states[META_BUTTON_FUNCTION_SHADE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_SHADE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_UNSHADE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_UNSHADE &&
+ function == META_BUTTON_FUNCTION_UNSHADE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_UNSHADE)
- button_states[META_BUTTON_FUNCTION_UNSHADE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_UNSHADE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_ABOVE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_ABOVE &&
+ function == META_BUTTON_FUNCTION_ABOVE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_ABOVE)
- button_states[META_BUTTON_FUNCTION_ABOVE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_ABOVE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_UNABOVE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_UNABOVE &&
+ function == META_BUTTON_FUNCTION_UNABOVE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_UNABOVE)
- button_states[META_BUTTON_FUNCTION_UNABOVE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_UNABOVE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_STICK:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_STICK &&
+ function == META_BUTTON_FUNCTION_STICK)
+ {
if (grab_op == META_GRAB_OP_CLICKING_STICK)
- button_states[META_BUTTON_FUNCTION_STICK] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_STICK] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_UNSTICK:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_UNSTICK &&
+ function == META_BUTTON_FUNCTION_UNSTICK)
+ {
if (grab_op == META_GRAB_OP_CLICKING_UNSTICK)
- button_states[META_BUTTON_FUNCTION_UNSTICK] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_UNSTICK] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_DELETE:
+ state = META_BUTTON_STATE_PRELIGHT;
+ }
+ else if (control == META_FRAME_CONTROL_DELETE &&
+ function == META_BUTTON_FUNCTION_CLOSE)
+ {
if (grab_op == META_GRAB_OP_CLICKING_DELETE)
- button_states[META_BUTTON_FUNCTION_CLOSE] = META_BUTTON_STATE_PRESSED;
+ state = META_BUTTON_STATE_PRESSED;
else
- button_states[META_BUTTON_FUNCTION_CLOSE] = META_BUTTON_STATE_PRELIGHT;
- break;
- case META_FRAME_CONTROL_NONE:
- case META_FRAME_CONTROL_TITLE:
- case META_FRAME_CONTROL_RESIZE_SE:
- case META_FRAME_CONTROL_RESIZE_S:
- case META_FRAME_CONTROL_RESIZE_SW:
- case META_FRAME_CONTROL_RESIZE_N:
- case META_FRAME_CONTROL_RESIZE_NE:
- case META_FRAME_CONTROL_RESIZE_NW:
- case META_FRAME_CONTROL_RESIZE_W:
- case META_FRAME_CONTROL_RESIZE_E:
- case META_FRAME_CONTROL_CLIENT_AREA:
- break;
- default:
- break;
+ state = META_BUTTON_STATE_PRELIGHT;
}
+ return state;
+}
+
+static void
+meta_frames_paint (MetaFrames *frames,
+ MetaUIFrame *frame,
+ cairo_t *cr)
+{
+ MetaFrameFlags flags;
+ MetaFrameType type;
+ GdkPixbuf *mini_icon;
+ GdkPixbuf *icon;
+ int w, h;
+ ButtonStateData data;
+
meta_core_get (frames->xdisplay, frame->xwindow,
META_CORE_GET_FRAME_FLAGS, &flags,
META_CORE_GET_FRAME_TYPE, &type,
@@ -2391,9 +2418,12 @@ meta_frames_paint (MetaFrames *frames,
META_CORE_GET_CLIENT_HEIGHT, &h,
META_CORE_GET_END);
+ data.frames = frames;
+ data.frame = frame;
+
meta_theme_draw_frame (meta_ui_get_theme (), frame->theme_variant,
cr, type, flags, w, h, frame->title,
- button_states, mini_icon, icon);
+ update_button_state, &data, mini_icon, icon);
}
static gboolean
diff --git a/theme-viewer/theme-viewer-window.c b/theme-viewer/theme-viewer-window.c
index ad56ed42..6b1d9f9f 100644
--- a/theme-viewer/theme-viewer-window.c
+++ b/theme-viewer/theme-viewer-window.c
@@ -62,8 +62,6 @@ struct _ThemeViewerWindow
MetaFrameBorders borders;
- MetaButtonState button_states[META_BUTTON_FUNCTION_LAST];
-
gboolean button_pressed;
GdkPixbuf *mini_icon;
@@ -185,8 +183,7 @@ benchmark_draw_time (ThemeViewerWindow *window,
meta_theme_draw_frame (theme, window->theme_variant, cr,
window->frame_type, window->frame_flags,
width, height, "Benchmark",
- window->button_states,
- window->mini_icon, window->icon);
+ NULL, NULL, window->mini_icon, window->icon);
cairo_destroy (cr);
cairo_surface_destroy (surface);
@@ -302,18 +299,6 @@ get_icon (gint size)
return gtk_icon_theme_load_icon (theme, icon, size, 0, NULL);;
}
-static gboolean
-point_in_rect (gint x,
- gint y,
- GdkRectangle rect)
-{
- if (x >= rect.x && x < (rect.x + rect.width) &&
- y >= rect.y && y < (rect.y + rect.height))
- return TRUE;
-
- return FALSE;
-}
-
static void
get_client_width_and_height (GtkWidget *widget,
ThemeViewerWindow *window,
@@ -327,85 +312,48 @@ get_client_width_and_height (GtkWidget *widget,
*height -= window->borders.total.top + window->borders.total.bottom;
}
-static void
-update_button_state (GtkWidget *widget,
- GdkDevice *device,
- ThemeViewerWindow *window)
+static MetaButtonState
+update_button_state (MetaButtonFunction function,
+ GdkRectangle rect,
+ gpointer user_data)
{
+ ThemeViewerWindow *window;
+ MetaButtonState state;
+ GdkDisplay *display;
+ GdkSeat *seat;
+ GdkDevice *device;
gint x;
gint y;
- gint width;
- gint height;
- MetaFrameGeometry fgeom;
- MetaButtonFunction function;
- guint i;
- gdk_window_get_device_position (gtk_widget_get_window (widget),
- device, &x, &y, NULL);
+ window = THEME_VIEWER_WINDOW (user_data);
+ state = META_BUTTON_STATE_NORMAL;
- get_client_width_and_height (widget, window, &width, &height);
+ display = gdk_display_get_default ();
+ seat = gdk_display_get_default_seat (display);
+ device = gdk_seat_get_pointer (seat);
- meta_theme_calc_geometry (window->theme, window->theme_variant,
- window->frame_type, window->frame_flags,
- width, height, &fgeom);
+ gdk_window_get_device_position (gtk_widget_get_window (window->theme_box),
+ device, &x, &y, NULL);
x -= PADDING;
y -= PADDING;
- if (point_in_rect (x, y, fgeom.menu_rect.clickable))
- function = META_BUTTON_FUNCTION_MENU;
-
- if (point_in_rect (x, y, fgeom.appmenu_rect.clickable))
- function = META_BUTTON_FUNCTION_APPMENU;
-
- if (point_in_rect (x, y, fgeom.min_rect.clickable))
- function = META_BUTTON_FUNCTION_MINIMIZE;
-
- if (point_in_rect (x, y, fgeom.max_rect.clickable))
- function = META_BUTTON_FUNCTION_MAXIMIZE;
-
- if (point_in_rect (x, y, fgeom.close_rect.clickable))
- function = META_BUTTON_FUNCTION_CLOSE;
-
- if (point_in_rect (x, y, fgeom.shade_rect.clickable))
- function = META_BUTTON_FUNCTION_SHADE;
-
- if (point_in_rect (x, y, fgeom.unshade_rect.clickable))
- function = META_BUTTON_FUNCTION_UNSHADE;
-
- if (point_in_rect (x, y, fgeom.above_rect.clickable))
- function = META_BUTTON_FUNCTION_ABOVE;
-
- if (point_in_rect (x, y, fgeom.unabove_rect.clickable))
- function = META_BUTTON_FUNCTION_UNABOVE;
-
- if (point_in_rect (x, y, fgeom.stick_rect.clickable))
- function = META_BUTTON_FUNCTION_STICK;
-
- if (point_in_rect (x, y, fgeom.unstick_rect.clickable))
- function = META_BUTTON_FUNCTION_UNSTICK;
-
- for (i = 0; i < META_BUTTON_FUNCTION_LAST; i++)
+ if (x >= rect.x && x < (rect.x + rect.width) &&
+ y >= rect.y && y < (rect.y + rect.height))
{
- if (i == function)
- {
- if (window->button_pressed)
- window->button_states[i] = META_BUTTON_STATE_PRESSED;
- else
- window->button_states[i] = META_BUTTON_STATE_PRELIGHT;
- }
+ if (window->button_pressed)
+ state = META_BUTTON_STATE_PRESSED;
else
- window->button_states[i] = META_BUTTON_STATE_NORMAL;
+ state = META_BUTTON_STATE_PRELIGHT;
}
- gtk_widget_queue_draw (window->theme_box);
+ return state;
}
static void
update_button_layout (ThemeViewerWindow *window)
{
const gchar *text;
- gint i;
if (!window->theme)
return;
@@ -413,9 +361,6 @@ update_button_layout (ThemeViewerWindow *window)
text = gtk_entry_get_text (GTK_ENTRY (window->button_layout_entry));
meta_theme_set_button_layout (window->theme, text, FALSE);
-
- for (i = 0; i < META_BUTTON_FUNCTION_LAST; i++)
- window->button_states[i] = META_BUTTON_STATE_NORMAL;
}
static void
@@ -778,7 +723,7 @@ theme_box_draw_cb (GtkWidget *widget,
meta_theme_draw_frame (window->theme, window->theme_variant, cr,
window->frame_type, window->frame_flags,
client_width, client_height, "Metacity Theme Viewer",
- window->button_states,
+ update_button_state, window,
window->mini_icon, window->icon);
return TRUE;
@@ -791,7 +736,7 @@ theme_box_button_press_event_cb (GtkWidget *widget,
{
window->button_pressed = TRUE;
- update_button_state (widget, event->device, window);
+ gtk_widget_queue_draw (window->theme_box);
return TRUE;
}
@@ -803,7 +748,7 @@ theme_box_button_release_event_cb (GtkWidget *widget,
{
window->button_pressed = FALSE;
- update_button_state (widget, event->device, window);
+ gtk_widget_queue_draw (window->theme_box);
return TRUE;
}
@@ -813,7 +758,7 @@ theme_box_motion_notify_event_cb (GtkWidget *widget,
GdkEventMotion *event,
ThemeViewerWindow *window)
{
- update_button_state (widget, event->device, window);
+ gtk_widget_queue_draw (window->theme_box);
return TRUE;
}