diff options
Diffstat (limited to 'tdm/kfrontend/kfdialog.cpp')
-rw-r--r-- | tdm/kfrontend/kfdialog.cpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/tdm/kfrontend/kfdialog.cpp b/tdm/kfrontend/kfdialog.cpp new file mode 100644 index 000000000..98b5773c2 --- /dev/null +++ b/tdm/kfrontend/kfdialog.cpp @@ -0,0 +1,182 @@ +/* + +Dialog class that handles input focus in absence of a wm + +Copyright (C) 1997, 1998 Steffen Hansen <[email protected]> +Copyright (C) 2000-2003 Oswald Buddenhagen <[email protected]> + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include "kfdialog.h" +#include "tdmconfig.h" + +#include <klocale.h> +#include <kpushbutton.h> +#include <kstdguiitem.h> +#include <kglobalsettings.h> + +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqapplication.h> +#include <tqcursor.h> + +#include <X11/Xlib.h> +#include <X11/Xatom.h> + +extern bool has_twin; +extern bool is_themed; + +FDialog::FDialog( TQWidget *parent, bool framed ) + : inherited( parent, 0, true, (framed&&has_twin)?0:WX11BypassWM ), winFrame(NULL), m_wmTitle(has_twin) +{ + if (framed) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(qt_xdisplay(), "_KDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(qt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + + if (framed) { + winFrame = new TQFrame( this, 0, TQt::WNoAutoErase ); + if (m_wmTitle) + winFrame->setFrameStyle( TQFrame::NoFrame ); + else + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + winFrame->setLineWidth( 2 ); + } else + winFrame = 0; + + setCaption(TDM_LOGIN_SCREEN_BASE_TITLE); + + if (framed) { + if (m_wmTitle) setFixedSize(sizeHint()); + } +} + +void +FDialog::resizeEvent( TQResizeEvent *e ) +{ + inherited::resizeEvent( e ); + if (winFrame) { + winFrame->resize( size() ); + winFrame->erase(); + if (m_wmTitle) setFixedSize(sizeHint()); + } +} + +void +FDialog::adjustGeometry() +{ + TQDesktopWidget *dsk = tqApp->desktop(); + + if (_greeterScreen < 0) + _greeterScreen = _greeterScreen == -2 ? + dsk->screenNumber( TQPoint( dsk->width() - 1, 0 ) ) : + dsk->screenNumber( TQPoint( 0, 0 ) ); + + TQRect scr = dsk->screenGeometry( _greeterScreen ); + if (!winFrame) + setFixedSize( scr.size() ); + else { + setMaximumSize( scr.size() * .9 ); + adjustSize(); + } + + if (parentWidget()) + return; + + TQRect grt( rect() ); + if (winFrame) { + unsigned x = 50, y = 50; + sscanf( _greeterPos, "%u,%u", &x, &y ); + grt.moveCenter( TQPoint( scr.x() + scr.width() * x / 100, + scr.y() + scr.height() * y / 100 ) ); + int di; + if ((di = scr.right() - grt.right()) < 0) + grt.moveBy( di, 0 ); + if ((di = scr.left() - grt.left()) > 0) + grt.moveBy( di, 0 ); + if ((di = scr.bottom() - grt.bottom()) < 0) + grt.moveBy( 0, di ); + if ((di = scr.top() - grt.top()) > 0) + grt.moveBy( 0, di ); + setGeometry( grt ); + } + + if (dsk->screenNumber( TQCursor::pos() ) != _greeterScreen) + TQCursor::setPos( grt.center() ); +} + +struct WinList { + struct WinList *next; + TQWidget *win; +}; + +int +FDialog::exec() +{ + static WinList *wins; + WinList *win; + + win = new WinList; + win->win = this; + win->next = wins; + wins = win; + show(); + setActiveWindow(); + inherited::exec(); + hide(); + wins = win->next; + delete win; + if (wins) + wins->win->setActiveWindow(); + return result(); +} + +void +FDialog::box( TQWidget *parent, TQMessageBox::Icon type, const TQString &text ) +{ + KFMsgBox dlg( parent, type, text.stripWhiteSpace() ); + dlg.exec(); +} + +KFMsgBox::KFMsgBox( TQWidget *parent, TQMessageBox::Icon type, const TQString &text ) + : inherited( parent, !is_themed ) +{ + if (type == TQMessageBox::NoIcon) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE); + if (type == TQMessageBox::Question) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Question")); + if (type == TQMessageBox::Information) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Information")); + if (type == TQMessageBox::Warning) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Warning")); + if (type == TQMessageBox::Critical) setCaption(TDM_LOGIN_SCREEN_BASE_TITLE + " - " + i18n("Error")); + + TQLabel *label1 = new TQLabel( this ); + label1->setPixmap( TQMessageBox::standardIcon( type ) ); + TQLabel *label2 = new TQLabel( text, this ); + TQRect d = KGlobalSettings::desktopGeometry(this); + if ( label2->fontMetrics().size( 0, text).width() > d.width() * 3 / 5) + label2->setAlignment(TQt::WordBreak | TQt::AlignAuto ); + KPushButton *button = new KPushButton( KStdGuiItem::ok(), this ); + button->setDefault( true ); + button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); + connect( button, TQT_SIGNAL(clicked()), TQT_SLOT(accept()) ); + + TQGridLayout *grid = new TQGridLayout( this, 2, 2, 10 ); + grid->addWidget( label1, 0, 0, Qt::AlignCenter ); + grid->addWidget( label2, 0, 1, Qt::AlignCenter ); + grid->addMultiCellWidget( button, 1,1, 0,1, Qt::AlignCenter ); +} |