X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/19240c203a1954740cc3a577f3e83f60762134cf..4ab088c087da03de9f6878e8548d46f754b968a6:/lwlib/lwlib-Xlw.c diff --git a/lwlib/lwlib-Xlw.c b/lwlib/lwlib-Xlw.c index b7268bc12d..f2cf68d80a 100644 --- a/lwlib/lwlib-Xlw.c +++ b/lwlib/lwlib-Xlw.c @@ -1,21 +1,30 @@ /* The lwlib interface to "xlwmenu" menus. Copyright (C) 1992 Lucid, Inc. + Copyright (C) 1994, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of the Lucid Widget Library. -The Lucid Widget Library is free software; you can redistribute it and/or +The Lucid Widget Library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. The Lucid Widget Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of +but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "lisp.h" #include "lwlib-Xlw.h" #include @@ -25,7 +34,74 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "xlwmenu.h" +#if 0 + +#include + +/* Print the complete X resource name of widget WIDGET to stderr. + This is sometimes handy to have available. */ + +void +x_print_complete_resource_name (widget) + Widget widget; +{ + int i; + String names[100]; + + for (i = 0; i < 100 && widget != NULL; ++i) + { + names[i] = XtName (widget); + widget = XtParent (widget); + } + + for (--i; i >= 1; --i) + fprintf (stderr, "%s.", names[i]); + fprintf (stderr, "%s\n", names[0]); +} + +#endif /* 0 */ + + /* Menu callbacks */ + +/* Callback XtNhighlightCallback for Lucid menus. W is the menu + widget, CLIENT_DATA contains a pointer to the widget_instance + for the menu, CALL_DATA contains a pointer to the widget_value + structure for the highlighted menu item. The latter may be null + if there isn't any highlighted menu item. */ + +static void +highlight_hook (w, client_data, call_data) + Widget w; + XtPointer client_data; + XtPointer call_data; +{ + widget_instance *instance = (widget_instance *) client_data; + + if (instance->info->highlight_cb + && !w->core.being_destroyed) + instance->info->highlight_cb (w, instance->info->id, call_data); +} + +static void +enter_hook (w, client_data, call_data) + Widget w; + XtPointer client_data; + XtPointer call_data; +{ + highlight_hook (w, client_data, call_data); +} + +static void +leave_hook (w, client_data, call_data) + Widget w; + XtPointer client_data; + XtPointer call_data; +{ + highlight_hook (w, client_data, NULL); +} + + static void pre_hook (w, client_data, call_data) Widget w; @@ -71,28 +147,32 @@ pick_hook (w, client_data, call_data) } /* creation functions */ + static Widget xlw_create_menubar (instance) widget_instance* instance; { Widget widget; - - widget_value *tem = (widget_value *) XtMalloc (sizeof (widget_value)); - - /* _XtCreate is freeing the object we passed, - so make a copy that we free later. */ - bcopy (instance->info->val, tem, sizeof (widget_value)); - - widget = - XtVaCreateWidget (instance->info->name, xlwMenuWidgetClass, - instance->parent, - XtNmenu, instance->info->val, - 0); - - XtFree (tem); + Arg al[5]; + int ac = 0; + + XtSetArg (al[ac], XtNmenu, instance->info->val); ac++; +#ifdef emacs + XtSetArg (al[ac], XtNshowGrip, 0); ac++; + XtSetArg (al[ac], XtNresizeToPreferred, 1); ac++; + XtSetArg (al[ac], XtNallowResize, 1); ac++; +#endif + + /* This used to use XtVaCreateWidget, but an old Xt version + has a bug in XtVaCreateWidget that frees instance->info->name. */ + widget + = XtCreateWidget (instance->info->name, xlwMenuWidgetClass, + instance->parent, al, ac); XtAddCallback (widget, XtNopen, pre_hook, (XtPointer)instance); XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance); + XtAddCallback (widget, XtNleaveCallback, leave_hook, (XtPointer)instance); + XtAddCallback (widget, XtNenterCallback, enter_hook, (XtPointer)instance); return widget; } @@ -100,33 +180,31 @@ static Widget xlw_create_popup_menu (instance) widget_instance* instance; { - Widget popup_shell = - XtCreatePopupShell (instance->info->name, overrideShellWidgetClass, - instance->parent, NULL, 0); - - Widget widget; - - widget_value *tem = (widget_value *) XtMalloc (sizeof (widget_value)); + Widget popup_shell + = XtCreatePopupShell (instance->info->name, overrideShellWidgetClass, + instance->parent, NULL, 0); - /* _XtCreate is freeing the object we passed, - so make a copy that we free later. */ - bcopy (instance->info->val, tem, sizeof (widget_value)); + Widget widget; + Arg al[2]; + int ac = 0; - widget = - XtVaCreateManagedWidget ("popup", xlwMenuWidgetClass, - popup_shell, - XtNmenu, instance->info->val, - XtNhorizontal, False, - 0); + XtSetArg (al[ac], XtNmenu, instance->info->val); ac++; + XtSetArg (al[ac], XtNhorizontal, False); ac++; - XtFree (tem); + /* This used to use XtVaManagedCreateWidget, but an old Xt version + has a bug in XtVaManagedCreateWidget that frees instance->info->name. */ + widget + = XtCreateManagedWidget ("popup", xlwMenuWidgetClass, + popup_shell, al, ac); XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance); + XtAddCallback (widget, XtNleaveCallback, leave_hook, (XtPointer)instance); + XtAddCallback (widget, XtNenterCallback, enter_hook, (XtPointer)instance); return popup_shell; } -widget_creation_entry +widget_creation_entry xlw_creation_table [] = { {"menubar", xlw_create_menubar}, @@ -139,29 +217,34 @@ lw_lucid_widget_p (widget) Widget widget; { WidgetClass the_class = XtClass (widget); + if (the_class == xlwMenuWidgetClass) return True; if (the_class == overrideShellWidgetClass) - return - XtClass (((CompositeWidget)widget)->composite.children [0]) - == xlwMenuWidgetClass; + return (XtClass (((CompositeWidget)widget)->composite.children [0]) + == xlwMenuWidgetClass); return False; } void +#ifdef PROTOTYPES +xlw_update_one_widget (widget_instance* instance, Widget widget, + widget_value* val, Boolean deep_p) +#else xlw_update_one_widget (instance, widget, val, deep_p) widget_instance* instance; Widget widget; widget_value* val; Boolean deep_p; +#endif { - XlwMenuWidget mw; + Arg al[1]; - if (XtIsShell (widget)) - mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0]; - else - mw = (XlwMenuWidget)widget; - XtVaSetValues (widget, XtNmenu, val, 0); + /* This used to use XtVaSetValues, but some old Xt versions + that have a bug in XtVaCreateWidget might have it here too. */ + XtSetArg (al[0], XtNmenu, instance->info->val); + + XtSetValues (widget, al, 1); } void @@ -174,17 +257,21 @@ xlw_update_one_value (instance, widget, val) } void +#ifdef PROTOTYPES +xlw_pop_instance (widget_instance* instance, Boolean up) +#else xlw_pop_instance (instance, up) widget_instance* instance; Boolean up; +#endif { } void -xlw_popup_menu (widget) +xlw_popup_menu (widget, event) Widget widget; + XEvent *event; { - XButtonPressedEvent dummy; XlwMenuWidget mw; if (!XtIsShell (widget)) @@ -192,18 +279,26 @@ xlw_popup_menu (widget) mw = (XlwMenuWidget)((CompositeWidget)widget)->composite.children [0]; - dummy.type = ButtonPress; - dummy.serial = 0; - dummy.send_event = 0; - dummy.display = XtDisplay (widget); - dummy.window = XtWindow (XtParent (widget)); - dummy.time = CurrentTime; - dummy.button = 0; - XQueryPointer (dummy.display, dummy.window, &dummy.root, - &dummy.subwindow, &dummy.x_root, &dummy.y_root, - &dummy.x, &dummy.y, &dummy.state); - - pop_up_menu (mw, &dummy); + if (event) + XtCallActionProc ((Widget) mw, "start", event, NULL, 0); + else + { + XEvent dummy; + XButtonPressedEvent *bd = &dummy.xbutton; + + bd->type = ButtonPress; + bd->serial = 0; + bd->send_event = 0; + bd->display = XtDisplay (widget); + bd->window = XtWindow (XtParent (widget)); + bd->time = CurrentTime; + bd->button = 0; + XQueryPointer (bd->display, bd->window, &bd->root, + &bd->subwindow, &bd->x_root, &bd->y_root, + &bd->x, &bd->y, &bd->state); + + XtCallActionProc ((Widget) mw, "start", &dummy, NULL, 0); + } } /* Destruction of instances */ @@ -215,3 +310,5 @@ xlw_destroy_instance (instance) XtDestroyWidget (instance->widget); } +/* arch-tag: 541e3912-477d-406e-9bf2-dbf2b7ff8c3b + (do not change this comment) */