Index: launcher.c =================================================================== --- launcher.c (revision 26113) +++ launcher.c (working copy) @@ -45,6 +45,9 @@ static gboolean launcher_icon_button_expose_event (GtkWidget *widget, GdkEventExpose *event, LauncherPlugin *launcher); +static void launcher_arrow_init_expose_event (GtkWidget *button, + GdkEventExpose *event, + LauncherPlugin *launcher); static void launcher_icon_button_set_icon (LauncherPlugin *launcher); #if LAUNCHER_NEW_TOOLTIP_API static gboolean launcher_icon_button_query_tooltip (GtkWidget *widget, @@ -79,11 +82,6 @@ static gboolean launcher_menu_item_released (GtkWidget *mi, GdkEventButton *event, LauncherPlugin *launcher); -static void launcher_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - LauncherPlugin *launcher); static void launcher_menu_popup_destroyed (gpointer user_data); static gboolean launcher_menu_popup (gpointer user_data); static void launcher_menu_deactivated (LauncherPlugin *launcher); @@ -93,7 +91,6 @@ static void launcher_plugin_pack_buttons (LauncherPlugin *launcher); static gchar *launcher_plugin_read_entry (XfceRc *rc, const gchar *name) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; -static GtkArrowType launcher_plugin_calculate_arrow_type (XfcePanelPlugin *panel_plugin); static void launcher_plugin_screen_position_changed (LauncherPlugin *launcher); static void launcher_plugin_orientation_changed (LauncherPlugin *launcher); static gboolean launcher_plugin_set_size (LauncherPlugin *launcher, @@ -111,6 +108,24 @@ /** * Utility Functions **/ +static void +launcher_utility_set_arrow_type (LauncherPlugin *launcher, GtkArrowType new_arrow_type) +{ + GtkArrowType old_arrow_type; + + g_return_if_fail (launcher->arrow_button != NULL); + + if (new_arrow_type == GTK_ARROW_NONE) + return; + + old_arrow_type = xfce_arrow_button_get_arrow_type (XFCE_ARROW_BUTTON (launcher->arrow_button)); + if (new_arrow_type == old_arrow_type) + return; + + /* set the arrow direction */ + xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON (launcher->arrow_button), new_arrow_type); +} + static gboolean launcher_utility_icon_theme_changed (GSignalInvocationHint *ihint, guint n_param_values, @@ -266,7 +281,18 @@ } #endif +static void +launcher_arrow_init_expose_event (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_arrow_init_expose_event), + launcher); +} /** * Icon Button Functions @@ -598,44 +624,6 @@ static void -launcher_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - LauncherPlugin *launcher) -{ - GtkWidget *widget = GTK_WIDGET (launcher->panel_plugin); - GtkRequisition req; - - if (!GTK_WIDGET_REALIZED (GTK_WIDGET (menu))) - gtk_widget_realize (GTK_WIDGET (menu)); - - gtk_widget_size_request (GTK_WIDGET (menu), &req); - gdk_window_get_origin (widget->window, x, y); - - switch (xfce_arrow_button_get_arrow_type (XFCE_ARROW_BUTTON (launcher->arrow_button))) - { - case GTK_ARROW_UP: - *y -= req.height; - break; - - case GTK_ARROW_DOWN: - *y += widget->allocation.height; - break; - - case GTK_ARROW_LEFT: - *x -= req.width; - break; - - default: /* GTK_ARROW_RIGHT and GTK_ARROW_NONE */ - *x += widget->allocation.width; - break; - } -} - - - -static void launcher_menu_popup_destroyed (gpointer user_data) { LauncherPlugin *launcher = user_data; @@ -649,6 +637,7 @@ launcher_menu_popup (gpointer user_data) { LauncherPlugin *launcher = user_data; + GtkArrowType arrow_type; GDK_THREADS_ENTER (); @@ -660,9 +649,9 @@ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (launcher->arrow_button), TRUE); /* popup menu */ - gtk_menu_popup (GTK_MENU (launcher->menu), NULL, NULL, - (GtkMenuPositionFunc) launcher_menu_position, - launcher, 1, gtk_get_current_event_time ()); + arrow_type = xfce_panel_plugin_menu_popup (XFCE_PANEL_PLUGIN (launcher->panel_plugin), + GTK_MENU (launcher->menu)); + launcher_utility_set_arrow_type (launcher, arrow_type); GDK_THREADS_LEAVE (); @@ -723,6 +712,9 @@ /* 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)); @@ -837,7 +829,6 @@ } - /** * Panel Plugin Functions **/ @@ -874,7 +865,7 @@ gtk_container_add (GTK_CONTAINER (launcher->icon_button), launcher->image); gtk_widget_show (launcher->image); - launcher->arrow_button = xfce_arrow_button_new (GTK_ARROW_UP); + launcher->arrow_button = xfce_arrow_button_new (GTK_ARROW_NONE); GTK_WIDGET_UNSET_FLAGS (launcher->arrow_button, GTK_CAN_DEFAULT | GTK_CAN_FOCUS); gtk_box_pack_start (GTK_BOX (launcher->box), launcher->arrow_button, FALSE, FALSE, 0); gtk_button_set_relief (GTK_BUTTON (launcher->arrow_button), GTK_RELIEF_NONE); @@ -927,15 +918,23 @@ 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_arrow_init_expose_event), launcher); + } + else + { + g_signal_connect (G_OBJECT (launcher->arrow_button), "expose-event", + G_CALLBACK (launcher_arrow_init_expose_event), launcher); + } + #if !LAUNCHER_NEW_TOOLTIP_API /* set the button tooltip */ launcher_icon_button_set_tooltip (launcher); @@ -1186,74 +1185,17 @@ -static GtkArrowType -launcher_plugin_calculate_arrow_type (XfcePanelPlugin *panel_plugin) -{ - XfceScreenPosition position; - GdkScreen *screen; - GdkRectangle geom; - gint mon, x, y; - - g_return_val_if_fail (GTK_WIDGET_REALIZED (panel_plugin), GTK_ARROW_UP); - - /* get the plugin position */ - position = xfce_panel_plugin_get_screen_position (panel_plugin); - - /* get the arrow direction */ - switch (position) - { - /* top */ - case XFCE_SCREEN_POSITION_NW_H: - case XFCE_SCREEN_POSITION_N: - case XFCE_SCREEN_POSITION_NE_H: - return GTK_ARROW_DOWN; - - /* left */ - case XFCE_SCREEN_POSITION_NW_V: - case XFCE_SCREEN_POSITION_W: - case XFCE_SCREEN_POSITION_SW_V: - return GTK_ARROW_RIGHT; - - /* right */ - case XFCE_SCREEN_POSITION_NE_V: - case XFCE_SCREEN_POSITION_E: - case XFCE_SCREEN_POSITION_SE_V: - return GTK_ARROW_LEFT; - - /* bottom */ - case XFCE_SCREEN_POSITION_SW_H: - case XFCE_SCREEN_POSITION_S: - case XFCE_SCREEN_POSITION_SE_H: - return GTK_ARROW_UP; - - /* floating */ - default: - /* get the screen information */ - screen = gtk_widget_get_screen (GTK_WIDGET (panel_plugin)); - mon = gdk_screen_get_monitor_at_window (screen, GTK_WIDGET (panel_plugin)->window); - gdk_screen_get_monitor_geometry (screen, mon, &geom); - gdk_window_get_root_origin (GTK_WIDGET (panel_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); - } -} - - - static void launcher_plugin_screen_position_changed (LauncherPlugin *launcher) { GtkArrowType arrow_type; /* get the arrow type */ - arrow_type = launcher_plugin_calculate_arrow_type (launcher->panel_plugin); + arrow_type = xfce_panel_plugin_popup_direction (XFCE_PANEL_PLUGIN (launcher->panel_plugin), + GTK_WIDGET (launcher->box)); /* set the arrow direction */ - xfce_arrow_button_set_arrow_type (XFCE_ARROW_BUTTON (launcher->arrow_button), arrow_type); + launcher_utility_set_arrow_type(launcher, arrow_type); }