diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2019-04-21 23:28:33 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2019-04-21 23:28:33 +0900 |
commit | 1df632a0e6e550a5a100247c6b4713078e78f413 (patch) | |
tree | e8577c3d310285ebb4c8beea37998f408286bda3 /tqtinterface/qt4/src/kernel/tqwidget_x11.cpp | |
parent | 012b00740f33c01949c88d7ea97e2dee81fabb41 (diff) | |
download | experimental-r14.0.7.tar.gz experimental-r14.0.7.zip |
Removed unnecessary and/or TDE-unrelated code.r14.0.7
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'tqtinterface/qt4/src/kernel/tqwidget_x11.cpp')
-rw-r--r-- | tqtinterface/qt4/src/kernel/tqwidget_x11.cpp | 3438 |
1 files changed, 0 insertions, 3438 deletions
diff --git a/tqtinterface/qt4/src/kernel/tqwidget_x11.cpp b/tqtinterface/qt4/src/kernel/tqwidget_x11.cpp deleted file mode 100644 index 532a372..0000000 --- a/tqtinterface/qt4/src/kernel/tqwidget_x11.cpp +++ /dev/null @@ -1,3438 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQWidget and TQWindow classes for X11 -** -** Created : 931031 -** -** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. -** -** This file is part of the kernel module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "tqapplication.h" -#include "tqapplication_p.h" -#include "tqnamespace.h" -#include "tqpaintdevicemetrics.h" -#include "tqpainter.h" -#include "tqbitmap.h" -#include "tqobjectlist.h" -#include "tqlayout.h" -#include "tqtextcodec.h" -#include "tqdatetime.h" -#include "tqcursor.h" -#include "tqt_x11_p.h" -#include <stdlib.h> - -#ifdef USE_QT4 - -// defined in qapplication_x11.cpp -extern Atom qt_wm_state; -extern Atom qt_wm_change_state; -extern Atom qt_wm_delete_window; -extern Atom qt_wm_take_focus; -extern Atom qt_wm_client_leader; -extern Atom qt_window_role; -extern Atom qt_sm_client_id; -extern Atom qt_utf8_string; -extern Atom qt_net_wm_context_help; -extern Atom qt_net_wm_ping; -extern Atom qt_xa_motif_wm_hints; -extern Atom qt_net_wm_name; -extern Atom qt_net_wm_icon_name; -extern Atom qt_net_wm_state; -extern Atom qt_net_wm_state_modal; -extern Atom qt_net_wm_state_max_v; -extern Atom qt_net_wm_state_max_h; -extern Atom qt_net_wm_state_fullscreen; -extern Atom qt_net_wm_state_above; -extern Atom qt_net_wm_state_stays_on_top; -extern Atom qt_net_wm_window_type; -extern Atom qt_net_wm_window_type_normal; -extern Atom qt_net_wm_window_type_dialog; -extern Atom qt_net_wm_window_type_toolbar; -extern Atom qt_net_wm_window_type_menu; -extern Atom qt_net_wm_window_type_utility; -extern Atom qt_net_wm_window_type_splash; -extern Atom qt_net_wm_window_type_override; -extern Atom qt_net_wm_window_type_dropdown_menu; -extern Atom qt_net_wm_window_type_popup_menu; -extern Atom qt_net_wm_window_type_combo; -extern Atom qt_net_wm_window_type_dnd; -extern Atom qt_net_wm_window_type_tooltip; -extern Atom qt_net_wm_pid; -extern Atom qt_net_wm_user_time; -extern Atom qt_enlightenment_desktop; -extern Atom qt_net_virtual_roots; -extern bool qt_broken_wm; - -// defined in qapplication_x11.cpp -extern bool qt_net_supports(Atom); -extern unsigned long *qt_net_virtual_root_list; - -TQ_EXPORT void qt_wait_for_window_manager( TQWidget* w ) -{ - TQApplication::flushX(); - XEvent ev; - TQTime t; - t.start(); - while ( !XCheckTypedWindowEvent( w->x11Display(), w->winId(), ReparentNotify, &ev ) ) { - if ( XCheckTypedWindowEvent( w->x11Display(), w->winId(), MapNotify, &ev ) ) - break; - if ( t.elapsed() > 500 ) - return; // give up, no event available - tqApp->syncX(); // non-busy wait - } - tqApp->x11ProcessEvent( &ev ); - if ( XCheckTypedWindowEvent( w->x11Display(), w->winId(), ConfigureNotify, &ev ) ) - tqApp->x11ProcessEvent( &ev ); -} - -static void qt_net_change_wm_state(const TQWidget* w, bool set, Atom one, Atom two = 0) -{ - if (w->isShown()) { - // managed by WM - XEvent e; - e.xclient.type = ClientMessage; - e.xclient.message_type = qt_net_wm_state; - e.xclient.display = const_cast<TQWidget*>(w)->x11Display(); - e.xclient.window = w->winId(); - e.xclient.format = 32; - e.xclient.data.l[ 0 ] = set ? 1 : 0; - e.xclient.data.l[ 1 ] = one; - e.xclient.data.l[ 2 ] = two; - e.xclient.data.l[ 3 ] = 0; - e.xclient.data.l[ 4 ] = 0; - XSendEvent(const_cast<TQWidget*>(w)->x11Display(), RootWindow(const_cast<TQWidget*>(w)->x11Display(), const_cast<TQWidget*>(w)->x11Screen()), - False, (SubstructureNotifyMask|SubstructureRedirectMask), &e); - } else { - Atom ret; - int format = 0, status; - unsigned char *data = 0; - unsigned long nitems = 0, after = 0; - Atom *old_states = 0; - status = XGetWindowProperty(const_cast<TQWidget*>(w)->x11Display(), w->winId(), - qt_net_wm_state, 0, 1024, False, - XA_ATOM, &ret, &format, &nitems, - &after, &data); - if (status == Success && ret == XA_ATOM && format == 32 && nitems > 0) - old_states = (Atom *) data; - else - nitems = 0; - - Atom *new_states = new Atom[nitems + 2]; - int i, j = 0; - for (i = 0; i < (int)nitems; ++i) { - if (old_states[i] && old_states[i] != one && old_states[i] != two) - new_states[j++] = old_states[i]; - } - - if (set) { - if (one) new_states[j++] = one; - if (two) new_states[j++] = two; - } - - if (j) - XChangeProperty(const_cast<TQWidget*>(w)->x11Display(), w->winId(), qt_net_wm_state, XA_ATOM, 32, - PropModeReplace, (uchar *) new_states, j); - else - XDeleteProperty(const_cast<TQWidget*>(w)->x11Display(), w->winId(), qt_net_wm_state); - - delete [] new_states; - if (data) XFree(data); - } -} - -void TQWidget::setMask( const QRegion region ) -{ - QWidget::setMask(region); -} - -void TQWidget::setMask( const QBitmap bitmap ) -{ - // Work around a bug in Qt4.x (including Qt4.7) where setting any pixel in either - // the bottom row or rightmost column of a QBitmap to Qt::color0 (i.e., transparent) - // will cause the entire mask to beome opaque - TQBitmap fixedBitmap = bitmap; - fixedBitmap.resize(bitmap.width()+1, bitmap.height()+1); - TQPainter fixerUpper(&fixedBitmap); - fixerUpper.setBrush(Qt::color1); - fixerUpper.setBackgroundMode(Qt::TransparentMode); - fixerUpper.drawLine(0, fixedBitmap.height()-1, fixedBitmap.width()-1, fixedBitmap.height()-1); - fixerUpper.drawLine(fixedBitmap.width()-1, 0, fixedBitmap.width()-1, fixedBitmap.height()-1); - fixerUpper.end(); - QWidget::setMask(fixedBitmap.QBitmap::mask()); -} - -/*! - When a widget gets focus, it should call setMicroFocusHint() with - some appropriate position and size, \a x, \a y, \a width and \a - height. This has no \e visual effect, it just provides hints to - any system-specific input handling tools. - - The \a text argument should be TRUE if this is a position for text - input. - - In the Windows version of TQt, this method sets the system caret, - which is used for user Accessibility focus handling. If \a text - is TRUE, it also sets the IME composition window in Far East Asian - language input systems. - - In the X11 version of TQt, if \a text is TRUE, this method sets the - XIM "spot" point for complex language input handling. - - The font \a f is a rendering hint to the currently active input method. - If \a f is 0 the widget's font is used. - - \sa microFocusHint() -*/ -void TQWidget::setMicroFocusHint(int x, int y, int width, int height, - bool text, TQFont *f ) -{ -// #ifndef TQT_NO_XIM -// if ( text ) { -// TQWidget* tlw = tqtopLevelWidget(); -// TQTLWExtra *topdata = tlw->topData(); -// -// // trigger input context creation if it hasn't happened already -// createInputContext(); -// TQInputContext *qic = (TQInputContext *) topdata->xic; -// -// if ( qt_xim && qic ) { -// TQPoint p( x, y ); -// TQPoint p2 = mapTo( tqtopLevelWidget(), TQPoint( 0, 0 ) ); -// p = mapTo( tqtopLevelWidget(), p); -// qic->setXFontSet( f ? *f : fnt ); -// qic->setComposePosition(p.x(), p.y() + height); -// qic->setComposeArea(p2.x(), p2.y(), this->width(), this->height()); -// } -// } -// #endif - - if ( TQRect( x, y, width, height ) != microFocusHint() ) { - createExtra(); - extraData()->micro_focus_hint.setRect( x, y, width, height ); - } -} - -// void TQWidget::createInputContext() -// { -// TQWidget *tlw = tqtopLevelWidget(); -// TQTLWExtra *topdata = tlw->topData(); -// -// #ifndef TQT_NO_XIM -// if (qt_xim) { -// if (! topdata->xic) { -// TQInputContext *qic = new TQInputContext(tlw); -// topdata->xic = (void *) qic; -// } -// } else -// #endif // TQT_NO_XIM -// { -// // qDebug("TQWidget::createInputContext: no xim"); -// topdata->xic = 0; -// } -// } - -/*! - \overload void TQWidget::drawText( const TQPoint &pos, const TQString& str ) - - Draws the string \a str at position \a pos. -*/ - -/*! - Draws the string \a str at position \a(x, y). - - The \a y position is the base line position of the text. The text - is drawn using the default font and the default foreground color. - - This function is provided for convenience. You will generally get - more flexible results and often higher speed by using a a \link - TQPainter painter\endlink instead. - - \sa setFont(), foregroundColor(), TQPainter::drawText() -*/ - -void TQWidget::drawText( int x, int y, const TQString &str ) -{ - if ( testWState(WState_Visible) ) { - TQPainter paint; - paint.begin( this ); - paint.drawText( x, y, str ); - paint.end(); - } -} - -void TQWidget::createInputContext() -{ -#if 0 -// #if !defined(TQT_NO_IM_EXTENSIONS) - if( !isInputMethodEnabled() || TQApplication::closingDown() ) - return; -// #endif - - TQWidget *icWidget = icHolderWidget(); -#ifndef TQT_NO_IM -#if !defined(TQT_NO_IM_EXTENSIONS) - TQInputContext **qicp = &icWidget->ic; -#else - TQInputContext **qicp = (TQInputContext **)&icWidget->topData()->xic; -#endif - - if ( ! *qicp ) { - // an input context of the default input method is generated. - TQInputContext *qic = TQInputContextFactory::create( TQApplication::defaultInputMethod(), icWidget ); - - *qicp = qic; - if ( qic ) { - TQObject::connect( TQT_TQOBJECT(qic), TQT_SIGNAL(imEventGenerated(TQObject *,TQIMEvent *)), - tqApp, TQT_SLOT(postIMEvent(TQObject *,TQIMEvent *)) ); - TQObject::connect( TQT_TQOBJECT(qic), TQT_SIGNAL(deletionRequested()), - icWidget, TQT_SLOT(destroyInputContext()) ); - } - } -#endif // TQT_NO_IM -#else - printf("[WARNING] TQWidget::createInputContext() UNIMPLEMENTED\n\r"); fflush(stdout); -#endif -} - -/*! - This function returns the TQInputContext instance for this widget. - This instance is used for text input to this widget, etc. - It is simply the accessor function. -*/ -TQInputContext *TQWidget::getInputContext() -{ -#if 0 - TQInputContext *qic = 0; - -// #if !defined(TQT_NO_IM_EXTENSIONS) - if ( isInputMethodEnabled() ) { -#if !defined(TQT_NO_IM_EXTENSIONS) - qic = icHolderWidget()->ic; -#else -// { - // icHolderWidget is always tqtopLevelWidget - TQTLWExtra *topdata = icHolderWidget()->topData(); - qic = (TQInputContext *)topdata->xic; -#endif - } - - return qic; -#else - printf("[WARNING] TQWidget::getInputContext() UNIMPLEMENTED\n\r"); fflush(stdout); - return 0; -#endif -} - -/*! - This function returns the widget holding the TQInputContext - instance for this widget. The instance is used for text input to - this widget, switching input method, etc. - - By default, this function delegates the role of returning input - context holder widget to TQApplication::locateICHolderWidget(). - - This definition enables application developer to change the - mapping of widgets to TQInputContext instance simply by overriding - TQApplication::locateICHolderWidget(). - - \sa TQApplication::locateICHolderWidget() -*/ -TQWidget *TQWidget::icHolderWidget() -{ -#if 0 - return tqApp->locateICHolderWidget(this); -#else - printf("[WARNING] TQWidget::icHolderWidget() UNIMPLEMENTED\n\r"); fflush(stdout); - return 0; -#endif -} - -void TQWidget::sendMouseEventToInputContext( int x, TQEvent::Type type, TQt::ButtonState button, TQt::ButtonState state ) { -#if 0 -#ifndef TQT_NO_IM - // trigger input context creation if it hasn't happened already - createInputContext(); - - TQInputContext *qic = getInputContext(); - if ( qic ) { - // may be causing reset() in some input methods - qic->mouseHandler( x, type, button, state ); - } -#endif // TQT_NO_IM -#else - printf("[WARNING] TQWidget::sendMouseEventToInputContext() UNIMPLEMENTED\n\r"); fflush(stdout); -#endif -} - -void TQWidget::x11SetWindowTransient( TQWidget* parent ) -{ - XSetTransientForHint( x11Display(), winId(), parent->winId()); -} - -// Sets the EWMH (netwm) window type. Needed as a separate function -// because create() may be too soon in some cases. -void TQWidget::x11SetWindowType( X11WindowType type ) -{ - // NET window types - long net_wintypes[7] = { 0, 0, 0, 0, 0, 0, 0 }; - int curr_wintype = 0; - if( testWFlags(WType_Desktop)) - return; - if( type == X11WindowTypeSelect ) { - if ( testWFlags(WStyle_Splash)) { - if (qt_net_supports(qt_net_wm_window_type_splash)) { - net_wintypes[curr_wintype++] = qt_net_wm_window_type_splash; - } - } else if (inherits(TQTOOLBAR_OBJECT_NAME_STRING)) { - // toolbar netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_toolbar; - } else if (testWFlags(WStyle_Customize) && testWFlags(WStyle_Tool)) { - // utility netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_utility; - } else if (testWFlags(WType_Dialog)) { - // dialog netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_dialog; - } - } else if( type == X11WindowTypeCombo ) { - // combo netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_combo; - } else if( type == X11WindowTypeDND ) { - // dnd netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_dnd; - } else if( type == X11WindowTypeDropdown ) { - // dropdown netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_dropdown_menu; - } else if( type == X11WindowTypePopup ) { - // popup netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_popup_menu; - } else if( type == X11WindowTypeMenu ) { - // menu netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_menu; - } else if( type == X11WindowTypeTooltip ) { - // tooltip netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_tooltip; - } - - // normal netwm type - default - net_wintypes[curr_wintype++] = qt_net_wm_window_type_normal; - // set _NET_WM_WINDOW_TYPE - if (curr_wintype > 0) - XChangeProperty(x11Display(), winId(), qt_net_wm_window_type, XA_ATOM, 32, PropModeReplace, - (unsigned char *) net_wintypes, curr_wintype); - else - XDeleteProperty(x11Display(), winId(), qt_net_wm_window_type); -} - -#else // USE_QT4 - -// NOT REVISED - -// defined in qapplication_x11.cpp -extern Window qt_x11_wm_client_leader; -extern void qt_x11_create_wm_client_leader(); - -// defined in qapplication_x11.cpp -void qt_insert_sip( TQWidget*, int, int ); -int qt_sip_count( TQWidget* ); -bool qt_wstate_iconified( WId ); -void qt_updated_rootinfo(); - -#ifndef TQT_NO_IM -#include "tqinputcontext.h" -#include "tqinputcontextfactory.h" -#endif - -// Paint event clipping magic -extern void qt_set_paintevent_clipping( TQPaintDevice* dev, const TQRegion& region); -extern void qt_clear_paintevent_clipping(); - -extern bool qt_dnd_enable( TQWidget* w, bool on ); -extern bool qt_nograb(); - -// defined in qapplication_x11.cpp -extern void qt_deferred_map_add( TQWidget* ); -extern void qt_deferred_map_take( TQWidget* ); -extern bool qt_deferred_map_contains(TQWidget *); - -static TQWidget *mouseGrb = 0; -static TQWidget *keyboardGrb = 0; - -#ifndef TQT_NO_XSYNC -extern Atom qt_net_wm_sync_request_counter; -extern Atom qt_net_wm_sync_request; -extern bool qt_use_xsync; -#endif - -// defined in qfont_x11.cpp -extern bool qt_has_xft; - -int qt_x11_create_desktop_on_screen = -1; - -/***************************************************************************** - TQWidget member functions - *****************************************************************************/ - -// defined in qapplication_x11.cpp -extern Atom qt_wm_state; -extern Atom qt_wm_change_state; -extern Atom qt_wm_delete_window; -extern Atom qt_wm_take_focus; -extern Atom qt_wm_client_leader; -extern Atom qt_window_role; -extern Atom qt_sm_client_id; -extern Atom qt_utf8_string; -extern Atom qt_net_wm_context_help; -extern Atom qt_net_wm_ping; -extern Atom qt_xa_motif_wm_hints; -extern Atom qt_net_wm_name; -extern Atom qt_net_wm_icon_name; -extern Atom qt_net_wm_state; -extern Atom qt_net_wm_state_modal; -extern Atom qt_net_wm_state_max_v; -extern Atom qt_net_wm_state_max_h; -extern Atom qt_net_wm_state_fullscreen; -extern Atom qt_net_wm_state_above; -extern Atom qt_net_wm_state_stays_on_top; -extern Atom qt_net_wm_window_type; -extern Atom qt_net_wm_window_type_normal; -extern Atom qt_net_wm_window_type_dialog; -extern Atom qt_net_wm_window_type_toolbar; -extern Atom qt_net_wm_window_type_menu; -extern Atom qt_net_wm_window_type_utility; -extern Atom qt_net_wm_window_type_splash; -extern Atom qt_net_wm_window_type_override; -extern Atom qt_net_wm_pid; -extern Atom qt_net_wm_user_time; -extern Atom qt_enlightenment_desktop; -extern Atom qt_net_virtual_roots; -extern bool qt_broken_wm; - -// defined in qapplication_x11.cpp -extern bool qt_net_supports(Atom); -extern unsigned long *qt_net_virtual_root_list; - -#if defined (TQT_TABLET_SUPPORT) -extern XDevice *devStylus; -extern XDevice *devEraser; -extern XEventClass event_list_stylus[7]; -extern XEventClass event_list_eraser[7]; -extern int qt_curr_events_stylus; -extern int qt_curr_events_eraser; -#endif - -const uint stdWidgetEventMask = // X event mask - (uint)( - KeyPressMask | KeyReleaseMask | - ButtonPressMask | ButtonReleaseMask | - KeymapStateMask | - ButtonMotionMask | - EnterWindowMask | LeaveWindowMask | - FocusChangeMask | - ExposureMask | - PropertyChangeMask | - StructureNotifyMask - ); - -const uint stdDesktopEventMask = // X event mask - (uint)( - KeymapStateMask | - EnterWindowMask | LeaveWindowMask | - PropertyChangeMask - ); - - -/* - The qt_ functions below are implemented in qwidgetcreate_x11.cpp. -*/ - -Window qt_XCreateWindow( const TQWidget *creator, - Display *display, Window parent, - int x, int y, uint w, uint h, - int borderwidth, int depth, - uint windowclass, Visual *visual, - ulong valuemask, XSetWindowAttributes *attributes ); -Window qt_XCreateSimpleWindow( const TQWidget *creator, - Display *display, Window parent, - int x, int y, uint w, uint h, int borderwidth, - ulong border, ulong background ); -void qt_XDestroyWindow( const TQWidget *destroyer, - Display *display, Window window ); - -TQ_EXPORT void qt_x11_enforce_cursor( TQWidget * w ) -{ - if ( w->testWState( TQt::WState_OwnCursor ) ) { - TQCursor * oc = TQApplication::overrideCursor(); - if ( oc ) { - XDefineCursor( w->x11Display(), w->winId(), oc->handle() ); - } else if ( w->isEnabled() ) { - XDefineCursor( w->x11Display(), w->winId(), w->cursor().handle() ); - } else { - // enforce the windows behavior of clearing the cursor on - // disabled widgets - XDefineCursor( w->x11Display(), w->winId(), None ); - } - } else { - XDefineCursor( w->x11Display(), w->winId(), None ); - } -} - -TQ_EXPORT void qt_wait_for_window_manager( TQWidget* w ) -{ - TQApplication::flushX(); - XEvent ev; - TQTime t; - t.start(); - while ( !XCheckTypedWindowEvent( w->x11Display(), w->winId(), ReparentNotify, &ev ) ) { - if ( XCheckTypedWindowEvent( w->x11Display(), w->winId(), MapNotify, &ev ) ) - break; - if ( t.elapsed() > 500 ) - return; // give up, no event available - tqApp->syncX(); // non-busy wait - } - tqApp->x11ProcessEvent( &ev ); - if ( XCheckTypedWindowEvent( w->x11Display(), w->winId(), ConfigureNotify, &ev ) ) - tqApp->x11ProcessEvent( &ev ); -} - -static void qt_net_change_wm_state(const TQWidget* w, bool set, Atom one, Atom two = 0) -{ - if (w->isShown()) { - // managed by WM - XEvent e; - e.xclient.type = ClientMessage; - e.xclient.message_type = qt_net_wm_state; - e.xclient.display = w->x11Display(); - e.xclient.window = w->winId(); - e.xclient.format = 32; - e.xclient.data.l[ 0 ] = set ? 1 : 0; - e.xclient.data.l[ 1 ] = one; - e.xclient.data.l[ 2 ] = two; - e.xclient.data.l[ 3 ] = 0; - e.xclient.data.l[ 4 ] = 0; - XSendEvent(w->x11Display(), RootWindow(w->x11Display(), w->x11Screen()), - False, (SubstructureNotifyMask|SubstructureRedirectMask), &e); - } else { - Atom ret; - int format = 0, status; - unsigned char *data = 0; - unsigned long nitems = 0, after = 0; - Atom *old_states = 0; - status = XGetWindowProperty(w->x11Display(), w->winId(), - qt_net_wm_state, 0, 1024, False, - XA_ATOM, &ret, &format, &nitems, - &after, &data); - if (status == Success && ret == XA_ATOM && format == 32 && nitems > 0) - old_states = (Atom *) data; - else - nitems = 0; - - Atom *new_states = new Atom[nitems + 2]; - int i, j = 0; - for (i = 0; i < (int)nitems; ++i) { - if (old_states[i] && old_states[i] != one && old_states[i] != two) - new_states[j++] = old_states[i]; - } - - if (set) { - if (one) new_states[j++] = one; - if (two) new_states[j++] = two; - } - - if (j) - XChangeProperty(w->x11Display(), w->winId(), qt_net_wm_state, XA_ATOM, 32, - PropModeReplace, (uchar *) new_states, j); - else - XDeleteProperty(w->x11Display(), w->winId(), qt_net_wm_state); - - delete [] new_states; - if (data) XFree(data); - } -} - -/*! - Creates a new widget window if \a window is 0, otherwise sets the - widget's window to \a window. - - Initializes the window (sets the tqgeometry etc.) if \a - initializeWindow is TRUE. If \a initializeWindow is FALSE, no - initialization is performed. This parameter only makes sense if \a - window is a valid window. - - Destroys the old window if \a destroyOldWindow is TRUE. If \a - destroyOldWindow is FALSE, you are responsible for destroying the - window yourself (using platform native code). - - The TQWidget constructor calls create(0,TRUE,TRUE) to create a - window for this widget. -*/ - -void TQWidget::create( WId window, bool initializeWindow, bool destroyOldWindow) -{ - if ( testWState(WState_Created) && window == 0 ) - return; - - // set created flag - setWState( WState_Created ); - - bool popup = testWFlags(WType_Popup); - bool dialog = testWFlags(WType_Dialog); - bool desktop = testWFlags(WType_Desktop); - - // top-level widget - if ( !parentWidget() || parentWidget()->isDesktop() ) - setWFlags( WType_TopLevel ); - - // these are top-level, too - if ( dialog || popup || desktop || testWFlags(WStyle_Splash)) - setWFlags( WType_TopLevel ); - - // a popup stays on top - if ( popup ) - setWFlags(WStyle_StaysOnTop); - - bool topLevel = testWFlags(WType_TopLevel); - Window parentw, destroyw = 0; - WId id; - - // always initialize - if ( !window ) - initializeWindow = TRUE; - - if ( desktop && - qt_x11_create_desktop_on_screen >= 0 && - qt_x11_create_desktop_on_screen != x11Screen() ) { - // desktop on a certain screen other than the default requested - TQPaintDeviceX11Data* xd = getX11Data( TRUE ); - xd->x_screen = qt_x11_create_desktop_on_screen; - xd->x_depth = TQPaintDevice::x11AppDepth( xd->x_screen ); - xd->x_cells = TQPaintDevice::x11AppCells( xd->x_screen ); - xd->x_colormap = TQPaintDevice::x11AppColormap( xd->x_screen ); - xd->x_defcolormap = TQPaintDevice::x11AppDefaultColormap( xd->x_screen ); - xd->x_visual = TQPaintDevice::x11AppVisual( xd->x_screen ); - xd->x_defvisual = TQPaintDevice::x11AppDefaultVisual( xd->x_screen ); - setX11Data( xd ); - } else if ( parentWidget() && parentWidget()->x11Screen() != x11Screen() ) { - // if we have a parent widget, move to its screen if necessary - TQPaintDeviceX11Data* xd = getX11Data( TRUE ); - xd->x_screen = parentWidget()->x11Screen(); - xd->x_depth = TQPaintDevice::x11AppDepth( xd->x_screen ); - xd->x_cells = TQPaintDevice::x11AppCells( xd->x_screen ); - xd->x_colormap = TQPaintDevice::x11AppColormap( xd->x_screen ); - xd->x_defcolormap = TQPaintDevice::x11AppDefaultColormap( xd->x_screen ); - xd->x_visual = TQPaintDevice::x11AppVisual( xd->x_screen ); - xd->x_defvisual = TQPaintDevice::x11AppDefaultVisual( xd->x_screen ); - setX11Data( xd ); - } - - //get display, screen number, root window and desktop tqgeometry for - //the current screen - Display *dpy = x11Display(); - int scr = x11Screen(); - Window root_win = RootWindow( dpy, scr ); - int sw = DisplayWidth(dpy,scr); - int sh = DisplayHeight(dpy,scr); - - if ( desktop ) { // desktop widget - dialog = popup = FALSE; // force these flags off - crect.setRect( 0, 0, sw, sh ); - } else if ( topLevel ) { // calc pos/size from screen - crect.setRect( sw/4, 3*sh/10, sw/2, 4*sh/10 ); - } else { // child widget - crect.setRect( 0, 0, 100, 30 ); - } - - parentw = topLevel ? root_win : parentWidget()->winId(); - - XSetWindowAttributes wsa; - - if ( window ) { // override the old window - if ( destroyOldWindow ) - destroyw = winid; - id = window; - setWinId( window ); - XWindowAttributes a; - XGetWindowAttributes( dpy, window, &a ); - crect.setRect( a.x, a.y, a.width, a.height ); - - if ( a.map_state == IsUnmapped ) - clearWState( WState_Visible ); - else - setWState( WState_Visible ); - - TQPaintDeviceX11Data* xd = getX11Data( TRUE ); - - // find which screen the window is on... - xd->x_screen = TQPaintDevice::x11AppScreen(); // by default, use the default :) - int i; - for ( i = 0; i < ScreenCount( dpy ); i++ ) { - if ( RootWindow( dpy, i ) == a.root ) { - xd->x_screen = i; - break; - } - } - - xd->x_depth = a.depth; - xd->x_cells = DisplayCells( dpy, xd->x_screen ); - xd->x_visual = a.visual; - xd->x_defvisual = ( XVisualIDFromVisual( a.visual ) == - XVisualIDFromVisual( (Visual*)x11AppVisual(x11Screen()) ) ); - xd->x_colormap = a.colormap; - xd->x_defcolormap = ( a.colormap == x11AppColormap( x11Screen() ) ); - setX11Data( xd ); - } else if ( desktop ) { // desktop widget - id = (WId)parentw; // id = root window - TQWidget *otherDesktop = find( id ); // is there another desktop? - if ( otherDesktop && otherDesktop->testWFlags(WPaintDesktop) ) { - otherDesktop->setWinId( 0 ); // remove id from widget mapper - setWinId( id ); // make sure otherDesktop is - otherDesktop->setWinId( id ); // found first - } else { - setWinId( id ); - } - } else { - if ( x11DefaultVisual() && x11DefaultColormap() ) { - id = (WId)qt_XCreateSimpleWindow( this, dpy, parentw, - crect.left(), crect.top(), - crect.width(), crect.height(), - 0, - black.pixel(x11Screen()), - bg_col.pixel(x11Screen()) ); - } else { - wsa.background_pixel = bg_col.pixel(x11Screen()); - wsa.border_pixel = black.pixel(x11Screen()); - wsa.colormap = (Colormap)x11Colormap(); - id = (WId)qt_XCreateWindow( this, dpy, parentw, - crect.left(), crect.top(), - crect.width(), crect.height(), - 0, x11Depth(), InputOutput, - (Visual*)x11Visual(), - CWBackPixel|CWBorderPixel|CWColormap, - &wsa ); - } - - setWinId( id ); // set widget id/handle + hd - } - -#ifndef TQT_NO_XFTFREETYPE - if (rendhd) { - XftDrawDestroy( (XftDraw *) rendhd ); - rendhd = 0; - } - - if ( qt_has_xft ) - rendhd = (HANDLE) XftDrawCreate( dpy, id, (Visual *) x11Visual(), - x11Colormap() ); -#endif // TQT_NO_XFTFREETYPE - - // NET window states - long net_winstates[6] = { 0, 0, 0, 0, 0, 0 }; - int curr_winstate = 0; - - struct { - ulong flags, functions, decorations; - long input_mode; - ulong status; - } mwmhints; - - mwmhints.flags = mwmhints.functions = 0L; - mwmhints.decorations = (1L << 0); // MWM_DECOR_ALL - mwmhints.input_mode = 0L; - mwmhints.status = 0L; - - if (topLevel && ! (desktop || popup)) { - ulong wsa_mask = 0; - - if ( testWFlags(WStyle_Splash) ) { - if (qt_net_supports(qt_net_wm_window_type_splash)) { - clearWFlags( WX11BypassWM ); - } else { - setWFlags( WX11BypassWM | WStyle_Tool | WStyle_NoBorder ); - } - } - if (testWFlags(WStyle_Customize)) { - mwmhints.decorations = 0L; - mwmhints.flags |= (1L << 1); // MWM_HINTS_DECORATIONS - - if ( testWFlags( WStyle_NormalBorder | WStyle_DialogBorder ) ) { - mwmhints.decorations |= (1L << 1); // MWM_DECOR_BORDER - mwmhints.decorations |= (1L << 2); // MWM_DECOR_RESIZEH - } - - if ( testWFlags( WStyle_Title ) ) - mwmhints.decorations |= (1L << 3); // MWM_DECOR_TITLE - - if ( testWFlags( WStyle_SysMenu ) ) - mwmhints.decorations |= (1L << 4); // MWM_DECOR_MENU - - if ( testWFlags( WStyle_Minimize ) ) - mwmhints.decorations |= (1L << 5); // MWM_DECOR_MINIMIZE - - if ( testWFlags( WStyle_Maximize ) ) - mwmhints.decorations |= (1L << 6); // MWM_DECOR_MAXIMIZE - - if (testWFlags(WStyle_Tool)) { - wsa.save_under = True; - wsa_mask |= CWSaveUnder; - } - } else if (testWFlags(WType_Dialog)) { - setWFlags(WStyle_NormalBorder | WStyle_Title | - WStyle_SysMenu | WStyle_ContextHelp); - } else { - setWFlags(WStyle_NormalBorder | WStyle_Title | - WStyle_MinMax | WStyle_SysMenu); - - // maximized netwm state - if (testWFlags(WState_Maximized)) { - net_winstates[curr_winstate++] = qt_net_wm_state_max_v; - net_winstates[curr_winstate++] = qt_net_wm_state_max_h; - } - } - - // stays on top - if (testWFlags(WStyle_StaysOnTop)) { - net_winstates[curr_winstate++] = qt_net_wm_state_above; - net_winstates[curr_winstate++] = qt_net_wm_state_stays_on_top; - } - - if (testWFlags(WShowModal)) { - mwmhints.input_mode = 3L; // MWM_INPUT_FULL_APPLICATION_MODAL - mwmhints.flags |= (1L << 2); // MWM_HINTS_INPUT_MODE - - net_winstates[curr_winstate++] = qt_net_wm_state_modal; - } - - if ( testWFlags( WX11BypassWM ) ) { - wsa.override_redirect = True; - wsa_mask |= CWOverrideRedirect; - } - - if ( wsa_mask && initializeWindow ) - XChangeWindowAttributes( dpy, id, wsa_mask, &wsa ); - } else { - if (! testWFlags(WStyle_Customize)) - setWFlags(WStyle_NormalBorder | WStyle_Title | - WStyle_MinMax | WStyle_SysMenu); - } - - - if ( !initializeWindow ) { - // do no initialization - } else if ( popup ) { // popup widget - wsa.override_redirect = True; - wsa.save_under = True; - XChangeWindowAttributes( dpy, id, CWOverrideRedirect | CWSaveUnder, - &wsa ); - x11SetWindowType(); - } else if ( topLevel && !desktop ) { // top-level widget - TQWidget *p = parentWidget(); // real parent - if (p) - p = p->tqtopLevelWidget(); - - if (dialog || testWFlags(WStyle_DialogBorder) || testWFlags(WStyle_Tool)) { - if ( p ) - XSetTransientForHint( dpy, id, p->winId() ); - else // application-modal - XSetTransientForHint( dpy, id, root_win ); - } - - // find the real client leader, i.e. a toplevel without parent - while ( p && p->parentWidget()) - p = p->parentWidget()->tqtopLevelWidget(); - - XSizeHints size_hints; - size_hints.flags = USSize | PSize | PWinGravity; - size_hints.x = crect.left(); - size_hints.y = crect.top(); - size_hints.width = crect.width(); - size_hints.height = crect.height(); - size_hints.win_gravity = - TQApplication::reverseLayout() ? NorthEastGravity : NorthWestGravity; - - XWMHints wm_hints; // window manager hints - wm_hints.input = True; - wm_hints.initial_state = NormalState; - wm_hints.flags = InputHint | StateHint; - if ( !qt_x11_wm_client_leader ) - qt_x11_create_wm_client_leader(); - - wm_hints.window_group = qt_x11_wm_client_leader; - wm_hints.flags |= WindowGroupHint; - - XClassHint class_hint; - class_hint.res_name = (char *) tqAppName(); // application name - class_hint.res_class = (char *) tqAppClass(); // application class - - XSetWMProperties( dpy, id, 0, 0, 0, 0, &size_hints, &wm_hints, &class_hint ); - - XResizeWindow( dpy, id, crect.width(), crect.height() ); - XStoreName( dpy, id, tqAppName() ); - Atom protocols[5]; - int n = 0; - protocols[n++] = qt_wm_delete_window; // support del window protocol - protocols[n++] = qt_wm_take_focus; // support take focus window protocol - protocols[n++] = qt_net_wm_ping; // support _NET_WM_PING protocol -#ifndef TQT_NO_XSYNC - protocols[n++] = qt_net_wm_sync_request;// support the _NET_WM_SYNC_REQUEST protocol -#endif - if ( testWFlags( WStyle_ContextHelp ) ) - protocols[n++] = qt_net_wm_context_help; - XSetWMProtocols( dpy, id, protocols, n ); - - // set mwm hints - if ( mwmhints.flags != 0l ) - XChangeProperty(dpy, id, qt_xa_motif_wm_hints, qt_xa_motif_wm_hints, 32, - PropModeReplace, (unsigned char *) &mwmhints, 5); - else - XDeleteProperty(dpy, id, qt_xa_motif_wm_hints); - - x11SetWindowType(); - - // set _NET_WM_WINDOW_STATE - if (curr_winstate > 0) - XChangeProperty(dpy, id, qt_net_wm_state, XA_ATOM, 32, PropModeReplace, - (unsigned char *) net_winstates, curr_winstate); - else - XDeleteProperty(dpy, id, qt_net_wm_state); - - // set _NET_WM_PID - long curr_pid = getpid(); - XChangeProperty(dpy, id, qt_net_wm_pid, XA_CARDINAL, 32, PropModeReplace, - (unsigned char *) &curr_pid, 1); - -#ifndef TQT_NO_XSYNC - // set _NET_WM_SYNC_COUNTER - createSyncCounter(); - long counterVal = topData()->syncCounter; - XChangeProperty( dpy, id, qt_net_wm_sync_request_counter, XA_CARDINAL, 32, PropModeReplace, - (unsigned char*) &counterVal, 1); -#endif - - // when we create a toplevel widget, the frame strut should be dirty - fstrut_dirty = 1; - - // declare the widget's object name as window role - XChangeProperty( dpy, id, - qt_window_role, XA_STRING, 8, PropModeReplace, - (unsigned char *)name(), tqstrlen( name() ) ); - - // set client leader property - XChangeProperty( dpy, id, qt_wm_client_leader, - XA_WINDOW, 32, PropModeReplace, - (unsigned char *)&qt_x11_wm_client_leader, 1 ); - } else { - // non-toplevel widgets don't have a frame, so no need to - // update the strut - fstrut_dirty = 0; - } - - if ( initializeWindow ) { - // don't erase when resizing - wsa.bit_gravity = - TQApplication::reverseLayout() ? NorthEastGravity : NorthWestGravity; - XChangeWindowAttributes( dpy, id, CWBitGravity, &wsa ); - } - - setWState( WState_MouseTracking ); - setMouseTracking( FALSE ); // also sets event mask - if ( desktop ) { - setWState( WState_Visible ); - } else if ( topLevel ) { // set X cursor - setWState( WState_OwnCursor ); - if ( initializeWindow ) - qt_x11_enforce_cursor( this ); - } - - if ( destroyw ) - qt_XDestroyWindow( this, dpy, destroyw ); - -#if !defined(TQT_NO_IM_EXTENSIONS) - ic = 0; -#endif -} - - -/*! - Frees up window system resources. Destroys the widget window if \a - destroyWindow is TRUE. - - destroy() calls itself recursively for all the child widgets, - passing \a destroySubWindows for the \a destroyWindow parameter. - To have more control over destruction of subwidgets, destroy - subwidgets selectively first. - - This function is usually called from the TQWidget destructor. -*/ - -void TQWidget::destroy( bool destroyWindow, bool destroySubWindows ) -{ - deactivateWidgetCleanup(); - if ( testWState(WState_Created) ) { - clearWState( WState_Created ); - if ( childrenListObject() ) { - TQObjectListIt it(*childrenListObject()); - register TQObject *obj; - while ( (obj=it.current()) ) { // destroy all widget tqchildren - ++it; - if ( obj->isWidgetType() ) - ((TQWidget*)obj)->destroy(destroySubWindows, - destroySubWindows); - } - } - if ( mouseGrb == this ) - releaseMouse(); - if ( keyboardGrb == this ) - releaseKeyboard(); - if ( isTopLevel() ) - qt_deferred_map_take( this ); - if ( testWFlags(WShowModal) ) // just be sure we leave modal - qt_leave_modal( this ); - else if ( testWFlags(WType_Popup) ) - tqApp->closePopup( this ); - -#ifndef TQT_NO_XFTFREETYPE - if ( rendhd) { - if ( destroyWindow ) - XftDrawDestroy( (XftDraw *) rendhd ); - else - free( (void*) rendhd ); - rendhd = 0; - } -#endif // TQT_NO_XFTFREETYPE - - if ( testWFlags(WType_Desktop) ) { - if ( acceptDrops() ) - qt_dnd_enable( this, FALSE ); - } else { - if ( destroyWindow ) - qt_XDestroyWindow( this, x11Display(), winid ); - } -#ifndef TQT_NO_XSYNC - destroySyncCounter(); -#endif - setWinId( 0 ); - - extern void qPRCleanup( TQWidget *widget ); // from qapplication_x11.cpp - if ( testWState(WState_Reparented) ) - qPRCleanup(this); - - if( this == icHolderWidget() ) { - destroyInputContext(); - } else { - // release previous focus information participating with - // preedit preservation of qic - TQInputContext *qic = getInputContext(); - if ( qic ) - qic->releaseComposingWidget( this ); - } - } -} - -void TQWidget::reparentSys( TQWidget *parent, WFlags f, const TQPoint &p, bool showIt ) -{ - extern void qPRCreate( const TQWidget *, Window ); - - Display *dpy = x11Display(); - TQCursor oldcurs; - bool setcurs = testWState(WState_OwnCursor); - if ( setcurs ) { - oldcurs = cursor(); - unsetCursor(); - } - - // dnd unregister (we will register again below) - bool accept_drops = acceptDrops(); - setAcceptDrops( FALSE ); - - // clear mouse tracking, re-enabled below - bool mouse_tracking = hasMouseTracking(); - clearWState(WState_MouseTracking); - - TQWidget* oldtlw = tqtopLevelWidget(); - TQWidget *oldparent = parentWidget(); - WId old_winid = winid; - if ( testWFlags(WType_Desktop) ) - old_winid = 0; - setWinId( 0 ); - - // hide and reparent our own window away. Otherwise we might get - // destroyed when emitting the child remove event below. See TQWorkspace. - XUnmapWindow( x11Display(), old_winid ); - XReparentWindow( x11Display(), old_winid, - RootWindow( x11Display(), x11Screen() ), 0, 0 ); - - if ( this == icHolderWidget() ) { - // input contexts are sometimes associated with toplevel widgets, so - // we need destroy the context here. if we are reparenting back to - // toplevel, then we may have another context created, otherwise we - // will use our new ic holder's context - destroyInputContext(); - } - -#ifndef TQT_NO_XSYNC - destroySyncCounter(); -#endif - - if ( isTopLevel() || !parent ) // we are toplevel, or reparenting to toplevel - topData()->parentWinId = 0; - - if ( parent != parentObj ) { - if ( parentObj ) // remove from parent - parentObj->removeChild( this ); - if ( parent ) // insert into new parent - parent->insertChild( this ); - } - bool enable = isEnabled(); // remember status - FocusPolicy fp = focusPolicy(); - TQSize s = size(); - TQPixmap *bgp = (TQPixmap *)backgroundPixmap(); - TQColor bgc = bg_col; // save colors - TQString capt= caption(); - widget_flags = f; - clearWState( WState_Created | WState_Visible | WState_ForceHide ); - create(); - if ( isTopLevel() || (!parent || parent->isVisible() ) ) - setWState( WState_ForceHide ); // new widgets do not show up in already visible parents - - const TQObjectList *chlist = childrenListObject(); - if ( chlist ) { // reparent tqchildren - TQObjectList childList(*chlist); - TQObjectListIt it(childList); // iterate over copy - TQObject *obj; - while ( (obj=it.current()) ) { - if ( obj->isWidgetType() ) { - TQWidget *w = (TQWidget *)obj; - if ( !w->isTopLevel() ) { - XReparentWindow( x11Display(), w->winId(), winId(), - w->tqgeometry().x(), w->tqgeometry().y() ); - } else if ( w->isPopup() - || w->testWFlags(WStyle_DialogBorder) - || w->testWFlags(WType_Dialog) - || w->testWFlags(WStyle_Tool) ) { - /* - when reparenting toplevel windows with toplevel-transient tqchildren, - we need to make sure that the window manager gets the updated - WM_TRANSIENT_FOR information... unfortunately, some window managers - don't handle changing WM_TRANSIENT_FOR before the toplevel window is - visible, so we unmap and remap all toplevel-transient tqchildren *after* - the toplevel parent has been mapped. thankfully, this is easy in TQt :) - */ - XUnmapWindow(w->x11Display(), w->winId()); - XSetTransientForHint(w->x11Display(), w->winId(), winId()); - TQApplication::postEvent(w, new TQEvent(TQEvent::ShowWindowRequest)); - } - } - ++it; - } - } - qPRCreate( this, old_winid ); - if ( bgp ) - XSetWindowBackgroundPixmap( dpy, winid, bgp->handle() ); - else - XSetWindowBackground( dpy, winid, bgc.pixel(x11Screen()) ); - - if (isTopLevel()) { - // preserve maximized/fullscreen flags and the normal tqgeometry - uint save_state = widget_state & (WState_Maximized | WState_FullScreen); - const TQRect r = topData()->normalGeometry; - setGeometry(p.x(), p.y(), s.width(), s.height()); - widget_state |= save_state; - topData()->normalGeometry = r; - } else { - setGeometry(p.x(), p.y(), s.width(), s.height()); - } - - setEnabled( enable ); - setFocusPolicy( fp ); - if ( !capt.isNull() ) { - extra->topextra->caption = TQString::null; - setCaption( capt ); - } - if ( showIt ) - show(); - if ( old_winid ) - qt_XDestroyWindow( this, dpy, old_winid ); - if ( setcurs ) - setCursor(oldcurs); - - reparentFocusWidgets( oldtlw ); - - // re-register dnd - if (oldparent) - oldparent->checkChildrenDnd(); - - if ( accept_drops ) - setAcceptDrops( TRUE ); - else { - checkChildrenDnd(); - topData()->dnd = 0; - qt_dnd_enable(this, (extra && extra->tqchildren_use_dnd)); - } - - // re-enable mouse tracking - if (mouse_tracking) - setMouseTracking(mouse_tracking); -} - -// Sets the EWMH (netwm) window type. Needed as a separate function -// because create() may be too soon in some cases. -void TQWidget::x11SetWindowType( X11WindowType type ) -{ - // NET window types - long net_wintypes[7] = { 0, 0, 0, 0, 0, 0, 0 }; - int curr_wintype = 0; - if( testWFlags(WType_Desktop)) - return; - if( type == X11WindowTypeSelect ) { - if ( testWFlags(WStyle_Splash)) { - if (qt_net_supports(qt_net_wm_window_type_splash)) { - net_wintypes[curr_wintype++] = qt_net_wm_window_type_splash; - } - } else if (inherits(TQTOOLBAR_OBJECT_NAME_STRING)) { - // toolbar netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_toolbar; - } else if (testWFlags(WStyle_Customize) && testWFlags(WStyle_Tool)) { - // utility netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_utility; - } else if (testWFlags(WType_Dialog)) { - // dialog netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_dialog; - } - } else if( type == X11WindowTypeCombo ) { - // combo netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_combo; - } else if( type == X11WindowTypeDND ) { - // dnd netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_dnd; - } else if( type == X11WindowTypeDropdown ) { - // dropdown netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_dropdown_menu; - } else if( type == X11WindowTypePopup ) { - // popup netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_popup_menu; - } else if( type == X11WindowTypeMenu ) { - // menu netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_menu; - } else if( type == X11WindowTypeTooltip ) { - // tooltip netwm type - net_wintypes[curr_wintype++] = qt_net_wm_window_type_tooltip; - } - - // normal netwm type - default - net_wintypes[curr_wintype++] = qt_net_wm_window_type_normal; - // set _NET_WM_WINDOW_TYPE - if (curr_wintype > 0) - XChangeProperty(x11Display(), winId(), qt_net_wm_window_type, XA_ATOM, 32, PropModeReplace, - (unsigned char *) net_wintypes, curr_wintype); - else - XDeleteProperty(x11Display(), winId(), qt_net_wm_window_type); -} - -void TQWidget::x11SetWindowTransient( TQWidget* parent ) -{ - XSetTransientForHint( x11Display(), winId(), parent->winId()); -} - -/*! - Translates the widget coordinate \a pos to global screen - coordinates. For example, \c{mapToGlobal(TQPoint(0,0))} would give - the global coordinates of the top-left pixel of the widget. - - \sa mapFromGlobal() mapTo() mapToParent() -*/ - -TQPoint TQWidget::mapToGlobal( const TQPoint &pos ) const -{ - int x, y; - Window child; - XTranslateCoordinates( x11Display(), winId(), - TQApplication::desktop()->screen(x11Screen())->winId(), - pos.x(), pos.y(), &x, &y, &child ); - return TQPoint( x, y ); -} - -/*! - Translates the global screen coordinate \a pos to widget - coordinates. - - \sa mapToGlobal() mapFrom() mapFromParent() -*/ - -TQPoint TQWidget::mapFromGlobal( const TQPoint &pos ) const -{ - int x, y; - Window child; - XTranslateCoordinates( x11Display(), - TQApplication::desktop()->screen(x11Screen())->winId(), - winId(), pos.x(), pos.y(), &x, &y, &child ); - return TQPoint( x, y ); -} - -/*! - When a widget gets focus, it should call setMicroFocusHint() with - some appropriate position and size, \a x, \a y, \a width and \a - height. This has no \e visual effect, it just provides hints to - any system-specific input handling tools. - - The \a text argument should be TRUE if this is a position for text - input. - - In the Windows version of TQt, this method sets the system caret, - which is used for user Accessibility focus handling. If \a text - is TRUE, it also sets the IME composition window in Far East Asian - language input systems. - - In the X11 version of TQt, if \a text is TRUE, this method sets the - input method focus point in the preedit (XIM "spot" point) for - complex language input handling. - - The font \a f is a rendering hint to the currently active input method. - If \a f is 0 the widget's font is used. - - \sa microFocusHint() -*/ -void TQWidget::setMicroFocusHint(int x, int y, int width, int height, - bool text, TQFont *f ) -{ -#ifndef TQT_NO_IM - if ( text ) { - // trigger input context creation if it hasn't happened already - createInputContext(); - - TQInputContext *qic = getInputContext(); - if(qic) { - TQPoint gp = mapToGlobal( TQPoint( x, y ) ); - qic->setMicroFocus(gp.x(), gp.y(), width, height, f); - } - } -#endif - - if ( TQRect( x, y, width, height ) != microFocusHint() ) { - createExtra(); - extraData()->micro_focus_hint.setRect( x, y, width, height ); - } -} - - -void TQWidget::setFontSys( TQFont * ) -{ - // Nothing -} - - -void TQWidget::setBackgroundColorDirect( const TQColor &color ) -{ - bg_col = color; - if ( extra && extra->bg_pix ) { // kill the background pixmap - delete extra->bg_pix; - extra->bg_pix = 0; - } - XSetWindowBackground( x11Display(), winId(), bg_col.pixel(x11Screen()) ); -} - -static int allow_null_pixmaps = 0; - - -void TQWidget::setBackgroundPixmapDirect( const TQPixmap &pixmap ) -{ - TQPixmap old; - if ( extra && extra->bg_pix ) - old = *extra->bg_pix; - if ( !allow_null_pixmaps && pixmap.isNull() ) { - XSetWindowBackground( x11Display(), winId(), bg_col.pixel(x11Screen()) ); - if ( extra && extra->bg_pix ) { - delete extra->bg_pix; - extra->bg_pix = 0; - } - } else { - TQPixmap pm = pixmap; - if (!pm.isNull()) { - if ( pm.depth() == 1 && TQPixmap::defaultDepth() > 1 ) { - pm = TQPixmap( pixmap.size() ); - bitBlt( &pm, 0, 0, &pixmap, 0, 0, pm.width(), pm.height() ); - } - } - if ( extra && extra->bg_pix ) - delete extra->bg_pix; - else - createExtra(); - extra->bg_pix = new TQPixmap( pm ); - TQ_CHECK_PTR( extra->bg_pix ); - extra->bg_pix->x11SetScreen( x11Screen() ); - XSetWindowBackgroundPixmap( x11Display(), winId(), extra->bg_pix->handle() ); - if ( testWFlags(WType_Desktop) ) // save rootinfo later - qt_updated_rootinfo(); - } -} - - -/*! - Sets the window-system background of the widget to nothing. - - Note that "nothing" is actually a pixmap that isNull(), thus you - can check for an empty background by checking backgroundPixmap(). - - \sa setBackgroundPixmap(), setBackgroundColor() -*/ -void TQWidget::setBackgroundEmpty() -{ - allow_null_pixmaps++; - setErasePixmap(TQPixmap()); - allow_null_pixmaps--; -} - - -void TQWidget::setBackgroundX11Relative() -{ - XSetWindowBackgroundPixmap( x11Display(), winId(), ParentRelative ); -} - -void TQWidget::setCursor( const TQCursor &cursor ) -{ - if ( cursor.handle() != arrowCursor.handle() - || (extra && extra->curs) ) { - createExtra(); - delete extra->curs; - extra->curs = new TQCursor(cursor); - } - setWState( WState_OwnCursor ); - qt_x11_enforce_cursor( this ); - XFlush( x11Display() ); -} - -void TQWidget::unsetCursor() -{ - if ( extra ) { - delete extra->curs; - extra->curs = 0; - } - if ( !isTopLevel() ) - clearWState( WState_OwnCursor ); - qt_x11_enforce_cursor( this ); - XFlush( x11Display() ); -} - -static XTextProperty* -qstring_to_xtp( const TQString& s ) -{ - static XTextProperty tp = { 0, 0, 0, 0 }; - static bool free_prop = TRUE; // we can't free tp.value in case it references - // the data of the static TQCString below. - if ( tp.value ) { - if ( free_prop ) - XFree( tp.value ); - tp.value = 0; - free_prop = TRUE; - } - - static const TQTextCodec* mapper = TQTextCodec::codecForLocale(); - int errCode = 0; - if ( mapper ) { - TQCString mapped = mapper->fromUnicode(s); - char* tl[2]; - tl[0] = mapped.data(); - tl[1] = 0; - errCode = XmbTextListToTextProperty( TQPaintDevice::x11AppDisplay(), - tl, 1, XStdICCTextStyle, &tp ); -#if defined(TQT_DEBUG) - if ( errCode < 0 ) - qDebug( "qstring_to_xtp result code %d", errCode ); -#endif - } - if ( !mapper || errCode < 0 ) { - static TQCString qcs; - qcs = s.ascii(); - tp.value = (uchar*)qcs.data(); - tp.encoding = XA_STRING; - tp.format = 8; - tp.nitems = qcs.length(); - free_prop = FALSE; - } - - // ### If we knew WM could understand tqunicode, we could use - // ### a much simpler, cheaper encoding... - /* - tp.value = (XChar2b*)s.tqunicode(); - tp.encoding = XA_UNICODE; // wish - tp.format = 16; - tp.nitems = s.length(); - */ - - return &tp; -} - -void TQWidget::setCaption( const TQString &caption ) -{ - if ( TQWidget::caption() == caption ) - return; - - topData()->caption = caption; - XSetWMName( x11Display(), winId(), qstring_to_xtp(caption) ); - - TQCString net_wm_name = caption.utf8(); - XChangeProperty(x11Display(), winId(), qt_net_wm_name, qt_utf8_string, 8, - PropModeReplace, (unsigned char *)net_wm_name.data(), - net_wm_name.length()); - - TQEvent e( TQEvent::CaptionChange ); - TQApplication::sendEvent( this, &e ); -} - -void TQWidget::setIcon( const TQPixmap &pixmap ) -{ - if ( extra && extra->topextra ) { - delete extra->topextra->icon; - extra->topextra->icon = 0; - } else { - createTLExtra(); - } - Pixmap icon_pixmap = 0; - Pixmap mask_pixmap = 0; - if ( !pixmap.isNull() ) { - TQPixmap* pm = new TQPixmap( pixmap ); - extra->topextra->icon = pm; - if ( !pm->mask() ) - pm->setMask( pm->createHeuristicMask() ); // may do detach() - icon_pixmap = pm->handle(); - if ( pm->mask() ) - mask_pixmap = pm->mask()->handle(); - } - XWMHints *h = XGetWMHints( x11Display(), winId() ); - XWMHints wm_hints; - bool got_hints = h != 0; - if ( !got_hints ) { - h = &wm_hints; - h->flags = 0; - } - h->icon_pixmap = icon_pixmap; - h->icon_mask = mask_pixmap; - h->flags |= IconPixmapHint | IconMaskHint; - XSetWMHints( x11Display(), winId(), h ); - if ( got_hints ) - XFree( (char *)h ); - TQEvent e( TQEvent::IconChange ); - TQApplication::sendEvent( this, &e ); -} - -void TQWidget::setIconText( const TQString &iconText ) -{ - if (TQWidget::iconText() == iconText) - return; - - topData()->iconText = iconText; - XSetWMIconName( x11Display(), winId(), qstring_to_xtp(iconText) ); - - TQCString net_wm_icon_name = iconText.utf8(); - XChangeProperty(x11Display(), winId(), qt_net_wm_icon_name, qt_utf8_string, 8, PropModeReplace, - (unsigned char *) net_wm_icon_name.data(), net_wm_icon_name.length()); -} - -void TQWidget::setMouseTracking( bool enable ) -{ - bool gmt = TQApplication::hasGlobalMouseTracking(); - if ( !enable == !testWState(WState_MouseTracking) && !gmt ) - return; - uint m = (enable || gmt) ? (uint)PointerMotionMask : 0; - if ( enable ) - setWState( WState_MouseTracking ); - else - clearWState( WState_MouseTracking ); - if ( testWFlags(WType_Desktop) ) { // desktop widget? - TQWidget* main_desktop = find( winId() ); - if ( main_desktop->testWFlags(WPaintDesktop) ) - XSelectInput( x11Display(), winId(), - stdDesktopEventMask | ExposureMask ); - else - XSelectInput( x11Display(), winId(), stdDesktopEventMask ); - } else { - XSelectInput( x11Display(), winId(), - m | stdWidgetEventMask ); -#if defined (TQT_TABLET_SUPPORT) - if ( devStylus != NULL ) { - XSelectExtensionEvent( x11Display(), winId(), event_list_stylus, - qt_curr_events_stylus ); - } - if ( devEraser != NULL ) { - XSelectExtensionEvent( x11Display(), winId(), event_list_eraser, - qt_curr_events_eraser ); - } -#endif - } -} - - -/*! - Grabs the mouse input. - - This widget receives all mouse events until releaseMouse() is - called; other widgets get no mouse events at all. Keyboard - events are not affected. Use grabKeyboard() if you want to grab - that. - - \warning Bugs in mouse-grabbing applications very often lock the - terminal. Use this function with extreme caution, and consider - using the \c -nograb command line option while debugging. - - It is almost never necessary to grab the mouse when using TQt, as - TQt grabs and releases it sensibly. In particular, TQt grabs the - mouse when a mouse button is pressed and keeps it until the last - button is released. - - Note that only visible widgets can grab mouse input. If - isVisible() returns FALSE for a widget, that widget cannot call - grabMouse(). - - \sa releaseMouse() grabKeyboard() releaseKeyboard() grabKeyboard() - tqfocusWidget() -*/ - -void TQWidget::grabMouse() -{ - if ( isVisible() && !qt_nograb() ) { - if ( mouseGrb ) - mouseGrb->releaseMouse(); -#if defined(TQT_CHECK_STATE) - int status = -#endif - XGrabPointer( x11Display(), winId(), False, - (uint)( ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | EnterWindowMask | - LeaveWindowMask ), - GrabModeAsync, GrabModeAsync, - None, None, GET_QT_X_TIME() ); -#if defined(TQT_CHECK_STATE) - if ( status ) { - const char *s = - status == GrabNotViewable ? "\"GrabNotViewable\"" : - status == AlreadyGrabbed ? "\"AlreadyGrabbed\"" : - status == GrabFrozen ? "\"GrabFrozen\"" : - status == GrabInvalidTime ? "\"GrabInvalidTime\"" : - "<?>"; - qWarning( "Grabbing the mouse failed with %s", s ); - } -#endif - mouseGrb = this; - } -} - -/*! - \overload - - Grabs the mouse input and changes the cursor tqshape. - - The cursor will assume tqshape \a cursor (for as long as the mouse - focus is grabbed) and this widget will be the only one to receive - mouse events until releaseMouse() is called(). - - \warning Grabbing the mouse might lock the terminal. - - \sa releaseMouse(), grabKeyboard(), releaseKeyboard(), setCursor() -*/ - -void TQWidget::grabMouse( const TQCursor &cursor ) -{ - if ( !qt_nograb() ) { - if ( mouseGrb ) - mouseGrb->releaseMouse(); -#if defined(TQT_CHECK_STATE) - int status = -#endif - XGrabPointer( x11Display(), winId(), False, - (uint)(ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | EnterWindowMask | LeaveWindowMask), - GrabModeAsync, GrabModeAsync, - None, cursor.handle(), GET_QT_X_TIME() ); -#if defined(TQT_CHECK_STATE) - if ( status ) { - const char *s = - status == GrabNotViewable ? "\"GrabNotViewable\"" : - status == AlreadyGrabbed ? "\"AlreadyGrabbed\"" : - status == GrabFrozen ? "\"GrabFrozen\"" : - status == GrabInvalidTime ? "\"GrabInvalidTime\"" : - "<?>"; - qWarning( "Grabbing the mouse failed with %s", s ); - } -#endif - mouseGrb = this; - } -} - -/*! - Releases the mouse grab. - - \sa grabMouse(), grabKeyboard(), releaseKeyboard() -*/ - -void TQWidget::releaseMouse() -{ - if ( !qt_nograb() && mouseGrb == this ) { - XUngrabPointer( x11Display(), GET_QT_X_TIME() ); - XFlush( x11Display() ); - mouseGrb = 0; - } -} - -/*! - Grabs the keyboard input. - - This widget reveives all keyboard events until releaseKeyboard() - is called; other widgets get no keyboard events at all. Mouse - events are not affected. Use grabMouse() if you want to grab that. - - The focus widget is not affected, except that it doesn't receive - any keyboard events. setFocus() moves the focus as usual, but the - new focus widget receives keyboard events only after - releaseKeyboard() is called. - - If a different widget is currently grabbing keyboard input, that - widget's grab is released first. - - \sa releaseKeyboard() grabMouse() releaseMouse() tqfocusWidget() -*/ - -void TQWidget::grabKeyboard() -{ - if ( !qt_nograb() ) { - if ( keyboardGrb ) - keyboardGrb->releaseKeyboard(); - XGrabKeyboard( x11Display(), winid, False, GrabModeAsync, GrabModeAsync, - GET_QT_X_TIME() ); - keyboardGrb = this; - } -} - -/*! - Releases the keyboard grab. - - \sa grabKeyboard(), grabMouse(), releaseMouse() -*/ - -void TQWidget::releaseKeyboard() -{ - if ( !qt_nograb() && keyboardGrb == this ) { - XUngrabKeyboard( x11Display(), GET_QT_X_TIME() ); - keyboardGrb = 0; - } -} - - -/*! - Returns the widget that is currently grabbing the mouse input. - - If no widget in this application is currently grabbing the mouse, - 0 is returned. - - \sa grabMouse(), keyboardGrabber() -*/ - -TQWidget *TQWidget::mouseGrabber() -{ - return mouseGrb; -} - -/*! - Returns the widget that is currently grabbing the keyboard input. - - If no widget in this application is currently grabbing the - keyboard, 0 is returned. - - \sa grabMouse(), mouseGrabber() -*/ - -TQWidget *TQWidget::keyboardGrabber() -{ - return keyboardGrb; -} - -/*! - Sets the top-level widget containing this widget to be the active - window. - - An active window is a visible top-level window that has the - keyboard input focus. - - This function performs the same operation as clicking the mouse on - the title bar of a top-level window. On X11, the result depends on - the Window Manager. If you want to ensure that the window is - stacked on top as well you should also call raise(). Note that the - window must be visible, otherwise setActiveWindow() has no effect. - - On Windows, if you are calling this when the application is not - currently the active one then it will not make it the active - window. It will flash the task bar entry blue to indicate that - the window has done something. This is because Microsoft do not - allow an application to interrupt what the user is currently doing - in another application. - - \sa isActiveWindow(), tqtopLevelWidget(), show() -*/ - -void TQWidget::setActiveWindow() -{ - TQWidget *tlw = tqtopLevelWidget(); - if ( tlw->isVisible() && !tlw->topData()->embedded && !qt_deferred_map_contains(tlw) ) { - XSetInputFocus( x11Display(), tlw->winId(), RevertToNone, GET_QT_X_TIME()); - focusInputContext(); - } -} - - -/*! - Updates the widget unless updates are disabled or the widget is - hidden. - - This function does not cause an immediate tqrepaint; instead it - schedules a paint event for processing when TQt returns to the main - event loop. This permits TQt to optimize for more speed and less - flicker than a call to tqrepaint() does. - - Calling update() several times normally results in just one - paintEvent() call. - - TQt normally erases the widget's area before the paintEvent() call. - If the \c WRepaintNoErase widget flag is set, the widget is - responsible for painting all its pixels itself. - - \sa tqrepaint(), paintEvent(), setUpdatesEnabled(), erase(), - setWFlags() -*/ - -void TQWidget::update() -{ - if ( (widget_state & (WState_Visible|WState_BlockUpdates)) == - WState_Visible ) - TQApplication::postEvent( this, new TQPaintEvent( clipRegion(), !testWFlags(WRepaintNoErase) ) ); -} - -/*! - \overload - - Updates a rectangle (\a x, \a y, \a w, \a h) inside the widget - unless updates are disabled or the widget is hidden. - - This function does not cause an immediate tqrepaint; instead it - schedules a paint event for processing when TQt returns to the main - event loop. This permits TQt to optimize for more speed and less - flicker and a call to tqrepaint() does. - - Calling update() several times normally results in just one - paintEvent() call. - - If \a w is negative, it is replaced with \c{width() - x}. If \a h - is negative, it is replaced width \c{height() - y}. - - TQt normally erases the specified area before the paintEvent() - call. If the \c WRepaintNoErase widget flag is set, the widget is - responsible for painting all its pixels itself. - - \sa tqrepaint(), paintEvent(), setUpdatesEnabled(), erase() -*/ - -void TQWidget::update( int x, int y, int w, int h ) -{ - if ( w && h && - (widget_state & (WState_Visible|WState_BlockUpdates)) == WState_Visible ) { - if ( w < 0 ) - w = crect.width() - x; - if ( h < 0 ) - h = crect.height() - y; - if ( w != 0 && h != 0 ) - TQApplication::postEvent( this, - new TQPaintEvent( clipRegion().intersect(TQRect(x,y,w,h)), - !testWFlags( WRepaintNoErase ) ) ); - } -} - -/*! - \overload void TQWidget::update( const TQRect &r ) - - Updates a rectangle \a r inside the widget unless updates are - disabled or the widget is hidden. - - This function does not cause an immediate tqrepaint; instead it - schedules a paint event for processing when TQt returns to the main - event loop. This permits TQt to optimize for more speed and less - flicker and a call to tqrepaint() does. - - Calling update() several times normally results in just one - paintEvent() call. -*/ - -/*! - \overload void TQWidget::tqrepaint( bool erase ) - - This version repaints the entire widget. -*/ - -/*! - \overload void TQWidget::tqrepaint() - - This version erases and repaints the entire widget. -*/ - -/*! - Repaints the widget directly by calling paintEvent() immediately, - unless updates are disabled or the widget is hidden. - - If \a erase is TRUE, TQt erases the area \a (x, y, w, h) before the - paintEvent() call. - - If \a w is negative, it is replaced with \c{width() - x}, and if - \a h is negative, it is replaced width \c{height() - y}. - - We suggest only using tqrepaint() if you need an immediate tqrepaint, - for example during animation. In almost all circumstances update() - is better, as it permits TQt to optimize for speed and minimize - flicker. - - \warning If you call tqrepaint() in a function which may itself be - called from paintEvent(), you may get infinite recursion. The - update() function never causes recursion. - - \sa update(), paintEvent(), setUpdatesEnabled(), erase() -*/ - -void TQWidget::tqrepaint( int x, int y, int w, int h, bool erase ) -{ - if ( (widget_state & (WState_Visible|WState_BlockUpdates)) == WState_Visible ) { - if ( x > crect.width() || y > crect.height() ) - return; - if ( w < 0 ) - w = crect.width() - x; - if ( h < 0 ) - h = crect.height() - y; - TQRect r(x,y,w,h); - if ( r.isEmpty() ) - return; // nothing to do - TQPaintEvent e( r, erase ); - if ( r != rect() ) - qt_set_paintevent_clipping( this, r ); - if ( erase && w != 0 && h != 0 ) { - if ( backgroundOrigin() == WidgetOrigin ) - XClearArea( x11Display(), winId(), x, y, w, h, False ); - else - this->erase( x, y, w, h); - } - TQApplication::sendEvent( this, &e ); - qt_clear_paintevent_clipping(); - } -} - -/*! - \overload - - Repaints the widget directly by calling paintEvent() directly, - unless updates are disabled or the widget is hidden. - - Erases the widget region \a reg if \a erase is TRUE. - - Only use tqrepaint if your widget needs to be repainted immediately, - for example when doing some animation. In all other cases, use - update(). Calling update() many times in a row will generate a - single paint event. - - \warning If you call tqrepaint() in a function which may itself be - called from paintEvent(), you may get infinite recursion. The - update() function never causes recursion. - - \sa update(), paintEvent(), setUpdatesEnabled(), erase() -*/ - -void TQWidget::tqrepaint( const TQRegion& reg, bool erase ) -{ - if ( (widget_state & (WState_Visible|WState_BlockUpdates)) == WState_Visible ) { - TQPaintEvent e( reg, erase ); - qt_set_paintevent_clipping( this, reg ); - if ( erase ) - this->erase(reg); - TQApplication::sendEvent( this, &e ); - qt_clear_paintevent_clipping(); - } -} - -/*! - \overload void TQWidget::tqrepaint( const TQRect &r, bool erase ) - - Repaints the widget directly by calling paintEvent() directly, - unless updates are disabled or the widget is hidden. - - Erases the widget region \a r if \a erase is TRUE. -*/ - -void TQWidget::setWindowState(uint newstate) -{ - bool needShow = FALSE; - uint oldstate = windowState(); - if (isTopLevel()) { - TQTLWExtra *top = topData(); - - if ((oldstate & WindowMaximized) != (newstate & WindowMaximized)) { - if (qt_net_supports(qt_net_wm_state_max_h) && qt_net_supports(qt_net_wm_state_max_v)) { - qt_net_change_wm_state(this, (newstate & WindowMaximized), - qt_net_wm_state_max_h, qt_net_wm_state_max_v); - } else if (! (newstate & WindowFullScreen)) { - if (newstate & WindowMaximized) { - // save original tqgeometry - const TQRect normalGeometry = tqgeometry(); - - if (isVisible()) { - updateFrameStrut(); - const TQRect maxRect = TQApplication::desktop()->availableGeometry(this); - const TQRect r = top->normalGeometry; - setGeometry(maxRect.x() + top->fleft, - maxRect.y() + top->ftop, - maxRect.width() - top->fleft - top->fright, - maxRect.height() - top->ftop - top->fbottom); - top->normalGeometry = r; - } - - if (top->normalGeometry.width() < 0) - top->normalGeometry = normalGeometry; - } else { - // restore original tqgeometry - setGeometry(top->normalGeometry); - } - } - } - - if ((oldstate & WindowFullScreen) != (newstate & WindowFullScreen)) { - if (qt_net_supports(qt_net_wm_state_fullscreen)) { - qt_net_change_wm_state(this, (newstate & WindowFullScreen), - qt_net_wm_state_fullscreen); - } else { - needShow = isVisible(); - - if (newstate & WindowFullScreen) { - const TQRect normalGeometry = TQRect(pos(), size()); - - top->savedFlags = getWFlags(); - reparent(0, WType_TopLevel | WStyle_Customize | WStyle_NoBorder | - // preserve some widget flags - (getWFlags() & 0xffff0000), - mapToGlobal(TQPoint(0, 0))); - const TQRect r = top->normalGeometry; - setGeometry(tqApp->desktop()->screenGeometry(this)); - top->normalGeometry = r; - - if ( top->normalGeometry.width() < 0 ) - top->normalGeometry = normalGeometry; - } else { - reparent( 0, top->savedFlags, mapToGlobal(TQPoint(0, 0)) ); - - if (newstate & WindowMaximized) { - // from fullscreen to maximized - updateFrameStrut(); - const TQRect maxRect = TQApplication::desktop()->availableGeometry(this); - const TQRect r = top->normalGeometry; - setGeometry(maxRect.x() + top->fleft, - maxRect.y() + top->ftop, - maxRect.width() - top->fleft - top->fright, - maxRect.height() - top->ftop - top->fbottom); - top->normalGeometry = r; - } else { - // restore original tqgeometry - setGeometry(top->normalGeometry); - } - } - } - } - - if ((oldstate & WindowMinimized) != (newstate & WindowMinimized)) { - if (isVisible()) { - if (newstate & WindowMinimized) { - XEvent e; - e.xclient.type = ClientMessage; - e.xclient.message_type = qt_wm_change_state; - e.xclient.display = x11Display(); - e.xclient.window = winid; - e.xclient.format = 32; - e.xclient.data.l[0] = IconicState; - e.xclient.data.l[1] = 0; - e.xclient.data.l[2] = 0; - e.xclient.data.l[3] = 0; - e.xclient.data.l[4] = 0; - XSendEvent(x11Display(), RootWindow(x11Display(), x11Screen()), - False, (SubstructureNotifyMask|SubstructureRedirectMask), &e); - } else { - XMapWindow(x11Display(), winId()); - } - } - - needShow = FALSE; - } - } - - widget_state &= ~(WState_Minimized | WState_Maximized | WState_FullScreen); - if (newstate & WindowMinimized) - widget_state |= WState_Minimized; - if (newstate & WindowMaximized) - widget_state |= WState_Maximized; - if (newstate & WindowFullScreen) - widget_state |= WState_FullScreen; - - if (needShow) - show(); - - if (newstate & WindowActive) - setActiveWindow(); - - TQEvent e(TQEvent::WindowStateChange); - TQApplication::sendEvent(this, &e); -} - -/*! - \internal - Platform-specific part of TQWidget::show(). -*/ - -void TQWidget::showWindow() -{ - if ( isTopLevel() ) { - XWMHints *h = XGetWMHints( x11Display(), winId() ); - XWMHints wm_hints; - bool got_hints = h != 0; - if ( !got_hints ) { - h = &wm_hints; - h->flags = 0; - } - h->initial_state = testWState(WState_Minimized) ? IconicState : NormalState; - h->flags |= StateHint; - XSetWMHints( x11Display(), winId(), h ); - if ( got_hints ) - XFree( (char *)h ); - - if (GET_QT_X_USER_TIME() != CurrentTime) { - Time my_tqx_user_time = GET_QT_X_USER_TIME(); - XChangeProperty(x11Display(), winId(), qt_net_wm_user_time, XA_CARDINAL, - 32, PropModeReplace, (unsigned char *) &my_tqx_user_time, 1); - SET_QT_X_USER_TIME(my_tqx_user_time); - } - - if (!topData()->embedded && - topData()->parentWinId && - topData()->parentWinId != TQPaintDevice::x11AppRootWindow(x11Screen()) && - !isMinimized() ) { - qt_deferred_map_add( this ); - return; - } - - if (isMaximized() && !isFullScreen() - && !(qt_net_supports(qt_net_wm_state_max_h) - && qt_net_supports(qt_net_wm_state_max_v))) { - XMapWindow( x11Display(), winId() ); - qt_wait_for_window_manager(this); - - // if the wm was not smart enough to adjust our size, do that manually - updateFrameStrut(); - TQRect maxRect = TQApplication::desktop()->availableGeometry(this); - - TQTLWExtra *top = topData(); - TQRect normalRect = top->normalGeometry; - - setGeometry(maxRect.x() + top->fleft, - maxRect.y() + top->ftop, - maxRect.width() - top->fleft - top->fright, - maxRect.height() - top->ftop - top->fbottom); - - // restore the original normalGeometry - top->normalGeometry = normalRect; - // internalSetGeometry() clears the maximized flag... make sure we set it back - setWState(WState_Maximized); - - return; - } - - if (isFullScreen() && !qt_net_supports(qt_net_wm_state_fullscreen)) { - XMapWindow(x11Display(), winId()); - qt_wait_for_window_manager(this); - return; - } - } - XMapWindow( x11Display(), winId() ); -} - - -/*! - \internal - Platform-specific part of TQWidget::hide(). -*/ - -void TQWidget::hideWindow() -{ - clearWState( WState_Exposed ); - deactivateWidgetCleanup(); - if ( isTopLevel() ) { - qt_deferred_map_take( this ); - if ( winId() ) // in nsplugin, may be 0 - XWithdrawWindow( x11Display(), winId(), x11Screen() ); - - TQTLWExtra *top = topData(); - crect.moveTopLeft( TQPoint(crect.x() - top->fleft, crect.y() - top->ftop ) ); - - // zero the frame strut and mark it dirty - top->fleft = top->fright = top->ftop = top->fbottom = 0; - fstrut_dirty = TRUE; - - XFlush( x11Display() ); - } else { - if ( winId() ) // in nsplugin, may be 0 - XUnmapWindow( x11Display(), winId() ); - } -} - -/*! - Raises this widget to the top of the parent widget's stack. - - After this call the widget will be visually in front of any - overlapping sibling widgets. - - \sa lower(), stackUnder() -*/ - -void TQWidget::raise() -{ - TQWidget *p = parentWidget(); - if ( p && p->childObjects && p->childObjects->findRef(this) >= 0 ) - p->childObjects->append( p->childObjects->take() ); - XRaiseWindow( x11Display(), winId() ); -} - -/*! - Lowers the widget to the bottom of the parent widget's stack. - - After this call the widget will be visually behind (and therefore - obscured by) any overlapping sibling widgets. - - \sa raise(), stackUnder() -*/ - -void TQWidget::lower() -{ - TQWidget *p = parentWidget(); - if ( p && p->childObjects && p->childObjects->findRef(this) >= 0 ) - p->childObjects->insert( 0, p->childObjects->take() ); - XLowerWindow( x11Display(), winId() ); -} - - -/*! - Places the widget under \a w in the parent widget's stack. - - To make this work, the widget itself and \a w must be siblings. - - \sa raise(), lower() -*/ -void TQWidget::stackUnder( TQWidget* w) -{ - TQWidget *p = parentWidget(); - if ( !w || isTopLevel() || p != w->parentWidget() || this == w ) - return; - if ( p && p->childObjects && p->childObjects->findRef(w) >= 0 && p->childObjects->findRef(this) >= 0 ) { - p->childObjects->take(); - p->childObjects->insert( p->childObjects->findRef(w), this ); - } - Window stack[2]; - stack[0] = w->winId();; - stack[1] = winId(); - XRestackWindows( x11Display(), stack, 2 ); -} - - - -/* - The global variable qt_widget_tlw_gravity defines the window gravity of - the next top level window to be created. We do this when setting the - main widget's tqgeometry and the "-tqgeometry" command line option contains - a negative position. -*/ - -int qt_widget_tlw_gravity = NorthWestGravity; - -static void do_size_hints( TQWidget* widget, TQWExtra *x ) -{ - XSizeHints s; - s.flags = 0; - if ( x ) { - s.x = widget->x(); - s.y = widget->y(); - s.width = widget->width(); - s.height = widget->height(); - if ( x->minw > 0 || x->minh > 0 ) { // add minimum size hints - s.flags |= PMinSize; - s.min_width = x->minw; - s.min_height = x->minh; - } - if ( x->maxw < TQWIDGETSIZE_MAX || x->maxh < TQWIDGETSIZE_MAX ) { - s.flags |= PMaxSize; // add maximum size hints - s.max_width = x->maxw; - s.max_height = x->maxh; - } - if ( x->topextra && - (x->topextra->incw > 0 || x->topextra->inch > 0) ) - { // add resize increment hints - s.flags |= PResizeInc | PBaseSize; - s.width_inc = x->topextra->incw; - s.height_inc = x->topextra->inch; - s.base_width = x->topextra->basew; - s.base_height = x->topextra->baseh; - } - - if ( x->topextra && x->topextra->uspos) { - s.flags |= USPosition; - s.flags |= PPosition; - } - if ( x->topextra && x->topextra->ussize) { - s.flags |= USSize; - s.flags |= PSize; - } - } - s.flags |= PWinGravity; - s.win_gravity = qt_widget_tlw_gravity; // usually NorthWest - // reset in case it was set - qt_widget_tlw_gravity = - TQApplication::reverseLayout() ? NorthEastGravity : NorthWestGravity; - XSetWMNormalHints( widget->x11Display(), widget->winId(), &s ); -} - - -void TQWidget::internalSetGeometry( int x, int y, int w, int h, bool isMove ) -{ - Display *dpy = x11Display(); - - if ( testWFlags(WType_Desktop) ) - return; - if (isTopLevel()) { - if (!qt_net_supports(qt_net_wm_state_max_h) - && !qt_net_supports(qt_net_wm_state_max_v)) - clearWState(WState_Maximized); - if (!qt_net_supports(qt_net_wm_state_fullscreen)) - clearWState(WState_FullScreen); - topData()->normalGeometry = TQRect(0, 0, -1, -1); - } else { - // for TQWorkspace - clearWState(WState_Maximized); - clearWState(WState_FullScreen); - } - if ( extra ) { // any size restrictions? - w = TQMIN(w,extra->maxw); - h = TQMIN(h,extra->maxh); - w = TQMAX(w,extra->minw); - h = TQMAX(h,extra->minh); - } - if ( w < 1 ) // invalid size - w = 1; - if ( h < 1 ) - h = 1; - TQPoint oldPos( pos() ); - TQSize oldSize( size() ); - TQRect oldGeom( crect ); - TQRect r( x, y, w, h ); - - // We only care about stuff that changes the tqgeometry, or may - // cause the window manager to change its state - if ( !isTopLevel() && oldGeom == r ) - return; - - crect = r; - bool isResize = size() != oldSize; - - if ( isTopLevel() ) { - if ( isMove ) - topData()->uspos = 1; - if ( isResize ) - topData()->ussize = 1; - do_size_hints( this, extra ); - } - - if ( isMove ) { - if (! qt_broken_wm) - // pos() is right according to ICCCM 4.1.5 - XMoveResizeWindow( dpy, winid, pos().x(), pos().y(), w, h ); - else - // work around 4Dwm's incompliance with ICCCM 4.1.5 - XMoveResizeWindow( dpy, winid, x, y, w, h ); - } else if ( isResize ) - XResizeWindow( dpy, winid, w, h ); - - if ( isVisible() ) { - if ( isMove && pos() != oldPos ) { - if ( ! qt_broken_wm ) { - // pos() is right according to ICCCM 4.1.5 - TQMoveEvent e( pos(), oldPos ); - TQApplication::sendEvent( this, &e ); - } else { - // work around 4Dwm's incompliance with ICCCM 4.1.5 - TQMoveEvent e( crect.topLeft(), oldGeom.topLeft() ); - TQApplication::sendEvent( this, &e ); - } - } - if ( isResize ) { - - // set config pending only on resize, see qapplication_x11.cpp, translateConfigEvent() - setWState( WState_ConfigPending ); - - TQResizeEvent e( size(), oldSize ); - TQApplication::sendEvent( this, &e ); - } - } else { - if ( isMove && pos() != oldPos ) { - if ( ! qt_broken_wm ) - // pos() is right according to ICCCM 4.1.5 - TQApplication::postEvent( this, new TQMoveEvent( pos(), oldPos ) ); - else - // work around 4Dwm's incompliance with ICCCM 4.1.5 - TQApplication::postEvent( this, new TQMoveEvent( crect.topLeft(), - oldGeom.topLeft() ) ); - } - if ( isResize ) - TQApplication::postEvent( this, - new TQResizeEvent( size(), oldSize ) ); - } -} - - -/*! - \overload - - This function corresponds to setMinimumSize( TQSize(minw, minh) ). - Sets the minimum width to \a minw and the minimum height to \a - minh. -*/ - -void TQWidget::setMinimumSize( int minw, int minh ) -{ -#if defined(TQT_CHECK_RANGE) - if ( minw < 0 || minh < 0 ) - qWarning("TQWidget::setMinimumSize: The smallest allowed size is (0,0)"); -#endif - createExtra(); - if ( extra->minw == minw && extra->minh == minh ) - return; - extra->minw = minw; - extra->minh = minh; - if ( minw > width() || minh > height() ) { - bool resized = testWState( WState_Resized ); - resize( TQMAX(minw,width()), TQMAX(minh,height()) ); - if ( !resized ) - clearWState( WState_Resized ); // not a user resize - } - if ( testWFlags(WType_TopLevel) ) - do_size_hints( this, extra ); - updateGeometry(); -} - -/*! - \overload - - This function corresponds to setMaximumSize( TQSize(\a maxw, \a - maxh) ). Sets the maximum width to \a maxw and the maximum height - to \a maxh. -*/ -void TQWidget::setMaximumSize( int maxw, int maxh ) -{ -#if defined(TQT_CHECK_RANGE) - if ( maxw > TQWIDGETSIZE_MAX || maxh > TQWIDGETSIZE_MAX ) { - qWarning("TQWidget::setMaximumSize: (%s/%s) " - "The largest allowed size is (%d,%d)", - name( "unnamed" ), className(), TQWIDGETSIZE_MAX, - TQWIDGETSIZE_MAX ); - maxw = TQMIN( maxw, TQWIDGETSIZE_MAX ); - maxh = TQMIN( maxh, TQWIDGETSIZE_MAX ); - } - if ( maxw < 0 || maxh < 0 ) { - qWarning("TQWidget::setMaximumSize: (%s/%s) Negative sizes (%d,%d) " - "are not possible", - name( "unnamed" ), className(), maxw, maxh ); - maxw = TQMAX( maxw, 0 ); - maxh = TQMAX( maxh, 0 ); - } -#endif - createExtra(); - if ( extra->maxw == maxw && extra->maxh == maxh ) - return; - extra->maxw = maxw; - extra->maxh = maxh; - if ( maxw < width() || maxh < height() ) { - bool resized = testWState( WState_Resized ); - resize( TQMIN(maxw,width()), TQMIN(maxh,height()) ); - if ( !resized ) - clearWState( WState_Resized ); // not a user resize - } - if ( testWFlags(WType_TopLevel) ) - do_size_hints( this, extra ); - updateGeometry(); -} - -/*! - \overload - - Sets the x (width) size increment to \a w and the y (height) size - increment to \a h. -*/ -void TQWidget::setSizeIncrement( int w, int h ) -{ - TQTLWExtra* x = topData(); - if ( x->incw == w && x->inch == h ) - return; - x->incw = w; - x->inch = h; - if ( testWFlags(WType_TopLevel) ) - do_size_hints( this, extra ); -} - -/*! - \overload - - This corresponds to setBaseSize( TQSize(\a basew, \a baseh) ). Sets - the widgets base size to width \a basew and height \a baseh. -*/ -void TQWidget::setBaseSize( int basew, int baseh ) -{ - createTLExtra(); - TQTLWExtra* x = topData(); - if ( x->basew == basew && x->baseh == baseh ) - return; - x->basew = basew; - x->baseh = baseh; - if ( testWFlags(WType_TopLevel) ) - do_size_hints( this, extra ); -} - -/*! - \overload void TQWidget::erase() - - This version erases the entire widget. -*/ - -/*! - \overload void TQWidget::erase( const TQRect &r ) - - Erases the specified area \a r in the widget without generating a - \link paintEvent() paint event\endlink. -*/ - -/*! - Erases the specified area \a (x, y, w, h) in the widget without - generating a \link paintEvent() paint event\endlink. - - If \a w is negative, it is replaced with \c{width() - x}. If \a h - is negative, it is replaced width \c{height() - y}. - - Child widgets are not affected. - - \sa tqrepaint() -*/ - -void TQWidget::erase( int x, int y, int w, int h ) -{ - extern void qt_erase_rect( TQWidget*, const TQRect& ); // in qpainer_x11.cpp - if ( w < 0 ) - w = crect.width() - x; - if ( h < 0 ) - h = crect.height() - y; - if ( w != 0 && h != 0 ) - qt_erase_rect( this, TQRect(x, y, w, h ) ); -} - -/*! - \overload - - Erases the area defined by \a reg, without generating a \link - paintEvent() paint event\endlink. - - Child widgets are not affected. -*/ - -void TQWidget::erase( const TQRegion& reg ) -{ - extern void qt_erase_region( TQWidget*, const TQRegion& ); // in qpainer_x11.cpp - qt_erase_region( this, reg ); -} - -/*! - Scrolls the widget including its tqchildren \a dx pixels to the - right and \a dy downwards. Both \a dx and \a dy may be negative. - - After scrolling, scroll() sends a paint event for the the part - that is read but not written. For example, when scrolling 10 - pixels rightwards, the leftmost ten pixels of the widget need - repainting. The paint event may be delivered immediately or later, - depending on some heuristics (note that you might have to force - processing of paint events using TQApplication::sendPostedEvents() - when using scroll() and move() in combination). - - \sa TQScrollView erase() bitBlt() -*/ - -void TQWidget::scroll( int dx, int dy ) -{ - scroll( dx, dy, TQRect() ); -} - -/*! - \overload - - This version only scrolls \a r and does not move the tqchildren of - the widget. - - If \a r is empty or invalid, the result is undefined. - - \sa TQScrollView erase() bitBlt() -*/ -void TQWidget::scroll( int dx, int dy, const TQRect& r ) -{ - if ( testWState( WState_BlockUpdates ) && !childrenListObject() ) - return; - bool valid_rect = r.isValid(); - bool just_update = TQABS( dx ) > width() || TQABS( dy ) > height(); - if ( just_update ) - update(); - TQRect sr = valid_rect?r:clipRegion().boundingRect(); - int x1, y1, x2, y2, w=sr.width(), h=sr.height(); - if ( dx > 0 ) { - x1 = sr.x(); - x2 = x1+dx; - w -= dx; - } else { - x2 = sr.x(); - x1 = x2-dx; - w += dx; - } - if ( dy > 0 ) { - y1 = sr.y(); - y2 = y1+dy; - h -= dy; - } else { - y2 = sr.y(); - y1 = y2-dy; - h += dy; - } - - if ( dx == 0 && dy == 0 ) - return; - - Display *dpy = x11Display(); - GC gc = qt_xget_readonly_gc( x11Screen(), FALSE ); - // Want expose events - if ( w > 0 && h > 0 && !just_update ) { - XSetGraphicsExposures( dpy, gc, True ); - XCopyArea( dpy, winId(), winId(), gc, x1, y1, w, h, x2, y2); - XSetGraphicsExposures( dpy, gc, False ); - } - - if ( !valid_rect && childrenListObject() ) { // scroll tqchildren - TQPoint pd( dx, dy ); - TQObjectListIt it(*childrenListObject()); - register TQObject *object; - while ( it ) { // move all tqchildren - object = it.current(); - if ( object->isWidgetType() ) { - TQWidget *w = (TQWidget *)object; - w->move( w->pos() + pd ); - } - ++it; - } - } - - if ( just_update ) - return; - - // Don't let the server be bogged-down with tqrepaint events - bool repaint_immediately = qt_sip_count( this ) < 3; - - if ( dx ) { - int x = x2 == sr.x() ? sr.x()+w : sr.x(); - if ( repaint_immediately ) - tqrepaint( x, sr.y(), TQABS(dx), sr.height(), !testWFlags(WRepaintNoErase) ); - else - XClearArea( dpy, winid, x, sr.y(), TQABS(dx), sr.height(), True ); - } - if ( dy ) { - int y = y2 == sr.y() ? sr.y()+h : sr.y(); - if ( repaint_immediately ) - tqrepaint( sr.x(), y, sr.width(), TQABS(dy), !testWFlags(WRepaintNoErase) ); - else - XClearArea( dpy, winid, sr.x(), y, sr.width(), TQABS(dy), True ); - } - - qt_insert_sip( this, dx, dy ); // #### ignores r -} - - -/*! - \overload void TQWidget::drawText( const TQPoint &pos, const TQString& str ) - - Draws the string \a str at position \a pos. -*/ - -/*! - Draws the string \a str at position \a(x, y). - - The \a y position is the base line position of the text. The text - is drawn using the default font and the default foreground color. - - This function is provided for convenience. You will generally get - more flexible results and often higher speed by using a a \link - TQPainter painter\endlink instead. - - \sa setFont(), foregroundColor(), TQPainter::drawText() -*/ - -void TQWidget::drawText( int x, int y, const TQString &str ) -{ - if ( testWState(WState_Visible) ) { - TQPainter paint; - paint.begin( this ); - paint.drawText( x, y, str ); - paint.end(); - } -} - - -/*! - Internal implementation of the virtual TQPaintDevice::metric() - function. - - Use the TQPaintDeviceMetrics class instead. - - \a m is the metric to get. -*/ - -int TQWidget::metric( int m ) const -{ - int val; - if ( m == TQPaintDeviceMetrics::PdmWidth ) { - val = crect.width(); - } else if ( m == TQPaintDeviceMetrics::PdmHeight ) { - val = crect.height(); - } else { - Display *dpy = x11Display(); - int scr = x11Screen(); - switch ( m ) { - case TQPaintDeviceMetrics::PdmDpiX: - case TQPaintDeviceMetrics::PdmPhysicalDpiX: - val = TQPaintDevice::x11AppDpiX( scr ); - break; - case TQPaintDeviceMetrics::PdmDpiY: - case TQPaintDeviceMetrics::PdmPhysicalDpiY: - val = TQPaintDevice::x11AppDpiY( scr ); - break; - case TQPaintDeviceMetrics::PdmWidthMM: - val = (DisplayWidthMM(dpy,scr)*crect.width())/ - DisplayWidth(dpy,scr); - break; - case TQPaintDeviceMetrics::PdmHeightMM: - val = (DisplayHeightMM(dpy,scr)*crect.height())/ - DisplayHeight(dpy,scr); - break; - case TQPaintDeviceMetrics::PdmNumColors: - val = x11Cells(); - break; - case TQPaintDeviceMetrics::PdmDepth: - val = x11Depth(); - break; - default: - val = 0; -#if defined(TQT_CHECK_RANGE) - qWarning( "TQWidget::metric: Invalid metric command" ); -#endif - } - } - return val; -} - -void TQWidget::createSysExtra() -{ - extra->xDndProxy = 0; - extra->tqchildren_use_dnd = FALSE; - extra->compress_events = TRUE; -} - -void TQWidget::deleteSysExtra() -{ -} - -void TQWidget::createTLSysExtra() -{ -#if defined(TQT_NO_IM_EXTENSIONS) - // created lazily - extra->topextra->xic = 0; -#endif -#ifndef TQT_NO_XSYNC - extra->topextra->syncCounter = 0; - extra->topextra->syncRequestValue[0] = 0; - extra->topextra->syncRequestValue[1] = 0; -#endif -} - -void TQWidget::deleteTLSysExtra() -{ - // don't destroy input context here. it will be destroyed in - // TQWidget::destroy() destroyInputContext(); -} - -/* - examine the tqchildren of our parent up the tree and set the - tqchildren_use_dnd extra data appropriately... this is used to keep DND enabled - for widgets that are reparented and don't have DND enabled, BUT *DO* have - tqchildren (or tqchildren of tqchildren ...) with DND enabled... -*/ -void TQWidget::checkChildrenDnd() -{ - TQWidget *widget = this; - const TQObjectList *tqchildren; - const TQObject *object; - const TQWidget *child; - while (widget && ! widget->isDesktop()) { - // note: this isn't done for the desktop widget - - bool tqchildren_use_dnd = FALSE; - tqchildren = widget->childrenListObject(); - if ( tqchildren ) { - TQObjectListIt it(*tqchildren); - while ( (object = it.current()) ) { - ++it; - if ( object->isWidgetType() ) { - child = (const TQWidget *) object; - tqchildren_use_dnd = (tqchildren_use_dnd || - child->acceptDrops() || - (child->extra && - child->extra->tqchildren_use_dnd)); - } - } - } - - widget->createExtra(); - widget->extra->tqchildren_use_dnd = tqchildren_use_dnd; - - widget = widget->parentWidget(); - } -} - - -#ifndef TQT_NO_XSYNC -// create a window's XSyncCounter -void TQWidget::createSyncCounter() -{ - if( !qt_use_xsync || !isTopLevel() || topData()->syncCounter ) - return; - XSyncValue zero; - XSyncIntToValue( &zero, 0 ); - topData()->syncCounter = XSyncCreateCounter( x11Display(), zero ); -} - -// destroy a window's XSyncCounter -void TQWidget::destroySyncCounter() -{ - if( !qt_use_xsync || !extra || !extra->topextra - || !extra->topextra->syncCounter ) - return; - XSyncDestroyCounter( x11Display(), extra->topextra->syncCounter ); - extra->topextra->syncCounter = 0; -} - -// increment a window's XSyncCounter -void TQWidget::incrementSyncCounter() -{ - if( qt_use_xsync && topData()->syncCounter && - !(topData()->syncRequestValue[0] == 0 && - topData()->syncRequestValue[1] == 0) ) { - XSyncValue val; - XSyncIntsToValue( &val, topData()->syncRequestValue[ 0 ], topData()->syncRequestValue[ 1 ] ); - XSyncSetCounter( x11Display(), topData()->syncCounter, val ); - topData()->syncRequestValue[0] = topData()->syncRequestValue[1] = 0; - } -} - -// handle _NET_WM_SYNC_REQUEST -void TQWidget::handleSyncRequest( void* ev ) -{ - XEvent* xev = (XEvent*)ev; - topData()->syncRequestValue[ 0 ] = xev->xclient.data.l[ 2 ]; - topData()->syncRequestValue[ 1 ] = xev->xclient.data.l[ 3 ]; -} -#endif // TQT_NO_XSYNC - - -/*! - \property TQWidget::acceptDrops - \brief whether drop events are enabled for this widget - - Setting this property to TRUE announces to the system that this - widget \e may be able to accept drop events. - - If the widget is the desktop (TQWidget::isDesktop()), this may - fail if another application is using the desktop; you can call - acceptDrops() to test if this occurs. - - \warning - Do not modify this property in a Drag&Drop event handler. -*/ -bool TQWidget::acceptDrops() const -{ - return testWState( WState_DND ); -} - -void TQWidget::setAcceptDrops( bool on ) -{ - if ( testWState(WState_DND) != on ) { - if ( qt_dnd_enable( this, on ) ) { - if ( on ) - setWState( WState_DND ); - else - clearWState( WState_DND ); - } - - checkChildrenDnd(); - } -} - -/*! - \overload - - Causes only the parts of the widget which overlap \a region to be - visible. If the region includes pixels outside the rect() of the - widget, window system controls in that area may or may not be - visible, depending on the platform. - - Note that this effect can be slow if the region is particularly - complex. - - \sa setMask(), clearMask() -*/ - -void TQWidget::setMask( const TQRegion& region ) -{ - XShapeCombineRegion( x11Display(), winId(), ShapeBounding, 0, 0, - region.handle(), ShapeSet ); -} - -/*! - Causes only the pixels of the widget for which \a bitmap has a - corresponding 1 bit to be visible. Use TQt::color0 to draw - transparent regions and TQt::color1 to draw opaque regions of the - bitmap. - - If the region includes pixels outside the rect() of the widget, - window system controls in that area may or may not be visible, - depending on the platform. - - Note that this effect can be slow if the region is particularly - complex. - - See \c examples/tux for an example of masking for transparency. - - \sa setMask(), clearMask() -*/ - -void TQWidget::setMask( const TQBitmap &bitmap ) -{ - TQBitmap bm = bitmap; - if ( bm.x11Screen() != x11Screen() ) - bm.x11SetScreen( x11Screen() ); - XShapeCombineMask( x11Display(), winId(), ShapeBounding, 0, 0, - bm.handle(), ShapeSet ); -} - -/*! - Removes any mask set by setMask(). - - \sa setMask() -*/ - -void TQWidget::clearMask() -{ - XShapeCombineMask( x11Display(), winId(), ShapeBounding, 0, 0, - None, ShapeSet ); -} - -/*!\reimp - */ -void TQWidget::setName( const char *name ) -{ - TQObject::setName( name ); - if ( isTopLevel() ) { - XChangeProperty( x11Display(), winId(), - qt_window_role, XA_STRING, 8, PropModeReplace, - (unsigned char *)name, tqstrlen( name ) ); - } -} - - -/*! - \internal - - Computes the frame rectangle when needed. This is an internal function, you - should never call this. -*/ - -void TQWidget::updateFrameStrut() const -{ - TQWidget *that = (TQWidget *) this; - - if (! isVisible() || isDesktop()) { - that->fstrut_dirty = (! isVisible()); - return; - } - - Atom type_ret; - Window l = winId(), w = winId(), p, r; // target window, it's parent, root - Window *c; - int i_unused; - unsigned int nc; - unsigned char *data_ret; - unsigned long l_unused; - - while (XQueryTree(TQPaintDevice::x11AppDisplay(), w, &r, &p, &c, &nc)) { - if (c && nc > 0) - XFree(c); - - if (! p) { - qWarning("TQWidget::updateFrameStrut(): ERROR - no parent"); - return; - } - - // if the parent window is the root window, an Enlightenment virtual root or - // a NET WM virtual root window, stop here - data_ret = 0; - if (p == r || - (XGetWindowProperty(TQPaintDevice::x11AppDisplay(), p, - qt_enlightenment_desktop, 0, 1, False, XA_CARDINAL, - &type_ret, &i_unused, &l_unused, &l_unused, - &data_ret) == Success && - type_ret == XA_CARDINAL)) { - if (data_ret) - XFree(data_ret); - - break; - } else if (qt_net_supports(qt_net_virtual_roots) && qt_net_virtual_root_list) { - int i = 0; - while (qt_net_virtual_root_list[i] != 0) { - if (qt_net_virtual_root_list[i++] == p) - break; - } - } - - l = w; - w = p; - } - - // we have our window - int transx, transy; - XWindowAttributes wattr; - if (XTranslateCoordinates(TQPaintDevice::x11AppDisplay(), l, w, - 0, 0, &transx, &transy, &p) && - XGetWindowAttributes(TQPaintDevice::x11AppDisplay(), w, &wattr)) { - TQTLWExtra *top = that->topData(); - top->fleft = transx; - top->ftop = transy; - top->fright = wattr.width - crect.width() - top->fleft; - top->fbottom = wattr.height - crect.height() - top->ftop; - - // add the border_width for the window managers frame... some window managers - // do not use a border_width of zero for their frames, and if we the left and - // top strut, we ensure that pos() is absolutely correct. frameGeometry() - // will still be incorrect though... perhaps i should have foffset as well, to - // indicate the frame offset (equal to the border_width on X). - // - Brad - top->fleft += wattr.border_width; - top->fright += wattr.border_width; - top->ftop += wattr.border_width; - top->fbottom += wattr.border_width; - } - - that->fstrut_dirty = 0; -} - - -/*! - This function returns the widget holding the TQInputContext - instance for this widget. The instance is used for text input to - this widget, switching input method, etc. - - By default, this function delegates the role of returning input - context holder widget to TQApplication::locateICHolderWidget(). - - This definition enables application developer to change the - mapping of widgets to TQInputContext instance simply by overriding - TQApplication::locateICHolderWidget(). - - \sa TQApplication::locateICHolderWidget() -*/ -TQWidget *TQWidget::icHolderWidget() -{ - return tqApp->locateICHolderWidget(this); -} - - -/*! - This function returns the TQInputContext instance for this widget. - This instance is used for text input to this widget, etc. - It is simply the accessor function. -*/ -TQInputContext *TQWidget::getInputContext() -{ - TQInputContext *qic = 0; - -// #if !defined(TQT_NO_IM_EXTENSIONS) - if ( isInputMethodEnabled() ) { -#if !defined(TQT_NO_IM_EXTENSIONS) - qic = icHolderWidget()->ic; -#else -// { - // icHolderWidget is always tqtopLevelWidget - TQTLWExtra *topdata = icHolderWidget()->topData(); - qic = (TQInputContext *)topdata->xic; -#endif - } - - return qic; -} - - -/*! - This function replaces the TQInputContext instance used for text - input to this widget. The \a identifierName is the identifier name - of newly choosed input method. -*/ -void TQWidget::changeInputContext( const TQString& identifierName ) -{ - TQWidget *icWidget = icHolderWidget(); -#if !defined(TQT_NO_IM_EXTENSIONS) - TQInputContext **qicp = &icWidget->ic; -#else - TQInputContext **qicp = (TQInputContext **)&icWidget->topData()->xic; -#endif - - if( *qicp ) - delete *qicp; - // an input context that has the identifierName is generated. - TQInputContext *qic = TQInputContextFactory::create( identifierName, icWidget ); - *qicp = qic; - if ( qic ) { - TQObject::connect( qic, TQT_SIGNAL(imEventGenerated(TQObject *,TQIMEvent *)), - tqApp, TQT_SLOT(postIMEvent(TQObject *,TQIMEvent *)) ); - TQObject::connect( qic, TQT_SIGNAL(deletionRequested()), - icWidget, TQT_SLOT(destroyInputContext()) ); - } -} - - -/*! - \internal - This is an internal function, you should never call this. - - This function is called to generate an input context - according to a configuration for default input method - - When TQT_NO_IM_EXTENSIONS is not set, input context is - generated only when isInputMethodEnabled() returns TRUE. -*/ -void TQWidget::createInputContext() -{ -// #if !defined(TQT_NO_IM_EXTENSIONS) - if( !isInputMethodEnabled() || TQApplication::closingDown() ) - return; -// #endif - - TQWidget *icWidget = icHolderWidget(); -#ifndef TQT_NO_IM -#if !defined(TQT_NO_IM_EXTENSIONS) - TQInputContext **qicp = &icWidget->ic; -#else - TQInputContext **qicp = (TQInputContext **)&icWidget->topData()->xic; -#endif - - if ( ! *qicp ) { - // an input context of the default input method is generated. - TQInputContext *qic = TQInputContextFactory::create( TQApplication::defaultInputMethod(), icWidget ); - - *qicp = qic; - if ( qic ) { - TQObject::connect( qic, TQT_SIGNAL(imEventGenerated(TQObject *,TQIMEvent *)), - tqApp, TQT_SLOT(postIMEvent(TQObject *,TQIMEvent *)) ); - TQObject::connect( qic, TQT_SIGNAL(deletionRequested()), - icWidget, TQT_SLOT(destroyInputContext()) ); - } - } -#endif // TQT_NO_IM -} - - -/*! - \internal - - This slot is used to destroy the input context that belonging - to the widget itself, so icHolderWidget()->ic is not fetched. - - \sa TQInputContext::deletionRequested() -*/ -void TQWidget::destroyInputContext() -{ -#ifndef TQT_NO_IM -#if !defined(TQT_NO_IM_EXTENSIONS) - TQInputContext **qicp = ⁣ -#else - if ( ! extra || ! extra->topextra ) - return; - - TQInputContext **qicp = (TQInputContext **)&extra->topextra->xic; -#endif - - if( *qicp ) - delete *qicp; - - *qicp = 0; -#endif // TQT_NO_IM -} - - -/*! - This function is called when text widgets need to be neutral state to - execute text operations properly. See qlineedit.cpp and qtextedit.cpp as - example. - - Ordinary reset that along with changing focus to another widget, - moving the cursor, etc, is implicitly handled via - unfocusInputContext() because whether reset or not when such - situation is a responsibility of input methods. So we delegate the - responsibility to the input context via unfocusInputContext(). See - 'Preedit preservation' section of the class description of - TQInputContext for further information. - - \sa TQInputContext, unfocusInputContext(), TQInputContext::unsetFocus() -*/ -void TQWidget::resetInputContext() -{ -#ifndef TQT_NO_IM - // trigger input context creation if it hasn't happened already - createInputContext(); - - TQInputContext *qic = getInputContext(); - if( qic ) - qic->reset(); -#endif // TQT_NO_IM -} - - -/*! - \internal - This is an internal function, you should never call this. - - This function is called to focus associated input context. The - code intends to eliminate duplicate focus for the context even if - the context is shared between widgets - - \sa TQInputContext::setFocus() - */ -void TQWidget::focusInputContext() -{ -#ifndef TQT_NO_IM - TQWidget* tlw = tqtopLevelWidget(); - - if (!tlw->isPopup() || isInputMethodEnabled()) { - // trigger input context creation if it hasn't happened already - createInputContext(); - - TQInputContext *qic = getInputContext(); - if ( qic ) { - if( qic->tqfocusWidget() != this ) { - qic->setFocusWidget( this ); - qic->setFocus(); - } - } - } -#endif // TQT_NO_IM -} - - -/*! - \internal - This is an internal function, you should never call this. - - This function is called to remove focus from associated input - context. - - \sa TQInputContext::unsetFocus() - */ -void TQWidget::unfocusInputContext() -{ -#ifndef TQT_NO_IM - // trigger input context creation if it hasn't happened already - createInputContext(); - - TQInputContext *qic = getInputContext(); - if ( qic ) { - // may be caused reset() in some input methods - qic->unsetFocus(); - qic->setFocusWidget( 0 ); - } -#endif // TQT_NO_IM -} - - -/*! - This function is called to send mouse event to associated input - context by derived text widgets. A derived text widget must be - calculate \a x as character offset at the mouse cursor in the - preedit. - - \sa TQInputContext::mouseHandler() - */ -void TQWidget::sendMouseEventToInputContext( int x, TQEvent::Type type, - TQt::ButtonState button, - TQt::ButtonState state ) -{ -#ifndef TQT_NO_IM - // trigger input context creation if it hasn't happened already - createInputContext(); - - TQInputContext *qic = getInputContext(); - if ( qic ) { - // may be causing reset() in some input methods - qic->mouseHandler( x, type, button, state ); - } -#endif // TQT_NO_IM -} - - -void TQWidget::setWindowOpacity(double) -{ -} - -double TQWidget::windowOpacity() const -{ - return 1.0; -} - -#endif // USE_QT4 |