[metacity] libmetacity: use callback function to get button state



commit 435058ef576b86b89ac23715b21495cdaf601288
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Aug 16 21:30:27 2016 +0300

    libmetacity: use callback function to get button state

 libmetacity/meta-theme-gtk.c          |   60 +----------
 libmetacity/meta-theme-impl-private.h |    5 +
 libmetacity/meta-theme-impl.c         |   58 ++++++++++
 libmetacity/meta-theme.c              |   41 +++++--
 libmetacity/meta-theme.h              |    7 +-
 src/ui/frames.c                       |  190 +++++++++++++++++++--------------
 theme-viewer/theme-viewer-window.c    |  109 +++++--------------
 7 files changed, 237 insertions(+), 233 deletions(-)
---
diff --git a/libmetacity/meta-theme-gtk.c b/libmetacity/meta-theme-gtk.c
index 708526d..9fcf25b 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 0144f79..14d90fd 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 f5583ba..773392c 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 3643b51..70aa2ea 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 d515f89..369e56c 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 c37a09a..b730928 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 ad56ed4..6b1d9f9 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;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]