diff options
Diffstat (limited to 'tqtinterface/qt4/src/kernel/tqapplication_x11.cpp')
-rw-r--r-- | tqtinterface/qt4/src/kernel/tqapplication_x11.cpp | 9214 |
1 files changed, 0 insertions, 9214 deletions
diff --git a/tqtinterface/qt4/src/kernel/tqapplication_x11.cpp b/tqtinterface/qt4/src/kernel/tqapplication_x11.cpp deleted file mode 100644 index f4e3bad..0000000 --- a/tqtinterface/qt4/src/kernel/tqapplication_x11.cpp +++ /dev/null @@ -1,9214 +0,0 @@ -/**************************************************************************** -** -** Implementation of X11 startup routines and event handling -** -** Created : 931029 -** -** 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. -** -**********************************************************************/ - -// ### 4.0: examine TQ_EXPORT's below. The respective symbols had all -// been in use (e.g. in the KDE wm ) before the introduction of a version -// map. One might want to turn some of them into propert public API and -// provide a proper alternative for others. See also the exports in -// qapplication_win.cpp which suggest a unification. - -// ### needed for solaris-g++ in beta5 -#define TQT_CLEAN_NAMESPACE - -#include "tqplatformdefs.h" - -// POSIX Large File Support redefines open -> open64 -#if defined(open) -# undef open -#endif - -// Solaris redefines connect -> __xnet_connect with _XOPEN_SOURCE_EXTENDED. -#if defined(connect) -# undef connect -#endif - -// POSIX Large File Support redefines truncate -> truncate64 -#if defined(truncate) -# undef truncate -#endif - -#include "tqapplication.h" -#include "tqapplication_p.h" -#include "tqcolor_p.h" -#include "tqcursor.h" -#include "tqwidget.h" -#include "tqwidget_p.h" -#include "tqobjectlist.h" -#include "tqwidgetlist.h" -#include "tqwidgetintdict.h" -#include "tqbitarray.h" -#include "tqpainter.h" -#include "tqpixmapcache.h" -#include "tqdatetime.h" -#include "tqtextcodec.h" -#include "tqdatastream.h" -#include "tqbuffer.h" -#include "tqsocketnotifier.h" -#include "tqsessionmanager.h" -#include "tqvaluelist.h" -#include "tqdict.h" -#include "tqguardedptr.h" -#include "tqclipboard.h" -#include "tqwhatsthis.h" // ######## dependency -#include "tqsettings.h" -#include "tqstylefactory.h" -#include "tqfileinfo.h" - -// Input method stuff - UNFINISHED -#ifndef TQT_NO_IM -#include "tqinputcontext.h" -#endif // TQT_NO_IM -#include "tqinternal_p.h" // shared double buffer cleanup - -#if defined(TQT_THREAD_SUPPORT) -# include "tqthread.h" -#endif - -#if defined(TQT_DEBUG) && defined(TQ_OS_LINUX) -# include "tqfile.h" -#endif - -#include "tqt_x11_p.h" - -#if !defined(TQT_NO_XFTFREETYPE) -// XFree86 4.0.3 implementation is missing XftInitFtLibrary forward -extern "C" Bool XftInitFtLibrary(void); -#endif - -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <locale.h> -#include <cstdlib> - -//#define X_NOT_BROKEN -#ifdef X_NOT_BROKEN -// Some X libraries are built with setlocale #defined to _Xsetlocale, -// even though library users are then built WITHOUT such a definition. -// This creates a problem - TQt might setlocale() one value, but then -// X looks and doesn't see the value TQt set. The solution here is to -// implement _Xsetlocale just in case X calls it - redirecting it to -// the real libC version. -// -# ifndef setlocale -extern "C" char *_Xsetlocale(int category, const char *locale); -char *_Xsetlocale(int category, const char *locale) -{ - //qDebug("_Xsetlocale(%d,%s),category,locale"); - return setlocale(category,locale); -} -# endif // setlocale -#endif // X_NOT_BROKEN - - -// resolve the conflict between X11's FocusIn and TQEvent::FocusIn -const int XFocusOut = FocusOut; -const int XFocusIn = FocusIn; -#undef FocusOut -#undef FocusIn - -const int XKeyPress = KeyPress; -const int XKeyRelease = KeyRelease; -#undef KeyPress -#undef KeyRelease - - -// Fix old X libraries -#ifndef XK_KP_Home -#define XK_KP_Home 0xFF95 -#endif -#ifndef XK_KP_Left -#define XK_KP_Left 0xFF96 -#endif -#ifndef XK_KP_Up -#define XK_KP_Up 0xFF97 -#endif -#ifndef XK_KP_Right -#define XK_KP_Right 0xFF98 -#endif -#ifndef XK_KP_Down -#define XK_KP_Down 0xFF99 -#endif -#ifndef XK_KP_Prior -#define XK_KP_Prior 0xFF9A -#endif -#ifndef XK_KP_Next -#define XK_KP_Next 0xFF9B -#endif -#ifndef XK_KP_End -#define XK_KP_End 0xFF9C -#endif -#ifndef XK_KP_Insert -#define XK_KP_Insert 0xFF9E -#endif -#ifndef XK_KP_Delete -#define XK_KP_Delete 0xFF9F -#endif - -#ifdef USE_QT4 - -/***************************************************************************** - Internal variables and functions - *****************************************************************************/ -static const char *appName; // application name -static const char *appClass; // application class -static const char *appFont = 0; // application font -static const char *appBGCol = 0; // application bg color -static const char *appFGCol = 0; // application fg color -static const char *appBTNCol = 0; // application btn color -static const char *mwGeometry = 0; // main widget tqgeometry -static const char *mwTitle = 0; // main widget title -//Ming-Che 10/10 -static char *ximServer = 0; // XIM Server will connect to -static bool mwIconic = FALSE; // main widget iconified -//Ming-Che 10/10 -static bool noxim = FALSE; // connect to xim or not -// static Display *appDpy = 0; // X11 application display -static char *appDpyName = 0; // X11 display name -static bool appForeignDpy = FALSE; // we didn't create display -static bool appSync = FALSE; // X11 synchronization -#if defined(TQT_DEBUG) -static bool appNoGrab = FALSE; // X11 grabbing enabled -static bool appDoGrab = FALSE; // X11 grabbing override (gdb) -#endif -// static int appScreen; // X11 screen number -static int appScreenCount; // X11 screen count -static bool app_save_rootinfo = FALSE; // save root info -static bool app_do_modal = FALSE; // modal mode -static Window curWin = 0; // current window - -static GC* app_gc_ro = 0; // read-only GC -static GC* app_gc_tmp = 0; // temporary GC -static GC* app_gc_ro_m = 0; // read-only GC (monochrome) -static GC* app_gc_tmp_m = 0; // temporary GC (monochrome) -// symbols needed by extern TQXEmbed class -TQ_EXPORT Atom qt_wm_protocols = 0; // window manager protocols -TQ_EXPORT Atom qt_wm_delete_window = 0; // delete window protocol -TQ_EXPORT Atom qt_wm_take_focus = 0; // take focus window protocol - -Atom qt_qt_scrolldone = 0; // scroll synchronization -Atom qt_net_wm_context_help = 0; // context help -Atom qt_net_wm_ping = 0; // _NET_WM_PING protocol - -static Atom qt_xsetroot_id = 0; -Atom qt_xa_clipboard = 0; -Atom qt_selection_property = 0; -Atom qt_clipboard_sentinel = 0; -Atom qt_selection_sentinel = 0; -TQ_EXPORT Atom qt_wm_state = 0; -Atom qt_wm_change_state = 0; -static Atom qt_settings_timestamp = 0; // TQt >=3 settings timestamp -static Atom qt_input_encoding = 0; // TQt desktop properties -static Atom qt_resource_manager = 0; // X11 Resource manager -Atom qt_sizegrip = 0; // sizegrip -Atom qt_wm_client_leader = 0; -TQ_EXPORT Atom qt_window_role = 0; -TQ_EXPORT Atom qt_sm_client_id = 0; -Atom qt_xa_motif_wm_hints = 0; -Atom qt_cde_running = 0; -Atom qt_kwin_running = 0; -Atom qt_kwm_running = 0; -Atom qt_gbackground_properties = 0; -Atom qt_x_incr = 0; -Atom qt_utf8_string = 0; - -// detect broken window managers -Atom qt_sgi_desks_manager = 0; -bool qt_broken_wm = FALSE; -static void qt_detect_broken_window_manager(); - -// NET WM support -Atom qt_net_supported = 0; -Atom qt_net_wm_name = 0; -Atom qt_net_wm_icon_name = 0; -Atom qt_net_virtual_roots = 0; -Atom qt_net_workarea = 0; -Atom qt_net_wm_state = 0; -Atom qt_net_wm_state_modal = 0; -Atom qt_net_wm_state_max_v = 0; -Atom qt_net_wm_state_max_h = 0; -Atom qt_net_wm_state_fullscreen = 0; -Atom qt_net_wm_state_above = 0; -Atom qt_net_wm_window_type = 0; -Atom qt_net_wm_window_type_normal = 0; -Atom qt_net_wm_window_type_dialog = 0; -Atom qt_net_wm_window_type_toolbar = 0; -Atom qt_net_wm_window_type_menu = 0; -Atom qt_net_wm_window_type_utility = 0; -Atom qt_net_wm_window_type_splash = 0; -Atom qt_net_wm_window_type_override = 0; // KDE extension -Atom qt_net_wm_window_type_dropdown_menu = 0; -Atom qt_net_wm_window_type_popup_menu = 0; -Atom qt_net_wm_window_type_tooltip = 0; -Atom qt_net_wm_window_type_combo = 0; -Atom qt_net_wm_window_type_dnd = 0; -Atom qt_net_wm_frame_strut = 0; // KDE extension -Atom qt_net_wm_state_stays_on_top = 0; // KDE extension -Atom qt_net_wm_pid = 0; -Atom qt_net_wm_user_time = 0; -Atom qt_net_wm_full_placement = 0; // KDE extension -// Enlightenment support -Atom qt_enlightenment_desktop = 0; - -// window managers list of supported "stuff" -Atom *qt_net_supported_list = 0; -// list of virtual root windows -Window *qt_net_virtual_root_list = 0; - - -// X11 SYNC support -#ifndef TQT_NO_XSYNC -Atom qt_net_wm_sync_request_counter = 0; -Atom qt_net_wm_sync_request = 0; -#endif - -// client leader window -Window qt_x11_wm_client_leader = 0; - -// function to update the workarea of the screen - in qdesktopwidget_x11.cpp -extern void qt_desktopwidget_update_workarea(); - -// current focus model -static const int FocusModel_Unknown = -1; -static const int FocusModel_Other = 0; -static const int FocusModel_PointerRoot = 1; -static int qt_focus_model = -1; - -#ifndef TQT_NO_XRANDR -// TRUE if TQt is compiled w/ XRandR support and XRandR exists on the connected -// Display -bool qt_use_xrandr = FALSE; -static int xrandr_eventbase; -#endif - -// TRUE if TQt is compiled w/ XRender support and XRender exists on the connected -// Display -TQ_EXPORT bool qt_use_xrender = FALSE; - -#ifndef TQT_NO_XSYNC -// True if SYNC extension exists on the connected display -bool qt_use_xsync = FALSE; -static int xsync_eventbase; -static int xsync_errorbase; -#endif - -// modifier masks for alt/meta - detected when the application starts -static long qt_alt_mask = 0; -static long qt_meta_mask = 0; -// modifier mask to remove mode switch from modifiers that have alt/meta set -// this problem manifests itself on HP/UX 10.20 at least, and without it -// modifiers do not work at all... -static long qt_mode_switch_remove_mask = 0; - -// flags for extensions for special Languages, currently only for RTL languages -static bool qt_use_rtl_extensions = FALSE; -bool qt_hebrew_keyboard_hack = FALSE; - -static Window mouseActWindow = 0; // window where mouse is -static int mouseButtonPressed = 0; // last mouse button pressed -static int mouseButtonState = 0; // mouse button state -static Time mouseButtonPressTime = 0; // when was a button pressed -static short mouseXPos, mouseYPos; // mouse pres position in act window -static short mouseGlobalXPos, mouseGlobalYPos; // global mouse press position - -extern TQWidgetList *qt_modal_stack; // stack of modal widgets -static bool ignoreNextMouseReleaseEvent = FALSE; // ignore the next mouse release - // event if return from a modal - // widget - -static TQWidget *popupButtonFocus = 0; -static TQWidget *popupOfPopupButtonFocus = 0; -static bool popupCloseDownMode = FALSE; -static bool popupGrabOk; - -static bool sm_blockUserInput = FALSE; // session management - -int qt_xfocusout_grab_counter = 0; - -#if defined (TQT_TABLET_SUPPORT) -// since XInput event classes aren't created until we actually open an XInput -// tqdevice, here is a static list that we will use later on... -const int INVALID_EVENT = -1; -const int TOTAL_XINPUT_EVENTS = 7; - -XDevice *devStylus = NULL; -XDevice *devEraser = NULL; -XEventClass event_list_stylus[TOTAL_XINPUT_EVENTS]; -XEventClass event_list_eraser[TOTAL_XINPUT_EVENTS]; - -int qt_curr_events_stylus = 0; -int qt_curr_events_eraser = 0; - -// well, luckily we only need to do this once. -static int xinput_motion = INVALID_EVENT; -static int xinput_key_press = INVALID_EVENT; -static int xinput_key_release = INVALID_EVENT; -static int xinput_button_press = INVALID_EVENT; -static int xinput_button_release = INVALID_EVENT; - -// making this assumption on XFree86, since we can only use 1 tqdevice, -// the pressure for the eraser and the stylus should be the same, if they aren't -// well, they certainly have a strange pen then... -static int max_pressure; -extern bool chokeMouse; -#endif - -// last timestamp read from TQSettings -static uint appliedstamp = 0; - - -typedef int (*QX11EventFilter) (XEvent*); -QX11EventFilter qt_set_x11_event_filter(QX11EventFilter filter); - -static QX11EventFilter qt_x11_event_filter = 0; -TQ_EXPORT QX11EventFilter qt_set_x11_event_filter(QX11EventFilter filter) -{ - QX11EventFilter old_filter = qt_x11_event_filter; - qt_x11_event_filter = filter; - return old_filter; -} -static bool qt_x11EventFilter( XEvent* ev ) -{ - if ( qt_x11_event_filter && qt_x11_event_filter( ev ) ) - return TRUE; - return tqApp->x11EventFilter( ev ); -} - -#if !defined(TQT_NO_XIM) -XIM qt_xim = 0; -XIMStyle qt_xim_style = 0; -static XIMStyle xim_default_style = XIMPreeditCallbacks | XIMStatusNothing; -static XIMStyle xim_preferred_style = 0; -#endif - -static int composingKeycode=0; -static TQTextCodec * input_mapper = 0; - -extern bool qt_check_clipboard_sentinel(); //def in qclipboard_x11.cpp -extern bool qt_check_selection_sentinel(); //def in qclipboard_x11.cpp - -static void qt_save_rootinfo(); -bool qt_try_modal( TQWidget *, XEvent * ); - -int qt_ncols_option = 216; // used in qcolor_x11.cpp -int qt_visual_option = -1; -bool qt_cmap_option = FALSE; -TQWidget *qt_button_down = 0; // widget got last button-down - -extern bool qt_tryAccelEvent( TQWidget*, TQKeyEvent* ); // def in qaccel.cpp - -struct TQScrollInProgress { - static long serial; - TQScrollInProgress( TQWidget* w, int x, int y ) : - id( serial++ ), scrolled_widget( w ), dx( x ), dy( y ) {} - long id; - TQWidget* scrolled_widget; - int dx, dy; -}; -long TQScrollInProgress::serial=0; -static TQPtrList<TQScrollInProgress> *sip_list = 0; - - -// stuff in qt_xdnd.cpp -// setup -extern void qt_xdnd_setup(); -// x event handling -extern void qt_handle_xdnd_enter( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_position( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_status( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_leave( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_drop( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_finished( TQWidget *, const XEvent *, bool ); -extern void qt_xdnd_handle_selection_request( const XSelectionRequestEvent * ); -extern bool qt_xdnd_handle_badwindow(); - -extern void qt_motifdnd_handle_msg( TQWidget *, const XEvent *, bool ); -extern void qt_x11_motifdnd_init(); - -// client message atoms -extern Atom qt_xdnd_enter; -extern Atom qt_xdnd_position; -extern Atom qt_xdnd_status; -extern Atom qt_xdnd_leave; -extern Atom qt_xdnd_drop; -extern Atom qt_xdnd_finished; -// xdnd selection atom -extern Atom qt_xdnd_selection; -extern bool qt_xdnd_dragging; - -// gui or non-gui from qapplication.cpp -extern bool qt_is_gui_used; -extern bool qt_app_has_font; - -static bool qt_x11_cmdline_font = false; - - -extern bool qt_resolve_symlinks; // from qapplication.cpp - -// Paint event clipping magic -extern void qt_set_paintevent_clipping( TQPaintDevice* dev, const TQRegion& region); -extern void qt_clear_paintevent_clipping(); - - -// Palette handling -extern TQPalette *qt_std_pal; -extern void qt_create_std_palette(); - -void qt_x11_intern_atom( const char *, Atom * ); - -static TQPtrList<TQWidget>* deferred_map_list = 0; -static void qt_deferred_map_cleanup() -{ - delete deferred_map_list; - deferred_map_list = 0; -} -void qt_deferred_map_add( TQWidget* w) -{ - if ( !deferred_map_list ) { - deferred_map_list = new TQPtrList<TQWidget>; - qAddPostRoutine( qt_deferred_map_cleanup ); - } - deferred_map_list->append( w ); -} -void qt_deferred_map_take( TQWidget* w ) -{ - if (deferred_map_list ) { - deferred_map_list->remove( w ); - } -} -bool qt_deferred_map_contains( TQWidget* w ) -{ - if (!deferred_map_list) - return FALSE; - else - return deferred_map_list->contains( w ); -} - -/***************************************************************************** - Default X error handlers - *****************************************************************************/ - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -static bool x11_ignore_badwindow; -static bool x11_badwindow; - - // starts to ignore bad window errors from X -void qt_ignore_badwindow() -{ - x11_ignore_badwindow = TRUE; - x11_badwindow = FALSE; -} - - // ends ignoring bad window errors and returns whether an error - // had happen. -bool qt_badwindow() -{ - x11_ignore_badwindow = FALSE; - return x11_badwindow; -} - -static int (*original_x_errhandler)( Display *dpy, XErrorEvent * ); -static int (*original_xio_errhandler)( Display *dpy ); - -static int qt_x_errhandler( Display *dpy, XErrorEvent *err ) -{ - if ( err->error_code == BadWindow ) { - x11_badwindow = TRUE; - if ( err->request_code == 25 /* X_SendEvent */ && - qt_xdnd_handle_badwindow() ) - return 0; - if ( x11_ignore_badwindow ) - return 0; - } else if ( err->error_code == BadMatch && - err->request_code == 42 /* X_SetInputFocus */ ) { - return 0; - } - - char errstr[256]; - XGetErrorText( dpy, err->error_code, errstr, 256 ); - qWarning( "X Error: %s %d\n" - " Major opcode: %d\n" - " Minor opcode: %d\n" - " Resource id: 0x%lx", - errstr, err->error_code, - err->request_code, - err->minor_code, - err->resourceid ); - - // ### we really should distinguish between severe, non-severe and - // ### application specific errors - - return 0; -} - - -static int qt_xio_errhandler( Display * ) -{ - qWarning( "%s: Fatal IO error: client killed", appName ); - tqApp = 0; - exit( 1 ); - //### give the application a chance for a proper shutdown instead, - //### exit(1) doesn't help. - return 0; -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - - -// Memory leak: if the app exits before qt_init_internal(), this dict -// isn't released correctly. -static TQAsciiDict<Atom> *atoms_to_be_created = 0; -static bool create_atoms_now = 0; - -/***************************************************************************** - qt_x11_intern_atom() - efficiently interns an atom, now or later. - - If the application is being initialized, this function stores the - adddress of the atom and qt_init_internal will do the actual work - quickly. If the application is running, the atom is created here. - - Neither argument may point to temporary variables. - *****************************************************************************/ - -void qt_x11_intern_atom( const char *name, Atom *result) -{ - if ( !name || !result || *result ) - return; - - if ( create_atoms_now ) { - *result = XInternAtom( QX11Info::display(), name, False ); - } else { - if ( !atoms_to_be_created ) { - atoms_to_be_created = new TQAsciiDict<Atom>; - atoms_to_be_created->setAutoDelete( FALSE ); - } - atoms_to_be_created->insert( name, result ); - *result = 0; - } -} - - -static void qt_x11_process_intern_atoms() -{ - if ( atoms_to_be_created ) { -#if defined(XlibSpecificationRelease) && (XlibSpecificationRelease >= 6) - int i = atoms_to_be_created->count(); - Atom * res = (Atom *)malloc( i * sizeof( Atom ) ); - Atom ** resp = (Atom **)malloc( i * sizeof( Atom* ) ); - char ** names = (char **)malloc( i * sizeof(const char*)); - - i = 0; - TQAsciiDictIterator<Atom> it( *atoms_to_be_created ); - while( it.current() ) { - res[i] = 0; - resp[i] = it.current(); - names[i] = qstrdup(it.currentKey()); - i++; - ++it; - } - XInternAtoms( QX11Info::display(), names, i, False, res ); - while( i ) { - i--; - delete [] names[i]; - if ( res[i] && resp[i] ) - *(resp[i]) = res[i]; - } - free( res ); - free( resp ); - free( names ); -#else - TQAsciiDictIterator<Atom> it( *atoms_to_be_created ); - Atom * result; - const char * name; - while( (result = it.current()) != 0 ) { - name = it.currentKey(); - ++it; - *result = XInternAtom( QX11Info::display(), name, False ); - } -#endif - delete atoms_to_be_created; - atoms_to_be_created = 0; - create_atoms_now = TRUE; - } -} - -Display *qt_xdisplay() // get current X display -{ -// return appDpy; - return QX11Info::display(); -} - -int qt_xscreen() // get current X screen -{ - return QX11Info::appScreen(); -} - -void applyX11SpecificCommandLineArguments(QWidget *main_widget) -{ - static bool beenHereDoneThat = false; - if (beenHereDoneThat) - return; - beenHereDoneThat = true; - if (!main_widget->testAttribute(Qt::WA_WState_Created)) { - printf("[WARNING] Attempted to set uncreated main widget!\n\r"); - return; - } - Q_ASSERT(main_widget->testAttribute(Qt::WA_WState_Created)); - if (mwTitle) { - XStoreName(qt_xdisplay(), main_widget->effectiveWinId(), (char*)mwTitle); - QByteArray net_wm_name = QString::fromLocal8Bit(mwTitle).toUtf8(); - XChangeProperty(qt_xdisplay(), main_widget->effectiveWinId(), qt_net_wm_name, qt_utf8_string, 8, - PropModeReplace, (unsigned char *)net_wm_name.data(), net_wm_name.size()); - } - if (mwGeometry) { // parse geometry - int x, y; - int w, h; - int m = XParseGeometry((char*)mwGeometry, &x, &y, (uint*)&w, (uint*)&h); - QSize minSize = main_widget->minimumSize(); - QSize maxSize = main_widget->maximumSize(); - if ((m & XValue) == 0) - x = main_widget->geometry().x(); - if ((m & YValue) == 0) - y = main_widget->geometry().y(); - if ((m & WidthValue) == 0) - w = main_widget->width(); - if ((m & HeightValue) == 0) - h = main_widget->height(); - w = qMin(w,maxSize.width()); - h = qMin(h,maxSize.height()); - w = qMax(w,minSize.width()); - h = qMax(h,minSize.height()); - if ((m & XNegative)) { - x = QApplication::desktop()->width() + x - w; - } - if ((m & YNegative)) { - y = QApplication::desktop()->height() + y - h; - } - main_widget->setGeometry(x, y, w, h); - } -} - -void TQApplication::setMainWidget(QWidget *mainWidget) -{ -// #ifndef QT_NO_DEBUG -// if (mainWidget && mainWidget->parentWidget() && mainWidget->isWindow()) -// qWarning("QApplication::setMainWidget: New main widget (%s/%s) " -// "has a parent", -// mainWidget->metaObject()->className(), mainWidget->objectName().toLocal8Bit().constData()); -// #endif -// if (mainWidget) -// mainWidget->d_func()->createWinId(); -// QApplicationPrivate::main_widget = mainWidget; -// if (QApplicationPrivate::main_widget) // give WM command line -// QApplicationPrivate::applyX11SpecificCommandLineArguments(QApplicationPrivate::main_widget); - - if (mainWidget) - mainWidget->effectiveWinId(); - current_app_main_widget = mainWidget; - if (current_app_main_widget) // give WM command line - applyX11SpecificCommandLineArguments(current_app_main_widget); - - // Is this needed? - connect(mainWidget, SIGNAL(destroyed(QObject*)), this, SLOT(quit())); -} - -// ************************************************************************ -// X Input Method support -// ************************************************************************ - -#if !defined(TQT_NO_XIM) - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif // TQ_C_CALLBACKS - -#ifdef USE_X11R6_XIM - static void xim_create_callback(XIM /*im*/, - XPointer /*client_data*/, - XPointer /*call_data*/) - { - // qDebug("xim_create_callback"); - TQApplication::create_xim(); - } - - static void xim_destroy_callback(XIM /*im*/, - XPointer /*client_data*/, - XPointer /*call_data*/) - { - // qDebug("xim_destroy_callback"); - TQApplication::close_xim(); - XRegisterIMInstantiateCallback(QX11Info::display(), 0, 0, 0, - (XIMProc) xim_create_callback, 0); - } - -#endif // USE_X11R6_XIM - -#if defined(TQ_C_CALLBACKS) -} -#endif // TQ_C_CALLBACKS - -#endif // TQT_NO_XIM - -// read the _TQT_INPUT_ENCODING property and apply the settings to -// the application -static void qt_set_input_encoding() -{ - Atom type; - int format; - ulong nitems, after = 1; - const char *data; - - int e = XGetWindowProperty( QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_input_encoding, 0, 1024, - False, XA_STRING, &type, &format, &nitems, - &after, (unsigned char**)&data ); - if ( e != Success || !nitems || type == None ) { - // Always use the locale codec, since we have no examples of non-local - // XIMs, and since we cannot get a sensible answer about the encoding - // from the XIM. - input_mapper = TQTextCodec::codecForLocale(); - - } else { - if ( !qstricmp( data, "locale" ) ) - input_mapper = TQTextCodec::codecForLocale(); - else - input_mapper = TQTextCodec::codecForName( data ); - // make sure we have an input codec - if( !input_mapper ) - input_mapper = TQTextCodec::codecForName( "ISO 8859-1" ); - } - if ( input_mapper->mibEnum() == 11 ) // 8859-8 - input_mapper = TQTextCodec::codecForName( "ISO 8859-8-I"); - if( data ) - XFree( (char *)data ); -} - -bool qt_net_supports(Atom atom) -{ - if (! qt_net_supported_list) - return FALSE; - - bool supported = FALSE; - int i = 0; - while (qt_net_supported_list[i] != 0) { - if (qt_net_supported_list[i++] == atom) { - supported = TRUE; - break; - } - } - - return supported; -} - -// update the virtual roots array -void qt_get_net_virtual_roots() -{ - if (qt_net_virtual_root_list) - delete [] qt_net_virtual_root_list; - qt_net_virtual_root_list = 0; - - if (! qt_net_supports(qt_net_virtual_roots)) - return; - - Atom type; - int format; - long offset = 0; - unsigned long nitems, after; - unsigned char *data; - - int e = XGetWindowProperty(QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_net_virtual_roots, 0, 0, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - if (data) - XFree(data); - - if (e == Success && type == XA_ATOM && format == 32) { - TQBuffer ts; - ts.open(IO_WriteOnly); - - while (after > 0) { - XGetWindowProperty(QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_net_virtual_roots, offset, 1024, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - - if (type == XA_ATOM && format == 32) { - TQT_TQIODEVICE_OBJECT(ts).writeBlock((const char *) data, nitems * 4); - offset += nitems; - } else - after = 0; - if (data) - XFree(data); - } - - // compute nitems - TQByteArray buffer(TQT_TQBYTEARRAY_OBJECT(ts.buffer())); - nitems = buffer.size() / sizeof(Window); - qt_net_virtual_root_list = new Window[nitems + 1]; - Window *a = (Window *) buffer.data(); - uint i; - for (i = 0; i < nitems; i++) - qt_net_virtual_root_list[i] = a[i]; - qt_net_virtual_root_list[nitems] = 0; - } -} - -/* - Returns a truecolor visual (if there is one). 8-bit TrueColor visuals - are ignored, unless the user has explicitly requested -visual TrueColor. - The SGI X server usually has an 8 bit default visual, but the application - can also ask for a truecolor visual. This is what we do if - TQApplication::colorSpec() is TQApplication::ManyColor. -*/ - -static Visual *find_truecolor_visual( Display *dpy, int scr, int *depth, int *ncols ) -{ - XVisualInfo *vi, rvi; - int best=0, n, i; - rvi.c_class = TrueColor; - rvi.screen = scr; - vi = XGetVisualInfo( dpy, VisualClassMask | VisualScreenMask, - &rvi, &n ); - if ( vi ) { - for ( i=0; i<n; i++ ) { - if ( vi[i].depth > vi[best].depth ) - best = i; - } - } - Visual *v = DefaultVisual(dpy,scr); - if ( !vi || (vi[best].visualid == XVisualIDFromVisual(v)) || - (vi[best].depth <= 8 && qt_visual_option != TrueColor) ) - { - *depth = DefaultDepth(dpy,scr); - *ncols = DisplayCells(dpy,scr); - } else { - v = vi[best].visual; - *depth = vi[best].depth; - *ncols = vi[best].colormap_size; - } - if ( vi ) - XFree( (char *)vi ); - return v; -} - -// update the supported array -void qt_get_net_supported() -{ - Atom type; - int format; - long offset = 0; - unsigned long nitems, after; - unsigned char *data = 0; - - int e = XGetWindowProperty(QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_net_supported, 0, 0, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - if (data) - XFree(data); - - if (qt_net_supported_list) - delete [] qt_net_supported_list; - qt_net_supported_list = 0; - - if (e == Success && type == XA_ATOM && format == 32) { - TQBuffer ts; - ts.open(IO_WriteOnly); - - while (after > 0) { - XGetWindowProperty(QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_net_supported, offset, 1024, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - - if (type == XA_ATOM && format == 32) { - TQT_TQIODEVICE_OBJECT(ts).writeBlock((const char *) data, nitems * sizeof(long)); - offset += nitems; - } else - after = 0; - if (data) - XFree(data); - } - - // compute nitems - TQByteArray buffer(TQT_TQBYTEARRAY_OBJECT(ts.buffer())); - nitems = buffer.size() / sizeof(Atom); - qt_net_supported_list = new Atom[nitems + 1]; - Atom *a = (Atom *) buffer.data(); - uint i; - for (i = 0; i < nitems; i++) - qt_net_supported_list[i] = a[i]; - qt_net_supported_list[nitems] = 0; - } -} - -// set font, foreground and background from x11 resources. The -// arguments may override the resource settings. -static void qt_set_x11_resources( const char* font = 0, const char* fg = 0, - const char* bg = 0, const char* button = 0 ) -{ - if ( !qt_std_pal ) - qt_create_std_palette(); - - TQCString resFont, resFG, resBG, resEF, sysFont; - - TQApplication::setEffectEnabled( Qt::UI_General, FALSE); - TQApplication::setEffectEnabled( Qt::UI_AnimateMenu, FALSE); - TQApplication::setEffectEnabled( Qt::UI_FadeMenu, FALSE); - TQApplication::setEffectEnabled( Qt::UI_AnimateCombo, FALSE ); - TQApplication::setEffectEnabled( Qt::UI_AnimateTooltip, FALSE ); - TQApplication::setEffectEnabled( Qt::UI_FadeTooltip, FALSE ); - TQApplication::setEffectEnabled( Qt::UI_AnimateToolBox, FALSE ); - - if ( TQApplication::desktopSettingsAware() && !TQApplication::x11_apply_settings() ) { - int format; - ulong nitems, after = 1; - TQCString res; - long offset = 0; - Atom type = None; - - while (after > 0) { - uchar *data; - XGetWindowProperty( QX11Info::display(), TQPaintDevice::x11AppRootWindow( 0 ), - qt_resource_manager, - offset, 8192, False, AnyPropertyType, - &type, &format, &nitems, &after, - &data ); - res += (char*)data; - offset += 2048; // offset is in 32bit quantities... 8192/4 == 2048 - if ( data ) - XFree( (char *)data ); - } - - TQCString key, value; - int l = 0, r; - TQCString apn = appName; - TQCString apc = appClass; - int apnl = apn.length(); - int apcl = apc.length(); - int resl = res.length(); - - while (l < resl) { - r = res.find( '\n', l ); - if ( r < 0 ) - r = resl; - while ( isspace((uchar) res[l]) ) - l++; - bool mine = FALSE; - if ( res[l] == '*' && - (res[l+1] == 'f' || res[l+1] == 'b' || res[l+1] == 'g' || - res[l+1] == 'F' || res[l+1] == 'B' || res[l+1] == 'G' || - res[l+1] == 's' || res[l+1] == 'S' ) ) { - // OPTIMIZED, since we only want "*[fbgs].." - - TQCString item = res.mid( l, r - l ).simplifyWhiteSpace(); - int i = item.find( ":" ); - key = item.left( i ).stripWhiteSpace().mid(1).lower(); - value = item.right( item.length() - i - 1 ).stripWhiteSpace(); - mine = TRUE; - } else if ( res[l] == appName[0] || (appClass && res[l] == appClass[0]) ) { - if (res.mid(l,apnl) == apn && (res[l+apnl] == '.' || res[l+apnl] == '*')) { - TQCString item = res.mid( l, r - l ).simplifyWhiteSpace(); - int i = item.find( ":" ); - key = item.left( i ).stripWhiteSpace().mid(apnl+1).lower(); - value = item.right( item.length() - i - 1 ).stripWhiteSpace(); - mine = TRUE; - } else if (res.mid(l,apcl) == apc && (res[l+apcl] == '.' || res[l+apcl] == '*')) { - TQCString item = res.mid( l, r - l ).simplifyWhiteSpace(); - int i = item.find( ":" ); - key = item.left( i ).stripWhiteSpace().mid(apcl+1).lower(); - value = item.right( item.length() - i - 1 ).stripWhiteSpace(); - mine = TRUE; - } - } - - if ( mine ) { - if ( !font && key == "systemfont") - sysFont = value.left( value.findRev(':') ).copy(); - if ( !font && key == "font") - resFont = value.copy(); - else if ( !fg && key == "foreground" ) - resFG = value.copy(); - else if ( !bg && key == "background") - resBG = value.copy(); - else if ( key == "guieffects") - resEF = value.copy(); - // NOTE: if you add more, change the [fbg] stuff above - } - - l = r + 1; - } - } - if ( !sysFont.isEmpty() ) - resFont = sysFont; - if ( resFont.isEmpty() ) - resFont = font; - if ( resFG.isEmpty() ) - resFG = fg; - if ( resBG.isEmpty() ) - resBG = bg; -// // [FIXME] -// if ( (!qt_app_has_font || qt_x11_cmdline_font) && !resFont.isEmpty() ) { // set application font -// TQFont fnt; -// fnt.setRawName( resFont ); -// -// // the font we get may actually be an alias for another font, -// // so we reset the application font to the real font info. -// if ( ! fnt.exactMatch() ) { -// TQFontInfo fontinfo( fnt ); -// fnt.setFamily( fontinfo.family() ); -// fnt.setRawMode( fontinfo.rawMode() ); -// -// if ( ! fnt.rawMode() ) { -// fnt.setItalic( fontinfo.italic() ); -// fnt.setWeight( fontinfo.weight() ); -// fnt.setUnderline( fontinfo.underline() ); -// fnt.setStrikeOut( fontinfo.strikeOut() ); -// fnt.setStyleHint( fontinfo.tqstyleHint() ); -// -// if ( fnt.pointSize() <= 0 && fnt.pixelSize() <= 0 ) -// // size is all wrong... fix it -// fnt.setPointSize( (int) ( ( fontinfo.pixelSize() * 72. / -// (float) TQPaintDevice::x11AppDpiY() ) + -// 0.5 ) ); -// } -// } -// -// if ( fnt != TQApplication::font() ) { -// TQApplication::setFont( fnt, TRUE ); -// } -// } - - if ( button || !resBG.isEmpty() || !resFG.isEmpty() ) {// set app colors - TQColor btn; - TQColor bg; - TQColor fg; - if ( !resBG.isEmpty() ) - bg = TQColor(TQString(resBG)); - else - bg = qt_std_pal->active().background(); - if ( !resFG.isEmpty() ) - fg = TQColor(TQString(resFG)); - else - fg = qt_std_pal->active().foreground(); - if ( button ) - btn = TQColor( button ); - else if ( !resBG.isEmpty() ) - btn = bg; - else - btn = qt_std_pal->active().button(); - - int h,s,v; - fg.hsv(&h,&s,&v); - TQColor base = TQt::white; - bool bright_mode = FALSE; - if (v >= 255-50) { - base = btn.dark(150); - bright_mode = TRUE; - } - - TQColorGroup cg( fg, btn, btn.light(), - btn.dark(), btn.dark(150), fg, TQt::white, base, bg ); - if (bright_mode) { - cg.setColor( TQColorGroup::HighlightedText, base ); - cg.setColor( TQColorGroup::Highlight, TQt::white ); - } else { - cg.setColor( TQColorGroup::HighlightedText, TQt::white ); - cg.setColor( TQColorGroup::Highlight, TQt::darkBlue ); - } - TQColor disabled( (fg.red()+btn.red())/2, - (fg.green()+btn.green())/2, - (fg.blue()+btn.blue())/2); - TQColorGroup dcg( disabled, btn, btn.light( 125 ), btn.dark(), btn.dark(150), - disabled, TQt::white, TQt::white, bg ); - if (bright_mode) { - dcg.setColor( TQColorGroup::HighlightedText, base ); - dcg.setColor( TQColorGroup::Highlight, TQt::white ); - } else { - dcg.setColor( TQColorGroup::HighlightedText, TQt::white ); - dcg.setColor( TQColorGroup::Highlight, TQt::darkBlue ); - } - TQPalette pal( cg, dcg, cg ); - if ( pal != *qt_std_pal && pal != TQApplication::palette() ) - TQApplication::tqsetPalette( pal, TRUE ); - *qt_std_pal = pal; - } - - if ( !resEF.isEmpty() ) { - TQStringList effects = TQStringList::split(" ",resEF); - TQApplication::setEffectEnabled( Qt::UI_General, effects.contains("general") ); - TQApplication::setEffectEnabled( Qt::UI_AnimateMenu, effects.contains("animatemenu") ); - TQApplication::setEffectEnabled( Qt::UI_FadeMenu, effects.contains("fademenu") ); - TQApplication::setEffectEnabled( Qt::UI_AnimateCombo, effects.contains("animatecombo") ); - TQApplication::setEffectEnabled( Qt::UI_AnimateTooltip, effects.contains("animatetooltip") ); - TQApplication::setEffectEnabled( Qt::UI_FadeTooltip, effects.contains("fadetooltip") ); - TQApplication::setEffectEnabled( Qt::UI_AnimateToolBox, effects.contains("animatetoolbox") ); - } -} - -static void qt_detect_broken_window_manager() -{ - Atom type; - int format; - ulong nitems, after; - uchar *data = 0; - - // look for SGI's 4Dwm - int e = XGetWindowProperty(QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_sgi_desks_manager, 0, 1, False, XA_WINDOW, - &type, &format, &nitems, &after, &data); - if (data) - XFree(data); - - if (e == Success && type == XA_WINDOW && format == 32 && nitems == 1 && after == 0) { - // detected SGI 4Dwm - qt_broken_wm = TRUE; - } -} - -static GC create_gc( int scrn, bool monochrome ) -{ - GC gc; - if ( monochrome ) { - Pixmap pm = XCreatePixmap( QX11Info::display(), RootWindow( QX11Info::display(), scrn ), 8, 8, 1 ); - gc = XCreateGC( QX11Info::display(), pm, 0, 0 ); - XFreePixmap( QX11Info::display(), pm ); - } else { - if ( TQPaintDevice::x11AppDefaultVisual( scrn ) ) { - gc = XCreateGC( QX11Info::display(), RootWindow( QX11Info::display(), scrn ), 0, 0 ); - } else { - Window w; - XSetWindowAttributes a; - a.background_pixel = TQt::black.pixel( scrn ); - a.border_pixel = TQt::black.pixel( scrn ); - a.colormap = TQPaintDevice::x11AppColormap( scrn ); - w = XCreateWindow( QX11Info::display(), RootWindow( QX11Info::display(), scrn ), 0, 0, 100, 100, - 0, TQPaintDevice::x11AppDepth( scrn ), InputOutput, - (Visual*)TQPaintDevice::x11AppVisual( scrn ), - CWBackPixel|CWBorderPixel|CWColormap, &a ); - gc = XCreateGC( QX11Info::display(), w, 0, 0 ); - XDestroyWindow( QX11Info::display(), w ); - } - } - XSetGraphicsExposures( QX11Info::display(), gc, False ); - return gc; -} - -GC qt_xget_temp_gc( int scrn, bool monochrome ) // get temporary GC -{ - if ( scrn < 0 || scrn >= appScreenCount ) { - qDebug("invalid screen (tmp) %d %d", scrn, appScreenCount ); - TQWidget* bla = 0; - bla->setName("hello"); - } - GC gc; - if ( monochrome ) { - if ( !app_gc_tmp_m ) // create GC for bitmap - memset( (app_gc_tmp_m = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); - if ( !app_gc_tmp_m[scrn] ) - app_gc_tmp_m[scrn] = create_gc( scrn, TRUE ); - gc = app_gc_tmp_m[scrn]; - } else { // create standard GC - if ( !app_gc_tmp ) - memset( (app_gc_tmp = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); - if ( !app_gc_tmp[scrn] ) - app_gc_tmp[scrn] = create_gc( scrn, FALSE ); - gc = app_gc_tmp[scrn]; - } - return gc; -} - -// ### REMOVE 4.0 -WId qt_xrootwin() // get X root window -{ - return TQPaintDevice::x11AppRootWindow(); -} - -WId qt_xrootwin( int scrn ) // get X root window for screen -{ - return TQPaintDevice::x11AppRootWindow( scrn ); -} - -bool qt_try_modal( TQWidget *widget, XEvent *event ) -{ - if (qt_xdnd_dragging) { - // allow mouse events while DnD is active - switch (event->type) { - case ButtonPress: - case ButtonRelease: - case MotionNotify: - return TRUE; - default: - break; - } - } - - if ( qt_tryModalHelper( widget ) ) - return TRUE; - - bool block_event = FALSE; - switch ( event->type ) { - case ButtonPress: // disallow mouse/key events - case ButtonRelease: - case MotionNotify: - case XKeyPress: - case XKeyRelease: - case EnterNotify: - case LeaveNotify: - case ClientMessage: - block_event = TRUE; - break; - default: - break; - } - - return !block_event; -} - -/***************************************************************************** - Platform specific global and internal functions - *****************************************************************************/ - -void qt_save_rootinfo() // save new root info -{ - Atom type; - int format; - unsigned long length, after; - uchar *data; - - if ( qt_xsetroot_id ) { // kill old pixmap - if ( XGetWindowProperty( QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_xsetroot_id, 0, 1, - True, AnyPropertyType, &type, &format, - &length, &after, &data ) == Success ) { - if ( type == XA_PIXMAP && format == 32 && length == 1 && - after == 0 && data ) { - XKillClient( QX11Info::display(), *((Pixmap*)data) ); - } - Pixmap dummy = XCreatePixmap( QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - 1, 1, 1 ); - XChangeProperty( QX11Info::display(), TQPaintDevice::x11AppRootWindow(), - qt_xsetroot_id, XA_PIXMAP, 32, - PropModeReplace, (uchar *)&dummy, 1 ); - XSetCloseDownMode( QX11Info::display(), RetainPermanent ); - } - } - if ( data ) - XFree( (char *)data ); -} - -/***************************************************************************** - qt_init() - initializes TQt for X11 - *****************************************************************************/ - -#define XK_MISCELLANY -#define XK_LATIN1 -#include <X11/keysymdef.h> - -// ### This should be static but it isn't because of the friend declaration -// ### in tqpaintdevice.h which then should have a static too but can't have -// ### it because "storage class specifiers invalid in friend function -// ### declarations" :-) Ideas anyone? -void qt_init_internal( int *argcptr, char **argv, - Display *display, TQt::HANDLE visual, TQt::HANDLE colormap ) -{ - setlocale( LC_ALL, "" ); // use correct char set mapping - setlocale( LC_NUMERIC, "C" ); // make sprintf()/scanf() work - - if ( display ) { - // TQt part of other application - - appForeignDpy = TRUE; -// appDpy = display; - - // Set application name and class - appName = qstrdup( "TQt-subapplication" ); - char *app_class = 0; - if (argv) { - const char* p = strrchr( argv[0], '/' ); - app_class = qstrdup(p ? p + 1 : argv[0]); - if (app_class[0]) - app_class[0] = toupper(app_class[0]); - } - appClass = app_class; - - // Install default error handlers - original_x_errhandler = XSetErrorHandler( qt_x_errhandler ); - original_xio_errhandler = XSetIOErrorHandler( qt_xio_errhandler ); - } else { - // TQt controls everything (default) - - int argc = *argcptr; - int j; - - // Install default error handlers - original_x_errhandler = XSetErrorHandler( qt_x_errhandler ); - original_xio_errhandler = XSetIOErrorHandler( qt_xio_errhandler ); - - // Set application name and class - char *app_class = 0; - if (argv) { - const char *p = strrchr( argv[0], '/' ); - appName = p ? p + 1 : argv[0]; - app_class = qstrdup(appName); - if (app_class[0]) - app_class[0] = toupper(app_class[0]); - } - appClass = app_class; - - // Get command line params - j = argc ? 1 : 0; - for ( int i=1; i<argc; i++ ) { - if ( argv[i] && *argv[i] != '-' ) { - argv[j++] = argv[i]; - continue; - } - TQCString arg = argv[i]; - if ( arg == "-display" ) { - if ( ++i < argc ) - appDpyName = argv[i]; - } else if ( arg == "-fn" || arg == "-font" ) { - if ( ++i < argc ) { - appFont = argv[i]; - qt_x11_cmdline_font = true; - } - } else if ( arg == "-bg" || arg == "-background" ) { - if ( ++i < argc ) - appBGCol = argv[i]; - } else if ( arg == "-btn" || arg == "-button" ) { - if ( ++i < argc ) - appBTNCol = argv[i]; - } else if ( arg == "-fg" || arg == "-foreground" ) { - if ( ++i < argc ) - appFGCol = argv[i]; - } else if ( arg == "-name" ) { - if ( ++i < argc ) - appName = argv[i]; - } else if ( arg == "-title" ) { - if ( ++i < argc ) - mwTitle = argv[i]; - } else if ( arg == "-tqgeometry" ) { - if ( ++i < argc ) - mwGeometry = argv[i]; - //Ming-Che 10/10 - } else if ( arg == "-im" ) { - if ( ++i < argc ) - ximServer = argv[i]; - } else if ( arg == "-noxim" ) { - noxim=TRUE; - // - } else if ( arg == "-iconic" ) { - mwIconic = !mwIconic; - } else if ( arg == "-ncols" ) { // xv and netscape use this name - if ( ++i < argc ) - qt_ncols_option = TQMAX(0,atoi(argv[i])); - } else if ( arg == "-visual" ) { // xv and netscape use this name - if ( ++i < argc ) { - TQCString s = TQCString(argv[i]).lower(); - if ( s == "truecolor" ) { - qt_visual_option = TrueColor; - } else { - // ### Should we honor any others? - } - } -#ifndef TQT_NO_XIM - } else if ( arg == "-inputstyle" ) { - if ( ++i < argc ) { - TQCString s = TQCString(argv[i]).lower(); - if ( s == "onthespot" ) - xim_preferred_style = XIMPreeditCallbacks | - XIMStatusNothing; - else if ( s == "overthespot" ) - xim_preferred_style = XIMPreeditPosition | - XIMStatusNothing; - else if ( s == "offthespot" ) - xim_preferred_style = XIMPreeditArea | - XIMStatusArea; - else if ( s == "root" ) - xim_preferred_style = XIMPreeditNothing | - XIMStatusNothing; - } -#endif - } else if ( arg == "-cmap" ) { // xv uses this name - qt_cmap_option = TRUE; - } -#if defined(TQT_DEBUG) - else if ( arg == "-sync" ) - appSync = !appSync; - else if ( arg == "-nograb" ) - appNoGrab = !appNoGrab; - else if ( arg == "-dograb" ) - appDoGrab = !appDoGrab; -#endif - else - argv[j++] = argv[i]; - } - - *argcptr = j; - -#if defined(TQT_DEBUG) && defined(TQ_OS_LINUX) - if ( !appNoGrab && !appDoGrab ) { - TQCString s; - s.sprintf( "/proc/%d/cmdline", getppid() ); - TQFile f( s ); - if ( f.open( IO_ReadOnly ) ) { - s.truncate( 0 ); - int c; - while ( (c = TQT_TQIODEVICE_OBJECT(f).getch()) > 0 ) { - if ( c == '/' ) - s.truncate( 0 ); - else - s += (char)c; - } - if ( s == "gdb" ) { - appNoGrab = TRUE; - qDebug( "TQt: gdb: -nograb added to command-line options.\n" - "\t Use the -dograb option to enforce grabbing." ); - } - f.close(); - } - } -#endif - // Connect to X server - - if( qt_is_gui_used ) { -// if ( ( appDpy = XOpenDisplay(appDpyName) ) == 0 ) { -// qWarning( "%s: cannot connect to X server %s", appName, -// XDisplayName(appDpyName) ); -// tqApp = 0; -// exit( 1 ); -// } - - if ( appSync ) // if "-sync" argument - XSynchronize( QX11Info::display(), TRUE ); - } - } - // Common code, regardless of whether display is foreign. - - // Get X parameters - - if( qt_is_gui_used ) { -// appScreen = DefaultScreen(QX11Info::display()); - appScreenCount = ScreenCount(QX11Info::display()); - - TQPaintDevice::x_appdisplay = QX11Info::display(); - TQPaintDevice::x_appscreen = QX11Info::appScreen(); - - // allocate the arrays for the TQPaintDevice data - TQPaintDevice::x_appdepth_arr = new int[ appScreenCount ]; - TQPaintDevice::x_appcells_arr = new int[ appScreenCount ]; - TQPaintDevice::x_approotwindow_arr = new TQt::HANDLE[ appScreenCount ]; - TQPaintDevice::x_appcolormap_arr = new TQt::HANDLE[ appScreenCount ]; - TQPaintDevice::x_appdefcolormap_arr = new bool[ appScreenCount ]; - TQPaintDevice::x_appvisual_arr = new void*[ appScreenCount ]; - TQPaintDevice::x_appdefvisual_arr = new bool[ appScreenCount ]; - TQ_CHECK_PTR( TQPaintDevice::x_appdepth_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appcells_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_approotwindow_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appcolormap_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appdefcolormap_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appvisual_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appdefvisual_arr ); - - int screen; - TQString serverVendor( ServerVendor( QX11Info::display()) ); - if (serverVendor.contains("XFree86") && VendorRelease(QX11Info::display()) < 40300000) - qt_hebrew_keyboard_hack = TRUE; - - for ( screen = 0; screen < appScreenCount; ++screen ) { - TQPaintDevice::x_appdepth_arr[ screen ] = DefaultDepth(QX11Info::display(), screen); - TQPaintDevice::x_appcells_arr[ screen ] = DisplayCells(QX11Info::display(), screen); - TQPaintDevice::x_approotwindow_arr[ screen ] = RootWindow(QX11Info::display(), screen); - - // setup the visual and colormap for each screen - Visual *vis = 0; - if ( visual && screen == QX11Info::appScreen() ) { - // use the provided visual on the default screen only - vis = (Visual *) visual; - - // figure out the depth of the visual we are using - XVisualInfo *vi, rvi; - int n; - rvi.visualid = XVisualIDFromVisual(vis); - rvi.screen = screen; - vi = XGetVisualInfo( QX11Info::display(), VisualIDMask | VisualScreenMask, &rvi, &n ); - if (vi) { - TQPaintDevice::x_appdepth_arr[ screen ] = vi->depth; - TQPaintDevice::x_appcells_arr[ screen ] = vi->visual->map_entries; - TQPaintDevice::x_appvisual_arr[ screen ] = vi->visual; - TQPaintDevice::x_appdefvisual_arr[ screen ] = FALSE; - XFree(vi); - } else { - // couldn't get info about the visual, use the default instead - vis = 0; - } - } - - if (!vis) { - // use the default visual - vis = DefaultVisual(QX11Info::display(), screen); - TQPaintDevice::x_appdefvisual_arr[ screen ] = TRUE; - - if ( qt_visual_option == TrueColor || - TQApplication::colorSpec() == TQApplication::ManyColor ) { - // find custom visual - - int d, c; - vis = find_truecolor_visual( QX11Info::display(), screen, &d, &c ); - TQPaintDevice::x_appdepth_arr[ screen ] = d; - TQPaintDevice::x_appcells_arr[ screen ] = c; - - TQPaintDevice::x_appvisual_arr[ screen ] = vis; - TQPaintDevice::x_appdefvisual_arr[ screen ] = - (XVisualIDFromVisual(vis) == - XVisualIDFromVisual(DefaultVisual(QX11Info::display(), screen))); - } - - TQPaintDevice::x_appvisual_arr[ screen ] = vis; - } - - // we assume that 8bpp == pseudocolor, but this is not - // always the case (according to the X server), so we need - // to make sure that our internal data is setup in a way - // that is compatible with our assumptions - if ( vis->c_class == TrueColor && - TQPaintDevice::x_appdepth_arr[ screen ] == 8 && - TQPaintDevice::x_appcells_arr[ screen ] == 8 ) - TQPaintDevice::x_appcells_arr[ screen ] = 256; - - if ( colormap && screen == QX11Info::appScreen() ) { - // use the provided colormap for the default screen only - TQPaintDevice::x_appcolormap_arr[ screen ] = colormap; - TQPaintDevice::x_appdefcolormap_arr[ screen ] = FALSE; - } else { - if ( vis->c_class == TrueColor ) { - TQPaintDevice::x_appdefcolormap_arr[ screen ] = - TQPaintDevice::x_appdefvisual_arr[ screen ]; - } else { - TQPaintDevice::x_appdefcolormap_arr[ screen ] = - !qt_cmap_option && TQPaintDevice::x_appdefvisual_arr[ screen ]; - } - - if ( TQPaintDevice::x_appdefcolormap_arr[ screen ] ) { - // use default colormap - XStandardColormap *stdcmap; - VisualID vid = - XVisualIDFromVisual((Visual *) - TQPaintDevice::x_appvisual_arr[ screen ]); - int i, count; - - TQPaintDevice::x_appcolormap_arr[ screen ] = 0; - - if ( ! serverVendor.contains( "Hewlett-Packard" ) ) { - // on HPUX 10.20 local displays, the RGB_DEFAULT_MAP colormap - // doesn't give us correct colors. Why this happens, I have - // no clue, so we disable this for HPUX - if (XGetRGBColormaps(QX11Info::display(), - TQPaintDevice::x11AppRootWindow( screen ), - &stdcmap, &count, XA_RGB_DEFAULT_MAP)) { - i = 0; - while (i < count && - TQPaintDevice::x_appcolormap_arr[ screen ] == 0) { - if (stdcmap[i].visualid == vid) { - TQPaintDevice::x_appcolormap_arr[ screen ] = - stdcmap[i].colormap; - } - i++; - } - - XFree( (char *)stdcmap ); - } - } - - if (TQPaintDevice::x_appcolormap_arr[ screen ] == 0) { - TQPaintDevice::x_appcolormap_arr[ screen ] = - DefaultColormap(QX11Info::display(), screen); - } - } else { - // create a custom colormap - TQPaintDevice::x_appcolormap_arr[ screen ] = - XCreateColormap(QX11Info::display(), TQPaintDevice::x11AppRootWindow( screen ), - vis, AllocNone); - } - } - } - - // Set X painttqdevice parameters for the default screen - TQPaintDevice::x_appdepth = TQPaintDevice::x_appdepth_arr[ QX11Info::appScreen() ]; - TQPaintDevice::x_appcells = TQPaintDevice::x_appcells_arr[ QX11Info::appScreen() ]; - TQPaintDevice::x_approotwindow = TQPaintDevice::x_approotwindow_arr[ QX11Info::appScreen() ]; - TQPaintDevice::x_appcolormap = TQPaintDevice::x_appcolormap_arr[ QX11Info::appScreen() ]; - TQPaintDevice::x_appdefcolormap = TQPaintDevice::x_appdefcolormap_arr[ QX11Info::appScreen() ]; - TQPaintDevice::x_appvisual = TQPaintDevice::x_appvisual_arr[ QX11Info::appScreen() ]; - TQPaintDevice::x_appdefvisual = TQPaintDevice::x_appdefvisual_arr[ QX11Info::appScreen() ]; - - // Support protocols - - qt_x11_intern_atom( "WM_PROTOCOLS", &qt_wm_protocols ); - qt_x11_intern_atom( "WM_DELETE_WINDOW", &qt_wm_delete_window ); - qt_x11_intern_atom( "WM_STATE", &qt_wm_state ); - qt_x11_intern_atom( "WM_CHANGE_STATE", &qt_wm_change_state ); - qt_x11_intern_atom( "WM_TAKE_FOCUS", &qt_wm_take_focus ); - qt_x11_intern_atom( "WM_CLIENT_LEADER", &qt_wm_client_leader); - qt_x11_intern_atom( "WM_WINDOW_ROLE", &qt_window_role); - qt_x11_intern_atom( "SM_CLIENT_ID", &qt_sm_client_id); - qt_x11_intern_atom( "CLIPBOARD", &qt_xa_clipboard ); - qt_x11_intern_atom( "RESOURCE_MANAGER", &qt_resource_manager ); - qt_x11_intern_atom( "INCR", &qt_x_incr ); - qt_x11_intern_atom( "_XSETROOT_ID", &qt_xsetroot_id ); - qt_x11_intern_atom( "_TQT_SELECTION", &qt_selection_property ); - qt_x11_intern_atom( "_TQT_CLIPBOARD_SENTINEL", &qt_clipboard_sentinel ); - qt_x11_intern_atom( "_TQT_SELECTION_SENTINEL", &qt_selection_sentinel ); - qt_x11_intern_atom( "_TQT_SCROLL_DONE", &qt_qt_scrolldone ); - qt_x11_intern_atom( "_TQT_INPUT_ENCODING", &qt_input_encoding ); - qt_x11_intern_atom( "_TQT_SIZEGRIP", &qt_sizegrip ); - qt_x11_intern_atom( "_NET_WM_CONTEXT_HELP", &qt_net_wm_context_help ); - qt_x11_intern_atom( "_NET_WM_PING", &qt_net_wm_ping ); - qt_x11_intern_atom( "_MOTIF_WM_HINTS", &qt_xa_motif_wm_hints ); - qt_x11_intern_atom( "DTWM_IS_RUNNING", &qt_cde_running ); - qt_x11_intern_atom( "KWIN_RUNNING", &qt_kwin_running ); - qt_x11_intern_atom( "KWM_RUNNING", &qt_kwm_running ); - qt_x11_intern_atom( "GNOME_BACKGROUND_PROPERTIES", &qt_gbackground_properties ); - - TQString atomname("_TQT_SETTINGS_TIMESTAMP_"); - atomname += XDisplayName(appDpyName); - qt_x11_intern_atom( atomname.latin1(), &qt_settings_timestamp ); - - qt_x11_intern_atom( "_NET_SUPPORTED", &qt_net_supported ); - qt_x11_intern_atom( "_NET_VIRTUAL_ROOTS", &qt_net_virtual_roots ); - qt_x11_intern_atom( "_NET_WORKAREA", &qt_net_workarea ); - qt_x11_intern_atom( "_NET_WM_STATE", &qt_net_wm_state ); - qt_x11_intern_atom( "_NET_WM_STATE_MODAL", &qt_net_wm_state_modal ); - qt_x11_intern_atom( "_NET_WM_STATE_MAXIMIZED_VERT", &qt_net_wm_state_max_v ); - qt_x11_intern_atom( "_NET_WM_STATE_MAXIMIZED_HORZ", &qt_net_wm_state_max_h ); - qt_x11_intern_atom( "_NET_WM_STATE_FULLSCREEN", &qt_net_wm_state_fullscreen ); - qt_x11_intern_atom( "_NET_WM_STATE_ABOVE", &qt_net_wm_state_above ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE", &qt_net_wm_window_type ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_NORMAL", &qt_net_wm_window_type_normal ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_DIALOG", &qt_net_wm_window_type_dialog ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_TOOLBAR", &qt_net_wm_window_type_toolbar ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_MENU", &qt_net_wm_window_type_menu ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_UTILITY", &qt_net_wm_window_type_utility ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_SPLASH", &qt_net_wm_window_type_splash ); - qt_x11_intern_atom( "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", &qt_net_wm_window_type_override ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", &qt_net_wm_window_type_dropdown_menu ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_POPUP_MENU", &qt_net_wm_window_type_popup_menu ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_TOOLTIP", &qt_net_wm_window_type_tooltip ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_COMBO", &qt_net_wm_window_type_combo ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_DND", &qt_net_wm_window_type_dnd ); - qt_x11_intern_atom( "_KDE_NET_WM_FRAME_STRUT", &qt_net_wm_frame_strut ); - qt_x11_intern_atom( "_NET_WM_STATE_STAYS_ON_TOP", - &qt_net_wm_state_stays_on_top ); - qt_x11_intern_atom( "_NET_WM_PID", &qt_net_wm_pid ); - qt_x11_intern_atom( "_NET_WM_USER_TIME", &qt_net_wm_user_time ); - qt_x11_intern_atom( "_NET_WM_FULL_PLACEMENT", &qt_net_wm_full_placement ); - qt_x11_intern_atom( "ENLIGHTENMENT_DESKTOP", &qt_enlightenment_desktop ); - qt_x11_intern_atom( "_NET_WM_NAME", &qt_net_wm_name ); - qt_x11_intern_atom( "_NET_WM_ICON_NAME", &qt_net_wm_icon_name ); - qt_x11_intern_atom( "UTF8_STRING", &qt_utf8_string ); - qt_x11_intern_atom( "_SGI_DESKS_MANAGER", &qt_sgi_desks_manager ); - -#ifndef TQT_NO_XSYNC - qt_x11_intern_atom( "_NET_WM_SYNC_REQUEST_COUNTER", &qt_net_wm_sync_request_counter ); - qt_x11_intern_atom( "_NET_WM_SYNC_REQUEST", &qt_net_wm_sync_request ); -#endif - - qt_xdnd_setup(); - qt_x11_motifdnd_init(); - - // Finally create all atoms - qt_x11_process_intern_atoms(); - - // look for broken window managers - qt_detect_broken_window_manager(); - - // initialize NET lists - qt_get_net_supported(); - qt_get_net_virtual_roots(); - -// #ifndef TQT_NO_XRANDR -// // See if XRandR is supported on the connected display -// int xrandr_errorbase; -// TQ_UNUSED( xrandr_eventbase ); -// if ( XRRQueryExtension( QX11Info::display(), &xrandr_eventbase, &xrandr_errorbase ) ) { -// // XRandR is supported -// qt_use_xrandr = TRUE; -// } -// #endif // TQT_NO_XRANDR - -#ifndef TQT_NO_XRENDER - // See if XRender is supported on the connected display - int xrender_eventbase, xrender_errorbase; - if (XRenderQueryExtension(QX11Info::display(), &xrender_eventbase, &xrender_errorbase)) { - // XRender is supported, let's see if we have a PictFormat for the - // default visual - XRenderPictFormat *format = - XRenderFindVisualFormat(QX11Info::display(), - (Visual *) TQPaintDevice::x_appvisual); - qt_use_xrender = (format != 0) && (TQPaintDevice::x_appdepth != 8); - } -#endif // TQT_NO_XRENDER - -#ifndef TQT_NO_XSYNC - // Try to initialize SYNC extension on the connected display - int xsync_major, xsync_minor; - if ( XSyncQueryExtension( QX11Info::display(), &xsync_eventbase, &xsync_errorbase ) && - XSyncInitialize( QX11Info::display(), &xsync_major, &xsync_minor ) ) { - qt_use_xsync = TRUE; - } -#endif - -#ifndef TQT_NO_XKB - // If XKB is detected, set the GrabsUseXKBState option so input method - // compositions continue to work (ie. deadkeys) - unsigned int state = XkbPCF_GrabsUseXKBStateMask; - (void) XkbSetPerClientControls(QX11Info::display(), state, &state); -#endif - -// #if !defined(TQT_NO_XFTFREETYPE) -// // defined in qfont_x11.cpp -// extern bool qt_has_xft; -// #ifndef TQT_XFT2 -// if (!qt_use_xrender) -// qt_has_xft = FALSE; -// else -// #endif -// qt_has_xft = XftInit(0) && XftInitFtLibrary(); -// -// if (qt_has_xft) { -// char *dpi_str = XGetDefault(QX11Info::display(), "Xft", "dpi"); -// if (dpi_str) { -// // use a custom DPI -// char *end = 0; -// int dpi = strtol(dpi_str, &end, 0); -// if (dpi_str != end) { -// for (int s = 0; s < ScreenCount(QX11Info::display()); ++s) { -// TQPaintDevice::x11SetAppDpiX(dpi, s); -// TQPaintDevice::x11SetAppDpiY(dpi, s); -// } -// } -// } -// } -// #endif // TQT_NO_XFTFREETYPE - - // look at the modifier mapping, and get the correct masks for alt/meta - // find the alt/meta masks - XModifierKeymap *map = XGetModifierMapping(QX11Info::display()); - if (map) { - int i, maskIndex = 0, mapIndex = 0; - for (maskIndex = 0; maskIndex < 8; maskIndex++) { - for (i = 0; i < map->max_keypermod; i++) { - if (map->modifiermap[mapIndex]) { - KeySym sym = - XKeycodeToKeysym(QX11Info::display(), map->modifiermap[mapIndex], 0); - if ( qt_alt_mask == 0 && - ( sym == XK_Alt_L || sym == XK_Alt_R ) ) { - qt_alt_mask = 1 << maskIndex; - } - if ( qt_meta_mask == 0 && - (sym == XK_Meta_L || sym == XK_Meta_R ) ) { - qt_meta_mask = 1 << maskIndex; - } - } - mapIndex++; - } - } - - // not look for mode_switch in qt_alt_mask and qt_meta_mask - if it is - // present in one or both, then we set qt_mode_switch_remove_mask. - // see TQETWidget::translateKeyEventInternal for an explanation - // of why this is needed - mapIndex = 0; - for ( maskIndex = 0; maskIndex < 8; maskIndex++ ) { - if ( qt_alt_mask != ( 1 << maskIndex ) && - qt_meta_mask != ( 1 << maskIndex ) ) { - for ( i = 0; i < map->max_keypermod; i++ ) - mapIndex++; - continue; - } - - for ( i = 0; i < map->max_keypermod; i++ ) { - if ( map->modifiermap[ mapIndex ] ) { - KeySym sym = - XKeycodeToKeysym( QX11Info::display(), map->modifiermap[ mapIndex ], 0 ); - if ( sym == XK_Mode_switch ) { - qt_mode_switch_remove_mask |= 1 << maskIndex; - } - } - mapIndex++; - } - } - - XFreeModifiermap(map); - } else { - // assume defaults - qt_alt_mask = Mod1Mask; - qt_meta_mask = Mod4Mask; - qt_mode_switch_remove_mask = 0; - } - - // Misc. initialization - - TQColor::initialize(); - TQFont::initialize(); - TQCursor::initialize(); - TQPainter::initialize(); - } - -#if defined(TQT_THREAD_SUPPORT) - TQThread::initialize(); -#endif - - if( qt_is_gui_used ) { - TQT_TQOBJECT(tqApp)->setName( appName ); - - int screen; - for ( screen = 0; screen < appScreenCount; ++screen ) { - XSelectInput( QX11Info::display(), TQPaintDevice::x11AppRootWindow( screen ), - KeymapStateMask | EnterWindowMask | LeaveWindowMask | - PropertyChangeMask ); - -// #ifndef TQT_NO_XRANDR -// if (qt_use_xrandr) -// XRRSelectInput( QX11Info::display(), TQPaintDevice::x11AppRootWindow( screen ), True ); -// #endif // TQT_NO_XRANDR - } - } - - if ( qt_is_gui_used ) { - qt_set_input_encoding(); - - qt_set_x11_resources( appFont, appFGCol, appBGCol, appBTNCol); - - // be smart about the size of the default font. most X servers have helvetica - // 12 point available at 2 resolutions: - // 75dpi (12 pixels) and 100dpi (17 pixels). - // At 95 DPI, a 12 point font should be 16 pixels tall - in which case a 17 - // pixel font is a closer match than a 12 pixel font - int ptsz = - (int) ( ( ( TQPaintDevice::x11AppDpiY() >= 95 ? 17. : 12. ) * - 72. / (float) TQPaintDevice::x11AppDpiY() ) + 0.5 ); - - if ( !qt_app_has_font && !qt_x11_cmdline_font ) { - TQFont f( "Helvetica", ptsz ); - TQApplication::setFont( f ); - } - -#ifndef TQT_NO_XIM - if ( ! xim_preferred_style ) // no configured input style, use the default - xim_preferred_style = xim_default_style; - - qt_xim = 0; - TQString ximServerName(ximServer); - if (ximServer) - ximServerName.prepend("@im="); - else - ximServerName = ""; - - if ( !XSupportsLocale() ) - qWarning("TQt: Locales not supported on X server"); - -#ifdef USE_X11R6_XIM - else if ( XSetLocaleModifiers (ximServerName.ascii()) == 0 ) - qWarning( "TQt: Cannot set locale modifiers: %s", - ximServerName.ascii()); - else if (! noxim) - XRegisterIMInstantiateCallback(QX11Info::display(), 0, 0, 0, - (XIMProc) xim_create_callback, 0); -#else // !USE_X11R6_XIM - else if ( XSetLocaleModifiers ("") == 0 ) - qWarning("TQt: Cannot set locale modifiers"); - else if (! noxim) - TQApplication::create_xim(); -#endif // USE_X11R6_XIM -#endif // TQT_NO_XIM - -#if defined (TQT_TABLET_SUPPORT) - int ndev, - i, - j; - bool gotStylus, - gotEraser; - XDeviceInfo *tqdevices, *devs; - XInputClassInfo *ip; - XAnyClassPtr any; - XValuatorInfoPtr v; - XAxisInfoPtr a; - XDevice *dev; - XEventClass *ev_class; - int curr_event_count; - -#if !defined(TQ_OS_IRIX) - // XFree86 divides a stylus and eraser into 2 tqdevices, so we must do for both... - const TQString XFREENAMESTYLUS = "stylus"; - const TQString XFREENAMEPEN = "pen"; - const TQString XFREENAMEERASER = "eraser"; -#endif - - tqdevices = XListInputDevices( QX11Info::display(), &ndev); - if ( tqdevices == NULL ) { - qWarning( "Failed to get list of tqdevices" ); - ndev = -1; - } - dev = NULL; - for ( devs = tqdevices, i = 0; i < ndev; i++, devs++ ) { - gotEraser = FALSE; -#if defined(TQ_OS_IRIX) - - gotStylus = ( !strncmp(devs->name, - WACOM_NAME, sizeof(WACOM_NAME) - 1) ); -#else - TQString devName = devs->name; - devName = devName.lower(); - gotStylus = ( devName.startsWith(XFREENAMEPEN) - || devName.startsWith(XFREENAMESTYLUS) ); - if ( !gotStylus ) - gotEraser = devName.startsWith( XFREENAMEERASER ); - -#endif - if ( gotStylus || gotEraser ) { - // I only wanted to do this once, so wrap pointers around these - curr_event_count = 0; - - if ( gotStylus ) { - devStylus = XOpenDevice( QX11Info::display(), devs->id ); - dev = devStylus; - ev_class = event_list_stylus; - } else if ( gotEraser ) { - devEraser = XOpenDevice( QX11Info::display(), devs->id ); - dev = devEraser; - ev_class = event_list_eraser; - } - if ( dev == NULL ) { - qWarning( "Failed to open tqdevice" ); - } else { - if ( dev->num_classes > 0 ) { - for ( ip = dev->classes, j = 0; j < devs->num_classes; - ip++, j++ ) { - switch ( ip->input_class ) { - case KeyClass: - DeviceKeyPress( dev, xinput_key_press, - ev_class[curr_event_count] ); - curr_event_count++; - DeviceKeyRelease( dev, xinput_key_release, - ev_class[curr_event_count] ); - curr_event_count++; - break; - case ButtonClass: - DeviceButtonPress( dev, xinput_button_press, - ev_class[curr_event_count] ); - curr_event_count++; - DeviceButtonRelease( dev, xinput_button_release, - ev_class[curr_event_count] ); - curr_event_count++; - break; - case ValuatorClass: - // I'm only going to be interested in motion when the - // stylus is already down anyway! - DeviceMotionNotify( dev, xinput_motion, - ev_class[curr_event_count] ); - curr_event_count++; - break; - default: - break; - } - } - } - } - // get the min/max value for pressure! - any = (XAnyClassPtr) ( devs->inputclassinfo ); - if ( dev == devStylus ) { - qt_curr_events_stylus = curr_event_count; - for (j = 0; j < devs->num_classes; j++) { - if ( any->c_class == ValuatorClass ) { - v = (XValuatorInfoPtr) any; - a = (XAxisInfoPtr) ((char *) v + - sizeof (XValuatorInfo)); -#if defined (TQ_OS_IRIX) - max_pressure = a[WAC_PRESSURE_I].max_value; -#else - max_pressure = a[2].max_value; -#endif - // got the max pressure no need to go further... - break; - } - any = (XAnyClassPtr) ((char *) any + any->length); - } - } else { - qt_curr_events_eraser = curr_event_count; - } - // at this point we are assuming there is only one - // wacom tqdevice... -#if defined (TQ_OS_IRIX) - if ( devStylus != NULL ) { -#else - if ( devStylus != NULL && devEraser != NULL ) { -#endif - break; - } - } - } // end for loop - XFreeDeviceList( tqdevices ); -#endif // TQT_TABLET_SUPPORT - - } else { - // read some non-GUI settings when not using the X server... - - if ( TQApplication::desktopSettingsAware() ) { - TQSettings settings; - - // read library (ie. plugin) path list - TQString libpathkey = TQString("/qt/%1.%2/libraryPath") - .arg( TQT_VERSION >> 16 ) - .arg( (TQT_VERSION & 0xff00 ) >> 8 ); - TQStringList pathlist = - settings.readListEntry(libpathkey, ':'); - if (! pathlist.isEmpty()) { - TQStringList::ConstIterator it = pathlist.begin(); - while (it != pathlist.end()) - TQApplication::addLibraryPath(*it++); - } - - TQString defaultcodec = settings.readEntry("/qt/defaultCodec", "none"); - if (defaultcodec != "none") { - TQTextCodec *codec = TQTextCodec::codecForName(defaultcodec); - if (codec) - tqApp->setDefaultCodec(codec); - } - - qt_resolve_symlinks = - settings.readBoolEntry("/qt/resolveSymlinks", TRUE); - } - } - } - -void qt_init( int *argcptr, char **argv, TQApplication::Type ) -{ - qt_init_internal( argcptr, argv, 0, 0, 0 ); -} - -void qt_init( Display *display, TQt::HANDLE visual, TQt::HANDLE colormap ) -{ - qt_init_internal( 0, 0, display, visual, colormap ); -} - -/***************************************************************************** - qt_cleanup() - cleans up when the application is finished - *****************************************************************************/ - -void qt_cleanup() -{ - appliedstamp = 0; - - if ( app_save_rootinfo ) // root window must keep state - qt_save_rootinfo(); - - if ( qt_is_gui_used ) { - TQPixmapCache::clear(); - TQPainter::cleanup(); - TQCursor::cleanup(); - TQFont::cleanup(); - TQColor::cleanup(); - TQSharedDoubleBuffer::cleanup(); - } -#if defined(TQT_THREAD_SUPPORT) - TQThread::cleanup(); -#endif - -#if defined (TQT_TABLET_SUPPORT) - if ( devStylus != NULL ) - XCloseDevice( QX11Info::display(), devStylus ); - if ( devEraser != NULL ) - XCloseDevice( QX11Info::display(), devEraser ); -#endif - -#if !defined(TQT_NO_XIM) - if ( qt_xim ) - TQApplication::close_xim(); -#endif - - if ( qt_is_gui_used ) { - int screen; - for ( screen = 0; screen < appScreenCount; screen++ ) { - if ( ! TQPaintDevice::x11AppDefaultColormap( screen ) ) - XFreeColormap( TQPaintDevice::x11AppDisplay(), - TQPaintDevice::x11AppColormap( screen ) ); - } - } - -#define TQT_CLEANUP_GC(g) if (g) { for (int i=0;i<appScreenCount;i++){if(g[i])XFreeGC(QX11Info::display(),g[i]);} delete [] g; g = 0; } - TQT_CLEANUP_GC(app_gc_ro); - TQT_CLEANUP_GC(app_gc_ro_m); - TQT_CLEANUP_GC(app_gc_tmp); - TQT_CLEANUP_GC(app_gc_tmp_m); -#undef TQT_CLEANUP_GC - - delete sip_list; - sip_list = 0; - - // Reset the error handlers - XSetErrorHandler( original_x_errhandler ); - XSetIOErrorHandler( original_xio_errhandler ); - - if ( qt_is_gui_used && !appForeignDpy ) - XCloseDisplay( QX11Info::display() ); // close X display -// appDpy = 0; - - qt_x11_wm_client_leader = 0; - - if ( TQPaintDevice::x_appdepth_arr ) - delete [] TQPaintDevice::x_appdepth_arr; - if ( TQPaintDevice::x_appcells_arr ) - delete [] TQPaintDevice::x_appcells_arr; - if ( TQPaintDevice::x_appcolormap_arr ) - delete []TQPaintDevice::x_appcolormap_arr; - if ( TQPaintDevice::x_appdefcolormap_arr ) - delete [] TQPaintDevice::x_appdefcolormap_arr; - if ( TQPaintDevice::x_appvisual_arr ) - delete [] TQPaintDevice::x_appvisual_arr; - if ( TQPaintDevice::x_appdefvisual_arr ) - delete [] TQPaintDevice::x_appdefvisual_arr; - - if ( appForeignDpy ) { - delete [] (char *)appName; - appName = 0; - delete [] (char *)appClass; - appClass = 0; - } - - if (qt_net_supported_list) - delete [] qt_net_supported_list; - qt_net_supported_list = 0; - - if (qt_net_virtual_root_list) - delete [] qt_net_virtual_root_list; - qt_net_virtual_root_list = 0; -} - -const char *tqAppName() // get application name -{ - return appName; -} - -const char *tqAppClass() // get application class -{ - return appClass; -} - -// /***************************************************************************** -// Session management support -// *****************************************************************************/ -// -// #ifndef TQT_NO_SM_SUPPORT -// -// #include <X11/SM/SMlib.h> -// -// class TQSessionManagerData -// { -// public: -// TQSessionManagerData( TQSessionManager* mgr, TQString& id, TQString& key ) -// : sm( mgr ), sessionId( id ), sessionKey( key ) {} -// TQSessionManager* sm; -// TQStringList restartCommand; -// TQStringList discardCommand; -// TQString& sessionId; -// TQString& sessionKey; -// TQSessionManager::RestartHint restartHint; -// }; -// -// class TQSmSocketReceiver : public TQObject -// { -// Q_OBJECT -// TQ_OBJECT -// public: -// TQSmSocketReceiver( int socket ) -// : TQObject(0,0) -// { -// TQSocketNotifier* sn = new TQSocketNotifier( socket, TQSocketNotifier::Read, this ); -// connect( sn, TQT_SIGNAL( activated(int) ), this, TQT_SLOT( socketActivated(int) ) ); -// } -// -// public Q_SLOTS: -// void socketActivated(int); -// }; -// -// -// static SmcConn smcConnection = 0; -// static bool sm_interactionActive; -// static bool sm_smActive; -// static int sm_interactStyle; -// static int sm_saveType; -// static bool sm_cancel; -// // static bool sm_waitingForPhase2; ### never used?!? -// static bool sm_waitingForInteraction; -// static bool sm_isshutdown; -// // static bool sm_shouldbefast; ### never used?!? -// static bool sm_phase2; -// static bool sm_in_phase2; -// -// static TQSmSocketReceiver* sm_receiver = 0; -// -// static void resetSmState(); -// static void sm_setProperty( const char* name, const char* type, -// int num_vals, SmPropValue* vals); -// static void sm_saveYourselfCallback( SmcConn smcConn, SmPointer clientData, -// int saveType, Bool shutdown , int interactStyle, Bool fast); -// static void sm_saveYourselfPhase2Callback( SmcConn smcConn, SmPointer clientData ) ; -// static void sm_dieCallback( SmcConn smcConn, SmPointer clientData ) ; -// static void sm_shutdownCancelledCallback( SmcConn smcConn, SmPointer clientData ); -// static void sm_saveCompleteCallback( SmcConn smcConn, SmPointer clientData ); -// static void sm_interactCallback( SmcConn smcConn, SmPointer clientData ); -// static void sm_performSaveYourself( TQSessionManagerData* ); -// -// static void resetSmState() -// { -// // sm_waitingForPhase2 = FALSE; ### never used?!? -// sm_waitingForInteraction = FALSE; -// sm_interactionActive = FALSE; -// sm_interactStyle = SmInteractStyleNone; -// sm_smActive = FALSE; -// sm_blockUserInput = FALSE; -// sm_isshutdown = FALSE; -// // sm_shouldbefast = FALSE; ### never used?!? -// sm_phase2 = FALSE; -// sm_in_phase2 = FALSE; -// } -// -// -// // theoretically it's possible to set several properties at once. For -// // simplicity, however, we do just one property at a time -// static void sm_setProperty( const char* name, const char* type, -// int num_vals, SmPropValue* vals) -// { -// if (num_vals ) { -// SmProp prop; -// prop.name = (char*)name; -// prop.type = (char*)type; -// prop.num_vals = num_vals; -// prop.vals = vals; -// -// SmProp* props[1]; -// props[0] = ∝ -// SmcSetProperties( smcConnection, 1, props ); -// } -// else { -// char* names[1]; -// names[0] = (char*) name; -// SmcDeleteProperties( smcConnection, 1, names ); -// } -// } -// -// static void sm_setProperty( const TQString& name, const TQString& value) -// { -// SmPropValue prop; -// prop.length = value.length(); -// prop.value = (SmPointer) value.latin1(); -// sm_setProperty( name.latin1(), SmARRAY8, 1, &prop ); -// } -// -// static void sm_setProperty( const TQString& name, const TQStringList& value) -// { -// SmPropValue *prop = new SmPropValue[ value.count() ]; -// int count = 0; -// for ( TQStringList::ConstIterator it = value.begin(); it != value.end(); ++it ) { -// prop[ count ].length = (*it).length(); -// prop[ count ].value = (char*)(*it).latin1(); -// ++count; -// } -// sm_setProperty( name.latin1(), SmLISTofARRAY8, count, prop ); -// delete [] prop; -// } -// -// -// // workaround for broken libsm, see below -// struct TQT_smcConn { -// unsigned int save_yourself_in_progress : 1; -// unsigned int shutdown_in_progress : 1; -// }; -// -// static void sm_saveYourselfCallback( SmcConn smcConn, SmPointer clientData, -// int saveType, Bool shutdown , int interactStyle, Bool /*fast*/) -// { -// if (smcConn != smcConnection ) -// return; -// sm_cancel = FALSE; -// sm_smActive = TRUE; -// sm_isshutdown = shutdown; -// sm_saveType = saveType; -// sm_interactStyle = interactStyle; -// // sm_shouldbefast = fast; ### never used?!? -// -// // ugly workaround for broken libSM. libSM should do that _before_ -// // actually invoking the callback in sm_process.c -// ( (TQT_smcConn*)smcConn )->save_yourself_in_progress = TRUE; -// if ( sm_isshutdown ) -// ( (TQT_smcConn*)smcConn )->shutdown_in_progress = TRUE; -// -// sm_performSaveYourself( (TQSessionManagerData*) clientData ); -// if ( !sm_isshutdown ) // we cannot expect a confirmation message in that case -// resetSmState(); -// } -// -// static void sm_performSaveYourself( TQSessionManagerData* smd ) -// { -// if ( sm_isshutdown ) -// sm_blockUserInput = TRUE; -// -// TQSessionManager* sm = smd->sm; -// -// // generate a new session key -// timeval tv; -// gettimeofday( &tv, 0 ); -// smd->sessionKey = TQString::number( tv.tv_sec ) + "_" + TQString::number(tv.tv_usec); -// -// // tell the session manager about our program in best POSIX style -// sm_setProperty( SmProgram, TQString( tqApp->argv()[0] ) ); -// // tell the session manager about our user as well. -// struct passwd* entry = getpwuid( geteuid() ); -// if ( entry ) -// sm_setProperty( SmUserID, TQString::tqfromLatin1( entry->pw_name ) ); -// -// // generate a restart and discard command that makes sense -// TQStringList restart; -// restart << tqApp->argv()[0] << "-session" << smd->sessionId + "_" + smd->sessionKey; -// if (qstricmp(tqAppName(), tqAppClass()) != 0) -// restart << "-name" << tqAppName(); -// sm->setRestartCommand( restart ); -// TQStringList discard; -// sm->setDiscardCommand( discard ); -// -// switch ( sm_saveType ) { -// case SmSaveBoth: -// tqApp->commitData( *sm ); -// if ( sm_isshutdown && sm_cancel) -// break; // we cancelled the shutdown, no need to save state -// // fall through -// case SmSaveLocal: -// tqApp->saveState( *sm ); -// break; -// case SmSaveGlobal: -// tqApp->commitData( *sm ); -// break; -// default: -// break; -// } -// -// if ( sm_phase2 && !sm_in_phase2 ) { -// SmcRequestSaveYourselfPhase2( smcConnection, sm_saveYourselfPhase2Callback, (SmPointer*) smd ); -// sm_blockUserInput = FALSE; -// } -// else { -// // close eventual interaction monitors and cancel the -// // shutdown, if required. Note that we can only cancel when -// // performing a shutdown, it does not work for checkpoints -// if ( sm_interactionActive ) { -// SmcInteractDone( smcConnection, sm_isshutdown && sm_cancel); -// sm_interactionActive = FALSE; -// } -// else if ( sm_cancel && sm_isshutdown ) { -// if ( sm->allowsErrorInteraction() ) { -// SmcInteractDone( smcConnection, True ); -// sm_interactionActive = FALSE; -// } -// } -// -// // set restart and discard command in session manager -// sm_setProperty( SmRestartCommand, sm->restartCommand() ); -// sm_setProperty( SmDiscardCommand, sm->discardCommand() ); -// -// // set the restart hint -// SmPropValue prop; -// prop.length = sizeof( int ); -// int value = sm->restartHint(); -// prop.value = (SmPointer) &value; -// sm_setProperty( SmRestartStyleHint, SmCARD8, 1, &prop ); -// -// // we are done -// SmcSaveYourselfDone( smcConnection, !sm_cancel ); -// } -// } -// -// static void sm_dieCallback( SmcConn smcConn, SmPointer /* clientData */) -// { -// if (smcConn != smcConnection ) -// return; -// resetSmState(); -// TQEvent quitEvent(TQEvent::Quit); -// TQApplication::sendEvent(tqApp, &quitEvent); -// } -// -// static void sm_shutdownCancelledCallback( SmcConn smcConn, SmPointer /* clientData */) -// { -// if (smcConn != smcConnection ) -// return; -// if ( sm_waitingForInteraction ) -// tqApp->exit_loop(); -// resetSmState(); -// } -// -// static void sm_saveCompleteCallback( SmcConn smcConn, SmPointer /*clientData */) -// { -// if (smcConn != smcConnection ) -// return; -// resetSmState(); -// } -// -// static void sm_interactCallback( SmcConn smcConn, SmPointer /* clientData */ ) -// { -// if (smcConn != smcConnection ) -// return; -// if ( sm_waitingForInteraction ) -// tqApp->exit_loop(); -// } -// -// static void sm_saveYourselfPhase2Callback( SmcConn smcConn, SmPointer clientData ) -// { -// if (smcConn != smcConnection ) -// return; -// sm_in_phase2 = TRUE; -// sm_performSaveYourself( (TQSessionManagerData*) clientData ); -// } -// -// -// void TQSmSocketReceiver::socketActivated(int) -// { -// IceProcessMessages( SmcGetIceConnection( smcConnection ), 0, 0); -// } -// -// -// #undef Bool -// #include "tqapplication_x11.tqmoc" -// -// TQSessionManager::TQSessionManager( TQApplication * app, TQString &id, TQString& key ) -// : TQObject( app, "session manager" ) -// { -// d = new TQSessionManagerData( this, id, key ); -// d->restartHint = RestartIfRunning; -// -// resetSmState(); -// char cerror[256]; -// char* myId = 0; -// char* prevId = (char*)id.latin1(); // we know what we are doing -// -// SmcCallbacks cb; -// cb.save_yourself.callback = sm_saveYourselfCallback; -// cb.save_yourself.client_data = (SmPointer) d; -// cb.die.callback = sm_dieCallback; -// cb.die.client_data = (SmPointer) d; -// cb.save_complete.callback = sm_saveCompleteCallback; -// cb.save_complete.client_data = (SmPointer) d; -// cb.shutdown_cancelled.callback = sm_shutdownCancelledCallback; -// cb.shutdown_cancelled.client_data = (SmPointer) d; -// -// // avoid showing a warning message below -// const char* session_manager = getenv("SESSION_MANAGER"); -// if ( !session_manager || !session_manager[0] ) -// return; -// -// smcConnection = SmcOpenConnection( 0, 0, 1, 0, -// SmcSaveYourselfProcMask | -// SmcDieProcMask | -// SmcSaveCompleteProcMask | -// SmcShutdownCancelledProcMask, -// &cb, -// prevId, -// &myId, -// 256, cerror ); -// -// id = TQString::tqfromLatin1( myId ); -// ::free( myId ); // it was allocated by C -// -// TQString error = cerror; -// if (!smcConnection ) { -// qWarning("Session management error: %s", error.latin1() ); -// } -// else { -// sm_receiver = new TQSmSocketReceiver( IceConnectionNumber( SmcGetIceConnection( smcConnection ) ) ); -// } -// } -// -// TQSessionManager::~TQSessionManager() -// { -// if ( smcConnection ) -// SmcCloseConnection( smcConnection, 0, 0 ); -// smcConnection = 0; -// delete sm_receiver; -// delete d; -// } -// -// TQString TQSessionManager::sessionId() const -// { -// return d->sessionId; -// } -// -// TQString TQSessionManager::sessionKey() const -// { -// return d->sessionKey; -// } -// -// -// void* TQSessionManager::handle() const -// { -// return (void*) smcConnection; -// } -// -// -// bool TQSessionManager::allowsInteraction() -// { -// if ( sm_interactionActive ) -// return TRUE; -// -// if ( sm_waitingForInteraction ) -// return FALSE; -// -// if ( sm_interactStyle == SmInteractStyleAny ) { -// sm_waitingForInteraction = SmcInteractRequest( smcConnection, SmDialogNormal, -// sm_interactCallback, (SmPointer*) this ); -// } -// if ( sm_waitingForInteraction ) { -// tqApp->enter_loop(); -// sm_waitingForInteraction = FALSE; -// if ( sm_smActive ) { // not cancelled -// sm_interactionActive = TRUE; -// sm_blockUserInput = FALSE; -// return TRUE; -// } -// } -// return FALSE; -// } -// -// bool TQSessionManager::allowsErrorInteraction() -// { -// if ( sm_interactionActive ) -// return TRUE; -// -// if ( sm_waitingForInteraction ) -// return FALSE; -// -// if ( sm_interactStyle == SmInteractStyleAny || sm_interactStyle == SmInteractStyleErrors ) { -// sm_waitingForInteraction = SmcInteractRequest( smcConnection, SmDialogError, -// sm_interactCallback, (SmPointer*) this ); -// } -// if ( sm_waitingForInteraction ) { -// tqApp->enter_loop(); -// sm_waitingForInteraction = FALSE; -// if ( sm_smActive ) { // not cancelled -// sm_interactionActive = TRUE; -// sm_blockUserInput = FALSE; -// return TRUE; -// } -// } -// return FALSE; -// } -// -// void TQSessionManager::release() -// { -// if ( sm_interactionActive ) { -// SmcInteractDone( smcConnection, False ); -// sm_interactionActive = FALSE; -// if ( sm_smActive && sm_isshutdown ) -// sm_blockUserInput = TRUE; -// } -// } -// -// void TQSessionManager::cancel() -// { -// sm_cancel = TRUE; -// } -// -// void TQSessionManager::setRestartHint( TQSessionManager::RestartHint hint) -// { -// d->restartHint = hint; -// } -// -// TQSessionManager::RestartHint TQSessionManager::restartHint() const -// { -// return d->restartHint; -// } -// -// void TQSessionManager::setRestartCommand( const TQStringList& command) -// { -// d->restartCommand = command; -// } -// -// TQStringList TQSessionManager::restartCommand() const -// { -// return d->restartCommand; -// } -// -// void TQSessionManager::setDiscardCommand( const TQStringList& command) -// { -// d->discardCommand = command; -// } -// -// TQStringList TQSessionManager::discardCommand() const -// { -// return d->discardCommand; -// } -// -// void TQSessionManager::setManagerProperty( const TQString& name, const TQString& value) -// { -// SmPropValue prop; -// prop.length = value.length(); -// prop.value = (SmPointer) value.utf8().data(); -// sm_setProperty( name.latin1(), SmARRAY8, 1, &prop ); -// } -// -// void TQSessionManager::setManagerProperty( const TQString& name, const TQStringList& value) -// { -// SmPropValue *prop = new SmPropValue[ value.count() ]; -// int count = 0; -// for ( TQStringList::ConstIterator it = value.begin(); it != value.end(); ++it ) { -// prop[ count ].length = (*it).length(); -// prop[ count ].value = (char*)(*it).utf8().data(); -// ++count; -// } -// sm_setProperty( name.latin1(), SmLISTofARRAY8, count, prop ); -// delete [] prop; -// } -// -// bool TQSessionManager::isPhase2() const -// { -// return sm_in_phase2; -// } -// -// void TQSessionManager::requestPhase2() -// { -// sm_phase2 = TRUE; -// } -// -// #endif // TQT_NO_SM_SUPPORT - -void qt_enter_modal( TQWidget *widget ) -{ - if ( !qt_modal_stack ) { // create modal stack - qt_modal_stack = new TQWidgetList; - TQ_CHECK_PTR( qt_modal_stack ); - } - if (widget->parentWidget()) { - TQEvent e(TQEvent::WindowBlocked); - TQApplication::sendEvent(widget->parentWidget(), &e); - } - - qt_dispatchEnterLeave( 0, TQWidget::find((WId)curWin) ); - qt_modal_stack->insert( 0, widget ); - app_do_modal = TRUE; - curWin = 0; - ignoreNextMouseReleaseEvent = FALSE; -} - - -void qt_leave_modal( TQWidget *widget ) -{ - if ( qt_modal_stack && qt_modal_stack->removeRef(widget) ) { - if ( qt_modal_stack->isEmpty() ) { - delete qt_modal_stack; - qt_modal_stack = 0; - TQPoint p( TQCursor::pos() ); - TQWidget* w = TQApplication::widgetAt( p.x(), p.y(), TRUE ); - qt_dispatchEnterLeave( w, TQWidget::find( curWin ) ); // send synthetic enter event - curWin = w? w->winId() : 0; - } - } - app_do_modal = qt_modal_stack != 0; - ignoreNextMouseReleaseEvent = TRUE; - - if (widget->parentWidget()) { - TQEvent e(TQEvent::WindowUnblocked); - TQApplication::sendEvent(widget->parentWidget(), &e); - } -} - -int qt_x11_translateButtonState( int s ) -{ - int bst = 0; - if ( s & Button1Mask ) - bst |= Qt::LeftButton; - if ( s & Button2Mask ) - bst |= Qt::MidButton; - if ( s & Button3Mask ) - bst |= Qt::RightButton; - if ( s & ShiftMask ) - bst |= TQt::ShiftButton; - if ( s & ControlMask ) - bst |= TQt::ControlButton; - if ( s & qt_alt_mask ) - bst |= TQt::AltButton; - if ( s & qt_meta_mask ) - bst |= TQt::MetaButton; - return bst; -} - -#else // USE_QT4 - -/***************************************************************************** - Internal variables and functions - *****************************************************************************/ -static const char *appName; // application name -static const char *appClass; // application class -static const char *appFont = 0; // application font -static const char *appBGCol = 0; // application bg color -static const char *appFGCol = 0; // application fg color -static const char *appBTNCol = 0; // application btn color -static const char *mwGeometry = 0; // main widget tqgeometry -static const char *mwTitle = 0; // main widget title -//Ming-Che 10/10 -char *qt_ximServer = 0; // XIM Server will connect to -static bool mwIconic = FALSE; // main widget iconified -//Ming-Che 10/10 -static Display *appDpy = 0; // X11 application display -static char *appDpyName = 0; // X11 display name -static bool appForeignDpy = FALSE; // we didn't create display -static bool appSync = FALSE; // X11 synchronization -#if defined(TQT_DEBUG) -static bool appNoGrab = FALSE; // X11 grabbing enabled -static bool appDoGrab = FALSE; // X11 grabbing override (gdb) -#endif -static int appScreen; // X11 screen number -static int appScreenCount; // X11 screen count -static bool app_save_rootinfo = FALSE; // save root info -static bool app_do_modal = FALSE; // modal mode -static Window curWin = 0; // current window - -static GC* app_gc_ro = 0; // read-only GC -static GC* app_gc_tmp = 0; // temporary GC -static GC* app_gc_ro_m = 0; // read-only GC (monochrome) -static GC* app_gc_tmp_m = 0; // temporary GC (monochrome) -// symbols needed by extern TQXEmbed class -TQ_EXPORT Atom qt_wm_protocols = 0; // window manager protocols -TQ_EXPORT Atom qt_wm_delete_window = 0; // delete window protocol -TQ_EXPORT Atom qt_wm_take_focus = 0; // take focus window protocol - -Atom qt_qt_scrolldone = 0; // scroll synchronization -Atom qt_net_wm_context_help = 0; // context help -Atom qt_net_wm_ping = 0; // _NET_WM_PING protocol - -static Atom qt_xsetroot_id = 0; -Atom qt_xa_clipboard = 0; -Atom qt_selection_property = 0; -Atom qt_clipboard_sentinel = 0; -Atom qt_selection_sentinel = 0; -TQ_EXPORT Atom qt_wm_state = 0; -Atom qt_wm_change_state = 0; -static Atom qt_settings_timestamp = 0; // TQt >=3 settings timestamp -static Atom qt_input_encoding = 0; // TQt desktop properties -static Atom qt_resource_manager = 0; // X11 Resource manager -Atom qt_sizegrip = 0; // sizegrip -Atom qt_wm_client_leader = 0; -TQ_EXPORT Atom qt_window_role = 0; -TQ_EXPORT Atom qt_sm_client_id = 0; -Atom qt_xa_motif_wm_hints = 0; -Atom qt_cde_running = 0; -Atom qt_kwin_running = 0; -Atom qt_kwm_running = 0; -Atom qt_gbackground_properties = 0; -Atom qt_x_incr = 0; -Atom qt_utf8_string = 0; - -// detect broken window managers -Atom qt_sgi_desks_manager = 0; -bool qt_broken_wm = FALSE; -static void qt_detect_broken_window_manager(); - -// NET WM support -Atom qt_net_supported = 0; -Atom qt_net_wm_name = 0; -Atom qt_net_wm_icon_name = 0; -Atom qt_net_virtual_roots = 0; -Atom qt_net_workarea = 0; -Atom qt_net_wm_state = 0; -Atom qt_net_wm_state_modal = 0; -Atom qt_net_wm_state_max_v = 0; -Atom qt_net_wm_state_max_h = 0; -Atom qt_net_wm_state_fullscreen = 0; -Atom qt_net_wm_state_above = 0; -Atom qt_net_wm_window_type = 0; -Atom qt_net_wm_window_type_normal = 0; -Atom qt_net_wm_window_type_dialog = 0; -Atom qt_net_wm_window_type_toolbar = 0; -Atom qt_net_wm_window_type_menu = 0; -Atom qt_net_wm_window_type_utility = 0; -Atom qt_net_wm_window_type_splash = 0; -Atom qt_net_wm_window_type_override = 0; // KDE extension -Atom qt_net_wm_frame_strut = 0; // KDE extension -Atom qt_net_wm_state_stays_on_top = 0; // KDE extension -Atom qt_net_wm_pid = 0; -Atom qt_net_wm_user_time = 0; -// Enlightenment support -Atom qt_enlightenment_desktop = 0; - -// window managers list of supported "stuff" -Atom *qt_net_supported_list = 0; -// list of virtual root windows -Window *qt_net_virtual_root_list = 0; - - - -// client leader window -Window qt_x11_wm_client_leader = 0; - -// function to update the workarea of the screen - in qdesktopwidget_x11.cpp -extern void qt_desktopwidget_update_workarea(); - -// current focus model -static const int FocusModel_Unknown = -1; -static const int FocusModel_Other = 0; -static const int FocusModel_PointerRoot = 1; -static int qt_focus_model = -1; - -#ifndef TQT_NO_XRANDR -// TRUE if TQt is compiled w/ XRandR support and XRandR exists on the connected -// Display -bool qt_use_xrandr = FALSE; -static int xrandr_eventbase; -#endif - -// TRUE if TQt is compiled w/ XRender support and XRender exists on the connected -// Display -TQ_EXPORT bool qt_use_xrender = FALSE; - -// modifier masks for alt/meta - detected when the application starts -static long qt_alt_mask = 0; -static long qt_meta_mask = 0; -// modifier mask to remove mode switch from modifiers that have alt/meta set -// this problem manifests itself on HP/UX 10.20 at least, and without it -// modifiers do not work at all... -static long qt_mode_switch_remove_mask = 0; - -// flags for extensions for special Languages, currently only for RTL languages -static bool qt_use_rtl_extensions = FALSE; -bool qt_hebrew_keyboard_hack = FALSE; - -static Window mouseActWindow = 0; // window where mouse is -static int mouseButtonPressed = 0; // last mouse button pressed -static int mouseButtonState = 0; // mouse button state -static Time mouseButtonPressTime = 0; // when was a button pressed -static short mouseXPos, mouseYPos; // mouse pres position in act window -static short mouseGlobalXPos, mouseGlobalYPos; // global mouse press position - -extern TQWidgetList *qt_modal_stack; // stack of modal widgets -static bool ignoreNextMouseReleaseEvent = FALSE; // ignore the next mouse release - // event if return from a modal - // widget - -static TQWidget *popupButtonFocus = 0; -static TQWidget *popupOfPopupButtonFocus = 0; -static bool popupCloseDownMode = FALSE; -static bool popupGrabOk; - -static bool sm_blockUserInput = FALSE; // session management - -int qt_xfocusout_grab_counter = 0; - -#if defined (TQT_TABLET_SUPPORT) -// since XInput event classes aren't created until we actually open an XInput -// tqdevice, here is a static list that we will use later on... -const int INVALID_EVENT = -1; -const int TOTAL_XINPUT_EVENTS = 7; - -XDevice *devStylus = NULL; -XDevice *devEraser = NULL; -XEventClass event_list_stylus[TOTAL_XINPUT_EVENTS]; -XEventClass event_list_eraser[TOTAL_XINPUT_EVENTS]; - -int qt_curr_events_stylus = 0; -int qt_curr_events_eraser = 0; - -// well, luckily we only need to do this once. -static int xinput_motion = INVALID_EVENT; -static int xinput_key_press = INVALID_EVENT; -static int xinput_key_release = INVALID_EVENT; -static int xinput_button_press = INVALID_EVENT; -static int xinput_button_release = INVALID_EVENT; - -// making this assumption on XFree86, since we can only use 1 tqdevice, -// the pressure for the eraser and the stylus should be the same, if they aren't -// well, they certainly have a strange pen then... -static int max_pressure; -extern bool chokeMouse; -#endif - -// last timestamp read from TQSettings -static uint appliedstamp = 0; - - -typedef int (*QX11EventFilter) (XEvent*); -QX11EventFilter qt_set_x11_event_filter(QX11EventFilter filter); - -static QX11EventFilter qt_x11_event_filter = 0; -TQ_EXPORT QX11EventFilter qt_set_x11_event_filter(QX11EventFilter filter) -{ - QX11EventFilter old_filter = qt_x11_event_filter; - qt_x11_event_filter = filter; - return old_filter; -} -static bool qt_x11EventFilter( XEvent* ev ) -{ - if ( qt_x11_event_filter && qt_x11_event_filter( ev ) ) - return TRUE; - return tqApp->x11EventFilter( ev ); -} - - - - - -#if !defined(TQT_NO_XIM) -//XIM qt_xim = 0; -XIMStyle qt_xim_style = 0; -XIMStyle qt_xim_preferred_style = 0; -static XIMStyle xim_default_style = XIMPreeditCallbacks | XIMStatusNothing; -#endif - -int qt_ximComposingKeycode=0; -TQTextCodec * qt_input_mapper = 0; - -extern bool qt_check_clipboard_sentinel(); //def in qclipboard_x11.cpp -extern bool qt_check_selection_sentinel(); //def in qclipboard_x11.cpp - -static void qt_save_rootinfo(); -bool qt_try_modal( TQWidget *, XEvent * ); - -int qt_ncols_option = 216; // used in qcolor_x11.cpp -int qt_visual_option = -1; -bool qt_cmap_option = FALSE; -TQWidget *qt_button_down = 0; // widget got last button-down - -extern bool qt_tryAccelEvent( TQWidget*, TQKeyEvent* ); // def in qaccel.cpp - -struct TQScrollInProgress { - static long serial; - TQScrollInProgress( TQWidget* w, int x, int y ) : - id( serial++ ), scrolled_widget( w ), dx( x ), dy( y ) {} - long id; - TQWidget* scrolled_widget; - int dx, dy; -}; -long TQScrollInProgress::serial=0; -static TQPtrList<TQScrollInProgress> *sip_list = 0; - - -// stuff in qt_xdnd.cpp -// setup -extern void qt_xdnd_setup(); -// x event handling -extern void qt_handle_xdnd_enter( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_position( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_status( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_leave( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_drop( TQWidget *, const XEvent *, bool ); -extern void qt_handle_xdnd_finished( TQWidget *, const XEvent *, bool ); -extern void qt_xdnd_handle_selection_request( const XSelectionRequestEvent * ); -extern bool qt_xdnd_handle_badwindow(); - -extern void qt_motifdnd_handle_msg( TQWidget *, const XEvent *, bool ); -extern void qt_x11_motifdnd_init(); - -// client message atoms -extern Atom qt_xdnd_enter; -extern Atom qt_xdnd_position; -extern Atom qt_xdnd_status; -extern Atom qt_xdnd_leave; -extern Atom qt_xdnd_drop; -extern Atom qt_xdnd_finished; -// xdnd selection atom -extern Atom qt_xdnd_selection; -extern bool qt_xdnd_dragging; - -// gui or non-gui from qapplication.cpp -extern bool qt_is_gui_used; -extern bool qt_app_has_font; - -static bool qt_x11_cmdline_font = false; - - -extern bool qt_resolve_symlinks; // from qapplication.cpp - -// Paint event clipping magic -extern void qt_set_paintevent_clipping( TQPaintDevice* dev, const TQRegion& region); -extern void qt_clear_paintevent_clipping(); - - -// Palette handling -extern TQPalette *qt_std_pal; -extern void qt_create_std_palette(); - -void qt_x11_intern_atom( const char *, Atom * ); - -static TQPtrList<TQWidget>* deferred_map_list = 0; -static void qt_deferred_map_cleanup() -{ - delete deferred_map_list; - deferred_map_list = 0; -} -void qt_deferred_map_add( TQWidget* w) -{ - if ( !deferred_map_list ) { - deferred_map_list = new TQPtrList<TQWidget>; - qAddPostRoutine( qt_deferred_map_cleanup ); - } - deferred_map_list->append( w ); -} -void qt_deferred_map_take( TQWidget* w ) -{ - if (deferred_map_list ) { - deferred_map_list->remove( w ); - } -} -bool qt_deferred_map_contains( TQWidget* w ) -{ - if (!deferred_map_list) - return FALSE; - else - return deferred_map_list->contains( w ); -} - - -class TQETWidget : public TQWidget // event translator widget -{ -public: - void setWState( WFlags f ) { TQWidget::setWState(f); } - void clearWState( WFlags f ) { TQWidget::clearWState(f); } - void setWFlags( WFlags f ) { TQWidget::setWFlags(f); } - void clearWFlags( WFlags f ) { TQWidget::clearWFlags(f); } - bool translateMouseEvent( const XEvent * ); - bool translateKeyEventInternal( const XEvent *, int& count, TQString& text, int& state, char& ascii, int &code, TQEvent::Type &type, bool willRepeat=FALSE, bool statefulTranslation=TRUE ); - bool translateKeyEvent( const XEvent *, bool grab ); - bool translatePaintEvent( const XEvent * ); - bool translateConfigEvent( const XEvent * ); - bool translateCloseEvent( const XEvent * ); - bool translateScrollDoneEvent( const XEvent * ); - bool translateWheelEvent( int global_x, int global_y, int delta, int state, Orientation orient ); -#if defined (TQT_TABLET_SUPPORT) - bool translateXinputEvent( const XEvent* ); -#endif - bool translatePropertyEvent(const XEvent *); -}; - - - - -// ************************************************************************ -// Input Method support -// ************************************************************************ - -/*! - An identifier name of the default input method. -*/ -TQString TQApplication::defaultIM = "imsw-multi"; - - -/*! - This function handles the query about location of the widget - holding the TQInputContext instance for widget \a w. - - The input context is used for text input to widget \a w. By - default, it returns the top-level widget of \a w. - - If you want to change the mapping of widget \w to TQInputContext - instance, reimplement both this function and - TQApplication::icHolderWidgets(). For example, suppose a tabbed web - browser. The browser should allocate a input context per tab - widget because users may switch the tabs and input a new text - during previous input contexts live. - - See also 'Sharing input context between text widgets' and 'Preedit - preservation' section of the class description of TQInputContext. - - \sa TQInputContext, icHolderWidgets() -*/ -TQWidget *TQApplication::locateICHolderWidget( TQWidget *w ) -{ - return w->tqtopLevelWidget(); -} - - -/*! - This function returns all widgets holding TQInputContext. - - By default, This function returns top-level widgets. So if you - want to change the mapping of a widget to TQInputContext instance, - you must override this function and locateICHolderWidget(). - - \sa locateICHolderWidget() -*/ -TQWidgetList *TQApplication::icHolderWidgets() -{ - return TQApplication::tqtopLevelWidgets(); -} - - -/*! - This function replaces all TQInputContext instances in the - application. The function's argument is the identifier name of - the newly selected input method. -*/ -void TQApplication::changeAllInputContext( const TQString &identifierName ) -{ - TQWidgetList *list = tqApp->icHolderWidgets(); - TQWidgetListIt it(*list); - while(it.current()) { - it.current()->changeInputContext( identifierName ); - ++it; - } - delete list; - - // defaultIM = identifierName ; // Change of defaultIM -- default input method -- may be enabled. -} - - -/*! - \internal - This is an internal function, you should never call this. - - \sa TQInputContext::imEventGenerated() -*/ -void TQApplication::postIMEvent( TQObject *receiver, TQIMEvent *event ) -{ - if ( event->type() == TQEvent::IMCompose ) { - // enable event compression to reduce preedit flicker on fast - // typing - postEvent( receiver, event ); - } else { - // cancel queued preedit update - if ( event->type() == TQEvent::IMEnd ) - removePostedEvents( receiver, TQEvent::IMCompose ); - - // to avoid event receiving order inversion between TQKeyEvent - // and TQIMEvent, we must send IMStart and IMEnd via - // sendEvent(). - sendEvent( receiver, event ); - delete event; - } -} - - -/*! - This function returns the identifier name of the default input - method in this Application. The value is identical to the value of - TQApplication::defaultIM. -*/ -TQString TQApplication::defaultInputMethod() -{ - return TQApplication::defaultIM; -} - - -#if !defined(TQT_NO_IM_EXTENSIONS) -/*! \internal - Creates the application input method. -*/ -void TQApplication::create_im() -{ -#ifndef TQT_NO_XIM - if ( ! qt_xim_preferred_style ) // no configured input style, use the default - qt_xim_preferred_style = xim_default_style; -#endif // TQT_NO_XIM -} - - -/*! \internal - Closes the application input method. -*/ -void TQApplication::close_im() -{ - TQWidgetList *list = tqApp->icHolderWidgets(); - TQWidgetListIt it(*list); - while(it.current()) { - it.current()->destroyInputContext(); - ++it; - } - delete list; -} - -#else - -/*! \internal - Creates the application input method. -*/ -void TQApplication::create_xim() -{ -#ifndef TQT_NO_XIM - if ( ! qt_xim_preferred_style ) // no configured input style, use the default - qt_xim_preferred_style = xim_default_style; -#endif // TQT_NO_XIM - - TQWidgetList *list= tqApp->tqtopLevelWidgets(); - TQWidgetListIt it(*list); - TQWidget * w; - while( (w=it.current()) != 0 ) { - ++it; - w->createTLSysExtra(); - } - delete list; -} - - - /*! \internal - Closes the application input method. - */ -void TQApplication::close_xim() -{ -#ifndef TQT_NO_XIM - // Calling XCloseIM gives a Purify FMR error - // XCloseIM( qt_xim ); - // We prefer a less serious memory leak - - // if ( qt_xim ) - // qt_xim = 0; - -#endif // TQT_NO_XIM - TQWidgetList *list = tqApp->tqtopLevelWidgets(); - TQWidgetListIt it(*list); - while(it.current()) { - it.current()->destroyInputContext(); - ++it; - } - delete list; -} -#endif - -/***************************************************************************** - Default X error handlers - *****************************************************************************/ - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -static bool x11_ignore_badwindow; -static bool x11_badwindow; - - // starts to ignore bad window errors from X -void qt_ignore_badwindow() -{ - x11_ignore_badwindow = TRUE; - x11_badwindow = FALSE; -} - - // ends ignoring bad window errors and returns whether an error - // had happen. -bool qt_badwindow() -{ - x11_ignore_badwindow = FALSE; - return x11_badwindow; -} - -static int (*original_x_errhandler)( Display *dpy, XErrorEvent * ); -static int (*original_xio_errhandler)( Display *dpy ); - -static int qt_x_errhandler( Display *dpy, XErrorEvent *err ) -{ - if ( err->error_code == BadWindow ) { - x11_badwindow = TRUE; - if ( err->request_code == 25 /* X_SendEvent */ && - qt_xdnd_handle_badwindow() ) - return 0; - if ( x11_ignore_badwindow ) - return 0; - } else if ( err->error_code == BadMatch && - err->request_code == 42 /* X_SetInputFocus */ ) { - return 0; - } - - char errstr[256]; - XGetErrorText( dpy, err->error_code, errstr, 256 ); - qWarning( "X Error: %s %d\n" - " Major opcode: %d\n" - " Minor opcode: %d\n" - " Resource id: 0x%lx", - errstr, err->error_code, - err->request_code, - err->minor_code, - err->resourceid ); - - // ### we really should distinguish between severe, non-severe and - // ### application specific errors - - return 0; -} - - -static int qt_xio_errhandler( Display * ) -{ - qWarning( "%s: Fatal IO error: client killed", appName ); - tqApp = 0; - exit( 1 ); - //### give the application a chance for a proper shutdown instead, - //### exit(1) doesn't help. - return 0; -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - - -// Memory leak: if the app exits before qt_init_internal(), this dict -// isn't released correctly. -static TQAsciiDict<Atom> *atoms_to_be_created = 0; -static bool create_atoms_now = 0; - -/***************************************************************************** - qt_x11_intern_atom() - efficiently interns an atom, now or later. - - If the application is being initialized, this function stores the - adddress of the atom and qt_init_internal will do the actual work - quickly. If the application is running, the atom is created here. - - Neither argument may point to temporary variables. - *****************************************************************************/ - -void qt_x11_intern_atom( const char *name, Atom *result) -{ - if ( !name || !result || *result ) - return; - - if ( create_atoms_now ) { - *result = XInternAtom( appDpy, name, False ); - } else { - if ( !atoms_to_be_created ) { - atoms_to_be_created = new TQAsciiDict<Atom>; - atoms_to_be_created->setAutoDelete( FALSE ); - } - atoms_to_be_created->insert( name, result ); - *result = 0; - } -} - - -static void qt_x11_process_intern_atoms() -{ - if ( atoms_to_be_created ) { -#if defined(XlibSpecificationRelease) && (XlibSpecificationRelease >= 6) - int i = atoms_to_be_created->count(); - Atom * res = (Atom *)malloc( i * sizeof( Atom ) ); - Atom ** resp = (Atom **)malloc( i * sizeof( Atom* ) ); - char ** names = (char **)malloc( i * sizeof(const char*)); - - i = 0; - TQAsciiDictIterator<Atom> it( *atoms_to_be_created ); - while( it.current() ) { - res[i] = 0; - resp[i] = it.current(); - names[i] = qstrdup(it.currentKey()); - i++; - ++it; - } - XInternAtoms( appDpy, names, i, False, res ); - while( i ) { - i--; - delete [] names[i]; - if ( res[i] && resp[i] ) - *(resp[i]) = res[i]; - } - free( res ); - free( resp ); - free( names ); -#else - TQAsciiDictIterator<Atom> it( *atoms_to_be_created ); - Atom * result; - const char * name; - while( (result = it.current()) != 0 ) { - name = it.currentKey(); - ++it; - *result = XInternAtom( appDpy, name, False ); - } -#endif - delete atoms_to_be_created; - atoms_to_be_created = 0; - create_atoms_now = TRUE; - } -} - - -/*! \internal - apply the settings to the application -*/ -bool TQApplication::x11_apply_settings() -{ - if (! qt_std_pal) - qt_create_std_palette(); - - Atom type; - int format; - long offset = 0; - unsigned long nitems, after = 1; - unsigned char *data = 0; - TQDateTime timestamp, settingsstamp; - bool update_timestamp = FALSE; - - if (XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow( 0 ), - qt_settings_timestamp, 0, 0, - False, AnyPropertyType, &type, &format, &nitems, - &after, &data) == Success && format == 8) { - if (data) - XFree(data); - - TQBuffer ts; - ts.open(IO_WriteOnly); - - while (after > 0) { - XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow( 0 ), - qt_settings_timestamp, - offset, 1024, False, AnyPropertyType, - &type, &format, &nitems, &after, &data); - if (format == 8) { - ts.writeBlock((const char *) data, nitems); - offset += nitems / 4; - } - - XFree(data); - } - - TQDataStream d(ts.buffer(), IO_ReadOnly); - d >> timestamp; - } - - TQSettings settings; - settingsstamp = settings.lastModificationTime( "/qt/font" ); - if (! settingsstamp.isValid()) - return FALSE; - - if ( appliedstamp && appliedstamp == settingsstamp.toTime_t() ) - return TRUE; - appliedstamp = settingsstamp.toTime_t(); - - if (! timestamp.isValid() || settingsstamp > timestamp) - update_timestamp = TRUE; - - /* - TQt settings. This is now they are written into the datastream. - - /qt/Palette/ * - TQPalette - /qt/font - TQFont - /qt/libraryPath - TQStringList - /qt/style - TQString - /qt/doubleClickInterval - int - /qt/cursorFlashTime - int - /qt/wheelScrollLines - int - /qt/colorSpec - TQString - /qt/defaultCodec - TQString - /qt/globalStrut - TQSize - /qt/GUIEffects - TQStringList - /qt/Font Substitutions/ * - TQStringList - /qt/Font Substitutions/... - TQStringList - */ - - TQString str; - TQStringList strlist; - int i, num; - TQPalette pal(TQApplication::palette()); - strlist = settings.readListEntry("/qt/Palette/active"); - if (strlist.count() == TQColorGroup::NColorRoles) { - for (i = 0; i < TQColorGroup::NColorRoles; i++) - pal.setColor(TQPalette::Active, (TQColorGroup::ColorRole) i, - TQColor(strlist[i])); - } - strlist = settings.readListEntry("/qt/Palette/inactive"); - if (strlist.count() == TQColorGroup::NColorRoles) { - for (i = 0; i < TQColorGroup::NColorRoles; i++) - pal.setColor(TQPalette::Inactive, (TQColorGroup::ColorRole) i, - TQColor(strlist[i])); - } - strlist = settings.readListEntry("/qt/Palette/disabled"); - if (strlist.count() == TQColorGroup::NColorRoles) { - for (i = 0; i < TQColorGroup::NColorRoles; i++) - pal.setColor(TQPalette::Disabled, (TQColorGroup::ColorRole) i, - TQColor(strlist[i])); - } - - // workaround for KDE 3.0, which messes up the buttonText value of - // the disabled palette in TQSettings - if ( pal.disabled().buttonText() == pal.active().buttonText() ) { - pal.setColor( TQPalette::Disabled, TQColorGroup::ButtonText, - pal.disabled().foreground() ); - } - - if (pal != *qt_std_pal && pal != TQApplication::palette()) { - TQApplication::setPalette(pal, TRUE); - *qt_std_pal = pal; - } - - TQFont font(TQApplication::font()); - if ( !qt_app_has_font && !qt_x11_cmdline_font ) { - // read new font - str = settings.readEntry("/qt/font"); - if (! str.isNull() && ! str.isEmpty()) { - font.fromString(str); - - if (font != TQApplication::font()) - TQApplication::setFont(font, TRUE); - } - } - - // read library (ie. plugin) path list - TQString libpathkey = - TQString("/qt/%1.%2/libraryPath").arg( TQT_VERSION >> 16 ).arg( (TQT_VERSION & 0xff00 ) >> 8 ); - TQStringList pathlist = settings.readListEntry(libpathkey, ':'); - if (! pathlist.isEmpty()) { - TQStringList::ConstIterator it = pathlist.begin(); - while (it != pathlist.end()) - TQApplication::addLibraryPath(*it++); - } - - // read new TQStyle - extern bool qt_explicit_app_style; // defined in qapplication.cpp - TQString stylename = settings.readEntry( "/qt/style" ); - if ( !stylename.isEmpty() && !qt_explicit_app_style ) { - TQApplication::setStyle( stylename ); - // took the style from the user settings, so mark the explicit flag FALSE - qt_explicit_app_style = FALSE; - } - - num = - settings.readNumEntry("/qt/doubleClickInterval", - TQApplication::doubleClickInterval()); - TQApplication::setDoubleClickInterval(num); - - num = - settings.readNumEntry("/qt/cursorFlashTime", - TQApplication::cursorFlashTime()); - TQApplication::setCursorFlashTime(num); - - num = - settings.readNumEntry("/qt/wheelScrollLines", - TQApplication::wheelScrollLines()); - TQApplication::setWheelScrollLines(num); - - TQString colorspec = settings.readEntry("/qt/colorSpec", "default"); - if (colorspec == "normal") - TQApplication::setColorSpec(TQApplication::NormalColor); - else if (colorspec == "custom") - TQApplication::setColorSpec(TQApplication::CustomColor); - else if (colorspec == "many") - TQApplication::setColorSpec(TQApplication::ManyColor); - else if (colorspec != "default") - colorspec = "default"; - - TQString defaultcodec = settings.readEntry("/qt/defaultCodec", "none"); - if (defaultcodec != "none") { - TQTextCodec *codec = TQTextCodec::codecForName(defaultcodec); - if (codec) - tqApp->setDefaultCodec(codec); - } - - TQStringList strut = settings.readListEntry("/qt/globalStrut"); - if (! strut.isEmpty()) { - if (strut.count() == 2) { - TQSize sz(strut[0].toUInt(), strut[1].toUInt()); - - if (sz.isValid()) - TQApplication::setGlobalStrut(sz); - } - } - - TQStringList effects = settings.readListEntry("/qt/GUIEffects"); - - TQApplication::setEffectEnabled( TQt::UI_General, effects.contains("general") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateMenu, effects.contains("animatemenu") ); - TQApplication::setEffectEnabled( TQt::UI_FadeMenu, effects.contains("fademenu") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateCombo, effects.contains("animatecombo") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateTooltip, effects.contains("animatetooltip") ); - TQApplication::setEffectEnabled( TQt::UI_FadeTooltip, effects.contains("fadetooltip") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateToolBox, effects.contains("animatetoolbox") ); - - TQStringList fontsubs = - settings.entryList("/qt/Font Substitutions"); - if (!fontsubs.isEmpty()) { - TQStringList subs; - TQString fam, skey; - TQStringList::Iterator it = fontsubs.begin(); - while (it != fontsubs.end()) { - fam = (*it++); - skey = "/qt/Font Substitutions/" + fam; - subs = settings.readListEntry(skey); - TQFont::insertSubstitutions(fam, subs); - } - } - - qt_broken_wm = - settings.readBoolEntry("/qt/brokenWindowManager", qt_broken_wm); - - qt_resolve_symlinks = - settings.readBoolEntry("/qt/resolveSymlinks", TRUE); - - qt_use_rtl_extensions = - settings.readBoolEntry("/qt/useRtlExtensions", FALSE); - -#ifndef TQT_NO_XIM - if (qt_xim_preferred_style == 0) { - TQString ximInputStyle = - settings.readEntry( "/qt/XIMInputStyle", - TQObject::trUtf8( "On The Spot" ) ).lower(); - if ( ximInputStyle == "on the spot" ) - qt_xim_preferred_style = XIMPreeditCallbacks | XIMStatusNothing; - else if ( ximInputStyle == "over the spot" ) - qt_xim_preferred_style = XIMPreeditPosition | XIMStatusNothing; - else if ( ximInputStyle == "off the spot" ) - qt_xim_preferred_style = XIMPreeditArea | XIMStatusArea; - else if ( ximInputStyle == "root" ) - qt_xim_preferred_style = XIMPreeditNothing | XIMStatusNothing; - } -#endif - -#ifndef TQT_NO_IM - /* - The identifier name of an input method is acquired from the - configuration file as a default. If a environment variable - "TQT_IM_SWITCHER" is not empty it will overwrite the - configuration file. The "imsw-multi" becomes the default if the entry - is not configured. - */ - if ( getenv( "TQT_IM_SWITCHER" ) ) - defaultIM = getenv( "TQT_IM_SWITCHER" ); -#ifndef TQT_NO_IM_EXTENSIONS - else - defaultIM = settings.readEntry( "/qt/DefaultInputMethodSwitcher", "imsw-multi" ); -#endif - - // defaultIM is restricted to be an IM-switcher. An IM-switcher - // has a 'imsw-' prefix - if ( ! defaultIM.startsWith( "imsw-" ) ) { - defaultIM = "imsw-multi"; - } -#endif - - if (update_timestamp) { - TQBuffer stamp; - TQDataStream s(stamp.buffer(), IO_WriteOnly); - s << settingsstamp; - - XChangeProperty(appDpy, TQPaintDevice::x11AppRootWindow( 0 ), - qt_settings_timestamp, qt_settings_timestamp, 8, - PropModeReplace, (unsigned char *) stamp.buffer().data(), - stamp.buffer().size()); - } - - return TRUE; -} - - -// read the _TQT_INPUT_ENCODING property and apply the settings to -// the application -static void qt_set_input_encoding() -{ - Atom type; - int format; - ulong nitems, after = 1; - const char *data; - - int e = XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow(), - qt_input_encoding, 0, 1024, - False, XA_STRING, &type, &format, &nitems, - &after, (unsigned char**)&data ); - if ( e != Success || !nitems || type == None ) { - // Always use the locale codec, since we have no examples of non-local - // XIMs, and since we cannot get a sensible answer about the encoding - // from the XIM. - qt_input_mapper = TQTextCodec::codecForLocale(); - - } else { - if ( !qstricmp( data, "locale" ) ) - qt_input_mapper = TQTextCodec::codecForLocale(); - else - qt_input_mapper = TQTextCodec::codecForName( data ); - // make sure we have an input codec - if( !qt_input_mapper ) - qt_input_mapper = TQTextCodec::codecForName( "ISO 8859-1" ); - } - if ( qt_input_mapper->mibEnum() == 11 ) // 8859-8 - qt_input_mapper = TQTextCodec::codecForName( "ISO 8859-8-I"); - if( data ) - XFree( (char *)data ); -} - -// set font, foreground and background from x11 resources. The -// arguments may override the resource settings. -static void qt_set_x11_resources( const char* font = 0, const char* fg = 0, - const char* bg = 0, const char* button = 0 ) -{ - if ( !qt_std_pal ) - qt_create_std_palette(); - - TQCString resFont, resFG, resBG, resEF, sysFont; - - TQApplication::setEffectEnabled( TQt::UI_General, FALSE); - TQApplication::setEffectEnabled( TQt::UI_AnimateMenu, FALSE); - TQApplication::setEffectEnabled( TQt::UI_FadeMenu, FALSE); - TQApplication::setEffectEnabled( TQt::UI_AnimateCombo, FALSE ); - TQApplication::setEffectEnabled( TQt::UI_AnimateTooltip, FALSE ); - TQApplication::setEffectEnabled( TQt::UI_FadeTooltip, FALSE ); - TQApplication::setEffectEnabled( TQt::UI_AnimateToolBox, FALSE ); - - if ( TQApplication::desktopSettingsAware() && !TQApplication::x11_apply_settings() ) { - int format; - ulong nitems, after = 1; - TQCString res; - long offset = 0; - Atom type = None; - - while (after > 0) { - uchar *data; - XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow( 0 ), - qt_resource_manager, - offset, 8192, False, AnyPropertyType, - &type, &format, &nitems, &after, - &data ); - res += (char*)data; - offset += 2048; // offset is in 32bit quantities... 8192/4 == 2048 - if ( data ) - XFree( (char *)data ); - } - - TQCString key, value; - int l = 0, r; - TQCString apn = appName; - TQCString apc = appClass; - int apnl = apn.length(); - int apcl = apc.length(); - int resl = res.length(); - - while (l < resl) { - r = res.find( '\n', l ); - if ( r < 0 ) - r = resl; - while ( isspace((uchar) res[l]) ) - l++; - bool mine = FALSE; - if ( res[l] == '*' && - (res[l+1] == 'f' || res[l+1] == 'b' || res[l+1] == 'g' || - res[l+1] == 'F' || res[l+1] == 'B' || res[l+1] == 'G' || - res[l+1] == 's' || res[l+1] == 'S' ) ) { - // OPTIMIZED, since we only want "*[fbgs].." - - TQCString item = res.mid( l, r - l ).simplifyWhiteSpace(); - int i = item.find( ":" ); - key = item.left( i ).stripWhiteSpace().mid(1).lower(); - value = item.right( item.length() - i - 1 ).stripWhiteSpace(); - mine = TRUE; - } else if ( res[l] == appName[0] || (appClass && res[l] == appClass[0]) ) { - if (res.mid(l,apnl) == apn && (res[l+apnl] == '.' || res[l+apnl] == '*')) { - TQCString item = res.mid( l, r - l ).simplifyWhiteSpace(); - int i = item.find( ":" ); - key = item.left( i ).stripWhiteSpace().mid(apnl+1).lower(); - value = item.right( item.length() - i - 1 ).stripWhiteSpace(); - mine = TRUE; - } else if (res.mid(l,apcl) == apc && (res[l+apcl] == '.' || res[l+apcl] == '*')) { - TQCString item = res.mid( l, r - l ).simplifyWhiteSpace(); - int i = item.find( ":" ); - key = item.left( i ).stripWhiteSpace().mid(apcl+1).lower(); - value = item.right( item.length() - i - 1 ).stripWhiteSpace(); - mine = TRUE; - } - } - - if ( mine ) { - if ( !font && key == "systemfont") - sysFont = value.left( value.findRev(':') ).copy(); - if ( !font && key == "font") - resFont = value.copy(); - else if ( !fg && key == "foreground" ) - resFG = value.copy(); - else if ( !bg && key == "background") - resBG = value.copy(); - else if ( key == "guieffects") - resEF = value.copy(); - // NOTE: if you add more, change the [fbg] stuff above - } - - l = r + 1; - } - } - if ( !sysFont.isEmpty() ) - resFont = sysFont; - if ( resFont.isEmpty() ) - resFont = font; - if ( resFG.isEmpty() ) - resFG = fg; - if ( resBG.isEmpty() ) - resBG = bg; - if ( (!qt_app_has_font || qt_x11_cmdline_font) && !resFont.isEmpty() ) { // set application font - TQFont fnt; - fnt.setRawName( resFont ); - - // the font we get may actually be an alias for another font, - // so we reset the application font to the real font info. - if ( ! fnt.exactMatch() ) { - TQFontInfo fontinfo( fnt ); - fnt.setFamily( fontinfo.family() ); - fnt.setRawMode( fontinfo.rawMode() ); - - if ( ! fnt.rawMode() ) { - fnt.setItalic( fontinfo.italic() ); - fnt.setWeight( fontinfo.weight() ); - fnt.setUnderline( fontinfo.underline() ); - fnt.setStrikeOut( fontinfo.strikeOut() ); - fnt.setStyleHint( fontinfo.tqstyleHint() ); - - if ( fnt.pointSize() <= 0 && fnt.pixelSize() <= 0 ) - // size is all wrong... fix it - fnt.setPointSize( (int) ( ( fontinfo.pixelSize() * 72. / - (float) TQPaintDevice::x11AppDpiY() ) + - 0.5 ) ); - } - } - - if ( fnt != TQApplication::font() ) { - TQApplication::setFont( fnt, TRUE ); - } - } - - if ( button || !resBG.isEmpty() || !resFG.isEmpty() ) {// set app colors - TQColor btn; - TQColor bg; - TQColor fg; - if ( !resBG.isEmpty() ) - bg = TQColor(TQString(resBG)); - else - bg = qt_std_pal->active().background(); - if ( !resFG.isEmpty() ) - fg = TQColor(TQString(resFG)); - else - fg = qt_std_pal->active().foreground(); - if ( button ) - btn = TQColor( button ); - else if ( !resBG.isEmpty() ) - btn = bg; - else - btn = qt_std_pal->active().button(); - - int h,s,v; - fg.hsv(&h,&s,&v); - TQColor base = TQt::white; - bool bright_mode = FALSE; - if (v >= 255-50) { - base = btn.dark(150); - bright_mode = TRUE; - } - - TQColorGroup cg( fg, btn, btn.light(), - btn.dark(), btn.dark(150), fg, TQt::white, base, bg ); - if (bright_mode) { - cg.setColor( TQColorGroup::HighlightedText, base ); - cg.setColor( TQColorGroup::Highlight, TQt::white ); - } else { - cg.setColor( TQColorGroup::HighlightedText, TQt::white ); - cg.setColor( TQColorGroup::Highlight, TQt::darkBlue ); - } - TQColor disabled( (fg.red()+btn.red())/2, - (fg.green()+btn.green())/2, - (fg.blue()+btn.blue())/2); - TQColorGroup dcg( disabled, btn, btn.light( 125 ), btn.dark(), btn.dark(150), - disabled, TQt::white, TQt::white, bg ); - if (bright_mode) { - dcg.setColor( TQColorGroup::HighlightedText, base ); - dcg.setColor( TQColorGroup::Highlight, TQt::white ); - } else { - dcg.setColor( TQColorGroup::HighlightedText, TQt::white ); - dcg.setColor( TQColorGroup::Highlight, TQt::darkBlue ); - } - TQPalette pal( cg, dcg, cg ); - if ( pal != *qt_std_pal && pal != TQApplication::palette() ) - TQApplication::setPalette( pal, TRUE ); - *qt_std_pal = pal; - } - - if ( !resEF.isEmpty() ) { - TQStringList effects = TQStringList::split(" ",resEF); - TQApplication::setEffectEnabled( TQt::UI_General, effects.contains("general") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateMenu, effects.contains("animatemenu") ); - TQApplication::setEffectEnabled( TQt::UI_FadeMenu, effects.contains("fademenu") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateCombo, effects.contains("animatecombo") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateTooltip, effects.contains("animatetooltip") ); - TQApplication::setEffectEnabled( TQt::UI_FadeTooltip, effects.contains("fadetooltip") ); - TQApplication::setEffectEnabled( TQt::UI_AnimateToolBox, effects.contains("animatetoolbox") ); - } -} - - -static void qt_detect_broken_window_manager() -{ - Atom type; - int format; - ulong nitems, after; - uchar *data = 0; - - // look for SGI's 4Dwm - int e = XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow(), - qt_sgi_desks_manager, 0, 1, False, XA_WINDOW, - &type, &format, &nitems, &after, &data); - if (data) - XFree(data); - - if (e == Success && type == XA_WINDOW && format == 32 && nitems == 1 && after == 0) { - // detected SGI 4Dwm - qt_broken_wm = TRUE; - } -} - - -// update the supported array -void qt_get_net_supported() -{ - Atom type; - int format; - long offset = 0; - unsigned long nitems, after; - unsigned char *data = 0; - - int e = XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow(), - qt_net_supported, 0, 0, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - if (data) - XFree(data); - - if (qt_net_supported_list) - delete [] qt_net_supported_list; - qt_net_supported_list = 0; - - if (e == Success && type == XA_ATOM && format == 32) { - TQBuffer ts; - ts.open(IO_WriteOnly); - - while (after > 0) { - XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow(), - qt_net_supported, offset, 1024, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - - if (type == XA_ATOM && format == 32) { - ts.writeBlock((const char *) data, nitems * sizeof(long)); - offset += nitems; - } else - after = 0; - if (data) - XFree(data); - } - - // compute nitems - TQByteArray buffer(ts.buffer()); - nitems = buffer.size() / sizeof(Atom); - qt_net_supported_list = new Atom[nitems + 1]; - Atom *a = (Atom *) buffer.data(); - uint i; - for (i = 0; i < nitems; i++) - qt_net_supported_list[i] = a[i]; - qt_net_supported_list[nitems] = 0; - } -} - - -bool qt_net_supports(Atom atom) -{ - if (! qt_net_supported_list) - return FALSE; - - bool supported = FALSE; - int i = 0; - while (qt_net_supported_list[i] != 0) { - if (qt_net_supported_list[i++] == atom) { - supported = TRUE; - break; - } - } - - return supported; -} - - -// update the virtual roots array -void qt_get_net_virtual_roots() -{ - if (qt_net_virtual_root_list) - delete [] qt_net_virtual_root_list; - qt_net_virtual_root_list = 0; - - if (! qt_net_supports(qt_net_virtual_roots)) - return; - - Atom type; - int format; - long offset = 0; - unsigned long nitems, after; - unsigned char *data; - - int e = XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow(), - qt_net_virtual_roots, 0, 0, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - if (data) - XFree(data); - - if (e == Success && type == XA_ATOM && format == 32) { - TQBuffer ts; - ts.open(IO_WriteOnly); - - while (after > 0) { - XGetWindowProperty(appDpy, TQPaintDevice::x11AppRootWindow(), - qt_net_virtual_roots, offset, 1024, - False, XA_ATOM, &type, &format, &nitems, &after, &data); - - if (type == XA_ATOM && format == 32) { - ts.writeBlock((const char *) data, nitems * 4); - offset += nitems; - } else - after = 0; - if (data) - XFree(data); - } - - // compute nitems - TQByteArray buffer(ts.buffer()); - nitems = buffer.size() / sizeof(Window); - qt_net_virtual_root_list = new Window[nitems + 1]; - Window *a = (Window *) buffer.data(); - uint i; - for (i = 0; i < nitems; i++) - qt_net_virtual_root_list[i] = a[i]; - qt_net_virtual_root_list[nitems] = 0; - } -} - -void qt_x11_create_wm_client_leader() -{ - if ( qt_x11_wm_client_leader ) return; - - qt_x11_wm_client_leader = - XCreateSimpleWindow( TQPaintDevice::x11AppDisplay(), - TQPaintDevice::x11AppRootWindow(), - 0, 0, 1, 1, 0, 0, 0 ); - - // set client leader property to itself - XChangeProperty( TQPaintDevice::x11AppDisplay(), - qt_x11_wm_client_leader, qt_wm_client_leader, - XA_WINDOW, 32, PropModeReplace, - (unsigned char *)&qt_x11_wm_client_leader, 1 ); - - // If we are session managed, inform the window manager about it - TQCString session = tqApp->sessionId().latin1(); - if ( !session.isEmpty() ) { - XChangeProperty( TQPaintDevice::x11AppDisplay(), - qt_x11_wm_client_leader, qt_sm_client_id, - XA_STRING, 8, PropModeReplace, - (unsigned char *)session.data(), session.length() ); - } -} - -static void qt_net_update_user_time(TQWidget *tlw) -{ - Time my_tqx_user_time = GET_QT_X_USER_TIME(); - XChangeProperty(TQPaintDevice::x11AppDisplay(), tlw->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); -} - -static void qt_check_focus_model() -{ - Window fw = None; - int unused; - XGetInputFocus( appDpy, &fw, &unused ); - if ( fw == PointerRoot ) - qt_focus_model = FocusModel_PointerRoot; - else - qt_focus_model = FocusModel_Other; -} - - -/* - Returns a truecolor visual (if there is one). 8-bit TrueColor visuals - are ignored, unless the user has explicitly requested -visual TrueColor. - The SGI X server usually has an 8 bit default visual, but the application - can also ask for a truecolor visual. This is what we do if - TQApplication::colorSpec() is TQApplication::ManyColor. -*/ - -static Visual *find_truecolor_visual( Display *dpy, int scr, int *depth, int *ncols ) -{ - XVisualInfo *vi, rvi; - int best=0, n, i; - rvi.c_class = TrueColor; - rvi.screen = scr; - vi = XGetVisualInfo( dpy, VisualClassMask | VisualScreenMask, - &rvi, &n ); - if ( vi ) { - for ( i=0; i<n; i++ ) { - if ( vi[i].depth > vi[best].depth ) - best = i; - } - } - Visual *v = DefaultVisual(dpy,scr); - if ( !vi || (vi[best].visualid == XVisualIDFromVisual(v)) || - (vi[best].depth <= 8 && qt_visual_option != TrueColor) ) - { - *depth = DefaultDepth(dpy,scr); - *ncols = DisplayCells(dpy,scr); - } else { - v = vi[best].visual; - *depth = vi[best].depth; - *ncols = vi[best].colormap_size; - } - if ( vi ) - XFree( (char *)vi ); - return v; -} - - -/***************************************************************************** - qt_init() - initializes TQt for X11 - *****************************************************************************/ - -#define XK_MISCELLANY -#define XK_LATIN1 -#define XK_KOREAN -#define XK_XKB_KEYS -#include <X11/keysymdef.h> - -// ### This should be static but it isn't because of the friend declaration -// ### in tqpaintdevice.h which then should have a static too but can't have -// ### it because "storage class specifiers invalid in friend function -// ### declarations" :-) Ideas anyone? -void qt_init_internal( int *argcptr, char **argv, - Display *display, TQt::HANDLE visual, TQt::HANDLE colormap ) -{ - setlocale( LC_ALL, "" ); // use correct char set mapping - setlocale( LC_NUMERIC, "C" ); // make sprintf()/scanf() work - - if ( display ) { - // TQt part of other application - - appForeignDpy = TRUE; - appDpy = display; - - // Set application name and class - appName = qstrdup( "TQt-subapplication" ); - char *app_class = 0; - if (argv) { - const char* p = strrchr( argv[0], '/' ); - app_class = qstrdup(p ? p + 1 : argv[0]); - if (app_class[0]) - app_class[0] = toupper(app_class[0]); - } - appClass = app_class; - - // Install default error handlers - original_x_errhandler = XSetErrorHandler( qt_x_errhandler ); - original_xio_errhandler = XSetIOErrorHandler( qt_xio_errhandler ); - } else { - // TQt controls everything (default) - - int argc = *argcptr; - int j; - - // Install default error handlers - original_x_errhandler = XSetErrorHandler( qt_x_errhandler ); - original_xio_errhandler = XSetIOErrorHandler( qt_xio_errhandler ); - - // Set application name and class - char *app_class = 0; - if (argv) { - const char *p = strrchr( argv[0], '/' ); - appName = p ? p + 1 : argv[0]; - app_class = qstrdup(appName); - if (app_class[0]) - app_class[0] = toupper(app_class[0]); - } - appClass = app_class; - - // Get command line params - j = argc ? 1 : 0; - for ( int i=1; i<argc; i++ ) { - if ( argv[i] && *argv[i] != '-' ) { - argv[j++] = argv[i]; - continue; - } - TQCString arg = argv[i]; - if ( arg == "-display" ) { - if ( ++i < argc ) - appDpyName = argv[i]; - } else if ( arg == "-fn" || arg == "-font" ) { - if ( ++i < argc ) { - appFont = argv[i]; - qt_x11_cmdline_font = true; - } - } else if ( arg == "-bg" || arg == "-background" ) { - if ( ++i < argc ) - appBGCol = argv[i]; - } else if ( arg == "-btn" || arg == "-button" ) { - if ( ++i < argc ) - appBTNCol = argv[i]; - } else if ( arg == "-fg" || arg == "-foreground" ) { - if ( ++i < argc ) - appFGCol = argv[i]; - } else if ( arg == "-name" ) { - if ( ++i < argc ) - appName = argv[i]; - } else if ( arg == "-title" ) { - if ( ++i < argc ) - mwTitle = argv[i]; - } else if ( arg == "-tqgeometry" ) { - if ( ++i < argc ) - mwGeometry = argv[i]; - //Ming-Che 10/10 - } else if ( arg == "-im" ) { - if ( ++i < argc ) - qt_ximServer = argv[i]; - } else if ( arg == "-iconic" ) { - mwIconic = !mwIconic; - } else if ( arg == "-ncols" ) { // xv and netscape use this name - if ( ++i < argc ) - qt_ncols_option = TQMAX(0,atoi(argv[i])); - } else if ( arg == "-visual" ) { // xv and netscape use this name - if ( ++i < argc ) { - TQCString s = TQCString(argv[i]).lower(); - if ( s == "truecolor" ) { - qt_visual_option = TrueColor; - } else { - // ### Should we honor any others? - } - } -#ifndef TQT_NO_XIM - } else if ( arg == "-inputstyle" ) { - if ( ++i < argc ) { - TQCString s = TQCString(argv[i]).lower(); - if ( s == "onthespot" ) - qt_xim_preferred_style = XIMPreeditCallbacks | - XIMStatusNothing; - else if ( s == "overthespot" ) - qt_xim_preferred_style = XIMPreeditPosition | - XIMStatusNothing; - else if ( s == "offthespot" ) - qt_xim_preferred_style = XIMPreeditArea | - XIMStatusArea; - else if ( s == "root" ) - qt_xim_preferred_style = XIMPreeditNothing | - XIMStatusNothing; - } -#endif - } else if ( arg == "-cmap" ) { // xv uses this name - qt_cmap_option = TRUE; - } -#if defined(TQT_DEBUG) - else if ( arg == "-sync" ) - appSync = !appSync; - else if ( arg == "-nograb" ) - appNoGrab = !appNoGrab; - else if ( arg == "-dograb" ) - appDoGrab = !appDoGrab; -#endif - else - argv[j++] = argv[i]; - } - - *argcptr = j; - -#if defined(TQT_DEBUG) && defined(TQ_OS_LINUX) - if ( !appNoGrab && !appDoGrab ) { - TQCString s; - s.sprintf( "/proc/%d/cmdline", getppid() ); - TQFile f( s ); - if ( f.open( IO_ReadOnly ) ) { - s.truncate( 0 ); - int c; - while ( (c = f.getch()) > 0 ) { - if ( c == '/' ) - s.truncate( 0 ); - else - s += (char)c; - } - if ( s == "gdb" ) { - appNoGrab = TRUE; - qDebug( "TQt: gdb: -nograb added to command-line options.\n" - "\t Use the -dograb option to enforce grabbing." ); - } - f.close(); - } - } -#endif - // Connect to X server - - if( qt_is_gui_used ) { - if ( ( appDpy = XOpenDisplay(appDpyName) ) == 0 ) { - qWarning( "%s: cannot connect to X server %s", appName, - XDisplayName(appDpyName) ); - tqApp = 0; - exit( 1 ); - } - - if ( appSync ) // if "-sync" argument - XSynchronize( appDpy, TRUE ); - } - } - // Common code, regardless of whether display is foreign. - - // Get X parameters - - if( qt_is_gui_used ) { - appScreen = DefaultScreen(appDpy); - appScreenCount = ScreenCount(appDpy); - - TQPaintDevice::x_appdisplay = appDpy; - TQPaintDevice::x_appscreen = appScreen; - - // allocate the arrays for the TQPaintDevice data - TQPaintDevice::x_appdepth_arr = new int[ appScreenCount ]; - TQPaintDevice::x_appcells_arr = new int[ appScreenCount ]; - TQPaintDevice::x_approotwindow_arr = new TQt::HANDLE[ appScreenCount ]; - TQPaintDevice::x_appcolormap_arr = new TQt::HANDLE[ appScreenCount ]; - TQPaintDevice::x_appdefcolormap_arr = new bool[ appScreenCount ]; - TQPaintDevice::x_appvisual_arr = new void*[ appScreenCount ]; - TQPaintDevice::x_appdefvisual_arr = new bool[ appScreenCount ]; - TQ_CHECK_PTR( TQPaintDevice::x_appdepth_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appcells_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_approotwindow_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appcolormap_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appdefcolormap_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appvisual_arr ); - TQ_CHECK_PTR( TQPaintDevice::x_appdefvisual_arr ); - - int screen; - TQString serverVendor( ServerVendor( appDpy) ); - if (serverVendor.contains("XFree86") && VendorRelease(appDpy) < 40300000) - qt_hebrew_keyboard_hack = TRUE; - - for ( screen = 0; screen < appScreenCount; ++screen ) { - TQPaintDevice::x_appdepth_arr[ screen ] = DefaultDepth(appDpy, screen); - TQPaintDevice::x_appcells_arr[ screen ] = DisplayCells(appDpy, screen); - TQPaintDevice::x_approotwindow_arr[ screen ] = RootWindow(appDpy, screen); - - // setup the visual and colormap for each screen - Visual *vis = 0; - if ( visual && screen == appScreen ) { - // use the provided visual on the default screen only - vis = (Visual *) visual; - - // figure out the depth of the visual we are using - XVisualInfo *vi, rvi; - int n; - rvi.visualid = XVisualIDFromVisual(vis); - rvi.screen = screen; - vi = XGetVisualInfo( appDpy, VisualIDMask | VisualScreenMask, &rvi, &n ); - if (vi) { - TQPaintDevice::x_appdepth_arr[ screen ] = vi->depth; - TQPaintDevice::x_appcells_arr[ screen ] = vi->visual->map_entries; - TQPaintDevice::x_appvisual_arr[ screen ] = vi->visual; - TQPaintDevice::x_appdefvisual_arr[ screen ] = FALSE; - XFree(vi); - } else { - // couldn't get info about the visual, use the default instead - vis = 0; - } - } - - if (!vis) { - // use the default visual - vis = DefaultVisual(appDpy, screen); - TQPaintDevice::x_appdefvisual_arr[ screen ] = TRUE; - - if ( qt_visual_option == TrueColor || - TQApplication::colorSpec() == TQApplication::ManyColor ) { - // find custom visual - - int d, c; - vis = find_truecolor_visual( appDpy, screen, &d, &c ); - TQPaintDevice::x_appdepth_arr[ screen ] = d; - TQPaintDevice::x_appcells_arr[ screen ] = c; - - TQPaintDevice::x_appvisual_arr[ screen ] = vis; - TQPaintDevice::x_appdefvisual_arr[ screen ] = - (XVisualIDFromVisual(vis) == - XVisualIDFromVisual(DefaultVisual(appDpy, screen))); - } - - TQPaintDevice::x_appvisual_arr[ screen ] = vis; - } - - // we assume that 8bpp == pseudocolor, but this is not - // always the case (according to the X server), so we need - // to make sure that our internal data is setup in a way - // that is compatible with our assumptions - if ( vis->c_class == TrueColor && - TQPaintDevice::x_appdepth_arr[ screen ] == 8 && - TQPaintDevice::x_appcells_arr[ screen ] == 8 ) - TQPaintDevice::x_appcells_arr[ screen ] = 256; - - if ( colormap && screen == appScreen ) { - // use the provided colormap for the default screen only - TQPaintDevice::x_appcolormap_arr[ screen ] = colormap; - TQPaintDevice::x_appdefcolormap_arr[ screen ] = FALSE; - } else { - if ( vis->c_class == TrueColor ) { - TQPaintDevice::x_appdefcolormap_arr[ screen ] = - TQPaintDevice::x_appdefvisual_arr[ screen ]; - } else { - TQPaintDevice::x_appdefcolormap_arr[ screen ] = - !qt_cmap_option && TQPaintDevice::x_appdefvisual_arr[ screen ]; - } - - if ( TQPaintDevice::x_appdefcolormap_arr[ screen ] ) { - // use default colormap - XStandardColormap *stdcmap; - VisualID vid = - XVisualIDFromVisual((Visual *) - TQPaintDevice::x_appvisual_arr[ screen ]); - int i, count; - - TQPaintDevice::x_appcolormap_arr[ screen ] = 0; - - if ( ! serverVendor.contains( "Hewlett-Packard" ) ) { - // on HPUX 10.20 local displays, the RGB_DEFAULT_MAP colormap - // doesn't give us correct colors. Why this happens, I have - // no clue, so we disable this for HPUX - if (XGetRGBColormaps(appDpy, - TQPaintDevice::x11AppRootWindow( screen ), - &stdcmap, &count, XA_RGB_DEFAULT_MAP)) { - i = 0; - while (i < count && - TQPaintDevice::x_appcolormap_arr[ screen ] == 0) { - if (stdcmap[i].visualid == vid) { - TQPaintDevice::x_appcolormap_arr[ screen ] = - stdcmap[i].colormap; - } - i++; - } - - XFree( (char *)stdcmap ); - } - } - - if (TQPaintDevice::x_appcolormap_arr[ screen ] == 0) { - TQPaintDevice::x_appcolormap_arr[ screen ] = - DefaultColormap(appDpy, screen); - } - } else { - // create a custom colormap - TQPaintDevice::x_appcolormap_arr[ screen ] = - XCreateColormap(appDpy, TQPaintDevice::x11AppRootWindow( screen ), - vis, AllocNone); - } - } - } - - // Set X painttqdevice parameters for the default screen - TQPaintDevice::x_appdepth = TQPaintDevice::x_appdepth_arr[ appScreen ]; - TQPaintDevice::x_appcells = TQPaintDevice::x_appcells_arr[ appScreen ]; - TQPaintDevice::x_approotwindow = TQPaintDevice::x_approotwindow_arr[ appScreen ]; - TQPaintDevice::x_appcolormap = TQPaintDevice::x_appcolormap_arr[ appScreen ]; - TQPaintDevice::x_appdefcolormap = TQPaintDevice::x_appdefcolormap_arr[ appScreen ]; - TQPaintDevice::x_appvisual = TQPaintDevice::x_appvisual_arr[ appScreen ]; - TQPaintDevice::x_appdefvisual = TQPaintDevice::x_appdefvisual_arr[ appScreen ]; - - // Support protocols - - qt_x11_intern_atom( "WM_PROTOCOLS", &qt_wm_protocols ); - qt_x11_intern_atom( "WM_DELETE_WINDOW", &qt_wm_delete_window ); - qt_x11_intern_atom( "WM_STATE", &qt_wm_state ); - qt_x11_intern_atom( "WM_CHANGE_STATE", &qt_wm_change_state ); - qt_x11_intern_atom( "WM_TAKE_FOCUS", &qt_wm_take_focus ); - qt_x11_intern_atom( "WM_CLIENT_LEADER", &qt_wm_client_leader); - qt_x11_intern_atom( "WM_WINDOW_ROLE", &qt_window_role); - qt_x11_intern_atom( "SM_CLIENT_ID", &qt_sm_client_id); - qt_x11_intern_atom( "CLIPBOARD", &qt_xa_clipboard ); - qt_x11_intern_atom( "RESOURCE_MANAGER", &qt_resource_manager ); - qt_x11_intern_atom( "INCR", &qt_x_incr ); - qt_x11_intern_atom( "_XSETROOT_ID", &qt_xsetroot_id ); - qt_x11_intern_atom( "_TQT_SELECTION", &qt_selection_property ); - qt_x11_intern_atom( "_TQT_CLIPBOARD_SENTINEL", &qt_clipboard_sentinel ); - qt_x11_intern_atom( "_TQT_SELECTION_SENTINEL", &qt_selection_sentinel ); - qt_x11_intern_atom( "_TQT_SCROLL_DONE", &qt_qt_scrolldone ); - qt_x11_intern_atom( "_TQT_INPUT_ENCODING", &qt_input_encoding ); - qt_x11_intern_atom( "_TQT_SIZEGRIP", &qt_sizegrip ); - qt_x11_intern_atom( "_NET_WM_CONTEXT_HELP", &qt_net_wm_context_help ); - qt_x11_intern_atom( "_NET_WM_PING", &qt_net_wm_ping ); - qt_x11_intern_atom( "_MOTIF_WM_HINTS", &qt_xa_motif_wm_hints ); - qt_x11_intern_atom( "DTWM_IS_RUNNING", &qt_cde_running ); - qt_x11_intern_atom( "KWIN_RUNNING", &qt_kwin_running ); - qt_x11_intern_atom( "KWM_RUNNING", &qt_kwm_running ); - qt_x11_intern_atom( "GNOME_BACKGROUND_PROPERTIES", &qt_gbackground_properties ); - - TQString atomname("_TQT_SETTINGS_TIMESTAMP_"); - atomname += XDisplayName(appDpyName); - qt_x11_intern_atom( atomname.latin1(), &qt_settings_timestamp ); - - qt_x11_intern_atom( "_NET_SUPPORTED", &qt_net_supported ); - qt_x11_intern_atom( "_NET_VIRTUAL_ROOTS", &qt_net_virtual_roots ); - qt_x11_intern_atom( "_NET_WORKAREA", &qt_net_workarea ); - qt_x11_intern_atom( "_NET_WM_STATE", &qt_net_wm_state ); - qt_x11_intern_atom( "_NET_WM_STATE_MODAL", &qt_net_wm_state_modal ); - qt_x11_intern_atom( "_NET_WM_STATE_MAXIMIZED_VERT", &qt_net_wm_state_max_v ); - qt_x11_intern_atom( "_NET_WM_STATE_MAXIMIZED_HORZ", &qt_net_wm_state_max_h ); - qt_x11_intern_atom( "_NET_WM_STATE_FULLSCREEN", &qt_net_wm_state_fullscreen ); - qt_x11_intern_atom( "_NET_WM_STATE_ABOVE", &qt_net_wm_state_above ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE", &qt_net_wm_window_type ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_NORMAL", &qt_net_wm_window_type_normal ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_DIALOG", &qt_net_wm_window_type_dialog ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_TOOLBAR", &qt_net_wm_window_type_toolbar ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_MENU", &qt_net_wm_window_type_menu ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_UTILITY", &qt_net_wm_window_type_utility ); - qt_x11_intern_atom( "_NET_WM_WINDOW_TYPE_SPLASH", &qt_net_wm_window_type_splash ); - qt_x11_intern_atom( "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", &qt_net_wm_window_type_override ); - qt_x11_intern_atom( "_KDE_NET_WM_FRAME_STRUT", &qt_net_wm_frame_strut ); - qt_x11_intern_atom( "_NET_WM_STATE_STAYS_ON_TOP", - &qt_net_wm_state_stays_on_top ); - qt_x11_intern_atom( "_NET_WM_PID", &qt_net_wm_pid ); - qt_x11_intern_atom( "_NET_WM_USER_TIME", &qt_net_wm_user_time ); - qt_x11_intern_atom( "ENLIGHTENMENT_DESKTOP", &qt_enlightenment_desktop ); - qt_x11_intern_atom( "_NET_WM_NAME", &qt_net_wm_name ); - qt_x11_intern_atom( "_NET_WM_ICON_NAME", &qt_net_wm_icon_name ); - qt_x11_intern_atom( "UTF8_STRING", &qt_utf8_string ); - qt_x11_intern_atom( "_SGI_DESKS_MANAGER", &qt_sgi_desks_manager ); - - qt_xdnd_setup(); - qt_x11_motifdnd_init(); - - // Finally create all atoms - qt_x11_process_intern_atoms(); - - // look for broken window managers - qt_detect_broken_window_manager(); - - // initialize NET lists - qt_get_net_supported(); - qt_get_net_virtual_roots(); - -#ifndef TQT_NO_XRANDR - // See if XRandR is supported on the connected display - int xrandr_errorbase; - TQ_UNUSED( xrandr_eventbase ); - if ( XRRQueryExtension( appDpy, &xrandr_eventbase, &xrandr_errorbase ) ) { - // XRandR is supported - qt_use_xrandr = TRUE; - } -#endif // TQT_NO_XRANDR - -#ifndef TQT_NO_XRENDER - // See if XRender is supported on the connected display - int xrender_eventbase, xrender_errorbase; - if (XRenderQueryExtension(appDpy, &xrender_eventbase, &xrender_errorbase)) { - // XRender is supported, let's see if we have a PictFormat for the - // default visual - XRenderPictFormat *format = - XRenderFindVisualFormat(appDpy, - (Visual *) TQPaintDevice::x_appvisual); - qt_use_xrender = (format != 0) && (TQPaintDevice::x_appdepth != 8); - } -#endif // TQT_NO_XRENDER - -#ifndef TQT_NO_XKB - // If XKB is detected, set the GrabsUseXKBState option so input method - // compositions continue to work (ie. deadkeys) - unsigned int state = XkbPCF_GrabsUseXKBStateMask; - (void) XkbSetPerClientControls(appDpy, state, &state); -#endif - -#if !defined(TQT_NO_XFTFREETYPE) - // defined in qfont_x11.cpp - extern bool qt_has_xft; -#ifndef TQT_XFT2 - if (!qt_use_xrender) - qt_has_xft = FALSE; - else -#endif - qt_has_xft = XftInit(0) && XftInitFtLibrary(); - - if (qt_has_xft) { - char *dpi_str = XGetDefault(appDpy, "Xft", "dpi"); - if (dpi_str) { - // use a custom DPI - char *end = 0; - int dpi = strtol(dpi_str, &end, 0); - if (dpi_str != end) { - for (int s = 0; s < ScreenCount(appDpy); ++s) { - TQPaintDevice::x11SetAppDpiX(dpi, s); - TQPaintDevice::x11SetAppDpiY(dpi, s); - } - } - } - } -#endif // TQT_NO_XFTFREETYPE - - // look at the modifier mapping, and get the correct masks for alt/meta - // find the alt/meta masks - XModifierKeymap *map = XGetModifierMapping(appDpy); - if (map) { - int i, maskIndex = 0, mapIndex = 0; - for (maskIndex = 0; maskIndex < 8; maskIndex++) { - for (i = 0; i < map->max_keypermod; i++) { - if (map->modifiermap[mapIndex]) { - KeySym sym = - XKeycodeToKeysym(appDpy, map->modifiermap[mapIndex], 0); - if ( qt_alt_mask == 0 && - ( sym == XK_Alt_L || sym == XK_Alt_R ) ) { - qt_alt_mask = 1 << maskIndex; - } - if ( qt_meta_mask == 0 && - (sym == XK_Meta_L || sym == XK_Meta_R ) ) { - qt_meta_mask = 1 << maskIndex; - } - } - mapIndex++; - } - } - - // not look for mode_switch in qt_alt_mask and qt_meta_mask - if it is - // present in one or both, then we set qt_mode_switch_remove_mask. - // see TQETWidget::translateKeyEventInternal for an explanation - // of why this is needed - mapIndex = 0; - for ( maskIndex = 0; maskIndex < 8; maskIndex++ ) { - if ( qt_alt_mask != ( 1 << maskIndex ) && - qt_meta_mask != ( 1 << maskIndex ) ) { - for ( i = 0; i < map->max_keypermod; i++ ) - mapIndex++; - continue; - } - - for ( i = 0; i < map->max_keypermod; i++ ) { - if ( map->modifiermap[ mapIndex ] ) { - KeySym sym = - XKeycodeToKeysym( appDpy, map->modifiermap[ mapIndex ], 0 ); - if ( sym == XK_Mode_switch ) { - qt_mode_switch_remove_mask |= 1 << maskIndex; - } - } - mapIndex++; - } - } - - XFreeModifiermap(map); - } else { - // assume defaults - qt_alt_mask = Mod1Mask; - qt_meta_mask = Mod4Mask; - qt_mode_switch_remove_mask = 0; - } - - // Misc. initialization - - TQColor::initialize(); - TQFont::initialize(); - TQCursor::initialize(); - TQPainter::initialize(); - } - -#if defined(TQT_THREAD_SUPPORT) - TQThread::initialize(); -#endif - - if( qt_is_gui_used ) { - tqApp->setName( appName ); - - int screen; - for ( screen = 0; screen < appScreenCount; ++screen ) { - XSelectInput( appDpy, TQPaintDevice::x11AppRootWindow( screen ), - KeymapStateMask | EnterWindowMask | LeaveWindowMask | - PropertyChangeMask ); - -#ifndef TQT_NO_XRANDR - if (qt_use_xrandr) - XRRSelectInput( appDpy, TQPaintDevice::x11AppRootWindow( screen ), True ); -#endif // TQT_NO_XRANDR - } - } - - if ( qt_is_gui_used ) { - qt_set_input_encoding(); - - qt_set_x11_resources( appFont, appFGCol, appBGCol, appBTNCol); - - // be smart about the size of the default font. most X servers have helvetica - // 12 point available at 2 resolutions: - // 75dpi (12 pixels) and 100dpi (17 pixels). - // At 95 DPI, a 12 point font should be 16 pixels tall - in which case a 17 - // pixel font is a closer match than a 12 pixel font - int ptsz = - (int) ( ( ( TQPaintDevice::x11AppDpiY() >= 95 ? 17. : 12. ) * - 72. / (float) TQPaintDevice::x11AppDpiY() ) + 0.5 ); - - if ( !qt_app_has_font && !qt_x11_cmdline_font ) { - TQFont f( "Helvetica", ptsz ); - TQApplication::setFont( f ); - } - -#if !defined(TQT_NO_IM) -#if !defined(TQT_NO_IM_EXTENSIONS) - TQApplication::create_im(); -#else - TQApplication::create_xim(); -#endif -#endif - -#if defined (TQT_TABLET_SUPPORT) - int ndev, - i, - j; - bool gotStylus, - gotEraser; - XDeviceInfo *tqdevices, *devs; - XInputClassInfo *ip; - XAnyClassPtr any; - XValuatorInfoPtr v; - XAxisInfoPtr a; - XDevice *dev; - XEventClass *ev_class; - int curr_event_count; - -#if !defined(TQ_OS_IRIX) - // XFree86 divides a stylus and eraser into 2 tqdevices, so we must do for both... - const TQString XFREENAMESTYLUS = "stylus"; - const TQString XFREENAMEPEN = "pen"; - const TQString XFREENAMEERASER = "eraser"; -#endif - - tqdevices = XListInputDevices( appDpy, &ndev); - if ( tqdevices == NULL ) { - qWarning( "Failed to get list of tqdevices" ); - ndev = -1; - } - dev = NULL; - for ( devs = tqdevices, i = 0; i < ndev; i++, devs++ ) { - gotEraser = FALSE; -#if defined(TQ_OS_IRIX) - - gotStylus = ( !strncmp(devs->name, - WACOM_NAME, sizeof(WACOM_NAME) - 1) ); -#else - TQString devName = devs->name; - devName = devName.lower(); - gotStylus = ( devName.startsWith(XFREENAMEPEN) - || devName.startsWith(XFREENAMESTYLUS) ); - if ( !gotStylus ) - gotEraser = devName.startsWith( XFREENAMEERASER ); - -#endif - if ( gotStylus || gotEraser ) { - // I only wanted to do this once, so wrap pointers around these - curr_event_count = 0; - - if ( gotStylus ) { - devStylus = XOpenDevice( appDpy, devs->id ); - dev = devStylus; - ev_class = event_list_stylus; - } else if ( gotEraser ) { - devEraser = XOpenDevice( appDpy, devs->id ); - dev = devEraser; - ev_class = event_list_eraser; - } - if ( dev == NULL ) { - qWarning( "Failed to open tqdevice" ); - } else { - if ( dev->num_classes > 0 ) { - for ( ip = dev->classes, j = 0; j < devs->num_classes; - ip++, j++ ) { - switch ( ip->input_class ) { - case KeyClass: - DeviceKeyPress( dev, xinput_key_press, - ev_class[curr_event_count] ); - curr_event_count++; - DeviceKeyRelease( dev, xinput_key_release, - ev_class[curr_event_count] ); - curr_event_count++; - break; - case ButtonClass: - DeviceButtonPress( dev, xinput_button_press, - ev_class[curr_event_count] ); - curr_event_count++; - DeviceButtonRelease( dev, xinput_button_release, - ev_class[curr_event_count] ); - curr_event_count++; - break; - case ValuatorClass: - // I'm only going to be interested in motion when the - // stylus is already down anyway! - DeviceMotionNotify( dev, xinput_motion, - ev_class[curr_event_count] ); - curr_event_count++; - break; - default: - break; - } - } - } - } - // get the min/max value for pressure! - any = (XAnyClassPtr) ( devs->inputclassinfo ); - if ( dev == devStylus ) { - qt_curr_events_stylus = curr_event_count; - for (j = 0; j < devs->num_classes; j++) { - if ( any->c_class == ValuatorClass ) { - v = (XValuatorInfoPtr) any; - a = (XAxisInfoPtr) ((char *) v + - sizeof (XValuatorInfo)); -#if defined (TQ_OS_IRIX) - max_pressure = a[WAC_PRESSURE_I].max_value; -#else - max_pressure = a[2].max_value; -#endif - // got the max pressure no need to go further... - break; - } - any = (XAnyClassPtr) ((char *) any + any->length); - } - } else { - qt_curr_events_eraser = curr_event_count; - } - // at this point we are assuming there is only one - // wacom tqdevice... -#if defined (TQ_OS_IRIX) - if ( devStylus != NULL ) { -#else - if ( devStylus != NULL && devEraser != NULL ) { -#endif - break; - } - } - } // end for loop - XFreeDeviceList( tqdevices ); -#endif // TQT_TABLET_SUPPORT - - } else { - // read some non-GUI settings when not using the X server... - - if ( TQApplication::desktopSettingsAware() ) { - TQSettings settings; - - // read library (ie. plugin) path list - TQString libpathkey = TQString("/qt/%1.%2/libraryPath") - .arg( TQT_VERSION >> 16 ) - .arg( (TQT_VERSION & 0xff00 ) >> 8 ); - TQStringList pathlist = - settings.readListEntry(libpathkey, ':'); - if (! pathlist.isEmpty()) { - TQStringList::ConstIterator it = pathlist.begin(); - while (it != pathlist.end()) - TQApplication::addLibraryPath(*it++); - } - - TQString defaultcodec = settings.readEntry("/qt/defaultCodec", "none"); - if (defaultcodec != "none") { - TQTextCodec *codec = TQTextCodec::codecForName(defaultcodec); - if (codec) - tqApp->setDefaultCodec(codec); - } - - qt_resolve_symlinks = - settings.readBoolEntry("/qt/resolveSymlinks", TRUE); - } - } - } - - -#ifndef TQT_NO_STYLE - // run-time search for default style -void TQApplication::x11_initialize_style() -{ - Atom type; - int format; - unsigned long length, after; - uchar *data; - if ( !app_style && - XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow(), qt_kwin_running, - 0, 1, False, AnyPropertyType, &type, &format, &length, - &after, &data ) == Success && length ) { - if ( data ) XFree( (char *)data ); - // kwin is there. check if KDE's styles are available, - // otherwise use windows style - if ( (app_style = TQStyleFactory::create("highcolor") ) == 0 ) - app_style = TQStyleFactory::create("windows"); - } - if ( !app_style && - XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow(), qt_kwm_running, - 0, 1, False, AnyPropertyType, &type, &format, &length, - &after, &data ) == Success && length ) { - if ( data ) XFree( (char *)data ); - app_style = TQStyleFactory::create("windows"); - } - if ( !app_style && - XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow(), qt_cde_running, - 0, 1, False, AnyPropertyType, &type, &format, &length, - &after, &data ) == Success && length ) { - // DTWM is running, meaning most likely CDE is running... - if ( data ) XFree( (char *) data ); - app_style = TQStyleFactory::create( "cde" ); - } - // maybe another desktop? - if ( !app_style && - XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow(), - qt_gbackground_properties, 0, 1, False, AnyPropertyType, - &type, &format, &length, &after, &data ) == Success && - length ) { - if ( data ) XFree( (char *)data ); - // default to MotifPlus with hovering - app_style = TQStyleFactory::create("motifplus" ); - } -} -#endif - -void qt_init( int *argcptr, char **argv, TQApplication::Type ) -{ - qt_init_internal( argcptr, argv, 0, 0, 0 ); -} - -void qt_init( Display *display, TQt::HANDLE visual, TQt::HANDLE colormap ) -{ - qt_init_internal( 0, 0, display, visual, colormap ); -} - - -/***************************************************************************** - qt_cleanup() - cleans up when the application is finished - *****************************************************************************/ - -void qt_cleanup() -{ - appliedstamp = 0; - - if ( app_save_rootinfo ) // root window must keep state - qt_save_rootinfo(); - - if ( qt_is_gui_used ) { - TQPixmapCache::clear(); - TQPainter::cleanup(); - TQCursor::cleanup(); - TQFont::cleanup(); - TQColor::cleanup(); - TQSharedDoubleBuffer::cleanup(); - } -#if defined(TQT_THREAD_SUPPORT) - TQThread::cleanup(); -#endif - -#if defined (TQT_TABLET_SUPPORT) - if ( devStylus != NULL ) - XCloseDevice( appDpy, devStylus ); - if ( devEraser != NULL ) - XCloseDevice( appDpy, devEraser ); -#endif - -#if !defined(TQT_NO_IM) -#if !defined(TQT_NO_IM_EXTENSIONS) - TQApplication::close_im(); -#else - TQApplication::close_xim(); -#endif -#endif - - if ( qt_is_gui_used ) { - int screen; - for ( screen = 0; screen < appScreenCount; screen++ ) { - if ( ! TQPaintDevice::x11AppDefaultColormap( screen ) ) - XFreeColormap( TQPaintDevice::x11AppDisplay(), - TQPaintDevice::x11AppColormap( screen ) ); - } - } - -#define TQT_CLEANUP_GC(g) if (g) { for (int i=0;i<appScreenCount;i++){if(g[i])XFreeGC(appDpy,g[i]);} delete [] g; g = 0; } - TQT_CLEANUP_GC(app_gc_ro); - TQT_CLEANUP_GC(app_gc_ro_m); - TQT_CLEANUP_GC(app_gc_tmp); - TQT_CLEANUP_GC(app_gc_tmp_m); -#undef TQT_CLEANUP_GC - - delete sip_list; - sip_list = 0; - - // Reset the error handlers - XSetErrorHandler( original_x_errhandler ); - XSetIOErrorHandler( original_xio_errhandler ); - - if ( qt_is_gui_used && !appForeignDpy ) - XCloseDisplay( appDpy ); // close X display - appDpy = 0; - - qt_x11_wm_client_leader = 0; - - if ( TQPaintDevice::x_appdepth_arr ) - delete [] TQPaintDevice::x_appdepth_arr; - if ( TQPaintDevice::x_appcells_arr ) - delete [] TQPaintDevice::x_appcells_arr; - if ( TQPaintDevice::x_appcolormap_arr ) - delete []TQPaintDevice::x_appcolormap_arr; - if ( TQPaintDevice::x_appdefcolormap_arr ) - delete [] TQPaintDevice::x_appdefcolormap_arr; - if ( TQPaintDevice::x_appvisual_arr ) - delete [] TQPaintDevice::x_appvisual_arr; - if ( TQPaintDevice::x_appdefvisual_arr ) - delete [] TQPaintDevice::x_appdefvisual_arr; - - if ( appForeignDpy ) { - delete [] (char *)appName; - appName = 0; - delete [] (char *)appClass; - appClass = 0; - } - - if (qt_net_supported_list) - delete [] qt_net_supported_list; - qt_net_supported_list = 0; - - if (qt_net_virtual_root_list) - delete [] qt_net_virtual_root_list; - qt_net_virtual_root_list = 0; -} - - -/***************************************************************************** - Platform specific global and internal functions - *****************************************************************************/ - -void qt_save_rootinfo() // save new root info -{ - Atom type; - int format; - unsigned long length, after; - uchar *data; - - if ( qt_xsetroot_id ) { // kill old pixmap - if ( XGetWindowProperty( appDpy, TQPaintDevice::x11AppRootWindow(), - qt_xsetroot_id, 0, 1, - True, AnyPropertyType, &type, &format, - &length, &after, &data ) == Success ) { - if ( type == XA_PIXMAP && format == 32 && length == 1 && - after == 0 && data ) { - XKillClient( appDpy, *((Pixmap*)data) ); - } - Pixmap dummy = XCreatePixmap( appDpy, TQPaintDevice::x11AppRootWindow(), - 1, 1, 1 ); - XChangeProperty( appDpy, TQPaintDevice::x11AppRootWindow(), - qt_xsetroot_id, XA_PIXMAP, 32, - PropModeReplace, (uchar *)&dummy, 1 ); - XSetCloseDownMode( appDpy, RetainPermanent ); - } - } - if ( data ) - XFree( (char *)data ); -} - -void qt_updated_rootinfo() -{ - app_save_rootinfo = TRUE; -} - -bool qt_wstate_iconified( WId winid ) -{ - Atom type; - int format; - unsigned long length, after; - uchar *data; - int r = XGetWindowProperty( appDpy, winid, qt_wm_state, 0, 2, - False, AnyPropertyType, &type, &format, - &length, &after, &data ); - bool iconic = FALSE; - if ( r == Success && data && format == 32 ) { - // TQ_UINT32 *wstate = (TQ_UINT32*)data; - unsigned long *wstate = (unsigned long *) data; - iconic = (*wstate == IconicState ); - XFree( (char *)data ); - } - return iconic; -} - -const char *tqAppName() // get application name -{ - return appName; -} - -const char *tqAppClass() // get application class -{ - return appClass; -} - -Display *qt_xdisplay() // get current X display -{ - return appDpy; -} - -int qt_xscreen() // get current X screen -{ - return appScreen; -} - -// ### REMOVE 4.0 -WId qt_xrootwin() // get X root window -{ - return TQPaintDevice::x11AppRootWindow(); -} - -WId qt_xrootwin( int scrn ) // get X root window for screen -{ - return TQPaintDevice::x11AppRootWindow( scrn ); -} - -bool qt_nograb() // application no-grab option -{ -#if defined(TQT_DEBUG) - return appNoGrab; -#else - return FALSE; -#endif -} - -static GC create_gc( int scrn, bool monochrome ) -{ - GC gc; - if ( monochrome ) { - Pixmap pm = XCreatePixmap( appDpy, RootWindow( appDpy, scrn ), 8, 8, 1 ); - gc = XCreateGC( appDpy, pm, 0, 0 ); - XFreePixmap( appDpy, pm ); - } else { - if ( TQPaintDevice::x11AppDefaultVisual( scrn ) ) { - gc = XCreateGC( appDpy, RootWindow( appDpy, scrn ), 0, 0 ); - } else { - Window w; - XSetWindowAttributes a; - a.background_pixel = TQt::black.pixel( scrn ); - a.border_pixel = TQt::black.pixel( scrn ); - a.colormap = TQPaintDevice::x11AppColormap( scrn ); - w = XCreateWindow( appDpy, RootWindow( appDpy, scrn ), 0, 0, 100, 100, - 0, TQPaintDevice::x11AppDepth( scrn ), InputOutput, - (Visual*)TQPaintDevice::x11AppVisual( scrn ), - CWBackPixel|CWBorderPixel|CWColormap, &a ); - gc = XCreateGC( appDpy, w, 0, 0 ); - XDestroyWindow( appDpy, w ); - } - } - XSetGraphicsExposures( appDpy, gc, False ); - return gc; -} - -GC qt_xget_readonly_gc( int scrn, bool monochrome ) // get read-only GC -{ - if ( scrn < 0 || scrn >= appScreenCount ) { - qDebug("invalid screen %d %d", scrn, appScreenCount ); - TQWidget* bla = 0; - bla->setName("hello"); - } - GC gc; - if ( monochrome ) { - if ( !app_gc_ro_m ) // create GC for bitmap - memset( (app_gc_ro_m = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); - if ( !app_gc_ro_m[scrn] ) - app_gc_ro_m[scrn] = create_gc( scrn, TRUE ); - gc = app_gc_ro_m[scrn]; - } else { // create standard GC - if ( !app_gc_ro ) - memset( (app_gc_ro = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); - if ( !app_gc_ro[scrn] ) - app_gc_ro[scrn] = create_gc( scrn, FALSE ); - gc = app_gc_ro[scrn]; - } - return gc; -} - -GC qt_xget_temp_gc( int scrn, bool monochrome ) // get temporary GC -{ - if ( scrn < 0 || scrn >= appScreenCount ) { - qDebug("invalid screen (tmp) %d %d", scrn, appScreenCount ); - TQWidget* bla = 0; - bla->setName("hello"); - } - GC gc; - if ( monochrome ) { - if ( !app_gc_tmp_m ) // create GC for bitmap - memset( (app_gc_tmp_m = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); - if ( !app_gc_tmp_m[scrn] ) - app_gc_tmp_m[scrn] = create_gc( scrn, TRUE ); - gc = app_gc_tmp_m[scrn]; - } else { // create standard GC - if ( !app_gc_tmp ) - memset( (app_gc_tmp = new GC[appScreenCount]), 0, appScreenCount * sizeof( GC ) ); - if ( !app_gc_tmp[scrn] ) - app_gc_tmp[scrn] = create_gc( scrn, FALSE ); - gc = app_gc_tmp[scrn]; - } - return gc; -} - - -/***************************************************************************** - Platform specific TQApplication members - *****************************************************************************/ - -/*! - \fn TQWidget *TQApplication::mainWidget() const - - Returns the main application widget, or 0 if there is no main - widget. - - \sa setMainWidget() -*/ - -/*! - Sets the application's main widget to \a mainWidget. - - In most respects the main widget is like any other widget, except - that if it is closed, the application exits. Note that - TQApplication does \e not take ownership of the \a mainWidget, so - if you create your main widget on the heap you must delete it - yourself. - - You need not have a main widget; connecting lastWindowClosed() to - quit() is an alternative. - - For X11, this function also resizes and moves the main widget - according to the \e -tqgeometry command-line option, so you should - set the default tqgeometry (using \l TQWidget::setGeometry()) before - calling setMainWidget(). - - \sa mainWidget(), exec(), quit() -*/ - -void TQApplication::setMainWidget( TQWidget *mainWidget ) -{ -#if defined(TQT_CHECK_STATE) - if ( mainWidget && mainWidget->parentWidget() && - ! mainWidget->parentWidget()->isDesktop() ) - qWarning( "TQApplication::setMainWidget(): New main widget (%s/%s) " - "has a parent!", - mainWidget->className(), mainWidget->name() ); -#endif - main_widget = mainWidget; - if ( main_widget ) { // give WM command line - XSetWMProperties( main_widget->x11Display(), main_widget->winId(), - 0, 0, app_argv, app_argc, 0, 0, 0 ); - if ( mwTitle ) - XStoreName( main_widget->x11Display(), main_widget->winId(), (char*)mwTitle ); - if ( mwGeometry ) { // parse tqgeometry - int x, y; - int w, h; - int m = XParseGeometry( (char*)mwGeometry, &x, &y, (uint*)&w, (uint*)&h ); - TQSize minSize = main_widget->tqminimumSize(); - TQSize maxSize = main_widget->tqmaximumSize(); - if ( (m & XValue) == 0 ) - x = main_widget->tqgeometry().x(); - if ( (m & YValue) == 0 ) - y = main_widget->tqgeometry().y(); - if ( (m & WidthValue) == 0 ) - w = main_widget->width(); - if ( (m & HeightValue) == 0 ) - h = main_widget->height(); - w = TQMIN(w,maxSize.width()); - h = TQMIN(h,maxSize.height()); - w = TQMAX(w,minSize.width()); - h = TQMAX(h,minSize.height()); - if ( (m & XNegative) ) { - x = desktop()->width() + x - w; - qt_widget_tlw_gravity = NorthEastGravity; - } - if ( (m & YNegative) ) { - y = desktop()->height() + y - h; - qt_widget_tlw_gravity = (m & XNegative) ? SouthEastGravity : SouthWestGravity; - } - main_widget->setGeometry( x, y, w, h ); - } - } -} - -#ifndef TQT_NO_CURSOR - -/***************************************************************************** - TQApplication cursor stack - *****************************************************************************/ - -extern void qt_x11_enforce_cursor( TQWidget * w ); - -typedef TQPtrList<TQCursor> TQCursorList; - -static TQCursorList *cursorStack = 0; - -/*! - \fn TQCursor *TQApplication::overrideCursor() - - Returns the active application override cursor. - - This function returns 0 if no application cursor has been defined - (i.e. the internal cursor stack is empty). - - \sa setOverrideCursor(), restoreOverrideCursor() -*/ - -/*! - Sets the application override cursor to \a cursor. - - Application override cursors are intended for showing the user - that the application is in a special state, for example during an - operation that might take some time. - - This cursor will be displayed in all the application's widgets - until restoreOverrideCursor() or another setOverrideCursor() is - called. - - Application cursors are stored on an internal stack. - setOverrideCursor() pushes the cursor onto the stack, and - restoreOverrideCursor() pops the active cursor off the stack. - Every setOverrideCursor() must eventually be followed by a - corresponding restoreOverrideCursor(), otherwise the stack will - never be emptied. - - If \a replace is TRUE, the new cursor will replace the last - override cursor (the stack keeps its depth). If \a replace is - FALSE, the new stack is pushed onto the top of the stack. - - Example: - \code - TQApplication::setOverrideCursor( TQCursor(TQt::WaitCursor) ); - calculateHugeMandelbrot(); // lunch time... - TQApplication::restoreOverrideCursor(); - \endcode - - \sa overrideCursor(), restoreOverrideCursor(), TQWidget::setCursor() -*/ - -void TQApplication::setOverrideCursor( const TQCursor &cursor, bool replace ) -{ - if ( !cursorStack ) { - cursorStack = new TQCursorList; - TQ_CHECK_PTR( cursorStack ); - cursorStack->setAutoDelete( TRUE ); - } - app_cursor = new TQCursor( cursor ); - TQ_CHECK_PTR( app_cursor ); - if ( replace ) - cursorStack->removeLast(); - cursorStack->append( app_cursor ); - - TQWidgetIntDictIt it( *((TQWidgetIntDict*)TQWidget::wmapper()) ); - register TQWidget *w; - while ( (w=it.current()) ) { // for all widgets that have - if ( w->testWState( WState_OwnCursor ) ) - qt_x11_enforce_cursor( w ); - ++it; - } - XFlush( appDpy ); // make X execute it NOW -} - -/*! - Undoes the last setOverrideCursor(). - - If setOverrideCursor() has been called twice, calling - restoreOverrideCursor() will activate the first cursor set. - Calling this function a second time restores the original widgets' - cursors. - - \sa setOverrideCursor(), overrideCursor(). -*/ - -void TQApplication::restoreOverrideCursor() -{ - if ( !cursorStack ) // no cursor stack - return; - cursorStack->removeLast(); - app_cursor = cursorStack->last(); - if ( TQWidget::wmapper() != 0 && !closingDown() ) { - TQWidgetIntDictIt it( *((TQWidgetIntDict*)TQWidget::wmapper()) ); - register TQWidget *w; - while ( (w=it.current()) ) { // set back to original cursors - if ( w->testWState( WState_OwnCursor ) ) - qt_x11_enforce_cursor( w ); - ++it; - } - XFlush( appDpy ); - } - if ( !app_cursor ) { - delete cursorStack; - cursorStack = 0; - } -} - -#endif - -/*! - \fn bool TQApplication::hasGlobalMouseTracking() - - Returns TRUE if global mouse tracking is enabled; otherwise - returns FALSE. - - \sa setGlobalMouseTracking() -*/ - -/*! - Enables global mouse tracking if \a enable is TRUE, or disables it - if \a enable is FALSE. - - Enabling global mouse tracking makes it possible for widget event - filters or application event filters to get all mouse move events, - even when no button is depressed. This is useful for special GUI - elements, e.g. tooltips. - - Global mouse tracking does not affect widgets and their - mouseMoveEvent(). For a widget to get mouse move events when no - button is depressed, it must do TQWidget::setMouseTracking(TRUE). - - This function uses an internal counter. Each - setGlobalMouseTracking(TRUE) must have a corresponding - setGlobalMouseTracking(FALSE): - \code - // at this point global mouse tracking is off - TQApplication::setGlobalMouseTracking( TRUE ); - TQApplication::setGlobalMouseTracking( TRUE ); - TQApplication::setGlobalMouseTracking( FALSE ); - // at this point it's still on - TQApplication::setGlobalMouseTracking( FALSE ); - // but now it's off - \endcode - - \sa hasGlobalMouseTracking(), TQWidget::hasMouseTracking() -*/ - -void TQApplication::setGlobalMouseTracking( bool enable ) -{ - bool tellAllWidgets; - if ( enable ) { - tellAllWidgets = (++app_tracking == 1); - } else { - tellAllWidgets = (--app_tracking == 0); - } - if ( tellAllWidgets ) { - TQWidgetIntDictIt it( *((TQWidgetIntDict*)TQWidget::wmapper()) ); - register TQWidget *w; - while ( (w=it.current()) ) { - if ( app_tracking > 0 ) { // switch on - if ( !w->testWState(WState_MouseTracking) ) { - w->setMouseTracking( TRUE ); - w->clearWState( WState_MouseTracking ); - } - } else { // switch off - if ( !w->testWState(WState_MouseTracking) ) { - w->setWState( WState_MouseTracking ); - w->setMouseTracking( FALSE ); - } - } - ++it; - } - } -} - - -/***************************************************************************** - Routines to find a TQt widget from a screen position - *****************************************************************************/ - -Window qt_x11_findClientWindow( Window win, Atom property, bool leaf ) -{ - Atom type = None; - int format, i; - ulong nitems, after; - uchar *data; - Window root, parent, target=0, *tqchildren=0; - uint ntqchildren; - if ( XGetWindowProperty( appDpy, win, property, 0, 0, FALSE, AnyPropertyType, - &type, &format, &nitems, &after, &data ) == Success ) { - if ( data ) - XFree( (char *)data ); - if ( type ) - return win; - } - if ( !XQueryTree(appDpy,win,&root,&parent,&tqchildren,&ntqchildren) ) { - if ( tqchildren ) - XFree( (char *)tqchildren ); - return 0; - } - for ( i=ntqchildren-1; !target && i >= 0; i-- ) - target = qt_x11_findClientWindow( tqchildren[i], property, leaf ); - if ( tqchildren ) - XFree( (char *)tqchildren ); - return target; -} - - -/*! - Returns a pointer to the widget at global screen position \a - (x, y), or 0 if there is no TQt widget there. - - If \a child is FALSE and there is a child widget at position \a - (x, y), the top-level widget containing it is returned. If \a child - is TRUE the child widget at position \a (x, y) is returned. - - This function is normally rather slow. - - \sa TQCursor::pos(), TQWidget::grabMouse(), TQWidget::grabKeyboard() -*/ - -TQWidget *TQApplication::widgetAt( int x, int y, bool child ) -{ - int screen = TQCursor::x11Screen(); - int lx, ly; - - Window target; - if ( !XTranslateCoordinates(appDpy, - TQPaintDevice::x11AppRootWindow(screen), - TQPaintDevice::x11AppRootWindow(screen), - x, y, &lx, &ly, &target) ) { - return 0; - } - if ( !target || target == TQPaintDevice::x11AppRootWindow(screen) ) - return 0; - TQWidget *w, *c; - w = TQWidget::find( (WId)target ); - - if ( !w ) { - qt_ignore_badwindow(); - target = qt_x11_findClientWindow( target, qt_wm_state, TRUE ); - if (qt_badwindow() ) - return 0; - w = TQWidget::find( (WId)target ); -#if 0 - if ( !w ) { - // Perhaps the widgets at (x,y) is inside a foreign application? - // Search all toplevel widgets to see if one is within target - TQWidgetList *list = tqtopLevelWidgets(); - TQWidget *widget = list->first(); - while ( widget && !w ) { - Window ctarget = target; - if ( widget->isVisible() && !widget->isDesktop() ) { - Window wid = widget->winId(); - while ( ctarget && !w ) { - XTranslateCoordinates(appDpy, - TQPaintDevice::x11AppRootWindow(screen), - ctarget, x, y, &lx, &ly, &ctarget); - if ( ctarget == wid ) { - // Found - w = widget; - XTranslateCoordinates(appDpy, - TQPaintDevice::x11AppRootWindow(screen), - ctarget, x, y, &lx, &ly, &ctarget); - } - } - } - widget = list->next(); - } - delete list; - } -#endif - } - if ( child && w ) { - if ( (c = w->tqchildAt( w->mapFromGlobal(TQPoint(x, y ) ) ) ) ) - return c; - } - return w; -} - -/*! - \overload TQWidget *TQApplication::widgetAt( const TQPoint &pos, bool child ) - - Returns a pointer to the widget at global screen position \a pos, - or 0 if there is no TQt widget there. - - If \a child is FALSE and there is a child widget at position \a - pos, the top-level widget containing it is returned. If \a child - is TRUE the child widget at position \a pos is returned. -*/ - - -/*! - Flushes the X event queue in the X11 implementation. This normally - returns almost immediately. Does nothing on other platforms. - - \sa syncX() -*/ - -void TQApplication::flushX() -{ - if ( appDpy ) - XFlush( appDpy ); -} - -/*! - Flushes the window system specific event queues. - - If you are doing graphical changes inside a loop that does not - return to the event loop on asynchronous window systems like X11 - or double buffered window systems like MacOS X, and you want to - visualize these changes immediately (e.g. Splash Screens), call - this function. - - \sa flushX() sendPostedEvents() TQPainter::flush() -*/ - -void TQApplication::flush() -{ - flushX(); -} - -/*! - Synchronizes with the X server in the X11 implementation. This - normally takes some time. Does nothing on other platforms. - - \sa flushX() -*/ - -void TQApplication::syncX() -{ - if ( appDpy ) - XSync( appDpy, False ); // don't discard events -} - - -/*! - Sounds the bell, using the default volume and sound. -*/ - -void TQApplication::beep() -{ - if ( appDpy ) - XBell( appDpy, 0 ); -} - - - -/***************************************************************************** - Special lookup functions for windows that have been reparented recently - *****************************************************************************/ - -static TQWidgetIntDict *wPRmapper = 0; // alternative widget mapper - -void qPRCreate( const TQWidget *widget, Window oldwin ) -{ // TQWidget::reparent mechanism - if ( !wPRmapper ) { - wPRmapper = new TQWidgetIntDict; - TQ_CHECK_PTR( wPRmapper ); - } - wPRmapper->insert( (long)oldwin, widget ); // add old window to mapper - TQETWidget *w = (TQETWidget *)widget; - w->setWState( TQt::WState_Reparented ); // set reparented flag -} - -void qPRCleanup( TQWidget *widget ) -{ - TQETWidget *etw = (TQETWidget *)widget; - if ( !(wPRmapper && etw->testWState(TQt::WState_Reparented)) ) - return; // not a reparented widget - TQWidgetIntDictIt it(*wPRmapper); - TQWidget *w; - while ( (w=it.current()) ) { - int key = it.currentKey(); - ++it; - if ( w == etw ) { // found widget - etw->clearWState( TQt::WState_Reparented ); // clear flag - wPRmapper->remove( key );// old window no longer needed - if ( wPRmapper->count() == 0 ) { // became empty - delete wPRmapper; // then reset alt mapper - wPRmapper = 0; - return; - } - } - } -} - -static TQETWidget *qPRFindWidget( Window oldwin ) -{ - return wPRmapper ? (TQETWidget*)wPRmapper->find((long)oldwin) : 0; -} - -/*! - \internal -*/ -int TQApplication::x11ClientMessage(TQWidget* w, XEvent* event, bool passive_only) -{ - TQETWidget *widget = (TQETWidget*)w; - if ( event->xclient.format == 32 && event->xclient.message_type ) { - if ( event->xclient.message_type == qt_wm_protocols ) { - Atom a = event->xclient.data.l[0]; - if ( a == qt_wm_delete_window ) { - if ( passive_only ) return 0; - widget->translateCloseEvent(event); - } - else if ( a == qt_wm_take_focus ) { - TQWidget * amw = activeModalWidget(); - if ( (ulong) event->xclient.data.l[1] > GET_QT_X_TIME() ) - GET_QT_X_TIME() = event->xclient.data.l[1]; - if ( amw && amw != widget ) { - TQWidget* groupLeader = widget; - while ( groupLeader && !groupLeader->testWFlags( TQt::WGroupLeader ) - && groupLeader != amw ) - groupLeader = groupLeader->parentWidget(); - if ( !groupLeader ) { - TQWidget *p = amw->parentWidget(); - while (p && p != widget) - p = p->parentWidget(); - if (!p || !qt_net_supported_list) - amw->raise(); // help broken window managers - amw->setActiveWindow(); - } - } -#ifndef TQT_NO_WHATSTHIS - } else if ( a == qt_net_wm_context_help ) { - TQWhatsThis::enterWhatsThisMode(); -#endif // TQT_NO_WHATSTHIS - } else if ( a == qt_net_wm_ping ) { - // avoid send/reply loops - Window root = TQPaintDevice::x11AppRootWindow( w->x11Screen() ); - if (event->xclient.window != root) { - event->xclient.window = root; - XSendEvent( event->xclient.display, event->xclient.window, - False, SubstructureNotifyMask|SubstructureRedirectMask, event ); - } -#ifndef TQT_NO_XSYNC - } else if (a == qt_net_wm_sync_request ) { - widget->handleSyncRequest( event ); -#endif - } - } else if ( event->xclient.message_type == qt_qt_scrolldone ) { - widget->translateScrollDoneEvent(event); - } else if ( event->xclient.message_type == qt_xdnd_position ) { - qt_handle_xdnd_position( widget, event, passive_only ); - } else if ( event->xclient.message_type == qt_xdnd_enter ) { - qt_handle_xdnd_enter( widget, event, passive_only ); - } else if ( event->xclient.message_type == qt_xdnd_status ) { - qt_handle_xdnd_status( widget, event, passive_only ); - } else if ( event->xclient.message_type == qt_xdnd_leave ) { - qt_handle_xdnd_leave( widget, event, passive_only ); - } else if ( event->xclient.message_type == qt_xdnd_drop ) { - qt_handle_xdnd_drop( widget, event, passive_only ); - } else if ( event->xclient.message_type == qt_xdnd_finished ) { - qt_handle_xdnd_finished( widget, event, passive_only ); - } else { - if ( passive_only ) return 0; - // All other are interactions - } - } else { - qt_motifdnd_handle_msg( widget, event, passive_only ); - } - - return 0; -} - -/*! - This function does the core processing of individual X - \a{event}s, normally by dispatching TQt events to the right - destination. - - It returns 1 if the event was consumed by special handling, 0 if - the \a event was consumed by normal handling, and -1 if the \a - event was for an unrecognized widget. - - \sa x11EventFilter() -*/ -int TQApplication::x11ProcessEvent( XEvent* event ) -{ - switch ( event->type ) { - case ButtonPress: - ignoreNextMouseReleaseEvent = FALSE; - SET_QT_X_USER_TIME(event->xbutton.time); - // fallthrough intended - case ButtonRelease: - SET_QT_X_TIME(event->xbutton.time); - break; - case MotionNotify: - SET_QT_X_TIME(event->xmotion.time); - break; - case XKeyPress: - SET_QT_X_USER_TIME(event->xkey.time); - // fallthrough intended - case XKeyRelease: - SET_QT_X_TIME(event->xkey.time); - break; - case PropertyNotify: - SET_QT_X_TIME(event->xproperty.time); - break; - case EnterNotify: - case LeaveNotify: - SET_QT_X_TIME(event->xcrossing.time); - break; - case SelectionClear: - SET_QT_X_TIME(event->xselectionclear.time); - break; - default: - break; - } - - TQETWidget *widget = (TQETWidget*)TQWidget::find( (WId)event->xany.window ); - - if ( wPRmapper ) { // just did a widget reparent? - if ( widget == 0 ) { // not in std widget mapper - switch ( event->type ) { // only for mouse/key events - case ButtonPress: - case ButtonRelease: - case MotionNotify: - case XKeyPress: - case XKeyRelease: - widget = qPRFindWidget( event->xany.window ); - break; - } - } - else if ( widget->testWState(WState_Reparented) ) - qPRCleanup( widget ); // remove from alt mapper - } - - TQETWidget *keywidget=0; - bool grabbed=FALSE; - if ( event->type==XKeyPress || event->type==XKeyRelease ) { - keywidget = (TQETWidget*)TQWidget::keyboardGrabber(); - if ( keywidget ) { - grabbed = TRUE; - } else { - if ( focus_widget ) - keywidget = (TQETWidget*)focus_widget; - if ( !keywidget ) { - if ( inPopupMode() ) // no focus widget, see if we have a popup - keywidget = (TQETWidget*) activePopupWidget(); - else if ( widget ) - keywidget = (TQETWidget*)widget->tqtopLevelWidget(); - } - } - } - -#ifndef TQT_NO_IM - // Filtering input events by the input context. It has to be taken - // place before any other key event consumers such as eventfilters - // and accelerators because some input methods require quite - // various key combination and sequences. It often conflicts with - // accelerators and so on, so we must give the input context the - // filtering opportunity first to ensure all input methods work - // properly regardless of application design. - -// #ifndef TQT_NO_IM_EXTENSIONS - if( keywidget && keywidget->isEnabled() && keywidget->isInputMethodEnabled() ) { -// #else -// if( keywidget && keywidget->isEnabled() ) { -// #endif - if( ( event->type==XKeyPress || event->type==XKeyRelease ) && - sm_blockUserInput ) // block user interaction during session management - return TRUE; - - // for XIM handling - TQInputContext *qic = keywidget->getInputContext(); - if( qic && qic->x11FilterEvent( keywidget, event ) ) - return TRUE; - - // filterEvent() accepts TQEvent *event rather than preexpanded key - // event attribute values. This is intended to pass other IM-related - // events in future. The IM-related events are supposed as - // TQWheelEvent, TQTabletEvent and so on. Other non IM-related events - // should not be forwarded to input contexts to prevent weird event - // handling. - if ( ( event->type == XKeyPress || event->type == XKeyRelease ) ) { - int code = -1; - int count = 0; - int state; - char ascii = 0; - TQEvent::Type type; - TQString text; - - keywidget->translateKeyEventInternal( event, count, text, - state, ascii, code, type, - FALSE, FALSE ); - - // both key press/release is required for some complex - // input methods. don't eliminate anything. - TQKeyEvent keyevent( type, code, ascii, state, text, FALSE, count ); - - if( qic && qic->filterEvent( &keyevent ) ) - return TRUE; - } - } else -#endif // TQT_NO_IM - { - if ( XFilterEvent( event, None ) ) - return TRUE; - } - - if ( qt_x11EventFilter(event) ) // send through app filter - return 1; - - if ( event->type == MappingNotify ) { // keyboard mapping changed - XRefreshKeyboardMapping( &event->xmapping ); - return 0; - } - - if ( event->type == PropertyNotify ) { // some properties changed - if ( event->xproperty.window == TQPaintDevice::x11AppRootWindow( 0 ) ) { - // root properties for the first screen - if ( event->xproperty.atom == qt_clipboard_sentinel ) { - if (qt_check_clipboard_sentinel() ) - emit clipboard()->dataChanged(); - } else if ( event->xproperty.atom == qt_selection_sentinel ) { - if (qt_check_selection_sentinel() ) - emit clipboard()->selectionChanged(); - } else if ( obey_desktop_settings ) { - if ( event->xproperty.atom == qt_resource_manager ) - qt_set_x11_resources(); - else if ( event->xproperty.atom == qt_settings_timestamp ) - TQApplication::x11_apply_settings(); - } - } - if ( event->xproperty.window == TQPaintDevice::x11AppRootWindow() ) { - // root properties for the default screen - if ( event->xproperty.atom == qt_input_encoding ) { - qt_set_input_encoding(); - } else if ( event->xproperty.atom == qt_net_supported ) { - qt_get_net_supported(); - } else if ( event->xproperty.atom == qt_net_virtual_roots ) { - qt_get_net_virtual_roots(); - } else if ( event->xproperty.atom == qt_net_workarea ) { - qt_desktopwidget_update_workarea(); - } - } else if ( widget ) { - widget->translatePropertyEvent(event); - } else { - return -1; // don't know this window - } - return 0; - } - - if ( !widget ) { // don't know this windows - TQWidget* popup = TQApplication::activePopupWidget(); - if ( popup ) { - - /* - That is more than suboptimal. The real solution should - do some keyevent and buttonevent translation, so that - the popup still continues to work as the user expects. - Unfortunately this translation is currently only - possible with a known widget. I'll change that soon - (Matthias). - */ - - // Danger - make sure we don't lock the server - switch ( event->type ) { - case ButtonPress: - case ButtonRelease: - case XKeyPress: - case XKeyRelease: - do { - popup->close(); - } while ( (popup = tqApp->activePopupWidget()) ); - return 1; - } - } - return -1; - } - - if ( event->type == XKeyPress || event->type == XKeyRelease ) - widget = keywidget; // send XKeyEvents through keywidget->x11Event() - - if ( app_do_modal ) // modal event handling - if ( !qt_try_modal(widget, event) ) { - if ( event->type == ClientMessage ) - x11ClientMessage( widget, event, TRUE ); - return 1; - } - - - if ( widget->x11Event(event) ) // send through widget filter - return 1; -#if defined (TQT_TABLET_SUPPORT) - if ( event->type == xinput_motion || - event->type == xinput_button_release || - event->type == xinput_button_press ) { - widget->translateXinputEvent( event ); - return 0; - } -#endif - -#ifndef TQT_NO_XRANDR - if (event->type == xrandr_eventbase + RRScreenChangeNotify - || ( event->type == ConfigureNotify && event->xconfigure.window == TQPaintDevice::x11AppRootWindow())) { - // update Xlib internals with the latest screen configuration - XRRUpdateConfiguration(event); - - // update the size for desktop widget - int scr = XRRRootToScreen( appDpy, event->xany.window ); - TQWidget *w = desktop()->screen( scr ); - TQSize oldSize( w->size() ); - w->crect.setWidth( DisplayWidth( appDpy, scr ) ); - w->crect.setHeight( DisplayHeight( appDpy, scr ) ); - if ( w->size() != oldSize ) { - TQResizeEvent e( w->size(), oldSize ); - TQApplication::sendEvent( w, &e ); - emit desktop()->resized( scr ); - } - } -#endif // TQT_NO_XRANDR - - switch ( event->type ) { - - case ButtonRelease: // mouse event - if ( ignoreNextMouseReleaseEvent ) { - ignoreNextMouseReleaseEvent = FALSE; - break; - } - // fall through intended - case ButtonPress: - if (event->xbutton.root != RootWindow(widget->x11Display(), widget->x11Screen()) - && ! qt_xdnd_dragging) { - while ( activePopupWidget() ) - activePopupWidget()->close(); - return 1; - } - if (event->type == ButtonPress) - qt_net_update_user_time(widget->tqtopLevelWidget()); - // fall through intended - case MotionNotify: -#if defined(TQT_TABLET_SUPPORT) - if ( !chokeMouse ) { -#endif - widget->translateMouseEvent( event ); -#if defined(TQT_TABLET_SUPPORT) - } else { - chokeMouse = FALSE; - } -#endif - break; - - case XKeyPress: // keyboard event - qt_net_update_user_time(widget->tqtopLevelWidget()); - // fallthrough intended - case XKeyRelease: - { - if ( keywidget && keywidget->isEnabled() ) { // should always exist - // qDebug( "sending key event" ); - keywidget->translateKeyEvent( event, grabbed ); - } - break; - } - - case GraphicsExpose: - case Expose: // paint event - widget->translatePaintEvent( event ); - break; - - case ConfigureNotify: // window move/resize event - if ( event->xconfigure.event == event->xconfigure.window ) - widget->translateConfigEvent( event ); - break; - - case XFocusIn: { // got focus - if ( widget->isDesktop() ) - break; - if ( inPopupMode() ) // some delayed focus event to ignore - break; - if ( !widget->isTopLevel() ) - break; - if ( event->xfocus.detail != NotifyAncestor && - event->xfocus.detail != NotifyInferior && - event->xfocus.detail != NotifyNonlinear ) - break; - widget->createInputContext(); - setActiveWindow( widget ); - if ( qt_focus_model == FocusModel_PointerRoot ) { - // We got real input focus from somewhere, but we were in PointerRoot - // mode, so we don't trust this event. Check the focus model to make - // sure we know what focus mode we are using... - qt_check_focus_model(); - } - } - break; - - case XFocusOut: // lost focus - if ( widget->isDesktop() ) - break; - if ( !widget->isTopLevel() ) - break; - if ( event->xfocus.mode == NotifyGrab ) - qt_xfocusout_grab_counter++; - if ( event->xfocus.mode != NotifyNormal ) - break; - if ( event->xfocus.detail != NotifyAncestor && - event->xfocus.detail != NotifyNonlinearVirtual && - event->xfocus.detail != NotifyNonlinear ) - break; - if ( !inPopupMode() && widget == active_window ) - setActiveWindow( 0 ); - break; - - case EnterNotify: { // enter window - if ( TQWidget::mouseGrabber() && widget != TQWidget::mouseGrabber() ) - break; - if ( inPopupMode() && widget->tqtopLevelWidget() != activePopupWidget() ) - break; - if ( event->xcrossing.mode != NotifyNormal || - event->xcrossing.detail == NotifyVirtual || - event->xcrossing.detail == NotifyNonlinearVirtual ) - break; - if ( event->xcrossing.focus && - !widget->isDesktop() && !widget->isActiveWindow() ) { - if ( qt_focus_model == FocusModel_Unknown ) // check focus model - qt_check_focus_model(); - if ( qt_focus_model == FocusModel_PointerRoot ) // PointerRoot mode - setActiveWindow( widget ); - } - qt_dispatchEnterLeave( widget, TQWidget::find( curWin ) ); - curWin = widget->winId(); - widget->translateMouseEvent( event ); //we don't get MotionNotify, emulate it - } - break; - - case LeaveNotify: { // leave window - if ( TQWidget::mouseGrabber() && widget != TQWidget::mouseGrabber() ) - break; - if ( curWin && widget->winId() != curWin ) - break; - if ( event->xcrossing.mode != NotifyNormal ) - break; - if ( !widget->isDesktop() ) - widget->translateMouseEvent( event ); //we don't get MotionNotify, emulate it - - TQWidget* enter = 0; - XEvent ev; - while ( XCheckMaskEvent( widget->x11Display(), EnterWindowMask | LeaveWindowMask , &ev ) - && !qt_x11EventFilter( &ev )) { - TQWidget* event_widget = TQWidget::find( ev.xcrossing.window ); - if( event_widget && event_widget->x11Event( &ev ) ) - break; - if ( ev.type == LeaveNotify && ev.xcrossing.mode == NotifyNormal ){ - enter = event_widget; - XPutBackEvent( widget->x11Display(), &ev ); - break; - } - if ( ev.xcrossing.mode != NotifyNormal || - ev.xcrossing.detail == NotifyVirtual || - ev.xcrossing.detail == NotifyNonlinearVirtual ) - continue; - enter = event_widget; - if ( ev.xcrossing.focus && - enter && !enter->isDesktop() && !enter->isActiveWindow() ) { - if ( qt_focus_model == FocusModel_Unknown ) // check focus model - qt_check_focus_model(); - if ( qt_focus_model == FocusModel_PointerRoot ) // PointerRoot mode - setActiveWindow( enter ); - } - break; - } - - if ( ( ! enter || enter->isDesktop() ) && - event->xcrossing.focus && widget == active_window && - qt_focus_model == FocusModel_PointerRoot // PointerRoot mode - ) { - setActiveWindow( 0 ); - } - - if ( !curWin ) - qt_dispatchEnterLeave( widget, 0 ); - - qt_dispatchEnterLeave( enter, widget ); - curWin = enter ? enter->winId() : 0; - } - break; - - case UnmapNotify: // window hidden - if ( widget->isTopLevel() && widget->isShown() ) { - widget->topData()->spont_unmapped = 1; - TQHideEvent e; - TQApplication::sendSpontaneousEvent( widget, &e ); - widget->hideChildren( TRUE ); - } - break; - - case MapNotify: // window shown - if ( widget->isTopLevel() && - widget->topData()->spont_unmapped ) { - widget->topData()->spont_unmapped = 0; - widget->showChildren( TRUE ); - TQShowEvent e; - TQApplication::sendSpontaneousEvent( widget, &e ); - } - break; - - case ClientMessage: // client message - return x11ClientMessage(widget,event,False); - - case ReparentNotify: // window manager reparents - while ( XCheckTypedWindowEvent( widget->x11Display(), - widget->winId(), - ReparentNotify, - event ) ) - ; // skip old reparent events - if ( event->xreparent.parent == TQPaintDevice::x11AppRootWindow() ) { - if ( widget->isTopLevel() ) { - widget->topData()->parentWinId = event->xreparent.parent; - if ( qt_deferred_map_contains( widget ) ) { - qt_deferred_map_take( widget ); - XMapWindow( appDpy, widget->winId() ); - } - } - } else - // store the parent. Useful for many things, embedding for instance. - widget->topData()->parentWinId = event->xreparent.parent; - if ( widget->isTopLevel() ) { - // the widget frame strut should also be invalidated - widget->topData()->fleft = widget->topData()->fright = - widget->topData()->ftop = widget->topData()->fbottom = 0; - - if ( qt_focus_model != FocusModel_Unknown ) { - // toplevel reparented... - TQWidget *newparent = TQWidget::find( event->xreparent.parent ); - if ( ! newparent || newparent->isDesktop() ) { - // we dont' know about the new parent (or we've been - // reparented to root), perhaps a window manager - // has been (re)started? reset the focus model to unknown - qt_focus_model = FocusModel_Unknown; - } - } - } - break; - - case SelectionRequest: { - XSelectionRequestEvent *req = &event->xselectionrequest; - if (! req) - break; - - if ( qt_xdnd_selection && req->selection == qt_xdnd_selection ) { - qt_xdnd_handle_selection_request( req ); - - } else if (qt_clipboard) { - TQCustomEvent e( TQEvent::Clipboard, event ); - TQApplication::sendSpontaneousEvent( qt_clipboard, &e ); - } - break; - } - case SelectionClear: { - XSelectionClearEvent *req = &event->xselectionclear; - // don't deliver dnd events to the clipboard, it gets confused - if (! req || qt_xdnd_selection && req->selection == qt_xdnd_selection) - break; - - if (qt_clipboard) { - TQCustomEvent e( TQEvent::Clipboard, event ); - TQApplication::sendSpontaneousEvent( qt_clipboard, &e ); - } - break; - } - - case SelectionNotify: { - XSelectionEvent *req = &event->xselection; - // don't deliver dnd events to the clipboard, it gets confused - if (! req || qt_xdnd_selection && req->selection == qt_xdnd_selection) - break; - - if (qt_clipboard) { - TQCustomEvent e( TQEvent::Clipboard, event ); - TQApplication::sendSpontaneousEvent( qt_clipboard, &e ); - } - break; - } - - default: - break; - } - - return 0; -} - -/*! - This virtual function is only implemented under X11. - - If you create an application that inherits TQApplication and - reimplement this function, you get direct access to all X events - that the are received from the X server. - - Return TRUE if you want to stop the event from being processed. - Return FALSE for normal event dispatching. - - \sa x11ProcessEvent() -*/ - -bool TQApplication::x11EventFilter( XEvent * ) -{ - return FALSE; -} - - - -/***************************************************************************** - Modal widgets; Since Xlib has little support for this we roll our own - modal widget mechanism. - A modal widget without a parent becomes application-modal. - A modal widget with a parent becomes modal to its parent and grandparents.. - - qt_enter_modal() - Enters modal state - Arguments: - TQWidget *widget A modal widget - - qt_leave_modal() - Leaves modal state for a widget - Arguments: - TQWidget *widget A modal widget - *****************************************************************************/ - -bool qt_modal_state() -{ - return app_do_modal; -} - -void qt_enter_modal( TQWidget *widget ) -{ - if ( !qt_modal_stack ) { // create modal stack - qt_modal_stack = new TQWidgetList; - TQ_CHECK_PTR( qt_modal_stack ); - } - if (widget->parentWidget()) { - TQEvent e(TQEvent::WindowBlocked); - TQApplication::sendEvent(widget->parentWidget(), &e); - } - - qt_dispatchEnterLeave( 0, TQWidget::find((WId)curWin) ); - qt_modal_stack->insert( 0, widget ); - app_do_modal = TRUE; - curWin = 0; - ignoreNextMouseReleaseEvent = FALSE; -} - - -void qt_leave_modal( TQWidget *widget ) -{ - if ( qt_modal_stack && qt_modal_stack->removeRef(widget) ) { - if ( qt_modal_stack->isEmpty() ) { - delete qt_modal_stack; - qt_modal_stack = 0; - TQPoint p( TQCursor::pos() ); - TQWidget* w = TQApplication::widgetAt( p.x(), p.y(), TRUE ); - qt_dispatchEnterLeave( w, TQWidget::find( curWin ) ); // send synthetic enter event - curWin = w? w->winId() : 0; - } - } - app_do_modal = qt_modal_stack != 0; - ignoreNextMouseReleaseEvent = TRUE; - - if (widget->parentWidget()) { - TQEvent e(TQEvent::WindowUnblocked); - TQApplication::sendEvent(widget->parentWidget(), &e); - } -} - - -bool qt_try_modal( TQWidget *widget, XEvent *event ) -{ - if (qt_xdnd_dragging) { - // allow mouse events while DnD is active - switch (event->type) { - case ButtonPress: - case ButtonRelease: - case MotionNotify: - return TRUE; - default: - break; - } - } - - if ( qt_tryModalHelper( widget ) ) - return TRUE; - - bool block_event = FALSE; - switch ( event->type ) { - case ButtonPress: // disallow mouse/key events - case ButtonRelease: - case MotionNotify: - case XKeyPress: - case XKeyRelease: - case EnterNotify: - case LeaveNotify: - case ClientMessage: - block_event = TRUE; - break; - default: - break; - } - - return !block_event; -} - - -/***************************************************************************** - Popup widget mechanism - - openPopup() - Adds a widget to the list of popup widgets - Arguments: - TQWidget *widget The popup widget to be added - - closePopup() - Removes a widget from the list of popup widgets - Arguments: - TQWidget *widget The popup widget to be removed - *****************************************************************************/ - - -static int openPopupCount = 0; -void TQApplication::openPopup( TQWidget *popup ) -{ - openPopupCount++; - if ( !popupWidgets ) { // create list - popupWidgets = new TQWidgetList; - TQ_CHECK_PTR( popupWidgets ); - } - popupWidgets->append( popup ); // add to end of list - - if ( popupWidgets->count() == 1 && !qt_nograb() ){ // grab mouse/keyboard - int r = XGrabKeyboard( popup->x11Display(), popup->winId(), FALSE, - GrabModeSync, GrabModeAsync, CurrentTime ); - if ( (popupGrabOk = (r == GrabSuccess)) ) { - r = XGrabPointer( popup->x11Display(), popup->winId(), TRUE, - (uint)(ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | EnterWindowMask | - LeaveWindowMask | PointerMotionMask), - GrabModeSync, GrabModeAsync, - None, None, CurrentTime ); - - if ( (popupGrabOk = (r == GrabSuccess)) ) - XAllowEvents( popup->x11Display(), SyncPointer, CurrentTime ); - else - XUngrabKeyboard( popup->x11Display(), CurrentTime ); - } - } else if ( popupGrabOk ) { - XAllowEvents( popup->x11Display(), SyncPointer, CurrentTime ); - } - - // popups are not focus-handled by the window system (the first - // popup grabbed the keyboard), so we have to do that manually: A - // new popup gets the focus - TQFocusEvent::setReason( TQFocusEvent::Popup ); - if ( popup->tqfocusWidget()) - popup->tqfocusWidget()->setFocus(); - else - popup->setFocus(); - TQFocusEvent::resetReason(); -} - -void TQApplication::closePopup( TQWidget *popup ) -{ - if ( !popupWidgets ) - return; - popupWidgets->removeRef( popup ); - if (popup == popupOfPopupButtonFocus) { - popupButtonFocus = 0; - popupOfPopupButtonFocus = 0; - } - if ( popupWidgets->count() == 0 ) { // this was the last popup - popupCloseDownMode = TRUE; // control mouse events - delete popupWidgets; - popupWidgets = 0; - if ( !qt_nograb() && popupGrabOk ) { // grabbing not disabled - if ( mouseButtonState != 0 - || popup->tqgeometry(). contains(TQPoint(mouseGlobalXPos, mouseGlobalYPos) ) ) - { // mouse release event or inside - XAllowEvents( popup->x11Display(), AsyncPointer, - CurrentTime ); - } else { // mouse press event - mouseButtonPressTime -= 10000; // avoid double click - XAllowEvents( popup->x11Display(), ReplayPointer,CurrentTime ); - } - XUngrabPointer( popup->x11Display(), CurrentTime ); - XFlush( popup->x11Display() ); - } - if ( active_window ) { - TQFocusEvent::setReason( TQFocusEvent::Popup ); - if ( active_window->tqfocusWidget() ) - active_window->tqfocusWidget()->setFocus(); - else - active_window->setFocus(); - TQFocusEvent::resetReason(); - } - } else { - // popups are not focus-handled by the window system (the - // first popup grabbed the keyboard), so we have to do that - // manually: A popup was closed, so the previous popup gets - // the focus. - TQFocusEvent::setReason( TQFocusEvent::Popup ); - TQWidget* aw = popupWidgets->getLast(); - if (aw->tqfocusWidget()) - aw->tqfocusWidget()->setFocus(); - else - aw->setFocus(); - TQFocusEvent::resetReason(); - if ( popupWidgets->count() == 1 && !qt_nograb() ){ // grab mouse/keyboard - int r = XGrabKeyboard( aw->x11Display(), aw->winId(), FALSE, - GrabModeSync, GrabModeAsync, CurrentTime ); - if ( (popupGrabOk = (r == GrabSuccess)) ) { - r = XGrabPointer( aw->x11Display(), aw->winId(), TRUE, - (uint)(ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | EnterWindowMask | - LeaveWindowMask | PointerMotionMask), - GrabModeSync, GrabModeAsync, - None, None, CurrentTime ); - - if ( (popupGrabOk = (r == GrabSuccess)) ) - XAllowEvents( aw->x11Display(), SyncPointer, CurrentTime ); - } - } - } -} - -/***************************************************************************** - Event translation; translates X11 events to TQt events - *****************************************************************************/ - -// -// Mouse event translation -// -// Xlib doesn't give mouse double click events, so we generate them by -// comparing window, time and position between two mouse press events. -// - -// -// Keyboard event translation -// - -int qt_x11_translateButtonState( int s ) -{ - int bst = 0; - if ( s & Button1Mask ) - bst |= TQt::LeftButton; - if ( s & Button2Mask ) - bst |= TQt::MidButton; - if ( s & Button3Mask ) - bst |= TQt::RightButton; - if ( s & ShiftMask ) - bst |= TQt::ShiftButton; - if ( s & ControlMask ) - bst |= TQt::ControlButton; - if ( s & qt_alt_mask ) - bst |= TQt::AltButton; - if ( s & qt_meta_mask ) - bst |= TQt::MetaButton; - return bst; -} - -bool TQETWidget::translateMouseEvent( const XEvent *event ) -{ - static bool manualGrab = FALSE; - TQEvent::Type type; // event parameters - TQPoint pos; - TQPoint globalPos; - int button = 0; - int state; - XEvent nextEvent; - - if ( sm_blockUserInput ) // block user interaction during session management - return TRUE; - - static int x_root_save = -1, y_root_save = -1; - - if ( event->type == MotionNotify ) { // mouse move - if (event->xmotion.root != RootWindow(appDpy, x11Screen()) && - ! qt_xdnd_dragging ) - return FALSE; - - XMotionEvent lastMotion = event->xmotion; - while( XPending( appDpy ) ) { // compres mouse moves - XNextEvent( appDpy, &nextEvent ); - if ( nextEvent.type == ConfigureNotify - || nextEvent.type == PropertyNotify - || nextEvent.type == Expose - || nextEvent.type == NoExpose ) { - tqApp->x11ProcessEvent( &nextEvent ); - continue; - } else if ( nextEvent.type != MotionNotify || - nextEvent.xmotion.window != event->xmotion.window || - nextEvent.xmotion.state != event->xmotion.state ) { - XPutBackEvent( appDpy, &nextEvent ); - break; - } - if ( !qt_x11EventFilter(&nextEvent) - && !x11Event( &nextEvent ) ) // send event through filter - lastMotion = nextEvent.xmotion; - else - break; - } - type = TQEvent::MouseMove; - pos.rx() = lastMotion.x; - pos.ry() = lastMotion.y; - globalPos.rx() = lastMotion.x_root; - globalPos.ry() = lastMotion.y_root; - state = qt_x11_translateButtonState( lastMotion.state ); - if ( qt_button_down && (state & (LeftButton | - MidButton | - RightButton ) ) == 0 ) - qt_button_down = 0; - - // throw away mouse move events that are sent multiple times to the same - // position - bool throw_away = FALSE; - if ( x_root_save == globalPos.x() && - y_root_save == globalPos.y() ) - throw_away = TRUE; - x_root_save = globalPos.x(); - y_root_save = globalPos.y(); - if ( throw_away ) - return TRUE; - } else if ( event->type == EnterNotify || event->type == LeaveNotify) { - XEvent *xevent = (XEvent *)event; - //unsigned int xstate = event->xcrossing.state; - type = TQEvent::MouseMove; - pos.rx() = xevent->xcrossing.x; - pos.ry() = xevent->xcrossing.y; - globalPos.rx() = xevent->xcrossing.x_root; - globalPos.ry() = xevent->xcrossing.y_root; - state = qt_x11_translateButtonState( xevent->xcrossing.state ); - if ( qt_button_down && (state & (LeftButton | - MidButton | - RightButton ) ) == 0 ) - qt_button_down = 0; - if ( !qt_button_down ) - state = state & ~(LeftButton | MidButton | RightButton ); - } else { // button press or release - pos.rx() = event->xbutton.x; - pos.ry() = event->xbutton.y; - globalPos.rx() = event->xbutton.x_root; - globalPos.ry() = event->xbutton.y_root; - state = qt_x11_translateButtonState( event->xbutton.state ); - switch ( event->xbutton.button ) { - case Button1: button = LeftButton; break; - case Button2: button = MidButton; break; - case Button3: button = RightButton; break; - case Button4: - case Button5: - case 6: - case 7: - // the fancy mouse wheel. - - // take care about grabbing. We do this here since it - // is clear that we return anyway - if ( tqApp->inPopupMode() && popupGrabOk ) - XAllowEvents( x11Display(), SyncPointer, CurrentTime ); - - // We are only interested in ButtonPress. - if (event->type == ButtonPress ){ - - // compress wheel events (the X Server will simply - // send a button press for each single notch, - // regardless whether the application can catch up - // or not) - int delta = 1; - XEvent xevent; - while ( XCheckTypedWindowEvent(x11Display(),winId(), - ButtonPress,&xevent) ){ - if (xevent.xbutton.button != event->xbutton.button){ - XPutBackEvent(x11Display(), &xevent); - break; - } - delta++; - } - - // the delta is defined as multiples of - // WHEEL_DELTA, which is set to 120. Future wheels - // may offer a finer-resolution. A positive delta - // indicates forward rotation, a negative one - // backward rotation respectively. - int btn = event->xbutton.button; - delta *= 120 * ( (btn == Button4 || btn == 6) ? 1 : -1 ); - bool hor = ( (btn == Button4 || btn == Button5) && (state&AltButton) || - (btn == 6 || btn == 7) ); - translateWheelEvent( globalPos.x(), globalPos.y(), delta, state, (hor)?Horizontal:Vertical ); - } - return TRUE; - } - if ( event->type == ButtonPress ) { // mouse button pressed -#if defined(TQ_OS_IRIX) && defined(TQT_TABLET_SUPPORT) - XEvent myEv; - if ( XCheckTypedEvent( appDpy, xinput_button_press, &myEv ) ) { - if ( translateXinputEvent( &myEv ) ) { - //Spontaneous event sent. Check if we need to continue. - if ( chokeMouse ) { - chokeMouse = FALSE; - return FALSE; - } - } - } -#endif - qt_button_down = tqchildAt( pos ); //magic for masked widgets - if ( !qt_button_down || !qt_button_down->testWFlags(WMouseNoMask) ) - qt_button_down = this; - if ( mouseActWindow == event->xbutton.window && - mouseButtonPressed == button && - (long)event->xbutton.time -(long)mouseButtonPressTime - < TQApplication::doubleClickInterval() && - TQABS(event->xbutton.x - mouseXPos) < 5 && - TQABS(event->xbutton.y - mouseYPos) < 5 ) { - type = TQEvent::MouseButtonDblClick; - mouseButtonPressTime -= 2000; // no double-click next time - } else { - type = TQEvent::MouseButtonPress; - mouseButtonPressTime = event->xbutton.time; - } - mouseButtonPressed = button; // save event params for - mouseXPos = pos.x(); // future double click tests - mouseYPos = pos.y(); - mouseGlobalXPos = globalPos.x(); - mouseGlobalYPos = globalPos.y(); - } else { // mouse button released -#if defined(TQ_OS_IRIX) && defined(TQT_TABLET_SUPPORT) - XEvent myEv; - if ( XCheckTypedEvent( appDpy, xinput_button_release, &myEv ) ) { - if ( translateXinputEvent( &myEv ) ) { - //Spontaneous event sent. Check if we need to continue. - if ( chokeMouse ) { - chokeMouse = FALSE; - return FALSE; - } - } - } -#endif - if ( manualGrab ) { // release manual grab - manualGrab = FALSE; - XUngrabPointer( x11Display(), CurrentTime ); - XFlush( x11Display() ); - } - - type = TQEvent::MouseButtonRelease; - } - } - mouseActWindow = winId(); // save some event params - mouseButtonState = state; - if ( type == 0 ) // don't send event - return FALSE; - - if ( tqApp->inPopupMode() ) { // in popup mode - TQWidget *popup = tqApp->activePopupWidget(); - if ( popup != this ) { - if ( testWFlags(WType_Popup) && rect().contains(pos) ) - popup = this; - else // send to last popup - pos = popup->mapFromGlobal( globalPos ); - } - bool releaseAfter = FALSE; - TQWidget *popupChild = popup->tqchildAt( pos ); - TQWidget *popupTarget = popupChild ? popupChild : popup; - - if (popup != popupOfPopupButtonFocus){ - popupButtonFocus = 0; - popupOfPopupButtonFocus = 0; - } - - if ( !popupTarget->isEnabled() ) { - if ( popupGrabOk ) - XAllowEvents( x11Display(), SyncPointer, CurrentTime ); - } - - switch ( type ) { - case TQEvent::MouseButtonPress: - case TQEvent::MouseButtonDblClick: - popupButtonFocus = popupChild; - popupOfPopupButtonFocus = popup; - break; - case TQEvent::MouseButtonRelease: - releaseAfter = TRUE; - break; - default: - break; // nothing for mouse move - } - - Display* dpy = x11Display(); // store display, send() may destroy us - - - int oldOpenPopupCount = openPopupCount; - - if ( popupButtonFocus ) { - TQMouseEvent e( type, popupButtonFocus->mapFromGlobal(globalPos), - globalPos, button, state ); - TQApplication::sendSpontaneousEvent( popupButtonFocus, &e ); - if ( releaseAfter ) { - popupButtonFocus = 0; - popupOfPopupButtonFocus = 0; - } - } else if ( popupChild ) { - TQMouseEvent e( type, popupChild->mapFromGlobal(globalPos), - globalPos, button, state ); - TQApplication::sendSpontaneousEvent( popupChild, &e ); - } else { - TQMouseEvent e( type, pos, globalPos, button, state ); - TQApplication::sendSpontaneousEvent( popup, &e ); - } - - if ( type == TQEvent::MouseButtonPress && button == RightButton && ( openPopupCount == oldOpenPopupCount ) ) { - TQWidget *popupEvent = popup; - if(popupButtonFocus) - popupEvent = popupButtonFocus; - else if(popupChild) - popupEvent = popupChild; - TQContextMenuEvent e( TQContextMenuEvent::Mouse, pos, globalPos, state ); - TQApplication::sendSpontaneousEvent( popupEvent, &e ); - } - - if ( releaseAfter ) - qt_button_down = 0; - - if ( tqApp->inPopupMode() ) { // still in popup mode - if ( popupGrabOk ) - XAllowEvents( dpy, SyncPointer, CurrentTime ); - } else { - if ( type != TQEvent::MouseButtonRelease && state != 0 && - TQWidget::find((WId)mouseActWindow) ) { - manualGrab = TRUE; // need to manually grab - XGrabPointer( dpy, mouseActWindow, False, - (uint)(ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | - EnterWindowMask | LeaveWindowMask), - GrabModeAsync, GrabModeAsync, - None, None, CurrentTime ); - } - } - - } else { - TQWidget *widget = this; - TQWidget *w = TQWidget::mouseGrabber(); - if ( !w ) - w = qt_button_down; - if ( w && w != this ) { - widget = w; - pos = w->mapFromGlobal( globalPos ); - } - - if ( popupCloseDownMode ) { - popupCloseDownMode = FALSE; - if ( testWFlags(WType_Popup) ) // ignore replayed event - return TRUE; - } - - if ( type == TQEvent::MouseButtonRelease && - (state & (~button) & ( LeftButton | - MidButton | - RightButton)) == 0 ) { - qt_button_down = 0; - } - - int oldOpenPopupCount = openPopupCount; - - TQMouseEvent e( type, pos, globalPos, button, state ); - TQApplication::sendSpontaneousEvent( widget, &e ); - - if ( type == TQEvent::MouseButtonPress && button == RightButton && ( openPopupCount == oldOpenPopupCount ) ) { - TQContextMenuEvent e( TQContextMenuEvent::Mouse, pos, globalPos, state ); - TQApplication::sendSpontaneousEvent( widget, &e ); - } - } - return TRUE; -} - - -// -// Wheel event translation -// -bool TQETWidget::translateWheelEvent( int global_x, int global_y, int delta, int state, Orientation orient ) -{ - // send the event to the widget or its ancestors - { - TQWidget* popup = tqApp->activePopupWidget(); - if ( popup && tqtopLevelWidget() != popup ) - popup->close(); - TQWheelEvent e( mapFromGlobal(TQPoint( global_x, global_y)), - TQPoint(global_x, global_y), delta, state, orient ); - if ( TQApplication::sendSpontaneousEvent( this, &e ) ) - return TRUE; - } - - // send the event to the widget that has the focus or its ancestors, if different - TQWidget *w = this; - if ( w != tqApp->tqfocusWidget() && ( w = tqApp->tqfocusWidget() ) ) { - TQWidget* popup = tqApp->activePopupWidget(); - if ( popup && w != popup ) - popup->hide(); - TQWheelEvent e( mapFromGlobal(TQPoint( global_x, global_y)), - TQPoint(global_x, global_y), delta, state, orient ); - if ( TQApplication::sendSpontaneousEvent( w, &e ) ) - return TRUE; - } - return FALSE; -} - - -// -// XInput Translation Event -// -#if defined (TQT_TABLET_SUPPORT) -bool TQETWidget::translateXinputEvent( const XEvent *ev ) -{ -#if defined (TQ_OS_IRIX) - // Wacom has put defines in their wacom.h file so it would be quite wise - // to use them, need to think of a decent way of not using - // it when it doesn't exist... - XDeviceState *s; - XInputClass *iClass; - XValuatorState *vs; - int j; -#endif - TQWidget *w = this; - TQPoint global, - curr; - static int pressure = 0; - static int xTilt = 0, - yTilt = 0; - int tqdeviceType = TQTabletEvent::NoDevice; - TQPair<int, int> tId; - XEvent xinputMotionEvent; - XEvent mouseMotionEvent; - XDevice *dev; - const XDeviceMotionEvent *motion = 0; - XDeviceButtonEvent *button = 0; - TQEvent::Type t; - - if ( ev->type == xinput_motion ) { - motion = (const XDeviceMotionEvent*)ev; - for (;;) { - if (!XCheckTypedWindowEvent(x11Display(), winId(), MotionNotify, &mouseMotionEvent)) - break; - if (!XCheckTypedWindowEvent(x11Display(), winId(), xinput_motion, &xinputMotionEvent)) { - XPutBackEvent(x11Display(), &mouseMotionEvent); - break; - } - if (mouseMotionEvent.xmotion.time != motion->time) { - XPutBackEvent(x11Display(), &mouseMotionEvent); - XPutBackEvent(x11Display(), &xinputMotionEvent); - break; - } - motion = ((const XDeviceMotionEvent*)&xinputMotionEvent); - } - t = TQEvent::TabletMove; - curr = TQPoint( motion->x, motion->y ); - } else { - if ( ev->type == xinput_button_press ) { - t = TQEvent::TabletPress; - } else { - t = TQEvent::TabletRelease; - } - button = (XDeviceButtonEvent*)ev; -/* - qDebug( "\n\nXInput Button Event" ); - qDebug( "serial:\t%d", button->serial ); - qDebug( "send_event:\t%d", button->send_event ); - qDebug( "display:\t%p", button->display ); - qDebug( "window:\t%d", button->window ); - qDebug( "tqdeviceID:\t%d", button->tqdeviceid ); - qDebug( "root:\t%d", button->root ); - qDebug( "subwindot:\t%d", button->subwindow ); - qDebug( "x:\t%d", button->x ); - qDebug( "y:\t%d", button->y ); - qDebug( "x_root:\t%d", button->x_root ); - qDebug( "y_root:\t%d", button->y_root ); - qDebug( "state:\t%d", button->state ); - qDebug( "button:\t%d", button->button ); - qDebug( "same_screen:\t%d", button->same_screen ); - qDebug( "time:\t%d", button->time ); -*/ - curr = TQPoint( button->x, button->y ); - } -#if defined(TQ_OS_IRIX) - // default... - dev = devStylus; -#else - if ( ev->type == xinput_motion ) { - if ( motion->tqdeviceid == devStylus->tqdevice_id ) { - dev = devStylus; - tqdeviceType = TQTabletEvent::Stylus; - } else if ( motion->tqdeviceid == devEraser->tqdevice_id ) { - dev = devEraser; - tqdeviceType = TQTabletEvent::Eraser; - } - } else { - if ( button->tqdeviceid == devStylus->tqdevice_id ) { - dev = devStylus; - tqdeviceType = TQTabletEvent::Stylus; - } else if ( button->tqdeviceid == devEraser->tqdevice_id ) { - dev = devEraser; - tqdeviceType = TQTabletEvent::Eraser; - } - } -#endif - - const int PRESSURE_LEVELS = 255; - // we got the maximum pressure at start time, since various tablets have - // varying levels of distinguishing pressure changes, let's standardize and - // scale everything to 256 different levels... - static int scaleFactor = -1; - if ( scaleFactor == -1 ) { - if ( max_pressure > PRESSURE_LEVELS ) - scaleFactor = max_pressure / PRESSURE_LEVELS; - else - scaleFactor = PRESSURE_LEVELS / max_pressure; - } -#if defined (TQ_OS_IRIX) - s = XQueryDeviceState( appDpy, dev ); - if ( s == NULL ) - return FALSE; - iClass = s->data; - for ( j = 0; j < s->num_classes; j++ ) { - if ( iClass->c_class == ValuatorClass ) { - vs = (XValuatorState *)iClass; - // figure out what tqdevice we have, based on bitmasking... - if ( vs->valuators[WAC_TRANSDUCER_I] - & WAC_TRANSDUCER_PROX_MSK ) { - switch ( vs->valuators[WAC_TRANSDUCER_I] - & WAC_TRANSDUCER_MSK ) { - case WAC_PUCK_ID: - tqdeviceType = TQTabletEvent::Puck; - break; - case WAC_STYLUS_ID: - tqdeviceType = TQTabletEvent::Stylus; - break; - case WAC_ERASER_ID: - tqdeviceType = TQTabletEvent::Eraser; - break; - } - // Get a Unique Id for the tqdevice, Wacom gives us this ability - tId.first = vs->valuators[WAC_TRANSDUCER_I] & WAC_TRANSDUCER_ID_MSK; - tId.second = vs->valuators[WAC_SERIAL_NUM_I]; - } else - tqdeviceType = TQTabletEvent::NoDevice; - // apparently Wacom needs a cast for the +/- values to make sense - xTilt = short(vs->valuators[WAC_XTILT_I]); - yTilt = short(vs->valuators[WAC_YTILT_I]); - if ( max_pressure > PRESSURE_LEVELS ) - pressure = vs->valuators[WAC_PRESSURE_I] / scaleFactor; - else - pressure = vs->valuators[WAC_PRESSURE_I] * scaleFactor; - global = TQPoint( vs->valuators[WAC_XCOORD_I], - vs->valuators[WAC_YCOORD_I] ); - break; - } - iClass = (XInputClass*)((char*)iClass + iClass->length); - } - XFreeDeviceState( s ); -#else - if ( motion ) { - xTilt = short(motion->axis_data[3]); - yTilt = short(motion->axis_data[4]); - if ( max_pressure > PRESSURE_LEVELS ) - pressure = motion->axis_data[2] / scaleFactor; - else - pressure = motion->axis_data[2] * scaleFactor; - global = TQPoint( motion->axis_data[0], motion->axis_data[1] ); - } else { - xTilt = short(button->axis_data[3]); - yTilt = short(button->axis_data[4]); - if ( max_pressure > PRESSURE_LEVELS ) - pressure = button->axis_data[2] / scaleFactor; - else - pressure = button->axis_data[2] * scaleFactor; - global = TQPoint( button->axis_data[0], button->axis_data[1] ); - } - // The only way to get these Ids is to scan the XFree86 log, which I'm not going to do. - tId.first = tId.second = -1; -#endif - - TQTabletEvent e( t, curr, global, tqdeviceType, pressure, xTilt, yTilt, tId ); - TQApplication::sendSpontaneousEvent( w, &e ); - return TRUE; -} -#endif - -bool TQETWidget::translatePropertyEvent(const XEvent *event) -{ - if (!isTopLevel()) return TRUE; - - Atom ret; - int format, e; - unsigned char *data = 0; - unsigned long nitems, after; - - if (event->xproperty.atom == qt_net_wm_frame_strut) { - topData()->fleft = topData()->fright = topData()->ftop = topData()->fbottom = 0; - fstrut_dirty = 1; - - if (event->xproperty.state == PropertyNewValue) { - e = XGetWindowProperty(appDpy, event->xproperty.window, qt_net_wm_frame_strut, - 0, 4, // struts are 4 longs - False, XA_CARDINAL, &ret, &format, &nitems, &after, &data); - - if (e == Success && ret == XA_CARDINAL && - format == 32 && nitems == 4) { - long *strut = (long *) data; - topData()->fleft = strut[0]; - topData()->fright = strut[1]; - topData()->ftop = strut[2]; - topData()->fbottom = strut[3]; - fstrut_dirty = 0; - } - } - } else if (event->xproperty.atom == qt_net_wm_state) { - bool max = FALSE; - bool full = FALSE; - - if (event->xproperty.state == PropertyNewValue) { - // using length of 1024 should be safe for all current and - // possible NET states... - e = XGetWindowProperty(appDpy, event->xproperty.window, qt_net_wm_state, 0, 1024, - False, XA_ATOM, &ret, &format, &nitems, &after, &data); - - if (e == Success && ret == XA_ATOM && format == 32 && nitems > 0) { - Atom *states = (Atom *) data; - - unsigned long i; - for (i = 0; i < nitems; i++) { - if (states[i] == qt_net_wm_state_max_v || states[i] == qt_net_wm_state_max_h) - max = TRUE; - else if (states[i] == qt_net_wm_state_fullscreen) - full = TRUE; - } - } - } - - bool send_event = FALSE; - - if (qt_net_supports(qt_net_wm_state_max_v) - && qt_net_supports(qt_net_wm_state_max_h)) { - if (max && !isMaximized()) { - setWState(WState_Maximized); - send_event = TRUE; - } else if (!max && isMaximized()) { - clearWState(WState_Maximized); - send_event = TRUE; - } - } - - if (qt_net_supports(qt_net_wm_state_fullscreen)) { - if (full && !isFullScreen()) { - setWState(WState_FullScreen); - send_event = TRUE; - } else if (!full && isFullScreen()) { - clearWState(WState_FullScreen); - send_event = TRUE; - } - } - - if (send_event) { - TQEvent e(TQEvent::WindowStateChange); - TQApplication::sendSpontaneousEvent(this, &e); - } - } else if (event->xproperty.atom == qt_wm_state) { - // the widget frame strut should also be invalidated - topData()->fleft = topData()->fright = topData()->ftop = topData()->fbottom = 0; - fstrut_dirty = 1; - - if (event->xproperty.state == PropertyDelete) { - // the window manager has removed the WM State property, - // so it is now in the withdrawn state (ICCCM 4.1.3.1) and - // we are free to reuse this window - topData()->parentWinId = 0; - // map the window if we were waiting for a transition to - // withdrawn - if ( qt_deferred_map_contains( this ) ) { - qt_deferred_map_take( this ); - XMapWindow( appDpy, winId() ); - } - } else if (topData()->parentWinId != TQPaintDevice::x11AppRootWindow(x11Screen())) { - // the window manager has changed the WM State property... - // we are wanting to see if we are withdrawn so that we - // can reuse this window... we only do this check *IF* we - // haven't been reparented to root - (the parentWinId != - // TQPaintDevice::x11AppRootWindow(x11Screen())) check - // above - - e = XGetWindowProperty(appDpy, winId(), qt_wm_state, 0, 2, False, qt_wm_state, - &ret, &format, &nitems, &after, &data ); - - if (e == Success && ret == qt_wm_state && format == 32 && nitems > 0) { - long *state = (long *) data; - switch (state[0]) { - case WithdrawnState: - // if we are in the withdrawn state, we are free - // to reuse this window provided we remove the - // WM_STATE property (ICCCM 4.1.3.1) - XDeleteProperty(appDpy, winId(), qt_wm_state); - - // set the parent id to zero, so that show() will - // work again - topData()->parentWinId = 0; - // map the window if we were waiting for a - // transition to withdrawn - if ( qt_deferred_map_contains( this ) ) { - qt_deferred_map_take( this ); - XMapWindow( appDpy, winId() ); - } - break; - - case IconicState: - if (!isMinimized()) { - // window was minimized - setWState(WState_Minimized); - TQEvent e(TQEvent::WindowStateChange); - TQApplication::sendSpontaneousEvent(this, &e); - } - break; - - default: - if (isMinimized()) { - // window was un-minimized - clearWState(WState_Minimized); - TQEvent e(TQEvent::WindowStateChange); - TQApplication::sendSpontaneousEvent(this, &e); - } - break; - } - } - } - } - - if (data) - XFree(data); - - return TRUE; -} - -#ifndef XK_ISO_Left_Tab -#define XK_ISO_Left_Tab 0xFE20 -#endif - -// the next lines are taken from XFree > 4.0 (X11/XF86keysyms.h), defining some special -// multimedia keys. They are included here as not every system has them. -#define XF86XK_Standby 0x1008FF10 -#define XF86XK_AudioLowerVolume 0x1008FF11 -#define XF86XK_AudioMute 0x1008FF12 -#define XF86XK_AudioRaiseVolume 0x1008FF13 -#define XF86XK_AudioPlay 0x1008FF14 -#define XF86XK_AudioStop 0x1008FF15 -#define XF86XK_AudioPrev 0x1008FF16 -#define XF86XK_AudioNext 0x1008FF17 -#define XF86XK_HomePage 0x1008FF18 -#define XF86XK_Calculator 0x1008FF1D -#define XF86XK_Mail 0x1008FF19 -#define XF86XK_Start 0x1008FF1A -#define XF86XK_Search 0x1008FF1B -#define XF86XK_AudioRecord 0x1008FF1C -#define XF86XK_Back 0x1008FF26 -#define XF86XK_Forward 0x1008FF27 -#define XF86XK_Stop 0x1008FF28 -#define XF86XK_Refresh 0x1008FF29 -#define XF86XK_Favorites 0x1008FF30 -#define XF86XK_AudioPause 0x1008FF31 -#define XF86XK_AudioMedia 0x1008FF32 -#define XF86XK_MyComputer 0x1008FF33 -#define XF86XK_OpenURL 0x1008FF38 -#define XF86XK_Launch0 0x1008FF40 -#define XF86XK_Launch1 0x1008FF41 -#define XF86XK_Launch2 0x1008FF42 -#define XF86XK_Launch3 0x1008FF43 -#define XF86XK_Launch4 0x1008FF44 -#define XF86XK_Launch5 0x1008FF45 -#define XF86XK_Launch6 0x1008FF46 -#define XF86XK_Launch7 0x1008FF47 -#define XF86XK_Launch8 0x1008FF48 -#define XF86XK_Launch9 0x1008FF49 -#define XF86XK_LaunchA 0x1008FF4A -#define XF86XK_LaunchB 0x1008FF4B -#define XF86XK_LaunchC 0x1008FF4C -#define XF86XK_LaunchD 0x1008FF4D -#define XF86XK_LaunchE 0x1008FF4E -#define XF86XK_LaunchF 0x1008FF4F -// end of XF86keysyms.h - - - -static const KeySym KeyTbl[] = { // keyboard mapping table - XK_Escape, TQt::Key_Escape, // misc keys - XK_Tab, TQt::Key_Tab, - XK_ISO_Left_Tab, TQt::Key_Backtab, - XK_BackSpace, TQt::Key_Backspace, - XK_Return, TQt::Key_Return, - XK_Insert, TQt::Key_Insert, - XK_KP_Insert, TQt::Key_Insert, - XK_Delete, TQt::Key_Delete, - XK_KP_Delete, TQt::Key_Delete, - XK_Clear, TQt::Key_Delete, - XK_Pause, TQt::Key_Pause, - XK_Print, TQt::Key_Print, - XK_KP_Begin, TQt::Key_Clear, - 0x1005FF60, TQt::Key_SysReq, // hardcoded Sun SysReq - 0x1007ff00, TQt::Key_SysReq, // hardcoded X386 SysReq - XK_Home, TQt::Key_Home, // cursor movement - XK_End, TQt::Key_End, - XK_Left, TQt::Key_Left, - XK_Up, TQt::Key_Up, - XK_Right, TQt::Key_Right, - XK_Down, TQt::Key_Down, - XK_Prior, TQt::Key_Prior, - XK_Next, TQt::Key_Next, - XK_KP_Home, TQt::Key_Home, - XK_KP_End, TQt::Key_End, - XK_KP_Left, TQt::Key_Left, - XK_KP_Up, TQt::Key_Up, - XK_KP_Right, TQt::Key_Right, - XK_KP_Down, TQt::Key_Down, - XK_KP_Prior, TQt::Key_Prior, - XK_KP_Next, TQt::Key_Next, - XK_Shift_L, TQt::Key_Shift, // modifiers - XK_Shift_R, TQt::Key_Shift, - XK_Shift_Lock, TQt::Key_Shift, - XK_Control_L, TQt::Key_Control, - XK_Control_R, TQt::Key_Control, - XK_Meta_L, TQt::Key_Meta, - XK_Meta_R, TQt::Key_Meta, - XK_Alt_L, TQt::Key_Alt, - XK_Alt_R, TQt::Key_Alt, - XK_Caps_Lock, TQt::Key_CapsLock, - XK_Num_Lock, TQt::Key_NumLock, - XK_Scroll_Lock, TQt::Key_ScrollLock, - XK_KP_Space, TQt::Key_Space, // numeric keypad - XK_KP_Tab, TQt::Key_Tab, - XK_KP_Enter, TQt::Key_Enter, - XK_KP_Equal, TQt::Key_Equal, - XK_KP_Multiply, TQt::Key_Asterisk, - XK_KP_Add, TQt::Key_Plus, - XK_KP_Separator, TQt::Key_Comma, - XK_KP_Subtract, TQt::Key_Minus, - XK_KP_Decimal, TQt::Key_Period, - XK_KP_Divide, TQt::Key_Slash, - XK_Super_L, TQt::Key_Super_L, - XK_Super_R, TQt::Key_Super_R, - XK_Menu, TQt::Key_Menu, - XK_Hyper_L, TQt::Key_Hyper_L, - XK_Hyper_R, TQt::Key_Hyper_R, - XK_Help, TQt::Key_Help, - 0x1000FF74, TQt::Key_BackTab, // hardcoded HP backtab - 0x1005FF10, TQt::Key_F11, // hardcoded Sun F36 (labeled F11) - 0x1005FF11, TQt::Key_F12, // hardcoded Sun F37 (labeled F12) - - // International input method support keys - - // International & multi-key character composition - XK_Multi_key, TQt::Key_Multi_key, - XK_Codeinput, TQt::Key_Codeinput, - XK_SingleCandidate, TQt::Key_SingleCandidate, - XK_MultipleCandidate, TQt::Key_MultipleCandidate, - XK_PreviousCandidate, TQt::Key_PreviousCandidate, - - // Misc Functions - XK_Mode_switch, TQt::Key_Mode_switch, - //XK_script_switch, TQt::Key_script_switch, - XK_script_switch, TQt::Key_Mode_switch, - - // Japanese keyboard support - XK_Kanji, TQt::Key_Kanji, - XK_Muhenkan, TQt::Key_Muhenkan, - //XK_Henkan_Mode, TQt::Key_Henkan_Mode, - XK_Henkan_Mode, TQt::Key_Henkan, - XK_Henkan, TQt::Key_Henkan, - XK_Romaji, TQt::Key_Romaji, - XK_Hiragana, TQt::Key_Hiragana, - XK_Katakana, TQt::Key_Katakana, - XK_Hiragana_Katakana, TQt::Key_Hiragana_Katakana, - XK_Zenkaku, TQt::Key_Zenkaku, - XK_Hankaku, TQt::Key_Hankaku, - XK_Zenkaku_Hankaku, TQt::Key_Zenkaku_Hankaku, - XK_Touroku, TQt::Key_Touroku, - XK_Massyo, TQt::Key_Massyo, - XK_Kana_Lock, TQt::Key_Kana_Lock, - XK_Kana_Shift, TQt::Key_Kana_Shift, - XK_Eisu_Shift, TQt::Key_Eisu_Shift, - XK_Eisu_toggle, TQt::Key_Eisu_toggle, - //XK_Kanji_Bangou, TQt::Key_Kanji_Bangou, - //XK_Zen_Koho, TQt::Key_Zen_Koho, - //XK_Mae_Koho, TQt::Key_Mae_Koho, - XK_Kanji_Bangou, TQt::Key_Codeinput, - XK_Zen_Koho, TQt::Key_MultipleCandidate, - XK_Mae_Koho, TQt::Key_PreviousCandidate, - -#ifdef XK_KOREAN - // Korean keyboard support - XK_Hangul, TQt::Key_Hangul, - XK_Hangul_Start, TQt::Key_Hangul_Start, - XK_Hangul_End, TQt::Key_Hangul_End, - XK_Hangul_Hanja, TQt::Key_Hangul_Hanja, - XK_Hangul_Jamo, TQt::Key_Hangul_Jamo, - XK_Hangul_Romaja, TQt::Key_Hangul_Romaja, - //XK_Hangul_Codeinput, TQt::Key_Hangul_Codeinput, - XK_Hangul_Codeinput, TQt::Key_Codeinput, - XK_Hangul_Jeonja, TQt::Key_Hangul_Jeonja, - XK_Hangul_Banja, TQt::Key_Hangul_Banja, - XK_Hangul_PreHanja, TQt::Key_Hangul_PreHanja, - XK_Hangul_PostHanja, TQt::Key_Hangul_PostHanja, - //XK_Hangul_SingleCandidate, TQt::Key_Hangul_SingleCandidate, - //XK_Hangul_MultipleCandidate, TQt::Key_Hangul_MultipleCandidate, - //XK_Hangul_PreviousCandidate, TQt::Key_Hangul_PreviousCandidate, - XK_Hangul_SingleCandidate, TQt::Key_SingleCandidate, - XK_Hangul_MultipleCandidate, TQt::Key_MultipleCandidate, - XK_Hangul_PreviousCandidate, TQt::Key_PreviousCandidate, - XK_Hangul_Special, TQt::Key_Hangul_Special, - //XK_Hangul_switch, TQt::Key_Hangul_switch, - XK_Hangul_switch, TQt::Key_Mode_switch, -#endif // XK_KOREAN - - // dead keys - XK_dead_grave, TQt::Key_Dead_Grave, - XK_dead_acute, TQt::Key_Dead_Acute, - XK_dead_circumflex, TQt::Key_Dead_Circumflex, - XK_dead_tilde, TQt::Key_Dead_Tilde, - XK_dead_macron, TQt::Key_Dead_Macron, - XK_dead_breve, TQt::Key_Dead_Breve, - XK_dead_abovedot, TQt::Key_Dead_Abovedot, - XK_dead_diaeresis, TQt::Key_Dead_Diaeresis, - XK_dead_abovering, TQt::Key_Dead_Abovering, - XK_dead_doubleacute, TQt::Key_Dead_Doubleacute, - XK_dead_caron, TQt::Key_Dead_Caron, - XK_dead_cedilla, TQt::Key_Dead_Cedilla, - XK_dead_ogonek, TQt::Key_Dead_Ogonek, - XK_dead_iota, TQt::Key_Dead_Iota, - XK_dead_voiced_sound, TQt::Key_Dead_Voiced_Sound, - XK_dead_semivoiced_sound, TQt::Key_Dead_Semivoiced_Sound, - XK_dead_belowdot, TQt::Key_Dead_Belowdot, - XK_dead_hook, TQt::Key_Dead_Hook, - XK_dead_horn, TQt::Key_Dead_Horn, - - // Special multimedia keys - // currently only tested with MS internet keyboard - - // browsing keys - XF86XK_Back, TQt::Key_Back, - XF86XK_Forward, TQt::Key_Forward, - XF86XK_Stop, TQt::Key_Stop, - XF86XK_Refresh, TQt::Key_Refresh, - XF86XK_Favorites, TQt::Key_Favorites, - XF86XK_AudioMedia, TQt::Key_LaunchMedia, - XF86XK_OpenURL, TQt::Key_OpenUrl, - XF86XK_HomePage, TQt::Key_HomePage, - XF86XK_Search, TQt::Key_Search, - - // media keys - XF86XK_AudioLowerVolume, TQt::Key_VolumeDown, - XF86XK_AudioMute, TQt::Key_VolumeMute, - XF86XK_AudioRaiseVolume, TQt::Key_VolumeUp, - XF86XK_AudioPlay, TQt::Key_MediaPlay, - XF86XK_AudioStop, TQt::Key_MediaStop, - XF86XK_AudioPrev, TQt::Key_MediaPrev, - XF86XK_AudioNext, TQt::Key_MediaNext, - XF86XK_AudioRecord, TQt::Key_MediaRecord, - - // launch keys - XF86XK_Mail, TQt::Key_LaunchMail, - XF86XK_MyComputer, TQt::Key_Launch0, - XF86XK_Calculator, TQt::Key_Launch1, - XF86XK_Standby, TQt::Key_Standby, - - XF86XK_Launch0, TQt::Key_Launch2, - XF86XK_Launch1, TQt::Key_Launch3, - XF86XK_Launch2, TQt::Key_Launch4, - XF86XK_Launch3, TQt::Key_Launch5, - XF86XK_Launch4, TQt::Key_Launch6, - XF86XK_Launch5, TQt::Key_Launch7, - XF86XK_Launch6, TQt::Key_Launch8, - XF86XK_Launch7, TQt::Key_Launch9, - XF86XK_Launch8, TQt::Key_LaunchA, - XF86XK_Launch9, TQt::Key_LaunchB, - XF86XK_LaunchA, TQt::Key_LaunchC, - XF86XK_LaunchB, TQt::Key_LaunchD, - XF86XK_LaunchC, TQt::Key_LaunchE, - XF86XK_LaunchD, TQt::Key_LaunchF, - - 0, 0 -}; - - -static TQIntDict<void> *keyDict = 0; -static TQIntDict<void> *textDict = 0; - -static void deleteKeyDicts() -{ - if ( keyDict ) - delete keyDict; - keyDict = 0; - if ( textDict ) - delete textDict; - textDict = 0; -} - -#if !defined(TQT_NO_XIM) -static const unsigned short katakanaKeysymsToUnicode[] = { - 0x0000, 0x3002, 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, - 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, - 0x30FC, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, - 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, - 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, - 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, - 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, - 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x309B, 0x309C -}; - -static const unsigned short cyrillicKeysymsToUnicode[] = { - 0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0000, 0x045e, 0x045f, - 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0000, 0x040e, 0x040f, - 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, - 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, - 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, - 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a -}; - -static const unsigned short greekKeysymsToUnicode[] = { - 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, - 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015, - 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, - 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, - 0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7, - 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, - 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, - 0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, - 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static const unsigned short technicalKeysymsToUnicode[] = { - 0x0000, 0x23B7, 0x250C, 0x2500, 0x2320, 0x2321, 0x2502, 0x23A1, - 0x23A3, 0x23A4, 0x23A6, 0x239B, 0x239D, 0x239E, 0x23A0, 0x23A8, - 0x23AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222B, - 0x2234, 0x221D, 0x221E, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000, - 0x223C, 0x2243, 0x0000, 0x0000, 0x0000, 0x21D4, 0x21D2, 0x2261, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x0000, - 0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222A, 0x2227, 0x2228, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000, - 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193, 0x0000 -}; - -static const unsigned short specialKeysymsToUnicode[] = { - 0x25C6, 0x2592, 0x2409, 0x240C, 0x240D, 0x240A, 0x0000, 0x0000, - 0x2424, 0x240B, 0x2518, 0x2510, 0x250C, 0x2514, 0x253C, 0x23BA, - 0x23BB, 0x2500, 0x23BC, 0x23BD, 0x251C, 0x2524, 0x2534, 0x252C, - 0x2502, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static const unsigned short publishingKeysymsToUnicode[] = { - 0x0000, 0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, - 0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025, - 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, - 0x2105, 0x0000, 0x0000, 0x2012, 0x2329, 0x0000, 0x232a, 0x0000, - 0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, - 0x0000, 0x2122, 0x2613, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25af, - 0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x0000, 0x2032, 0x2033, - 0x0000, 0x271d, 0x0000, 0x25ac, 0x25c0, 0x25b6, 0x25cf, 0x25ae, - 0x25e6, 0x25ab, 0x25ad, 0x25b3, 0x25bd, 0x2606, 0x2022, 0x25aa, - 0x25b2, 0x25bc, 0x261c, 0x261e, 0x2663, 0x2666, 0x2665, 0x0000, - 0x2720, 0x2020, 0x2021, 0x2713, 0x2717, 0x266f, 0x266d, 0x2642, - 0x2640, 0x260e, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e, 0x0000 -}; - -static const unsigned short aplKeysymsToUnicode[] = { - 0x0000, 0x0000, 0x0000, 0x003c, 0x0000, 0x0000, 0x003e, 0x0000, - 0x2228, 0x2227, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00af, 0x0000, 0x22a5, 0x2229, 0x230a, 0x0000, 0x005f, 0x0000, - 0x0000, 0x0000, 0x2218, 0x0000, 0x2395, 0x0000, 0x22a4, 0x25cb, - 0x0000, 0x0000, 0x0000, 0x2308, 0x0000, 0x0000, 0x222a, 0x0000, - 0x2283, 0x0000, 0x2282, 0x0000, 0x22a2, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x22a3, 0x0000, 0x0000, 0x0000 -}; - -static const unsigned short koreanKeysymsToUnicode[] = { - 0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, - 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, - 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, - 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, - 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, - 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, - 0x3160, 0x3161, 0x3162, 0x3163, 0x11a8, 0x11a9, 0x11aa, 0x11ab, - 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, - 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, - 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x316d, - 0x3171, 0x3178, 0x317f, 0x3181, 0x3184, 0x3186, 0x318d, 0x318e, - 0x11eb, 0x11f0, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9 -}; - - -static TQChar keysymToUnicode(unsigned char byte3, unsigned char byte4) -{ - if ( byte3 == 0x04 ) { - // katakana - if ( byte4 > 0xa0 && byte4 < 0xe0 ) - return TQChar( katakanaKeysymsToUnicode[byte4 - 0xa0] ); - else if ( byte4 == 0x7e ) - return TQChar( 0x203e ); // Overline - } else if ( byte3 == 0x06 ) { - // russian, use lookup table - if ( byte4 > 0xa0 ) - return TQChar( cyrillicKeysymsToUnicode[byte4 - 0xa0] ); - } else if ( byte3 == 0x07 ) { - // greek - if ( byte4 > 0xa0 ) - return TQChar( greekKeysymsToUnicode[byte4 - 0xa0] ); - } else if ( byte3 == 0x08 ) { - // technical - if ( byte4 > 0xa0 ) - return TQChar( technicalKeysymsToUnicode[byte4 - 0xa0] ); - } else if ( byte3 == 0x09 ) { - // special - if ( byte4 >= 0xe0 ) - return TQChar( specialKeysymsToUnicode[byte4 - 0xe0] ); - } else if ( byte3 == 0x0a ) { - // publishing - if ( byte4 > 0xa0 ) - return TQChar( publishingKeysymsToUnicode[byte4 - 0xa0] ); - } else if ( byte3 == 0x0b ) { - // APL - if ( byte4 > 0xa0 ) - return TQChar( aplKeysymsToUnicode[byte4 - 0xa0] ); - } else if ( byte3 == 0x0e ) { - // Korean - if ( byte4 > 0xa0 ) - return TQChar( koreanKeysymsToUnicode[byte4 - 0xa0] ); - } - return TQChar(0x0); -} -#endif - - -bool TQETWidget::translateKeyEventInternal( const XEvent *event, int& count, - TQString& text, - int& state, - char& ascii, int& code, TQEvent::Type &type, bool willRepeat, bool statefulTranslation ) -{ - TQTextCodec *mapper = qt_input_mapper; - // some XmbLookupString implementations don't return buffer overflow correctly, - // so we increase the input buffer to allow for long strings... - // 256 chars * 2 bytes + 1 null-term == 513 bytes - TQCString chars(513); - TQChar converted; - KeySym key = 0; - - if ( !keyDict ) { - keyDict = new TQIntDict<void>( 13 ); - keyDict->setAutoDelete( FALSE ); - textDict = new TQIntDict<void>( 13 ); - textDict->setAutoDelete( FALSE ); - qAddPostRoutine( deleteKeyDicts ); - } - - TQWidget* tlw = tqtopLevelWidget(); - - XKeyEvent xkeyevent = event->xkey; - - // save the modifier state, we will use the keystate uint later by passing - // it to qt_x11_translateButtonState - uint keystate = event->xkey.state; - // remove the modifiers where mode_switch exists... HPUX machines seem - // to have alt *AND* mode_switch both in Mod1Mask, which causes - // XLookupString to return things like '�' (aring) for ALT-A. This - // completely breaks modifiers. If we remove the modifier for Mode_switch, - // then things work correctly... - xkeyevent.state &= ~qt_mode_switch_remove_mask; - - type = (event->type == XKeyPress) - ? TQEvent::KeyPress : TQEvent::KeyRelease; -#if defined(TQT_NO_XIM) - - count = XLookupString( &xkeyevent, chars.data(), chars.size(), &key, 0 ); - - if ( count == 1 ) - ascii = chars[0]; - -#else - // Implementation for X11R5 and newer, using XIM - - int keycode = event->xkey.keycode; - Status status; - - if ( type == TQEvent::KeyPress ) { - bool mb=FALSE; - // commit string handling is done by - // TQXIMInputContext::x11FilterEvent() and are passed to - // widgets via TQIMEvent regardless of XIM style, so the - // following code is commented out. -#if 0 - if ( qt_xim ) { - TQTLWExtra* xd = tlw->topData(); - TQInputContext *qic = (TQInputContext *) xd->xic; - if ( qic ) { - mb=TRUE; - count = qic->lookupString(&xkeyevent, chars, &key, &status); - } - } -#endif - if ( !mb ) { - count = XLookupString( &xkeyevent, - chars.data(), chars.size(), &key, 0 ); - } - if ( count && !keycode ) { - keycode = qt_ximComposingKeycode; - qt_ximComposingKeycode = 0; - } - if ( key ) - keyDict->replace( keycode, (void*)key ); - // all keysyms smaller than that are actally keys that can be mapped - // to tqunicode chars - if ( count == 0 && key < 0xff00 ) { - unsigned char byte3 = (unsigned char )(key >> 8); - int mib = -1; - switch( byte3 ) { - case 0: // Latin 1 - case 1: // Latin 2 - case 2: //latin 3 - case 3: // latin4 - mib = byte3 + 4; break; - case 5: // arabic - mib = 82; break; - case 12: // Hebrew - mib = 85; break; - case 13: // Thai - mib = 2259; break; - case 4: // kana - case 6: // cyrillic - case 7: // greek - case 8: // technical, no mapping here at the moment - case 9: // Special - case 10: // Publishing - case 11: // APL - case 14: // Korean, no mapping - mib = -1; // manual conversion - mapper = 0; - converted = keysymToUnicode( byte3, key & 0xff ); - case 0x20: - // currency symbols - if ( key >= 0x20a0 && key <= 0x20ac ) { - mib = -1; // manual conversion - mapper = 0; - converted = (uint)key; - } - break; - default: - break; - } - if ( mib != -1 ) { - mapper = TQTextCodec::codecForMib( mib ); - chars[0] = (unsigned char) (key & 0xff); // get only the fourth bit for conversion later - count++; - } - } else if ( key >= 0x1000000 && key <= 0x100ffff ) { - converted = (ushort) (key - 0x1000000); - mapper = 0; - } - if ( count < (int)chars.size()-1 ) - chars[count] = '\0'; - if ( count == 1 ) { - ascii = chars[0]; - // +256 so we can store all eight-bit codes, including ascii 0, - // and independent of whether char is signed or not. - textDict->replace( keycode, (void*)(long)(256+ascii) ); - } - tlw = 0; - } else { - key = (int)(long)keyDict->find( keycode ); - if ( key ) - if( !willRepeat && statefulTranslation ) // Take out key of dictionary only if this call. - keyDict->take( keycode ); - long s = (long)textDict->find( keycode ); - if ( s ) { - if( statefulTranslation ) - textDict->take( keycode ); - ascii = (char)(s-256); - } - } -#endif // !TQT_NO_XIM - - state = qt_x11_translateButtonState( keystate ); - - static int directionKeyEvent = 0; - static unsigned int lastWinId = 0; - if ( qt_use_rtl_extensions && type == TQEvent::KeyRelease && statefulTranslation ) { - if (directionKeyEvent == Key_Direction_R || directionKeyEvent == Key_Direction_L ) { - type = TQEvent::KeyPress; - code = directionKeyEvent; - chars[0] = 0; - directionKeyEvent = 0; - lastWinId = 0; - return TRUE; - } else { - directionKeyEvent = 0; - lastWinId = 0; - } - } - - // Watch for keypresses and if its a key belonging to the Ctrl-Shift - // direction-changing accel, remember it. - // We keep track of those keys instead of using the event's state - // (to figure out whether the Ctrl modifier is held while Shift is pressed, - // or Shift is held while Ctrl is pressed) since the 'state' doesn't tell - // us whether the modifier held is Left or Right. - if ( qt_use_rtl_extensions && type == TQEvent::KeyPress && statefulTranslation ) - if (key == XK_Control_L || key == XK_Control_R || key == XK_Shift_L || key == XK_Shift_R) { - if (!directionKeyEvent) { - directionKeyEvent = key; - // This code exists in order to check that - // the event is occurred in the same widget. - lastWinId = winId(); - } - } else { - // this can no longer be a direction-changing accel. - // if any other key was pressed. - directionKeyEvent = Key_Space; - } - - // Commentary in X11/keysymdef says that X codes match ASCII, so it - // is safe to use the locale functions to process X codes in ISO8859-1. - // - // This is mainly for compatibility - applications should not use the - // TQt keycodes between 128 and 255, but should rather use the - // TQKeyEvent::text(). - // - if ( key < 128 || (key < 256 && (!qt_input_mapper || qt_input_mapper->mibEnum()==4)) ) { - code = isprint((int)key) ? toupper((int)key) : 0; // upper-case key, if known - } else if ( key >= XK_F1 && key <= XK_F35 ) { - code = Key_F1 + ((int)key - XK_F1); // function keys - } else if ( key >= XK_KP_0 && key <= XK_KP_9) { - code = Key_0 + ((int)key - XK_KP_0); // numeric keypad keys - state |= Keypad; - } else { - int i = 0; // any other keys - while ( KeyTbl[i] ) { - if ( key == KeyTbl[i] ) { - code = (int)KeyTbl[i+1]; - break; - } - i += 2; - } - switch ( key ) { - case XK_KP_Insert: - case XK_KP_Delete: - case XK_KP_Home: - case XK_KP_End: - case XK_KP_Left: - case XK_KP_Up: - case XK_KP_Right: - case XK_KP_Down: - case XK_KP_Prior: - case XK_KP_Next: - case XK_KP_Space: - case XK_KP_Tab: - case XK_KP_Enter: - case XK_KP_Equal: - case XK_KP_Multiply: - case XK_KP_Add: - case XK_KP_Separator: - case XK_KP_Subtract: - case XK_KP_Decimal: - case XK_KP_Divide: - state |= Keypad; - break; - default: - break; - } - - if ( code == Key_Tab && - (state & ShiftButton) == ShiftButton ) { - // map shift+tab to shift+backtab, TQAccel knows about it - // and will handle it. - code = Key_Backtab; - chars[0] = 0; - } - - if ( qt_use_rtl_extensions && type == TQEvent::KeyPress && statefulTranslation ) { - if ( directionKeyEvent && lastWinId == winId() ) { - if ( key == XK_Shift_L && directionKeyEvent == XK_Control_L || - key == XK_Control_L && directionKeyEvent == XK_Shift_L ) { - directionKeyEvent = Key_Direction_L; - } else if ( key == XK_Shift_R && directionKeyEvent == XK_Control_R || - key == XK_Control_R && directionKeyEvent == XK_Shift_R ) { - directionKeyEvent = Key_Direction_R; - } - } - else if ( directionKeyEvent == Key_Direction_L || directionKeyEvent == Key_Direction_R ) { - directionKeyEvent = Key_Space; // invalid - } - } - } - -#if 0 -#ifndef TQ_EE - static int c = 0; - extern void qt_dialog_default_key(); -#define TQ_EE(x) c = (c == x || (!c && x == 0x1000) )? x+1 : 0 - if ( tlw && state == '0' ) { - switch ( code ) { - case 0x4f: TQ_EE(Key_Backtab); break; - case 0x52: TQ_EE(Key_Tab); break; - case 0x54: TQ_EE(Key_Escape); break; - case 0x4c: - if (c == Key_Return ) - qt_dialog_default_key(); - else - TQ_EE(Key_Backspace); - break; - } - } -#undef TQ_EE -#endif -#endif - - // convert chars (8bit) to text (tqunicode). - if ( mapper ) - text = mapper->toUnicode(chars,count); - else if ( !mapper && converted.tqunicode() != 0x0 ) - text = converted; - else - text = chars; - return TRUE; -} - - -struct qt_auto_repeat_data -{ - // match the window and keycode with timestamp delta of 10ms - Window window; - KeyCode keycode; - Time timestamp; - - // queue scanner state - bool release; - bool error; -}; - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -static Bool qt_keypress_scanner(Display *, XEvent *event, XPointer arg) -{ - if (event->type != XKeyPress && event->type != XKeyRelease) - return FALSE; - - qt_auto_repeat_data *d = (qt_auto_repeat_data *) arg; - if (d->error || - event->xkey.window != d->window || - event->xkey.keycode != d->keycode) { - d->error = TRUE; - return FALSE; - } - - if (event->type == XKeyPress) { - d->error = (! d->release || event->xkey.time - d->timestamp > 10); - return (! d->error); - } - - // must be XKeyRelease event - if (d->release) { - // found a second release - d->error = TRUE; - return FALSE; - } - - // found a single release - d->release = TRUE; - d->timestamp = event->xkey.time; - - return FALSE; -} - -static Bool qt_keyrelease_scanner(Display *, XEvent *event, XPointer arg) -{ - const qt_auto_repeat_data *d = (const qt_auto_repeat_data *) arg; - return (event->type == XKeyRelease && - event->xkey.window == d->window && - event->xkey.keycode == d->keycode); -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - -bool TQETWidget::translateKeyEvent( const XEvent *event, bool grab ) -{ - int code = -1; - int count = 0; - int state; - char ascii = 0; - - if ( sm_blockUserInput ) // block user interaction during session management - return TRUE; - - Display *dpy = x11Display(); - - if ( !isEnabled() ) - return TRUE; - - TQEvent::Type type; - bool autor = FALSE; - TQString text; - - translateKeyEventInternal( event, count, text, state, ascii, code, type, - qt_mode_switch_remove_mask != 0 ); - - static uint curr_autorep = 0; - // was this the last auto-repeater? - qt_auto_repeat_data auto_repeat_data; - auto_repeat_data.window = event->xkey.window; - auto_repeat_data.keycode = event->xkey.keycode; - auto_repeat_data.timestamp = event->xkey.time; - - if ( event->type == XKeyPress ) { - if ( curr_autorep == event->xkey.keycode ) { - autor = TRUE; - curr_autorep = 0; - } - } else { - // look ahead for auto-repeat - XEvent nextpress; - - auto_repeat_data.release = TRUE; - auto_repeat_data.error = FALSE; - if (XCheckIfEvent(dpy, &nextpress, &qt_keypress_scanner, - (XPointer) &auto_repeat_data)) { - autor = TRUE; - - // Put it back... we COULD send the event now and not need - // the static curr_autorep variable. - XPutBackEvent(dpy,&nextpress); - } - curr_autorep = autor ? event->xkey.keycode : 0; - } - - // process accelerators before doing key compression - if ( type == TQEvent::KeyPress && !grab ) { - // send accel events if the keyboard is not grabbed - TQKeyEvent a( type, code, ascii, state, text, autor, - TQMAX( TQMAX(count,1), int(text.length())) ); - if ( qt_tryAccelEvent( this, &a ) ) - return TRUE; - } - - long save = 0; - if ( qt_mode_switch_remove_mask != 0 ) { - save = qt_mode_switch_remove_mask; - qt_mode_switch_remove_mask = 0; - - // translate the key event again, but this time apply any Mode_switch - // modifiers - translateKeyEventInternal( event, count, text, state, ascii, code, type ); - } - -#ifndef TQT_NO_IM - TQInputContext *qic = getInputContext(); -#endif - - // compress keys - if ( !text.isEmpty() && testWState(WState_CompressKeys) && -#ifndef TQT_NO_IM - // Ordinary input methods require discrete key events to work - // properly, so key compression has to be disabled when input - // context exists. - // - // And further consideration, some complex input method - // require all key press/release events discretely even if - // the input method awares of key compression and compressed - // keys are ordinary alphabets. For example, the uim project - // is planning to implement "combinational shift" feature for - // a Japanese input method, uim-skk. It will work as follows. - // - // 1. press "r" - // 2. press "u" - // 3. release both "r" and "u" in arbitrary order - // 4. above key sequence generates "Ru" - // - // Of course further consideration about other participants - // such as key repeat mechanism is required to implement such - // feature. - ! qic && -#endif // TQT_NO_IM - // do not compress keys if the key event we just got above matches - // one of the key ranges used to compute stopCompression - ! ( ( code >= Key_Escape && code <= Key_SysReq ) || - ( code >= Key_Home && code <= Key_Next ) || - ( code >= Key_Super_L && code <= Key_Direction_R ) || - ( ( code == 0 ) && ( ascii == '\n' ) ) ) ) { - // the widget wants key compression so it gets it - int codeIntern = -1; - int countIntern = 0; - int stateIntern; - char asciiIntern = 0; - XEvent evRelease; - XEvent evPress; - - // sync the event queue, this makes key compress work better - XSync( dpy, FALSE ); - - for (;;) { - TQString textIntern; - if ( !XCheckTypedWindowEvent(dpy,event->xkey.window, - XKeyRelease,&evRelease) ) - break; - if ( !XCheckTypedWindowEvent(dpy,event->xkey.window, - XKeyPress,&evPress) ) { - XPutBackEvent(dpy, &evRelease); - break; - } - TQEvent::Type t; - translateKeyEventInternal( &evPress, countIntern, textIntern, - stateIntern, asciiIntern, codeIntern, t ); - // use stopCompression to stop key compression for the following - // key event ranges: - bool stopCompression = - // 1) misc keys - ( codeIntern >= Key_Escape && codeIntern <= Key_SysReq ) || - // 2) cursor movement - ( codeIntern >= Key_Home && codeIntern <= Key_Next ) || - // 3) extra keys - ( codeIntern >= Key_Super_L && codeIntern <= Key_Direction_R ) || - // 4) something that a) doesn't translate to text or b) translates - // to newline text - ((codeIntern == 0) && (asciiIntern == '\n')); - if (stateIntern == state && !textIntern.isEmpty() && !stopCompression) { - text += textIntern; - count += countIntern; - } else { - XPutBackEvent(dpy, &evPress); - XPutBackEvent(dpy, &evRelease); - break; - } - } - } - - if ( save != 0 ) - qt_mode_switch_remove_mask = save; - - // autorepeat compression makes sense for all widgets (Windows - // does it automatically .... ) - if ( event->type == XKeyPress && text.length() <= 1 -#ifndef TQT_NO_IM - // input methods need discrete key events - && ! qic -#endif// TQT_NO_IM - ) { - XEvent dummy; - - for (;;) { - auto_repeat_data.release = FALSE; - auto_repeat_data.error = FALSE; - if (! XCheckIfEvent(dpy, &dummy, &qt_keypress_scanner, - (XPointer) &auto_repeat_data)) - break; - if (! XCheckIfEvent(dpy, &dummy, &qt_keyrelease_scanner, - (XPointer) &auto_repeat_data)) - break; - - count++; - if (!text.isEmpty()) - text += text[0]; - } - } - - if (code == 0 && ascii == '\n') { - code = Key_Return; - ascii = '\r'; - text = "\r"; - } - - // try the menukey first - if ( type == TQEvent::KeyPress && code == TQt::Key_Menu ) { - TQContextMenuEvent e( TQContextMenuEvent::Keyboard, TQPoint( 5, 5 ), mapToGlobal( TQPoint( 5, 5 ) ), 0 ); - TQApplication::sendSpontaneousEvent( this, &e ); - if( e.isAccepted() ) - return TRUE; - } - - TQKeyEvent e( type, code, ascii, state, text, autor, - TQMAX(TQMAX(count,1), int(text.length())) ); - return TQApplication::sendSpontaneousEvent( this, &e ); -} - - -// -// Paint event translation -// -// When receiving many expose events, we compress them (union of all expose -// rectangles) into one event which is sent to the widget. - -struct PaintEventInfo { - Window window; -}; - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif - -static Bool isPaintOrScrollDoneEvent( Display *, XEvent *ev, XPointer a ) -{ - PaintEventInfo *info = (PaintEventInfo *)a; - if ( ev->type == Expose || ev->type == GraphicsExpose - || ev->type == ClientMessage - && ev->xclient.message_type == qt_qt_scrolldone ) - { - if ( ev->xexpose.window == info->window ) - return True; - } - return False; -} - -#if defined(TQ_C_CALLBACKS) -} -#endif - - -// declared above: static TQPtrList<TQScrollInProgress> *sip_list = 0; - -void qt_insert_sip( TQWidget* scrolled_widget, int dx, int dy ) -{ - if ( !sip_list ) { - sip_list = new TQPtrList<TQScrollInProgress>; - sip_list->setAutoDelete( TRUE ); - } - - TQScrollInProgress* sip = new TQScrollInProgress( scrolled_widget, dx, dy ); - sip_list->append( sip ); - - XClientMessageEvent client_message; - client_message.type = ClientMessage; - client_message.window = scrolled_widget->winId(); - client_message.format = 32; - client_message.message_type = qt_qt_scrolldone; - client_message.data.l[0] = sip->id; - - XSendEvent( appDpy, scrolled_widget->winId(), False, NoEventMask, - (XEvent*)&client_message ); -} - -int qt_sip_count( TQWidget* scrolled_widget ) -{ - if ( !sip_list ) - return 0; - - int sips=0; - - for (TQScrollInProgress* sip = sip_list->first(); - sip; sip=sip_list->next()) - { - if ( sip->scrolled_widget == scrolled_widget ) - sips++; - } - - return sips; -} - -static -bool translateBySips( TQWidget* that, TQRect& paintRect ) -{ - if ( sip_list ) { - int dx=0, dy=0; - int sips=0; - for (TQScrollInProgress* sip = sip_list->first(); - sip; sip=sip_list->next()) - { - if ( sip->scrolled_widget == that ) { - if ( sips ) { - dx += sip->dx; - dy += sip->dy; - } - sips++; - } - } - if ( sips > 1 ) { - paintRect.moveBy( dx, dy ); - return TRUE; - } - } - return FALSE; -} - -bool TQETWidget::translatePaintEvent( const XEvent *event ) -{ - setWState( WState_Exposed ); - TQRect paintRect( event->xexpose.x, event->xexpose.y, - event->xexpose.width, event->xexpose.height ); - bool merging_okay = !testWFlags(WPaintClever); - XEvent xevent; - PaintEventInfo info; - info.window = winId(); - bool should_clip = translateBySips( this, paintRect ); - - TQRegion paintRegion( paintRect ); - - if ( merging_okay ) { - // WARNING: this is O(number_of_events * number_of_matching_events) - while ( XCheckIfEvent(x11Display(),&xevent,isPaintOrScrollDoneEvent, - (XPointer)&info) && - !qt_x11EventFilter(&xevent) && - !x11Event( &xevent ) ) // send event through filter - { - if ( xevent.type == Expose || xevent.type == GraphicsExpose ) { - TQRect exposure(xevent.xexpose.x, - xevent.xexpose.y, - xevent.xexpose.width, - xevent.xexpose.height); - if ( translateBySips( this, exposure ) ) - should_clip = TRUE; - paintRegion = paintRegion.unite( exposure ); - } else { - translateScrollDoneEvent( &xevent ); - } - } - } - - if ( should_clip ) { - paintRegion = paintRegion.intersect( rect() ); - if ( paintRegion.isEmpty() ) - return TRUE; - } - - TQPaintEvent e( paintRegion ); - setWState( WState_InPaintEvent ); - if ( !isTopLevel() && backgroundOrigin() != WidgetOrigin ) - erase( paintRegion ); - qt_set_paintevent_clipping( this, paintRegion ); - TQApplication::sendSpontaneousEvent( this, &e ); - qt_clear_paintevent_clipping(); - clearWState( WState_InPaintEvent ); - return TRUE; -} - -// -// Scroll-done event translation. -// - -bool TQETWidget::translateScrollDoneEvent( const XEvent *event ) -{ - if ( !sip_list ) return FALSE; - - long id = event->xclient.data.l[0]; - - // Remove any scroll-in-progress record for the given id. - for (TQScrollInProgress* sip = sip_list->first(); sip; sip=sip_list->next()) { - if ( sip->id == id ) { - sip_list->remove( sip_list->current() ); - return TRUE; - } - } - - return FALSE; -} - -#if defined(TQ_C_CALLBACKS) -extern "C" { -#endif -#ifndef TQT_NO_XSYNC -static Bool qt_net_wm_sync_request_scanner(Display*, XEvent* event, XPointer arg) -{ - return (event->type == ClientMessage && event->xclient.window == *(Window*)arg - && event->xclient.message_type == qt_wm_protocols - && event->xclient.data.l[ 0 ] == qt_net_wm_sync_request ); -} -#endif - -#if defined(TQ_C_CALLBACKS) -} -#endif - -// -// ConfigureNotify (window move and resize) event translation - -bool TQETWidget::translateConfigEvent( const XEvent *event ) -{ - // config pending is only set on resize, see qwidget_x11.cpp, internalSetGeometry() - bool was_resize = testWState( WState_ConfigPending ); - - clearWState(WState_ConfigPending); - - if ( isTopLevel() ) { - TQPoint newCPos( tqgeometry().topLeft() ); - TQSize newSize( event->xconfigure.width, event->xconfigure.height ); - - bool trust = (topData()->parentWinId == None || - topData()->parentWinId == TQPaintDevice::x11AppRootWindow()); - - if (event->xconfigure.send_event || trust ) { - // if a ConfigureNotify comes from a real sendevent request, we can - // trust its values. - newCPos.rx() = event->xconfigure.x + event->xconfigure.border_width; - newCPos.ry() = event->xconfigure.y + event->xconfigure.border_width; - } - - if ( isVisible() ) - TQApplication::syncX(); - - if (! extra || extra->compress_events) { - // ConfigureNotify compression for faster opaque resizing - XEvent otherEvent; - int compressed_configs = 0; - while ( XCheckTypedWindowEvent( x11Display(), winId(), ConfigureNotify, - &otherEvent ) ) { - if ( qt_x11EventFilter( &otherEvent ) ) - continue; - - if (x11Event( &otherEvent ) ) - continue; - - if ( otherEvent.xconfigure.event != otherEvent.xconfigure.window ) - continue; - - newSize.setWidth( otherEvent.xconfigure.width ); - newSize.setHeight( otherEvent.xconfigure.height ); - - if ( otherEvent.xconfigure.send_event || trust ) { - newCPos.rx() = otherEvent.xconfigure.x + - otherEvent.xconfigure.border_width; - newCPos.ry() = otherEvent.xconfigure.y + - otherEvent.xconfigure.border_width; - } - ++compressed_configs; - } -#ifndef TQT_NO_XSYNC - // _NET_WM_SYNC_REQUEST compression - Window wid = winId(); - while ( compressed_configs && - XCheckIfEvent( x11Display(), &otherEvent, - qt_net_wm_sync_request_scanner, (XPointer)&wid ) ) { - handleSyncRequest( (void*)&otherEvent ); - --compressed_configs; - } -#endif - } - - TQRect cr ( tqgeometry() ); - if ( newSize != cr.size() ) { // size changed - was_resize = TRUE; - TQSize oldSize = size(); - cr.setSize( newSize ); - crect = cr; - - if ( isVisible() ) { - TQResizeEvent e( newSize, oldSize ); - TQApplication::sendSpontaneousEvent( this, &e ); - } else { - TQResizeEvent * e = new TQResizeEvent( newSize, oldSize ); - TQApplication::postEvent( this, e ); - } - } - - if ( newCPos != cr.topLeft() ) { // compare with cpos (exluding frame) - TQPoint oldPos = tqgeometry().topLeft(); - cr.moveTopLeft( newCPos ); - crect = cr; - if ( isVisible() ) { - TQMoveEvent e( newCPos, oldPos ); // pos (including frame), not cpos - TQApplication::sendSpontaneousEvent( this, &e ); - } else { - TQMoveEvent * e = new TQMoveEvent( newCPos, oldPos ); - TQApplication::postEvent( this, e ); - } - } - } else { - XEvent xevent; - while ( XCheckTypedWindowEvent(x11Display(),winId(), ConfigureNotify,&xevent) && - !qt_x11EventFilter(&xevent) && - !x11Event( &xevent ) ) // send event through filter - ; - } - - bool transbg = backgroundOrigin() != WidgetOrigin; - // we ignore NorthWestGravity at the moment for reversed tqlayout - if ( transbg || - (!testWFlags( WStaticContents ) && - testWState( WState_Exposed ) && was_resize ) || - TQApplication::reverseLayout() ) { - // remove unnecessary paint events from the queue - XEvent xevent; - while ( XCheckTypedWindowEvent( x11Display(), winId(), Expose, &xevent ) && - ! qt_x11EventFilter( &xevent ) && - ! x11Event( &xevent ) ) // send event through filter - ; - tqrepaint( !testWFlags(WResizeNoErase) || transbg ); - } - - incrementSyncCounter(); - - return TRUE; -} - - -// -// Close window event translation. -// -bool TQETWidget::translateCloseEvent( const XEvent * ) -{ - return close(FALSE); -} - - -/*! - Sets the text cursor's flash (blink) time to \a msecs - milliseconds. The flash time is the time required to display, - invert and restore the caret display. Usually the text cursor is - displayed for \a msecs/2 milliseconds, then hidden for \a msecs/2 - milliseconds, but this may vary. - - Note that on Microsoft Windows, calling this function sets the - cursor flash time for all windows. - - \sa cursorFlashTime() -*/ -void TQApplication::setCursorFlashTime( int msecs ) -{ - cursor_flash_time = msecs; -} - - -/*! - Returns the text cursor's flash (blink) time in milliseconds. The - flash time is the time required to display, invert and restore the - caret display. - - The default value on X11 is 1000 milliseconds. On Windows, the - control panel value is used. - - Widgets should not cache this value since it may be changed at any - time by the user changing the global desktop settings. - - \sa setCursorFlashTime() -*/ -int TQApplication::cursorFlashTime() -{ - return cursor_flash_time; -} - -/*! - Sets the time limit that distinguishes a double click from two - consecutive mouse clicks to \a ms milliseconds. - - Note that on Microsoft Windows, calling this function sets the - double click interval for all windows. - - \sa doubleClickInterval() -*/ - -void TQApplication::setDoubleClickInterval( int ms ) -{ - mouse_double_click_time = ms; -} - - -/*! - Returns the maximum duration for a double click. - - The default value on X11 is 400 milliseconds. On Windows, the - control panel value is used. - - \sa setDoubleClickInterval() -*/ - -int TQApplication::doubleClickInterval() -{ - return mouse_double_click_time; -} - - -/*! - Sets the number of lines to scroll when the mouse wheel is rotated - to \a n. - - If this number exceeds the number of visible lines in a certain - widget, the widget should interpret the scroll operation as a - single page up / page down operation instead. - - \sa wheelScrollLines() -*/ -void TQApplication::setWheelScrollLines( int n ) -{ - wheel_scroll_lines = n; -} - -/*! - Returns the number of lines to scroll when the mouse wheel is - rotated. - - \sa setWheelScrollLines() -*/ -int TQApplication::wheelScrollLines() -{ - return wheel_scroll_lines; -} - -/*! - Enables the UI effect \a effect if \a enable is TRUE, otherwise - the effect will not be used. - - Note: All effects are disabled on screens running at less than - 16-bit color depth. - - \sa isEffectEnabled(), TQt::UIEffect, setDesktopSettingsAware() -*/ -void TQApplication::setEffectEnabled( TQt::UIEffect effect, bool enable ) -{ - switch (effect) { - case UI_AnimateMenu: - if ( enable ) fade_menu = FALSE; - animate_menu = enable; - break; - case UI_FadeMenu: - if ( enable ) - animate_menu = TRUE; - fade_menu = enable; - break; - case UI_AnimateCombo: - animate_combo = enable; - break; - case UI_AnimateTooltip: - if ( enable ) fade_tooltip = FALSE; - animate_tooltip = enable; - break; - case UI_FadeTooltip: - if ( enable ) - animate_tooltip = TRUE; - fade_tooltip = enable; - break; - case UI_AnimateToolBox: - animate_toolbox = enable; - break; - default: - animate_ui = enable; - break; - } -} - -/*! - Returns TRUE if \a effect is enabled; otherwise returns FALSE. - - By default, TQt will try to use the desktop settings. Call - setDesktopSettingsAware(FALSE) to prevent this. - - Note: All effects are disabled on screens running at less than - 16-bit color depth. - - \sa setEffectEnabled(), TQt::UIEffect -*/ -bool TQApplication::isEffectEnabled( TQt::UIEffect effect ) -{ - if ( TQColor::numBitPlanes() < 16 || !animate_ui ) - return FALSE; - - switch( effect ) { - case UI_AnimateMenu: - return animate_menu; - case UI_FadeMenu: - return fade_menu; - case UI_AnimateCombo: - return animate_combo; - case UI_AnimateTooltip: - return animate_tooltip; - case UI_FadeTooltip: - return fade_tooltip; - case UI_AnimateToolBox: - return animate_toolbox; - default: - return animate_ui; - } -} - -/***************************************************************************** - Session management support - *****************************************************************************/ - -#ifndef TQT_NO_SM_SUPPORT - -#include <X11/SM/SMlib.h> - -class TQSessionManagerData -{ -public: - TQSessionManagerData( TQSessionManager* mgr, TQString& id, TQString& key ) - : sm( mgr ), sessionId( id ), sessionKey( key ) {} - TQSessionManager* sm; - TQStringList restartCommand; - TQStringList discardCommand; - TQString& sessionId; - TQString& sessionKey; - TQSessionManager::RestartHint restartHint; -}; - -class TQSmSocketReceiver : public TQObject -{ - TQ_OBJECT -public: - TQSmSocketReceiver( int socket ) - : TQObject(0,0) - { - TQSocketNotifier* sn = new TQSocketNotifier( socket, TQSocketNotifier::Read, this ); - connect( sn, TQT_SIGNAL( activated(int) ), this, TQT_SLOT( socketActivated(int) ) ); - } - -public Q_SLOTS: - void socketActivated(int); -}; - - -static SmcConn smcConnection = 0; -static bool sm_interactionActive; -static bool sm_smActive; -static int sm_interactStyle; -static int sm_saveType; -static bool sm_cancel; -// static bool sm_waitingForPhase2; ### never used?!? -static bool sm_waitingForInteraction; -static bool sm_isshutdown; -// static bool sm_shouldbefast; ### never used?!? -static bool sm_phase2; -static bool sm_in_phase2; - -static TQSmSocketReceiver* sm_receiver = 0; - -static void resetSmState(); -static void sm_setProperty( const char* name, const char* type, - int num_vals, SmPropValue* vals); -static void sm_saveYourselfCallback( SmcConn smcConn, SmPointer clientData, - int saveType, Bool shutdown , int interactStyle, Bool fast); -static void sm_saveYourselfPhase2Callback( SmcConn smcConn, SmPointer clientData ) ; -static void sm_dieCallback( SmcConn smcConn, SmPointer clientData ) ; -static void sm_shutdownCancelledCallback( SmcConn smcConn, SmPointer clientData ); -static void sm_saveCompleteCallback( SmcConn smcConn, SmPointer clientData ); -static void sm_interactCallback( SmcConn smcConn, SmPointer clientData ); -static void sm_performSaveYourself( TQSessionManagerData* ); - -static void resetSmState() -{ -// sm_waitingForPhase2 = FALSE; ### never used?!? - sm_waitingForInteraction = FALSE; - sm_interactionActive = FALSE; - sm_interactStyle = SmInteractStyleNone; - sm_smActive = FALSE; - sm_blockUserInput = FALSE; - sm_isshutdown = FALSE; -// sm_shouldbefast = FALSE; ### never used?!? - sm_phase2 = FALSE; - sm_in_phase2 = FALSE; -} - - -// theoretically it's possible to set several properties at once. For -// simplicity, however, we do just one property at a time -static void sm_setProperty( const char* name, const char* type, - int num_vals, SmPropValue* vals) -{ - if (num_vals ) { - SmProp prop; - prop.name = (char*)name; - prop.type = (char*)type; - prop.num_vals = num_vals; - prop.vals = vals; - - SmProp* props[1]; - props[0] = ∝ - SmcSetProperties( smcConnection, 1, props ); - } - else { - char* names[1]; - names[0] = (char*) name; - SmcDeleteProperties( smcConnection, 1, names ); - } -} - -static void sm_setProperty( const TQString& name, const TQString& value) -{ - SmPropValue prop; - prop.length = value.length(); - prop.value = (SmPointer) value.latin1(); - sm_setProperty( name.latin1(), SmARRAY8, 1, &prop ); -} - -static void sm_setProperty( const TQString& name, const TQStringList& value) -{ - SmPropValue *prop = new SmPropValue[ value.count() ]; - int count = 0; - for ( TQStringList::ConstIterator it = value.begin(); it != value.end(); ++it ) { - prop[ count ].length = (*it).length(); - prop[ count ].value = (char*)(*it).latin1(); - ++count; - } - sm_setProperty( name.latin1(), SmLISTofARRAY8, count, prop ); - delete [] prop; -} - - -// workaround for broken libsm, see below -struct TQT_smcConn { - unsigned int save_yourself_in_progress : 1; - unsigned int shutdown_in_progress : 1; -}; - -static void sm_saveYourselfCallback( SmcConn smcConn, SmPointer clientData, - int saveType, Bool shutdown , int interactStyle, Bool /*fast*/) -{ - if (smcConn != smcConnection ) - return; - sm_cancel = FALSE; - sm_smActive = TRUE; - sm_isshutdown = shutdown; - sm_saveType = saveType; - sm_interactStyle = interactStyle; -// sm_shouldbefast = fast; ### never used?!? - - // ugly workaround for broken libSM. libSM should do that _before_ - // actually invoking the callback in sm_process.c - ( (TQT_smcConn*)smcConn )->save_yourself_in_progress = TRUE; - if ( sm_isshutdown ) - ( (TQT_smcConn*)smcConn )->shutdown_in_progress = TRUE; - - sm_performSaveYourself( (TQSessionManagerData*) clientData ); - if ( !sm_isshutdown ) // we cannot expect a confirmation message in that case - resetSmState(); -} - -static void sm_performSaveYourself( TQSessionManagerData* smd ) -{ - if ( sm_isshutdown ) - sm_blockUserInput = TRUE; - - TQSessionManager* sm = smd->sm; - - // generate a new session key - timeval tv; - gettimeofday( &tv, 0 ); - smd->sessionKey = TQString::number( tv.tv_sec ) + "_" + TQString::number(tv.tv_usec); - - // tell the session manager about our program in best POSIX style - sm_setProperty( SmProgram, TQString( tqApp->argv()[0] ) ); - // tell the session manager about our user as well. - struct passwd* entry = getpwuid( geteuid() ); - if ( entry ) - sm_setProperty( SmUserID, TQString::tqfromLatin1( entry->pw_name ) ); - - // generate a restart and discard command that makes sense - TQStringList restart; - restart << tqApp->argv()[0] << "-session" << smd->sessionId + "_" + smd->sessionKey; - if (qstricmp(tqAppName(), tqAppClass()) != 0) - restart << "-name" << tqAppName(); - sm->setRestartCommand( restart ); - TQStringList discard; - sm->setDiscardCommand( discard ); - - switch ( sm_saveType ) { - case SmSaveBoth: - tqApp->commitData( *sm ); - if ( sm_isshutdown && sm_cancel) - break; // we cancelled the shutdown, no need to save state - // fall through - case SmSaveLocal: - tqApp->saveState( *sm ); - break; - case SmSaveGlobal: - tqApp->commitData( *sm ); - break; - default: - break; - } - - if ( sm_phase2 && !sm_in_phase2 ) { - SmcRequestSaveYourselfPhase2( smcConnection, sm_saveYourselfPhase2Callback, (SmPointer*) smd ); - sm_blockUserInput = FALSE; - } - else { - // close eventual interaction monitors and cancel the - // shutdown, if required. Note that we can only cancel when - // performing a shutdown, it does not work for checkpoints - if ( sm_interactionActive ) { - SmcInteractDone( smcConnection, sm_isshutdown && sm_cancel); - sm_interactionActive = FALSE; - } - else if ( sm_cancel && sm_isshutdown ) { - if ( sm->allowsErrorInteraction() ) { - SmcInteractDone( smcConnection, True ); - sm_interactionActive = FALSE; - } - } - - // set restart and discard command in session manager - sm_setProperty( SmRestartCommand, sm->restartCommand() ); - sm_setProperty( SmDiscardCommand, sm->discardCommand() ); - - // set the restart hint - SmPropValue prop; - prop.length = sizeof( int ); - int value = sm->restartHint(); - prop.value = (SmPointer) &value; - sm_setProperty( SmRestartStyleHint, SmCARD8, 1, &prop ); - - // we are done - SmcSaveYourselfDone( smcConnection, !sm_cancel ); - } -} - -static void sm_dieCallback( SmcConn smcConn, SmPointer /* clientData */) -{ - if (smcConn != smcConnection ) - return; - resetSmState(); - TQEvent quitEvent(TQEvent::Quit); - TQApplication::sendEvent(tqApp, &quitEvent); -} - -static void sm_shutdownCancelledCallback( SmcConn smcConn, SmPointer /* clientData */) -{ - if (smcConn != smcConnection ) - return; - if ( sm_waitingForInteraction ) - tqApp->exit_loop(); - resetSmState(); -} - -static void sm_saveCompleteCallback( SmcConn smcConn, SmPointer /*clientData */) -{ - if (smcConn != smcConnection ) - return; - resetSmState(); -} - -static void sm_interactCallback( SmcConn smcConn, SmPointer /* clientData */ ) -{ - if (smcConn != smcConnection ) - return; - if ( sm_waitingForInteraction ) - tqApp->exit_loop(); -} - -static void sm_saveYourselfPhase2Callback( SmcConn smcConn, SmPointer clientData ) -{ - if (smcConn != smcConnection ) - return; - sm_in_phase2 = TRUE; - sm_performSaveYourself( (TQSessionManagerData*) clientData ); -} - - -void TQSmSocketReceiver::socketActivated(int) -{ - IceProcessMessages( SmcGetIceConnection( smcConnection ), 0, 0); -} - - -#undef Bool -#include "tqapplication_x11.tqmoc" - -TQSessionManager::TQSessionManager( TQApplication * app, TQString &id, TQString& key ) - : TQObject( app, "session manager" ) -{ - d = new TQSessionManagerData( this, id, key ); - d->restartHint = RestartIfRunning; - - resetSmState(); - char cerror[256]; - char* myId = 0; - char* prevId = (char*)id.latin1(); // we know what we are doing - - SmcCallbacks cb; - cb.save_yourself.callback = sm_saveYourselfCallback; - cb.save_yourself.client_data = (SmPointer) d; - cb.die.callback = sm_dieCallback; - cb.die.client_data = (SmPointer) d; - cb.save_complete.callback = sm_saveCompleteCallback; - cb.save_complete.client_data = (SmPointer) d; - cb.shutdown_cancelled.callback = sm_shutdownCancelledCallback; - cb.shutdown_cancelled.client_data = (SmPointer) d; - - // avoid showing a warning message below - const char* session_manager = getenv("SESSION_MANAGER"); - if ( !session_manager || !session_manager[0] ) - return; - - smcConnection = SmcOpenConnection( 0, 0, 1, 0, - SmcSaveYourselfProcMask | - SmcDieProcMask | - SmcSaveCompleteProcMask | - SmcShutdownCancelledProcMask, - &cb, - prevId, - &myId, - 256, cerror ); - - id = TQString::tqfromLatin1( myId ); - ::free( myId ); // it was allocated by C - - TQString error = cerror; - if (!smcConnection ) { - qWarning("Session management error: %s", error.latin1() ); - } - else { - sm_receiver = new TQSmSocketReceiver( IceConnectionNumber( SmcGetIceConnection( smcConnection ) ) ); - } -} - -TQSessionManager::~TQSessionManager() -{ - if ( smcConnection ) - SmcCloseConnection( smcConnection, 0, 0 ); - smcConnection = 0; - delete sm_receiver; - delete d; -} - -TQString TQSessionManager::sessionId() const -{ - return d->sessionId; -} - -TQString TQSessionManager::sessionKey() const -{ - return d->sessionKey; -} - - -void* TQSessionManager::handle() const -{ - return (void*) smcConnection; -} - - -bool TQSessionManager::allowsInteraction() -{ - if ( sm_interactionActive ) - return TRUE; - - if ( sm_waitingForInteraction ) - return FALSE; - - if ( sm_interactStyle == SmInteractStyleAny ) { - sm_waitingForInteraction = SmcInteractRequest( smcConnection, SmDialogNormal, - sm_interactCallback, (SmPointer*) this ); - } - if ( sm_waitingForInteraction ) { - tqApp->enter_loop(); - sm_waitingForInteraction = FALSE; - if ( sm_smActive ) { // not cancelled - sm_interactionActive = TRUE; - sm_blockUserInput = FALSE; - return TRUE; - } - } - return FALSE; -} - -bool TQSessionManager::allowsErrorInteraction() -{ - if ( sm_interactionActive ) - return TRUE; - - if ( sm_waitingForInteraction ) - return FALSE; - - if ( sm_interactStyle == SmInteractStyleAny || sm_interactStyle == SmInteractStyleErrors ) { - sm_waitingForInteraction = SmcInteractRequest( smcConnection, SmDialogError, - sm_interactCallback, (SmPointer*) this ); - } - if ( sm_waitingForInteraction ) { - tqApp->enter_loop(); - sm_waitingForInteraction = FALSE; - if ( sm_smActive ) { // not cancelled - sm_interactionActive = TRUE; - sm_blockUserInput = FALSE; - return TRUE; - } - } - return FALSE; -} - -void TQSessionManager::release() -{ - if ( sm_interactionActive ) { - SmcInteractDone( smcConnection, False ); - sm_interactionActive = FALSE; - if ( sm_smActive && sm_isshutdown ) - sm_blockUserInput = TRUE; - } -} - -void TQSessionManager::cancel() -{ - sm_cancel = TRUE; -} - -void TQSessionManager::setRestartHint( TQSessionManager::RestartHint hint) -{ - d->restartHint = hint; -} - -TQSessionManager::RestartHint TQSessionManager::restartHint() const -{ - return d->restartHint; -} - -void TQSessionManager::setRestartCommand( const TQStringList& command) -{ - d->restartCommand = command; -} - -TQStringList TQSessionManager::restartCommand() const -{ - return d->restartCommand; -} - -void TQSessionManager::setDiscardCommand( const TQStringList& command) -{ - d->discardCommand = command; -} - -TQStringList TQSessionManager::discardCommand() const -{ - return d->discardCommand; -} - -void TQSessionManager::setManagerProperty( const TQString& name, const TQString& value) -{ - SmPropValue prop; - prop.length = value.length(); - prop.value = (SmPointer) value.utf8().data(); - sm_setProperty( name.latin1(), SmARRAY8, 1, &prop ); -} - -void TQSessionManager::setManagerProperty( const TQString& name, const TQStringList& value) -{ - SmPropValue *prop = new SmPropValue[ value.count() ]; - int count = 0; - for ( TQStringList::ConstIterator it = value.begin(); it != value.end(); ++it ) { - prop[ count ].length = (*it).length(); - prop[ count ].value = (char*)(*it).utf8().data(); - ++count; - } - sm_setProperty( name.latin1(), SmLISTofARRAY8, count, prop ); - delete [] prop; -} - -bool TQSessionManager::isPhase2() const -{ - return sm_in_phase2; -} - -void TQSessionManager::requestPhase2() -{ - sm_phase2 = TRUE; -} - - -#endif // TQT_NO_SM_SUPPORT - -#endif // USE_QT4 |