+2003-02-08 Jan Dj\e,Ad\e(Brv <jan.h.d@swipnet.se>
+
+ * xterm.c (x_make_frame_visible): Call gtk_window_deiconify.
+
+ * xmenu.c (menu_position_func): Adjust menu popup position so that
+ the menu is fully visible.
+
+
2003-02-07 Jan Dj\e,Ad\e(Brv <jan.h.d@swipnet.se>
* xterm.c (x_text_icon, x_raise_frame, x_lower_frame)
create_and_show_popup_menu below. */
struct next_popup_x_y
{
+ FRAME_PTR f;
int x;
int y;
};
PUSH_IN is not documented in the GTK manual.
USER_DATA is any data passed in when calling gtk_menu_popup.
Here it points to a struct next_popup_x_y where the coordinates
- to store in *X and *Y are.
+ to store in *X and *Y are as well as the frame for the popup.
Here only X and Y are used. */
static void
gboolean *push_in;
gpointer user_data;
{
- *x = ((struct next_popup_x_y*)user_data)->x;
- *y = ((struct next_popup_x_y*)user_data)->y;
+ struct next_popup_x_y* data = (struct next_popup_x_y*)user_data;
+ GtkRequisition req;
+ int disp_width = FRAME_X_DISPLAY_INFO (data->f)->width;
+ int disp_height = FRAME_X_DISPLAY_INFO (data->f)->height;
+
+ *x = data->x;
+ *y = data->y;
+
+ /* Check if there is room for the menu. If not, adjust x/y so that
+ the menu is fully visible. */
+ gtk_widget_size_request (GTK_WIDGET (menu), &req);
+ if (data->x + req.width > disp_width)
+ *x -= data->x + req.width - disp_width;
+ if (data->y + req.height > disp_height)
+ *y -= data->y + req.height - disp_height;
}
static void
popup_x_y.x = x;
popup_x_y.y = y;
+ popup_x_y.f = f;
}
/* Display the menu. */
#else /* not USE_X_TOOLKIT */
#ifdef USE_GTK
gtk_widget_show_all (FRAME_GTK_OUTER_WIDGET (f));
+ gtk_window_deiconify (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)));
#else
XMapRaised (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f));
#endif /* not USE_GTK */