123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
- *
- * This 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 software 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 software; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
- * USA.
- */
- //
- // TXDialog.h
- //
- // A TXDialog is a pop-up dialog window. The dialog can be made visible by
- // calling its show() method. Dialogs can be modal or non-modal. For a modal
- // dialog box, the show() method only returns when the dialog box has been
- // dismissed. For a non-modal dialog box, the show() method returns
- // immediately.
- //
-
- #ifndef __TXDIALOG_H__
- #define __TXDIALOG_H__
-
- #include "TXWindow.h"
- #include <errno.h>
-
- class TXDialog : public TXWindow, public TXDeleteWindowCallback {
- public:
- TXDialog(Display* dpy, int width, int height, const char* name,
- bool modal_=false)
- : TXWindow(dpy, width, height), done(false), ok(false), modal(modal_)
- {
- toplevel(name, this);
- resize(width, height);
- }
-
- virtual ~TXDialog() {}
-
- // show() makes the dialog visible. For a modal dialog box, this processes X
- // events until the done flag has been set, after which it returns the value
- // of the ok flag. For a non-modal dialog box it always returns true
- // immediately.
- bool show() {
- ok = false;
- done = false;
- initDialog();
- raise();
- map();
- if (modal) {
- while (true) {
- TXWindow::handleXEvents(dpy);
- if (done) {
- return ok;
- }
- fd_set rfds;
- FD_ZERO(&rfds);
- FD_SET(ConnectionNumber(dpy), &rfds);
- int n = select(FD_SETSIZE, &rfds, 0, 0, 0);
- if (n < 0) throw rdr::SystemException("select",errno);
- }
- }
- return true;
- }
-
- // initDialog() can be overridden in a derived class. Typically it is used
- // to make sure that checkboxes have the right state, etc.
- virtual void initDialog() {}
-
- // resize() is overridden here to re-center the dialog
- void resize(int w, int h) {
- TXWindow::resize(w,h);
- int dpyWidth = WidthOfScreen(DefaultScreenOfDisplay(dpy));
- int dpyHeight = HeightOfScreen(DefaultScreenOfDisplay(dpy));
- setUSPosition((dpyWidth - width() - 10) / 2, (dpyHeight - height() - 30) / 2);
- }
-
- protected:
- virtual void deleteWindow(TXWindow* /*w*/) {
- ok = false;
- done = true;
- unmap();
- }
-
- bool done;
- bool ok;
- bool modal;
- };
-
- #endif
|