/* * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of M.I.T. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. M.I.T. makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ /* * Modifications for Wine * * 8/27/93 David Metcalfe (david@prism.demon.co.uk) * Converted to WinMenuButton */ /*********************************************************************** * * WinMenuButton Widget * ***********************************************************************/ /* * WinMenuButto.c - Source code for WinMenuButton widget. * * This is the source code for the WinMenuButton widget. * It is intended to provide an easy method of activating pulldown menus. * * Date: May 2, 1989 * * By: Chris D. Peterson * MIT X Consortium * kit@expo.lcs.mit.edu */ #include #include #include #include #include "WinMenuButtP.h" static void ClassInitialize(); static void PopupMenu(); #define superclass ((WinCommandWidgetClass)&winCommandClassRec) static char defaultTranslations[] = ": highlight() \n\ : reset() \n\ : reset() PopupMenu() "; /**************************************************************** * * Full class record constant * ****************************************************************/ /* Private Data */ #define offset(field) XtOffsetOf(WinMenuButtonRec, field) static XtResource resources[] = { { XtNmenuName, XtCMenuName, XtRString, sizeof(String), offset(winmenu_button.menu_name), XtRString, (XtPointer)"menu"}, }; #undef offset static XtActionsRec actionsList[] = { {"PopupMenu", PopupMenu} }; WinMenuButtonClassRec winMenuButtonClassRec = { { (WidgetClass) superclass, /* superclass */ "WinMenuButton", /* class_name */ sizeof(WinMenuButtonRec), /* size */ ClassInitialize, /* class_initialize */ NULL, /* class_part_initialize */ FALSE, /* class_inited */ NULL, /* initialize */ NULL, /* initialize_hook */ XtInheritRealize, /* realize */ actionsList, /* actions */ XtNumber(actionsList), /* num_actions */ resources, /* resources */ XtNumber(resources), /* resource_count */ NULLQUARK, /* xrm_class */ FALSE, /* compress_motion */ TRUE, /* compress_exposure */ TRUE, /* compress_enterleave */ FALSE, /* visible_interest */ NULL, /* destroy */ XtInheritResize, /* resize */ XtInheritExpose, /* expose */ NULL, /* set_values */ NULL, /* set_values_hook */ XtInheritSetValuesAlmost, /* set_values_almost */ NULL, /* get_values_hook */ NULL, /* accept_focus */ XtVersion, /* version */ NULL, /* callback_private */ defaultTranslations, /* tm_table */ XtInheritQueryGeometry, /* query_geometry */ XtInheritDisplayAccelerator, /* display_accelerator */ NULL /* extension */ }, /* CoreClass fields initialization */ { XtInheritChangeSensitive /* change_sensitive */ }, /* SimpleClass fields initialization */ { 0, /* field not used */ }, /* WinLabelClass fields initialization */ { 0, /* field not used */ }, /* WinCommandClass fields initialization */ { 0, /* field not used */ }, /* WinMenuButtonClass fields initialization */ }; /* for public consumption */ WidgetClass winMenuButtonWidgetClass = (WidgetClass) &winMenuButtonClassRec; /**************************************************************** * * Private Procedures * ****************************************************************/ static void ClassInitialize() { XawInitializeWidgetSet(); XtRegisterGrabAction(PopupMenu, True, ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync); } /* ARGSUSED */ static void PopupMenu(w, event, params, num_params) Widget w; XEvent * event; String * params; Cardinal * num_params; { WinMenuButtonWidget mbw = (WinMenuButtonWidget) w; Widget menu, temp; Arg arglist[2]; Cardinal num_args; int menu_x, menu_y, menu_width, menu_height, button_height; Position button_x, button_y; temp = w; while(temp != NULL) { menu = XtNameToWidget(temp, mbw->winmenu_button.menu_name); if (menu == NULL) temp = XtParent(temp); else break; } if (menu == NULL) { char error_buf[BUFSIZ]; sprintf(error_buf, "MenuButton: %s %s.", "Could not find menu widget named", mbw->winmenu_button.menu_name); XtAppWarning(XtWidgetToApplicationContext(w), error_buf); return; } if (!XtIsRealized(menu)) XtRealizeWidget(menu); menu_width = menu->core.width + 2 * menu->core.border_width; button_height = w->core.height + 2 * w->core.border_width; menu_height = menu->core.height + 2 * menu->core.border_width; XtTranslateCoords(w, 0, 0, &button_x, &button_y); menu_x = button_x; menu_y = button_y + button_height; if (menu_x >= 0) { int scr_width = WidthOfScreen(XtScreen(menu)); if (menu_x + menu_width > scr_width) menu_x = scr_width - menu_width; } if (menu_x < 0) menu_x = 0; if (menu_y >= 0) { int scr_height = HeightOfScreen(XtScreen(menu)); if (menu_y + menu_height > scr_height) menu_y = scr_height - menu_height; } if (menu_y < 0) menu_y = 0; num_args = 0; XtSetArg(arglist[num_args], XtNx, menu_x); num_args++; XtSetArg(arglist[num_args], XtNy, menu_y); num_args++; XtSetValues(menu, arglist, num_args); XtPopupSpringLoaded(menu); }