qxt.cpp

来自「qt-x11-free-3.0.3.tar.gz minigui图形界面工具」· C++ 代码 · 共 645 行 · 第 1/2 页

CPP
645
字号
*/QXtApplication::QXtApplication(Display *display, HANDLE visual, HANDLE colormap) :    QApplication(display, visual, colormap){    my_xt = FALSE;    init();    appcon = XtDisplayToApplicationContext(display);}/*!    \overload  Constructs a QApplication from the \a display of an already-initialized  Xt application.  If \a visual and \a colormap are non-zero, the application  will use those as the default Visual and Colormap contexts.  Use this constructor when introducing Qt widgets into an existing  Xt/Motif application.  The \a argc and \a argv arguments are passed to the QApplication  constructor.*/QXtApplication::QXtApplication(Display *display, int argc, char **argv,			       HANDLE visual, HANDLE colormap)    : QApplication(display, argc, argv, visual, colormap){    my_xt = FALSE;    init();    appcon = XtDisplayToApplicationContext(display);}/*!  Destructs the application.  Does not close the Xt toolkit.*/QXtApplication::~QXtApplication(){    Q_ASSERT(qxtapp==this);    removeXtEventFilters();    qxtapp = 0;    // the manpage says: "or just exit", that's what we do to avoid    // double closing of the display//     if (my_xt) {//  	XtDestroyApplicationContext(appcon);//      }}void QXtApplication::init(){    Q_ASSERT(qxtapp==0);    qxtapp = this;    installXtEventFilters();    qt_np_add_timeoutcb(np_do_timers);    qt_np_add_timer_setter(np_set_timer);    qt_np_add_event_proc(np_event_proc);    qt_np_count++;}/*!  \class QXtWidget qxt.h  \brief The QXtWidget class allows mixing of Xt/Motif and Qt widgets.  \extension Xt/Motif  QXtWidget acts as a bridge between Xt and Qt. For utilizing old  Xt widgets, it can be a QWidget  based on a Xt widget class. For including Qt widgets in an existing  Xt/Motif application, it can be a special Xt widget class that is  a QWidget.  See the constructors for the different behaviors.*/void QXtWidget::init(const char* name, WidgetClass widget_class,		    Widget parent, QWidget* qparent,		    ArgList args, Cardinal num_args,		    bool managed){    need_reroot=FALSE;    xtparent = 0;    if ( parent ) {	Q_ASSERT(!qparent);	xtw = XtCreateWidget(name, widget_class, parent, args, num_args);	if ( widget_class == qWidgetClass )	    ((QWidgetRec*)xtw)->qwidget.qxtwidget = this;	xtparent = parent;	if (managed)	    XtManageChild(xtw);    } else {	Q_ASSERT(!managed);	String n, c;	XtGetApplicationNameAndClass(qt_xdisplay(), &n, &c);	xtw = XtAppCreateShell(n, c, widget_class, qt_xdisplay(),			       args, num_args);	if ( widget_class == qWidgetClass )	    ((QWidgetRec*)xtw)->qwidget.qxtwidget = this;    }    if ( qparent ) {	XtResizeWidget( xtw, 100, 100, 0 );	XtSetMappedWhenManaged(xtw, False);	XtRealizeWidget(xtw);	XSync(qt_xdisplay(), False);    // I want all windows to be created now	XReparentWindow(qt_xdisplay(), XtWindow(xtw), qparent->winId(), x(), y());	XtSetMappedWhenManaged(xtw, True);	need_reroot=TRUE;    }    Arg reqargs[20];    Cardinal nargs=0;    XtSetArg(reqargs[nargs], XtNx, x());	nargs++;    XtSetArg(reqargs[nargs], XtNy, y());	nargs++;    XtSetArg(reqargs[nargs], XtNwidth, width());	nargs++;    XtSetArg(reqargs[nargs], XtNheight, height());	nargs++;    //XtSetArg(reqargs[nargs], "mappedWhenManaged", False);	nargs++;    XtSetValues(xtw, reqargs, nargs);    //#### destroy();   MLK    if (!parent || XtIsRealized(parent))	XtRealizeWidget(xtw);}/*!  Constructs a QXtWidget of the special Xt widget class known as  "QWidget" to the resource manager.  Use this constructor to utilize Qt widgets in an Xt/Motif  application.  The QXtWidget is a QWidget, so you can create  subwidgets, layouts, etc. using Qt functionality.  The \a name is the object name passed to the QWidget constructor.  The widget's parent is \a parent.  If the \a managed parameter is TRUE and \a parent in not null,  XtManageChild it used to manage the child.*/QXtWidget::QXtWidget(const char* name, Widget parent, bool managed)    : QWidget( 0, name, WResizeNoErase ), xtw( 0 ){    init(name, qWidgetClass, parent, 0, 0, 0, managed);    Arg reqargs[20];    Cardinal nargs=0;    XtSetArg(reqargs[nargs], XtNborderWidth, 0);            nargs++;    XtSetValues(xtw, reqargs, nargs);}/*!  Constructs a QXtWidget of the given \a widget_class called \a name.  Use this constructor to utilize Xt or Motif widgets in a Qt  application.  The QXtWidget looks and behaves  like the Xt class, but can be used like any QWidget.  Note that Xt requires that the most top level Xt widget is a shell.  This means, if \a parent is a QXtWidget, the \a widget_class can be  of any kind. If there isn't a parent or the parent is just a normal  QWidget, \a widget_class should be something like \c  topLevelShellWidgetClass.  The arguments, \a args, \a num_args are passed on to XtCreateWidget.  If the \a managed parameter is TRUE and \a parent in not null,  XtManageChild it used to manage the child.*/QXtWidget::QXtWidget(const char* name, WidgetClass widget_class,		     QWidget *parent, ArgList args, Cardinal num_args,		     bool managed)    : QWidget( parent, name, WResizeNoErase ), xtw( 0 ){    if ( !parent )	init(name, widget_class, 0, 0, args, num_args, managed);    else if ( parent->inherits("QXtWidget") )	init(name, widget_class, ( (QXtWidget*)parent)->xtw , 0, args, num_args, managed);    else	init(name, widget_class, 0, parent, args, num_args, managed);    create(XtWindow(xtw), FALSE, FALSE);}/*!  Destructs the QXtWidget.*/QXtWidget::~QXtWidget(){    // Delete children first, as Xt will destroy their windows    //    QObjectList* list = queryList("QWidget", 0, FALSE, FALSE);    if ( list ) {	QWidget* c;        QObjectListIt it( *list );        while ( (c = (QWidget*)it.current()) ) {            delete c;            ++it;        }        delete list;    }    if ( need_reroot ) {	hide();	XReparentWindow(qt_xdisplay(), winId(), qApp->desktop()->winId(),	    x(), y());    }    XtDestroyWidget(xtw);    destroy( FALSE, FALSE );}/*!  \fn Widget QXtWidget::xtWidget() const  Returns the Xt widget equivalent for the Qt widget.*//*!  Reimplemented to produce the Xt effect of getting focus when the  mouse enters the widget. The event is passed in \a e.    \preliminary*/bool QXtWidget::x11Event( XEvent * e ){    if ( e->type == EnterNotify ) {	if  ( xtparent )	    setActiveWindow();    }    return QWidget::x11Event( e );}/*!  Implement a degree of focus handling for Xt widgets.*/void QXtWidget::setActiveWindow(){    if  ( xtparent ) {	if ( !QWidget::isActiveWindow() && isActiveWindow() ) {	    XFocusChangeEvent e;	    e.type = FocusIn;	    e.window = winId();	    e.mode = NotifyNormal;	    e.detail = NotifyInferior;	    XSendEvent( qt_xdisplay(), e.window, TRUE, NoEventMask, (XEvent*)&e );	}    } else {	QWidget::setActiveWindow();    }}/*!  Different from QWidget::isActiveWindow() */bool QXtWidget::isActiveWindow() const{    Window win;    int revert;    XGetInputFocus( qt_xdisplay(), &win, &revert );    if ( win == None) return FALSE;    QWidget *w = find( (WId)win );    if ( w ) {	// We know that window	return w->topLevelWidget() == topLevelWidget();    } else {	// Window still may be a parent (if top-level is foreign window)	Window root, parent;	Window cursor = winId();	Window *ch;	unsigned int nch;	while ( XQueryTree(qt_xdisplay(), cursor, &root, &parent, &ch, &nch) ) {	    if (ch) XFree( (char*)ch);	    if ( parent == win ) return TRUE;	    if ( parent == root ) return FALSE;	    cursor = parent;	}	return FALSE;    }}/*!\reimp */void QXtWidget::moveEvent( QMoveEvent* ){    if ( xtparent || !xtw )	return;    XConfigureEvent c;    c.type = ConfigureNotify;    c.event = winId();    c.window = winId();    c.x = geometry().x();    c.y = geometry().y();    c.width = width();    c.height = height();    c.border_width = 0;    XSendEvent( qt_xdisplay(), c.event, TRUE, NoEventMask, (XEvent*)&c );    XtMoveWidget( xtw, x(), y() );}/*!\reimp */void QXtWidget::resizeEvent( QResizeEvent* ){    if ( xtparent || !xtw )	return;    XtWidgetGeometry preferred;    (void ) XtQueryGeometry( xtw, 0, &preferred );    XConfigureEvent c;    c.type = ConfigureNotify;    c.event = winId();    c.window = winId();    c.x = geometry().x();    c.y = geometry().y();    c.width = width();    c.height = height();    c.border_width = 0;    XSendEvent( qt_xdisplay(), c.event, TRUE, NoEventMask, (XEvent*)&c );    XtResizeWidget( xtw, width(), height(), preferred.border_width );}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?