Author: jasper
Date: 2007-09-30 18:14:31 +0000 (Sun, 30 Sep 2007)
New Revision: 26118

Modified:
   xfce4-panel/trunk/ChangeLog
   xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.c
   xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.h
   xfce4-panel/trunk/plugins/launcher/launcher.c
   xfce4-panel/trunk/plugins/windowlist/windowlist.c
Log:
* libxfce4panel/xfce-panel-plugin-iface.c,
  libxfce4panel/xfce-panel-plugin-iface.h,
  plugins/launcher/launcher.c,
  plugins/windowlist/windowlist.c: API change for popup menu functions.
  The API now consists of three functions: 
  xfce_panel_plugin_arrow_type(), xfce_panel_plugin_position_widget(),
  and xfce_panel_plugin_menu_position_func(). This last function is
  intended to be used as a callback function for gtk_menu_popup().

* plugins/windowlist/windowlist.c: Remove orientation change handler. 
  There is no need to check both for orientation changes and screen
  position changes.

* plugins/windowlist/windowlist.c: Set size for plugin widget instead
  of button. The size is not properly updated on orientation changes 
  otherwise.



Modified: xfce4-panel/trunk/ChangeLog
===================================================================
--- xfce4-panel/trunk/ChangeLog 2007-09-30 08:54:55 UTC (rev 26117)
+++ xfce4-panel/trunk/ChangeLog 2007-09-30 18:14:31 UTC (rev 26118)
@@ -1,4 +1,22 @@
+2007-09-30 20:14 jasper
+
+       * libxfce4panel/xfce-panel-plugin-iface.c,
+         libxfce4panel/xfce-panel-plugin-iface.h,
+         plugins/launcher/launcher.c,
+         plugins/windowlist/windowlist.c: API change for popup menu functions.
+         The API now consists of three functions: 
+         xfce_panel_plugin_arrow_type(), xfce_panel_plugin_position_widget(),
+         and xfce_panel_plugin_menu_position_func(). This last function is
+         intended to be used as a callback function for gtk_menu_popup().
+       * plugins/windowlist/windowlist.c: Remove orientation change handler. 
+         There is no need to check both for orientation changes and screen
+         position changes.
+       * plugins/windowlist/windowlist.c: Set size for plugin widget instead
+         of button. The size is not properly updated on orientation changes 
+         otherwise.
+
 2007-09-28 13:46 jasper
+
        * libxfce4panel/xfce-panel-plugin-iface.c,
          libxfce4panel/xfce-panel-plugin-iface.h,
          plugins/launcher/launcher.c,
@@ -8,27 +26,27 @@
 
 2007-07-09 22:45 nick
 
-    * libxfce4panel/*, docs/API/*: Remove the html and xml directories,
-      those are generated by gtk-doc, 100% symbol coverage and improve
-      the layout of the chapters.
+       * libxfce4panel/*, docs/API/*: Remove the html and xml directories,
+         those are generated by gtk-doc, 100% symbol coverage and improve
+         the layout of the chapters.
 
 2007-07-08 12:00 nick
 
-    * plugins/clock/clock-digital.c: Allow markup and center the string.
-    * plugins/clock/*: Move the localtime functions into 1 util and allow
-      usage without locatime_r.
+       * plugins/clock/clock-digital.c: Allow markup and center the string.
+       * plugins/clock/*: Move the localtime functions into 1 util and allow
+         usage without locatime_r.
 
 2007-07-07 10:32 nick
 
-    * plugins/clock/clock-lcd.c: Typo, the 8 was test code.
+       * plugins/clock/clock-lcd.c: Typo, the 8 was test code.
 
 2007-07-06 10:50 nick
 
-    * plugins/clock/*: Import code.
-    * NEWS: update.
-    * Configure.in.in: Bump GTK dependency to 2.8.0 and add cairo as
-      new dependency.
-    * po/*: Merge new strings.
+       * plugins/clock/*: Import code.
+       * NEWS: update.
+       * Configure.in.in: Bump GTK dependency to 2.8.0 and add cairo as
+         new dependency.
+       * po/*: Merge new strings.
 
 2007-05-27 10:50 nick
 

Modified: xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.c
===================================================================
--- xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.c   2007-09-30 
08:54:55 UTC (rev 26117)
+++ xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.c   2007-09-30 
18:14:31 UTC (rev 26118)
@@ -1259,269 +1259,215 @@
                                 GINT_TO_POINTER (sensitive));
 }
 
+
+
 /* user menus & popups */
 
 /**
- * xfce_panel_plugin_position_popup
+ * xfce_panel_plugin_arrow_type:
  * @plugin        : an #XfcePanelPlugin
- * @attach_widget : a #GtkWidget associated with the menu/popup
- * @req           : a #GtkRequisition for the menu/popup
- * @x             : a pointer for the x position, or NULL
- * @y             : a pointer for the y position, or NULL
- *
- * This function positions a menu or small popup along the edge of
- *  attach_widget, usually a button on the panel.
- *
- * @attach_widget needs to have its x and y coordinates already set.
- *
- * If you are not interested in the actual position but desire the returned
- *  direction only, you may set @x and @y to be NULL.
- *
- * If you don't know how large your menu or popup will be, you should use
- *  xfce_panel_plugin_popup_direction() instead.
- *
- * See also: xfce_panel_plugin_menu_popup()
- *
- * Returns: The direction in which a menu will be opened relative to the
- *          attached widget or GTK_ARROW_NONE. 
- *          If the return value is GTK_ARROW_NONE, the values in x and y 
- *          should not be used.
+ * 
+ * Determine the #GtkArrowType for a widget that opens a menu and uses
+ *  xfce_panel_plugin_position_menu() to position the menu.
+ * 
+ * Returns: The #GtkArrowType to use.
  **/
 GtkArrowType
-xfce_panel_plugin_position_popup (XfcePanelPlugin *plugin,
-                                  GtkWidget       *attach_widget,
-                                  GtkRequisition  *req,
-                                  gint            *x, 
-                                  gint            *y)
+xfce_panel_plugin_arrow_type (XfcePanelPlugin *plugin)
 {
-    GtkArrowType    direction = GTK_ARROW_NONE;
-    GtkAllocation  *attach;
-    GdkScreen      *screen;
-    GdkRectangle    geom;
-    gint            trash_x;
-    gint            trash_y;
-    gint            num;
+    XfceScreenPosition  position;
+    GdkScreen          *screen;
+    GdkRectangle        geom;
+    gint                mon, x, y;
 
-    g_return_val_if_fail (XFCE_IS_PANEL_PLUGIN (plugin), GTK_ARROW_NONE);
-    g_return_val_if_fail (GTK_IS_WIDGET (attach_widget), GTK_ARROW_NONE);
+    if (!GTK_WIDGET_REALIZED (plugin))
+        return GTK_ARROW_UP;
 
-    if (x == NULL)
-        x = &trash_x;
-    if (y == NULL)
-        y = &trash_y;
-
-    attach = &attach_widget->allocation;
-
-    gdk_window_get_origin (attach_widget->window, x, y);
-    g_return_val_if_fail (*x > 0 && *y > 0, GTK_ARROW_NONE);
-
-    screen = gtk_widget_get_screen (attach_widget);
-    num = gdk_screen_get_monitor_at_window (screen, attach_widget->window);
-    gdk_screen_get_monitor_geometry (screen, num, &geom);
-
-    switch (xfce_panel_plugin_get_orientation (plugin))
+    position = xfce_panel_plugin_get_screen_position (plugin);
+    switch (position)
     {
-        case GTK_ORIENTATION_HORIZONTAL:
+        /* top */
+        case XFCE_SCREEN_POSITION_NW_H:
+        case XFCE_SCREEN_POSITION_N:
+        case XFCE_SCREEN_POSITION_NE_H:
+            return GTK_ARROW_DOWN;
 
-            if (*y + attach->height + req->height > geom.height)
-            {
-                /* Position above */
-                *y -= req->height;
-                direction = GTK_ARROW_UP;
-            }
-            else
-            {
-                /* Position below */
-                *y += attach->height;
-                direction = GTK_ARROW_DOWN;
-            }
-            break;
+        /* left */
+        case XFCE_SCREEN_POSITION_NW_V:
+        case XFCE_SCREEN_POSITION_W:
+        case XFCE_SCREEN_POSITION_SW_V:
+            return GTK_ARROW_RIGHT;
 
-        case GTK_ORIENTATION_VERTICAL:
+        /* right */
+        case XFCE_SCREEN_POSITION_NE_V:
+        case XFCE_SCREEN_POSITION_E:
+        case XFCE_SCREEN_POSITION_SE_V:
+            return GTK_ARROW_LEFT;
 
-            if (*x + attach->width + req->width > geom.width)
-            {
-                /* Position on right */
-                *x -= req->width;
-                direction = GTK_ARROW_RIGHT;
-            }
-            else
-            {
-                /* Position on left */
-                *x += attach->width;
-                direction = GTK_ARROW_LEFT;
-            }
-            break;
+        /* bottom */
+        case XFCE_SCREEN_POSITION_SW_H:
+        case XFCE_SCREEN_POSITION_S:
+        case XFCE_SCREEN_POSITION_SE_H:
+            return GTK_ARROW_UP;
 
+        /* floating */
         default:
-            break;
+            /* get the screen information */
+            screen = gtk_widget_get_screen (GTK_WIDGET (plugin));
+            mon = gdk_screen_get_monitor_at_window (screen, GTK_WIDGET 
(plugin)->window);
+            gdk_screen_get_monitor_geometry (screen, mon, &geom);
+            gdk_window_get_root_origin (GTK_WIDGET (plugin)->window, &x, &y);
+
+            /* get the position based on the screen position */
+            if (position == XFCE_SCREEN_POSITION_FLOATING_H)
+                return ((y < (geom.y + geom.height / 2)) ? GTK_ARROW_DOWN : 
GTK_ARROW_UP);
+            else
+                return ((x < (geom.x + geom.width / 2)) ? GTK_ARROW_RIGHT : 
GTK_ARROW_LEFT);
     }
+}
 
-    /* keep inside the screen */
-    if (*x > geom.x + geom.width - req->width)
-        *x = geom.x + geom.width - req->width;
-    if (*x < geom.x)
-        *x = geom.x;
 
-    if (*y > geom.y + geom.height - req->height)
-        *y = geom.y + geom.height - req->height;
-    if (*y < geom.y)
-        *y = geom.y;
 
-    return direction;
-}
-
 /**
- * xfce_panel_plugin_popup_direction
+ * xfce_panel_plugin_position_widget:
  * @plugin        : an #XfcePanelPlugin
- * @attach_widget : a #GtkWidget associated with the menu/popup
+ * @menu_widget   : a #GtkWidget that will be used as popup menu
+ * @attach_widget : a #GtkWidget relative to which the menu should be 
positioned
+ * @x             : return location for the x coordinate
+ * @y             : return location for the y coordinate
  *
- * This function tries to guess which direction a menu or small popup will be
- *  opened. It can be used, for example, to initialize the direction of an 
- *  arrow button before its associated menu has been built.
+ * The menu widget is positioned relative to the plugin. This function is
+ *  intended for custom menu widgets. 
  *
- * @attach_widget needs to have its x and y coordinates already set.
+ * For a regular #GtkMenu you should use xfce_panel_plugin_position_menu()
+ *  instead (as callback argument to gtk_menu_popup()).
  *
- * If you know how large your menu or popup will be, you should use
- *  xfce_panel_plugin_position_popup() instead.
- *
- * See also: xfce_panel_plugin_position_popup()
- *
- * Returns: The direction in which a popup will probably be opened relative to
- *          the attached widget, or GTK_ARROW_NONE.
+ * See also: xfce_panel_plugin_position_menu().
  **/
-GtkArrowType
-xfce_panel_plugin_popup_direction (XfcePanelPlugin *plugin,
-                                   GtkWidget       *attach_widget)
+void
+xfce_panel_plugin_position_widget (XfcePanelPlugin  *plugin,
+                                   GtkWidget        *menu_widget,
+                                   GtkWidget        *attach_widget,
+                                   gint             *x,
+                                   gint             *y)
 {
-    GtkArrowType    direction;
     GtkRequisition  req;
+    GdkScreen      *screen;
+    GdkRectangle    geom;
+    gint            mon;
 
-    /* these values are fairly arbitrary, but consistency is what matters most 
*/
-    req.width  = 100;
-    req.height = 200;
+    g_return_if_fail (XFCE_IS_PANEL_PLUGIN (plugin));
+    g_return_if_fail (GTK_IS_WIDGET (menu_widget));
+    g_return_if_fail (GTK_IS_WIDGET (attach_widget));
 
-    direction = xfce_panel_plugin_position_popup (plugin,
-                                                  attach_widget,
-                                                  &req,
-                                                  NULL, NULL);
+    if (!GTK_WIDGET_REALIZED (menu_widget))
+        gtk_widget_realize (menu_widget);
 
-    return direction;
-}
+    gtk_widget_size_request (menu_widget, &req);
+    gdk_window_get_origin (attach_widget->window, x, y);
 
-#define GTK_ARROW_TYPE_TO_POINTER(a) ((gpointer) (((gint) a)+1))
-#define POINTER_IS_GTK_ARROW_TYPE(a) (a != NULL && (gint) a < 10 && (gint) a > 
0)
-#define POINTER_TO_GTK_ARROW_TYPE(a) ((GtkArrowType) (((gint) a)-1))
+    switch (xfce_panel_plugin_arrow_type (plugin))
+    {
+        case GTK_ARROW_UP:
+            *y -= req.height;
+            break;
 
-static void
-_plugin_user_menu_position (GtkMenu         *menu,
-                            gint            *x, 
-                            gint            *y,
-                            gboolean        *push_in,
-                            XfcePanelPlugin *plugin)
-{
-    GtkRequisition  req;
-    GtkWidget      *attach_widget;
-    GtkArrowType    direction = GTK_ARROW_NONE;
+        case GTK_ARROW_DOWN:
+            *y += attach_widget->allocation.height;
+            break;
 
-    g_return_if_fail (GTK_IS_MENU (menu));
-    g_return_if_fail (XFCE_IS_PANEL_PLUGIN (plugin));
+        case GTK_ARROW_LEFT:
+            *x -= req.width;
+            break;
 
-    attach_widget = gtk_menu_get_attach_widget (menu);
-    g_return_if_fail (GTK_IS_WIDGET (attach_widget));
+        default: /* GTK_ARROW_RIGHT and GTK_ARROW_NONE */
+            *x += attach_widget->allocation.width;
+            break;
+    }
 
-    if (!GTK_WIDGET_REALIZED (GTK_WIDGET (menu)))
-        gtk_widget_realize (GTK_WIDGET (menu));
+    screen = gtk_widget_get_screen (attach_widget);
+    mon = gdk_screen_get_monitor_at_window (screen, attach_widget->window);
+    gdk_screen_get_monitor_geometry (screen, mon, &geom);
 
-    /* NULL indicates use the attach widget's screen */
-    gtk_menu_set_screen (menu, NULL);
+    /* keep inside the screen */
+    if (*x > geom.x + geom.width - req.width)
+        *x = geom.x + geom.width - req.width;
+    if (*x < geom.x)
+        *x = geom.x;
+    if (*y > geom.y + geom.height - req.height)
+        *y = geom.y + geom.height - req.height;
+    if (*y < geom.y)
+        *y = geom.y;
 
-    gtk_widget_size_request (GTK_WIDGET (menu), &req);
+    if (G_LIKELY (GTK_IS_MENU (menu_widget)))
+        gtk_menu_set_screen (GTK_MENU (menu_widget), screen);
+    else if (GTK_IS_WINDOW (menu_widget))
+        gtk_window_set_screen (GTK_WINDOW (menu_widget), screen);
+}
 
-    direction = xfce_panel_plugin_position_popup (plugin,
-                                                  attach_widget,
-                                                  &req,
-                                                  x, y);
 
-    g_object_set_data (G_OBJECT (menu),
-                       "open_direction",
-                       GTK_ARROW_TYPE_TO_POINTER (direction));
 
-    *push_in = FALSE;
-}
-
 /**
- * xfce_panel_plugin_menu_popup
- * @plugin : an #XfcePanelPlugin
- * @menu   : a #GtkMenu to pop up
- * @button : the mouse button clicked or 0
- * @time   : time at which the activation event occurred
+ * xfce_panel_plugin_position_menu:
+ * @menu         : a #GtkMenu
+ * @x            : return location for the x coordinate
+ * @y            : return location for the y coordinate
+ * @push_in      : keep inside the screen (see #GtkMenuPositionFunc)
+ * @panel_plugin : a pointer to an #XfcePanelPlugin 
  *
- * This is a wrapper around gtk_menu_popup().
+ * Function to be used as #GtkMenuPositionFunc in a call to gtk_menu_popup(). 
+ *  As data argument it needs an #XfcePanelPlugin.
  *
- * It will call xfce_panel_plugin_register_menu() for you, so don't do that
- *  again in the plugin code.
+ * The menu is normally positioned relative to @attach_widget. If you want the
+ *  menu to be positioned relative to another widget, you can use 
+ *  gtk_menu_attach_to_widget() to explicitly set a 'parent' widget.
  *
- * If desired, set the widget associated with the menu using 
- *  gtk_menu_attach_to_widget() before calling this function.
- *  Setting the attach widget positions the menu along its edge.
- *  That widget needs to have its x and y coordinates already.
+ * As a convenience, xfce_panel_plugin_position_menu() calls 
+ *  xfce_panel_plugin_register_menu() for the menu.
  *
- * If you do not set the attach widget, the menu will be positioned
- *  on your mouse cursor (GTK default behavior).
+ * <example>
+ * void
+ * myplugin_popup_menu (XfcePanelPlugin *plugin,
+ *                      GtkMenu         *menu,
+ *                      GdkEventButton  *ev)
+ * {
+ *     gtk_menu_popup (menu, NULL, NULL,
+ *                     xfce_panel_plugin_position_menu, plugin,
+ *                     ev->button, ev->time );
+ * }
+ * </example>
  *
- * See also: xfce_panel_plugin_position_popup().
+ * For a custom widget that will be used as a popup menu, use 
+ *  xfce_panel_plugin_position_widget() instead.
  *
- * Returns: The direction in which the menu opened relative to the attached
- *          widget, or GTK_ARROW_NONE.
+ * See also: gtk_menu_popup().
  **/
-GtkArrowType
-xfce_panel_plugin_menu_popup (XfcePanelPlugin *plugin, 
-                              GtkMenu         *menu,
-                              gint             button,
-                              guint32          time)
+void
+xfce_panel_plugin_position_menu (GtkMenu  *menu,
+                                 gint     *x,
+                                 gint     *y,
+                                 gboolean *push_in,
+                                 gpointer  panel_plugin)
 {
-    GtkWidget *attach_widget;
-    gpointer _direction;
+    XfcePanelPlugin *plugin = XFCE_PANEL_PLUGIN (panel_plugin);
+    GtkWidget       *attach_widget;
 
-    if (!XFCE_IS_PANEL_PLUGIN (plugin) ||
-        !GTK_IS_MENU (menu) ||
-        GTK_WIDGET_VISIBLE (menu))
-    {
-        /* we shouldn't be here */
-        return GTK_ARROW_NONE;
-    }
+    if ((attach_widget = gtk_menu_get_attach_widget (menu)) == NULL)
+        attach_widget = GTK_WIDGET (plugin);
 
-    xfce_panel_plugin_register_menu (plugin, menu);
+    xfce_panel_plugin_position_widget (plugin, 
+                                       GTK_WIDGET (menu), 
+                                       attach_widget, 
+                                       x, y);
 
-    attach_widget = gtk_menu_get_attach_widget (menu);
-    if (GTK_IS_WIDGET (attach_widget))
-    {
-        gtk_menu_popup (menu,
-                        NULL, NULL,
-                        (GtkMenuPositionFunc) _plugin_user_menu_position,
-                        plugin,
-                        button, 
-                        time);
+    /* keep inside screen */
+    *push_in = TRUE;
 
-        _direction = g_object_steal_data (G_OBJECT (menu), "open_direction");
-        if(POINTER_IS_GTK_ARROW_TYPE(_direction))
-            return POINTER_TO_GTK_ARROW_TYPE(_direction);
-        else
-            return GTK_ARROW_NONE;
-    }
-    else
-    {
-        gtk_menu_popup (menu,
-                        NULL, NULL,
-                        NULL,
-                        NULL,
-                        button, 
-                        time);
-        return GTK_ARROW_NONE;
-    }
+    xfce_panel_plugin_register_menu (plugin, menu);
 }
 
+
+
 #define __XFCE_PANEL_PLUGIN_IFACE_C__
 #include <libxfce4panel/libxfce4panel-aliasdef.c>
 

Modified: xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.h
===================================================================
--- xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.h   2007-09-30 
08:54:55 UTC (rev 26117)
+++ xfce4-panel/trunk/libxfce4panel/xfce-panel-plugin-iface.h   2007-09-30 
18:14:31 UTC (rev 26118)
@@ -109,17 +109,17 @@
 
 void                 xfce_panel_plugin_register_menu        (XfcePanelPlugin  
*plugin,
                                                              GtkMenu          
*menu);
-GtkArrowType         xfce_panel_plugin_menu_popup           (XfcePanelPlugin  
*plugin,
-                                                             GtkMenu          
*menu,
-                                                             gint              
button,
-                                                             guint32           
time);
-GtkArrowType         xfce_panel_plugin_popup_direction      (XfcePanelPlugin  
*plugin,
-                                                             GtkWidget        
*attach_widget);
-GtkArrowType         xfce_panel_plugin_position_popup       (XfcePanelPlugin  
*plugin,
-                                                             GtkWidget        
*attach_widget,
-                                                             GtkRequisition   
*popup_requisition,
-                                                             gint             
*x, 
+GtkArrowType         xfce_panel_plugin_arrow_type           (XfcePanelPlugin  
*plugin);
+void                 xfce_panel_plugin_position_widget      (XfcePanelPlugin  
*plugin,
+                                                             GtkWidget        
*menu_widget,
+                                                            GtkWidget        
*attach_widget,
+                                                             gint             
*x,
                                                              gint             
*y);
+void                 xfce_panel_plugin_position_menu        (GtkMenu          
*menu,
+                                                             gint             
*x,
+                                                             gint             
*y,
+                                                             gboolean         
*push_in,
+                                                             gpointer          
panel_plugin);
 
 
 gchar               *xfce_panel_plugin_lookup_rc_file       (XfcePanelPlugin  
*plugin) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;

Modified: xfce4-panel/trunk/plugins/launcher/launcher.c
===================================================================
--- xfce4-panel/trunk/plugins/launcher/launcher.c       2007-09-30 08:54:55 UTC 
(rev 26117)
+++ xfce4-panel/trunk/plugins/launcher/launcher.c       2007-09-30 18:14:31 UTC 
(rev 26118)
@@ -42,9 +42,6 @@
                                                                      guint     
             n_param_values,
                                                                      const 
GValue          *param_values,
                                                                      
LauncherPlugin        *launcher);
-static void            launcher_utility_expose_event_init_arrow     (GtkWidget 
            *button,
-                                                                     
GdkEventExpose        *event,
-                                                                     
LauncherPlugin        *launcher);
 static gboolean        launcher_icon_button_expose_event            (GtkWidget 
            *widget,
                                                                      
GdkEventExpose        *event,
                                                                      
LauncherPlugin        *launcher);
@@ -265,21 +262,6 @@
 
 
 
-static void
-launcher_utility_expose_event_init_arrow (GtkWidget      *button, 
-                                          GdkEventExpose *event, 
-                                          LauncherPlugin *launcher)
-{
-    launcher_plugin_screen_position_changed (launcher);
-
-    /* no need to run this again */
-    g_signal_handlers_disconnect_by_func (G_OBJECT (button), 
-                                          G_CALLBACK 
(launcher_utility_expose_event_init_arrow),
-                                          launcher);
-}
-
-
-
 /**
  * Icon Button Functions
  **/
@@ -623,7 +605,6 @@
 launcher_menu_popup (gpointer user_data)
 {
     LauncherPlugin *launcher = user_data;
-    GtkArrowType    arrow_type;
 
     GDK_THREADS_ENTER ();
 
@@ -635,12 +616,10 @@
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (launcher->arrow_button), 
TRUE);
 
     /* popup menu */
-    arrow_type = xfce_panel_plugin_menu_popup (XFCE_PANEL_PLUGIN 
(launcher->panel_plugin),
-                                               GTK_MENU (launcher->menu),
-                                               1, gtk_get_current_event_time 
());
-    if (arrow_type != GTK_ARROW_NONE)
-        xfce_arrow_button_set_arrow_type 
(XFCE_ARROW_BUTTON(launcher->arrow_button), 
-                                          arrow_type);
+    gtk_menu_popup (GTK_MENU (launcher->menu), NULL, NULL,
+                    xfce_panel_plugin_position_menu,
+                    launcher->panel_plugin, 
+                    1, gtk_get_current_event_time ());
 
     GDK_THREADS_LEAVE ();
 
@@ -701,9 +680,6 @@
 
     /* create new menu */
     launcher->menu = gtk_menu_new ();
-    gtk_menu_attach_to_widget (GTK_MENU (launcher->menu),
-                               launcher->box,
-                               NULL);
 
     /* get the plugin screen */
     screen = gtk_widget_get_screen (GTK_WIDGET (launcher->panel_plugin));
@@ -818,6 +794,7 @@
 }
 
 
+
 /**
  * Panel Plugin Functions
  **/
@@ -907,26 +884,15 @@
     if (G_UNLIKELY (g_list_length (launcher->entries) == 0))
         launcher->entries = g_list_prepend (launcher->entries, 
launcher_entry_new ());
 
+    /* set the arrow direction */
+    launcher_plugin_screen_position_changed (launcher);
+
     /* set the buttons in the correct position */
     launcher_plugin_pack_buttons (launcher);
 
     /* change the visiblity of the arrow button */
     launcher_menu_destroy (launcher);
 
-    /* set the arrow direction */
-    if (launcher->arrow_position == LAUNCHER_ARROW_INSIDE_BUTTON)
-    {
-            g_signal_connect (G_OBJECT (launcher->image), "expose-event",
-                              G_CALLBACK 
(launcher_utility_expose_event_init_arrow), 
-                              launcher);
-    }
-    else
-    {
-            g_signal_connect (G_OBJECT (launcher->arrow_button), 
"expose-event",
-                              G_CALLBACK 
(launcher_utility_expose_event_init_arrow), 
-                              launcher);
-    }
-
 #if !LAUNCHER_NEW_TOOLTIP_API
     /* set the button tooltip */
     launcher_icon_button_set_tooltip (launcher);
@@ -1183,13 +1149,10 @@
     GtkArrowType arrow_type;
 
     /* get the arrow type */
-    arrow_type = xfce_panel_plugin_popup_direction (XFCE_PANEL_PLUGIN 
(launcher->panel_plugin),
-                                                    GTK_WIDGET 
(launcher->box));
+    arrow_type = xfce_panel_plugin_arrow_type (launcher->panel_plugin);
 
     /* set the arrow direction */
-    if (arrow_type != GTK_ARROW_NONE)
-        xfce_arrow_button_set_arrow_type 
(XFCE_ARROW_BUTTON(launcher->arrow_button), 
-                                          arrow_type);
+    xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON 
(launcher->arrow_button), arrow_type);
 }
 
 

Modified: xfce4-panel/trunk/plugins/windowlist/windowlist.c
===================================================================
--- xfce4-panel/trunk/plugins/windowlist/windowlist.c   2007-09-30 08:54:55 UTC 
(rev 26117)
+++ xfce4-panel/trunk/plugins/windowlist/windowlist.c   2007-09-30 18:14:31 UTC 
(rev 26118)
@@ -51,9 +51,6 @@
 typedef enum { WS_ADD = 1, WS_REMOVE } WorkspaceAction;
 
 static gboolean         windowlist_blink                (gpointer         
data);
-static void             windowlist_update_arrow_type    (Windowlist      *wl);
-static void             windowlist_set_arrow_type       (Windowlist      *wl,
-                                                         GtkArrowType     
arrow_type);
 static gboolean         windowlist_set_size             (XfcePanelPlugin 
*plugin,
                                                          int              size,
                                                          Windowlist      *wl);
@@ -447,7 +444,6 @@
     gchar                *ws_label, *rm_label;
     gint                  size, i, wscount;
     GList                *windows, *li;
-    GtkArrowType          arrow_type;
     PangoFontDescription *italic, *bold;
 
     /* Menu item styles */
@@ -659,19 +655,11 @@
 
     gtk_widget_show_all (menu);
 
-    if (!at_pointer)
-    {
-        gtk_menu_attach_to_widget (GTK_MENU (menu),
-                                   wl->button, NULL);
-    }
+    gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
+                    xfce_panel_plugin_position_menu, wl->plugin,
+                    ev ? ev->button : 0, 
+                    ev ? ev->time : gtk_get_current_event_time());
 
-    arrow_type = 
-        xfce_panel_plugin_menu_popup (XFCE_PANEL_PLUGIN (wl->plugin), 
-                                      GTK_MENU (menu),
-                                      ev ? ev->button : 0, 
-                                      ev ? ev->time : 
gtk_get_current_event_time());
-    windowlist_set_arrow_type(wl, arrow_type);
-
     return TRUE;
 }
 
@@ -961,22 +949,6 @@
 
 
 /**
- * When the arrow is about to be drawn, set its orientation
- **/
-static void
-windowlist_init_arrow (GtkWidget      *button, 
-                       GdkEventExpose *event,
-                       Windowlist     *wl)
-{
-    windowlist_update_arrow_type (wl);
-    g_signal_handlers_disconnect_by_func (G_OBJECT (button), 
-            G_CALLBACK (windowlist_init_arrow), 
-            wl);
-}
-
-
-
-/**
  * Build the panel button and connect signals and styles
  **/
 void
@@ -1018,15 +990,12 @@
         case ARROW_BUTTON:
             DBG ("Create Arrow Button");
 
-            wl->arrowtype = GTK_ARROW_NONE;
-            wl->button = xfce_arrow_button_new (GTK_ARROW_NONE);
+            wl->arrowtype = xfce_panel_plugin_arrow_type (wl->plugin);
+            wl->button = xfce_arrow_button_new (wl->arrowtype);
 
             break;
     }
 
-    g_signal_connect (G_OBJECT (wl->button), "expose-event", 
-                      G_CALLBACK (windowlist_init_arrow), wl);
-
     /* Button layout */
     GTK_WIDGET_UNSET_FLAGS (wl->button, GTK_CAN_DEFAULT|GTK_CAN_FOCUS);
     gtk_button_set_relief (GTK_BUTTON (wl->button), GTK_RELIEF_NONE);
@@ -1056,50 +1025,6 @@
 
 
 /**
- * Arrow type functions
- **/
-static void
-windowlist_update_arrow_type (Windowlist *wl)
-{
-    GtkArrowType type = GTK_ARROW_NONE;
-
-    if (!GTK_IS_WIDGET (wl->button))
-        return;
-
-    type = 
-        xfce_panel_plugin_popup_direction (XFCE_PANEL_PLUGIN (wl->plugin),
-                                           GTK_WIDGET (wl->button));
-    if (type != GTK_ARROW_NONE)
-        windowlist_set_arrow_type (wl, type);
-}
-
-
-
-static void
-windowlist_set_arrow_type (Windowlist   *wl, 
-                           GtkArrowType  new_arrow_type)
-{
-    g_return_if_fail (wl->button != NULL);
-
-    if (new_arrow_type == GTK_ARROW_NONE || new_arrow_type == wl->arrowtype)
-        return;
-
-    wl->arrowtype = new_arrow_type;
-
-    if (wl->layout == ARROW_BUTTON)
-    {
-        xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON (wl->button),
-                                          wl->arrowtype);
-
-        windowlist_set_size (wl->plugin,
-                             xfce_panel_plugin_get_size (wl->plugin),
-                             wl);
-    }
-}
-
-
-
-/**
  * Read and write user settings
  **/
 static void
@@ -1280,22 +1205,25 @@
     switch (wl->layout)
     {
         case ICON_BUTTON:
-            gtk_widget_set_size_request (GTK_WIDGET (wl->button),
-                    size, size);
+            gtk_widget_set_size_request (GTK_WIDGET (plugin),
+                                         size, size);
             break;
 
         case ARROW_BUTTON:
-            switch (xfce_panel_plugin_get_orientation (wl->plugin))
+            switch (wl->arrowtype)
             {
-                case GTK_ORIENTATION_VERTICAL:
-                    gtk_widget_set_size_request (GTK_WIDGET (wl->button),
-                            size, ARROW_WIDTH);
+               case GTK_ARROW_LEFT:
+               case GTK_ARROW_RIGHT:
+                    gtk_widget_set_size_request (GTK_WIDGET (plugin),
+                                                 size, ARROW_WIDTH);
                     break;
 
-                case GTK_ORIENTATION_HORIZONTAL:
-                    gtk_widget_set_size_request (GTK_WIDGET (wl->button),
-                            ARROW_WIDTH, size);
+               case GTK_ARROW_UP:
+               case GTK_ARROW_DOWN:
+                    gtk_widget_set_size_request (GTK_WIDGET (plugin),
+                                                 ARROW_WIDTH, size);
                     break;
+
                 default:
                     break;
             }
@@ -1349,24 +1277,15 @@
 {
     DBG ("...");
 
-    windowlist_update_arrow_type (wl);
-
+    wl->arrowtype = xfce_panel_plugin_arrow_type (plugin);
+    
+    if (wl->layout == ARROW_BUTTON)
+       xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON (wl->button),
+                                          wl->arrowtype);
 }
 
 
 
-static void
-windowlist_orientation_changed (XfcePanelPlugin *plugin, 
-                                GtkOrientation   orientation,
-                                Windowlist      *wl)
-{
-    DBG ("...");
-
-    windowlist_update_arrow_type (wl);
-}
-
-
-
 /**
  * Construct plugin
  **/
@@ -1387,9 +1306,6 @@
     g_signal_connect (plugin, "screen-position-changed", 
                       G_CALLBACK (windowlist_screen_position_changed), wl);
 
-    g_signal_connect (plugin, "orientation-changed", 
-                      G_CALLBACK (windowlist_orientation_changed), wl);
-
     xfce_panel_plugin_menu_show_configure (plugin);
     g_signal_connect (plugin, "configure-plugin",
                       G_CALLBACK (windowlist_properties), wl);

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to