From: Pierre Ossman Date: Thu, 30 Jan 2014 16:15:55 +0000 (+0100) Subject: Remove all unused TX widgets X-Git-Tag: v1.3.90~48^2~19 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=53f7857e4465f738ab9a7bd853859170eb5ce068;p=tigervnc.git Remove all unused TX widgets --- diff --git a/unix/tx/CMakeLists.txt b/unix/tx/CMakeLists.txt index ab46f03c..67976150 100644 --- a/unix/tx/CMakeLists.txt +++ b/unix/tx/CMakeLists.txt @@ -4,10 +4,6 @@ include_directories(${CMAKE_SOURCE_DIR}/common) include_directories(${CMAKE_SOURCE_DIR}/common/rfb) add_library(tx STATIC - TXWindow.cxx - TXScrollbar.cxx - TXViewport.cxx - TXImage.cxx - TXMenu.cxx) + TXWindow.cxx) target_link_libraries(tx ${X11_LIBRARIES}) diff --git a/unix/tx/TXEntry.h b/unix/tx/TXEntry.h deleted file mode 100644 index 1785a5f5..00000000 --- a/unix/tx/TXEntry.h +++ /dev/null @@ -1,191 +0,0 @@ -/* 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. - */ -// -// TXEntry.h -// -// A TXEntry allows you to enter a single line of text in a window. The entry -// must be tall enough to contain a line of text - if not then it will be -// resized appropriately. If the passwd argument to the constructor is true, -// then the text in the entry will be replaced by asterisks on the screen. -// - -#ifndef __TXENTRY_H__ -#define __TXENTRY_H__ - -#include "TXWindow.h" -#include - -#ifndef XK_ISO_Left_Tab -#define XK_ISO_Left_Tab 0xFE20 -#endif -#ifndef XK_KP_Delete -#define XK_KP_Delete 0xFF9F -#endif - -// TXEntryCallback's entryCallback() method is called when one of three special -// key presses have happened: Enter/Return, forward tab, or backward tab. -class TXEntry; -class TXEntryCallback { -public: - enum Detail { ENTER, NEXT_FOCUS, PREV_FOCUS }; - virtual void entryCallback(TXEntry* entry, Detail detail, Time time)=0; -}; - - -class TXEntry : public TXWindow, public TXEventHandler { -public: - - TXEntry(Display* dpy_, TXEntryCallback* cb_=0, - TXWindow* parent_=0, bool passwd_=false, int w=1, int h=1) - : TXWindow(dpy_, w, h, parent_), cb(cb_), - passwd(passwd_), disabled_(false), gotFocus(false) - { - setEventHandler(this); - gc = XCreateGC(dpy, win(), 0, 0); - addEventMask(ExposureMask | KeyPressMask | FocusChangeMask - | ButtonPressMask); - text[0] = 0; - int textHeight = (defaultFS->ascent + defaultFS->descent); - int newHeight = __rfbmax(height(), textHeight + yPad*2 + bevel*2); - if (height() < newHeight) { - resize(width(), newHeight); - } - } - - virtual ~TXEntry() { - XFreeGC(dpy, gc); - // overwrite memory used to store password - not critical, but can avoid - // accidental exposure of a password in uninitialised memory. - if (passwd) - memset(text, 0, maxLen); - } - - // getText() gets the text in the entry. - const char* getText() { return text; } - - // setText() sets the text in the entry. - void setText(const char* text_) { - strncpy(text, text_, maxLen-1); - text[maxLen-1] = 0; - paint(); - } - - // disabled() sets or queries the disabled state of the entry. A disabled - // entry cannot have text entered into it. - void disabled(bool b) { disabled_ = b; paint(); } - bool disabled() { return disabled_; } - -private: - void paint() { - if (disabled_) - drawBevel(gc, 0, 0, width(), height(), bevel, disabledBg,darkBg,lightBg); - else - drawBevel(gc, 0, 0, width(), height(), bevel, enabledBg, darkBg,lightBg); - char* str = text; - char stars[maxLen]; - if (passwd) { - int i; - for (i = 0; i < (int)strlen(text); i++) stars[i] = '*'; - stars[i] = 0; - str = stars; - } - int tw = XTextWidth(defaultFS, str, strlen(str)); - int startx = bevel + xPad; - if (startx + tw > width() - 2*bevel) { - startx = width() - 2*bevel - tw; - } - XDrawString(dpy, win(), defaultGC, startx, - (height() + defaultFS->ascent - defaultFS->descent) / 2, - str, strlen(str)); - if (!disabled_ && gotFocus) - XDrawLine(dpy, win(), defaultGC, startx+tw, - (height() - defaultFS->ascent - defaultFS->descent) / 2, - startx+tw, - (height() + defaultFS->ascent + defaultFS->descent) / 2); - } - - virtual void handleEvent(TXWindow* w, XEvent* ev) { - switch (ev->type) { - case Expose: - paint(); - break; - - case FocusIn: - gotFocus = true; - paint(); - break; - - case FocusOut: - gotFocus = false; - paint(); - break; - - case ButtonPress: - if (!disabled_) - XSetInputFocus(dpy, win(), RevertToParent, ev->xbutton.time); - break; - - case KeyPress: - { - if (disabled_ || !gotFocus) break; - KeySym keysym; - XComposeStatus compose; - char buf[10]; - int count = XLookupString(&ev->xkey, buf, 10, &keysym, &compose); - if (count >= 1 && buf[0] >= ' ' && buf[0] <= '~') { - if (strlen(text) + count >= maxLen) { - XBell(dpy, 0); - } else { - strncat(text, buf, count); - paint(); - } - } else if (keysym == XK_BackSpace || keysym == XK_Delete || - keysym == XK_KP_Delete) { - if (strlen(text) > 0) { - text[strlen(text)-1] = 0; - paint(); - } - } else if (keysym == XK_Return || keysym == XK_KP_Enter || - keysym == XK_Linefeed) { - if (cb) cb->entryCallback(this, TXEntryCallback::ENTER, - ev->xkey.time); - } else if ((keysym == XK_Tab || keysym == XK_KP_Tab) - && !(ev->xkey.state & ShiftMask)) - { - if (cb) cb->entryCallback(this, TXEntryCallback::NEXT_FOCUS, - ev->xkey.time); - } else if (((keysym == XK_Tab || keysym == XK_KP_Tab) - && (ev->xkey.state & ShiftMask)) - || keysym == XK_ISO_Left_Tab) - { - if (cb) cb->entryCallback(this, TXEntryCallback::PREV_FOCUS, - ev->xkey.time); - } - } - } - } - GC gc; - enum { maxLen = 256 }; - char text[maxLen]; - TXEntryCallback* cb; - bool passwd; - bool disabled_; - bool gotFocus; -}; - -#endif diff --git a/unix/tx/TXImage.cxx b/unix/tx/TXImage.cxx deleted file mode 100644 index db20d6f3..00000000 --- a/unix/tx/TXImage.cxx +++ /dev/null @@ -1,361 +0,0 @@ -/* 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. - */ -// -// TXImage.cxx -// - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "TXWindow.h" -#include "TXImage.h" - -using namespace rfb; - -static rfb::LogWriter vlog("TXImage"); - -TXImage::TXImage(Display* d, int width, int height, Visual* vis_, int depth_) - : xim(0), dpy(d), vis(vis_), depth(depth_), tig(0), cube(0) -{ -#ifdef HAVE_MITSHM - shminfo = 0; -#endif - width_ = width; - height_ = height; - for (int i = 0; i < 256; i++) - colourMap[i].r = colourMap[i].g = colourMap[i].b = 0; - - if (!vis) - vis = DefaultVisual(dpy,DefaultScreen(dpy)); - if (!depth) - depth = DefaultDepth(dpy,DefaultScreen(dpy)); - - createXImage(); - getNativePixelFormat(vis, depth); - colourmap = this; - format.bpp = 0; // just make it different to any valid format, so that... - setPF(nativePF); // ...setPF() always works -} - -TXImage::~TXImage() -{ - if (data != (rdr::U8*)xim->data) delete [] data; - destroyXImage(); - delete tig; - delete cube; -} - -void TXImage::resize(int w, int h) -{ - if (w == width() && h == height()) return; - - int oldStrideBytes = getStride() * (format.bpp/8); - int rowsToCopy = __rfbmin(h, height()); - int bytesPerRow = __rfbmin(w, width()) * (format.bpp/8); - rdr::U8* oldData = 0; - bool allocData = false; - - if (data != (rdr::U8*)xim->data) { - oldData = (rdr::U8*)data; - allocData = true; - } else { - oldData = new rdr::U8[xim->bytes_per_line * height()]; - memcpy(oldData, xim->data, xim->bytes_per_line * height()); - } - - destroyXImage(); - width_ = w; - height_ = h; - createXImage(); - - if (allocData) - data = new rdr::U8[width() * height() * (format.bpp/8)]; - else - data = (rdr::U8*)xim->data; - - int newStrideBytes = getStride() * (format.bpp/8); - for (int i = 0; i < rowsToCopy; i++) - memcpy((rdr::U8*)data + newStrideBytes * i, oldData + oldStrideBytes * i, - bytesPerRow); - delete [] oldData; -} - -void TXImage::setPF(const PixelFormat& newPF) -{ - if (newPF.equal(format)) return; - format = newPF; - - if (data != (rdr::U8*)xim->data) delete [] data; - delete tig; - tig = 0; - - if (format.equal(nativePF) && format.trueColour) { - data = (rdr::U8*)xim->data; - } else { - data = new rdr::U8[width() * height() * (format.bpp/8)]; - tig = new TransImageGetter(); - tig->init(this, nativePF, 0, cube); - } -} - -int TXImage::getStride() const -{ - if (data == (rdr::U8*)xim->data) - return xim->bytes_per_line / (xim->bits_per_pixel / 8); - else - return width(); -} - -void TXImage::put(Window win, GC gc, const rfb::Rect& r) -{ - if (r.is_empty()) return; - int x = r.tl.x; - int y = r.tl.y; - int w = r.width(); - int h = r.height(); - if (data != (rdr::U8*)xim->data) { - rdr::U8* ximDataStart = ((rdr::U8*)xim->data + y * xim->bytes_per_line - + x * (xim->bits_per_pixel / 8)); - tig->getImage(ximDataStart, r, - xim->bytes_per_line / (xim->bits_per_pixel / 8)); - } -#ifdef HAVE_MITSHM - if (usingShm()) { - XShmPutImage(dpy, win, gc, xim, x, y, x, y, w, h, False); - return; - } -#endif - XPutImage(dpy, win, gc, xim, x, y, x, y, w, h); -} - -void TXImage::setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs) -{ - for (int i = 0; i < nColours; i++) { - colourMap[firstColour+i].r = rgbs[i*3]; - colourMap[firstColour+i].g = rgbs[i*3+1]; - colourMap[firstColour+i].b = rgbs[i*3+2]; - } -} - -void TXImage::updateColourMap() -{ - if (tig != 0) - tig->setColourMapEntries(0, 0); -} - -void TXImage::lookup(int index, int* r, int* g, int* b) -{ - *r = colourMap[index].r; - *g = colourMap[index].g; - *b = colourMap[index].b; -} - -#ifdef HAVE_MITSHM -static bool caughtError = false; - -static int XShmAttachErrorHandler(Display *dpy, XErrorEvent *error) -{ - caughtError = true; - return 0; -} - -class TXImageCleanup { -public: - std::list images; - ~TXImageCleanup() { - while (!images.empty()) - delete images.front(); - } -}; - -static TXImageCleanup imageCleanup; -#endif - -void TXImage::createXImage() -{ -#ifdef HAVE_MITSHM - int major, minor; - Bool pixmaps; - - if (XShmQueryVersion(dpy, &major, &minor, &pixmaps)) { - shminfo = new XShmSegmentInfo; - - xim = XShmCreateImage(dpy, vis, depth, ZPixmap, - 0, shminfo, width(), height()); - - if (xim) { - shminfo->shmid = shmget(IPC_PRIVATE, - xim->bytes_per_line * xim->height, - IPC_CREAT|0777); - - if (shminfo->shmid != -1) { - shminfo->shmaddr = xim->data = (char*)shmat(shminfo->shmid, 0, 0); - - if (shminfo->shmaddr != (char *)-1) { - - shminfo->readOnly = False; - - XErrorHandler oldHdlr = XSetErrorHandler(XShmAttachErrorHandler); - XShmAttach(dpy, shminfo); - XSync(dpy, False); - XSetErrorHandler(oldHdlr); - - if (!caughtError) { - vlog.debug("Using shared memory XImage"); - imageCleanup.images.push_back(this); - return; - } - - shmdt(shminfo->shmaddr); - } else { - vlog.error("shmat failed"); - perror("shmat"); - } - - shmctl(shminfo->shmid, IPC_RMID, 0); - } else { - vlog.error("shmget failed"); - perror("shmget"); - } - - XDestroyImage(xim); - xim = 0; - } else { - vlog.error("XShmCreateImage failed"); - } - - delete shminfo; - shminfo = 0; - } -#endif - - xim = XCreateImage(dpy, vis, depth, ZPixmap, - 0, 0, width(), height(), BitmapPad(dpy), 0); - - xim->data = (char*)malloc(xim->bytes_per_line * xim->height); - if (!xim->data) { - vlog.error("malloc failed"); - exit(1); - } -} - -void TXImage::destroyXImage() -{ -#ifdef HAVE_MITSHM - if (shminfo) { - vlog.debug("Freeing shared memory XImage"); - shmdt(shminfo->shmaddr); - shmctl(shminfo->shmid, IPC_RMID, 0); - delete shminfo; - shminfo = 0; - imageCleanup.images.remove(this); - } -#endif - // XDestroyImage() will free(xim->data) if appropriate - if (xim) XDestroyImage(xim); - xim = 0; -} - - -static bool supportedBPP(int bpp) { - return (bpp == 8 || bpp == 16 || bpp == 32); -} - -static int depth2bpp(Display* dpy, int depth) -{ - int nformats; - XPixmapFormatValues* format = XListPixmapFormats(dpy, &nformats); - - int i; - for (i = 0; i < nformats; i++) - if (format[i].depth == depth) break; - - if (i == nformats || !supportedBPP(format[i].bits_per_pixel)) - throw rfb::Exception("Error: couldn't find suitable pixmap format"); - - int bpp = format[i].bits_per_pixel; - XFree(format); - return bpp; -} - -void TXImage::getNativePixelFormat(Visual* vis, int depth) -{ - int bpp; - int trueColour, bigEndian; - int redShift, greenShift, blueShift; - int redMax, greenMax, blueMax; - - cube = 0; - - bpp = depth2bpp(dpy, depth); - bigEndian = (ImageByteOrder(dpy) == MSBFirst); - trueColour = (vis->c_class == TrueColor); - - vlog.info("Using default colormap and visual, %sdepth %d.", - (vis->c_class == TrueColor) ? "TrueColor, " : - ((vis->c_class == PseudoColor) ? "PseudoColor, " : ""), - depth); - - redShift = ffs(vis->red_mask) - 1; - greenShift = ffs(vis->green_mask) - 1; - blueShift = ffs(vis->blue_mask) - 1; - redMax = vis->red_mask >> redShift; - greenMax = vis->green_mask >> greenShift; - blueMax = vis->blue_mask >> blueShift; - - nativePF = PixelFormat(bpp, depth, bigEndian, trueColour, - redMax, greenMax, blueMax, - redShift, greenShift, blueShift); - - if (!trueColour) { - XColor xc[256]; - cube = new rfb::ColourCube(6,6,6); - int r; - for (r = 0; r < cube->nRed; r++) { - for (int g = 0; g < cube->nGreen; g++) { - for (int b = 0; b < cube->nBlue; b++) { - int i = (r * cube->nGreen + g) * cube->nBlue + b; - xc[i].red = r * 65535 / (cube->nRed-1); - xc[i].green = g * 65535 / (cube->nGreen-1); - xc[i].blue = b * 65535 / (cube->nBlue-1); - } - } - } - - TXWindow::getColours(dpy, xc, cube->size()); - - for (r = 0; r < cube->nRed; r++) { - for (int g = 0; g < cube->nGreen; g++) { - for (int b = 0; b < cube->nBlue; b++) { - int i = (r * cube->nGreen + g) * cube->nBlue + b; - cube->set(r, g, b, xc[i].pixel); - } - } - } - } -} diff --git a/unix/tx/TXImage.h b/unix/tx/TXImage.h deleted file mode 100644 index 055bd22d..00000000 --- a/unix/tx/TXImage.h +++ /dev/null @@ -1,97 +0,0 @@ -/* 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. - */ -// -// TXImage.h -// -// A TXImage represents a rectangular off-screen image in any RFB pixel format. -// By default it will use the "native" pixel format for the screen, which will -// be an 8-bit colourmap unless the X display is TrueColor. The pixel format -// can be changed via the setPF() method. The pixel data is accessible via the -// data member inherited from FullFramePixelBuffer, or can be set via the -// fillRect(), imageRect(), copyRect() and maskRect() methods, also inherited -// from PixelBuffer. A rectangle of the image can be drawn into an X Window -// via the put() method. If using a colourmap, the setColourMapEntries() and -// updateColourMap() methods must be called to set up the colourmap as -// appropriate. - - -#ifndef __TXIMAGE_H__ -#define __TXIMAGE_H__ - -#include -#include -#include -#include -#ifdef HAVE_MITSHM -#include -#endif - -namespace rfb { class TransImageGetter; } - -class TXImage : public rfb::FullFramePixelBuffer, public rfb::ColourMap { -public: - TXImage(Display* dpy, int width, int height, Visual* vis=0, int depth=0); - ~TXImage(); - - // resize() resizes the image, preserving the image data where possible. - void resize(int w, int h); - - // put causes the given rectangle to be drawn onto the given window. - void put(Window win, GC gc, const rfb::Rect& r); - - // setColourMapEntries() changes some of the entries in the colourmap. - // However these settings won't take effect until updateColourMap() is - // called. This is because recalculating the internal translation table can - // be expensive. - void setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs); - void updateColourMap(); - -#ifdef HAVE_MITSHM - bool usingShm() { return shminfo; } -#else - bool usingShm() { return 0; } -#endif - - // PixelBuffer methods - // width(), height(), getPF() etc are inherited from PixelBuffer - virtual void setPF(const rfb::PixelFormat& pf); - virtual int getStride() const; - -private: - - // ColourMap method - virtual void lookup(int index, int* r, int* g, int* b); - - void createXImage(); - void destroyXImage(); - void getNativePixelFormat(Visual* vis, int depth); - - XImage* xim; - Display* dpy; - Visual* vis; - int depth; -#ifdef HAVE_MITSHM - XShmSegmentInfo* shminfo; -#endif - rfb::TransImageGetter* tig; - rfb::Colour colourMap[256]; - rfb::PixelFormat nativePF; - rfb::ColourCube* cube; -}; - -#endif diff --git a/unix/tx/TXMenu.cxx b/unix/tx/TXMenu.cxx deleted file mode 100644 index 92712f55..00000000 --- a/unix/tx/TXMenu.cxx +++ /dev/null @@ -1,186 +0,0 @@ -/* 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. - */ -// -// TXMenu.cxx -// - -#include "TXMenu.h" -#include -#include -#include -#include -#include -#include - -TXMenu::TXMenu(Display* dpy_, TXMenuCallback* cb_, int w, int h, - TXWindow* parent_) - : TXWindow(dpy_, w, h, parent_), cb(cb_), nEntries(0), - highlight(-1) -{ - setEventHandler(this); - gc = XCreateGC(dpy, win(), 0, 0); - addEventMask(ExposureMask | ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | EnterWindowMask | LeaveWindowMask); -} - -TXMenu::~TXMenu() -{ - XFreeGC(dpy, gc); - for (int i = 0; i < nEntries; i++) - delete [] text[i]; -} - -inline int TXMenu::entryHeight(int i) -{ - if (text[i]) - return defaultFS->ascent + defaultFS->descent + bevel*2 + yPad*2; - else - return yPad*2 + 1; -} - -void TXMenu::addEntry(const char* text_, long id_) -{ - assert(nEntries < maxEntries); - text[nEntries] = rfb::strDup(text_); - checked[nEntries] = false; - id[nEntries++] = id_; - int tw = 0; - if (text_) - tw = XTextWidth(defaultFS, text_, strlen(text_)); - int newWidth = width(); - if (tw + bevel*2 + xPad*5 + tickSize > width()) - newWidth = tw + bevel*2 + xPad*5 + tickSize; - int newHeight = 0; - for (int i = 0; i < nEntries; i++) - newHeight += entryHeight(i); - resize(newWidth, newHeight); -} - -void TXMenu::check(long id_, bool checked_) -{ - for (int i = 0; i < nEntries; i++) { - if (id[i] == id_) { - checked[i] = checked_; - break; - } - } -} - -void TXMenu::paint() -{ - int y = 0; - for (int i = 0; i < nEntries; i++) { - if (text[i]) { - if (i == highlight) - drawBevel(gc, 0, y, width(), entryHeight(i), bevel, - defaultBg, darkBg, lightBg); - else - XClearArea(dpy, win(), 0, y, width(), entryHeight(i), false); - if (checked[i]) - XCopyPlane(dpy, tick, win(), defaultGC, 0, 0, tickSize, tickSize, - bevel + xPad, - y + bevel + yPad + defaultFS->ascent - tickSize, 1); - - XDrawImageString(dpy, win(), defaultGC, bevel + xPad*2 + tickSize, - y + bevel + yPad + defaultFS->ascent, - text[i], strlen(text[i])); - } else { - XDrawLine(dpy, win(), defaultGC, bevel + xPad, y + entryHeight(i) / 2, - width() - bevel - xPad, y + entryHeight(i) / 2); - } - y += entryHeight(i); - } -} - -void TXMenu::handleEvent(TXWindow* w, XEvent* ev) -{ - switch (ev->type) { - case Expose: - paint(); - break; - - case ButtonRelease: - { - int y = ev->xmotion.y; - int entryY = 0; - for (int i = 0; i < nEntries; i++) { - if (y >= entryY && y <= entryY + entryHeight(i)) { - if (cb && text[i]) - cb->menuSelect(id[i], this); - break; - } - entryY += entryHeight(i); - } - highlight = -1; - paint(); - break; - } - - case ButtonPress: - case MotionNotify: - { - int y = ev->xmotion.y; - int entryY = 0; - for (int i = 0; i < nEntries; i++) { - if (y >= entryY && y <= entryY + entryHeight(i)) { - if (highlight != i) { - highlight = i; - paint(); - } - break; - } - entryY += entryHeight(i); - } - break; - } - - case KeyPress: - { - KeySym ks; - char str[256]; - XLookupString(&ev->xkey, str, 256, &ks, NULL); - if (ks == XK_Escape) { - highlight = -1; - unmap(); - } else if (ks == XK_Down || ks == XK_Up) { - if (nEntries < 1) break; - if (highlight < 0) - highlight = (ks == XK_Down ? nEntries-1 : 0); - int start = highlight; - int inc = (ks == XK_Down ? 1 : nEntries-1); - do { - highlight = (highlight + inc) % nEntries; - } while (highlight != start && !text[highlight]); - paint(); - } else if (ks == XK_space || ks == XK_KP_Space || - ks == XK_Return || ks == XK_KP_Enter) { - if (cb && highlight >= 0 && text[highlight]) - cb->menuSelect(id[highlight], this); - highlight = -1; - paint(); - } - break; - } - - case EnterNotify: - case LeaveNotify: - highlight = -1; - paint(); - break; - } -} diff --git a/unix/tx/TXMenu.h b/unix/tx/TXMenu.h deleted file mode 100644 index d0245ee9..00000000 --- a/unix/tx/TXMenu.h +++ /dev/null @@ -1,67 +0,0 @@ -/* 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. - */ -// -// TXMenu.h -// -// A TXMenu consists of multiple entries which can be added one at a time. -// Each entry consists of some text, and has an associated integer identifier. -// A callback is made when a menu entry is selected. -// - -#ifndef __TXMENU_H__ -#define __TXMENU_H__ - -#include "TXWindow.h" - -// TXMenuCallback's menuSelect() method is called when a particular menu entry -// is selected. The id argument identifies the menu entry. -class TXMenu; -class TXMenuCallback { -public: - virtual void menuSelect(long id, TXMenu* menu)=0; -}; - -class TXMenu : public TXWindow, public TXEventHandler { -public: - TXMenu(Display* dpy_, TXMenuCallback* cb=0, int width=1, int height=1, - TXWindow* parent_=0); - virtual ~TXMenu(); - - // addEntry() adds an entry to the end of the menu with the given text and - // identifier. - void addEntry(const char* text, long id); - - // check() sets whether the given menu entry should have a tick next to it. - void check(long id, bool checked); - -private: - int entryHeight(int i); - virtual void handleEvent(TXWindow* w, XEvent* ev); - void paint(); - - GC gc; - TXMenuCallback* cb; - enum { maxEntries = 64 }; - char* text[maxEntries]; - long id[maxEntries]; - bool checked[maxEntries]; - int nEntries; - int highlight; -}; - -#endif diff --git a/unix/tx/TXMsgBox.h b/unix/tx/TXMsgBox.h deleted file mode 100644 index ff84e6ae..00000000 --- a/unix/tx/TXMsgBox.h +++ /dev/null @@ -1,112 +0,0 @@ -/* 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. - */ -// -// TXMsgBox.h -// -// A TXMsgBox is a specialised pop-up dialog window, designed to present -// the user with a small amount of textual information, and potentially to -// obtain their response. -// TXMsgBoxes are always modal, and may have an Ok button, Ok+Cancel buttons, -// or Yes+No buttons. -// The MsgBox helper function creates a TXMsgBox on the fly, runs it, and -// returns the result. -// - -#ifndef __TXMSGBOX_H__ -#define __TXMSGBOX_H__ - -#include "TXDialog.h" -#include "TXLabel.h" -#include "TXButton.h" - -enum TXMsgBoxFlags { - MB_OK = 0, - MB_OKCANCEL = 1, - MB_YESNO = 4, - MB_ICONERROR = 0x10, - MB_ICONQUESTION = 0x20, - MB_ICONWARNING = 0x30, - MB_ICONINFORMATION = 0x40, - MB_DEFBUTTON1 = 0, - MB_DEFBUTTON2 = 0x100 -}; - -class TXMsgBox : public TXDialog, public TXButtonCallback { -public: - TXMsgBox(Display* dpy, const char* text, unsigned int flags, const char* title=0) - : TXDialog(dpy, 1, 1, "Message", true), - textLabel(dpy, "", this), - okButton(dpy, "OK", this, this, 60), - cancelButton(dpy, "Cancel", this, this, 60) - { - textLabel.xPad = 8; - textLabel.move(0, yPad*4); - textLabel.setText(text); - resize(textLabel.width(), - textLabel.height() + okButton.height() + yPad*12); - - switch (flags & 0x30) { - case MB_ICONERROR: - toplevel("Error", this); break; - case MB_ICONQUESTION: - toplevel("Question", this); break; - case MB_ICONWARNING: - toplevel("Warning", this); break; - case MB_ICONINFORMATION: - toplevel("Information", this); break; - default: - if (title) - toplevel(title, this); - break; - }; - - switch (flags & 0x7) { - default: - okButton.move((width() - okButton.width()) / 2, - height() - yPad*4 - okButton.height()); - cancelButton.unmap(); - break; - case MB_OKCANCEL: - case MB_YESNO: - - okButton.move(((width()/2) - okButton.width()) / 2, - height() - yPad*4 - okButton.height()); - cancelButton.move(((width()*3/2) - cancelButton.width()) / 2, - height() - yPad*4 - cancelButton.height()); - if ((flags & 0x7) == MB_YESNO) { - okButton.setText("Yes"); - cancelButton.setText("No"); - } - break; - }; - - setBorderWidth(1); - } - - virtual void buttonActivate(TXButton* b) { - ok = (b == &okButton); - done = true; - unmap(); - } - - TXLabel textLabel; - TXButton okButton; - TXButton cancelButton; -}; - -#endif diff --git a/unix/tx/TXScrollbar.cxx b/unix/tx/TXScrollbar.cxx deleted file mode 100644 index 47e124c3..00000000 --- a/unix/tx/TXScrollbar.cxx +++ /dev/null @@ -1,119 +0,0 @@ -/* 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. - */ -// -// TXScrollbar.cxx -// - -#include "TXScrollbar.h" -#include -#include - -TXScrollbar::TXScrollbar(Display* dpy_, int width, int height, bool vert, - TXScrollbarCallback* cb_, TXWindow* parent_) - : TXWindow(dpy_, width, height, parent_), cb(cb_), vertical(vert), - clickedInThumb(false) -{ - setEventHandler(this); - gc = XCreateGC(dpy, win(), 0, 0); - addEventMask(ExposureMask | ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask); - setBg(scrollbarBg); - limit[0] = len[0] = limit[1] = len[1] = 1; - start[0] = start[1] = 0; -} - -TXScrollbar::~TXScrollbar() -{ - XFreeGC(dpy, gc); -} - -void TXScrollbar::set(int limit_, int start_, int len_, bool vert) -{ - assert(limit_ > 0 && len_ >= 0 && len_ <= limit_); - - if (start_ < 0) start_ = 0; - if (start_ > limit_ - len_) start_ = limit_ - len_; - - if (limit[vert] != limit_ || start[vert] != start_ || len[vert] != len_) { - limit[vert] = limit_; - start[vert] = start_; - len[vert] = len_; - paint(); - } -} - -void TXScrollbar::paint() -{ - int x = scaleToBarX(start[0]); - int y = scaleToBarY(start[1]); - int w = scaleToBarX(len[0]); - int h = scaleToBarY(len[1]); - if (y > 0) XClearArea(dpy, win(), 0, 0, 0, y, false); - if (x > 0) XClearArea(dpy, win(), 0, y, x, y+h, false); - XClearArea(dpy, win(), x+w, y, 0, y+h, false); - XClearArea(dpy, win(), 0, y+h, 0, 0, false); - drawBevel(gc, x, y, w, h, bevel, defaultBg, lightBg, darkBg); -} - -void TXScrollbar::handleEvent(TXWindow* w, XEvent* ev) -{ - switch (ev->type) { - case Expose: - paint(); - break; - - case ButtonPress: - { - xDown = ev->xbutton.x; - yDown = ev->xbutton.y; - xStart = start[0]; - yStart = start[1]; - bool clickedInThumbX = false; - if (xDown < scaleToBarX(start[0])) { - set(limit[0], start[0] - len[0], len[0], false); - } else if (xDown >= scaleToBarX(start[0]+len[0])) { - set(limit[0], start[0] + len[0], len[0], false); - } else { - clickedInThumbX = true; - } - bool clickedInThumbY = false; - if (yDown < scaleToBarY(start[1])) { - set(limit[1], start[1] - len[1], len[1], true); - } else if (yDown >= scaleToBarY(start[1]+len[1])) { - set(limit[1], start[1] + len[1], len[1], true); - } else { - clickedInThumbY = true; - } - clickedInThumb = clickedInThumbX && clickedInThumbY; - if (cb) cb->scrollbarPos(start[0], start[1], this); - } - break; - - case ButtonRelease: - case MotionNotify: - while (XCheckTypedWindowEvent(dpy, win(), MotionNotify, ev)); - if (clickedInThumb) { - int dx = ev->xmotion.x - xDown; - int dy = ev->xmotion.y - yDown; - set(limit[0], xStart + barToScaleX(dx), len[0], false); - set(limit[1], yStart + barToScaleY(dy), len[1], true); - if (cb) cb->scrollbarPos(start[0], start[1], this); - } - break; - } -} diff --git a/unix/tx/TXScrollbar.h b/unix/tx/TXScrollbar.h deleted file mode 100644 index 87fec3d8..00000000 --- a/unix/tx/TXScrollbar.h +++ /dev/null @@ -1,82 +0,0 @@ -/* 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. - */ -// -// TXScrollbar.h -// -// A TXScrollbar represents a range of values starting at start, of length len, -// between zero and limit. The vertical argument to the constructor says -// whether the scrollbar is horizontal or vertical. -// -// In fact it can represent a range in each dimension but usually one of the -// dimensions is fixed, according to the vertical flag (for a vertical -// scrollbar, the horizontal dimension is fixed, and vice-versa). -// -// The TXScrollbarCallback argument is an object which will be notified when -// the user has attempted to move the scrollbar. The x and y arguments to the -// scrollbarPos() method give the start values in the respective dimensions. -// They are guaranteed to be between 0 and limit-len. -// - -#ifndef __TXSCROLLBAR_H__ -#define __TXSCROLLBAR_H__ - -#include "TXWindow.h" - -class TXScrollbarCallback; - -class TXScrollbar : public TXWindow, public TXEventHandler { -public: - TXScrollbar(Display* dpy_, int width=1, int height=1, bool vertical=false, - TXScrollbarCallback* cb=0, TXWindow* parent_=0); - virtual ~TXScrollbar(); - - // set() sets the limit, start and length of the range represented by the - // scrollbar. The values of limit and len passed in must be valid - // (i.e. limit > 0 and 0 <= len <= limit). Values of start are clipped to - // the range 0 to limit-len. - void set(int limit, int start, int len) { set(limit, start, len, vertical); } - - // set() with an extra argument vert can be used to represent a range in both - // dimensions simultaneously. - void set(int limit, int start, int len, bool vert); - - virtual void handleEvent(TXWindow* w, XEvent* ev); - -private: - int scaleToBarX(int x) { return (x * width() + limit[0]/2) / limit[0]; } - int scaleToBarY(int y) { return (y * height() + limit[1]/2) / limit[1]; } - int barToScaleX(int x) { return (x * limit[0] + width()/2) / width(); } - int barToScaleY(int y) { return (y * limit[1] + height()/2) / height(); } - void paint(); - - GC gc; - TXScrollbarCallback* cb; - int limit[2]; - int start[2]; - int len[2]; - int xDown, yDown; - int xStart, yStart; - bool vertical; - bool clickedInThumb; -}; - -class TXScrollbarCallback { -public: - virtual void scrollbarPos(int x, int y, TXScrollbar* sb)=0; -}; -#endif diff --git a/unix/tx/TXViewport.cxx b/unix/tx/TXViewport.cxx deleted file mode 100644 index 60648933..00000000 --- a/unix/tx/TXViewport.cxx +++ /dev/null @@ -1,189 +0,0 @@ -/* 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. - */ -// -// TXViewport.cxx -// - -#include "TXViewport.h" -#include - -TXViewport::TXViewport(Display* dpy_, int w, int h, TXWindow* parent_) - : TXWindow(dpy_, w, h, parent_), child(0), hScrollbar(0), - vScrollbar(0), scrollbarSize(15), xOff(0), yOff(0), bumpScrollTimer(this), - bumpScroll(false), needXScrollbar(false), needYScrollbar(false), - bumpScrollX(0), bumpScrollY(0) -{ - clipper = new TXWindow(dpy, width()-scrollbarSize, height()-scrollbarSize, - this); - clipper->setBg(black); - hScrollbar = new TXScrollbar(dpy, width()-scrollbarSize, scrollbarSize, - false, this, this); - vScrollbar = new TXScrollbar(dpy, scrollbarSize, height()-scrollbarSize, - true, this, this); -} - -TXViewport::~TXViewport() -{ - delete clipper; - delete hScrollbar; - delete vScrollbar; -} - -void TXViewport::setChild(TXWindow* child_) -{ - child = child_; - XReparentWindow(dpy, child->win(), clipper->win(), 0, 0); - xOff = yOff = 0; - child->map(); - resizeNotify(); -} - -bool TXViewport::setOffset(int x, int y) -{ - if (clipper->width() >= child->width()) { - x = (clipper->width() - child->width()) / 2; - } else { - if (x > 0) x = 0; - if (x + child->width() < clipper->width()) - x = clipper->width() - child->width(); - } - - if (clipper->height() >= child->height()) { - y = (clipper->height() - child->height()) / 2; - } else { - if (y > 0) y = 0; - if (y + child->height() < clipper->height()) - y = clipper->height() - child->height(); - } - - if (x != xOff || y != yOff) { - xOff = x; - yOff = y; - child->move(xOff, yOff); - return true; - } - - return false; -} - -void TXViewport::setBumpScroll(bool b) -{ - bumpScroll = b; - resizeNotify(); -} - -// Note: bumpScrollEvent() only works if the viewport is positioned at 0,0 and -// is the same width and height as the screen. -bool TXViewport::bumpScrollEvent(XMotionEvent* ev) -{ - if (!bumpScroll) return false; - int bumpScrollPixels = 20; - bumpScrollX = bumpScrollY = 0; - - if (ev->x_root == width()-1) bumpScrollX = -bumpScrollPixels; - else if (ev->x_root == 0) bumpScrollX = bumpScrollPixels; - if (ev->y_root == height()-1) bumpScrollY = -bumpScrollPixels; - else if (ev->y_root == 0) bumpScrollY = bumpScrollPixels; - - if (bumpScrollX || bumpScrollY) { - if (bumpScrollTimer.isStarted()) return true; - if (setOffset(xOff + bumpScrollX, yOff + bumpScrollY)) { - bumpScrollTimer.start(25); - return true; - } - } - - bumpScrollTimer.stop(); - return false; -} - -bool TXViewport::handleTimeout(rfb::Timer* timer) { - return setOffset(xOff + bumpScrollX, yOff + bumpScrollY); -} - -void TXViewport::resizeNotify() -{ - int winMaxWidth, winMaxHeight; - - winMaxWidth = child->width(); - winMaxHeight = child->height(); - - needXScrollbar = false; - needYScrollbar = false; - if (!bumpScroll && height() > scrollbarSize && width() > scrollbarSize) { - needXScrollbar = (width() < child->width()); - needYScrollbar = (height() < child->height()); - // Adding an horizontal scrollbar occupies space, which might cause the - // need to add a vertical scrollbar, and vice-versa. These additional - // checks should solve this problem - if (needXScrollbar && (height() - scrollbarSize < child->height())) - needYScrollbar = true; - if (needYScrollbar && (width() - scrollbarSize < child->width())) - needXScrollbar = true; - } - - if (needXScrollbar) - winMaxHeight += scrollbarSize; - if (needYScrollbar) - winMaxWidth += scrollbarSize; - setMaxSize(winMaxWidth, winMaxHeight); - - if (needXScrollbar && needYScrollbar) { - clipper->resize(width()-scrollbarSize, height()-scrollbarSize); - hScrollbar->map(); - vScrollbar->map(); - } else if (needXScrollbar) { - clipper->resize(width(), height()-scrollbarSize); - hScrollbar->map(); - vScrollbar->unmap(); - } else if (needYScrollbar) { - clipper->resize(width()-scrollbarSize, height()); - hScrollbar->unmap(); - vScrollbar->map(); - } else { - clipper->resize(width(), height()); - hScrollbar->unmap(); - vScrollbar->unmap(); - } - - setOffset(xOff, yOff); - - if (needXScrollbar) { - hScrollbar->move(0, height()-scrollbarSize); - hScrollbar->resize(width()-scrollbarSize, scrollbarSize); - hScrollbar->set(child->width(), -xOff, width()-scrollbarSize); - } - - if (needYScrollbar) { - vScrollbar->move(width()-scrollbarSize, 0); - vScrollbar->resize(scrollbarSize, height()-scrollbarSize); - vScrollbar->set(child->height(), -yOff, height()-scrollbarSize); - } -} - -void TXViewport::scrollbarPos(int x, int y, TXScrollbar* sb) -{ - if (sb == hScrollbar) { - x = -x; - y = yOff; - } else { - x = xOff; - y = -y; - } - setOffset(x, y); -} diff --git a/unix/tx/TXViewport.h b/unix/tx/TXViewport.h deleted file mode 100644 index 823d67af..00000000 --- a/unix/tx/TXViewport.h +++ /dev/null @@ -1,78 +0,0 @@ -/* 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. - */ -// -// TXViewport.h -// -// A TXViewport allows a large window to be viewed by adding scrollbars to the -// right and bottom if necessary. It also has a bump-scroll mode where there -// are no scrollbars, and scrolling is achieved by bumping up against the edge -// of the screen instead. Note that this only works when the viewport fills -// the entire screen. If the child window is smaller than the viewport, it is -// always positioned centrally in the viewport. - -#ifndef __TXVIEWPORT_H__ -#define __TXVIEWPORT_H__ - -#include -#include "TXWindow.h" -#include "TXScrollbar.h" - -class TXViewport : public TXWindow, public TXScrollbarCallback, - public rfb::Timer::Callback { -public: - TXViewport(Display* dpy_, int width, int height, TXWindow* parent_=0); - virtual ~TXViewport(); - - // setChild() sets the child window which is to be viewed in the viewport. - void setChild(TXWindow* child_); - - // setOffset() sets the position of the child in the viewport. Note that the - // offsets are negative. For example when the offset is (-100,-30), position - // (100,30) in the child window is at the top-left of the viewport. The - // offsets given are clipped to keep the child window filling the viewport - // (except where the child window is smaller than the viewport, in which case - // it is always positioned centrally in the viewport). It returns true if - // the child was repositioned. - bool setOffset(int x, int y); - - // setBumpScroll() puts the viewport in bump-scroll mode. - void setBumpScroll(bool b); - - // bumpScrollEvent() can be called with a MotionNotify event which may - // potentially be against the edge of the screen. It returns true if the - // event was used for bump-scrolling, false if it should be processed - // normally. - bool bumpScrollEvent(XMotionEvent* ev); - -private: - virtual void resizeNotify(); - virtual void scrollbarPos(int x, int y, TXScrollbar* sb); - virtual bool handleTimeout(rfb::Timer* timer); - TXWindow* clipper; - TXWindow* child; - TXScrollbar* hScrollbar; - TXScrollbar* vScrollbar; - const int scrollbarSize; - int xOff, yOff; - rfb::Timer bumpScrollTimer; - bool bumpScroll; - bool needXScrollbar; - bool needYScrollbar; - int bumpScrollX, bumpScrollY; -}; -#endif