这是否是Motif的Bugs
我在使用motif编程时遇到一个问题,想尽各种办法没有解决,请在这方面有经验的高手指点,谢谢!
我在List组建上添加了一个菜单,用于选择所有列表项。这个列表用于界面中时,有时需要把它设置为不可用。
如果此时列表中没有列表项(因为列表项是根据用户选择动态添加的),当在列表上单击鼠标右键后,鼠标会被锁住。
下面的程序可以正常运行,但是如果取消 XtSetSensitive( list, false ); 和 XmListDeleteAllItems( list );两行的注释
则重现上述所说的情况。
在solaris上编译:
CC -I/usr/openwin/include -g -I/usr/dt/include -L/usr/openwin/lib -L/usr/dt/lib -lXm -lXt testlist.c -o testlist
在linux上编译
g++ -I/usr/include -L/usr/X11R6/lib -lXm -o testlist testlist.c
****************注意:***********************
如果运行取消上述两行的注释的程序,请确保你的计算机有网络连接,并开启相应的服务,以便鼠标被锁住后,
你可以通过网络登录到本机kill这个进程。
********************************************
/* testlist.c */
#include <Xm/List.h>
#include <Xm/PushB.h>
#include <Xm/Separator.h>
#include <Xm/Label.h>
#include <Xm/RowColumn.h>
char *months[]={"1","2" };
static char const *labels[] = { "Select All", "Select None", "Help" };
static Widget pb_list[4];
static void Pop_menu_CB(Widget, XtPointer ud, XEvent *event, char* )
{
Widget popmenu = ( Widget )ud;
if( event->xbutton.button==Button3 ){
XmMenuPosition( popmenu, ( XButtonPressedEvent*)&event->xbutton );
XtManageChild( popmenu );
}
}
Widget MTstandardPopupMenu( Widget parent,
char const *label,
Widget *pb_list,
char const **pb_labels,
int num,
XtCallbackProc callback,
XtPointer data )
{
Widget popmenu;
Widget label_wid;
int i;
popmenu = XmCreatePopupMenu( parent, (char*)"Popmenu", NULL, 0 );
label_wid = XtVaCreateManagedWidget( label,
xmLabelWidgetClass, popmenu,
XmNforeground, BlackPixel(XtDisplay(parent), 0), NULL );
XtVaCreateManagedWidget("sep",
xmSeparatorWidgetClass, popmenu,
XmNseparatorType, XmSHADOW_ETCHED_OUT, NULL );
pb_list[0] = XtVaCreateManagedWidget( pb_labels[0],
xmPushButtonWidgetClass, popmenu, NULL );
pb_list[1] = XtVaCreateManagedWidget( pb_labels[1],
xmPushButtonWidgetClass, popmenu, NULL );
pb_list[2] = XtVaCreateManagedWidget( pb_labels[2],
xmPushButtonWidgetClass, popmenu, NULL );
XtAddRawEventHandler( parent, ButtonPressMask,
FALSE, Pop_menu_CB, popmenu );
return popmenu;
}
main (int argc, char *argv[])
{
Widget toplevel, list;
XtAppContext app;
int i, n = XtNumber (months);
XmStringTable str_list;
Arg args[4];
XtSetLanguageProc (NULL, NULL, NULL);
toplevel = XtVaOpenApplication (&app, "Demos", NULL, 0, &argc, argv,
NULL, sessionShellWidgetClass, NULL);
str_list = (XmStringTable) XtMalloc (n * sizeof (XmString));
for (i = 0; i < n; i++)
str_list = XmStringCreateLocalized (months);
i = 0;
XtSetArg (args, XmNvisibleItemCount, n); i++;
XtSetArg (args, XmNitemCount, n); i++;
XtSetArg (args, XmNitems, str_list); i++;
list = XmCreateList (toplevel, "Hello", args, i);
for (i = 0; i < n; i++)
XmStringFree (str_list);
XtFree ((char *) str_list);
Widget popmenu = MTstandardPopupMenu( list, "Edit Pane", pb_list,
labels, 3, NULL, NULL );
// XtAddCallback ( pb_list[0], XmNactivateCallback, 0, list );
// XtAddCallback ( pb_list[1], XmNactivateCallback,0, list );
// XtAddCallback ( pb_list[2], XmNactivateCallback, 0, NULL );
//XtSetSensitive( list, false );
//XmListDeleteAllItems( list );
XtManageChild (list);
XtRealizeWidget (toplevel);
XtAppMainLoop( app );
}
当鼠标被锁住后,程序还没有进入Pop_menu_CB。
我自己实现时间处理函数,还出现同样的问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
抱歉! 贴错地方了。