这是否是Motif的Bugs

发布于 2022-08-09 09:55:03 字数 6397 浏览 8 评论 1

我在使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

撞了怀 2022-08-09 16:10:05

抱歉! 贴错地方了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文