mirror of
https://github.com/kasmtech/KasmVNC.git
synced 2024-11-26 18:13:16 +01:00
97 lines
2.8 KiB
C
97 lines
2.8 KiB
C
|
/* 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
|