diff options
83 files changed, 3261 insertions, 3318 deletions
@@ -2,6 +2,20 @@ Dillo project ============================================================================= +dillo-3.0 [not released yet] + ++- Ported Dillo to FLTK-1.3. + Patch: corvid, Johannes Hofmann, Jorge Arellano Cid ++- Default binding for close-all changed from Alt-q to Ctrl-q. + - Default binding for close-tab changed from Ctrl-q to Ctrl-w. + - Add right_click_closes_tab preference (default is middle click). + Patches: Jorge Arellano Cid ++- Remove --enable-ansi configure option. + - Limit saved cookie size. + Patches: corvid + +----------------------------------------------------------------------------- + dillo-2.2.1 [not released yet] +- Implemented "View source" as a dpi. diff --git a/configure.in b/configure.in index 6ddf8642..f0a011c2 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl Process this file with aclocal, autoconf and automake. -AC_INIT([dillo], [2.2]) +AC_INIT([dillo], [3.0-pre]) dnl Detect the canonical target build environment AC_CANONICAL_TARGET @@ -22,8 +22,6 @@ AC_ARG_ENABLE(gprof, [ --enable-gprof Try to compile and run with pro , enable_gprof=no) AC_ARG_ENABLE(insure, [ --enable-insure Try to compile and run with Insure++], , enable_insure=no) -AC_ARG_ENABLE(ansi, [ --enable-ansi Try to compile and run with ANSI flags], - , enable_ansi=no) AC_ARG_ENABLE(ssl, [ --enable-ssl Enable ssl, https (ALPHA CODE)], , enable_ssl=no) AC_ARG_ENABLE(ipv6, [ --enable-ipv6 Build with support for IPv6], , ) @@ -37,7 +35,7 @@ AC_ARG_ENABLE(gif, [ --disable-gif Disable support for GIF images] enable_gif=$enableval, enable_gif=yes) AC_ARG_ENABLE(threaded-dns,[ --disable-threaded-dns Disable the advantage of a reentrant resolver library], enable_threaded_dns=$enableval, enable_threaded_dns=yes) -AC_ARG_ENABLE(rtfl, [ --enable-rtfl Build with rtfl messages]) +AC_ARG_ENABLE(rtfl, [ --enable-rtfl Build with rtfl messages (for debugging rendering)]) AC_PROG_CC AC_PROG_CXX AC_PROG_RANLIB @@ -109,19 +107,22 @@ fi dnl ---------------------- -dnl Test for FLTK2 library +dnl Test for FLTK 1.3 library dnl ---------------------- dnl dnl For debugging and to be user friendly -AC_MSG_CHECKING([FLTK2]) -if sh -c "fltk2-config --version" >/dev/null 2>&1 -then AC_MSG_RESULT(yes) - LIBFLTK_CXXFLAGS=`fltk2-config --cxxflags` - LIBFLTK_CFLAGS=`fltk2-config --cflags` - LIBFLTK_LIBS=`fltk2-config --ldflags` -else AC_MSG_RESULT(no) - AC_MSG_ERROR(FLTK2 must be installed!) -fi +AC_MSG_CHECKING([FLTK 1.3]) +fltk_version="`fltk-config --version 2>/dev/null`" +case $fltk_version in + 1.3.*) AC_MSG_RESULT(yes) + LIBFLTK_CXXFLAGS=`fltk-config --cxxflags` + LIBFLTK_CFLAGS=`fltk-config --cflags` + LIBFLTK_LIBS=`fltk-config --ldflags`;; + ?*) AC_MSG_RESULT(no) + AC_ERROR(FLTK 1.3 required; version found: $fltk_version);; + *) AC_MSG_RESULT(no) + AC_ERROR(FLTK 1.3 required; fltk-config not found) +esac dnl ---------------- @@ -441,24 +442,12 @@ if eval "test x$GCC = xyes"; then if test "`echo $CFLAGS | grep -e '-W ' -e '-W$' 2> /dev/null`" = ""; then CFLAGS="$CFLAGS -W" fi - if test "`echo $CFLAGS | grep '\-W[^a]' 2> /dev/null`" = ""; then - if test "`$CC -v 2>&1 | grep 'version 3'`" != ""; then - CFLAGS="$CFLAGS -W -Wno-unused-parameter" - fi + if test "`echo $CFLAGS | grep '\-Wno-unused-parameter' 2> /dev/null`" = ""; then + CFLAGS="$CFLAGS -Wno-unused-parameter" fi if test "`echo $CFLAGS | grep '\-Waggregate-return' 2> /dev/null`" = ""; then CFLAGS="$CFLAGS -Waggregate-return" fi - - if eval "test x$enable_ansi = xyes"; then - if test "`echo $CFLAGS | grep '\-ansi' 2> /dev/null`" = ""; then - CFLAGS="$CFLAGS -ansi" - fi - - if test "`echo $CFLAGS | grep '\-pedantic' 2> /dev/null`" = ""; then - CFLAGS="$CFLAGS -pedantic" - fi - fi fi dnl ----------- dnl CXX options @@ -48,8 +48,8 @@ # Default fonts: # -# If FLTK2 has been configured with Xft enabled (the default), you can -# use scalable fonts such as DejaVu or Liberation (try running "fc-list"). +# If FLTK has been configured with Xft enabled (the default), you can use +# scalable fonts such as DejaVu or Liberation (try running "fc-list"). #font_serif="DejaVu Serif" #font_sans_serif="DejaVu Sans" #font_cursive="URW Chancery L" @@ -228,6 +228,10 @@ # If you prefer to open a new Window instead, set it to NO. #middle_click_opens_new_tab=YES +# A mouse's middle click over a tab closes the Tab. +# With mousewheel mouses, right click feels way better (set to YES). +#right_click_closes_tab=NO + # Mouse middle click by default drives drag-scrolling. # To paste an URL into the window instead of scrolling, set it to NO. # Note: You could always paste the URL onto the URL box clear button. diff --git a/doc/Dillo.txt b/doc/Dillo.txt index b9ef0513..a63c9588 100644 --- a/doc/Dillo.txt +++ b/doc/Dillo.txt @@ -23,7 +23,7 @@ developers. Dillo can be viewed as the sum of five main parts: - 1.- Dillo Widget: A custom widget, FLTK2 based, that holds the + 1.- Dillo Widget: A custom widget, FLTK-based, that holds the necessary data structures and mechanisms for graphical rendering. (Described in Dw*.txt, dw*.c files among the sources.) diff --git a/doc/dw-usage.doc b/doc/dw-usage.doc index 32080d74..a23920b8 100644 --- a/doc/dw-usage.doc +++ b/doc/dw-usage.doc @@ -23,8 +23,8 @@ As described in \ref dw-overview, the following objects are needed: First of all, the necessary \#include's: \code -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl_Window.H> +#include <FL/Fl.H> #include "dw/core.hh" #include "dw/fltkcore.hh" @@ -54,7 +54,7 @@ Then, the layout is created, with the platform attached: For the view, we first need a FLTK window: \code - fltk::Window *window = new fltk::Window(200, 300, "Dw Example"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Example"); window->begin(); \endcode @@ -88,6 +88,8 @@ defined: fontAttrs.size = 14; fontAttrs.weight = 400; fontAttrs.style = dw::core::style::FONT_STYLE_NORMAL; + fontAttrs.letterSpacing = 0; + fontAttrs.fontVariant = dw::core::style::FONT_VARIANT_NORMAL; \endcode Now, the font can be created: @@ -101,9 +103,9 @@ defined, here dw::core::style::Color::createSimple must be called: \code styleAttrs.color = - dw::core::style::Color::createSimple (layout, 0x000000); + dw::core::style::Color::create (layout, 0x000000); styleAttrs.backgroundColor = - dw::core::style::Color::createSimple (layout, 0xffffff); + dw::core::style::Color::create (layout, 0xffffff); \endcode Finally, the style for the widget is created: @@ -193,7 +195,7 @@ Some FLTK stuff to finally show the window: \code window->resizable(viewport); window->show(); - int errorCode = fltk::run(); + int errorCode = Fl::run(); \endcode For cleaning up, it is sufficient to destroy the layout: diff --git a/doc/fltk-problems.doc b/doc/fltk-problems.doc index 6f20c44d..df4f1f14 100644 --- a/doc/fltk-problems.doc +++ b/doc/fltk-problems.doc @@ -26,10 +26,8 @@ Current problems: <li> There is the problem, that fltk::font always returns a font, the required one, or a replacements. The latter is not wanted in all cases, e.g. when several fonts are tested. Perhaps, this could be - solved by searching in the font list. - -<li> In dw::fltk::FltkFont::FltkFont, fltk::measure does not seem to work - for the calculation of dw::core::style::Font::xHeight. + solved by searching in the font list. <i>[This was true of fltk2. + What is the state of font handling now with fltk-1.3?]</i> <li> Distinction between italics and oblique would be nice (dw::fltk::FltkFont::FltkFont). @@ -38,7 +36,7 @@ Current problems: <h2>dw::fltk::ui::FltkCheckButtonResource</h2> -Groups of fltk::RadioButton must be added to one fltk::Group, which is +Groups of Fl_Radio_Button must be added to one Fl_Group, which is not possible in this context. There are two alternatives: <ol> @@ -58,7 +56,7 @@ be used. Then, it is for X necessary to use GCs with clipping masks. <h2>dw::fltk::ui::ComplexButton</h2> -Unfortunately, FLTK does not provide a button with Group as parent, so +Unfortunately, FLTK does not provide a button with Fl_Group as parent, so that children may be added to the button. dw::fltk::ui::ComplexButton does exactly this, and is, in an ugly way, a modified copy of the FLTK button. @@ -70,7 +68,7 @@ If the files do not compile, it may be useful to create a new one from the FLTK source: <ol> -<li> Copy fltk/Button.h from FLTK to dw/fltkcomplexbutton.hh and +<li> Copy Fl_Button.H from FLTK to dw/fltkcomplexbutton.hh and src/Button.cxx to dw/fltkcomplexbutton.cc. <li> In both files, rename "Button" to "ComplexButton". Automatic replacing @@ -120,17 +118,15 @@ at the beginning and at the end. Most important, the base class is changed: \code --#ifndef fltk_Widget_h --#include "Widget.h" --#endif -+#include <fltk/Group.h> +-#include "FL/Fl_Widget.H" ++#include <FL/Fl_Group.H> \endcode and \code --class FL_API ComplexButton : public Widget { -+class ComplexButton: public ::fltk::Group +-class FL_API ComplexButton : public Fl_Widget { ++class ComplexButton: public Fl_Group +{ \endcode @@ -148,12 +144,10 @@ First, \#include's: \code - #include <fltk/events.h> - #include <fltk/damage.h> --#include <fltk/ComplexButton.h> // <fltk/Button.h> formerly - #include <fltk/Group.h> - #include <fltk/Box.h> - #include <stdlib.h> + #include <FL/Fl.H> +-#include <FL/ComplexButton.h> // <FL/Fl_Button.H> formerly + #include <FL/Fl_Group.H> + #include <FL/Fl_Window.H> + +#include "fltkcomplexbutton.hh" \endcode @@ -162,33 +156,23 @@ Second, namespaces: \code +using namespace dw::fltk::ui; - using namespace fltk; \endcode -Since the base class is now Group, the constructor must be changed: +Since the base class is now Fl_Group, the constructor must be changed: \code --ComplexButton::ComplexButton(int x,int y,int w,int h, const char *l) : Widget(x,y,w,h,l) { +-ComplexButton::ComplexButton(int x,int y,int w,int h, const char *l) : Fl_Widget(x,y,w,h,l) { +ComplexButton::ComplexButton(int x,int y,int w,int h, const char *l) : -+ Group(x,y,w,h,l) ++ Fl_Group(x,y,w,h,l) +{ \endcode -At the end of the constructor, - -\code -+ type (NORMAL); - } -\endcode - -must be added (I've forgotten, what this is for). - Finally, the button must draw its children (end of dw::fltk::ui::ComplexButton::draw()): \code + -+ for (int i = 0; i < children (); i++) ++ for (int i = children () - 1; i >= 0; i--) + draw_child (*child (i)); } \endcode diff --git a/doc/user_help.html b/doc/user_help.html index 91dc748f..c0fae345 100644 --- a/doc/user_help.html +++ b/doc/user_help.html @@ -9,7 +9,7 @@ <body bgcolor='#778899' text='#000000'> <table bgcolor="#70a0c0" border="1" cellpadding="5"> - <tr><td><h1>Help for Dillo 2.2</h1> + <tr><td><h1>Help for Dillo 3.0</h1> </table> <p> <table WIDTH="100%" BORDER=1 CELLSPACING=0 CELLPADDING=5> @@ -37,7 +37,7 @@ <li> Some of the functions in Dillo are handled by independent processes. For instance, downloads come through <em>wget</em>. If Dillo exits, the download can continue (more details - below). + below). </ul> </td></tr> </table> @@ -67,9 +67,9 @@ of the page currently viewed, but it will *not* reload embedded images during this process. <li> Dialogs can be closed with the ESC key. - <li> If you want to try a different control panel, right-click over the - search button until you find one that suits your needs, then make - it the default in your <code>dillorc</code> file. + <li> You can try the different control panel size options listed in the + Tools menu, and make any changes permanent by editing your + <code>dillorc</code> file. <li> The whole window area can be used to display the page. Just hit Ctrl-Space! </ul> @@ -84,7 +84,7 @@ <tr><td BGCOLOR="#70a0c0"> <p> Downloads are made using <b><font color="#5040a0">wget</font></b> - with a FLTK2-based GUI wrapper, through the Dillo plugin (dpi) framework. + with a FLTK-based GUI wrapper, through the Dillo plugin (dpi) framework. If you close the browser window, downloads will continue. <p> </td></tr> @@ -232,7 +232,7 @@ <li>If you don't have root access, install <em>dpid</em> and the <em>dpis</em> inside your <code>~/.dillo/</code> directory as explained - in the README file. + in the README file. </ul> </td></tr> </table> @@ -273,15 +273,15 @@ <tr><td>Ctrl-R <td>Reload <td>reload current page <tr><td>Ctrl-N <td>New <td>New browser window <tr><td>Ctrl-T <td>Tab <td>New tab -<tr><td>Ctrl-Q <td>Quit <td>quit tab/window +<tr><td>Ctrl-W <td>Window <td>quit tab/window <tr><td>Ctrl-O <td>Open <td>Open file <tr><td>Ctrl-B <td>Bookmarks <td>view bookmarks -<tr><td>Ctrl-Space <td>"more space!" <td>Hide/show controls +<tr><td>Ctrl-Space or Esc <td>"more space!" <td>Hide/show controls +<tr><td>Ctrl-Q <td>Quit <td>exit Dillo <tr><td>Back or "<b>,</b>" <td>< <td>previous page <tr><td>Shift-Back or "<b>.</b>" <td>> <td>next page <tr><td>Esc <td>escape <td>close dialog <tr><td>Alt-F <td>File <td>file menu -<tr><td>Alt-X <td>eXit <td>exit Dillo <tr><td>Shift-Right <td>Right <td>Next tab <tr><td>Shift-Left <td>Left <td>Previous tab <tr><td>Ctrl-TabKey <td>TabKey <td>Next tab diff --git a/dpi/cookies.c b/dpi/cookies.c index a5142224..42db1390 100644 --- a/dpi/cookies.c +++ b/dpi/cookies.c @@ -13,10 +13,9 @@ * */ -/* This is written to follow the HTTP State Working Group's - * draft-ietf-httpstate-cookie-01.txt. +/* The current standard for cookies is RFC 6265. * - * Info on cookies in the wild: + * Info from 2009 on cookies in the wild: * http://www.ietf.org/mail-archive/web/http-state/current/msg00078.html * And dates specifically: * http://www.ietf.org/mail-archive/web/http-state/current/msg00128.html @@ -413,15 +412,24 @@ static void Cookies_save_and_free() while ((node = dList_nth_data(domains, 0))) { for (i = 0; (cookie = dList_nth_data(node->cookies, i)); ++i) { if (!cookie->session_only && difftime(cookie->expires_at, now) > 0) { - fprintf(file_stream, "%s\t%s\t%s\t%s\t%ld\t%s\t%s\n", - cookie->domain, - cookie->host_only ? "FALSE" : "TRUE", - cookie->path, - cookie->secure ? "TRUE" : "FALSE", - (long)difftime(cookie->expires_at, cookies_epoch_time), - cookie->name, - cookie->value); - saved++; + int len; + char buf[LINE_MAXLEN]; + + len = snprintf(buf, LINE_MAXLEN, "%s\t%s\t%s\t%s\t%ld\t%s\t%s\n", + cookie->domain, + cookie->host_only ? "FALSE" : "TRUE", + cookie->path, + cookie->secure ? "TRUE" : "FALSE", + (long) difftime(cookie->expires_at, + cookies_epoch_time), + cookie->name, + cookie->value); + if (len < LINE_MAXLEN) { + fprintf(file_stream, "%s", buf); + saved++; + } else { + MSG("Not saving overly long cookie for %s.\n", cookie->domain); + } } Cookies_free_cookie(cookie); } @@ -481,7 +489,7 @@ static int Cookies_get_month(const char *month_name) * * Return a pointer to a struct tm, or NULL on error. * - * NOTE that the draft spec wants user agents to be more flexible in what + * NOTE that the RFC wants user agents to be more flexible in what * they accept. For now, let's hack in special cases when they're encountered. * Why? Because this function is currently understandable, and I don't want to * abandon that (or at best decrease that -- see section 5.1.1) until there @@ -1136,8 +1144,8 @@ static bool_t Cookies_match(CookieData_t *cookie, const char *url_path, if (cookie->host_only != host_only_val) return FALSE; - /* Insecure cookies matches both secure and insecure urls, secure - cookies matches only secure urls */ + /* Insecure cookies match both secure and insecure urls, secure + cookies match only secure urls */ if (cookie->secure && !is_ssl) return FALSE; diff --git a/dpi/downloads.cc b/dpi/downloads.cc index 1a70d235..47ef4e0d 100644 --- a/dpi/downloads.cc +++ b/dpi/downloads.cc @@ -10,7 +10,7 @@ */ /* - * A FLTK2-based GUI for the downloads dpi (dillo plugin). + * A FLTK-based GUI for the downloads dpi (dillo plugin). */ #include <stdio.h> @@ -29,23 +29,21 @@ #include <sys/un.h> #include <sys/wait.h> -#include <fltk/run.h> -#include <fltk/Window.h> -#include <fltk/Widget.h> -#include <fltk/damage.h> -#include <fltk/Box.h> -#include <fltk/draw.h> -#include <fltk/HighlightButton.h> -#include <fltk/PackedGroup.h> -#include <fltk/ScrollGroup.h> -#include <fltk/ask.h> -#include <fltk/file_chooser.h> +#include <FL/Fl.H> +#include <FL/fl_draw.H> +#include <FL/fl_ask.H> +#include <FL/Fl_File_Chooser.H> +#include <FL/Fl_Window.H> +#include <FL/Fl_Widget.H> +#include <FL/Fl_Group.H> +#include <FL/Fl_Scroll.H> +#include <FL/Fl_Pack.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_Button.H> #include "dpiutil.h" #include "../dpip/dpip.h" -using namespace fltk; - /* * Debugging macros */ @@ -69,8 +67,7 @@ typedef enum { // ProgressBar widget -------------------------------------------------------- -// class FL_API ProgressBar : public Widget { -class ProgressBar : public Widget { +class ProgressBar : public Fl_Box { protected: double mMin; double mMax; @@ -78,7 +75,7 @@ protected: double mStep; bool mShowPct, mShowMsg; char mMsg[64]; - Color mTextColor; + Fl_Color mTextColor; void draw(); public: ProgressBar(int x, int y, int w, int h, const char *lbl = 0); @@ -97,8 +94,8 @@ public: void showtext(bool st) { mShowPct = st; } void message(char *msg) { mShowMsg = true; strncpy(mMsg,msg,63); redraw(); } bool showtext() { return mShowPct; } - void text_color(Color col) { mTextColor = col; } - Color text_color() { return mTextColor; } + void text_color(Fl_Color col) { mTextColor = col; } + Fl_Color text_color() { return mTextColor; } }; // Download-item class ------------------------------------------------------- @@ -123,10 +120,10 @@ class DLItem { int WgetStatus; int gw, gh; - Group *group; + Fl_Group *group; ProgressBar *prBar; - HighlightButton *prButton; - Widget *prTitle, *prGot, *prSize, *prRate, *pr_Rate, *prETA, *prETAt; + Fl_Button *prButton; + Fl_Widget *prTitle, *prGot, *prSize, *prRate, *pr_Rate, *prETA, *prETAt; public: DLItem(const char *full_filename, const char *url, DLAction action); @@ -142,7 +139,7 @@ public: void pid(pid_t p) { mPid = p; } void child_finished(int status); void status_msg(const char *msg) { prBar->message((char*)msg); } - Widget *get_widget() { return group; } + Fl_Widget *get_widget() { return group; } int widget_done() { return WidgetDone; } void widget_done(int val) { WidgetDone = val; } int updates_done() { return UpdatesDone; } @@ -177,9 +174,9 @@ public: class DLWin { DLItemList *mDList; - Window *mWin; - ScrollGroup *mScroll; - PackedGroup *mPG; + Fl_Window *mWin; + Fl_Scroll *mScroll; + Fl_Pack *mPG; public: DLWin(int ww, int wh); @@ -221,67 +218,58 @@ void ProgressBar::move(double step) } ProgressBar::ProgressBar(int x, int y, int w, int h, const char *lbl) -: Widget(x, y, w, h, lbl) +: Fl_Box(x, y, w, h, lbl) { mMin = mPresent = 0; mMax = 100; mShowPct = true; mShowMsg = false; - box(DOWN_BOX); - selection_color(BLUE); - color(WHITE); - textcolor(RED); + box(FL_THIN_UP_BOX); + color(FL_WHITE); } void ProgressBar::draw() { - drawstyle(style(), flags()); - if (damage() & DAMAGE_ALL) - draw_box(); - Rectangle r(w(), h()); - box()->inset(r); + struct Rectangle { + int x, y, w, h; + }; + + //drawstyle(style(), flags()); + draw_box(); + Rectangle r = {x(), y(), w(), h()}; if (mPresent > mMax) mPresent = mMax; if (mPresent < mMin) mPresent = mMin; double pct = (mPresent - mMin) / mMax; - if (vertical()) { - int barHeight = int (r.h() * pct + .5); - r.y(r.y() + r.h() - barHeight); - r.h(barHeight); - } else { - r.w(int (r.w() * pct + .5)); - } - - setcolor(selection_color()); + r.w = r.w * pct + .5; if (mShowPct) { - fillrect(r); + fl_rectf(r.x, r.y, r.w, r.h, FL_BLUE); } else { - Rectangle r2(int (r.w() * pct), 0, int (w() * .1), h()); - push_clip(r2); - fillrect(r); - pop_clip(); + fl_push_clip(int (r.w * pct), 0, int (w() * .1), h()); + fl_rectf(r.x, r.y, r.w, r.h, FL_BLUE); + fl_pop_clip(); } if (mShowMsg) { - setcolor(textcolor()); - setfont(this->labelfont(), this->labelsize()); - drawtext(mMsg, Rectangle(w(), h()), ALIGN_CENTER); + fl_color(FL_RED); + fl_font(this->labelfont(), this->labelsize()); + fl_draw(mMsg, x(), y(), w(), h(), FL_ALIGN_CENTER); } else if (mShowPct) { char buffer[30]; sprintf(buffer, "%d%%", int (pct * 100 + .5)); - setcolor(textcolor()); - setfont(this->labelfont(), this->labelsize()); - drawtext(buffer, Rectangle(w(), h()), ALIGN_CENTER); + fl_color(FL_RED); + fl_font(this->labelfont(), this->labelsize()); + fl_draw(buffer, x(), y(), w(), h(), FL_ALIGN_CENTER); } } // Download-item class ------------------------------------------------------- -static void prButton_scb(Widget *, void *cb_data) +static void prButton_scb(Fl_Widget *, void *cb_data) { DLItem *i = (DLItem *)cb_data; @@ -349,76 +337,88 @@ DLItem::DLItem(const char *full_filename, const char *url, DLAction action) WgetStatus = -1; gw = 400, gh = 70; - group = new Group(0,0,gw,gh); + group = new Fl_Group(0,0,gw,gh); group->begin(); - prTitle = new Widget(24, 7, 290, 23, shortname); - prTitle->box(RSHADOW_BOX); - prTitle->align(ALIGN_LEFT|ALIGN_INSIDE|ALIGN_CLIP); - prTitle->set_flag (RAW_LABEL); - // Attach this 'log_text' to the tooltip - log_text_add("Target File: ", 13); - log_text_add(fullname, strlen(fullname)); - log_text_add("\n\n", 2); - - prBar = new ProgressBar(24, 40, 92, 20); - prBar->box(BORDER_BOX); // ENGRAVED_BOX - prBar->tooltip("Progress Status"); - - int ix = 122, iy = 36, iw = 50, ih = 14; - Widget *o = new Widget(ix,iy,iw,ih, "Got"); - o->box(RFLAT_BOX); - o->color((Color)0xc0c0c000); - o->tooltip("Downloaded Size"); - prGot = new Widget(ix,iy+14,iw,ih, "0KB"); - prGot->align(ALIGN_CENTER|ALIGN_INSIDE); - prGot->labelcolor((Color)0x6c6cbd00); - prGot->box(NO_BOX); - - ix += iw; - o = new Widget(ix,iy,iw,ih, "Size"); - o->box(RFLAT_BOX); - o->color((Color)0xc0c0c000); - o->tooltip("Total Size"); - prSize = new Widget(ix,iy+14,iw,ih, "??"); - prSize->align(ALIGN_CENTER|ALIGN_INSIDE); - prSize->box(NO_BOX); - - ix += iw; - o = new Widget(ix,iy,iw,ih, "Rate"); - o->box(RFLAT_BOX); - o->color((Color)0xc0c0c000); - o->tooltip("Current transfer Rate (KBytes/sec)"); - prRate = new Widget(ix,iy+14,iw,ih, "??"); - prRate->align(ALIGN_CENTER|ALIGN_INSIDE); - prRate->box(NO_BOX); - - ix += iw; - o = new Widget(ix,iy,iw,ih, "~Rate"); - o->box(RFLAT_BOX); - o->color((Color)0xc0c0c000); - o->tooltip("Average transfer Rate (KBytes/sec)"); - pr_Rate = new Widget(ix,iy+14,iw,ih, "??"); - pr_Rate->align(ALIGN_CENTER|ALIGN_INSIDE); - pr_Rate->box(NO_BOX); - - ix += iw; - prETAt = o = new Widget(ix,iy,iw,ih, "ETA"); - o->box(RFLAT_BOX); - o->color((Color)0xc0c0c000); - o->tooltip("Estimated Time of Arrival"); - prETA = new Widget(ix,iy+14,iw,ih, "??"); - prETA->align(ALIGN_CENTER|ALIGN_INSIDE); - prETA->box(NO_BOX); - - //ix += 50; - //prButton = new HighlightButton(ix, 41, 38, 19, "Stop"); - prButton = new HighlightButton(328, 9, 38, 19, "Stop"); - prButton->tooltip("Stop this transfer"); - prButton->box(UP_BOX); - prButton->clear_tab_to_focus(); - prButton->callback(prButton_scb, this); - - group->box(ROUND_UP_BOX); + prTitle = new Fl_Box(24, 7, 290, 23, shortname); + prTitle->box(FL_RSHADOW_BOX); + prTitle->color(FL_WHITE); + prTitle->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); + //prTitle->clear_flag (SHORTCUT_LABEL); + // Attach this 'log_text' to the tooltip + log_text_add("Target File: ", 13); + log_text_add(fullname, strlen(fullname)); + log_text_add("\n\n", 2); + + prBar = new ProgressBar(24, 40, 92, 20); + prBar->box(FL_THIN_UP_BOX); + prBar->tooltip("Progress Status"); + + int ix = 122, iy = 36, iw = 50, ih = 14; + Fl_Widget *o = new Fl_Box(ix,iy,iw,ih, "Got"); + o->box(FL_RFLAT_BOX); + o->color(FL_DARK2); + o->labelsize(12); + o->tooltip("Downloaded Size"); + prGot = new Fl_Box(ix,iy+14,iw,ih, "0KB"); + prGot->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + prGot->labelcolor((Fl_Color)0x6c6cbd00); + prGot->labelsize(12); + prGot->box(FL_NO_BOX); + + ix += iw; + o = new Fl_Box(ix,iy,iw,ih, "Size"); + o->box(FL_RFLAT_BOX); + o->color(FL_DARK2); + o->labelsize(12); + o->tooltip("Total Size"); + prSize = new Fl_Box(ix,iy+14,iw,ih, "??"); + prSize->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + prSize->labelsize(12); + prSize->box(FL_NO_BOX); + + ix += iw; + o = new Fl_Box(ix,iy,iw,ih, "Rate"); + o->box(FL_RFLAT_BOX); + o->color(FL_DARK2); + o->labelsize(12); + o->tooltip("Current transfer Rate (KBytes/sec)"); + prRate = new Fl_Box(ix,iy+14,iw,ih, "??"); + prRate->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + prRate->labelsize(12); + prRate->box(FL_NO_BOX); + + ix += iw; + o = new Fl_Box(ix,iy,iw,ih, "~Rate"); + o->box(FL_RFLAT_BOX); + o->color(FL_DARK2); + o->labelsize(12); + o->tooltip("Average transfer Rate (KBytes/sec)"); + pr_Rate = new Fl_Box(ix,iy+14,iw,ih, "??"); + pr_Rate->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + pr_Rate->labelsize(12); + pr_Rate->box(FL_NO_BOX); + + ix += iw; + prETAt = o = new Fl_Box(ix,iy,iw,ih, "ETA"); + o->box(FL_RFLAT_BOX); + o->color(FL_DARK2); + o->labelsize(12); + o->tooltip("Estimated Time of Arrival"); + prETA = new Fl_Box(ix,iy+14,iw,ih, "??"); + prETA->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + prETA->labelsize(12); + prETA->box(FL_NO_BOX); + + //ix += 50; + //prButton = new Fl_Button(ix, 41, 38, 19, "Stop"); + prButton = new Fl_Button(328, 9, 38, 19, "Stop"); + prButton->tooltip("Stop this transfer"); + prButton->box(FL_UP_BOX); + prButton->clear_visible_focus(); + prButton->callback(prButton_scb, this); + + //group->box(FL_ROUND_UP_BOX); --BUG in FLTK-1.3 + group->box(FL_ROUNDED_BOX); group->end(); } @@ -431,7 +431,7 @@ DLItem::~DLItem() int idx = (strcmp(dl_argv[1], "-c")) ? 2 : 3; dFree(dl_argv[idx]); dFree(dl_argv[idx+3]); - delete(dl_argv); + delete [] dl_argv; delete(group); } @@ -443,7 +443,7 @@ void DLItem::abort_dl() { if (!log_done()) { close(LogPipe[0]); - remove_fd(LogPipe[0]); + Fl::remove_fd(LogPipe[0]); log_done(1); // Stop wget if (!fork_done()) @@ -612,7 +612,7 @@ static void read_log_cb(int fd_in, void *data) break; } else if (st == 0) { close(fd_in); - remove_fd(fd_in, 1); + Fl::remove_fd(fd_in, 1); dl_item->log_done(1); ret = 0; break; @@ -625,7 +625,7 @@ static void read_log_cb(int fd_in, void *data) void DLItem::father_init() { close(LogPipe[1]); - add_fd(LogPipe[0], 1, read_log_cb, this); // Read + Fl::add_fd(LogPipe[0], 1, read_log_cb, this); // Read // Start the timer after the child is running. // (this makes a big difference with wget) @@ -792,7 +792,7 @@ static void cleanup_cb(void *data) } sigprocmask(SIG_UNBLOCK, &mask_sigchld, NULL); - repeat_timeout(1.0,cleanup_cb,data); + Fl::repeat_timeout(1.0,cleanup_cb,data); } /* @@ -819,7 +819,7 @@ static void update_cb(void *data) if (cb_used && list->num() == 0) exit(0); - repeat_timeout(1.0,update_cb,data); + Fl::repeat_timeout(1.0,update_cb,data); } @@ -939,14 +939,14 @@ end: /* * Callback for close window request (WM or EscapeKey press) */ -static void dlwin_esc_cb(Widget *, void *) +static void dlwin_esc_cb(Fl_Widget *, void *) { const char *msg = "There are running downloads.\n" "ABORT them and EXIT anyway?"; if (dl_win && dl_win->num_running() > 0) { - int ch = fltk::choice(msg, "Yes", "*No", "Cancel"); - if (ch != 0) + int ch = fl_choice("%s", "Cancel", "*No", "Yes", msg); + if (ch == 0 || ch == 1) return; } @@ -978,6 +978,7 @@ void DLWin::add(const char *full_filename, const char *url, DLAction action) } else { /* father */ dl_win->show(); + dl_item->get_widget()->redraw(); dl_item->pid(f_pid); dl_item->father_init(); } @@ -1001,12 +1002,12 @@ DLAction DLWin::check_filename(char **p_fullname) dStr_sprintf(ds, "The file:\n %s (%d Bytes)\nalready exists. What do we do?", *p_fullname, (int)ss.st_size); - ch = fltk::choice(ds->str, "Rename", "Continue", "Abort"); + ch = fl_choice("%s", "Abort", "Continue", "Rename", ds->str); dStr_free(ds, 1); MSG("Choice %d\n", ch); - if (ch == 0) { + if (ch == 2) { const char *p; - p = fltk::file_chooser("Enter a new name:", NULL, *p_fullname); + p = fl_file_chooser("Enter a new name:", NULL, *p_fullname); if (p) { dFree(*p_fullname); *p_fullname = dStrdup(p); @@ -1027,6 +1028,7 @@ void DLWin::del(int n_item) // Remove the widget from the packed group mPG->remove(dl_item->get_widget()); + mScroll->redraw(); mDList->del(n_item); delete(dl_item); } @@ -1057,7 +1059,7 @@ int DLWin::num_running() */ void DLWin::listen(int req_fd) { - add_fd(req_fd, 1, read_req_cb, NULL); // Read + Fl::add_fd(req_fd, 1, read_req_cb, NULL); // Read } /* @@ -1078,15 +1080,14 @@ DLWin::DLWin(int ww, int wh) { mDList = new DLItemList(); // Create the empty main window - mWin = new Window(ww, wh, "Downloads:"); + mWin = new Fl_Window(ww, wh, "Downloads:"); mWin->begin(); - mScroll = new ScrollGroup(0,0,ww,wh); - mScroll->begin(); - mPG = new PackedGroup(0,0,ww,wh); - mPG->end(); - //mPG->spacing(10); - mScroll->end(); - mScroll->type(ScrollGroup::VERTICAL); + mScroll = new Fl_Scroll(0,0,ww,wh); + mScroll->begin(); + mPG = new Fl_Pack(0,0,ww-18,wh); + mPG->end(); + mScroll->end(); + mScroll->type(Fl_Scroll::VERTICAL); mWin->end(); mWin->resizable(mScroll); mWin->callback(dlwin_esc_cb, NULL); @@ -1098,9 +1099,9 @@ DLWin::DLWin(int ww, int wh) { est_sigchld(); // Set the cleanup timeout - add_timeout(1.0, cleanup_cb, mDList); + Fl::add_timeout(1.0, cleanup_cb, mDList); // Set the update timeout - add_timeout(1.0, update_cb, mDList); + Fl::add_timeout(1.0, update_cb, mDList); } @@ -1113,7 +1114,7 @@ int main() { int ww = 420, wh = 85; - lock(); + Fl::lock(); // Create the download window dl_win = new DLWin(ww, wh); @@ -1123,6 +1124,6 @@ int main() MSG("started...\n"); - return run(); + return Fl::run(); } diff --git a/dw/findtext.cc b/dw/findtext.cc index f3e0ba20..bce6f565 100644 --- a/dw/findtext.cc +++ b/dw/findtext.cc @@ -37,7 +37,7 @@ FindtextState::FindtextState () FindtextState::~FindtextState () { if (key) - delete key; + free(key); if (nexttab) delete[] nexttab; if (iterator) @@ -52,7 +52,7 @@ void FindtextState::setWidget (Widget *widget) // A widget change will restart the search. if (key) - delete key; + free(key); key = NULL; if (nexttab) delete[] nexttab; @@ -81,7 +81,7 @@ FindtextState::Result FindtextState::search (const char *key, bool caseSens, strcmp (this->key, key) != 0) { newKey = true; if (this->key) - delete this->key; + free(this->key); this->key = strdup (key); this->caseSens = caseSens; @@ -147,7 +147,7 @@ void FindtextState::resetSearch () unhighlight (); if (key) - delete key; + free(key); key = NULL; } diff --git a/dw/fltkcomplexbutton.cc b/dw/fltkcomplexbutton.cc index f80d0eb0..359367bf 100644 --- a/dw/fltkcomplexbutton.cc +++ b/dw/fltkcomplexbutton.cc @@ -1,7 +1,5 @@ - -// fltkcomplexbutton.cc contains code from FLTK2's src/Button.cxx -// that is Copyright 1998-2006 by Bill Spitzak and others. -// (see http://svn.easysw.com/public/fltk/fltk/trunk/src/Button.cxx) +// fltkcomplexbutton.cc contains code from FLTK 1.3's src/Fl_Button.cxx +// that is Copyright 1998-2010 by Bill Spitzak and others. /* * This program is free software; you can redistribute it and/or modify @@ -18,263 +16,128 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <fltk/events.h> -#include <fltk/damage.h> -#include <fltk/Group.h> -#include <fltk/Box.h> -#include <stdlib.h> +#include <FL/Fl.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Group.H> +#include <FL/Fl_Window.H> #include "fltkcomplexbutton.hh" -using namespace fltk; using namespace dw::fltk::ui; -/*! \class fltk::ComplexButton - - ComplexButtons generate callbacks when they are clicked by the user. You - control exactly when and how by changing the values for when(): - - fltk::WHEN_NEVER: The callback is not done, instead changed() is - turned on. - - fltk::WHEN_RELEASE: This is the default, the callback is done - after the user successfully clicks the button (i.e. they let it go - with the mouse still pointing at it), or when a shortcut is typed. - - fltk::WHEN_CHANGED : The callback is done each time the value() - changes (when the user pushes and releases the button, and as the - mouse is dragged around in and out of the button). - - ComplexButtons can also generate callbacks in response to fltk::SHORTCUT - events. The button can either have an explicit shortcut() value or a - letter shortcut can be indicated in the label() with an '&' - character before it. For the label shortcut it does not matter if - Alt is held down, but if you have an input field in the same window, - the user will have to hold down the Alt key so that the input field - does not eat the event first as an fltk::KEY event. - - \image html buttons.gif -*/ - -/*! \fn bool ComplexButton::value() const - The current value. True means it is pushed down, false means it is - not pushed down. The ToggleComplexButton subclass provides the ability for - the user to change this value permanently, otherwise it is just - temporary while the user is holding the button down. - - This is the same as Widget::state(). -*/ - -/*! \fn bool ComplexButton::value(bool) - Change the value(). Redraws the button and returns true if the new - value is different. This is the same function as Widget::state(). - See also Widget::set(), Widget::clear(), and Widget::setonly(). - - If you turn it on, a normal button will draw pushed-in, until - the user clicks it and releases it. -*/ - -static bool initial_state; +/** + Sets the current value of the button. + A non-zero value sets the button to 1 (ON), and zero sets it to 0 (OFF). + \param[in] v button value. + */ +int ComplexButton::value(int v) { + v = v ? 1 : 0; + oldval = v; + clear_changed(); + if (value_ != v) { + value_ = v; + if (box()) redraw(); + return 1; + } else { + return 0; + } +} -int ComplexButton::handle(int event) { - return handle(event, Rectangle(w(),h())); +void ComplexButton::draw() { + Fl_Color col = value() ? selection_color() : color(); + draw_box(value() ? (down_box()?down_box():fl_down(box())) : box(), col); + if (Fl::focus() == this) draw_focus(); + + // ComplexButton is a Group; draw its children + for (int i = children () - 1; i >= 0; i--) { + // set absolute coordinates for fltk-1.3 --jcid + child (i)->position(x()+(w()-child(i)->w())/2,y()+(h()-child(i)->h())/2); + draw_child (*child (i)); + } } -int ComplexButton::handle(int event, const Rectangle& rectangle) { +int ComplexButton::handle(int event) { + int newval; switch (event) { - case ENTER: - case LEAVE: - redraw_highlight(); - case MOVE: + case FL_ENTER: /* FALLTHROUGH */ + case FL_LEAVE: return 1; - case PUSH: - if (pushed()) return 1; // ignore extra pushes on currently-pushed button - initial_state = state(); - clear_flag(PUSHED); - /* do_callback(); */ - case DRAG: { - bool inside = event_inside(rectangle); - if (inside) { - if (!flag(PUSHED)) { - set_flag(PUSHED); - redraw(DAMAGE_VALUE); - } - } else { - if (flag(PUSHED)) { - clear_flag(PUSHED); - redraw(DAMAGE_VALUE); - } - } - if (when() & WHEN_CHANGED) { // momentary button must record state() - if (state(inside ? !initial_state : initial_state)) - do_callback(); + case FL_PUSH: + if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); + case FL_DRAG: + if (Fl::event_inside(this)) { + newval = !oldval; + } else + { + clear_changed(); + newval = oldval; } - return 1;} - case RELEASE: - if (!flag(PUSHED)) return 1; - clear_flag(PUSHED); - redraw(DAMAGE_VALUE); - if (type() == RADIO) - setonly(); - else if (type() == TOGGLE) - state(!initial_state); - else { - state(initial_state); - if (when() & WHEN_CHANGED) {do_callback(); return 1;} + if (newval != value_) { + value_ = newval; + set_changed(); + redraw(); + if (when() & FL_WHEN_CHANGED) do_callback(); } - if (when() & WHEN_RELEASE) do_callback(); else set_changed(); return 1; - case FOCUS: - redraw(1); // minimal redraw to just add the focus box - // grab initial focus if we are an ReturnComplexButton: - return shortcut()==ReturnKey ? 2 : 1; - case UNFOCUS: - redraw(DAMAGE_HIGHLIGHT); - return 1; - case KEY: - if (event_key() == ' ' || event_key() == ReturnKey - || event_key() == KeypadEnter) goto EXECUTE; - return 0; - case SHORTCUT: - if (!test_shortcut()) return 0; - EXECUTE: - if (type() == RADIO) { - if (!state()) { - setonly(); - if (when() & WHEN_CHANGED) do_callback(); else set_changed(); - } - } else if (type() == TOGGLE) { - state(!state()); - if (when() & WHEN_CHANGED) do_callback(); else set_changed(); + case FL_RELEASE: + if (value_ == oldval) { + if (when() & FL_WHEN_NOT_CHANGED) do_callback(); + return 1; } - if (when() & WHEN_RELEASE) do_callback(); + set_changed(); + value(oldval); + set_changed(); + if (when() & FL_WHEN_CHANGED) { + Fl_Widget_Tracker wp(this); + do_callback(); + if (wp.deleted()) return 1; + } + if (when() & FL_WHEN_RELEASE) do_callback(); return 1; + case FL_FOCUS : /* FALLTHROUGH */ + case FL_UNFOCUS : + if (Fl::visible_focus()) { + if (box() == FL_NO_BOX) { + // Widgets with the FL_NO_BOX boxtype need a parent to + // redraw, since it is responsible for redrawing the + // background... + int X = x() > 0 ? x() - 1 : 0; + int Y = y() > 0 ? y() - 1 : 0; + if (window()) window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 2); + } else redraw(); + return 1; + } else return 0; + case FL_KEYBOARD : + if (Fl::focus() == this && Fl::event_key() == ' ' && + !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) { + set_changed(); + Fl_Widget_Tracker wp(this); + if (wp.deleted()) return 1; + if (when() & FL_WHEN_RELEASE) do_callback(); + return 1; + } default: return 0; } } -//////////////////////////////////////////////////////////////// - -#include <fltk/draw.h> - -extern Widget* fl_did_clipping; - -/*! - This function provides a mess of back-compatabilty and Windows - emulation to subclasses of ComplexButton to draw with. It will draw the - button according to the current state of being pushed and it's - state(). If non-zero is passed for \a glyph_width then the glyph() - is drawn in that space on the left (or on the right if negative), - and it assummes the glyph indicates the state(), so the box is only - used to indicate the pushed state. -*/ -void ComplexButton::draw(int glyph_width) const -{ - // For back-compatability, setting color() or box() directly on a plain - // button will cause it to act like buttoncolor() or buttonbox() are - // set: - Style localstyle; - const Style* style = this->style(); - if (!glyph_width) { - localstyle = *style; - if (localstyle.color_) localstyle.buttoncolor_ = localstyle.color_; - if (localstyle.box_) localstyle.buttonbox_ = localstyle.box_; - if (localstyle.labelcolor_) localstyle.textcolor_ = localstyle.labelcolor_; - style = &localstyle; - } - - Box* box = style->buttonbox(); - - Flags box_flags = flags() | OUTPUT; - Flags glyph_flags = box_flags & ~(HIGHLIGHT|OUTPUT); - if (glyph_width) box_flags &= ~STATE; - - // only draw "inside" labels: - Rectangle r(0,0,w(),h()); - - if (box == NO_BOX) { - Color bg; - if (box_flags & HIGHLIGHT && (bg = style->highlight_color())) { - setcolor(bg); - fillrect(r); - } else if (label() || (damage()&(DAMAGE_EXPOSE|DAMAGE_HIGHLIGHT))) { - // erase the background so we can redraw the label in the new color: - draw_background(); - } - // this allows these buttons to be put into browser/menus: - //fg = fl_item_labelcolor(this); - } else { - if ((damage()&(DAMAGE_EXPOSE|DAMAGE_HIGHLIGHT)) - && !box->fills_rectangle()) { - // Erase the area behind non-square boxes - draw_background(); - } - } - - // Draw the box: - drawstyle(style,box_flags); - // For back-compatability we use any directly-set selection_color() - // to color the box: - if (!glyph_width && state() && style->selection_color_) { - setbgcolor(style->selection_color_); - setcolor(contrast(style->selection_textcolor(),style->selection_color_)); - } - box->draw(r); - Rectangle r1(r); box->inset(r1); - - if (glyph_width) { - int g = abs(glyph_width); - Rectangle lr(r1); - Rectangle gr(r1, g, g); - if (glyph_width < 0) { - lr.w(lr.w()-g-3); - gr.x(r1.r()-g-3); - } else { - lr.set_x(g+3); - gr.x(r1.x()+3); - } - this->draw_label(lr, box_flags); - drawstyle(style,glyph_flags); - this->glyph()->draw(gr); - drawstyle(style,box_flags); - } else { - this->draw_label(r1, box_flags); - } - box->draw_symbol_overlay(r); -} - -void ComplexButton::draw() { - if (type() == HIDDEN) { - fl_did_clipping = this; - return; - } - draw(0); - - // ComplexButton is a Group, draw its children - for (int i = children () - 1; i >= 0; i--) - draw_child (*child (i)); +/** + The constructor creates the button using the given position, size and label. + \param[in] X, Y, W, H position and size of the widget + \param[in] L widget label, default is no label + */ +ComplexButton::ComplexButton(int X, int Y, int W, int H, const char *L) +: Fl_Group(X,Y,W,H,L) { + Fl_Group::current(0); + box(FL_UP_BOX); + down_box(FL_NO_BOX); + value_ = oldval = 0; } -//////////////////////////////////////////////////////////////// - -static NamedStyle style("ComplexButton", 0, &ComplexButton::default_style); -NamedStyle* ComplexButton::default_style = &::style; - -ComplexButton::ComplexButton(int x,int y,int w,int h, const char *l) : - Group(x,y,w,h,l) -{ - style(default_style); - highlight_color(GRAY20); - //set_click_to_focus(); +ComplexButton::~ComplexButton() { + /* + * The Fl_Group destructor clear()s the children, but layout expects + * the flat view to be around until it deletes if. + */ + remove(0); } - -//////////////////////////////////////////////////////////////// - -/*! \class fltk::ToggleComplexButton - This button turns the state() on and off each release of a click - inside of it. - - You can also convert a regular button into this by doing - type(ComplexButton::TOGGLE) to it. -*/ - -// -// diff --git a/dw/fltkcomplexbutton.hh b/dw/fltkcomplexbutton.hh index 83160c06..3a14cfb2 100644 --- a/dw/fltkcomplexbutton.hh +++ b/dw/fltkcomplexbutton.hh @@ -1,7 +1,6 @@ -// fltkcomplexbutton.hh contains code from FLTK2's fltk/Button.h -// that is Copyright 2002 by Bill Spitzak and others. -// (see http://svn.easysw.com/public/fltk/fltk/trunk/fltk/Button.h) +// fltkcomplexbutton.hh contains code from FLTK 1.3's FL/Fl_Button.H +// that is Copyright 1998-2010 by Bill Spitzak and others. /* * This program is free software; you can redistribute it and/or modify @@ -21,35 +20,56 @@ #ifndef __FLTK_COMPLEX_BUTTON_HH__ #define __FLTK_COMPLEX_BUTTON_HH__ -#include <fltk/Group.h> +#include <FL/Fl_Group.H> + +extern FL_EXPORT Fl_Shortcut fl_old_shortcut(const char*); namespace dw { namespace fltk { namespace ui { -class ComplexButton: public ::fltk::Group -{ +class FL_EXPORT ComplexButton : public Fl_Group { + + int shortcut_; + char value_; + char oldval; + uchar down_box_; + +protected: + virtual void draw(); + public: - enum {HIDDEN=3}; // back-comptability value to hide the button + virtual int handle(int); - bool value() const { return state(); } - bool value(bool v) { return state(v); } + ComplexButton(int X, int Y, int W, int H, const char *L = 0); + ~ComplexButton(); - int handle(int); - int handle(int event, const Rectangle&); - ComplexButton(int,int,int,int,const char * = 0); - ~ComplexButton() { remove_all ();}; - static ::fltk::NamedStyle* default_style; + int value(int v); - virtual void draw(); - void draw(int glyph_width) const; + /** + Returns the current value of the button (0 or 1). + */ + char value() const {return value_;} + + /** + Returns the current down box type, which is drawn when value() is non-zero. + \retval Fl_Boxtype + */ + Fl_Boxtype down_box() const {return (Fl_Boxtype)down_box_;} + + /** + Sets the down box type. The default value of 0 causes FLTK to figure out + the correct matching down version of box(). + \param[in] b down box type + */ + void down_box(Fl_Boxtype b) {down_box_ = b;} }; } // namespace ui } // namespace fltk } // namespace dw -#endif // __FLTK_COMPLEX_BUTTON_HH__ +#endif // // diff --git a/dw/fltkcore.hh b/dw/fltkcore.hh index fbff3fad..376f588e 100644 --- a/dw/fltkcore.hh +++ b/dw/fltkcore.hh @@ -13,7 +13,7 @@ class FltkResource; } // namespace fltk } // namespace core -#include <fltk/Widget.h> +#include <FL/Fl_Widget.H> #include "core.hh" #include "fltkimgbuf.hh" diff --git a/dw/fltkflatview.cc b/dw/fltkflatview.cc index 85385394..b9e85d99 100644 --- a/dw/fltkflatview.cc +++ b/dw/fltkflatview.cc @@ -21,12 +21,8 @@ #include "fltkflatview.hh" -#include <fltk/draw.h> -#include <fltk/events.h> - #include <stdio.h> -using namespace fltk; using namespace lout::container::typed; namespace dw { @@ -82,24 +78,24 @@ void FltkFlatView::setViewportSize (int width, int height, { } -int FltkFlatView::translateViewXToCanvasX (int x) +int FltkFlatView::translateViewXToCanvasX (int X) { - return x; + return X - x (); } -int FltkFlatView::translateViewYToCanvasY (int y) +int FltkFlatView::translateViewYToCanvasY (int Y) { - return y; + return Y - y (); } -int FltkFlatView::translateCanvasXToViewX (int x) +int FltkFlatView::translateCanvasXToViewX (int X) { - return x; + return X + x (); } -int FltkFlatView::translateCanvasYToViewY (int y) +int FltkFlatView::translateCanvasYToViewY (int Y) { - return y; + return Y + y (); } diff --git a/dw/fltkflatview.hh b/dw/fltkflatview.hh index 5106cbdf..8d84fda9 100644 --- a/dw/fltkflatview.hh +++ b/dw/fltkflatview.hh @@ -1,9 +1,6 @@ #ifndef __DW_FLTKFLATVIEW_HH__ #define __DW_FLTKFLATVIEW_HH__ -#include <fltk/Group.h> -#include <fltk/Scrollbar.h> - #include "core.hh" #include "fltkcore.hh" #include "fltkviewbase.hh" diff --git a/dw/fltkimgbuf.cc b/dw/fltkimgbuf.cc index e3be41a9..97cbc1b4 100644 --- a/dw/fltkimgbuf.cc +++ b/dw/fltkimgbuf.cc @@ -23,13 +23,10 @@ #include "../lout/msg.h" #include "../lout/misc.hh" -#include <fltk/draw.h> -#include <fltk/Color.h> +#include <FL/fl_draw.H> #define IMAGE_MAX_AREA (6000 * 6000) -using namespace fltk; - namespace dw { namespace fltk { @@ -302,7 +299,7 @@ int FltkImgbuf::scaledY(int ySrc) return ySrc * height / root->height; } -void FltkImgbuf::draw (::fltk::Widget *target, int xRoot, int yRoot, +void FltkImgbuf::draw (Fl_Widget *target, int xRoot, int yRoot, int x, int y, int width, int height) { // TODO: Clarify the question, whether "target" is the current widget @@ -324,10 +321,9 @@ void FltkImgbuf::draw (::fltk::Widget *target, int xRoot, int yRoot, height = this->height - y; } - // Draw - ::fltk::Rectangle rect (xRoot + x, yRoot + y, width, height); - PixelType ptype = (type == RGBA) ? ::fltk::RGBA : ::fltk::RGB; - drawimage(rawdata+bpp*(y*this->width + x),ptype,rect,bpp*this->width); + fl_draw_image(rawdata+bpp*(y*this->width + x), xRoot + x, yRoot + y, width, + height, bpp, this->width * bpp); + } } // namespace dw diff --git a/dw/fltkimgbuf.hh b/dw/fltkimgbuf.hh index 54d9ca34..30e0cc37 100644 --- a/dw/fltkimgbuf.hh +++ b/dw/fltkimgbuf.hh @@ -55,7 +55,7 @@ public: void setDeleteOnUnref (bool deleteOnUnref); bool isReferred (); - void draw (::fltk::Widget *target, int xRoot, int yRoot, + void draw (Fl_Widget *target, int xRoot, int yRoot, int x, int y, int width, int height); }; diff --git a/dw/fltkmisc.cc b/dw/fltkmisc.cc index 5d20a87a..01024f25 100644 --- a/dw/fltkmisc.cc +++ b/dw/fltkmisc.cc @@ -18,11 +18,10 @@ */ - +#include "../lout/msg.h" #include "fltkmisc.hh" -#include <fltk/events.h> -#include <fltk/Monitor.h> +#include <FL/Fl.H> #include <stdio.h> namespace dw { @@ -31,17 +30,17 @@ namespace misc { int screenWidth () { - return ::fltk::Monitor::all ().w (); + return Fl::w (); } int screenHeight () { - return ::fltk::Monitor::all ().h (); + return Fl::h (); } void warpPointer (int x, int y) { - ::fltk::warp_mouse (x, y); + MSG_ERR("no warpPointer mechanism available.\n"); } } // namespace misc diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc index 0b0f156a..d4db5d7a 100644 --- a/dw/fltkplatform.cc +++ b/dw/fltkplatform.cc @@ -24,18 +24,12 @@ #include "../lout/msg.h" #include "fltkcore.hh" -#include <fltk/draw.h> -#include <fltk/run.h> -#include <fltk/events.h> -#include <fltk/Monitor.h> -#include <fltk/InvisibleBox.h> -#include <fltk/Tooltip.h> -#include <fltk/utf.h> +#include <FL/fl_draw.H> +#include <FL/Fl_Tooltip.H> namespace dw { namespace fltk { -using namespace ::fltk; using namespace lout; /** @@ -47,37 +41,69 @@ container::typed::HashTable <dw::core::style::FontAttrs, new container::typed::HashTable <dw::core::style::FontAttrs, FltkFont> (false, false); +container::typed::HashTable <lout::object::ConstString, + FltkFont::FontFamily> *FltkFont::systemFonts = + NULL; + +FltkFont::FontFamily FltkFont::standardFontFamily; + +FltkFont::FontFamily::FontFamily () +{ + font[0] = FL_HELVETICA; + font[1] = FL_HELVETICA_BOLD; + font[2] = FL_HELVETICA_ITALIC; + font[3] = FL_HELVETICA_BOLD_ITALIC; +} + +void FltkFont::FontFamily::set (Fl_Font f, int attrs) +{ + int idx = 0; + if (attrs & FL_BOLD) + idx += 1; + if (attrs & FL_ITALIC) + idx += 2; + font[idx] = f; +} + +Fl_Font FltkFont::FontFamily::get (int attrs) +{ + int idx = 0; + if (attrs & FL_BOLD) + idx += 1; + if (attrs & FL_ITALIC) + idx += 2; + return font[idx]; +} + + + FltkFont::FltkFont (core::style::FontAttrs *attrs) { + if (!systemFonts) + initSystemFonts (); + copyAttrs (attrs); int fa = 0; if (weight >= 500) - fa |= BOLD; + fa |= FL_BOLD; if (style != core::style::FONT_STYLE_NORMAL) - fa |= ITALIC; + fa |= FL_ITALIC; - font = ::fltk::font(name, fa); - if (font == NULL) { - /* - * If using xft, fltk::HELVETICA just means sans, fltk::COURIER - * means mono, and fltk::TIMES means serif. - */ - font = HELVETICA->plus (fa); - } + object::ConstString nameString (name); + FontFamily *family = systemFonts->get (&nameString); + if (!family) + family = &standardFontFamily; - setfont(font, size); - spaceWidth = misc::max(0, (int)getwidth(" ") + letterSpacing); - int xw, xh; - measure("x", xw, xh); - xHeight = xh; - ascent = (int)getascent(); - descent = (int)getdescent(); + font = family->get (fa); - /** - * \bug The code above does not seem to work, so this workaround. - */ - xHeight = ascent * 3 / 5; + fl_font(font, size); + spaceWidth = misc::max(0, (int)fl_width(' ') + letterSpacing); + int xx, xy, xw, xh; + fl_text_extents("x", xx, xy, xw, xh); + xHeight = xh; + descent = fl_descent(); + ascent = fl_height() - descent; } FltkFont::~FltkFont () @@ -85,10 +111,73 @@ FltkFont::~FltkFont () fontsTable->remove (this); } +static void strstrip(char *big, const char *little) +{ + if (strlen(big) >= strlen(little) && + strcasecmp(big + strlen(big) - strlen(little), little) == 0) + *(big + strlen(big) - strlen(little)) = '\0'; +} + +void FltkFont::initSystemFonts () +{ + systemFonts = new container::typed::HashTable + <lout::object::ConstString, FontFamily> (true, true); + + int k = Fl::set_fonts ("-*-iso10646-1"); + for (int i = 0; i < k; i++) { + int t; + char *name = strdup (Fl::get_font_name ((Fl_Font) i, &t)); + + // normalize font family names (strip off "bold", "italic") + if (t & FL_ITALIC) + strstrip(name, " italic"); + if (t & FL_BOLD) + strstrip(name, " bold"); + + MSG("Found font: %s%s%s\n", name, t & FL_BOLD ? " bold" : "", + t & FL_ITALIC ? " italic" : ""); + + object::String *familyName = new object::String(name); + free (name); + FontFamily *family = systemFonts->get (familyName); + + if (family) { + family->set ((Fl_Font) i, t); + delete familyName; + } else { + family = new FontFamily (); + family->set ((Fl_Font) i, t); + systemFonts->put (familyName, family); + } + } +} + +bool +FltkFont::fontExists (const char *name) +{ + if (!systemFonts) + initSystemFonts (); + object::ConstString familyName (name); + return systemFonts->get (&familyName) != NULL; +} + +Fl_Font +FltkFont::get (const char *name, int attrs) +{ + if (!systemFonts) + initSystemFonts (); + object::ConstString familyName (name); + FontFamily *family = systemFonts->get (&familyName); + if (family) + return family->get (attrs); + else + return FL_HELVETICA; +} + bool FltkPlatform::fontExists (const char *name) { - return ::fltk::font(name) != NULL; + return FltkFont::fontExists (name); } FltkFont* @@ -114,26 +203,10 @@ FltkColor::FltkColor (int color): Color (color) { this->color = color; - /* - * fltk/setcolor.cxx: - * "A Color of zero (fltk::NO_COLOR) will draw black but is - * ambiguous. It is returned as an error value or to indicate portions - * of a Style that should be inherited, and it is also used as the - * default label color for everything so that changing color zero can - * be used by the -fg switch. You should use fltk::BLACK (56) to get - * black." - * - * i.e., zero only works sometimes. - */ - - if (!(colors[SHADING_NORMAL] = shadeColor (color, SHADING_NORMAL) << 8)) - colors[SHADING_NORMAL] = ::fltk::BLACK; - if (!(colors[SHADING_INVERSE] = shadeColor (color, SHADING_INVERSE) << 8)) - colors[SHADING_INVERSE] = ::fltk::BLACK; - if (!(colors[SHADING_DARK] = shadeColor (color, SHADING_DARK) << 8)) - colors[SHADING_DARK] = ::fltk::BLACK; - if (!(colors[SHADING_LIGHT] = shadeColor (color, SHADING_LIGHT) << 8)) - colors[SHADING_LIGHT] = ::fltk::BLACK; + colors[SHADING_NORMAL] = shadeColor (color, SHADING_NORMAL) << 8; + colors[SHADING_INVERSE] = shadeColor (color, SHADING_INVERSE) << 8; + colors[SHADING_DARK] = shadeColor (color, SHADING_DARK) << 8; + colors[SHADING_LIGHT] = shadeColor (color, SHADING_LIGHT) << 8; } FltkColor::~FltkColor () @@ -156,22 +229,15 @@ FltkColor * FltkColor::create (int col) FltkTooltip::FltkTooltip (const char *text) : Tooltip(text) { - shown = false; - - if (!text || !strpbrk(text, "&@")) { + if (!strchr(text, '@')) { escaped_str = NULL; } else { - /* - * WORKAROUND: ::fltk::Tooltip::tooltip_timeout() makes instance_ - * if necessary, and immediately uses it. This means that we can't - * get our hands on it to set RAW_LABEL until after it has been shown - * once. So let's escape the special characters ourselves. - */ + /* FLTK likes to interpret symbols, and so they must be escaped */ const char *src = text; char *dest = escaped_str = (char *) malloc(strlen(text) * 2 + 1); while (*src) { - if (*src == '&' || *src == '@') + if (*src == '@') *dest++ = *src; *dest++ = *src++; } @@ -181,8 +247,6 @@ FltkTooltip::FltkTooltip (const char *text) : Tooltip(text) FltkTooltip::~FltkTooltip () { - if (shown) - ::fltk::Tooltip::exit(); if (escaped_str) free(escaped_str); } @@ -194,38 +258,36 @@ FltkTooltip *FltkTooltip::create (const char *text) void FltkTooltip::onEnter() { - fltk::Widget *widget = fltk::belowmouse(); + Fl_Widget *widget = Fl::belowmouse(); - ::fltk::Tooltip::enter(widget, *((fltk::Rectangle *)widget), - escaped_str ? escaped_str : str); - shown = true; + Fl_Tooltip::enter_area(widget, widget->x(), widget->y(), widget->w(), + widget->h(), escaped_str ? escaped_str : str); } void FltkTooltip::onLeave() { - ::fltk::Tooltip::exit(); - shown = false; + Fl_Tooltip::exit(NULL); } void FltkTooltip::onMotion() { } -void FltkView::addFltkWidget (::fltk::Widget *widget, +void FltkView::addFltkWidget (Fl_Widget *widget, core::Allocation *allocation) { } -void FltkView::removeFltkWidget (::fltk::Widget *widget) +void FltkView::removeFltkWidget (Fl_Widget *widget) { } -void FltkView::allocateFltkWidget (::fltk::Widget *widget, +void FltkView::allocateFltkWidget (Fl_Widget *widget, core::Allocation *allocation) { } -void FltkView::drawFltkWidget (::fltk::Widget *widget, core::Rectangle *area) +void FltkView::drawFltkWidget (Fl_Widget *widget, core::Rectangle *area) { } @@ -310,7 +372,7 @@ FltkPlatform::FltkPlatform () FltkPlatform::~FltkPlatform () { if (idleFuncRunning) - remove_idle (generalStaticIdle, (void*)this); + Fl::remove_idle (generalStaticIdle, (void*)this); delete idleQueue; delete resources; } @@ -363,23 +425,23 @@ int FltkPlatform::textWidth (core::style::Font *font, const char *text, int sc_fontsize = lout::misc::roundInt(ff->size * 0.78); for (curr = 0; next < len; curr = next) { next = nextGlyph(text, curr); - wc = utf8decode(text + curr, text + next, &nb); + wc = fl_utf8decode(text + curr, text + next, &nb); if ((wcu = towupper(wc)) == wc) { /* already uppercase, just draw the character */ - setfont(ff->font, ff->size); + fl_font(ff->font, ff->size); width += font->letterSpacing; - width += (int)getwidth(text + curr, next - curr); + width += (int)fl_width(text + curr, next - curr); } else { /* make utf8 string for converted char */ - nb = utf8encode(wcu, chbuf); - setfont(ff->font, sc_fontsize); + nb = fl_utf8encode(wcu, chbuf); + fl_font(ff->font, sc_fontsize); width += font->letterSpacing; - width += (int)getwidth(chbuf, nb); + width += (int)fl_width(chbuf, nb); } } } else { - setfont (ff->font, ff->size); - width = (int) getwidth (text, len); + fl_font (ff->font, ff->size); + width = (int) fl_width (text, len); if (font->letterSpacing) { int curr = 0, next = 0; @@ -397,22 +459,28 @@ int FltkPlatform::textWidth (core::style::Font *font, const char *text, int FltkPlatform::nextGlyph (const char *text, int idx) { - return utf8fwd (&text[idx + 1], text, &text[strlen (text)]) - text; + return fl_utf8fwd (&text[idx + 1], text, &text[strlen (text)]) - text; } int FltkPlatform::prevGlyph (const char *text, int idx) { - return utf8back (&text[idx - 1], text, &text[strlen (text)]) - text; + return fl_utf8back (&text[idx - 1], text, &text[strlen (text)]) - text; } float FltkPlatform::dpiX () { - return ::fltk::Monitor::all ().dpi_x (); + float horizontal, vertical; + + Fl::screen_dpi(horizontal, vertical); + return horizontal; } float FltkPlatform::dpiY () { - return ::fltk::Monitor::all ().dpi_y (); + float horizontal, vertical; + + Fl::screen_dpi(horizontal, vertical); + return vertical; } void FltkPlatform::generalStaticIdle (void *data) @@ -435,7 +503,7 @@ void FltkPlatform::generalIdle () if (idleQueue->isEmpty()) { idleFuncRunning = false; - remove_idle (generalStaticIdle, (void*)this); + Fl::remove_idle (generalStaticIdle, (void*)this); } } @@ -449,7 +517,7 @@ int FltkPlatform::addIdle (void (core::Layout::*func) ()) * idle function, the passed idle function is put into a queue. */ if (!idleFuncRunning) { - add_idle (generalStaticIdle, (void*)this); + Fl::add_idle (generalStaticIdle, (void*)this); idleFuncRunning = true; } @@ -478,7 +546,7 @@ void FltkPlatform::removeIdle (int idleId) } if (idleFuncRunning && idleQueue->isEmpty()) - remove_idle (generalStaticIdle, (void*)this); + Fl::remove_idle (generalStaticIdle, (void*)this); } core::style::Font *FltkPlatform::createFont (core::style::FontAttrs @@ -500,7 +568,7 @@ core::style::Tooltip *FltkPlatform::createTooltip (const char *text) void FltkPlatform::copySelection(const char *text) { - fltk::copy(text, strlen(text), false); + Fl::copy(text, strlen(text), 0); } core::Imgbuf *FltkPlatform::createImgbuf (core::Imgbuf::Type type, diff --git a/dw/fltkplatform.hh b/dw/fltkplatform.hh index 7a708938..adf56df0 100644 --- a/dw/fltkplatform.hh +++ b/dw/fltkplatform.hh @@ -5,8 +5,6 @@ # error Do not include this file directly, use "fltkcore.hh" instead. #endif -#include <fltk/Font.h> - namespace dw { /** @@ -16,16 +14,32 @@ namespace fltk { class FltkFont: public core::style::Font { + class FontFamily: public lout::object::Object { + Fl_Font font[4]; + public: + FontFamily (); + void set (Fl_Font, int attrs); + Fl_Font get (int attrs); + }; + + static FontFamily standardFontFamily; + + static lout::container::typed::HashTable <lout::object::ConstString, + FontFamily> *systemFonts; static lout::container::typed::HashTable <dw::core::style::FontAttrs, FltkFont> *fontsTable; FltkFont (core::style::FontAttrs *attrs); ~FltkFont (); + static void initSystemFonts (); + public: - ::fltk::Font *font; + Fl_Font font; static FltkFont *create (core::style::FontAttrs *attrs); + static bool fontExists (const char *name); + static Fl_Font get (const char *name, int attrs); }; @@ -48,8 +62,7 @@ class FltkTooltip: public core::style::Tooltip private: FltkTooltip (const char *text); ~FltkTooltip (); - bool shown; - char *escaped_str; /* fltk WORKAROUND */ + char *escaped_str; public: static FltkTooltip *create(const char *text); void onEnter(); @@ -66,12 +79,12 @@ class FltkView: public core::View public: virtual bool usesFltkWidgets () = 0; - virtual void addFltkWidget (::fltk::Widget *widget, + virtual void addFltkWidget (Fl_Widget *widget, core::Allocation *allocation); - virtual void removeFltkWidget (::fltk::Widget *widget); - virtual void allocateFltkWidget (::fltk::Widget *widget, + virtual void removeFltkWidget (Fl_Widget *widget); + virtual void allocateFltkWidget (Fl_Widget *widget, core::Allocation *allocation); - virtual void drawFltkWidget (::fltk::Widget *widget, core::Rectangle *area); + virtual void drawFltkWidget (Fl_Widget *widget, core::Rectangle *area); }; diff --git a/dw/fltkpreview.cc b/dw/fltkpreview.cc index 7096420f..fbf139c9 100644 --- a/dw/fltkpreview.cc +++ b/dw/fltkpreview.cc @@ -22,15 +22,13 @@ #include "fltkpreview.hh" #include "fltkmisc.hh" -#include <fltk/events.h> -#include <fltk/xbmImage.h> -#include <fltk/draw.h> +#include <FL/Fl.H> +#include <FL/Fl_Bitmap.H> +#include <FL/fl_draw.H> #include <stdio.h> #include "preview.xbm" -using namespace ::fltk; - namespace dw { namespace fltk { @@ -126,7 +124,7 @@ void FltkPreview::drawText (core::style::Font *font, * else that measures text). */ FltkFont *ff = (FltkFont*)font; - setfont(ff->font, translateCanvasXToViewX (ff->size)); + Fl::set_font(ff->font, translateCanvasXToViewX (ff->size)); #if 0 /** * \todo Normally, this should already be known, maybe it @@ -144,9 +142,8 @@ void FltkPreview::drawText (core::style::Font *font, setcolor(((FltkColor*)color)->colors[shading]); fillrect (rect); #endif - setcolor(((FltkColor*)color)->colors[shading]); - drawtext(text, len, - translateCanvasXToViewX (x), translateCanvasYToViewY (y)); + fl_color(((FltkColor*)color)->colors[shading]); + fl_draw(text, len, translateCanvasXToViewX (x), translateCanvasYToViewY(y)); } void FltkPreview::drawImage (core::Imgbuf *imgbuf, int xRoot, int yRoot, @@ -159,7 +156,7 @@ bool FltkPreview::usesFltkWidgets () return false; } -void FltkPreview::drawFltkWidget (::fltk::Widget *widget, +void FltkPreview::drawFltkWidget (Fl_Widget *widget, core::Rectangle *area) { } @@ -167,9 +164,9 @@ void FltkPreview::drawFltkWidget (::fltk::Widget *widget, // ---------------------------------------------------------------------- FltkPreviewWindow::FltkPreviewWindow (dw::core::Layout *layout): - MenuWindow (1, 1) + Fl_Menu_Window (1, 1) { - box (EMBOSSED_BOX); + box (FL_EMBOSSED_BOX); begin (); preview = new FltkPreview (BORDER_WIDTH, BORDER_WIDTH, 1, 1, layout); @@ -205,7 +202,7 @@ void FltkPreviewWindow::reallocate () height = preview->canvasHeight * maxWidth / preview->canvasWidth; } - get_mouse(mx, my); + Fl::get_mouse(mx, my); posX = mx - preview->translateCanvasXToViewX (preview->scrollX + preview->scrollWidth / 2); @@ -237,13 +234,12 @@ void FltkPreviewWindow::reallocate () resize (posX, posY, width, height); - preview->w (w () - 2 * BORDER_WIDTH); - preview->h (h () - 2 * BORDER_WIDTH); + preview->size(w () - 2 * BORDER_WIDTH, h () - 2 * BORDER_WIDTH); } void FltkPreviewWindow::hideWindow () { - Window::hide (); + Fl_Window::hide (); } void FltkPreviewWindow::scrollTo (int mouseX, int mouseY) @@ -263,9 +259,9 @@ void FltkPreviewWindow::scrollTo (int mouseX, int mouseY) FltkPreviewButton::FltkPreviewButton (int x, int y, int w, int h, dw::core::Layout *layout, const char *label): - Button (x, y, w, h, label) + Fl_Button (x, y, w, h, label) { - image (new xbmImage (preview_bits, preview_width, preview_height)); + image (new Fl_Bitmap (preview_bits, preview_width, preview_height)); window = new FltkPreviewWindow (layout); } @@ -278,23 +274,23 @@ int FltkPreviewButton::handle (int event) /** \bug Some parts are missing. */ switch (event) { - case PUSH: + case FL_PUSH: window->showWindow (); - return Button::handle (event); + return Fl_Button::handle (event); - case DRAG: + case FL_DRAG: if (window->visible ()) { - window->scrollTo (event_x_root (), event_y_root ()); + window->scrollTo (Fl::event_x_root (), Fl::event_y_root ()); return 1; } - return Button::handle (event); + return Fl_Button::handle (event); - case RELEASE: + case FL_RELEASE: window->hideWindow (); - return Button::handle (event); + return Fl_Button::handle (event); default: - return Button::handle (event); + return Fl_Button::handle (event); } } diff --git a/dw/fltkpreview.hh b/dw/fltkpreview.hh index 13db2811..06d5a537 100644 --- a/dw/fltkpreview.hh +++ b/dw/fltkpreview.hh @@ -1,8 +1,8 @@ #ifndef __FlTKPREVIEW_HH__ #define __FlTKPREVIEW_HH__ -#include <fltk/Button.h> -#include <fltk/MenuWindow.h> +#include <FL/Fl_Button.H> +#include <FL/Fl_Menu_Window.H> #include "fltkviewbase.hh" namespace dw { @@ -46,11 +46,11 @@ public: int x, int y, int width, int height); bool usesFltkWidgets (); - void drawFltkWidget (::fltk::Widget *widget, core::Rectangle *area); + void drawFltkWidget (Fl_Widget *widget, core::Rectangle *area); }; -class FltkPreviewWindow: public ::fltk::MenuWindow +class FltkPreviewWindow: public Fl_Menu_Window { private: enum { BORDER_WIDTH = 2 }; @@ -71,7 +71,7 @@ public: }; -class FltkPreviewButton: public ::fltk::Button +class FltkPreviewButton: public Fl_Button { private: FltkPreviewWindow *window; diff --git a/dw/fltkui.cc b/dw/fltkui.cc index ff80e14c..62928ed4 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -25,21 +25,16 @@ #include "../lout/msg.h" #include "../lout/misc.hh" +#include <FL/Fl.H> +#include <FL/fl_draw.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Text_Editor.H> +#include <FL/Fl_Check_Button.H> +#include <FL/Fl_Round_Button.H> +#include <FL/Fl_Choice.H> +#include <FL/Fl_Tree.H> + #include <stdio.h> -#include <fltk/Widget.h> -#include <fltk/Group.h> -#include <fltk/Input.h> -#include <fltk/TextEditor.h> -#include <fltk/RadioButton.h> -#include <fltk/CheckButton.h> -#include <fltk/Choice.h> -#include <fltk/Browser.h> -#include <fltk/Font.h> -#include <fltk/draw.h> -#include <fltk/Symbol.h> -#include <fltk/Item.h> -#include <fltk/ItemGroup.h> -#include <fltk/events.h> namespace dw { namespace fltk { @@ -139,14 +134,12 @@ void FltkResource::setStyle (core::style::Style *style) setWidgetStyle (widget, style); } -void FltkResource::setWidgetStyle (::fltk::Widget *widget, +void FltkResource::setWidgetStyle (Fl_Widget *widget, core::style::Style *style) { FltkFont *font = (FltkFont*)style->font; widget->labelsize (font->size); widget->labelfont (font->font); - widget->textsize (font->size); - widget->textfont (font->font); FltkColor *bg = (FltkColor*)style->backgroundColor; if (bg) { @@ -155,21 +148,13 @@ void FltkResource::setWidgetStyle (::fltk::Widget *widget, if (style->color) { int style_fg = ((FltkColor*)style->color)->colors [FltkColor::SHADING_NORMAL]; - ::fltk::Color fg = ::fltk::contrast(style_fg, normal_bg); + Fl_Color fg = fl_contrast(style_fg, normal_bg); widget->labelcolor(fg); - widget->textcolor(fg); widget->selection_color(fg); } widget->color(normal_bg); - widget->buttoncolor(normal_bg); - widget->selection_textcolor(normal_bg); - if (widget->type() != ::fltk::Widget::RADIO && - widget->type() != ::fltk::Widget::TOGGLE) { - /* it looks awful to highlight the buttons */ - widget->highlight_color(bg->colors[FltkColor::SHADING_LIGHT]); - } } } @@ -250,19 +235,17 @@ FltkLabelButtonResource::FltkLabelButtonResource (FltkPlatform *platform, FltkLabelButtonResource::~FltkLabelButtonResource () { - delete label; + free((char *)label); } -::fltk::Widget *FltkLabelButtonResource::createNewWidget (core::Allocation - *allocation) +Fl_Widget *FltkLabelButtonResource::createNewWidget (core::Allocation + *allocation) { - ::fltk::Button *button = - new ::fltk::Button (allocation->x, allocation->y, allocation->width, - allocation->ascent + allocation->descent, - label); - button->set_flag (::fltk::RAW_LABEL); + Fl_Button *button = + new Fl_Button (allocation->x, allocation->y, allocation->width, + allocation->ascent + allocation->descent, label); button->callback (widgetCallback, this); - button->when (::fltk::WHEN_RELEASE); + button->when (FL_WHEN_RELEASE); return button; } @@ -270,9 +253,9 @@ void FltkLabelButtonResource::sizeRequest (core::Requisition *requisition) { if (style) { FltkFont *font = (FltkFont*)style->font; - ::fltk::setfont(font->font,font->size); + fl_font(font->font,font->size); requisition->width = - (int)::fltk::getwidth (label, strlen (label)) + (int)fl_width (label, strlen (label)) + 2 * RELIEF_X_THICKNESS; requisition->ascent = font->ascent + RELIEF_Y_THICKNESS; requisition->descent = font->descent + RELIEF_Y_THICKNESS; @@ -290,35 +273,35 @@ void FltkLabelButtonResource::sizeRequest (core::Requisition *requisition) */ static core::ButtonState getDwButtonState () { - int s1 = ::fltk::event_state (); + int s1 = Fl::event_state (); int s2 = (core::ButtonState)0; - if (s1 & ::fltk::SHIFT) s2 |= core::SHIFT_MASK; - if (s1 & ::fltk::CTRL) s2 |= core::CONTROL_MASK; - if (s1 & ::fltk::ALT) s2 |= core::META_MASK; - if (s1 & ::fltk::BUTTON1) s2 |= core::BUTTON1_MASK; - if (s1 & ::fltk::BUTTON2) s2 |= core::BUTTON2_MASK; - if (s1 & ::fltk::BUTTON3) s2 |= core::BUTTON3_MASK; + if (s1 & FL_SHIFT) s2 |= core::SHIFT_MASK; + if (s1 & FL_CTRL) s2 |= core::CONTROL_MASK; + if (s1 & FL_ALT) s2 |= core::META_MASK; + if (s1 & FL_BUTTON1) s2 |= core::BUTTON1_MASK; + if (s1 & FL_BUTTON2) s2 |= core::BUTTON2_MASK; + if (s1 & FL_BUTTON3) s2 |= core::BUTTON3_MASK; return (core::ButtonState)s2; } static void setButtonEvent(dw::core::EventButton *event) { - event->xCanvas = ::fltk::event_x(); - event->yCanvas = ::fltk::event_y(); + event->xCanvas = Fl::event_x(); + event->yCanvas = Fl::event_y(); event->state = getDwButtonState(); - event->button = ::fltk::event_button(); - event->numPressed = ::fltk::event_clicks() + 1; + event->button = Fl::event_button(); + event->numPressed = Fl::event_clicks() + 1; } -void FltkLabelButtonResource::widgetCallback (::fltk::Widget *widget, +void FltkLabelButtonResource::widgetCallback (Fl_Widget *widget, void *data) { - if ((widget->when () & ::fltk::WHEN_RELEASE) && - ((::fltk::event_key() == ::fltk::ReturnKey) || - (::fltk::event_button() == ::fltk::LeftButton || - ::fltk::event_button() == ::fltk::MiddleButton))) { + if ((widget->when () & FL_WHEN_RELEASE) && + ((Fl::event_key() == FL_Enter) || + (Fl::event_button() == FL_LEFT_MOUSE || + Fl::event_button() == FL_MIDDLE_MOUSE))) { FltkLabelButtonResource *lbr = (FltkLabelButtonResource*) data; dw::core::EventButton event; setButtonEvent(&event); @@ -358,22 +341,22 @@ FltkComplexButtonResource::~FltkComplexButtonResource () { } -void FltkComplexButtonResource::widgetCallback (::fltk::Widget *widget, +void FltkComplexButtonResource::widgetCallback (Fl_Widget *widget, void *data) { FltkComplexButtonResource *res = (FltkComplexButtonResource*)data; - if (widget->when() == ::fltk::WHEN_RELEASE && - ((::fltk::event_key() == ::fltk::ReturnKey) || - (::fltk::event_button() == ::fltk::LeftButton || - ::fltk::event_button() == ::fltk::MiddleButton))) { - res->click_x = ::fltk::event_x(); - res->click_y = ::fltk::event_y(); + if (widget->when() == FL_WHEN_RELEASE && + ((Fl::event_key() == FL_Enter) || + (Fl::event_button() == FL_LEFT_MOUSE || + Fl::event_button() == FL_MIDDLE_MOUSE))) { + res->click_x = Fl::event_x(); + res->click_y = Fl::event_y(); dw::core::EventButton event; setButtonEvent(&event); res->emitClicked(&event); } else { - ((FltkViewBase*)res->flatView)->handle(::fltk::event()); + ((FltkViewBase*)res->flatView)->handle(Fl::event()); } } @@ -423,16 +406,16 @@ int FltkComplexButtonResource::reliefYThickness () } -::fltk::Widget *FltkComplexButtonResource::createNewWidget (core::Allocation +Fl_Widget *FltkComplexButtonResource::createNewWidget (core::Allocation *allocation) { ComplexButton *button = new ComplexButton (allocation->x, allocation->y, allocation->width, allocation->ascent + allocation->descent); button->callback (widgetCallback, this); - button->when (::fltk::WHEN_RELEASE); + button->when (FL_WHEN_RELEASE); if (!relief) - button->box(::fltk::FLAT_BOX); + button->box(FL_FLAT_BOX); flatView = new FltkFlatView (allocation->x + reliefXThickness (), allocation->y + reliefYThickness (), @@ -465,25 +448,25 @@ FltkEntryResource::FltkEntryResource (FltkPlatform *platform, int maxLength, FltkEntryResource::~FltkEntryResource () { if (initText) - delete initText; + free((char *)initText); if (label) - delete label; + free(label); } -::fltk::Widget *FltkEntryResource::createNewWidget (core::Allocation +Fl_Widget *FltkEntryResource::createNewWidget (core::Allocation *allocation) { - ::fltk::Input *input = - new ::fltk::Input (allocation->x, allocation->y, allocation->width, - allocation->ascent + allocation->descent); + Fl_Input *input = + new Fl_Input (allocation->x, allocation->y, allocation->width, + allocation->ascent + allocation->descent); if (password) - input->type(::fltk::Input::SECRET); + input->type(FL_SECRET_INPUT); input->callback (widgetCallback, this); - input->when (::fltk::WHEN_ENTER_KEY_ALWAYS); + input->when (FL_WHEN_ENTER_KEY_ALWAYS); if (label) { input->label(label); - input->set_flag(::fltk::ALIGN_INSIDE_LEFT); + input->align(FL_ALIGN_INSIDE); } if (initText) input->value (initText); @@ -491,6 +474,19 @@ FltkEntryResource::~FltkEntryResource () return input; } +void FltkEntryResource::setWidgetStyle (Fl_Widget *widget, + core::style::Style *style) +{ + Fl_Input *in = (Fl_Input *)widget; + + FltkResource::setWidgetStyle(widget, style); + + in->textcolor(widget->labelcolor()); + in->cursor_color(in->textcolor()); + in->textsize(in->labelsize()); + in->textfont(in->labelfont()); +} + void FltkEntryResource::setDisplayed(bool displayed) { FltkResource::setDisplayed(displayed); @@ -501,9 +497,9 @@ void FltkEntryResource::sizeRequest (core::Requisition *requisition) { if (displayed() && style) { FltkFont *font = (FltkFont*)style->font; - ::fltk::setfont(font->font,font->size); + fl_font(font->font,font->size); requisition->width = - (int)::fltk::getwidth ("n", 1) + (int)fl_width ('n') * (maxLength == UNLIMITED_MAX_LENGTH ? 10 : maxLength) + 2 * RELIEF_X_THICKNESS; requisition->ascent = font->ascent + RELIEF_Y_THICKNESS; @@ -515,33 +511,23 @@ void FltkEntryResource::sizeRequest (core::Requisition *requisition) } } -void FltkEntryResource::widgetCallback (::fltk::Widget *widget, - void *data) +void FltkEntryResource::widgetCallback (Fl_Widget *widget, void *data) { - /* The (::fltk::event_key() == ::fltk::ReturnKey) test - * is necessary because WHEN_ENTER_KEY also includes - * other events we're not interested in. For instance pressing - * The Back or Forward, buttons, or the first click on a rendered - * page. BUG: this must be investigated and reported to FLTK2 team - */ - _MSG("when = %d\n", widget->when ()); - if ((widget->when () & ::fltk::WHEN_ENTER_KEY_ALWAYS) && - (::fltk::event_key() == ::fltk::ReturnKey)) - ((FltkEntryResource*)data)->emitActivate (); + ((FltkEntryResource*)data)->emitActivate (); } const char *FltkEntryResource::getText () { - return ((::fltk::Input*)widget)->value (); + return ((Fl_Input*)widget)->value (); } void FltkEntryResource::setText (const char *text) { if (initText) - delete initText; + free((char *)initText); initText = strdup (text); - ((::fltk::Input*)widget)->value (initText); + ((Fl_Input*)widget)->value (initText); } bool FltkEntryResource::isEditable () @@ -560,7 +546,7 @@ FltkMultiLineTextResource::FltkMultiLineTextResource (FltkPlatform *platform, int cols, int rows): FltkSpecificResource <dw::core::ui::MultiLineTextResource> (platform) { - buffer = new ::fltk::TextBuffer; + buffer = new Fl_Text_Buffer; editable = false; numCols = cols; @@ -582,29 +568,40 @@ FltkMultiLineTextResource::FltkMultiLineTextResource (FltkPlatform *platform, FltkMultiLineTextResource::~FltkMultiLineTextResource () { /* Free memory avoiding a double-free of text buffers */ - ((::fltk::TextEditor *) widget)->buffer (0); + ((Fl_Text_Editor *) widget)->buffer (0); delete buffer; } -::fltk::Widget *FltkMultiLineTextResource::createNewWidget (core::Allocation +Fl_Widget *FltkMultiLineTextResource::createNewWidget (core::Allocation *allocation) { - ::fltk::TextEditor *text = - new ::fltk::TextEditor (allocation->x, allocation->y, - allocation->width, - allocation->ascent + allocation->descent); + Fl_Text_Editor *text = + new Fl_Text_Editor (allocation->x, allocation->y, allocation->width, + allocation->ascent + allocation->descent); text->buffer (buffer); return text; } +void FltkMultiLineTextResource::setWidgetStyle (Fl_Widget *widget, + core::style::Style *style) +{ + Fl_Text_Editor *ed = (Fl_Text_Editor *)widget; + + FltkResource::setWidgetStyle(widget, style); + + ed->textcolor(widget->labelcolor()); + ed->cursor_color(ed->textcolor()); + ed->textsize(ed->labelsize()); + ed->textfont(ed->labelfont()); +} + void FltkMultiLineTextResource::sizeRequest (core::Requisition *requisition) { if (style) { FltkFont *font = (FltkFont*)style->font; - ::fltk::setfont(font->font,font->size); + fl_font(font->font,font->size); requisition->width = - (int)::fltk::getwidth ("n", 1) * numCols + - 2 * RELIEF_X_THICKNESS; + (int)fl_width ('n') * numCols + 2 * RELIEF_X_THICKNESS; requisition->ascent = RELIEF_Y_THICKNESS + font->ascent + (font->ascent + font->descent) * (numRows - 1); @@ -656,14 +653,23 @@ FltkToggleButtonResource<I>::~FltkToggleButtonResource () template <class I> -::fltk::Widget *FltkToggleButtonResource<I>::createNewWidget (core::Allocation +Fl_Widget *FltkToggleButtonResource<I>::createNewWidget (core::Allocation *allocation) { - ::fltk::Button *button = createNewButton (allocation); + Fl_Button *button = createNewButton (allocation); button->value (initActivated); return button; } +template <class I> +void FltkToggleButtonResource<I>::setWidgetStyle (Fl_Widget *widget, + core::style::Style *style) +{ + FltkResource::setWidgetStyle(widget, style); + + widget->selection_color(FL_BLACK); +} + template <class I> void FltkToggleButtonResource<I>::sizeRequest (core::Requisition *requisition) @@ -672,7 +678,7 @@ void FltkToggleButtonResource<I>::sizeRequest (core::Requisition *requisition) (this->FltkResource::style ? this->FltkResource::style->font : NULL); if (font) { - ::fltk::setfont(font->font, font->size); + fl_font(font->font, font->size); requisition->width = font->ascent + font->descent + 2*RELIEF_X_THICKNESS; requisition->ascent = font->ascent + RELIEF_Y_THICKNESS; requisition->descent = font->descent + RELIEF_Y_THICKNESS; @@ -687,7 +693,7 @@ void FltkToggleButtonResource<I>::sizeRequest (core::Requisition *requisition) template <class I> bool FltkToggleButtonResource<I>::FltkToggleButtonResource::isActivated () { - return ((::fltk::Button*)this->widget)->value (); + return ((Fl_Button*)this->widget)->value (); } @@ -695,7 +701,7 @@ template <class I> void FltkToggleButtonResource<I>::setActivated (bool activated) { initActivated = activated; - ((::fltk::Button*)this->widget)->value (initActivated); + ((Fl_Button*)this->widget)->value (initActivated); } // ---------------------------------------------------------------------- @@ -714,13 +720,12 @@ FltkCheckButtonResource::~FltkCheckButtonResource () } -::fltk::Button *FltkCheckButtonResource::createNewButton (core::Allocation +Fl_Button *FltkCheckButtonResource::createNewButton (core::Allocation *allocation) { - ::fltk::CheckButton *cb = - new ::fltk::CheckButton (allocation->x, allocation->y, allocation->width, - allocation->ascent + allocation->descent); - cb->set_flag (::fltk::RAW_LABEL); + Fl_Check_Button *cb = + new Fl_Check_Button (allocation->x, allocation->y, allocation->width, + allocation->ascent + allocation->descent); return cb; } @@ -798,10 +803,10 @@ dw::core::ui::RadioButtonResource::GroupIterator return group->groupIterator (); } -void FltkRadioButtonResource::widgetCallback (::fltk::Widget *widget, +void FltkRadioButtonResource::widgetCallback (Fl_Widget *widget, void *data) { - if (widget->when () & ::fltk::WHEN_CHANGED) + if (widget->when () & FL_WHEN_CHANGED) ((FltkRadioButtonResource*)data)->buttonClicked (); } @@ -814,11 +819,11 @@ void FltkRadioButtonResource::buttonClicked () } } -::fltk::Button *FltkRadioButtonResource::createNewButton (core::Allocation - *allocation) +Fl_Button *FltkRadioButtonResource::createNewButton (core::Allocation + *allocation) { /* - * Groups of fltk::RadioButton must be added to one fltk::Group, which is + * Groups of Fl_Radio_Button must be added to one Fl_Group, which is * not possible in this context. For this, we do the grouping ourself, * based on FltkRadioButtonResource::Group. * @@ -829,297 +834,191 @@ void FltkRadioButtonResource::buttonClicked () * (instead of creating a check button, and changing the style). */ - ::fltk::Button *button = - new ::fltk::RadioButton (allocation->x, allocation->y, - allocation->width, - allocation->ascent + allocation->descent); - button->set_flag (::fltk::RAW_LABEL); - button->when (::fltk::WHEN_CHANGED); + Fl_Button *button = + new Fl_Round_Button (allocation->x, allocation->y, allocation->width, + allocation->ascent + allocation->descent); + button->when (FL_WHEN_CHANGED); button->callback (widgetCallback, this); - button->type (::fltk::Button::TOGGLE); + button->type (FL_TOGGLE_BUTTON); return button; } // ---------------------------------------------------------------------- -template <class I> FltkSelectionResource<I>::Item::Item (Type type, - const char *name, - bool enabled, - bool selected) +template <class I> dw::core::Iterator * +FltkSelectionResource<I>::iterator (dw::core::Content::Type mask, bool atEnd) { - this->type = type; - this->name = name ? strdup (name) : NULL; - this->enabled = enabled; - initSelected = selected; + /** \bug Implementation. */ + return new core::EmptyIterator (this->getEmbed (), mask, atEnd); } -template <class I> FltkSelectionResource<I>::Item::~Item () -{ - if (name) - delete name; -} +// ---------------------------------------------------------------------- -template <class I> -::fltk::Item *FltkSelectionResource<I>::Item::createNewWidget (int index) +FltkOptionMenuResource::FltkOptionMenuResource (FltkPlatform *platform): + FltkSelectionResource <dw::core::ui::OptionMenuResource> (platform) { - ::fltk::Item *item = new ::fltk::Item (name); - item->set_flag (::fltk::RAW_LABEL); - item->user_data ((void *) index); - return item; -} + /* Fl_Menu_ does not like multiple menu items with the same label, and + * insert() treats some characters specially unless escaped, so let's + * do our own menu handling. + */ + itemsAllocated = 0x10; + menu = new Fl_Menu_Item[itemsAllocated]; + memset(menu, 0, itemsAllocated * sizeof(Fl_Menu_Item)); + itemsUsed = 1; // menu[0].text == NULL, which is an end-of-menu marker. + visibleItems = 0; -template <class I> -::fltk::ItemGroup * -FltkSelectionResource<I>::Item::createNewGroupWidget () -{ - ::fltk::ItemGroup *itemGroup = new ::fltk::ItemGroup (name); - itemGroup->set_flag (::fltk::RAW_LABEL); - itemGroup->user_data ((void *) -1L); - return itemGroup; + init (platform); } - -template <class I> -FltkSelectionResource<I>::WidgetStack::WidgetStack (::fltk::Menu *widget) +FltkOptionMenuResource::~FltkOptionMenuResource () { - this->widget = widget; - this->stack = new Stack <TypedPointer < ::fltk::Menu> > (true); + for (int i = 0; i < itemsUsed; i++) { + if (menu[i].text) + free((char *) menu[i].text); + } + delete[] menu; } -template <class I> FltkSelectionResource<I>::WidgetStack::~WidgetStack () +void FltkOptionMenuResource::setWidgetStyle (Fl_Widget *widget, + core::style::Style *style) { - delete stack; -} + Fl_Choice *ch = (Fl_Choice *)widget; + FltkResource::setWidgetStyle(widget, style); -template <class I> -FltkSelectionResource<I>::FltkSelectionResource (FltkPlatform *platform): - FltkSpecificResource<I> (platform) -{ - widgetStacks = new List <WidgetStack> (true); - allItems = new List <Item> (true); - items = new Vector <Item> (16, false); + ch->textcolor(widget->labelcolor()); + ch->textfont(ch->labelfont()); + ch->textsize(ch->labelsize()); } -template <class I> FltkSelectionResource<I>::~FltkSelectionResource () +Fl_Widget *FltkOptionMenuResource::createNewWidget (core::Allocation + *allocation) { - delete widgetStacks; - delete allItems; - delete items; + Fl_Choice *choice = + new Fl_Choice (allocation->x, allocation->y, + allocation->width, + allocation->ascent + allocation->descent); + choice->menu(menu); + return choice; } -template <class I> dw::core::Iterator * -FltkSelectionResource<I>::iterator (dw::core::Content::Type mask, bool atEnd) +void FltkOptionMenuResource::widgetCallback (Fl_Widget *widget, + void *data) { - /** \bug Implementation. */ - return new core::EmptyIterator (this->getEmbed (), mask, atEnd); } -template <class I> ::fltk::Widget * -FltkSelectionResource<I>::createNewWidget (core::Allocation *allocation) +int FltkOptionMenuResource::getMaxItemWidth() { - /** \todo Attributes (enabled, selected). */ - - ::fltk::Menu *menu = createNewMenu (allocation); - WidgetStack *widgetStack = new WidgetStack (menu); - widgetStack->stack->push (new TypedPointer < ::fltk::Menu> (menu)); - widgetStacks->append (widgetStack); - - - ::fltk::Menu *itemGroup; - ::fltk::Item *itemWidget; - - ::fltk::Group *currGroup = widgetStack->stack->getTop()->getTypedValue(); + int i, max = 0; - int index = 0; - for (Iterator <Item> it = allItems->iterator (); it.hasNext (); ) { - Item *item = it.getNext (); - switch (item->type) { - case Item::ITEM: - itemWidget = item->createNewWidget (index++); - currGroup->add (itemWidget); - break; + for (i = 0; i < itemsUsed; i++) { + int width = 0; + const char *str = menu[i].text; - case Item::START: - itemGroup = item->createNewGroupWidget (); - currGroup->add (itemGroup); - widgetStack->stack->push (new TypedPointer < ::fltk::Menu> (menu)); - currGroup = itemGroup; - break; - - case Item::END: - widgetStack->stack->pop (); - currGroup = widgetStack->stack->getTop()->getTypedValue(); - break; + if (str) { + width = fl_width(str); + if (width > max) + max = width; } } - - return menu; + return max; } -template <class I> -typename FltkSelectionResource<I>::Item * -FltkSelectionResource<I>::createNewItem (typename Item::Type type, - const char *name, - bool enabled, - bool selected) { - return new Item(type,name,enabled,selected); -} - -template <class I> void FltkSelectionResource<I>::addItem (const char *str, - bool enabled, - bool selected) -{ - int index = items->size (); - Item *item = createNewItem (Item::ITEM, str, enabled, selected); - items->put (item); - allItems->append (item); - - for (Iterator <WidgetStack> it = widgetStacks->iterator (); - it.hasNext(); ) { - WidgetStack *widgetStack = it.getNext (); - ::fltk::Item *itemWidget = item->createNewWidget (index); - widgetStack->stack->getTop()->getTypedValue()->add (itemWidget); - - if (!enabled) - itemWidget->deactivate (); - - if (selected) { - itemWidget->set_selected(); - if (setSelectedItems ()) { - // Handle multiple item selection. - int *pos = new int[widgetStack->stack->size ()]; - int i; - Iterator <TypedPointer < ::fltk::Menu> > it; - for (it = widgetStack->stack->iterator (), - i = widgetStack->stack->size () - 1; - it.hasNext (); - i--) { - TypedPointer < ::fltk::Menu> * p = it.getNext (); - pos[i] = p->getTypedValue()->children () - 1; - } - widgetStack->widget->set_item (pos, widgetStack->stack->size ()); - delete [] pos; - } - } +void FltkOptionMenuResource::sizeRequest (core::Requisition *requisition) +{ + if (style) { + FltkFont *font = (FltkFont*)style->font; + fl_font(font->font, font->size); + int maxItemWidth = getMaxItemWidth (); + requisition->ascent = font->ascent + RELIEF_Y_THICKNESS; + requisition->descent = font->descent + RELIEF_Y_THICKNESS; + requisition->width = maxItemWidth + + (requisition->ascent + requisition->descent) + + 2 * RELIEF_X_THICKNESS; + } else { + requisition->width = 1; + requisition->ascent = 1; + requisition->descent = 0; } } -template <class I> void FltkSelectionResource<I>::pushGroup (const char *name, - bool enabled) +void FltkOptionMenuResource::enlargeMenu () { - Item *item = createNewItem (Item::START, name, enabled); - allItems->append (item); + Fl_Choice *ch = (Fl_Choice *)widget; + int selected = ch->value(); + Fl_Menu_Item *newMenu; - for (Iterator <WidgetStack> it = widgetStacks->iterator (); - it.hasNext(); ) { - WidgetStack *widgetStack = it.getNext (); - ::fltk::ItemGroup *group = item->createNewGroupWidget (); - widgetStack->stack->getTop()->getTypedValue()->add (group); - widgetStack->stack->push (new TypedPointer < ::fltk::Menu> (group)); - if (!enabled) - group->deactivate (); - } + itemsAllocated += 0x10; + newMenu = new Fl_Menu_Item[itemsAllocated]; + memcpy(newMenu, menu, itemsUsed * sizeof(Fl_Menu_Item)); + memset(newMenu + itemsUsed, 0, 0x10 * sizeof(Fl_Menu_Item)); + delete[] menu; + menu = newMenu; + ch->menu(menu); + ch->value(selected); } -template <class I> void FltkSelectionResource<I>::popGroup () +Fl_Menu_Item *FltkOptionMenuResource::newItem() { - Item *item = createNewItem (Item::END); - allItems->append (item); + Fl_Menu_Item *item; - for (Iterator <WidgetStack> it = widgetStacks->iterator (); - it.hasNext(); ) { - WidgetStack *widgetStack = it.getNext (); - widgetStack->stack->pop (); - } -} + if (itemsUsed == itemsAllocated) + enlargeMenu(); -template <class I> int FltkSelectionResource<I>::getNumberOfItems () -{ - return items->size (); -} + item = menu + itemsUsed - 1; + itemsUsed++; -template <class I> const char *FltkSelectionResource<I>::getItem (int index) -{ - return items->get(index)->name; + return item; } -template <class I> int FltkSelectionResource<I>::getMaxStringWidth () +void FltkOptionMenuResource::addItem (const char *str, + bool enabled, bool selected) { - int width = 0, numberOfItems = getNumberOfItems (); - for (int i = 0; i < numberOfItems; i++) { - int len = (int)::fltk::getwidth (getItem(i)); - if (len > width) width = len; - } - return width; -} + Fl_Menu_Item *item = newItem(); -// ---------------------------------------------------------------------- + item->text = strdup(str); + item->argument(visibleItems++); -FltkOptionMenuResource::FltkOptionMenuResource (FltkPlatform *platform): - FltkSelectionResource <dw::core::ui::OptionMenuResource> (platform), - selection(-1) -{ - init (platform); + if (enabled == false) + item->flags = FL_MENU_INACTIVE; + + if (selected) + ((Fl_Choice *)widget)->value(item); + + queueResize (true); } -FltkOptionMenuResource::~FltkOptionMenuResource () +void FltkOptionMenuResource::pushGroup (const char *name, bool enabled) { -} + Fl_Menu_Item *item = newItem(); + item->text = strdup(name); + item->argument(visibleItems++); -::fltk::Menu *FltkOptionMenuResource::createNewMenu (core::Allocation - *allocation) -{ - ::fltk::Menu *menu = - new ::fltk::Choice (allocation->x, allocation->y, - allocation->width, - allocation->ascent + allocation->descent); - menu->set_flag (::fltk::RAW_LABEL); - menu->callback(widgetCallback,this); - return menu; -} + if (enabled == false) + item->flags = FL_MENU_INACTIVE; -void FltkOptionMenuResource::widgetCallback (::fltk::Widget *widget, - void *data) -{ - ((FltkOptionMenuResource *) data)->selection = - (long) (((::fltk::Menu *) widget)->item()->user_data()); -} + item->flags |= FL_SUBMENU; -void FltkOptionMenuResource::sizeRequest (core::Requisition *requisition) -{ - if (style) { - FltkFont *font = (FltkFont*)style->font; - ::fltk::setfont(font->font,font->size); - int maxStringWidth = getMaxStringWidth (); - requisition->ascent = font->ascent + RELIEF_Y_THICKNESS; - requisition->descent = font->descent + RELIEF_Y_THICKNESS; - requisition->width = maxStringWidth - + (requisition->ascent + requisition->descent) * 4 / 5 - + 2 * RELIEF_X_THICKNESS; - } else { - requisition->width = 1; - requisition->ascent = 1; - requisition->descent = 0; - } + queueResize (true); } -void FltkOptionMenuResource::addItem (const char *str, - bool enabled, bool selected) +void FltkOptionMenuResource::popGroup () { - FltkSelectionResource<dw::core::ui::OptionMenuResource>::addItem - (str,enabled,selected); - if (selected) - selection = (items->size ()) - 1; - + /* Item with NULL text field closes the submenu */ + newItem(); queueResize (true); } bool FltkOptionMenuResource::isSelected (int index) { - return index == selection; + return index == (long) ((Fl_Choice *)widget)->mvalue()->user_data(); +} + +int FltkOptionMenuResource::getNumberOfItems() +{ + return ((Fl_Choice*)widget)->size(); } // ---------------------------------------------------------------------- @@ -1140,70 +1039,133 @@ FltkListResource::~FltkListResource () } -::fltk::Menu *FltkListResource::createNewMenu (core::Allocation *allocation) +Fl_Widget *FltkListResource::createNewWidget (core::Allocation *allocation) { - ::fltk::Menu *menu = - new ::fltk::Browser (allocation->x, allocation->y, allocation->width, + Fl_Tree *tree = + new Fl_Tree (allocation->x, allocation->y, allocation->width, allocation->ascent + allocation->descent); - if (mode == SELECTION_MULTIPLE) - menu->type(::fltk::Browser::MULTI); - menu->set_flag (::fltk::RAW_LABEL); - menu->callback(widgetCallback,this); - menu->when(::fltk::WHEN_CHANGED); - return menu; + + tree->selectmode((mode == SELECTION_MULTIPLE) ? FL_TREE_SELECT_MULTI + : FL_TREE_SELECT_SINGLE); + tree->showroot(0); + tree->connectorstyle(FL_TREE_CONNECTOR_NONE); + tree->marginleft(-14); + tree->callback(widgetCallback,this); + tree->when(FL_WHEN_CHANGED); + + currParent = tree->root(); + return tree; +} + +void FltkListResource::setWidgetStyle (Fl_Widget *widget, + core::style::Style *style) +{ + Fl_Tree *t = (Fl_Tree *)widget; + + FltkResource::setWidgetStyle(widget, style); + + t->item_labelfont(widget->labelfont()); + t->item_labelsize(widget->labelsize()); + t->item_labelfgcolor(widget->labelcolor()); + t->item_labelbgcolor(widget->color()); } -void FltkListResource::widgetCallback (::fltk::Widget *widget, void *data) +void FltkListResource::widgetCallback (Fl_Widget *widget, void *data) { - ::fltk::Widget *fltkItem = ((::fltk::Menu *) widget)->item (); + Fl_Tree_Item *fltkItem = ((Fl_Tree *) widget)->callback_item (); int index = -1; if (fltkItem) index = (long) (fltkItem->user_data ()); if (index > -1) { - /* A MultiBrowser will trigger a callback for each item that is - * selected and each item that is deselected, but a "plain" - * Browser will only trigger the callback for the newly selected item - * (for which selected() is false, incidentally). - */ FltkListResource *res = (FltkListResource *) data; - if (res->mode == SELECTION_MULTIPLE) { - bool selected = fltkItem->selected (); - res->itemsSelected.set (index, selected); + bool selected = fltkItem->is_selected (); + res->itemsSelected.set (index, selected); + } +} + +void *FltkListResource::newItem (const char *str, bool enabled, bool selected) +{ + Fl_Tree *tree = (Fl_Tree *) widget; + Fl_Tree_Item *parent = (Fl_Tree_Item *)currParent; + Fl_Tree_Item *item = tree->add(parent, str); + int index = itemsSelected.size(); + + enabled &= parent->is_active(); + item->activate(enabled); + item->user_data((void *)index); + itemsSelected.increase (); + itemsSelected.set (itemsSelected.size() - 1, selected); + + return item; +} + +void FltkListResource::addItem (const char *str, bool enabled, bool selected) +{ + Fl_Tree *tree = (Fl_Tree *) widget; + Fl_Tree_Item *item = (Fl_Tree_Item *) newItem(str, enabled, selected); + + if (selected) { + if (mode == SELECTION_MULTIPLE) { + item->select(selected); } else { - int size = res->itemsSelected.size(); - for (int i = 0; i < size; i++) - res->itemsSelected.set (i, false); - res->itemsSelected.set (index, true); + const bool do_callback = true; + tree->select_only(item, do_callback); } } + queueResize (true); } -void FltkListResource::addItem (const char *str, bool enabled, bool selected) +void FltkListResource::pushGroup (const char *name, bool enabled) { - FltkSelectionResource<dw::core::ui::ListResource>::addItem - (str,enabled,selected); - int index = itemsSelected.size (); - itemsSelected.increase (); - itemsSelected.set (index,selected); + bool selected = false; + + /* TODO: make it impossible to select a group */ + currParent = (Fl_Tree_Item *) newItem(name, enabled, selected); queueResize (true); } +void FltkListResource::popGroup () +{ + Fl_Tree_Item *p = (Fl_Tree_Item *)currParent; + + if (p->parent()) + currParent = p->parent(); +} + +int FltkListResource::getMaxItemWidth() +{ + Fl_Tree *tree = (Fl_Tree *)widget; + int max = 0; + + for (Fl_Tree_Item *i = tree->first(); i; i = tree->next(i)) { + int width = 0; + + if (i == tree->root()) + continue; + + for (Fl_Tree_Item *p = i->parent(); p != tree->root(); p = p->parent()) + width += tree->connectorwidth(); + + if (i->label()) + width += fl_width(i->label()); + + if (width > max) + max = width; + } + return max; +} + void FltkListResource::sizeRequest (core::Requisition *requisition) { if (style) { FltkFont *font = (FltkFont*)style->font; - ::fltk::setfont(font->font,font->size); + fl_font(font->font,font->size); int rows = getNumberOfItems(); if (showRows < rows) { rows = showRows; } - /* - * The widget sometimes shows scrollbars when they are not required. - * The following values try to keep any scrollbars from obscuring - * options, at the cost of showing too much whitespace at times. - */ - requisition->width = getMaxStringWidth() + 24; - requisition->ascent = font->ascent + 2 + + requisition->width = getMaxItemWidth() + 5 + Fl::scrollbar_size();; + requisition->ascent = font->ascent + 5 + (rows - 1) * (font->ascent + font->descent + 1); requisition->descent = font->descent + 3; } else { diff --git a/dw/fltkui.hh b/dw/fltkui.hh index 245d5aad..daddfb78 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -5,11 +5,9 @@ # error Do not include this file directly, use "fltkcore.hh" instead. #endif -#include <fltk/Button.h> -#include <fltk/Menu.h> -#include <fltk/TextBuffer.h> -#include <fltk/Item.h> -#include <fltk/ItemGroup.h> +#include <FL/Fl_Button.H> +#include <FL/Fl_Menu.H> +#include <FL/Fl_Text_Buffer.H> namespace dw { namespace fltk { @@ -179,7 +177,7 @@ private: protected: FltkView *view; - ::fltk::Widget *widget; + Fl_Widget *widget; core::Allocation allocation; FltkPlatform *platform; @@ -187,9 +185,9 @@ protected: FltkResource (FltkPlatform *platform); void init (FltkPlatform *platform); - virtual ::fltk::Widget *createNewWidget (core::Allocation *allocation) = 0; + virtual Fl_Widget *createNewWidget (core::Allocation *allocation) = 0; - void setWidgetStyle (::fltk::Widget *widget, core::style::Style *style); + virtual void setWidgetStyle (Fl_Widget *widget, core::style::Style *style); void setDisplayed (bool displayed); bool displayed(); public: @@ -229,10 +227,10 @@ class FltkLabelButtonResource: private: const char *label; - static void widgetCallback (::fltk::Widget *widget, void *data); + static void widgetCallback (Fl_Widget *widget, void *data); protected: - ::fltk::Widget *createNewWidget (core::Allocation *allocation); + Fl_Widget *createNewWidget (core::Allocation *allocation); public: FltkLabelButtonResource (FltkPlatform *platform, const char *label); @@ -251,7 +249,7 @@ class FltkComplexButtonResource: private: bool relief; - static void widgetCallback (::fltk::Widget *widget, void *data); + static void widgetCallback (Fl_Widget *widget, void *data); protected: FltkView *topView, *flatView; @@ -267,7 +265,7 @@ protected: int reliefXThickness (); int reliefYThickness (); - ::fltk::Widget *createNewWidget (core::Allocation *allocation); + Fl_Widget *createNewWidget (core::Allocation *allocation); public: FltkComplexButtonResource (FltkPlatform *platform, dw::core::Widget *widget, @@ -290,11 +288,12 @@ private: char *label; bool editable; - static void widgetCallback (::fltk::Widget *widget, void *data); + static void widgetCallback (Fl_Widget *widget, void *data); void setDisplayed (bool displayed); protected: - ::fltk::Widget *createNewWidget (core::Allocation *allocation); + Fl_Widget *createNewWidget (core::Allocation *allocation); + void setWidgetStyle (Fl_Widget *widget, core::style::Style *style); public: FltkEntryResource (FltkPlatform *platform, int maxLength, bool password, @@ -314,12 +313,13 @@ class FltkMultiLineTextResource: public FltkSpecificResource <dw::core::ui::MultiLineTextResource> { private: - ::fltk::TextBuffer *buffer; + Fl_Text_Buffer *buffer; bool editable; int numCols, numRows; protected: - ::fltk::Widget *createNewWidget (core::Allocation *allocation); + Fl_Widget *createNewWidget (core::Allocation *allocation); + void setWidgetStyle (Fl_Widget *widget, core::style::Style *style); public: FltkMultiLineTextResource (FltkPlatform *platform, int cols, int rows); @@ -341,8 +341,9 @@ private: bool initActivated; protected: - virtual ::fltk::Button *createNewButton (core::Allocation *allocation) = 0; - ::fltk::Widget *createNewWidget (core::Allocation *allocation); + virtual Fl_Button *createNewButton (core::Allocation *allocation) = 0; + Fl_Widget *createNewWidget (core::Allocation *allocation); + void setWidgetStyle (Fl_Widget *widget, core::style::Style *style); public: FltkToggleButtonResource (FltkPlatform *platform, @@ -360,7 +361,7 @@ class FltkCheckButtonResource: public FltkToggleButtonResource <dw::core::ui::CheckButtonResource> { protected: - ::fltk::Button *createNewButton (core::Allocation *allocation); + Fl_Button *createNewButton (core::Allocation *allocation); public: FltkCheckButtonResource (FltkPlatform *platform, @@ -401,7 +402,8 @@ private: public: Group (FltkRadioButtonResource *radioButtonResource); - inline lout::container::typed::Iterator <FltkRadioButtonResource> iterator () + inline lout::container::typed::Iterator <FltkRadioButtonResource> + iterator () { return list->iterator (); } @@ -418,11 +420,11 @@ private: Group *group; - static void widgetCallback (::fltk::Widget *widget, void *data); + static void widgetCallback (Fl_Widget *widget, void *data); void buttonClicked (); protected: - ::fltk::Button *createNewButton (core::Allocation *allocation); + Fl_Button *createNewButton (core::Allocation *allocation); public: FltkRadioButtonResource (FltkPlatform *platform, @@ -438,60 +440,14 @@ template <class I> class FltkSelectionResource: public FltkSpecificResource <I> { protected: - class Item: public lout::object::Object - { - public: - enum Type { ITEM, START, END } type; - - const char *name; - bool enabled, initSelected; - - Item (Type type, const char *name = NULL, bool enabled = true, - bool selected = false); - ~Item (); - - ::fltk::Item *createNewWidget (int index); - ::fltk::ItemGroup *createNewGroupWidget (); - }; - - class WidgetStack: public lout::object::Object - { - public: - ::fltk::Menu *widget; - lout::container::typed::Stack <lout::object::TypedPointer < ::fltk::Menu> > *stack; - - WidgetStack (::fltk::Menu *widget); - ~WidgetStack (); - }; - - lout::container::typed::List <WidgetStack> *widgetStacks; - lout::container::typed::List <Item> *allItems; - lout::container::typed::Vector <Item> *items; - - Item *createNewItem (typename Item::Type type, - const char *name = NULL, - bool enabled = true, - bool selected = false); - - ::fltk::Widget *createNewWidget (core::Allocation *allocation); - virtual ::fltk::Menu *createNewMenu (core::Allocation *allocation) = 0; virtual bool setSelectedItems() { return false; } - - int getMaxStringWidth (); - + virtual void addItem (const char *str, bool enabled, bool selected) = 0; + virtual void pushGroup (const char *name, bool enabled) = 0; + virtual void popGroup () = 0; public: - FltkSelectionResource (FltkPlatform *platform); - ~FltkSelectionResource (); - + FltkSelectionResource (FltkPlatform *platform) : + FltkSpecificResource<I> (platform) {}; dw::core::Iterator *iterator (dw::core::Content::Type mask, bool atEnd); - - void addItem (const char *str, bool enabled, bool selected); - - void pushGroup (const char *name, bool enabled); - void popGroup (); - - int getNumberOfItems (); - const char *getItem (int index); }; @@ -499,18 +455,25 @@ class FltkOptionMenuResource: public FltkSelectionResource <dw::core::ui::OptionMenuResource> { protected: - ::fltk::Menu *createNewMenu (core::Allocation *allocation); + Fl_Widget *createNewWidget (core::Allocation *allocation); virtual bool setSelectedItems() { return true; } - + void setWidgetStyle (Fl_Widget *widget, core::style::Style *style); + int getNumberOfItems(); + int getMaxItemWidth (); private: - static void widgetCallback (::fltk::Widget *widget, void *data); - int selection; - + static void widgetCallback (Fl_Widget *widget, void *data); + void enlargeMenu(); + Fl_Menu_Item *newItem(); + Fl_Menu_Item *menu; + int itemsAllocated, itemsUsed; + int visibleItems; /* not counting the invisible ones that close a group */ public: FltkOptionMenuResource (FltkPlatform *platform); ~FltkOptionMenuResource (); void addItem (const char *str, bool enabled, bool selected); + void pushGroup (const char *name, bool enabled); + void popGroup (); void sizeRequest (core::Requisition *requisition); bool isSelected (int index); @@ -520,10 +483,16 @@ class FltkListResource: public FltkSelectionResource <dw::core::ui::ListResource> { protected: - ::fltk::Menu *createNewMenu (core::Allocation *allocation); + Fl_Widget *createNewWidget (core::Allocation *allocation); + void setWidgetStyle (Fl_Widget *widget, core::style::Style *style); + + int getNumberOfItems () {return itemsSelected.size();}; + int getMaxItemWidth (); private: - static void widgetCallback (::fltk::Widget *widget, void *data); + static void widgetCallback (Fl_Widget *widget, void *data); + void *newItem (const char *str, bool enabled, bool selected); + void *currParent; lout::misc::SimpleVector <bool> itemsSelected; int showRows; ListResource::SelectionMode mode; @@ -534,6 +503,8 @@ public: ~FltkListResource (); void addItem (const char *str, bool enabled, bool selected); + void pushGroup (const char *name, bool enabled); + void popGroup (); void sizeRequest (core::Requisition *requisition); bool isSelected (int index); diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc index 06e0cbc8..22fb06ef 100644 --- a/dw/fltkviewbase.cc +++ b/dw/fltkviewbase.cc @@ -21,40 +21,65 @@ #include "fltkviewport.hh" -#include <fltk/draw.h> -#include <fltk/damage.h> -#include <fltk/layout.h> -#include <fltk/events.h> -#include <fltk/Cursor.h> -#include <fltk/run.h> -#include <fltk/utf.h> +#include <FL/Fl.H> +#include <FL/fl_draw.H> #include <stdio.h> #include <wchar.h> #include <wctype.h> #include "../lout/msg.h" -using namespace fltk; +extern Fl_Widget* fl_oldfocus; + using namespace lout::object; using namespace lout::container::typed; namespace dw { namespace fltk { -::fltk::Image *FltkViewBase::backBuffer; +FltkViewBase::BackBuffer::BackBuffer () +{ + w = 0; + h = 0; + created = false; +} + +FltkViewBase::BackBuffer::~BackBuffer () +{ + if (created) + fl_delete_offscreen (offscreen); +} + +void FltkViewBase::BackBuffer::setSize (int w, int h) +{ + if (!created || w > this->w || h > this->h) { + this->w = w; + this->h = h; + if (created) + fl_delete_offscreen (offscreen); + offscreen = fl_create_offscreen (w, h); + created = true; + } +} + +FltkViewBase::BackBuffer *FltkViewBase::backBuffer; bool FltkViewBase::backBufferInUse; FltkViewBase::FltkViewBase (int x, int y, int w, int h, const char *label): - Group (x, y, w, h, label) + Fl_Group (x, y, w, h, label) { + Fl_Group::current(0); canvasWidth = 1; canvasHeight = 1; - bgColor = WHITE; + bgColor = FL_WHITE; mouse_x = mouse_y = 0; + focused_child = NULL; exposeArea = NULL; if (backBuffer == NULL) { - backBuffer = new Image (); + backBuffer = new BackBuffer (); } + box(FL_NO_BOX); + resizable(NULL); } FltkViewBase::~FltkViewBase () @@ -64,7 +89,7 @@ FltkViewBase::~FltkViewBase () void FltkViewBase::setBufferedDrawing (bool b) { if (b && backBuffer == NULL) { - backBuffer = new Image (); + backBuffer = new BackBuffer (); } else if (!b && backBuffer != NULL) { delete backBuffer; backBuffer = NULL; @@ -75,7 +100,7 @@ void FltkViewBase::draw () { int d = damage (); - if ((d & DAMAGE_VALUE) && !(d & DAMAGE_EXPOSE)) { + if ((d & FL_DAMAGE_USER1) && !(d & FL_DAMAGE_EXPOSE)) { lout::container::typed::Iterator <core::Rectangle> it; for (it = drawRegion.rectangles (); it.hasNext (); ) { @@ -83,22 +108,22 @@ void FltkViewBase::draw () } drawRegion.clear (); - d &= ~DAMAGE_VALUE; + d &= ~FL_DAMAGE_USER1; } - if (d & DAMAGE_CHILD) { + if (d & FL_DAMAGE_CHILD) { drawChildWidgets (); - d &= ~DAMAGE_CHILD; + d &= ~FL_DAMAGE_CHILD; } if (d) { dw::core::Rectangle rect ( - translateViewXToCanvasX (0), - translateViewYToCanvasY (0), + translateViewXToCanvasX (x ()), + translateViewYToCanvasY (y ()), w (), h ()); - if (d == DAMAGE_SCROLL) { + if (d == FL_DAMAGE_SCROLL) { // a clipping rectangle has already been set by fltk::scrollrect () draw (&rect, DRAW_PLAIN); } else { @@ -111,88 +136,81 @@ void FltkViewBase::draw () void FltkViewBase::draw (const core::Rectangle *rect, DrawType type) { - int offsetX = 0, offsetY = 0; - - /* fltk-clipping does not use widget coordinates */ - transform (offsetX, offsetY); - - ::fltk::Rectangle viewRect ( - translateCanvasXToViewX (rect->x) + offsetX, - translateCanvasYToViewY (rect->y) + offsetY, - rect->width, rect->height); - - ::fltk::intersect_with_clip (viewRect); - - viewRect.x (viewRect.x () - offsetX); - viewRect.y (viewRect.y () - offsetY); - - if (! viewRect.empty ()) { - dw::core::Rectangle r ( - translateViewXToCanvasX (viewRect.x ()), - translateViewYToCanvasY (viewRect.y ()), - viewRect.w (), - viewRect.h ()); - - exposeArea = &viewRect; - - if (type == DRAW_BUFFERED && backBuffer && !backBufferInUse) { - backBufferInUse = true; - { - GSave gsave; - - backBuffer->setsize (viewRect.w (), viewRect.h ()); - backBuffer->make_current (); - translate (-viewRect.x (), -viewRect.y ()); - - setcolor (bgColor); - fillrect (viewRect); - theLayout->expose (this, &r); - } - - backBuffer->draw (Rectangle (0, 0, viewRect.w (), viewRect.h ()), - viewRect); - - backBufferInUse = false; - } else if (type == DRAW_BUFFERED || type == DRAW_CLIPPED) { - // if type == DRAW_BUFFERED but we do not have backBuffer available - // we fall back to clipped drawing - push_clip (viewRect); - setcolor (bgColor); - fillrect (viewRect); - theLayout->expose (this, &r); - pop_clip (); - } else { - setcolor (bgColor); - fillrect (viewRect); - theLayout->expose (this, &r); - } - - exposeArea = NULL; + int X = translateCanvasXToViewX (rect->x); + int Y = translateCanvasYToViewY (rect->y); + int W, H; + + // fl_clip_box() can't handle values greater than SHRT_MAX! + if (X > x () + w () || Y > y () + h ()) + return; + + W = X + rect->width > x () + w () ? x () + w () - X : rect->width; + H = Y + rect->height > y () + h () ? y () + h () - Y : rect->height; + + fl_clip_box(X, Y, W, H, X, Y, W, H); + + core::Rectangle r (translateViewXToCanvasX (X), + translateViewYToCanvasY (Y), W, H); + + if (r.isEmpty ()) + return; + + exposeArea = &r; + + if (type == DRAW_BUFFERED && backBuffer && !backBufferInUse) { + backBufferInUse = true; + backBuffer->setSize (X + W, Y + H); // would be nicer to use (W, H)... + fl_begin_offscreen (backBuffer->offscreen); + fl_push_matrix (); + fl_color (bgColor); + fl_rectf (X, Y, W, H); + theLayout->expose (this, &r); + fl_pop_matrix (); + fl_end_offscreen (); + fl_copy_offscreen (X, Y, W, H, backBuffer->offscreen, X, Y); + backBufferInUse = false; + } else if (type == DRAW_BUFFERED || type == DRAW_CLIPPED) { + // if type == DRAW_BUFFERED but we do not have backBuffer available + // we fall back to clipped drawing + fl_push_clip (X, Y, W, H); + fl_color (bgColor); + fl_rectf (X, Y, W, H); + theLayout->expose (this, &r); + fl_pop_clip (); + } else { + fl_color (bgColor); + fl_rectf (X, Y, W, H); + theLayout->expose (this, &r); } + + exposeArea = NULL; } void FltkViewBase::drawChildWidgets () { for (int i = children () - 1; i >= 0; i--) { - Widget& w = *child(i); + Fl_Widget& w = *child(i); +#if 0 +PORT1.3 if (w.damage() & DAMAGE_CHILD_LABEL) { draw_outside_label(w); w.set_damage(w.damage() & ~DAMAGE_CHILD_LABEL); } +#endif update_child(w); } } core::ButtonState getDwButtonState () { - int s1 = event_state (); + int s1 = Fl::event_state (); int s2 = (core::ButtonState)0; - if (s1 & SHIFT) s2 |= core::SHIFT_MASK; - if (s1 & CTRL) s2 |= core::CONTROL_MASK; - if (s1 & ALT) s2 |= core::META_MASK; - if (s1 & BUTTON1) s2 |= core::BUTTON1_MASK; - if (s1 & BUTTON2) s2 |= core::BUTTON2_MASK; - if (s1 & BUTTON3) s2 |= core::BUTTON3_MASK; + if (s1 & FL_SHIFT) s2 |= core::SHIFT_MASK; + if (s1 & FL_CTRL) s2 |= core::CONTROL_MASK; + if (s1 & FL_ALT) s2 |= core::META_MASK; + if (s1 & FL_BUTTON1) s2 |= core::BUTTON1_MASK; + if (s1 & FL_BUTTON2) s2 |= core::BUTTON2_MASK; + if (s1 & FL_BUTTON3) s2 |= core::BUTTON3_MASK; return (core::ButtonState)s2; } @@ -207,60 +225,72 @@ int FltkViewBase::handle (int event) * when passed a fltk::PUSH event. " */ switch(event) { - case PUSH: + case FL_PUSH: processed = - theLayout->buttonPress (this, event_clicks () + 1, - translateViewXToCanvasX (event_x ()), - translateViewYToCanvasY (event_y ()), - getDwButtonState (), event_button ()); + theLayout->buttonPress (this, Fl::event_clicks () + 1, + translateViewXToCanvasX (Fl::event_x ()), + translateViewYToCanvasY (Fl::event_y ()), + getDwButtonState (), Fl::event_button ()); _MSG("PUSH => %s\n", processed ? "true" : "false"); if (processed) { /* pressed dw content; give focus to the view */ - ::fltk::focus(this); + Fl::focus(this); } - return processed ? true : Group::handle (event); + return processed ? true : Fl_Group::handle (event); - case RELEASE: + case FL_RELEASE: processed = - theLayout->buttonRelease (this, event_clicks () + 1, - translateViewXToCanvasX (event_x ()), - translateViewYToCanvasY (event_y ()), - getDwButtonState (), event_button ()); + theLayout->buttonRelease (this, Fl::event_clicks () + 1, + translateViewXToCanvasX (Fl::event_x ()), + translateViewYToCanvasY (Fl::event_y ()), + getDwButtonState (), Fl::event_button ()); _MSG("RELEASE => %s\n", processed ? "true" : "false"); - return processed ? true : Group::handle (event); + return processed ? true : Fl_Group::handle (event); - case MOVE: - mouse_x = event_x(); - mouse_y = event_y(); + case FL_MOVE: + mouse_x = Fl::event_x(); + mouse_y = Fl::event_y(); processed = theLayout->motionNotify (this, translateViewXToCanvasX (mouse_x), translateViewYToCanvasY (mouse_y), getDwButtonState ()); _MSG("MOVE => %s\n", processed ? "true" : "false"); - return processed ? true : Group::handle (event); + return processed ? true : Fl_Group::handle (event); - case DRAG: + case FL_DRAG: processed = theLayout->motionNotify (this, - translateViewXToCanvasX (event_x ()), - translateViewYToCanvasY (event_y ()), + translateViewXToCanvasX (Fl::event_x ()), + translateViewYToCanvasY (Fl::event_y ()), getDwButtonState ()); _MSG("DRAG => %s\n", processed ? "true" : "false"); - return processed ? true : Group::handle (event); + return processed ? true : Fl_Group::handle (event); - case ENTER: - theLayout->enterNotify (this, translateViewXToCanvasX (event_x ()), - translateViewYToCanvasY (event_y ()), + case FL_ENTER: + theLayout->enterNotify (this, + translateViewXToCanvasX (Fl::event_x ()), + translateViewYToCanvasY (Fl::event_y ()), getDwButtonState ()); - return Group::handle (event); + return Fl_Group::handle (event); - case LEAVE: + case FL_LEAVE: theLayout->leaveNotify (this, getDwButtonState ()); - return Group::handle (event); + return Fl_Group::handle (event); + + case FL_FOCUS: + if (focused_child && find(focused_child) < children()) { + /* strangely, find() == children() if the child is not found */ + focused_child->take_focus(); + } + return 1; + + case FL_UNFOCUS: + focused_child = fl_oldfocus; + return 0; default: - return Group::handle (event); + return Fl_Group::handle (event); } } @@ -269,6 +299,8 @@ int FltkViewBase::handle (int event) void FltkViewBase::setLayout (core::Layout *layout) { theLayout = layout; + if (usesViewport()) + theLayout->viewportSizeChanged(this, w(), h()); } void FltkViewBase::setCanvasSize (int width, int ascent, int descent) @@ -279,55 +311,32 @@ void FltkViewBase::setCanvasSize (int width, int ascent, int descent) void FltkViewBase::setCursor (core::style::Cursor cursor) { - static Cursor *mapDwToFltk[] = { - CURSOR_CROSS, - CURSOR_DEFAULT, - CURSOR_HAND, - CURSOR_MOVE, - CURSOR_WE, - CURSOR_NESW, - CURSOR_NWSE, - CURSOR_NS, - CURSOR_NWSE, - CURSOR_NESW, - CURSOR_NS, - CURSOR_WE, - CURSOR_INSERT, - CURSOR_WAIT, - CURSOR_HELP - }; - - /* - static char *cursorName[] = { - "CURSOR_CROSS", - "CURSOR_DEFAULT", - "CURSOR_HAND", - "CURSOR_MOVE", - "CURSOR_WE", - "CURSOR_NESW", - "CURSOR_NWSE", - "CURSOR_NS", - "CURSOR_NWSE", - "CURSOR_NESW", - "CURSOR_NS", - "CURSOR_WE", - "CURSOR_INSERT", - "CURSOR_WAIT", - "CURSOR_HELP" + static Fl_Cursor mapDwToFltk[] = { + FL_CURSOR_CROSS, + FL_CURSOR_DEFAULT, + FL_CURSOR_HAND, + FL_CURSOR_MOVE, + FL_CURSOR_WE, + FL_CURSOR_NESW, + FL_CURSOR_NWSE, + FL_CURSOR_NS, + FL_CURSOR_NWSE, + FL_CURSOR_NESW, + FL_CURSOR_NS, + FL_CURSOR_WE, + FL_CURSOR_INSERT, + FL_CURSOR_WAIT, + FL_CURSOR_HELP }; - MSG("Cursor changes to '%s'.\n", cursorName[cursor]); - */ - - /** \bug Does not work */ - this->cursor (mapDwToFltk[cursor]); + fl_cursor (mapDwToFltk[cursor]); } void FltkViewBase::setBgColor (core::style::Color *color) { bgColor = color ? ((FltkColor*)color)->colors[dw::core::style::Color::SHADING_NORMAL] : - WHITE; + FL_WHITE; } void FltkViewBase::startDrawing (core::Rectangle *area) @@ -342,12 +351,12 @@ void FltkViewBase::queueDraw (core::Rectangle *area) { drawRegion.addRectangle (area); /** DAMAGE_VALUE is just an arbitrary value other than DAMAGE_EXPOSE here */ - redraw (DAMAGE_VALUE); + damage (FL_DAMAGE_USER1); } void FltkViewBase::queueDrawTotal () { - redraw (DAMAGE_EXPOSE); + damage (FL_DAMAGE_EXPOSE); } void FltkViewBase::cancelQueueDraw () @@ -364,9 +373,16 @@ void FltkViewBase::drawLine (core::style::Color *color, core::style::Color::Shading shading, int x1, int y1, int x2, int y2) { - setcolor(((FltkColor*)color)->colors[shading]); - drawline (translateCanvasXToViewX (x1), translateCanvasYToViewY (y1), - translateCanvasXToViewX (x2), translateCanvasYToViewY (y2)); + fl_color(((FltkColor*)color)->colors[shading]); + // we clip with a large border (5000px), as clipping causes artefacts + // with non-solid line styles. + // However it's still better than no clipping at all. + clipPoint (&x1, &y1, 5000); + clipPoint (&x2, &y2, 5000); + fl_line (translateCanvasXToViewX (x1), + translateCanvasYToViewY (y1), + translateCanvasXToViewX (x2), + translateCanvasYToViewY (y2)); } void FltkViewBase::drawTypedLine (core::style::Color *color, @@ -385,42 +401,42 @@ void FltkViewBase::drawTypedLine (core::style::Color *color, d = len % f*width; gap = ng ? d/ng + (w > 3 ? 2 : 0) : 0; dashes[0] = 1; dashes[1] = f*width-gap; dashes[2] = 0; - line_style(::fltk::DASH + ::fltk::CAP_ROUND, w, dashes); + fl_line_style(FL_DASH + FL_CAP_ROUND, w, dashes); /* These formulas also work, but ain't pretty ;) - * line_style(::fltk::DOT + ::fltk::CAP_ROUND, w); + * fl_line_style(FL_DOT + FL_CAP_ROUND, w); * dashes[0] = 1; dashes[1] = 3*width-2; dashes[2] = 0; */ } else if (type == core::style::LINE_DASHED) { - line_style(::fltk::DASH + ::fltk::CAP_ROUND, w); + fl_line_style(FL_DASH + FL_CAP_ROUND, w); } - setcolor(((FltkColor*)color)->colors[shading]); + fl_color(((FltkColor*)color)->colors[shading]); drawLine (color, shading, x1, y1, x2, y2); if (type != core::style::LINE_NORMAL) - line_style(::fltk::SOLID); + fl_line_style(FL_SOLID); } void FltkViewBase::drawRectangle (core::style::Color *color, core::style::Color::Shading shading, bool filled, - int x, int y, int width, int height) + int X, int Y, int width, int height) { - setcolor(((FltkColor*)color)->colors[shading]); + fl_color(((FltkColor*)color)->colors[shading]); if (width < 0) { - x += width; + X += width; width = -width; } if (height < 0) { - y += height; + Y += height; height = -height; } - int x1 = translateCanvasXToViewX (x); - int y1 = translateCanvasYToViewY (y); - int x2 = translateCanvasXToViewX (x + width); - int y2 = translateCanvasYToViewY (y + height); + int x1 = X; + int y1 = Y; + int x2 = X + width; + int y2 = Y + height; // We only support rectangles with line width 1px, so we clip with // a rectangle 1px wider and higher than what we actually expose. @@ -428,11 +444,15 @@ void FltkViewBase::drawRectangle (core::style::Color *color, clipPoint (&x1, &y1, 1); clipPoint (&x2, &y2, 1); - ::fltk::Rectangle rect (x1, y1, x2 - x1, y2 - y1); + x1 = translateCanvasXToViewX (x1); + y1 = translateCanvasYToViewY (y1); + x2 = translateCanvasXToViewX (x2); + y2 = translateCanvasYToViewY (y2); + if (filled) - fillrect (rect); + fl_rectf (x1, y1, x2 - x1, y2 - y1); else - strokerect (rect); + fl_rect (x1, y1, x2 - x1, y2 - y1); } void FltkViewBase::drawArc (core::style::Color *color, @@ -440,47 +460,55 @@ void FltkViewBase::drawArc (core::style::Color *color, int centerX, int centerY, int width, int height, int angle1, int angle2) { - setcolor(((FltkColor*)color)->colors[shading]); + fl_color(((FltkColor*)color)->colors[shading]); int x = translateCanvasXToViewX (centerX) - width / 2; int y = translateCanvasYToViewY (centerY) - height / 2; - ::fltk::Rectangle rect (x, y, width, height); - addchord(rect, angle1, angle2); - closepath(); + + fl_arc(x, y, width, height, 0.0, 360.0); if (filled) - fillpath(); - else - strokepath(); + fl_pie(x, y, width, height, 0.0, 360.0); } void FltkViewBase::drawPolygon (core::style::Color *color, core::style::Color::Shading shading, - bool filled, int points[][2], int npoints) + bool filled, bool convex, int points[][2], + int npoints) { if (npoints > 0) { + fl_color(((FltkColor*)color)->colors[shading]); + + if (filled) { + if (convex) + fl_begin_polygon(); + else + fl_begin_complex_polygon(); + } else + fl_begin_loop(); + for (int i = 0; i < npoints; i++) { - points[i][0] = translateCanvasXToViewX(points[i][0]); - points[i][1] = translateCanvasYToViewY(points[i][1]); + fl_vertex(translateCanvasXToViewX(points[i][0]), + translateCanvasYToViewY(points[i][1])); } - setcolor(((FltkColor*)color)->colors[shading]); - addvertices(npoints, points); - closepath(); - if (filled) - fillpath(); - else - strokepath(); + if (filled) { + if (convex) + fl_end_polygon(); + else + fl_end_complex_polygon(); + } else + fl_end_loop(); } } core::View *FltkViewBase::getClippingView (int x, int y, int width, int height) { - push_clip (translateCanvasXToViewX (x), translateCanvasYToViewY (y), - width, height); + fl_push_clip (translateCanvasXToViewX (x), translateCanvasYToViewY (y), + width, height); return this; } void FltkViewBase::mergeClippingView (core::View *clippingView) { - pop_clip (); + fl_pop_clip (); } // ---------------------------------------------------------------------- @@ -495,37 +523,22 @@ FltkWidgetView::~FltkWidgetView () { } -void FltkWidgetView::layout () { - /** - * pass layout to child widgets. This is needed for complex fltk - * widgets as TextEditor. - * We can't use Group::layout() as that would rearrange the widgets. - */ - for (int i = children () - 1; i >= 0; i--) { - ::fltk::Widget *widget = child (i); - - if (widget->layout_damage ()) { - widget->layout (); - } - } -} - void FltkWidgetView::drawText (core::style::Font *font, core::style::Color *color, core::style::Color::Shading shading, - int x, int y, const char *text, int len) + int X, int Y, const char *text, int len) { FltkFont *ff = (FltkFont*)font; - setfont(ff->font, ff->size); - setcolor(((FltkColor*)color)->colors[shading]); + fl_font(ff->font, ff->size); + fl_color(((FltkColor*)color)->colors[shading]); if (!font->letterSpacing && !font->fontVariant) { - drawtext(text, len, - translateCanvasXToViewX (x), translateCanvasYToViewY (y)); + fl_draw(text, len, + translateCanvasXToViewX (X), translateCanvasYToViewY (Y)); } else { /* Nonzero letter spacing adjustment, draw each glyph individually */ - int viewX = translateCanvasXToViewX (x), - viewY = translateCanvasYToViewY (y); + int viewX = translateCanvasXToViewX (X), + viewY = translateCanvasYToViewY (Y); int curr = 0, next = 0, nb; char chbuf[4]; wchar_t wc, wcu; @@ -534,28 +547,28 @@ void FltkWidgetView::drawText (core::style::Font *font, int sc_fontsize = lout::misc::roundInt(ff->size * 0.78); for (curr = 0; next < len; curr = next) { next = theLayout->nextGlyph(text, curr); - wc = utf8decode(text + curr, text + next, &nb); + wc = fl_utf8decode(text + curr, text + next, &nb); if ((wcu = towupper(wc)) == wc) { /* already uppercase, just draw the character */ - setfont(ff->font, ff->size); - drawtext(text + curr, next - curr, viewX, viewY); + fl_font(ff->font, ff->size); + fl_draw(text + curr, next - curr, viewX, viewY); viewX += font->letterSpacing; - viewX += (int)getwidth(text + curr, next - curr); + viewX += (int)fl_width(text + curr, next - curr); } else { /* make utf8 string for converted char */ - nb = utf8encode(wcu, chbuf); - setfont(ff->font, sc_fontsize); - drawtext(chbuf, nb, viewX, viewY); + nb = fl_utf8encode(wcu, chbuf); + fl_font(ff->font, sc_fontsize); + fl_draw(chbuf, nb, viewX, viewY); viewX += font->letterSpacing; - viewX += (int)getwidth(chbuf, nb); + viewX += (int)fl_width(chbuf, nb); } } } else { while (next < len) { next = theLayout->nextGlyph(text, curr); - drawtext(text + curr, next - curr, viewX, viewY); + fl_draw(text + curr, next - curr, viewX, viewY); viewX += font->letterSpacing + - (int)getwidth(text + curr,next - curr); + (int)fl_width(text + curr,next - curr); curr = next; } } @@ -563,12 +576,12 @@ void FltkWidgetView::drawText (core::style::Font *font, } void FltkWidgetView::drawImage (core::Imgbuf *imgbuf, int xRoot, int yRoot, - int x, int y, int width, int height) + int X, int Y, int width, int height) { ((FltkImgbuf*)imgbuf)->draw (this, translateCanvasXToViewX (xRoot), translateCanvasYToViewY (yRoot), - x, y, width, height); + X, Y, width, height); } bool FltkWidgetView::usesFltkWidgets () @@ -576,33 +589,28 @@ bool FltkWidgetView::usesFltkWidgets () return true; } -void FltkWidgetView::addFltkWidget (::fltk::Widget *widget, - core::Allocation *allocation) +void FltkWidgetView::addFltkWidget (Fl_Widget *widget, + core::Allocation *allocation) { allocateFltkWidget (widget, allocation); add (widget); } -void FltkWidgetView::removeFltkWidget (::fltk::Widget *widget) +void FltkWidgetView::removeFltkWidget (Fl_Widget *widget) { remove (widget); } -void FltkWidgetView::allocateFltkWidget (::fltk::Widget *widget, +void FltkWidgetView::allocateFltkWidget (Fl_Widget *widget, core::Allocation *allocation) { - widget->x (translateCanvasXToViewX (allocation->x)); - widget->y (translateCanvasYToViewY (allocation->y)); - widget->w (allocation->width); - widget->h (allocation->ascent + allocation->descent); - - /* widgets created tiny and later resized need this flag to display */ - uchar damage = widget->layout_damage (); - damage |= LAYOUT_XYWH; - widget->layout_damage (damage); + widget->resize (translateCanvasXToViewX (allocation->x), + translateCanvasYToViewY (allocation->y), + allocation->width, + allocation->ascent + allocation->descent); } -void FltkWidgetView::drawFltkWidget (::fltk::Widget *widget, +void FltkWidgetView::drawFltkWidget (Fl_Widget *widget, core::Rectangle *area) { draw_child (*widget); diff --git a/dw/fltkviewbase.hh b/dw/fltkviewbase.hh index b5c3ab5e..03cf26d8 100644 --- a/dw/fltkviewbase.hh +++ b/dw/fltkviewbase.hh @@ -4,45 +4,58 @@ #include <time.h> // for time_t #include <sys/time.h> // for time_t in FreeBSD -#include <fltk/Group.h> -#include <fltk/Image.h> -#include <fltk/Scrollbar.h> +#include <FL/Fl_Group.H> +#include <FL/x.H> #include "fltkcore.hh" namespace dw { namespace fltk { -class FltkViewBase: public FltkView, public ::fltk::Group +class FltkViewBase: public FltkView, public Fl_Group { private: + class BackBuffer { + private: + int w; + int h; + bool created; + + public: + Fl_Offscreen offscreen; + + BackBuffer (); + ~BackBuffer (); + void setSize(int w, int h); + }; + typedef enum { DRAW_PLAIN, DRAW_CLIPPED, DRAW_BUFFERED } DrawType; int bgColor; core::Region drawRegion; - ::fltk::Rectangle *exposeArea; - static ::fltk::Image *backBuffer; + core::Rectangle *exposeArea; + static BackBuffer *backBuffer; static bool backBufferInUse; void draw (const core::Rectangle *rect, DrawType type); void drawChildWidgets (); inline void clipPoint (int *x, int *y, int border) { if (exposeArea) { - if (*x < exposeArea->x () - border) - *x = exposeArea->x () - border; - if (*x > exposeArea->r () + border) - *x = exposeArea->r () + border; - if (*y < exposeArea->y () - border) - *y = exposeArea->y () - border; - if (*y > exposeArea->b () + border) - *y = exposeArea->b () + border; + if (*x < exposeArea->x - border) + *x = exposeArea->x - border; + if (*x > exposeArea->x + exposeArea->width + border) + *x = exposeArea->x + exposeArea->width + border; + if (*y < exposeArea->y - border) + *y = exposeArea->y - border; + if (*y > exposeArea->y + exposeArea->height + border) + *y = exposeArea->y + exposeArea->height + border; } } - protected: core::Layout *theLayout; int canvasWidth, canvasHeight; int mouse_x, mouse_y; + Fl_Widget *focused_child; virtual int translateViewXToCanvasX (int x) = 0; virtual int translateViewYToCanvasY (int y) = 0; @@ -85,7 +98,7 @@ public: int angle1, int angle2); void drawPolygon (core::style::Color *color, core::style::Color::Shading shading, - bool filled, int points[][2], int npoints); + bool filled, bool convex, int points[][2], int npoints); core::View *getClippingView (int x, int y, int width, int height); void mergeClippingView (core::View *clippingView); @@ -99,8 +112,6 @@ public: FltkWidgetView (int x, int y, int w, int h, const char *label = 0); ~FltkWidgetView (); - void layout(); - void drawText (core::style::Font *font, core::style::Color *color, core::style::Color::Shading shading, @@ -109,11 +120,11 @@ public: int x, int y, int width, int height); bool usesFltkWidgets (); - void addFltkWidget (::fltk::Widget *widget, core::Allocation *allocation); - void removeFltkWidget (::fltk::Widget *widget); - void allocateFltkWidget (::fltk::Widget *widget, + void addFltkWidget (Fl_Widget *widget, core::Allocation *allocation); + void removeFltkWidget (Fl_Widget *widget); + void allocateFltkWidget (Fl_Widget *widget, core::Allocation *allocation); - void drawFltkWidget (::fltk::Widget *widget, core::Rectangle *area); + void drawFltkWidget (Fl_Widget *widget, core::Rectangle *area); }; } // namespace fltk diff --git a/dw/fltkviewport.cc b/dw/fltkviewport.cc index a8555c60..64e2cb1a 100644 --- a/dw/fltkviewport.cc +++ b/dw/fltkviewport.cc @@ -21,14 +21,12 @@ #include "fltkviewport.hh" -#include <fltk/draw.h> -#include <fltk/damage.h> -#include <fltk/events.h> +#include <FL/Fl.H> +#include <FL/fl_draw.H> #include <stdio.h> #include "../lout/msg.h" -using namespace fltk; using namespace lout; using namespace lout::object; using namespace lout::container::typed; @@ -36,17 +34,34 @@ using namespace lout::container::typed; namespace dw { namespace fltk { -FltkViewport::FltkViewport (int x, int y, int w, int h, const char *label): - FltkWidgetView (x, y, w, h, label) +/* + * Lets SHIFT+{Left,Right} go to the parent + */ +class CustScrollbar : public Fl_Scrollbar +{ +public: + CustScrollbar(int x, int y, int w, int h) : Fl_Scrollbar(x,y,w,h) {}; + int handle(int e) { + if (e == FL_SHORTCUT && Fl::event_state() == FL_SHIFT && + (Fl::event_key() == FL_Left || Fl::event_key() == FL_Right)) + return 0; + return Fl_Scrollbar::handle(e); + } +}; + +FltkViewport::FltkViewport (int X, int Y, int W, int H, const char *label): + FltkWidgetView (X, Y, W, H, label) { - hscrollbar = new Scrollbar (0, 0, 1, 1); - hscrollbar->set_horizontal(); + hscrollbar = new CustScrollbar (x (), y (), 1, 1); + hscrollbar->type(FL_HORIZONTAL); hscrollbar->callback (hscrollbarCallback, this); + hscrollbar->hide(); add (hscrollbar); - vscrollbar = new Scrollbar (0, 0, 1, 1); - vscrollbar->set_vertical(); + vscrollbar = new Fl_Scrollbar (x (), y(), 1, 1); + vscrollbar->type(FL_VERTICAL); vscrollbar->callback (vscrollbarCallback, this); + vscrollbar->hide(); add (vscrollbar); scrollX = scrollY = scrollDX = scrollDY = 0; @@ -58,7 +73,7 @@ FltkViewport::FltkViewport (int x, int y, int w, int h, const char *label): gadgetOrientation[3] = GADGET_HORIZONTAL; gadgets = - new container::typed::List <object::TypedPointer < ::fltk::Widget> > + new container::typed::List <object::TypedPointer < Fl_Widget> > (true); } @@ -72,6 +87,7 @@ void FltkViewport::adjustScrollbarsAndGadgetsAllocation () int hdiff = 0, vdiff = 0; int visibility = 0; + _MSG(" >>FltkViewport::adjustScrollbarsAndGadgetsAllocation\n"); if (hscrollbar->visible ()) visibility |= 1; if (vscrollbar->visible ()) @@ -94,32 +110,25 @@ void FltkViewport::adjustScrollbarsAndGadgetsAllocation () vdiff = hscrollbar->visible () ? SCROLLBAR_THICKNESS : 0; } - hscrollbar->x (0); - hscrollbar->y (0 + h () - SCROLLBAR_THICKNESS); - hscrollbar->w (w () - hdiff); - hscrollbar->h (SCROLLBAR_THICKNESS); + hscrollbar->resize(x (), y () + h () - SCROLLBAR_THICKNESS, + w () - hdiff, SCROLLBAR_THICKNESS); + vscrollbar->resize(x () + w () - SCROLLBAR_THICKNESS, y (), + SCROLLBAR_THICKNESS, h () - vdiff); - vscrollbar->x (0 + w () - SCROLLBAR_THICKNESS); - vscrollbar->y (0); - vscrollbar->h (h () - vdiff); - vscrollbar->w (SCROLLBAR_THICKNESS); - - int x = w () - SCROLLBAR_THICKNESS, y = h () - SCROLLBAR_THICKNESS; - for (Iterator <TypedPointer < ::fltk::Widget> > it = gadgets->iterator (); + int X = x () + w () - SCROLLBAR_THICKNESS; + int Y = y () + h () - SCROLLBAR_THICKNESS; + for (Iterator <TypedPointer < Fl_Widget> > it = gadgets->iterator (); it.hasNext (); ) { - ::fltk::Widget *widget = it.getNext()->getTypedValue (); - widget->x (0); - widget->y (0); - widget->w (SCROLLBAR_THICKNESS); - widget->h (SCROLLBAR_THICKNESS); + Fl_Widget *widget = it.getNext()->getTypedValue (); + widget->resize(x (), y (), SCROLLBAR_THICKNESS, SCROLLBAR_THICKNESS); switch (gadgetOrientation [visibility]) { case GADGET_VERTICAL: - y -= SCROLLBAR_THICKNESS; + Y -= SCROLLBAR_THICKNESS; break; case GADGET_HORIZONTAL: - x -= SCROLLBAR_THICKNESS; + X -= SCROLLBAR_THICKNESS; break; } } @@ -141,40 +150,43 @@ void FltkViewport::vscrollbarChanged () scroll (0, vscrollbar->value () - scrollY); } -void FltkViewport::vscrollbarCallback (Widget *vscrollbar, void *viewportPtr) +void FltkViewport::vscrollbarCallback (Fl_Widget *vscrollbar,void *viewportPtr) { ((FltkViewport*)viewportPtr)->vscrollbarChanged (); } -void FltkViewport::hscrollbarCallback (Widget *hscrollbar, void *viewportPtr) +void FltkViewport::hscrollbarCallback (Fl_Widget *hscrollbar,void *viewportPtr) { ((FltkViewport*)viewportPtr)->hscrollbarChanged (); } // ---------------------------------------------------------------------- -void FltkViewport::layout () +void FltkViewport::resize(int X, int Y, int W, int H) { - theLayout->viewportSizeChanged (this, w(), h()); - adjustScrollbarsAndGadgetsAllocation (); + bool dimension_changed = W != w() || H != h(); - FltkWidgetView::layout (); + Fl_Group::resize(X, Y, W, H); + if (dimension_changed) { + theLayout->viewportSizeChanged (this, W, H); + adjustScrollbarsAndGadgetsAllocation (); + } } -void FltkViewport::draw_area (void *data, const Rectangle& cr ) +void FltkViewport::draw_area (void *data, int x, int y, int w, int h) { FltkViewport *vp = (FltkViewport*) data; - push_clip(cr); + fl_push_clip(x, y, w, h); vp->FltkWidgetView::draw (); - for (Iterator <TypedPointer < ::fltk::Widget> > it = vp->gadgets->iterator(); + for (Iterator <TypedPointer < Fl_Widget> > it = vp->gadgets->iterator(); it.hasNext (); ) { - ::fltk::Widget *widget = it.getNext()->getTypedValue (); + Fl_Widget *widget = it.getNext()->getTypedValue (); vp->draw_child (*widget); } - pop_clip(); + fl_pop_clip(); } @@ -182,20 +194,19 @@ void FltkViewport::draw () { int hdiff = vscrollbar->visible () ? SCROLLBAR_THICKNESS : 0; int vdiff = hscrollbar->visible () ? SCROLLBAR_THICKNESS : 0; - Rectangle cr (0, 0, w () - hdiff, h () - vdiff); int d = damage(); - if (d & DAMAGE_SCROLL) { - set_damage (DAMAGE_SCROLL); - scrollrect(cr, -scrollDX, -scrollDY, draw_area, this); - d &= ~DAMAGE_SCROLL; - set_damage (d); + if (d & FL_DAMAGE_SCROLL) { + clear_damage (FL_DAMAGE_SCROLL); + fl_scroll(x(), y(), w() - hdiff, h() - vdiff, + -scrollDX, -scrollDY, draw_area, this); + clear_damage (d & ~FL_DAMAGE_SCROLL); } if (d) { - draw_area(this, cr); + draw_area(this, x(), y(), w () - hdiff, h () - vdiff); - if (d == DAMAGE_CHILD) { + if (d == FL_DAMAGE_CHILD) { if (hscrollbar->damage ()) draw_child (*hscrollbar); if (vscrollbar->damage ()) @@ -214,87 +225,70 @@ int FltkViewport::handle (int event) { _MSG("FltkViewport::handle %d\n", event); - if (hscrollbar->Rectangle::contains (event_x (), event_y ()) && - !(event_state() & (SHIFT | CTRL | ALT)) && - hscrollbar->send (event)) { - return 1; - } - - if (vscrollbar->Rectangle::contains (event_x (), event_y ()) && - vscrollbar->send (event)) { - return 1; - } + if (!dragScrolling && + ((vscrollbar->visible() && Fl::event_inside(vscrollbar)) || + (hscrollbar->visible() && Fl::event_inside(hscrollbar)))) + return Fl_Group::handle(event); switch(event) { - case ::fltk::KEY: - /* Tell fltk we want to receive KEY events as SHORTCUT. + case FL_KEYBOARD: + /* Tell fltk we want to receive KEYBOARD events as SHORTCUT. * As we don't know the exact keybindings set by the user, we ask - * for all of them (except TabKey to keep form navigation). */ - if (::fltk::event_key() != TabKey) + * for all of them (except Tab to keep form navigation). */ + if (Fl::event_key() != FL_Tab) return 0; break; - case ::fltk::FOCUS: + case FL_FOCUS: /** \bug Draw focus box. */ - - /* If the user clicks with the left button we take focus - * and thereby unfocus any form widgets. - * Otherwise we let fltk do the focus handling. - */ - if (::fltk::event_button() == ::fltk::LeftButton || focus_index() < 0) { - focus_index(-1); - return 1; - } break; - case ::fltk::UNFOCUS: + case FL_UNFOCUS: /** \bug Undraw focus box. */ break; - case ::fltk::PUSH: - take_focus(); - if (::fltk::event_button() == ::fltk::MiddleButton) { + case FL_PUSH: + if (FltkWidgetView::handle (event) == 0 && + Fl::event_button() == FL_MIDDLE_MOUSE) { /* pass event so that middle click can open link in new window */ - if (FltkWidgetView::handle (event) == 0) { - dragScrolling = 1; - dragX = ::fltk::event_x(); - dragY = ::fltk::event_y(); - setCursor (core::style::CURSOR_MOVE); - } - return 1; + dragScrolling = 1; + dragX = Fl::event_x(); + dragY = Fl::event_y(); + setCursor (core::style::CURSOR_MOVE); } + return 1; break; - case ::fltk::DRAG: - if (::fltk::event_button() == ::fltk::MiddleButton) { + case FL_DRAG: + if (Fl::event_button() == FL_MIDDLE_MOUSE) { if (dragScrolling) { - scroll(dragX - ::fltk::event_x(), dragY - ::fltk::event_y()); - dragX = ::fltk::event_x(); - dragY = ::fltk::event_y(); + scroll(dragX - Fl::event_x(), dragY - Fl::event_y()); + dragX = Fl::event_x(); + dragY = Fl::event_y(); return 1; } } break; - case ::fltk:: MOUSEWHEEL: - return (event_dx() ? hscrollbar : vscrollbar)->handle(event); + case FL_MOUSEWHEEL: + return (Fl::event_dx() ? hscrollbar : vscrollbar)->handle(event); break; - case ::fltk::RELEASE: - if (::fltk::event_button() == ::fltk::MiddleButton) { + case FL_RELEASE: + if (Fl::event_button() == FL_MIDDLE_MOUSE) { dragScrolling = 0; setCursor (core::style::CURSOR_DEFAULT); } break; - case ::fltk::ENTER: + case FL_ENTER: /* could be the result of, e.g., closing another window. */ - mouse_x = ::fltk::event_x(); - mouse_y = ::fltk::event_y(); + mouse_x = Fl::event_x(); + mouse_y = Fl::event_y(); positionChanged(); break; - case ::fltk::LEAVE: + case FL_LEAVE: mouse_x = mouse_y = -1; break; } @@ -315,7 +309,7 @@ void FltkViewport::setCanvasSize (int width, int ascent, int descent) */ void FltkViewport::positionChanged () { - if (mouse_x != -1) + if (mouse_x != -1 && dragScrolling == false) (void)theLayout->motionNotify (this, translateViewXToCanvasX (mouse_x), translateViewYToCanvasY (mouse_y), @@ -373,7 +367,7 @@ void FltkViewport::scrollTo (int x, int y) scrollY = y; adjustScrollbarValues (); - redraw (DAMAGE_SCROLL); + damage(FL_DAMAGE_SCROLL); theLayout->scrollPosChanged (this, scrollX, scrollY); positionChanged(); } @@ -386,9 +380,9 @@ void FltkViewport::scroll (int dx, int dy) void FltkViewport::scroll (core::ScrollCommand cmd) { if (cmd == core::SCREEN_UP_CMD) { - scroll (0, -vscrollbar->pagesize ()); + scroll (0, -h () + vscrollbar->linesize ()); } else if (cmd == core::SCREEN_DOWN_CMD) { - scroll (0, vscrollbar->pagesize ()); + scroll (0, h () - vscrollbar->linesize ()); } else if (cmd == core::LINE_UP_CMD) { scroll (0, (int) -vscrollbar->linesize ()); } else if (cmd == core::LINE_DOWN_CMD) { @@ -408,52 +402,59 @@ void FltkViewport::setViewportSize (int width, int height, int hScrollbarThickness, int vScrollbarThickness) { - if (hScrollbarThickness > 0) - hscrollbar->show (); - else - hscrollbar->hide (); - if (vScrollbarThickness > 0) - vscrollbar->show (); - else - vscrollbar->hide (); + int adjustReq = + (hscrollbar->visible() ? !hScrollbarThickness : hScrollbarThickness) || + (vscrollbar->visible() ? !vScrollbarThickness : vScrollbarThickness); + + _MSG("FltkViewport::setViewportSize old_w,old_h=%dx%d -> w,h=%dx%d\n" + "\t hThick=%d hVis=%d, vThick=%d vVis=%d, adjustReq=%d\n", + w(),h(),width,height, + hScrollbarThickness,hscrollbar->visible(), + vScrollbarThickness,vscrollbar->visible(), adjustReq); + + (hScrollbarThickness > 0) ? hscrollbar->show () : hscrollbar->hide (); + (vScrollbarThickness > 0) ? vscrollbar->show () : vscrollbar->hide (); /* If no scrollbar, go to the beginning */ scroll(hScrollbarThickness ? 0 : -scrollX, vScrollbarThickness ? 0 : -scrollY); + + /* Adjust when scrollbar visibility changes */ + if (adjustReq) + adjustScrollbarsAndGadgetsAllocation (); } void FltkViewport::updateCanvasWidgets (int dx, int dy) { // scroll all child widgets except scroll bars for (int i = children () - 1; i > 0; i--) { - ::fltk::Widget *widget = child (i); + Fl_Widget *widget = child (i); if (widget == hscrollbar || widget == vscrollbar) continue; - widget->x (widget->x () - dx); - widget->y (widget->y () - dy); + widget->position(widget->x () - dx, widget->y () - dy); } } -int FltkViewport::translateViewXToCanvasX (int x) +int FltkViewport::translateViewXToCanvasX (int X) { - return x + scrollX; + return X - x () + scrollX; } -int FltkViewport::translateViewYToCanvasY (int y) +int FltkViewport::translateViewYToCanvasY (int Y) { - return y + scrollY; + return Y - y () + scrollY; } -int FltkViewport::translateCanvasXToViewX (int x) +int FltkViewport::translateCanvasXToViewX (int X) { - return x - scrollX; + return X + x () - scrollX; } -int FltkViewport::translateCanvasYToViewY (int y) +int FltkViewport::translateCanvasYToViewY (int Y) { - return y - scrollY; + return Y + y () - scrollY; } // ---------------------------------------------------------------------- @@ -468,11 +469,11 @@ void FltkViewport::setGadgetOrientation (bool hscrollbarVisible, adjustScrollbarsAndGadgetsAllocation (); } -void FltkViewport::addGadget (::fltk::Widget *gadget) +void FltkViewport::addGadget (Fl_Widget *gadget) { /** \bug Reparent? */ - gadgets->append (new TypedPointer < ::fltk::Widget> (gadget)); + gadgets->append (new TypedPointer < Fl_Widget> (gadget)); adjustScrollbarsAndGadgetsAllocation (); } diff --git a/dw/fltkviewport.hh b/dw/fltkviewport.hh index 1e7f54f6..a0a16830 100644 --- a/dw/fltkviewport.hh +++ b/dw/fltkviewport.hh @@ -1,8 +1,8 @@ #ifndef __DW_FLTKVIEWPORT_HH__ #define __DW_FLTKVIEWPORT_HH__ -#include <fltk/Group.h> -#include <fltk/Scrollbar.h> +#include <FL/Fl_Group.H> +#include <FL/Fl_Scrollbar.H> #include "core.hh" #include "fltkcore.hh" @@ -23,10 +23,10 @@ private: int scrollDX, scrollDY; int dragScrolling, dragX, dragY; - ::fltk::Scrollbar *vscrollbar, *hscrollbar; + Fl_Scrollbar *vscrollbar, *hscrollbar; GadgetOrientation gadgetOrientation[4]; - lout::container::typed::List <lout::object::TypedPointer < ::fltk::Widget> > + lout::container::typed::List <lout::object::TypedPointer < Fl_Widget> > *gadgets; void adjustScrollbarsAndGadgetsAllocation (); @@ -35,11 +35,11 @@ private: void vscrollbarChanged (); void positionChanged (); - static void hscrollbarCallback (Widget *hscrollbar, void *viewportPtr); - static void vscrollbarCallback (Widget *vscrollbar, void *viewportPtr); + static void hscrollbarCallback (Fl_Widget *hscrollbar, void *viewportPtr); + static void vscrollbarCallback (Fl_Widget *vscrollbar, void *viewportPtr); void updateCanvasWidgets (int oldScrollX, int oldScrollY); - static void draw_area (void *data, const Rectangle& cr); + static void draw_area (void *data, int x, int y, int w, int h); protected: int translateViewXToCanvasX (int x); @@ -51,7 +51,7 @@ public: FltkViewport (int x, int y, int w, int h, const char *label = 0); ~FltkViewport (); - void layout(); + void resize(int x, int y, int w, int h); void draw (); int handle (int event); @@ -69,7 +69,7 @@ public: void setGadgetOrientation (bool hscrollbarVisible, bool vscrollbarVisible, GadgetOrientation gadgetOrientation); - void addGadget (::fltk::Widget *gadget); + void addGadget (Fl_Widget *gadget); }; } // namespace fltk diff --git a/dw/image.cc b/dw/image.cc index cab40ed5..827cd753 100644 --- a/dw/image.cc +++ b/dw/image.cc @@ -157,7 +157,7 @@ Image::Image(const char *altText) Image::~Image() { if (altText) - delete altText; + free(altText); if (buffer) buffer->unref (); if (mapKey) @@ -315,8 +315,8 @@ bool Image::buttonPressImpl (core::EventButton *event) { bool ret = false; - currLink = mapList? mapList->link (mapKey, contentX(event),contentY(event)): - getStyle()->x_link; + currLink = mapList ? mapList->link(mapKey,contentX(event),contentY(event)) : + getStyle()->x_link; if (event->button == 3){ (void)layout->emitLinkPress(this, currLink, getStyle()->x_img, -1, -1, event); @@ -330,7 +330,7 @@ bool Image::buttonPressImpl (core::EventButton *event) bool Image::buttonReleaseImpl (core::EventButton *event) { - currLink = mapList ? mapList->link (mapKey, contentX(event),contentY(event)): + currLink = mapList ? mapList->link(mapKey,contentX(event),contentY(event)) : getStyle()->x_link; if (clicking) { int x = isMap ? contentX(event) : -1; diff --git a/dw/layout.cc b/dw/layout.cc index e33da4d1..b502ae65 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -174,7 +174,7 @@ bool Layout::LinkEmitter::emitClick (Widget *widget, int link, int img, Layout::Anchor::~Anchor () { - delete name; + free(name); } // --------------------------------------------------------------------- @@ -219,14 +219,19 @@ Layout::Layout (Platform *platform) Layout::~Layout () { + widgetAtPoint = NULL; + if (scrollIdleId != -1) platform->removeIdle (scrollIdleId); if (resizeIdleId != -1) platform->removeIdle (resizeIdleId); if (bgColor) bgColor->unref (); - if (topLevel) - delete topLevel; + if (topLevel) { + Widget *w = topLevel; + topLevel = NULL; + delete w; + } delete platform; delete view; delete anchorsTable; @@ -278,9 +283,12 @@ void Layout::removeWidget () void Layout::setWidget (Widget *widget) { - if (topLevel) - delete topLevel; widgetAtPoint = NULL; + if (topLevel) { + Widget *w = topLevel; + topLevel = NULL; + delete w; + } textZone->zoneFree (); addWidget (widget); @@ -526,7 +534,7 @@ void Layout::setAnchor (const char *anchor) _MSG("setAnchor (%s)\n", anchor); if (requestedAnchor) - delete requestedAnchor; + free(requestedAnchor); requestedAnchor = anchor ? strdup (anchor) : NULL; updateAnchor (); } @@ -671,10 +679,9 @@ void Layout::resizeIdle () } // Set viewport sizes. - if (view->usesViewport ()) - view->setViewportSize (viewportWidth, viewportHeight, - actualHScrollbarThickness, - actualVScrollbarThickness); + view->setViewportSize (viewportWidth, viewportHeight, + actualHScrollbarThickness, + actualVScrollbarThickness); } } @@ -690,7 +697,7 @@ void Layout::setSizeHints () if (topLevel) { topLevel->setWidth (viewportWidth - (canvasHeightGreater ? vScrollbarThickness : 0)); - topLevel->setAscent (viewportHeight - vScrollbarThickness); + topLevel->setAscent (viewportHeight - hScrollbarThickness); topLevel->setDescent (0); } } diff --git a/dw/layout.hh b/dw/layout.hh index dc9bf227..0ac1ea5b 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -152,7 +152,8 @@ private: bool scrollIdleNotInterrupted; /* Anchors of the widget tree */ - lout::container::typed::HashTable <lout::object::String, Anchor> *anchorsTable; + lout::container::typed::HashTable <lout::object::String, Anchor> + *anchorsTable; SelectionState selectionState; FindtextState findtextState; diff --git a/dw/style.cc b/dw/style.cc index a8f458b7..7020503e 100644 --- a/dw/style.cc +++ b/dw/style.cc @@ -424,6 +424,7 @@ static void drawBorderTop(View *view, Style *style, { int points[4][2], d, w; + const bool filled = true, convex = true; bool ridge = false, inset = false, dotted = false; Color::Shading shading = Color::SHADING_NORMAL; @@ -458,7 +459,8 @@ static void drawBorderTop(View *view, Style *style, points[2][0] = points[1][0] - style->borderWidth.right; points[3][0] = x1 + style->borderWidth.left; points[2][1] = points[3][1] = points[0][1] + style->borderWidth.top; - view->drawPolygon (style->borderColor.top, shading, true, points, 4); + view->drawPolygon (style->borderColor.top, shading, filled, convex, + points, 4); } break; case BORDER_RIDGE: @@ -472,7 +474,8 @@ static void drawBorderTop(View *view, Style *style, points[3][0] = x1 + style->borderWidth.left / 2; points[2][1] = points[3][1] = y1 + style->borderWidth.top / 2 + d; shading = (ridge) ? Color::SHADING_LIGHT : Color::SHADING_DARK; - view->drawPolygon (style->borderColor.top, shading, true, points, 4); + view->drawPolygon (style->borderColor.top, shading, filled, convex, + points, 4); points[0][0] = x1 + style->borderWidth.left / 2 + d; points[1][0] = x2 - style->borderWidth.right / 2 + 1 - d; points[0][1] = points[1][1] = y1 + style->borderWidth.top / 2 + d; @@ -480,7 +483,8 @@ static void drawBorderTop(View *view, Style *style, points[3][0] = x1 + style->borderWidth.left; points[2][1] = points[3][1] = y1 + style->borderWidth.top; shading = (ridge) ? Color::SHADING_DARK : Color::SHADING_LIGHT; - view->drawPolygon (style->borderColor.top, shading, true, points, 4); + view->drawPolygon (style->borderColor.top, shading, filled, convex, + points, 4); break; case BORDER_DOUBLE: w = (int) rint(style->borderWidth.top / 3.0); @@ -497,14 +501,16 @@ static void drawBorderTop(View *view, Style *style, points[2][0] = points[1][0] - w_r; points[3][0] = points[0][0] + w_l; points[2][1] = points[3][1] = points[0][1] + w; - view->drawPolygon (style->borderColor.top, shading, true, points, 4); + view->drawPolygon (style->borderColor.top, shading, filled, convex, + points, 4); points[0][0] = x1 + style->borderWidth.left - w_l; points[1][0] = x2 + 1 - style->borderWidth.right + w_r; points[0][1] = points[1][1] = y1 + w + d; points[2][0] = x2 + 1 - style->borderWidth.right; points[3][0] = x1 + style->borderWidth.left; points[2][1] = points[3][1] = y1 + style->borderWidth.top; - view->drawPolygon (style->borderColor.top, shading, true, points, 4); + view->drawPolygon (style->borderColor.top, shading, filled, convex, + points, 4); break; } } @@ -514,6 +520,7 @@ static void drawBorderBottom(View *view, Style *style, { int points[4][2], d, w; + const bool filled = true, convex = true; bool ridge = false, inset = false, dotted = false; Color::Shading shading = Color::SHADING_NORMAL; @@ -548,7 +555,8 @@ static void drawBorderBottom(View *view, Style *style, points[2][0] = points[1][0] - style->borderWidth.right; points[3][0] = points[0][0] + style->borderWidth.left; points[2][1] = points[3][1] = points[0][1]-style->borderWidth.bottom; - view->drawPolygon (style->borderColor.bottom, shading, true, points, 4); + view->drawPolygon (style->borderColor.bottom, shading, filled, convex, + points, 4); } break; case BORDER_RIDGE: @@ -563,7 +571,8 @@ static void drawBorderBottom(View *view, Style *style, points[3][0] = points[0][0] + style->borderWidth.left / 2 + d; points[2][1] = points[3][1] = points[0][1] - w/2 - d; shading = (ridge) ? Color::SHADING_DARK : Color::SHADING_LIGHT; - view->drawPolygon (style->borderColor.bottom, shading, true, points, 4); + view->drawPolygon (style->borderColor.bottom, shading, filled, convex, + points, 4); // clockwise points[0][0] = x1 + style->borderWidth.left - 1; points[1][0] = x2 + 1 - style->borderWidth.right + 1; @@ -572,7 +581,8 @@ static void drawBorderBottom(View *view, Style *style, points[3][0] = points[0][0] - style->borderWidth.left / 2; points[2][1] = points[3][1] = points[0][1] + w/2; shading = (ridge) ? Color::SHADING_LIGHT : Color::SHADING_DARK; - view->drawPolygon (style->borderColor.bottom, shading, true, points, 4); + view->drawPolygon (style->borderColor.bottom, shading, filled, convex, + points, 4); break; case BORDER_DOUBLE: w = (int) rint(style->borderWidth.bottom / 3.0); @@ -589,14 +599,16 @@ static void drawBorderBottom(View *view, Style *style, points[2][0] = points[1][0] + w_l; points[3][0] = points[0][0] - w_r; points[2][1] = points[3][1] = points[0][1] - w; - view->drawPolygon (style->borderColor.bottom, shading, true, points, 4); + view->drawPolygon (style->borderColor.bottom, shading, filled, convex, + points, 4); points[0][0] = x2 + 2 - style->borderWidth.right + w_r; points[1][0] = x1 - 1 + style->borderWidth.left - w_l; points[0][1] = points[1][1] = y1 + 1 - w - d; points[2][0] = x1 - 1 + style->borderWidth.left; points[3][0] = x2 + 2 - style->borderWidth.right; points[2][1] = points[3][1] = y1 + 1 - style->borderWidth.bottom; - view->drawPolygon (style->borderColor.bottom, shading, true, points, 4); + view->drawPolygon (style->borderColor.bottom, shading, filled, convex, + points, 4); break; } } @@ -606,6 +618,7 @@ static void drawBorderLeft(View *view, Style *style, { int points[4][2], d, w; + bool filled = true, convex = true; bool ridge = false, inset = false, dotted = false; Color::Shading shading = Color::SHADING_NORMAL; @@ -639,7 +652,8 @@ static void drawBorderLeft(View *view, Style *style, points[2][0] = points[3][0] = points[0][0] + style->borderWidth.left; points[2][1] = points[1][1] - style->borderWidth.bottom; points[3][1] = points[0][1] + style->borderWidth.top; - view->drawPolygon (style->borderColor.left, shading, true, points, 4); + view->drawPolygon (style->borderColor.left, shading, filled, convex, + points, 4); } break; case BORDER_RIDGE: @@ -654,7 +668,8 @@ static void drawBorderLeft(View *view, Style *style, points[2][1] = y2 - style->borderWidth.bottom / 2; points[3][1] = y1 + style->borderWidth.top / 2; shading = (ridge) ? Color::SHADING_LIGHT : Color::SHADING_DARK; - view->drawPolygon (style->borderColor.left, shading, true, points, 4); + view->drawPolygon (style->borderColor.left, shading, filled, convex, + points, 4); points[0][0] = points[1][0] = x1 + w / 2 + d; points[0][1] = y1 + style->borderWidth.top / 2; points[1][1] = y2 - style->borderWidth.bottom / 2; @@ -662,7 +677,8 @@ static void drawBorderLeft(View *view, Style *style, points[2][1] = y2 - style->borderWidth.bottom; points[3][1] = y1 + style->borderWidth.top; shading = (ridge) ? Color::SHADING_DARK : Color::SHADING_LIGHT; - view->drawPolygon (style->borderColor.left, shading, true, points, 4); + view->drawPolygon (style->borderColor.left, shading, filled, convex, + points, 4); break; case BORDER_DOUBLE: w = (int) rint(style->borderWidth.left / 3.0); @@ -679,14 +695,16 @@ static void drawBorderLeft(View *view, Style *style, points[2][0] = points[3][0] = points[0][0] + w; points[2][1] = points[1][1] - w_b; points[3][1] = points[0][1] + w_t; - view->drawPolygon (style->borderColor.left, shading, true, points, 4); + view->drawPolygon (style->borderColor.left, shading, filled, convex, + points, 4); points[0][0] = points[1][0] = x1 + w + d; points[0][1] = y1 - 1 + style->borderWidth.top - w_t; points[1][1] = y2 + 1 - style->borderWidth.bottom + w_b; points[2][0] = points[3][0] = points[0][0] + w; points[2][1] = y2 + 1 - style->borderWidth.bottom; points[3][1] = y1 - 1 + style->borderWidth.top; - view->drawPolygon (style->borderColor.left, shading, true, points, 4); + view->drawPolygon (style->borderColor.left, shading, filled, convex, + points, 4); break; } } @@ -696,6 +714,7 @@ static void drawBorderRight(View *view, Style *style, { int points[4][2], d, w; + const bool filled = true, convex = true; bool ridge = false, inset = false, dotted = false; Color::Shading shading = Color::SHADING_NORMAL; @@ -729,7 +748,8 @@ static void drawBorderRight(View *view, Style *style, points[2][0] = points[3][0] = points[0][0]-style->borderWidth.right; points[2][1] = points[1][1] - style->borderWidth.bottom; points[3][1] = points[0][1] + style->borderWidth.top; - view->drawPolygon (style->borderColor.right, shading, true,points,4); + view->drawPolygon (style->borderColor.right, shading, filled, convex, + points,4); } break; case BORDER_RIDGE: @@ -744,7 +764,8 @@ static void drawBorderRight(View *view, Style *style, points[2][1] = y2 - style->borderWidth.bottom / 2; points[3][1] = points[0][1] + style->borderWidth.top / 2; shading = (ridge) ? Color::SHADING_DARK : Color::SHADING_LIGHT; - view->drawPolygon (style->borderColor.right, shading, true, points, 4); + view->drawPolygon (style->borderColor.right, shading, filled, convex, + points, 4); points[0][0] = points[1][0] = x1 + 1 - w / 2 - d; points[0][1] = y1 + style->borderWidth.top / 2; points[1][1] = y2 - style->borderWidth.bottom / 2; @@ -752,7 +773,8 @@ static void drawBorderRight(View *view, Style *style, points[2][1] = y2 - style->borderWidth.bottom; points[3][1] = y1 + style->borderWidth.top; shading = (ridge) ? Color::SHADING_LIGHT: Color::SHADING_DARK; - view->drawPolygon (style->borderColor.right, shading, true, points, 4); + view->drawPolygon (style->borderColor.right, shading, filled, convex, + points, 4); break; case BORDER_DOUBLE: w = (int) rint(style->borderWidth.right / 3.0); @@ -769,14 +791,16 @@ static void drawBorderRight(View *view, Style *style, points[2][0] = points[3][0] = points[0][0] - w; points[2][1] = points[1][1] - w_b; points[3][1] = points[0][1] + w_t; - view->drawPolygon (style->borderColor.right, shading, true, points, 4); + view->drawPolygon (style->borderColor.right, shading, filled, convex, + points, 4); points[0][0] = points[1][0] = x1 + 1 - w - d; points[0][1] = y1 - 1 + style->borderWidth.top - w_t; points[1][1] = y2 + 1 - style->borderWidth.bottom + w_b; points[2][0] = points[3][0] = points[0][0] - w; points[2][1] = y2 + 1 - style->borderWidth.bottom; points[3][1] = y1 - 1 + style->borderWidth.top; - view->drawPolygon (style->borderColor.right, shading, true, points, 4); + view->drawPolygon (style->borderColor.right, shading, filled, convex, + points, 4); break; } } diff --git a/dw/types.cc b/dw/types.cc index 4d94f494..9dcedeea 100644 --- a/dw/types.cc +++ b/dw/types.cc @@ -140,7 +140,7 @@ void Polygon::draw (core::View *view, core::style::Style *style, int x, int y) { if (points->size()) { int i; - const bool filled = false; + const bool filled = false, convex = false; int (*pointArray)[2] = (int (*)[2]) malloc(points->size() * sizeof(*pointArray)); @@ -149,7 +149,7 @@ void Polygon::draw (core::View *view, core::style::Style *style, int x, int y) pointArray[i][1] = y + points->getRef(i)->y; } view->drawPolygon(style->color, core::style::Color::SHADING_NORMAL, - filled, pointArray, i); + filled, convex, pointArray, i); free(pointArray); } } @@ -421,12 +421,10 @@ class SelectionResource: public Resource { public: virtual void addItem (const char *str, bool enabled, bool selected) = 0; - virtual void pushGroup (const char *name, bool enabled) = 0; virtual void popGroup () = 0; virtual int getNumberOfItems () = 0; - virtual const char *getItem (int index) = 0; virtual bool isSelected (int index) = 0; }; @@ -92,12 +92,6 @@ public: * This will normally imply a resize of the UI widget. Width and height are * the dimensions of the new size, \em including the scrollbar thicknesses. * - * \bug The rest of this comment needs to be updated. - * - * markerWidthDiff and markerHeightDiff are the respective dimensions of - * the viewport markers (see dw::core::getMarkerWidthDiff and - * dw::core::getMarkerHeightDiff), if they are 0, the respective - * marker should not be shown at all. */ virtual void setViewportSize (int width, int height, int hScrollbarThickness, @@ -179,7 +173,8 @@ public: int angle1, int angle2) = 0; virtual void drawPolygon (style::Color *color, style::Color::Shading shading, - bool filled, int points[][2], int npoints) = 0; + bool filled, bool convex, int points[][2], + int npoints) = 0; virtual void drawText (style::Font *font, style::Color *color, style::Color::Shading shading, diff --git a/lout/misc.cc b/lout/misc.cc index 78f758fd..f45a3450 100644 --- a/lout/misc.cc +++ b/lout/misc.cc @@ -144,7 +144,7 @@ void StringBuffer::clear () Node *node, *nextNode; for (node = firstNode; node; node = nextNode) { nextNode = node->next; - delete node->data; + free(node->data); delete node; } firstNode = lastNode = NULL; diff --git a/lout/object.cc b/lout/object.cc index d72b1eec..08ea0452 100644 --- a/lout/object.cc +++ b/lout/object.cc @@ -224,7 +224,7 @@ String::String (const char *str): ConstString (str ? strdup(str) : NULL) String::~String () { if (str) - delete str; + free((char *)str); } // ------------ diff --git a/src/IO/http.c b/src/IO/http.c index 77a1be43..137ff957 100644 --- a/src/IO/http.c +++ b/src/IO/http.c @@ -174,7 +174,7 @@ static void Http_connect_queued_sockets(HostConnection_t *hc) MSG_BW(sd->web, 1, "ERROR: %s", dStrerror(sd->Err)); a_Chain_bfcb(OpAbort, sd->Info, NULL, "Both"); dFree(sd->Info); - Http_socket_free((int) sd->Info->LocalKey); + Http_socket_free(VOIDP2INT(sd->Info->LocalKey)); } else { sd->connected_to = hc->host; hc->active_connections++; diff --git a/src/IO/iowatch.cc b/src/IO/iowatch.cc index f67b711f..f5243934 100644 --- a/src/IO/iowatch.cc +++ b/src/IO/iowatch.cc @@ -11,19 +11,17 @@ // Simple ADT for watching file descriptor activity -#include <fltk/run.h> +#include <FL/Fl.H> #include "iowatch.hh" -using namespace fltk; - - // // Hook a Callback for a certain activities in a FD // -void a_IOwatch_add_fd(int fd, int when, FileHandler Callback, void *usr_data=0) +void a_IOwatch_add_fd(int fd, int when, Fl_FD_Handler Callback, + void *usr_data = 0) { if (fd >= 0) - add_fd(fd, when, Callback, usr_data); + Fl::add_fd(fd, when, Callback, usr_data); } // @@ -32,6 +30,6 @@ void a_IOwatch_add_fd(int fd, int when, FileHandler Callback, void *usr_data=0) void a_IOwatch_remove_fd(int fd, int when) { if (fd >= 0) - remove_fd(fd, when); + Fl::remove_fd(fd, when); } diff --git a/src/Makefile.am b/src/Makefile.am index 0f09b716..9de7eed5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,7 +18,8 @@ dillo_LDADD = \ $(top_builddir)/dw/libDw-fltk.a \ $(top_builddir)/dw/libDw-core.a \ $(top_builddir)/lout/liblout.a \ - @LIBJPEG_LIBS@ @LIBPNG_LIBS@ @LIBFLTK_LIBS@ @LIBZ_LIBS@ @LIBICONV_LIBS@ + @LIBJPEG_LIBS@ @LIBPNG_LIBS@ @LIBFLTK_LIBS@ @LIBZ_LIBS@ \ + @LIBICONV_LIBS@ @LIBPTHREAD_LIBS@ dillo_SOURCES = \ dillo.cc \ @@ -486,8 +486,8 @@ static int Auth_do_auth_dialog(const char *realm, const DilloUrl *url) AuthDialogData_t *data; _MSG("auth.c: Auth_do_auth_dialog: realm = '%s'\n", realm); - message = dStrconcat("Enter a user and password for \"", - realm, "\".", NULL); + message = dStrconcat("The server at ", URL_HOST(url), " requires a username" + " and password for \"", realm, "\".", NULL); data = dNew(AuthDialogData_t, 1); data->realm_name = dStrdup(realm); data->url = a_Url_dup(url); diff --git a/src/chain.c b/src/chain.c index d4098a2d..a13b3120 100644 --- a/src/chain.c +++ b/src/chain.c @@ -22,7 +22,7 @@ */ #if VERBOSE static void Chain_debug_msg(char *FuncStr, int Op, int Branch, int Dir, - ChainLink *Info) + ChainLink *Info) { const char *StrOps[] = {"", "OpStart", "OpSend", "OpStop", "OpEnd", "OpAbort"}; @@ -31,7 +31,8 @@ static void Chain_debug_msg(char *FuncStr, int Op, int Branch, int Dir, Info, Info ? Info->Flags : -1); } #else -static void Chain_debug_msg() { } +static void Chain_debug_msg(char *FuncStr, int Op, int Branch, int Dir, + ChainLink *Info) { } #endif /* * Create and initialize a new chain-link diff --git a/src/cssparser.cc b/src/cssparser.cc index 4838f607..f173f403 100644 --- a/src/cssparser.cc +++ b/src/cssparser.cc @@ -1522,7 +1522,7 @@ const char * CssParser::propertyNameString(CssPropertyName name) { return Css_property_info[name].symbol; } - + void CssParser::ignoreBlock() { int depth = 0; diff --git a/src/dialog.cc b/src/dialog.cc index 47af9921..3f4f5933 100644 --- a/src/dialog.cc +++ b/src/dialog.cc @@ -13,50 +13,27 @@ #include <math.h> // for rint() -#include <fltk/Window.h> -#include <fltk/ask.h> -#include <fltk/file_chooser.h> -#include <fltk/TextBuffer.h> -#include <fltk/ReturnButton.h> -#include <fltk/TextDisplay.h> -#include <fltk/HighlightButton.h> -#include <fltk/WordwrapOutput.h> -#include <fltk/Input.h> -#include <fltk/SecretInput.h> +#include <FL/Fl_Window.H> +#include <FL/fl_ask.H> +#include <FL/Fl_File_Chooser.H> +#include <FL/Fl_Return_Button.H> +#include <FL/Fl_Text_Display.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Output.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Secret_Input.H> #include "msg.h" #include "dialog.hh" #include "misc.h" #include "prefs.h" -using namespace fltk; - -/* - * Close dialog window. - */ -static void window_close_cb(Widget *, void *vwin) -{ - delete (Window*)vwin; -} - /* * Display a message in a popup window. */ void a_Dialog_msg(const char *msg) { - message("%s", msg); -} - -/* - * Offer a three choice dialog. - * The option string that begins with "*" is the default. - * - * Return: 0, 1 or 2 (esc = 2, window close = 2) - */ -int a_Dialog_choice3(const char *msg, - const char *b0, const char *b1, const char *b2) -{ - return choice(msg, b0, b1, b2); + fl_message("%s", msg); } /* @@ -64,7 +41,7 @@ int a_Dialog_choice3(const char *msg, */ const char *a_Dialog_input(const char *msg) { - return input("%s", "", msg); + return fl_input("%s", "", msg); } /* @@ -72,7 +49,7 @@ const char *a_Dialog_input(const char *msg) */ const char *a_Dialog_passwd(const char *msg) { - return password("%s", "", msg); + return fl_password("%s", "", msg); } /* @@ -83,7 +60,7 @@ const char *a_Dialog_passwd(const char *msg) const char *a_Dialog_save_file(const char *msg, const char *pattern, const char *fname) { - return file_chooser(msg, pattern, fname); + return fl_file_chooser(msg, pattern, fname); } /* @@ -111,69 +88,67 @@ char *a_Dialog_open_file(const char *msg, const char *pattern, const char *fname) { const char *fc_name; -/* - static int icons_loaded = 0; - if (!icons_loaded) - FileIcon::load_system_icons(); -*/ - fc_name = file_chooser(msg, pattern, fname); + + fc_name = fl_file_chooser(msg, pattern, fname); return (fc_name) ? a_Misc_escape_chars(fc_name, "% ") : NULL; } /* + * Close text window. + */ +static void text_window_close_cb(Fl_Widget *, void *vtd) +{ + Fl_Text_Display *td = (Fl_Text_Display *)vtd; + Fl_Text_Buffer *buf = td->buffer(); + + delete (Fl_Window*)td->window(); + delete buf; +} + +/* * Show a new window with the provided text */ void a_Dialog_text_window(const char *txt, const char *title) { - //int wh = 600, ww = 650, bh = 30; int wh = prefs.height, ww = prefs.width, bh = 30; - int lines, line_num_width; - Font *textfont = font(prefs.font_monospace, 0); - Window *window = new Window(ww, wh, title ? title : "Untitled"); - window->callback(window_close_cb, window); - window->begin(); + Fl_Window *window = new Fl_Window(ww, wh, title ? title : "Dillo text"); + Fl_Group::current(0); - TextDisplay *td = new TextDisplay(0,0,ww, wh-bh); - td->buffer()->text(txt); - if (textfont) - td->textfont(textfont); - td->textsize((int) rint(13.0 * prefs.font_factor)); - fltk::setfont(td->textfont(), td->textsize()); - - lines = td->total_lines(); - line_num_width = 2; - while (lines /= 10) - ++line_num_width; - line_num_width = (int)(line_num_width * fltk::getwidth("0")); - td->linenumber_width(line_num_width); + Fl_Text_Buffer *buf = new Fl_Text_Buffer(); + buf->text(txt); + Fl_Text_Display *td = new Fl_Text_Display(0,0,ww, wh-bh); + td->buffer(buf); + td->textsize((int) rint(14.0 * prefs.font_factor)); /* enable wrapping lines; text uses entire width of window */ td->wrap_mode(true, false); - /* WORKAROUND: FLTK may not display all the lines without this */ - td->resize(ww+1,wh-bh); + window->add(td); - ReturnButton *b = new ReturnButton (0, wh-bh, ww, bh, "Close"); - b->callback(window_close_cb, window); + Fl_Return_Button *b = new Fl_Return_Button (0, wh-bh, ww, bh, "Close"); + b->callback(text_window_close_cb, td); + window->add(b); + window->callback(text_window_close_cb, td); window->resizable(td); - window->end(); window->show(); } /*--------------------------------------------------------------------------*/ static int choice5_answer; -static void choice5_cb(Widget *button, void *number) +static void choice5_cb(Fl_Widget *button, void *number) { choice5_answer = VOIDP2INT(number); _MSG("choice5_cb: %d\n", choice5_answer); - button->window()->make_exec_return(true); + button->window()->hide(); } /* - * Make a question-dialog with a question and some alternatives. + * Make a question-dialog with a question and up to five alternatives. + * (if less alternatives, non used parameters must be NULL). + * * Return value: 0 = dialog was cancelled, 1-5 = selected alternative. */ int a_Dialog_choice5(const char *QuestionTxt, @@ -182,56 +157,72 @@ int a_Dialog_choice5(const char *QuestionTxt, { choice5_answer = 0; - int ww = 440, wh = 150, bw = 50, bh = 45, nb = 0; + int ww = 440, wh = 120, bw = 50, bh = 45, ih = 50, nb = 0; const char *txt[7]; txt[0] = txt[6] = NULL; txt[1] = alt1; txt[2] = alt2; txt[3] = alt3; txt[4] = alt4; txt[5] = alt5; - for (int i=1; txt[i]; ++i, ++nb) ; + for (int i=1; txt[i]; ++i, ++nb) + ; + + if (!nb) { + MSG_ERR("a_Dialog_choice5: No choices.\n"); + return choice5_answer; + } + ww = 140 + nb*(bw+10); - Window *window = new Window(ww,wh,"Choice5"); + Fl_Window *window = new Fl_Window(ww,wh,"Choice5"); + window->set_modal(); window->begin(); - Group* ib = new Group(0,0,window->w(),window->h()); + Fl_Group* ib = new Fl_Group(0,0,window->w(),window->h()); ib->begin(); window->resizable(ib); - Widget *box = new Widget(0,0,ww,wh-bh, QuestionTxt); - box->box(DOWN_BOX); - box->labelfont(HELVETICA_BOLD_ITALIC); + /* '?' Icon */ + Fl_Box* o = new Fl_Box(10, (wh-bh-ih)/2, ih, ih); + o->box(FL_THIN_UP_BOX); + o->labelfont(FL_TIMES_BOLD); + o->labelsize(34); + o->color(FL_WHITE); + o->labelcolor(FL_BLUE); + o->label("?"); + o->show(); + + Fl_Box *box = new Fl_Box(60,0,ww-60,wh-bh, QuestionTxt); + box->labelfont(FL_HELVETICA); box->labelsize(14); + box->align(FL_ALIGN_WRAP); - HighlightButton *b; + Fl_Button *b; int xpos = 0, gap = 8; bw = (ww - gap)/nb - gap; xpos += gap; for (int i=1; i <= nb; ++i) { - b = new HighlightButton(xpos, wh-bh, bw, bh, txt[i]); - b->align(ALIGN_WRAP|ALIGN_CLIP); - b->box(UP_BOX); + b = new Fl_Button(xpos, wh-bh, bw, bh, txt[i]); + b->align(FL_ALIGN_WRAP|FL_ALIGN_CLIP); + b->box(FL_UP_BOX); b->callback(choice5_cb, INT2VOIDP(i)); xpos += bw + gap; + /* TODO: set focus to the *-prefixed alternative */ } window->end(); - //window->hotspot(box); - window->exec(); + window->show(); + while (window->shown()) + Fl::wait(); + _MSG("a_Dialog_choice5 answer = %d\n", choice5_answer); delete window; - _MSG("Choice5 answer = %d\n", choice5_answer); return choice5_answer; } /*--------------------------------------------------------------------------*/ -/* - * ret: 0 = Cancel, 1 = OK - */ -static void Dialog_user_password_cb(Widget *button, void *vIntPtr) +static void Dialog_user_password_cb(Fl_Widget *button, void *) { - int ret = VOIDP2INT(vIntPtr); - _MSG("Dialog_user_password_cb: %d\n", ret); - button->window()->make_exec_return(ret); + button->window()->user_data(button); + button->window()->hide(); } /* @@ -241,52 +232,70 @@ static void Dialog_user_password_cb(Widget *button, void *vIntPtr) */ int a_Dialog_user_password(const char *message, UserPasswordCB cb, void *vp) { - int ok, - window_w = 300, window_h = 280, - input_x = 80, input_w = 200, input_h = 30, - button_y = 230, button_h = 30; + int ok = 0, window_h = 280, y, msg_w, msg_h; + const int window_w = 300, input_x = 80, input_w = 200, input_h = 30, + button_h = 30; - Window *window = - new Window(window_w,window_h,"User/Password"); - window->begin(); + /* window is resized below */ + Fl_Window *window = new Fl_Window(window_w,window_h,"Dillo User/Password"); + Fl_Group::current(0); + window->user_data(NULL); /* message */ - WordwrapOutput *message_output = - new WordwrapOutput(20,20,window_w-40,100); - message_output->box(DOWN_BOX); - message_output->text(message); - message_output->textfont(HELVETICA_BOLD_ITALIC); - message_output->textsize(14); + y = 20; + msg_w = window_w - 40; + Fl_Box *msg = new Fl_Box(20, y, msg_w, 100); /* resized below */ + msg->label(message); + msg->labelfont(FL_HELVETICA); + msg->labelsize(14); + msg->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP_LEFT | FL_ALIGN_WRAP); + + fl_font(msg->labelfont(), msg->labelsize()); + msg_w -= 6; /* The label doesn't fill the entire box. */ + fl_measure(msg->label(), msg_w, msg_h, 0); /* fl_measure wraps at msg_w */ + msg->size(msg->w(), msg_h); + window->add(msg); /* inputs */ - Input *user_input = - new Input(input_x,140,input_w,input_h,"User"); + y += msg_h + 20; + Fl_Input *user_input = new Fl_Input(input_x, y, input_w, input_h, "User"); user_input->labelsize(14); user_input->textsize(14); - SecretInput *password_input = - new SecretInput(input_x,180,input_w,input_h,"Password"); + window->add(user_input); + y += input_h + 10; + Fl_Secret_Input *password_input = + new Fl_Secret_Input(input_x, y, input_w, input_h, "Password"); password_input->labelsize(14); password_input->textsize(14); + window->add(password_input); /* "OK" button */ - Button *ok_button = - new Button(200,button_y,50,button_h,"OK"); + y += input_h + 20; + Fl_Button *ok_button = new Fl_Button(200, y, 50, button_h, "OK"); ok_button->labelsize(14); ok_button->callback(Dialog_user_password_cb); - ok_button->user_data(INT2VOIDP(1)); + window->add(ok_button); /* "Cancel" button */ - Button *cancel_button = - new Button(50,button_y,100,button_h,"Cancel"); + Fl_Button *cancel_button = + new Fl_Button(50, y, 100, button_h, "Cancel"); cancel_button->labelsize(14); cancel_button->callback(Dialog_user_password_cb); - cancel_button->user_data(INT2VOIDP(0)); + window->add(cancel_button); - window->end(); - window->size_range(window_w,window_h,window_w,window_h); + y += button_h + 20; + window_h = y; + window->size(window_w, window_h); + window->size_range(window_w, window_h, window_w, window_h); window->resizable(window); - if ((ok = window->exec())) { + window->show(); + while (window->shown()) + Fl::wait(); + + ok = ((Fl_Widget *)window->user_data()) == ok_button ? 1 : 0; + + if (ok) { /* call the callback */ const char *user, *password; user = user_input->value(); @@ -294,7 +303,6 @@ int a_Dialog_user_password(const char *message, UserPasswordCB cb, void *vp) _MSG("a_Dialog_user_passwd: ok = %d\n", ok); (*cb)(user, password, vp); } - delete window; return ok; diff --git a/src/dialog.hh b/src/dialog.hh index 440e9bba..57b21849 100644 --- a/src/dialog.hh +++ b/src/dialog.hh @@ -9,8 +9,6 @@ typedef void (*UserPasswordCB)(const char *user, const char *password, void *vp); void a_Dialog_msg(const char *msg); -int a_Dialog_choice3(const char *msg, - const char *b0, const char *b1, const char *b2); int a_Dialog_choice5(const char *QuestionTxt, const char *alt1, const char *alt2, const char *alt3, const char *alt4, const char *alt5); diff --git a/src/dillo.cc b/src/dillo.cc index 3159674e..e5fca5c5 100644 --- a/src/dillo.cc +++ b/src/dillo.cc @@ -24,10 +24,9 @@ #include <signal.h> #include <locale.h> -#include <fltk/Window.h> -#include <fltk/TabGroup.h> -#include <fltk/Font.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <FL/fl_draw.H> #include "msg.h" #include "paths.hh" @@ -49,6 +48,8 @@ #include "cookies.h" #include "auth.h" +#include "dw/fltkcore.hh" + /* * Command line options structure */ @@ -171,11 +172,55 @@ static OptID getCmdOption(const CLI_options *options, int argc, char **argv, } /* + * Set FL_NORMAL_LABEL to interpret neither symbols (@) nor shortcuts (&), + * and FL_FREE_LABELTYPE to interpret shortcuts. + */ +static void custLabelDraw(const Fl_Label* o, int X, int Y, int W, int H, + Fl_Align align) +{ + const int interpret_symbols = 0; + + fl_draw_shortcut = 0; + fl_font(o->font, o->size); + fl_color((Fl_Color)o->color); + fl_draw(o->value, X, Y, W, H, align, o->image, interpret_symbols); +} + +static void custLabelMeasure(const Fl_Label* o, int& W, int& H) +{ + const int interpret_symbols = 0; + + fl_draw_shortcut = 0; + fl_font(o->font, o->size); + fl_measure(o->value, W, H, interpret_symbols); +} + +static void custMenuLabelDraw(const Fl_Label* o, int X, int Y, int W, int H, + Fl_Align align) +{ + const int interpret_symbols = 0; + + fl_draw_shortcut = 1; + fl_font(o->font, o->size); + fl_color((Fl_Color)o->color); + fl_draw(o->value, X, Y, W, H, align, o->image, interpret_symbols); +} + +static void custMenuLabelMeasure(const Fl_Label* o, int& W, int& H) +{ + const int interpret_symbols = 0; + + fl_draw_shortcut = 1; + fl_font(o->font, o->size); + fl_measure(o->value, W, H, interpret_symbols); +} + +/* * Tell the user if default/pref fonts can't be found. */ static void checkFont(const char *name, const char *type) { - if (::fltk::font(name) == NULL) + if (! dw::fltk::FltkFont::fontExists(name)) MSG_WARN("preferred %s font \"%s\" not found.\n", type, name); } @@ -318,22 +363,31 @@ int main(int argc, char **argv) } // Sets WM_CLASS hint on X11 - fltk::Window::xclass("dillo"); + Fl_Window::default_xclass("dillo"); + + // Disable '@' and '&' interpretation in normal labels. + Fl::set_labeltype(FL_NORMAL_LABEL, custLabelDraw, custLabelMeasure); - // WORKAROUND: sometimes the default pager triggers redraw storms - fltk::TabGroup::default_pager(fltk::PAGER_SHRINK); + // Use to permit '&' interpretation. + Fl::set_labeltype(FL_FREE_LABELTYPE,custMenuLabelDraw,custMenuLabelMeasure); checkPreferredFonts(); + /* use preferred font for UI */ - fltk::Font *dfont = fltk::font(prefs.font_sans_serif, 0); - if (dfont) { - fltk::Widget::default_style->textfont(dfont); - fltk::Widget::default_style->labelfont(dfont); - } + Fl_Font defaultFont = dw::fltk::FltkFont::get (prefs.font_sans_serif, 0); + Fl::set_font(FL_HELVETICA, defaultFont); // this seems to be the + // only way to set the + // default font in fltk1.3 // Create a new UI/bw pair BrowserWindow *bw = a_UIcmd_browser_window_new(0, 0, xid, NULL); + /* We need this so that fl_text_extents() in dw/fltkplatform.cc can + * work when FLTK is configured without XFT and Dillo is opening + * immediately-available URLs from the cmdline (e.g. about:splash). + */ + ((Fl_Widget *)bw->ui)->window()->make_current(); + /* Proxy authentication */ if (prefs.http_proxyuser && !a_Http_proxy_auth()) { const char *passwd = a_UIcmd_get_passwd(prefs.http_proxyuser); @@ -349,7 +403,10 @@ int main(int argc, char **argv) if (idx == argc) { /* No URLs/files on cmdline. Send startup screen */ - a_UIcmd_open_url(bw, prefs.start_page); + if (strcmp(URL_STR(prefs.start_page), "about:blank") == 0) + a_UIcmd_open_url(bw, NULL); + else + a_UIcmd_open_url(bw, prefs.start_page); } else { for (int i = idx; i < argc; i++) { DilloUrl *start_url = makeStartUrl(argv[i], local); @@ -369,7 +426,7 @@ int main(int argc, char **argv) } } - fltk::run(); + Fl::run(); /* * Memory deallocating routines @@ -8,7 +8,7 @@ extern "C" { #endif /* __cplusplus */ -typedef void (*DnsCallback_t)(int Status, Dlist *addr_list, void *data); +typedef void (*DnsCallback_t)(int status, Dlist *addr_list, void *data); void a_Dns_init (void); void a_Dns_freeall(void); diff --git a/src/findbar.cc b/src/findbar.cc index 8cca52ba..02f9545b 100644 --- a/src/findbar.cc +++ b/src/findbar.cc @@ -9,8 +9,8 @@ * (at your option) any later version. */ -#include <fltk/events.h> -#include <fltk/Window.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "findbar.hh" #include "msg.h" @@ -18,49 +18,47 @@ #include "uicmd.hh" #include "bw.h" -using namespace fltk; - /* * Local sub class * (Used to handle escape in the findbar, may also avoid some shortcuts). */ -class MyInput : public Input { +class MyInput : public Fl_Input { public: MyInput (int x, int y, int w, int h, const char* l=0) : - Input(x,y,w,h,l) {}; + Fl_Input(x,y,w,h,l) {}; int handle(int e); }; int MyInput::handle(int e) { _MSG("findbar MyInput::handle()\n"); - int ret = 1, k = event_key(); - unsigned modifier = event_state() & (SHIFT | CTRL | ALT | META); - - if (e == KEY) { - if (k == LeftKey || k == RightKey) { - if (modifier == SHIFT) { - a_UIcmd_send_event_to_tabs_by_wid(e, this); - return 1; + int ret = 1, k = Fl::event_key(); + unsigned modifier = Fl::event_state() & (FL_SHIFT| FL_CTRL| FL_ALT|FL_META); + + if (e == FL_KEYBOARD) { + if (modifier == FL_SHIFT) { + if (k == FL_Left || k == FL_Right) { + // Let these keys get to the UI + return 0; } - } else if (k == EscapeKey && modifier == 0) { + } else if (k == FL_Escape && modifier == 0) { // Avoid clearing the text with Esc, just hide the findbar. return 0; } } if (ret) - ret = Input::handle(e); + ret = Fl_Input::handle(e); return ret; }; /* * Find next occurrence of input key */ -void Findbar::search_cb(Widget *, void *vfb) +void Findbar::search_cb(Fl_Widget *, void *vfb) { Findbar *fb = (Findbar *)vfb; - const char *key = fb->i->text(); + const char *key = fb->i->value(); bool case_sens = fb->check_btn->value(); if (key[0] != '\0') @@ -71,10 +69,10 @@ void Findbar::search_cb(Widget *, void *vfb) /* * Find previous occurrence of input key */ -void Findbar::searchBackwards_cb(Widget *, void *vfb) +void Findbar::searchBackwards_cb(Fl_Widget *, void *vfb) { Findbar *fb = (Findbar *)vfb; - const char *key = fb->i->text(); + const char *key = fb->i->value(); bool case_sens = fb->check_btn->value(); if (key[0] != '\0') { @@ -84,22 +82,9 @@ void Findbar::searchBackwards_cb(Widget *, void *vfb) } /* - * Find next occurrence of input key - */ -void Findbar::search_cb2(Widget *widget, void *vfb) -{ - /* - * Somehow fltk even regards the first loss of focus for the - * window as a WHEN_ENTER_KEY_ALWAYS event. - */ - if (event_key() == ReturnKey) - search_cb(widget, vfb); -} - -/* * Hide the search bar */ -void Findbar::hide_cb(Widget *, void *vfb) +void Findbar::hide_cb(Fl_Widget *, void *vfb) { ((Findbar *)vfb)->hide(); } @@ -108,54 +93,57 @@ void Findbar::hide_cb(Widget *, void *vfb) * Construct text search bar */ Findbar::Findbar(int width, int height) : - Group(0, 0, width, height) + Fl_Group(0, 0, width, height) { int button_width = 70; int gap = 2; int border = 2; int input_width = width - (2 * border + 4 * (button_width + gap)); - int x = border; + int x = 0; + + Fl_Group::current(0); + height -= 2 * border; - box(PLASTIC_UP_BOX); - Group::hide(); + box(FL_THIN_UP_BOX); - begin(); - hide_btn = new HighlightButton(x, border, 16, height, 0); - hideImg = new xpmImage(new_s_xpm); + hide_btn = new Fl_Button(x, border, 16, height, 0); + hideImg = new Fl_Pixmap(new_s_xpm); hide_btn->image(hideImg); x += 16 + gap; hide_btn->callback(hide_cb, this); - hide_btn->clear_tab_to_focus(); + hide_btn->clear_visible_focus(); + hide_btn->box(FL_THIN_UP_BOX); + add(hide_btn); i = new MyInput(x, border, input_width, height); x += input_width + gap; resizable(i); i->color(206); - i->when(WHEN_ENTER_KEY_ALWAYS); - i->callback(search_cb2, this); - i->clear_tab_to_focus(); - i->set_click_to_focus(); + i->when(FL_WHEN_NEVER); + add(i); - next_btn = new HighlightButton(x, border, button_width, height, "Next"); + next_btn = new Fl_Button(x, border, button_width, height, "Next"); x += button_width + gap; - next_btn->add_shortcut(ReturnKey); - next_btn->add_shortcut(KeypadEnter); + next_btn->shortcut(FL_Enter); next_btn->callback(search_cb, this); - next_btn->clear_tab_to_focus(); + next_btn->clear_visible_focus(); + next_btn->box(FL_THIN_UP_BOX); + add(next_btn); - prev_btn= new HighlightButton(x, border, button_width, height, "Previous"); - prev_btn->add_shortcut(SHIFT+ReturnKey); - prev_btn->callback(searchBackwards_cb, this); - prev_btn->clear_tab_to_focus(); + prev_btn= new Fl_Button(x, border, button_width, height, "Previous"); x += button_width + gap; + prev_btn->shortcut(FL_SHIFT+FL_Enter); + prev_btn->callback(searchBackwards_cb, this); + prev_btn->clear_visible_focus(); + prev_btn->box(FL_THIN_UP_BOX); + add(prev_btn); - check_btn = new CheckButton(x, border, 2*button_width, height, + check_btn = new Fl_Check_Button(x, border, 2*button_width, height, "Case-sensitive"); - check_btn->clear_tab_to_focus(); x += 2 * button_width + gap; - - end(); + check_btn->clear_visible_focus(); + add(check_btn); if (prefs.show_tooltip) { hide_btn->tooltip("Hide"); @@ -172,21 +160,21 @@ Findbar::~Findbar() } /* - * Handle events. Used to catch EscapeKey events. + * Handle events. Used to catch FL_Escape events. */ int Findbar::handle(int event) { int ret = 0; - int k = event_key(); - unsigned modifier = event_state() & (SHIFT | CTRL | ALT | META); + int k = Fl::event_key(); + unsigned modifier = Fl::event_state() & (FL_SHIFT| FL_CTRL| FL_ALT|FL_META); - if (event == KEY && modifier == 0 && k == EscapeKey) { + if (event == FL_KEYBOARD && modifier == 0 && k == FL_Escape) { hide(); ret = 1; } if (ret == 0) - ret = Group::handle(event); + ret = Fl_Group::handle(event); return ret; } @@ -196,7 +184,13 @@ int Findbar::handle(int event) */ void Findbar::show() { - Group::show(); + BrowserWindow *bw = a_UIcmd_get_bw_by_widget(this); + dReturn_if (bw == NULL); + + // It takes more than just calling show() to do the trick + //a_UIcmd_findbar_toggle(bw, 1); + Fl_Group::show(); + /* select text even if already focused */ i->take_focus(); i->position(i->size(), 0); @@ -207,10 +201,13 @@ void Findbar::show() */ void Findbar::hide() { - BrowserWindow *bw; + BrowserWindow *bw = a_UIcmd_get_bw_by_widget(this); + dReturn_if (bw == NULL); + + // It takes more than just calling hide() to do the trick + Fl_Group::hide(); + a_UIcmd_findbar_toggle(bw, 0); - Group::hide(); - if ((bw = a_UIcmd_get_bw_by_widget(this))) - a_UIcmd_findtext_reset(bw); + a_UIcmd_findtext_reset(bw); a_UIcmd_focus_main_area(bw); } diff --git a/src/findbar.hh b/src/findbar.hh index ba7ed8ed..11986407 100644 --- a/src/findbar.hh +++ b/src/findbar.hh @@ -1,28 +1,26 @@ #ifndef __FINDBAR_HH__ #define __FINDBAR_HH__ -#include <fltk/xpmImage.h> -#include <fltk/Widget.h> -#include <fltk/HighlightButton.h> -#include <fltk/Button.h> -#include <fltk/Input.h> -#include <fltk/Group.h> -#include <fltk/CheckButton.h> +#include <FL/Fl_Pixmap.H> +#include <FL/Fl_Widget.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Group.H> +#include <FL/Fl_Check_Button.H> /* * Searchbar to find text in page. */ -class Findbar : public fltk::Group { - fltk::Button *clrb; - fltk::HighlightButton *hide_btn, *next_btn, *prev_btn; - fltk::CheckButton *check_btn; - fltk::xpmImage *hideImg; - fltk::Input *i; +class Findbar : public Fl_Group { + Fl_Button *clrb; + Fl_Button *hide_btn, *next_btn, *prev_btn; + Fl_Check_Button *check_btn; + Fl_Pixmap *hideImg; + Fl_Input *i; - static void search_cb (fltk::Widget *, void *); - static void searchBackwards_cb (fltk::Widget *, void *); - static void search_cb2 (fltk::Widget *, void *); - static void hide_cb (fltk::Widget *, void *); + static void search_cb (Fl_Widget *, void *); + static void searchBackwards_cb (Fl_Widget *, void *); + static void hide_cb (Fl_Widget *, void *); public: Findbar(int width, int height); diff --git a/src/form.cc b/src/form.cc index 18441fb8..bf1f8e33 100644 --- a/src/form.cc +++ b/src/form.cc @@ -249,7 +249,9 @@ static void Html_add_input(DilloHtml *html, DilloHtmlInputType type, html->inputs_outside_form->increase(); html->inputs_outside_form->set(ni, input); - input->setEnabled(false); + if (html->bw->NumPendingStyleSheets > 0) { + input->setEnabled(false); + } } } diff --git a/src/html.cc b/src/html.cc index 8291aad9..c3235209 100644 --- a/src/html.cc +++ b/src/html.cc @@ -2845,6 +2845,7 @@ static void Html_tag_open_meta(DilloHtml *html, const char *tag, int tagsize) const char *p, *equiv, *content, *new_content; char delay_str[64], *mr_url; + DilloUrl *new_url; int delay; /* only valid inside HEAD */ @@ -2866,44 +2867,45 @@ static void Html_tag_open_meta(DilloHtml *html, const char *tag, int tagsize) } /* Skip to anything after "URL=" */ while (*content && *(content++) != '=') ; - if (*content) { - - /* Handle the case of a quoted URL */ - if (*content == '"' || *content == '\'') { - if ((p = strchr(content + 1, *content))) - mr_url = dStrndup(content + 1, p - content - 1); - else - mr_url = dStrdup(content + 1); - } else { - mr_url = dStrdup(content); - } - - if (delay == 0) { - /* zero-delay redirection */ - html->stop_parser = true; - DilloUrl *new_url = a_Url_new(mr_url, URL_STR(html->base_url)); - if (a_Capi_dpi_verify_request(html->bw, new_url)) - a_UIcmd_redirection0((void*)html->bw, new_url); - a_Url_free(new_url); - } else { - /* Send a custom HTML message. - * TODO: This is a hairy hack, - * It'd be much better to build a widget. */ - Dstr *ds_msg = dStr_sized_new(256); - dStr_sprintf(ds_msg, meta_template, mr_url, delay_str); - { - int o_InFlags = html->InFlags; - int o_TagSoup = html->TagSoup; - html->InFlags = IN_BODY; - html->TagSoup = false; - Html_write_raw(html, ds_msg->str, ds_msg->len, 0); - html->TagSoup = o_TagSoup; - html->InFlags = o_InFlags; - } - dStr_free(ds_msg, 1); + /* Handle the case of a quoted URL */ + if (*content == '"' || *content == '\'') { + if ((p = strchr(content + 1, *content))) + mr_url = dStrndup(content + 1, p - content - 1); + else + mr_url = dStrdup(content + 1); + } else { + mr_url = dStrdup(content); + } + new_url = a_Url_new(mr_url, URL_STR(html->base_url)); + + if (a_Url_cmp(html->base_url, new_url) == 0) { + /* redirection loop, or empty url string: ignore */ + BUG_MSG("META refresh: %s\n", + *mr_url ? "redirection loop" : "no target URL"); + } else if (delay == 0) { + /* zero-delay redirection */ + html->stop_parser = true; + if (a_Capi_dpi_verify_request(html->bw, new_url)) + a_UIcmd_redirection0((void*)html->bw, new_url); + } else { + /* Send a custom HTML message. + * TODO: This is a hairy hack, + * It'd be much better to build a widget. */ + Dstr *ds_msg = dStr_sized_new(256); + dStr_sprintf(ds_msg, meta_template, mr_url, delay_str); + { + int o_InFlags = html->InFlags; + int o_TagSoup = html->TagSoup; + html->InFlags = IN_BODY; + html->TagSoup = false; + Html_write_raw(html, ds_msg->str, ds_msg->len, 0); + html->TagSoup = o_TagSoup; + html->InFlags = o_InFlags; } - dFree(mr_url); + dStr_free(ds_msg, 1); } + a_Url_free(new_url); + dFree(mr_url); } else if (!dStrcasecmp(equiv, "content-type") && (content = a_Html_get_attr(html, tag, tagsize, "content"))) { diff --git a/src/keys.cc b/src/keys.cc index 1a39f4c8..b00df190 100644 --- a/src/keys.cc +++ b/src/keys.cc @@ -9,7 +9,7 @@ * (at your option) any later version. */ -#include <fltk/events.h> +#include <FL/Fl.H> #include <stdio.h> #include <stdlib.h> /* strtol */ #include <string.h> @@ -38,80 +38,80 @@ typedef struct { * Local data */ static const Mapping_t keyNames[] = { - { "Backspace", fltk::BackSpaceKey }, - { "Delete", fltk::DeleteKey }, - { "Down", fltk::DownKey }, - { "End", fltk::EndKey }, - { "Esc", fltk::EscapeKey }, - { "F1", fltk::F1Key }, - { "F2", fltk::F2Key }, - { "F3", fltk::F3Key }, - { "F4", fltk::F4Key }, - { "F5", fltk::F5Key }, - { "F6", fltk::F6Key }, - { "F7", fltk::F7Key }, - { "F8", fltk::F8Key }, - { "F9", fltk::F9Key }, - { "F10", fltk::F10Key }, - { "F11", fltk::F11Key }, - { "F12", fltk::F12Key }, - { "Home", fltk::HomeKey }, - { "Insert", fltk::InsertKey }, - { "Left", fltk::LeftKey }, - { "PageDown", fltk::PageDownKey }, - { "PageUp", fltk::PageUpKey }, - { "Print", fltk::PrintKey }, - { "Return", fltk::ReturnKey }, - { "Right", fltk::RightKey }, - { "Space", fltk::SpaceKey }, - { "Tab", fltk::TabKey }, - { "Up", fltk::UpKey } + { "Backspace", FL_BackSpace }, + { "Delete", FL_Delete }, + { "Down", FL_Down }, + { "End", FL_End }, + { "Esc", FL_Escape }, + { "F1", FL_F + 1 }, + { "F2", FL_F + 2 }, + { "F3", FL_F + 3 }, + { "F4", FL_F + 4 }, + { "F5", FL_F + 5 }, + { "F6", FL_F + 6 }, + { "F7", FL_F + 7 }, + { "F8", FL_F + 8 }, + { "F9", FL_F + 9 }, + { "F10", FL_F + 10 }, + { "F11", FL_F + 11 }, + { "F12", FL_F + 12 }, + { "Home", FL_Home }, + { "Insert", FL_Insert }, + { "Left", FL_Left }, + { "PageDown", FL_Page_Down }, + { "PageUp", FL_Page_Up }, + { "Print", FL_Print }, + { "Return", FL_Enter }, + { "Right", FL_Right }, + { "Space", ' ' }, + { "Tab", FL_Tab }, + { "Up", FL_Up } }; static const Mapping_t modifierNames[] = { - { "Shift", fltk::SHIFT }, - { "Ctrl", fltk::CTRL }, - { "Alt", fltk::ALT }, - { "Meta", fltk::META }, - { "Button1", fltk::BUTTON1 }, - { "Button2", fltk::BUTTON2 }, - { "Button3", fltk::BUTTON3 } + { "Shift", FL_SHIFT }, + { "Ctrl", FL_CTRL }, + { "Alt", FL_ALT }, + { "Meta", FL_META }, + { "Button1", FL_BUTTON1 }, + { "Button2", FL_BUTTON2 }, + { "Button3", FL_BUTTON3 } }; static const KeyBinding_t default_keys[] = { - { "nop" , KEYS_NOP , 0 , 0 }, - { "open" , KEYS_OPEN , fltk::CTRL , 'o' }, - { "new-window" , KEYS_NEW_WINDOW , fltk::CTRL , 'n' }, - { "new-tab" , KEYS_NEW_TAB , fltk::CTRL , 't' }, - { "left-tab" , KEYS_LEFT_TAB , fltk::SHIFT , fltk::TabKey }, - { "right-tab" , KEYS_RIGHT_TAB , fltk::CTRL , fltk::TabKey }, - { "close-tab" , KEYS_CLOSE_TAB , fltk::CTRL , 'q' }, - { "find" , KEYS_FIND , fltk::CTRL , 'f' }, - { "websearch" , KEYS_WEBSEARCH , fltk::CTRL , 's' }, - { "bookmarks" , KEYS_BOOKMARKS , fltk::CTRL , 'b' }, - { "fullscreen" , KEYS_FULLSCREEN , fltk::CTRL , fltk::SpaceKey }, - { "reload" , KEYS_RELOAD , fltk::CTRL , 'r' }, - { "stop" , KEYS_STOP , 0 , 0 }, - { "save" , KEYS_SAVE , 0 , 0 }, - { "hide-panels" , KEYS_HIDE_PANELS , 0 , fltk::EscapeKey }, - { "file-menu" , KEYS_FILE_MENU , fltk::ALT , 'f' }, - { "close-all" , KEYS_CLOSE_ALL , fltk::ALT , 'q' }, - { "back" , KEYS_BACK , 0 , fltk::BackSpaceKey }, - { "back" , KEYS_BACK , 0 , ',' }, - { "forward" , KEYS_FORWARD , fltk::SHIFT , fltk::BackSpaceKey }, - { "forward" , KEYS_FORWARD , 0 , '.' }, - { "goto" , KEYS_GOTO , fltk::CTRL , 'l' }, - { "home" , KEYS_HOME , fltk::CTRL , 'h' }, - { "screen-up" , KEYS_SCREEN_UP , 0 , fltk::PageUpKey }, - { "screen-up" , KEYS_SCREEN_UP , 0 , 'b' }, - { "screen-down" , KEYS_SCREEN_DOWN , 0 , fltk::PageDownKey }, - { "screen-down" , KEYS_SCREEN_DOWN , 0 , fltk::SpaceKey }, - { "line-up" , KEYS_LINE_UP , 0 , fltk::UpKey }, - { "line-down" , KEYS_LINE_DOWN , 0 , fltk::DownKey }, - { "left" , KEYS_LEFT , 0 , fltk::LeftKey }, - { "right" , KEYS_RIGHT , 0 , fltk::RightKey }, - { "top" , KEYS_TOP , 0 , fltk::HomeKey }, - { "bottom" , KEYS_BOTTOM , 0 , fltk::EndKey }, + { "nop" , KEYS_NOP , 0 , 0 }, + { "open" , KEYS_OPEN , FL_CTRL , 'o' }, + { "new-window" , KEYS_NEW_WINDOW , FL_CTRL , 'n' }, + { "new-tab" , KEYS_NEW_TAB , FL_CTRL , 't' }, + { "left-tab" , KEYS_LEFT_TAB , FL_SHIFT , FL_Tab }, + { "right-tab" , KEYS_RIGHT_TAB , FL_CTRL , FL_Tab }, + { "close-tab" , KEYS_CLOSE_TAB , FL_CTRL , 'w' }, + { "find" , KEYS_FIND , FL_CTRL , 'f' }, + { "websearch" , KEYS_WEBSEARCH , FL_CTRL , 's' }, + { "bookmarks" , KEYS_BOOKMARKS , FL_CTRL , 'b' }, + { "fullscreen" , KEYS_FULLSCREEN , FL_CTRL , ' ' }, + { "reload" , KEYS_RELOAD , FL_CTRL , 'r' }, + { "stop" , KEYS_STOP , 0 , 0 }, + { "save" , KEYS_SAVE , 0 , 0 }, + { "hide-panels" , KEYS_HIDE_PANELS , 0 , FL_Escape }, + { "file-menu" , KEYS_FILE_MENU , FL_ALT , 'f' }, + { "close-all" , KEYS_CLOSE_ALL , FL_CTRL , 'q' }, + { "back" , KEYS_BACK , 0 , FL_BackSpace }, + { "back" , KEYS_BACK , 0 , ',' }, + { "forward" , KEYS_FORWARD , FL_SHIFT , FL_BackSpace }, + { "forward" , KEYS_FORWARD , 0 , '.' }, + { "goto" , KEYS_GOTO , FL_CTRL , 'l' }, + { "home" , KEYS_HOME , FL_CTRL , 'h' }, + { "screen-up" , KEYS_SCREEN_UP , 0 , FL_Page_Up }, + { "screen-up" , KEYS_SCREEN_UP , 0 , 'b' }, + { "screen-down" , KEYS_SCREEN_DOWN , 0 , FL_Page_Down }, + { "screen-down" , KEYS_SCREEN_DOWN , 0 , ' ' }, + { "line-up" , KEYS_LINE_UP , 0 , FL_Up }, + { "line-down" , KEYS_LINE_DOWN , 0 , FL_Down }, + { "left" , KEYS_LEFT , 0 , FL_Left }, + { "right" , KEYS_RIGHT , 0 , FL_Right }, + { "top" , KEYS_TOP , 0 , FL_Home }, + { "bottom" , KEYS_BOTTOM , 0 , FL_End }, }; static Dlist *bindings; @@ -173,16 +173,16 @@ KeysCommand_t Keys::getKeyCmd() KeysCommand_t ret = KEYS_NOP; KeyBinding_t keyNode; // We're only interested in some flags - keyNode.modifier = fltk::event_state() & - (fltk::SHIFT | fltk::CTRL | fltk::ALT | fltk::META); + keyNode.modifier = Fl::event_state() & + (FL_SHIFT | FL_CTRL | FL_ALT | FL_META); - if (keyNode.modifier == fltk::SHIFT && - ispunct(fltk::event_text()[0])) { + if (keyNode.modifier == FL_SHIFT && + ispunct(Fl::event_text()[0])) { // Get key code for a shifted character - keyNode.key = fltk::event_text()[0]; + keyNode.key = Fl::event_text()[0]; keyNode.modifier = 0; } else { - keyNode.key = fltk::event_key(); + keyNode.key = Fl::event_key(); } _MSG("getKeyCmd: key=%d, mod=%d\n", keyNode.key, keyNode.modifier); @@ -27,10 +27,10 @@ # "close-tab" closes the current tab. # Note that this closes the browser window if there is only one tab. -#<ctrl>q = close-tab +#<ctrl>w = close-tab # "close-all" closes all tabs/windows and exits. -#<alt>q = close-all +#<ctrl>q = close-all # "left-tab" and "right-tab" switch to the left/right of the current tab. # *** NOT HOOKED UP YET *** diff --git a/src/menu.cc b/src/menu.cc index d802bddb..71fd6c34 100644 --- a/src/menu.cc +++ b/src/menu.cc @@ -11,11 +11,8 @@ // Functions/Methods for menus -#include <fltk/events.h> -#include <fltk/PopupMenu.h> -#include <fltk/Item.h> -#include <fltk/ToggleItem.h> -#include <fltk/Divider.h> +#include <FL/Fl.H> +#include <FL/Fl_Menu_Item.H> #include "lout/misc.hh" /* SimpleVector */ #include "msg.h" @@ -27,8 +24,6 @@ #include "keys.hh" #include "timeout.hh" -using namespace fltk; - /* * Local data */ @@ -38,54 +33,27 @@ using namespace fltk; static DilloUrl *popup_url = NULL; // Weak reference to the popup's bw static BrowserWindow *popup_bw = NULL; -// Where to place the filemenu popup +static void *popup_form = NULL; +// Where to place the popup static int popup_x, popup_y; // History popup direction (-1 = back, 1 = forward). static int history_direction = -1; // History popup, list of URL-indexes. static int *history_list = NULL; -/* - * Local sub class. - * Used to add the hint for history popup menus, and to remember - * the mouse button pressed over a menu item. - */ -class CustItem : public Item { - int EventButton; -public: - CustItem (const char* label) : Item(label) { EventButton = 0; }; - int button () { return EventButton; }; - void draw(); - int handle(int e) { - EventButton = event_button(); - return Item::handle(e); - } -}; - -/* - * This adds a call to a_UIcmd_set_msg() to show the URL in the status bar - * TODO: erase the URL on popup close. - */ -void CustItem::draw() { - const DilloUrl *url; - if (flags() & SELECTED) { - url = a_History_get_url(history_list[(VOIDP2INT(user_data()))-1]); - a_UIcmd_set_msg(popup_bw, "%s", URL_STR(url)); - } - Item::draw(); +//-------------------------------------------------------------------------- +static void Menu_nop_cb(Fl_Widget*, void*) +{ } - -//-------------------------------------------------------------------------- /* * Static function for File menu callbacks. */ -static void filemenu_cb(Widget *wid, void *data) +static void filemenu_cb(Fl_Widget*, void *data) { if (strcmp((char*)data, "nw") == 0) { - UI *ui = (UI*)popup_bw->ui; - a_UIcmd_browser_window_new(ui->w(), ui->h(), 0, popup_bw); + a_UIcmd_open_url_nw(popup_bw, NULL); } else if (strcmp((char*)data, "nt") == 0) { a_UIcmd_open_url_nt(popup_bw, NULL, 1); } else if (strcmp((char*)data, "of") == 0) { @@ -100,13 +68,13 @@ static void filemenu_cb(Widget *wid, void *data) } -static void Menu_copy_urlstr_cb(Widget *) +static void Menu_copy_urlstr_cb(Fl_Widget*, void*) { if (popup_url) a_UIcmd_copy_urlstr(popup_bw, URL_STR(popup_url)); } -static void Menu_link_cb(Widget*, void *user_data) +static void Menu_link_cb(Fl_Widget*, void *user_data) { DilloUrl *url = (DilloUrl *) user_data ; _MSG("Menu_link_cb: click! :-)\n"); @@ -118,7 +86,7 @@ static void Menu_link_cb(Widget*, void *user_data) /* * Open URL */ -static void Menu_open_url_cb(Widget* ) +static void Menu_open_url_cb(Fl_Widget*, void*) { _MSG("Open URL cb: click! :-)\n"); a_UIcmd_open_url(popup_bw, popup_url); @@ -127,7 +95,7 @@ static void Menu_open_url_cb(Widget* ) /* * Open URL in new window */ -static void Menu_open_url_nw_cb(Widget* ) +static void Menu_open_url_nw_cb(Fl_Widget*, void*) { _MSG("Open URL in new window cb: click! :-)\n"); a_UIcmd_open_url_nw(popup_bw, popup_url); @@ -136,17 +104,17 @@ static void Menu_open_url_nw_cb(Widget* ) /* * Open URL in new Tab */ -static void Menu_open_url_nt_cb(Widget* ) +static void Menu_open_url_nt_cb(Fl_Widget*, void*) { int focus = prefs.focus_new_tab ? 1 : 0; - if (event_state(SHIFT)) focus = !focus; + if (Fl::event_state(FL_SHIFT)) focus = !focus; a_UIcmd_open_url_nt(popup_bw, popup_url, focus); } /* * Add bookmark */ -static void Menu_add_bookmark_cb(Widget* ) +static void Menu_add_bookmark_cb(Fl_Widget*, void*) { a_UIcmd_add_bookmark(popup_bw, popup_url); } @@ -154,15 +122,15 @@ static void Menu_add_bookmark_cb(Widget* ) /* * Find text */ -static void Menu_find_text_cb(Widget* ) +static void Menu_find_text_cb(Fl_Widget*, void*) { - ((UI *)popup_bw->ui)->set_findbar_visibility(1); + ((UI *)popup_bw->ui)->findbar_toggle(1); } /* * Save link */ -static void Menu_save_link_cb(Widget* ) +static void Menu_save_link_cb(Fl_Widget*, void*) { a_UIcmd_save_link(popup_bw, popup_url); } @@ -170,7 +138,7 @@ static void Menu_save_link_cb(Widget* ) /* * Save current page */ -static void Menu_save_page_cb(Widget* ) +static void Menu_save_page_cb(Fl_Widget*, void*) { a_UIcmd_save(popup_bw); } @@ -178,7 +146,7 @@ static void Menu_save_page_cb(Widget* ) /* * View current page source */ -static void Menu_view_page_source_cb(Widget* ) +static void Menu_view_page_source_cb(Fl_Widget*, void*) { a_UIcmd_view_page_source(popup_bw, popup_url); } @@ -186,7 +154,7 @@ static void Menu_view_page_source_cb(Widget* ) /* * View current page's bugs */ -static void Menu_view_page_bugs_cb(Widget* ) +static void Menu_view_page_bugs_cb(Fl_Widget*, void*) { a_UIcmd_view_page_bugs(popup_bw); } @@ -194,7 +162,7 @@ static void Menu_view_page_bugs_cb(Widget* ) /* * Load images on current page that match URL pattern */ -static void Menu_load_images_cb(Widget*, void *user_data) +static void Menu_load_images_cb(Fl_Widget*, void *user_data) { DilloUrl *page_url = (DilloUrl *) user_data; void *doc = a_Bw_get_url_doc(popup_bw, page_url); @@ -206,39 +174,38 @@ static void Menu_load_images_cb(Widget*, void *user_data) /* * Submit form */ -static void Menu_form_submit_cb(Widget*, void *v_form) +static void Menu_form_submit_cb(Fl_Widget*, void*) { void *doc = a_Bw_get_url_doc(popup_bw, popup_url); if (doc) - a_Html_form_submit(doc, v_form); + a_Html_form_submit(doc, popup_form); } /* * Reset form */ -static void Menu_form_reset_cb(Widget*, void *v_form) +static void Menu_form_reset_cb(Fl_Widget*, void*) { void *doc = a_Bw_get_url_doc(popup_bw, popup_url); if (doc) - a_Html_form_reset(doc, v_form); + a_Html_form_reset(doc, popup_form); } /* * Toggle display of 'hidden' form controls. */ -static void Menu_form_hiddens_cb(Widget *w, void *user_data) +static void Menu_form_hiddens_cb(Fl_Widget*, void *user_data) { - void *v_form = w->parent()->user_data(); bool visible = *((bool *) user_data); void *doc = a_Bw_get_url_doc(popup_bw, popup_url); if (doc) - a_Html_form_display_hiddens(doc, v_form, !visible); + a_Html_form_display_hiddens(doc, popup_form, !visible); } -static void Menu_stylesheet_cb(Widget *w, void *vUrl) +static void Menu_stylesheet_cb(Fl_Widget*, void *vUrl) { const DilloUrl *url = (const DilloUrl *) vUrl; a_UIcmd_open_url(popup_bw, url); @@ -247,7 +214,7 @@ static void Menu_stylesheet_cb(Widget *w, void *vUrl) /* * Validate URL with the W3C */ -static void Menu_bugmeter_validate_w3c_cb(Widget* ) +static void Menu_bugmeter_validate_w3c_cb(Fl_Widget*, void*) { Dstr *dstr = dStr_sized_new(128); @@ -260,7 +227,7 @@ static void Menu_bugmeter_validate_w3c_cb(Widget* ) /* * Validate URL with the WDG */ -static void Menu_bugmeter_validate_wdg_cb(Widget* ) +static void Menu_bugmeter_validate_wdg_cb(Fl_Widget*, void*) { Dstr *dstr = dStr_sized_new(128); @@ -274,7 +241,7 @@ static void Menu_bugmeter_validate_wdg_cb(Widget* ) /* * Show info page for the bug meter */ -static void Menu_bugmeter_about_cb(Widget* ) +static void Menu_bugmeter_about_cb(Fl_Widget*, void*) { a_UIcmd_open_urlstr(popup_bw, "http://www.dillo.org/help/bug_meter.html"); } @@ -283,23 +250,23 @@ static void Menu_bugmeter_about_cb(Widget* ) * Navigation History callback. * Go to selected URL. */ -static void Menu_history_cb(Widget *wid, void *data) +static void Menu_history_cb(Fl_Widget*, void *data) { - int mb = ((CustItem*)wid)->button(); + int mb = Fl::event_button(); int offset = history_direction * VOIDP2INT(data); const DilloUrl *url = a_History_get_url(history_list[VOIDP2INT(data)-1]); - if (mb == 2) { + if (mb == 1) { + a_UIcmd_nav_jump(popup_bw, offset, 0); + } else if (mb == 2) { // Middle button, open in a new window/tab if (prefs.middle_click_opens_new_tab) { int focus = prefs.focus_new_tab ? 1 : 0; - if (event_state(SHIFT)) focus = !focus; + if (Fl::event_state(FL_SHIFT)) focus = !focus; a_UIcmd_open_url_nt(popup_bw, url, focus); } else { a_UIcmd_open_url_nw(popup_bw, url); } - } else { - a_UIcmd_nav_jump(popup_bw, offset, 0); } } @@ -311,18 +278,10 @@ static void Menu_history_cb(Widget *wid, void *data) */ static void Menu_popup_cb(void *data) { - ((PopupMenu *)data)->popup(); - a_Timeout_remove(); -} + const Fl_Menu_Item *m = ((Fl_Menu_Item *)data)->popup(popup_x, popup_y); -/* - * Same as above but with coordinates. - */ -static void Menu_popup_cb2(void *data) -{ - Menu *m = (Menu *)data; - m->value(-1); - m->popup(Rectangle(popup_x,popup_y,m->w(),m->h()), m->label()); + if (m && m->callback()) + m->do_callback((Fl_Widget *)data); a_Timeout_remove(); } @@ -334,65 +293,49 @@ void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url, { lout::misc::SimpleVector <DilloUrl*> *cssUrls = (lout::misc::SimpleVector <DilloUrl*> *) v_cssUrls; - Item *i; - int j; - // One menu for every browser window - static PopupMenu *pm = 0; - // Active/inactive control. - static Item *view_page_bugs_item = 0, *view_source_item = 0; - static ItemGroup *stylesheets = 0; - + int j = 0; + + static Fl_Menu_Item *stylesheets = NULL; + static Fl_Menu_Item pm[] = { + {"View page source", 0, Menu_view_page_source_cb,0,0,0,0,0,0}, + {"View page bugs", 0, Menu_view_page_bugs_cb,0,0,0,0,0,0}, + {"View stylesheets", 0, Menu_nop_cb,0,FL_SUBMENU_POINTER|FL_MENU_DIVIDER, + 0,0,0,0}, + {"Bookmark this page", 0,Menu_add_bookmark_cb,0,FL_MENU_DIVIDER,0,0,0,0}, + {"Find text", 0, Menu_find_text_cb,0,0,0,0,0,0}, + {"Save page as...", 0, Menu_save_page_cb,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; + + popup_x = Fl::event_x(); + popup_y = Fl::event_y(); popup_bw = bw; a_Url_free(popup_url); popup_url = a_Url_dup(url); - if (!pm) { - pm = new PopupMenu(0,0,0,0,"&PAGE OPTIONS"); - pm->begin(); - i = view_source_item = new Item("View page Source"); - i->callback(Menu_view_page_source_cb); - i = view_page_bugs_item = new Item("View page Bugs"); - i->callback(Menu_view_page_bugs_cb); - stylesheets = new ItemGroup("View Stylesheets"); - new Divider(); - i = new Item("Bookmark this page"); - i->callback(Menu_add_bookmark_cb); - new Divider(); - i = new Item("Find Text"); - i->callback(Menu_find_text_cb); - //i->shortcut(CTRL+'f'); - i = new Item("Jump to..."); - i->deactivate(); - new Divider(); - i = new Item("Save page As..."); - i->callback(Menu_save_page_cb); - - pm->type(PopupMenu::POPUP123); - pm->end(); - } - - if (has_bugs == TRUE) - view_page_bugs_item->activate(); - else - view_page_bugs_item->deactivate(); + has_bugs == TRUE ? pm[1].activate() : pm[1].deactivate(); if (strncmp(URL_STR(url), "dpi:/vsource/", 13) == 0) - view_source_item->deactivate(); + pm[0].deactivate(); else - view_source_item->activate(); - - int n = stylesheets->children(); - for (j = 0; j < n; j++) { - /* get rid of the old ones */ - Widget *child = stylesheets->child(0); - dFree((char *)child->label()); - a_Url_free((DilloUrl *)child->user_data()); - delete child; + pm[0].activate(); + + if (stylesheets) { + while (stylesheets[j].text) { + dFree((char *) stylesheets[j].label()); + a_Url_free((DilloUrl *) stylesheets[j].user_data()); + j++; + } + delete [] stylesheets; + stylesheets = NULL; } if (cssUrls && cssUrls->size () > 0) { - stylesheets->activate(); + stylesheets = new Fl_Menu_Item[cssUrls->size() + 1]; + memset(stylesheets, '\0', sizeof(Fl_Menu_Item[cssUrls->size() + 1])); + for (j = 0; j < cssUrls->size(); j++) { + /* may want ability to Load individual unloaded stylesheets as well */ const char *action = "View "; DilloUrl *url = cssUrls->get(j); @@ -411,17 +354,17 @@ void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url, label = dStrconcat(action, url_str, NULL); } - i = new Item(label); - i->set_flag(RAW_LABEL); - i->user_data(a_Url_dup(url)); - i->callback(Menu_stylesheet_cb); - stylesheets->add(i); + stylesheets[j].label(FL_NORMAL_LABEL, label); + stylesheets[j].callback(Menu_stylesheet_cb, a_Url_dup(url)); } + + pm[2].user_data(stylesheets); + pm[2].activate(); } else { - stylesheets->deactivate(); + pm[2].deactivate(); } - a_Timeout_add(0.0, Menu_popup_cb, (void *)pm); + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* @@ -429,35 +372,22 @@ void a_Menu_page_popup(BrowserWindow *bw, const DilloUrl *url, */ void a_Menu_link_popup(BrowserWindow *bw, const DilloUrl *url) { - // One menu for every browser window - static PopupMenu *pm = 0; - + static Fl_Menu_Item pm[] = { + {"Open link in new window", 0, Menu_open_url_nw_cb,0,0,0,0,0,0}, + {"Open link in new tab",0,Menu_open_url_nt_cb,0,FL_MENU_DIVIDER,0,0,0,0}, + {"Bookmark this link", 0, Menu_add_bookmark_cb,0,0,0,0,0,0}, + {"Copy link location", 0, Menu_copy_urlstr_cb,0,FL_MENU_DIVIDER,0,0,0,0}, + {"Save link as...", 0, Menu_save_link_cb,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; + + popup_x = Fl::event_x(); + popup_y = Fl::event_y(); popup_bw = bw; a_Url_free(popup_url); popup_url = a_Url_dup(url); - if (!pm) { - Item *i; - pm = new PopupMenu(0,0,0,0,"&LINK OPTIONS"); - //pm->callback(Menu_link_cb, url); - pm->begin(); - i = new Item("Open Link in New Window"); - i->callback(Menu_open_url_nw_cb); - i = new Item("Open Link in New Tab"); - i->callback(Menu_open_url_nt_cb); - new Divider(); - i = new Item("Bookmark this Link"); - i->callback(Menu_add_bookmark_cb); - i = new Item("Copy Link location"); - i->callback(Menu_copy_urlstr_cb); - new Divider(); - i = new Item("Save Link As..."); - i->callback(Menu_save_link_cb); - - pm->type(PopupMenu::POPUP123); - pm->end(); - } - a_Timeout_add(0.0, Menu_popup_cb, (void *)pm); + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* @@ -467,14 +397,23 @@ void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url, bool_t loaded_img, DilloUrl *page_url, DilloUrl *link_url) { - // One menu for every browser window - static PopupMenu *pm = 0; - // Active/inactive control. - static Item *link_menuitem = 0; - static Item *load_img_menuitem = 0; static DilloUrl *popup_page_url = NULL; static DilloUrl *popup_link_url = NULL; - + static Fl_Menu_Item pm[] = { + {"Isolate image", 0, Menu_open_url_cb,0,0,0,0,0,0}, + {"Open image in new window", 0, Menu_open_url_nw_cb,0,0,0,0,0,0}, + {"Open image in new tab", 0, Menu_open_url_nt_cb, 0, FL_MENU_DIVIDER, + 0,0,0,0}, + {"Load image", 0, Menu_load_images_cb,0,0,0,0,0,0}, + {"Bookmark this image", 0, Menu_add_bookmark_cb,0,0,0,0,0,0}, + {"Copy image location", 0,Menu_copy_urlstr_cb,0,FL_MENU_DIVIDER,0,0,0,0}, + {"Save image as...", 0, Menu_save_link_cb, 0, FL_MENU_DIVIDER,0,0,0,0}, + {"Link menu", 0, Menu_link_cb,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; + + popup_x = Fl::event_x(); + popup_y = Fl::event_y(); popup_bw = bw; a_Url_free(popup_url); popup_url = a_Url_dup(url); @@ -483,49 +422,22 @@ void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url, a_Url_free(popup_link_url); popup_link_url = a_Url_dup(link_url); - if (!pm) { - Item *i; - pm = new PopupMenu(0,0,0,0,"&IMAGE OPTIONS"); - pm->begin(); - i = new Item("Isolate Image"); - i->callback(Menu_open_url_cb); - i = new Item("Open Image in New Window"); - i->callback(Menu_open_url_nw_cb); - i = new Item("Open Image in New Tab"); - i->callback(Menu_open_url_nt_cb); - new Divider(); - i = load_img_menuitem = new Item("Load image"); - i->callback(Menu_load_images_cb); - i = new Item("Bookmark this Image"); - i->callback(Menu_add_bookmark_cb); - i = new Item("Copy Image location"); - i->callback(Menu_copy_urlstr_cb); - new Divider(); - i = new Item("Save Image As..."); - i->callback(Menu_save_link_cb); - new Divider(); - i = link_menuitem = new Item("Link menu"); - i->callback(Menu_link_cb); - - pm->type(PopupMenu::POPUP123); - pm->end(); - } if (loaded_img) { - load_img_menuitem->deactivate(); + pm[3].deactivate(); } else { - load_img_menuitem->activate(); - load_img_menuitem->user_data(popup_page_url); + pm[3].activate(); + pm[3].user_data(popup_page_url); } if (link_url) { - link_menuitem->user_data(popup_link_url); - link_menuitem->activate(); + pm[7].activate(); + pm[7].user_data(popup_link_url); } else { - link_menuitem->deactivate(); + pm[7].deactivate(); } - a_Timeout_add(0.0, Menu_popup_cb, (void *)pm); + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* @@ -534,31 +446,25 @@ void a_Menu_image_popup(BrowserWindow *bw, const DilloUrl *url, void a_Menu_form_popup(BrowserWindow *bw, const DilloUrl *page_url, void *formptr, bool_t hidvis) { - static PopupMenu *pm = 0; - static Item *hiddens_item = 0; static bool hiddens_visible; - + static Fl_Menu_Item pm[] = { + {"Submit form", 0, Menu_form_submit_cb,0,0,0,0,0,0}, + {"Reset form", 0, Menu_form_reset_cb,0,0,0,0,0,0}, + {0, 0, Menu_form_hiddens_cb, &hiddens_visible, 0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; + + popup_x = Fl::event_x(); + popup_y = Fl::event_y(); popup_bw = bw; a_Url_free(popup_url); popup_url = a_Url_dup(page_url); - if (!pm) { - Item *i; - pm = new PopupMenu(0,0,0,0,"FORM OPTIONS"); - pm->add(i = new Item("Submit form")); - i->callback(Menu_form_submit_cb); - pm->add(i = new Item("Reset form")); - i->callback(Menu_form_reset_cb); - pm->add(hiddens_item = new Item("")); - hiddens_item->callback(Menu_form_hiddens_cb); - hiddens_item->user_data(&hiddens_visible); - pm->type(PopupMenu::POPUP123); - } - pm->user_data(formptr); + popup_form = formptr; hiddens_visible = hidvis; - hiddens_item->label(hiddens_visible ? "Hide hiddens": "Show hiddens"); + pm[2].label(hiddens_visible ? "Hide hiddens": "Show hiddens"); - a_Timeout_add(0.0, Menu_popup_cb, (void *)pm); + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* @@ -566,44 +472,32 @@ void a_Menu_form_popup(BrowserWindow *bw, const DilloUrl *page_url, */ void a_Menu_file_popup(BrowserWindow *bw, void *v_wid) { - UI *ui = (UI *)bw->ui; - Widget *wid = (Widget*)v_wid; - // One menu for every browser window - static PopupMenu *pm = 0; + Fl_Widget *wid = (Fl_Widget*)v_wid; + + static Fl_Menu_Item pm[] = { + {"New window", Keys::getShortcut(KEYS_NEW_WINDOW), filemenu_cb, + (void*)"nw",0,0,0,0,0}, + {"New tab", Keys::getShortcut(KEYS_NEW_TAB), filemenu_cb, + (void*)"nt", FL_MENU_DIVIDER,0,0,0,0}, + {"Open file...", Keys::getShortcut(KEYS_OPEN), filemenu_cb, + (void*)"of",0,0,0,0,0}, + {"Open URL...", Keys::getShortcut(KEYS_GOTO), filemenu_cb, + (void*)"ou",0,0,0,0,0}, + {"Close", Keys::getShortcut(KEYS_CLOSE_TAB), filemenu_cb, + (void*)"cw", FL_MENU_DIVIDER,0,0,0,0}, + {"Exit Dillo", Keys::getShortcut(KEYS_CLOSE_ALL), filemenu_cb, + (void*)"ed",0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; popup_bw = bw; popup_x = wid->x(); - popup_y = wid->y() + wid->h() + - // WORKAROUND: ?? wid->y() doesn't count tabs ?? - (((Group*)ui->tabs())->children() > 1 ? 20 : 0); + popup_y = wid->y() + wid->h(); a_Url_free(popup_url); popup_url = NULL; - if (!pm) { - int shortcut; - Item *i; - pm = new PopupMenu(0,0,0,0,"File"); - pm->begin(); - shortcut = Keys::getShortcut(KEYS_NEW_WINDOW); - i = new Item("New Window", shortcut, filemenu_cb, (void*)"nw"); - shortcut = Keys::getShortcut(KEYS_NEW_TAB); - i = new Item("New Tab", shortcut, filemenu_cb, (void*)"nt"); - new Divider(); - shortcut = Keys::getShortcut(KEYS_OPEN); - i = new Item("Open File...", shortcut, filemenu_cb, (void*)"of"); - shortcut = Keys::getShortcut(KEYS_GOTO); - i = new Item("Open URL...", shortcut, filemenu_cb, (void*)"ou"); - shortcut = Keys::getShortcut(KEYS_CLOSE_TAB); - i = new Item("Close", shortcut, filemenu_cb, (void*)"cw"); - new Divider(); - shortcut = Keys::getShortcut(KEYS_CLOSE_ALL); - i = new Item("Exit Dillo", shortcut, filemenu_cb, (void*)"ed"); - pm->type(PopupMenu::POPUP123); - pm->end(); - } - - pm->label(wid->visible() ? NULL : "File"); - a_Timeout_add(0.0, Menu_popup_cb2, (void *)pm); + //pm->label(wid->visible() ? NULL : "File"); + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* @@ -611,28 +505,21 @@ void a_Menu_file_popup(BrowserWindow *bw, void *v_wid) */ void a_Menu_bugmeter_popup(BrowserWindow *bw, const DilloUrl *url) { - // One menu for every browser window - static PopupMenu *pm = 0; + static Fl_Menu_Item pm[] = { + {"Validate URL with W3C", 0, Menu_bugmeter_validate_w3c_cb,0,0,0,0,0,0}, + {"Validate URL with WDG", 0, Menu_bugmeter_validate_wdg_cb, 0, + FL_MENU_DIVIDER,0,0,0,0}, + {"About bug meter", 0, Menu_bugmeter_about_cb,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; + popup_x = Fl::event_x(); + popup_y = Fl::event_y(); popup_bw = bw; a_Url_free(popup_url); popup_url = a_Url_dup(url); - if (!pm) { - Item *i; - pm = new PopupMenu(0,0,0,0,"&BUG METER OPTIONS"); - pm->begin(); - i = new Item("Validate URL with W3C"); - i->callback(Menu_bugmeter_validate_w3c_cb); - i = new Item("Validate URL with WDG"); - i->callback(Menu_bugmeter_validate_wdg_cb); - new Divider(); - i = new Item("About Bug Meter..."); - i->callback(Menu_bugmeter_about_cb); - pm->type(PopupMenu::POPUP123); - pm->end(); - } - pm->popup(); + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* @@ -642,65 +529,80 @@ void a_Menu_bugmeter_popup(BrowserWindow *bw, const DilloUrl *url) */ void a_Menu_history_popup(BrowserWindow *bw, int direction) { - static PopupMenu *pm = 0; - Item *it; - int i; + static Fl_Menu_Item *pm = 0; + int i, n; popup_bw = bw; + popup_x = Fl::event_x(); + popup_y = Fl::event_y(); history_direction = direction; // TODO: hook popdown event with delete or similar. if (pm) - delete(pm); + delete [] pm; if (history_list) dFree(history_list); - if (direction == -1) { - pm = new PopupMenu(0,0,0,0, "&PREVIOUS PAGES"); - } else { - pm = new PopupMenu(0,0,0,0, "&FOLLOWING PAGES"); - } - // Get a list of URLs for this popup history_list = a_UIcmd_get_history(bw, direction); - pm->begin(); - for (i = 0; history_list[i] != -1; i += 1) { - // TODO: restrict title size - it = new CustItem(a_History_get_title(history_list[i], 1)); - it->callback(Menu_history_cb, INT2VOIDP(i+1)); - } - pm->type(PopupMenu::POPUP123); - pm->end(); + for (n = 0; history_list[n] != -1; n++) + ; + + pm = new Fl_Menu_Item[n + 1]; + memset(pm, '\0', sizeof(Fl_Menu_Item[n + 1])); - pm->popup(); + for (i = 0; i < n; i++) { + pm[i].label(FL_NORMAL_LABEL, a_History_get_title(history_list[i], 1)); + pm[i].callback(Menu_history_cb, INT2VOIDP(i+1)); + } + a_Timeout_add(0.0, Menu_popup_cb, (void*)pm); } /* * Toggle use of remote stylesheets */ -static void Menu_remote_css_cb(Widget *wid) +static void Menu_remote_css_cb(Fl_Widget *wid, void*) { - _MSG("Menu_remote_css_cb\n"); - prefs.load_stylesheets = wid->state() ? 1 : 0; + Fl_Menu_Item *item = (Fl_Menu_Item*) wid; + + item->flags ^= FL_MENU_VALUE; + prefs.load_stylesheets = item->flags & FL_MENU_VALUE ? 1 : 0; a_UIcmd_repush(popup_bw); } /* * Toggle use of embedded CSS style */ -static void Menu_embedded_css_cb(Widget *wid) +static void Menu_embedded_css_cb(Fl_Widget *wid, void*) { - prefs.parse_embedded_css = wid->state() ? 1 : 0; + Fl_Menu_Item *item = (Fl_Menu_Item*) wid; + + item->flags ^= FL_MENU_VALUE; + prefs.parse_embedded_css = item->flags & FL_MENU_VALUE ? 1 : 0; a_UIcmd_repush(popup_bw); } +static void Menu_panel_change_cb(Fl_Widget*, void *user_data) +{ + UI *ui = (UI*)popup_bw->ui; + + if (VOIDP2INT(user_data) == 10) /* small icons */ + ui->change_panel(ui->get_panelsize(), !ui->get_smallicons()); + else + ui->change_panel(VOIDP2INT(user_data), ui->get_smallicons()); +} + /* * Toggle loading of images -- and load them if enabling. */ -static void Menu_imgload_toggle_cb(Widget *wid) +static void Menu_imgload_toggle_cb(Fl_Widget *wid, void*) { - if ((prefs.load_images = wid->state() ? 1 : 0)) { + Fl_Menu_Item *item = (Fl_Menu_Item*) wid; + + item->flags ^= FL_MENU_VALUE; + + if ((prefs.load_images = item->flags & FL_MENU_VALUE ? 1 : 0)) { void *doc = a_Bw_get_current_doc(popup_bw); if (doc) { @@ -715,31 +617,44 @@ static void Menu_imgload_toggle_cb(Widget *wid) */ void a_Menu_tools_popup(BrowserWindow *bw, void *v_wid) { - // One menu shared by every browser window - static PopupMenu *pm = NULL; - Widget *wid = (Widget*)v_wid; - Item *it; + const Fl_Menu_Item *item; + Fl_Widget *wid = (Fl_Widget*)v_wid; + UI *ui = (UI*)bw->ui; + + static Fl_Menu_Item pm[] = { + {"Use remote CSS", 0, Menu_remote_css_cb, 0, FL_MENU_TOGGLE,0,0,0,0}, + {"Use embedded CSS", 0, Menu_embedded_css_cb, 0, + FL_MENU_TOGGLE|FL_MENU_DIVIDER,0,0,0,0}, + {"Load images", 0, Menu_imgload_toggle_cb, 0, + FL_MENU_TOGGLE|FL_MENU_DIVIDER,0,0,0,0}, + {"Panel size", 0, Menu_nop_cb, (void*)"Submenu1", FL_SUBMENU,0,0,0,0}, + {"tiny", 0,Menu_panel_change_cb,(void*)0,FL_MENU_RADIO,0,0,0,0}, + {"small", 0,Menu_panel_change_cb,(void*)1,FL_MENU_RADIO,0,0,0,0}, + {"medium",0,Menu_panel_change_cb,(void*)2,FL_MENU_RADIO,0,0,0,0}, + {"large", 0,Menu_panel_change_cb,(void*)3, + FL_MENU_RADIO|FL_MENU_DIVIDER,0,0,0,0}, + {"small icons", 0,Menu_panel_change_cb,(void*)10, + FL_MENU_TOGGLE,0,0,0,0}, + {0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0} + }; popup_bw = bw; - - if (!pm) { - pm = new PopupMenu(0,0,0,0, "TOOLS"); - pm->begin(); - it = new ToggleItem("Use remote CSS"); - it->callback(Menu_remote_css_cb); - it->state(prefs.load_stylesheets); - it = new ToggleItem("Use embedded CSS"); - it->callback(Menu_embedded_css_cb); - it->state(prefs.parse_embedded_css); - new Divider(); - it = new ToggleItem("Load images"); - it->callback(Menu_imgload_toggle_cb); - it->state(prefs.load_images); - pm->type(PopupMenu::POPUP13); - pm->end(); + int cur_panelsize = ui->get_panelsize(); + int cur_smallicons = ui->get_smallicons(); + + if (prefs.load_stylesheets) + pm[0].set(); + if (prefs.parse_embedded_css) + pm[1].set(); + if (prefs.load_images) + pm[2].set(); + pm[4+cur_panelsize].setonly(); + cur_smallicons ? pm[8].set() : pm[8].clear(); + + item = pm->popup(wid->x(), wid->y() + wid->h()); + if (item) { + ((Fl_Widget *)item)->do_callback(); } - //pm->popup(); - pm->value(-1); - ((Menu*)pm)->popup(Rectangle(0,wid->h(),pm->w(),pm->h())); } @@ -488,9 +488,9 @@ static void Nav_reload_callback(void *data) confirmed = 0; } else if (URL_FLAGS(h_url) & URL_Post) { /* Attempt to repost data, let's confirm... */ - choice = a_Dialog_choice3("Repost form data?", - "Yes", "*No", "Cancel"); - confirmed = (choice == 0); /* "Yes" */ + choice = a_Dialog_choice5("Repost form data?", + "No", "Yes", "Cancel", NULL, NULL); + confirmed = (choice == 2); /* "Yes" */ } if (confirmed) { diff --git a/src/prefs.c b/src/prefs.c index f968710a..be0882bd 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -70,6 +70,7 @@ void a_Prefs_init(void) prefs.load_stylesheets=TRUE; prefs.middle_click_drags_page = TRUE; prefs.middle_click_opens_new_tab = TRUE; + prefs.right_click_closes_tab = FALSE; prefs.no_proxy = dStrdup(PREFS_NO_PROXY); prefs.panel_size = P_medium; prefs.parse_embedded_css=TRUE; diff --git a/src/prefs.h b/src/prefs.h index 4009925c..4debee89 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -84,6 +84,7 @@ struct _DilloPrefs { char *font_monospace; bool_t enterpress_forces_submit; bool_t middle_click_opens_new_tab; + bool_t right_click_closes_tab; char *search_url; char *save_dir; bool_t show_msg; diff --git a/src/prefsparser.cc b/src/prefsparser.cc index 95f98c16..9d245706 100644 --- a/src/prefsparser.cc +++ b/src/prefsparser.cc @@ -81,6 +81,7 @@ int PrefsParser::parseOption(char *name, char *value) PREFS_BOOL }, { "middle_click_opens_new_tab", &prefs.middle_click_opens_new_tab, PREFS_BOOL }, + { "right_click_closes_tab", &prefs.right_click_closes_tab, PREFS_BOOL }, { "no_proxy", &prefs.no_proxy, PREFS_STRING }, { "panel_size", &prefs.panel_size, PREFS_PANEL_SIZE }, { "parse_embedded_css", &prefs.parse_embedded_css, PREFS_BOOL }, @@ -170,13 +171,6 @@ int PrefsParser::parseOption(char *name, char *value) MSG_WARN("prefs: {%s} IS recognized but not handled!\n", name); break; /* Not reached */ } - - if (prefs.limit_text_width) { - /* BUG: causes 100% CPU usage with <button> or <input type="image"> */ - MSG_WARN("Disabling limit_text_width preference (currently broken).\n"); - prefs.limit_text_width = FALSE; - } - return 0; } @@ -212,4 +206,11 @@ void PrefsParser::parse(FILE *fp) // restore the old numeric locale setlocale(LC_NUMERIC, oldLocale); dFree(oldLocale); + + + if (prefs.limit_text_width) { + /* BUG: causes 100% CPU usage with <button> or <input type="image"> */ + MSG_WARN("Disabling limit_text_width preference (currently broken).\n"); + prefs.limit_text_width = FALSE; + } } diff --git a/src/timeout.cc b/src/timeout.cc index 80eb6425..1ddcd5e1 100644 --- a/src/timeout.cc +++ b/src/timeout.cc @@ -11,12 +11,9 @@ // Simple ADT for timeout functions -#include <fltk/run.h> +#include <FL/Fl.H> #include "timeout.hh" -using namespace fltk; - - // C++ functions with C linkage ---------------------------------------------- /* @@ -25,7 +22,7 @@ using namespace fltk; */ void a_Timeout_add(float t, TimeoutCb_t cb, void *cbdata) { - add_timeout(t, cb, cbdata); + Fl::add_timeout(t, cb, cbdata); } /* @@ -33,7 +30,7 @@ void a_Timeout_add(float t, TimeoutCb_t cb, void *cbdata) */ void a_Timeout_repeat(float t, TimeoutCb_t cb, void *cbdata) { - add_timeout(t, cb, cbdata); + Fl::add_timeout(t, cb, cbdata); } /* @@ -14,73 +14,63 @@ #include <unistd.h> #include <stdio.h> -#include <fltk/HighlightButton.h> -#include <fltk/run.h> -#include <fltk/damage.h> -#include <fltk/xpmImage.h> -#include <fltk/events.h> // for mouse buttons and keys -#include <fltk/Font.h> // UI label font for tabs -#include <fltk/InvisibleBox.h> -#include <fltk/PopupMenu.h> -#include <fltk/Item.h> -#include <fltk/Divider.h> - #include "keys.hh" #include "ui.hh" #include "msg.h" #include "timeout.hh" #include "utf8.hh" -using namespace fltk; - +#include <FL/Fl.H> +#include <FL/Fl_Pixmap.H> +#include <FL/Fl_Box.H> // Include image data #include "pixmaps.h" #include "uicmd.hh" struct iconset { - Image *ImgMeterOK, *ImgMeterBug, - *ImgHome, *ImgReload, *ImgSave, *ImgBook, *ImgTools, - *ImgClear,*ImgSearch, *ImgHelp; - MultiImage *ImgLeftMulti, *ImgRightMulti, *ImgStopMulti; + Fl_Image *ImgMeterOK, *ImgMeterBug, + *ImgHome, *ImgReload, *ImgSave, *ImgBook, *ImgTools, + *ImgClear,*ImgSearch, *ImgHelp, *ImgLeft, *ImgLeftIn, + *ImgRight, *ImgRightIn, *ImgStop, *ImgStopIn; }; static struct iconset standard_icons = { - new xpmImage(mini_ok_xpm), - new xpmImage(mini_bug_xpm), - new xpmImage(home_xpm), - new xpmImage(reload_xpm), - new xpmImage(save_xpm), - new xpmImage(bm_xpm), - new xpmImage(tools_xpm), - new xpmImage(new_s_xpm), - new xpmImage(search_xpm), - new xpmImage(help_xpm), - new MultiImage(*new xpmImage(left_xpm), INACTIVE_R, - *new xpmImage(left_i_xpm)), - new MultiImage(*new xpmImage(right_xpm), INACTIVE_R, - *new xpmImage(right_i_xpm)), - new MultiImage(*new xpmImage(stop_xpm), INACTIVE_R, - *new xpmImage(stop_i_xpm)), + new Fl_Pixmap(mini_ok_xpm), + new Fl_Pixmap(mini_bug_xpm), + new Fl_Pixmap(home_xpm), + new Fl_Pixmap(reload_xpm), + new Fl_Pixmap(save_xpm), + new Fl_Pixmap(bm_xpm), + new Fl_Pixmap(tools_xpm), + new Fl_Pixmap(new_s_xpm), + new Fl_Pixmap(search_xpm), + new Fl_Pixmap(help_xpm), + new Fl_Pixmap(left_xpm), + new Fl_Pixmap(left_i_xpm), + new Fl_Pixmap(right_xpm), + new Fl_Pixmap(right_i_xpm), + new Fl_Pixmap(stop_xpm), + new Fl_Pixmap(stop_i_xpm), }; static struct iconset small_icons = { standard_icons.ImgMeterOK, standard_icons.ImgMeterBug, - new xpmImage(home_s_xpm), - new xpmImage(reload_s_xpm), - new xpmImage(save_s_xpm), - new xpmImage(bm_s_xpm), - new xpmImage(tools_s_xpm), - new xpmImage(new_s_xpm), + new Fl_Pixmap(home_s_xpm), + new Fl_Pixmap(reload_s_xpm), + new Fl_Pixmap(save_s_xpm), + new Fl_Pixmap(bm_s_xpm), + new Fl_Pixmap(tools_s_xpm), + new Fl_Pixmap(new_s_xpm), standard_icons.ImgSearch, standard_icons.ImgHelp, - new MultiImage(*new xpmImage(left_s_xpm), INACTIVE_R, - *new xpmImage(left_si_xpm)), - new MultiImage(*new xpmImage(right_s_xpm), INACTIVE_R, - *new xpmImage(right_si_xpm)), - new MultiImage(*new xpmImage(stop_s_xpm), INACTIVE_R, - *new xpmImage(stop_si_xpm)), + new Fl_Pixmap(left_s_xpm), + new Fl_Pixmap(left_si_xpm), + new Fl_Pixmap(right_s_xpm), + new Fl_Pixmap(right_si_xpm), + new Fl_Pixmap(stop_s_xpm), + new Fl_Pixmap(stop_si_xpm), }; @@ -95,49 +85,96 @@ static struct iconset *icons = &standard_icons; /* * (Used to avoid certain shortcuts in the location bar) */ -class CustInput : public Input { +class CustInput : public Fl_Input { public: CustInput (int x, int y, int w, int h, const char* l=0) : - Input(x,y,w,h,l) {}; + Fl_Input(x,y,w,h,l) {}; int handle(int e); }; /* - * Disable: UpKey, DownKey, PageUpKey, PageDownKey and - * CTRL+{o,r,HomeKey,EndKey} + * Disable keys: Up, Down, Page_Up, Page_Down, Tab and + * CTRL+{o,r,Home,End} SHIFT+{Left,Right}. */ int CustInput::handle(int e) { - int k = event_key(); + int k = Fl::event_key(); _MSG("CustInput::handle event=%d\n", e); // We're only interested in some flags - unsigned modifier = event_state() & (SHIFT | CTRL | ALT); + unsigned modifier = Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT); // Don't focus with arrow keys - if (e == FOCUS && - (k == UpKey || k == DownKey || k == LeftKey || k == RightKey)) { + if (e == FL_FOCUS && + (k == FL_Up || k == FL_Down || k == FL_Left || k == FL_Right)) { return 0; - } else if (e == KEY) { - if (modifier == CTRL) { - if (k == 'l') { + } else if (e == FL_KEYBOARD) { + if (k == FL_Escape && modifier == 0) { + // Let the parent group handle this Esc key + return 0; + } else if (modifier == FL_SHIFT) { + if (k == FL_Left || k == FL_Right) { + // Let these keys get to the UI + return 0; + } + } else if (modifier == FL_CTRL) { + if (k == 'a' || k == 'e') { + position(k == 'a' ? 0 : size()); + return 1; + } else if (k == 'k') { + cut(position(), size()); + return 1; + } else if (k == 'd') { + cut(position(), position()+1); + return 1; + } else if (k == 'l') { // Make text selected when already focused. position(size(), 0); return 1; - } else if (k == 'o' || k == 'r' || k == HomeKey || k == EndKey) + } else if (k == 'h' || k == 'o' || k == 'r' || + k == FL_Home || k == FL_End) { + // Let these keys get to the UI + return 0; + } + } else if (modifier == 0) { + if (k == FL_Down || k == FL_Up || + k == FL_Page_Down || k == FL_Page_Up || k == FL_Tab) { + // Give up focus and honor the key + a_UIcmd_focus_main_area(a_UIcmd_get_bw_by_widget(this)); return 0; - } else if (modifier == SHIFT) { - if (k == LeftKey || k == RightKey) { - _MSG(" CustInput::handle > SHIFT+RightKey\n"); - a_UIcmd_send_event_to_tabs_by_wid(e, this); - return 1; } } } - _MSG("\n"); - return Input::handle(e); + return Fl_Input::handle(e); +} + +//---------------------------------------------------------------------------- + +/* + * A button that highlights on mouse over + */ +class CustLightButton : public Fl_Button { + Fl_Color norm_color; +public: + CustLightButton(int x, int y, int w, int h, const char *l=0) : + Fl_Button(x,y,w,h,l) { norm_color = color(); }; + virtual int handle(int e); +}; + +int CustLightButton::handle(int e) +{ + if (active()) { + if (e == FL_ENTER) { + color(51); // {17,26,51} + redraw(); + } else if (e == FL_LEAVE || e == FL_RELEASE) { + color(norm_color); + redraw(); + } + } + return Fl_Button::handle(e); } //---------------------------------------------------------------------------- @@ -145,24 +182,24 @@ int CustInput::handle(int e) /* * Used to handle "paste" within the toolbar's Clear button. */ -class CustHighlightButton : public HighlightButton { +class CustPasteButton : public CustLightButton { public: - CustHighlightButton(int x, int y, int w, int h, const char *l=0) : - HighlightButton(x,y,w,h,l) {}; + CustPasteButton(int x, int y, int w, int h, const char *l=0) : + CustLightButton(x,y,w,h,l) {}; int handle(int e); }; -int CustHighlightButton::handle(int e) +int CustPasteButton::handle(int e) { - if (e == PASTE) { - const char* t = event_text(); + if (e == FL_PASTE) { + const char* t = Fl::event_text(); if (t && *t) { a_UIcmd_set_location_text(a_UIcmd_get_bw_by_widget(this), t); a_UIcmd_open_urlstr(a_UIcmd_get_bw_by_widget(this), t); return 1; } } - return HighlightButton::handle(e); + return CustLightButton::handle(e); } //---------------------------------------------------------------------------- @@ -170,22 +207,21 @@ int CustHighlightButton::handle(int e) /* * Used to resize the progress boxes automatically. */ -class CustProgressBox : public InvisibleBox { +class CustProgressBox : public Fl_Box { int padding; public: CustProgressBox(int x, int y, int w, int h, const char *l=0) : - InvisibleBox(x,y,w,h,l) { padding = 0; }; + Fl_Box(x,y,w,h,l) { padding = 0; }; void update_label(const char *lbl) { - int w,h; + int w = 0, h = 0; if (!padding) { copy_label("W"); measure_label(w, h); padding = w > 2 ? w/2 : 1; } copy_label(lbl); - measure_label(w,h); - resize(w+padding,h); - redraw_label(); + //measure_label(w,h); + //size(w+padding,this->h()); } }; @@ -205,23 +241,23 @@ public: /* * Callback for the search button. */ -static void search_cb(Widget *wid, void *data) +static void search_cb(Fl_Widget *wid, void *data) { - int k = event_key(); + int b = Fl::event_button(); - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_search_dialog(a_UIcmd_get_bw_by_widget(wid)); - } else if (k == 2) { + } else if (b == FL_MIDDLE_MOUSE) { ((UI*)data)->color_change_cb_i(); - } else if (k == 3) { - ((UI*)data)->panel_cb_i(); + } else if (b == FL_RIGHT_MOUSE) { + // nothing ATM } } /* * Callback for the help button. */ -static void help_cb(Widget *w, void *) +static void help_cb(Fl_Widget *w, void *) { char *path = dStrconcat(DILLO_DOCDIR, "user_help.html", NULL); BrowserWindow *bw = a_UIcmd_get_bw_by_widget(w); @@ -241,10 +277,10 @@ static void help_cb(Widget *w, void *) /* * Callback for the File menu button. */ -static void filemenu_cb(Widget *wid, void *) +static void filemenu_cb(Fl_Widget *wid, void *) { - int k = event_key(); - if (k == 1 || k == 3) { + int b = Fl::event_button(); + if (b == FL_LEFT_MOUSE || b == FL_RIGHT_MOUSE) { a_UIcmd_file_popup(a_UIcmd_get_bw_by_widget(wid), wid); } } @@ -252,15 +288,15 @@ static void filemenu_cb(Widget *wid, void *) /* * Callback for the location's clear-button. */ -static void clear_cb(Widget *w, void *data) +static void clear_cb(Fl_Widget *w, void *data) { UI *ui = (UI*)data; - int k = event_key(); - if (k == 1) { + int b = Fl::event_button(); + if (b == FL_LEFT_MOUSE) { ui->set_location(""); ui->focus_location(); - } if (k == 2) { + } if (b == FL_MIDDLE_MOUSE) { ui->paste_url(); } } @@ -268,7 +304,7 @@ static void clear_cb(Widget *w, void *data) /* * Change the color of the location bar. * -static void color_change_cb(Widget *wid, void *data) +static void color_change_cb(Fl_Widget *wid, void *data) { ((UI*)data)->color_change_cb_i(); } @@ -278,19 +314,14 @@ static void color_change_cb(Widget *wid, void *data) /* * Send the browser to the new URL in the location. */ -static void location_cb(Widget *wid, void *data) +static void location_cb(Fl_Widget *wid, void *data) { - Input *i = (Input*)wid; + Fl_Input *i = (Fl_Input*)wid; UI *ui = (UI*)data; _MSG("location_cb()\n"); - /* This test is necessary because WHEN_ENTER_KEY also includes - * other events we're not interested in. For instance pressing - * The Back or Forward, buttons, or the first click on a rendered - * page. BUG: this must be investigated and reported to FLTK2 team */ - if (event_key() == ReturnKey) { - a_UIcmd_open_urlstr(a_UIcmd_get_bw_by_widget(i), i->value()); - } + a_UIcmd_open_urlstr(a_UIcmd_get_bw_by_widget(i), i->value()); + if (ui->get_panelmode() == UI_TEMPORARILY_SHOW_PANELS) { ui->set_panelmode(UI_HIDDEN); } @@ -300,56 +331,56 @@ static void location_cb(Widget *wid, void *data) /* * Callback handler for button press on the panel */ -static void b1_cb(Widget *wid, void *cb_data) +static void b1_cb(Fl_Widget *wid, void *cb_data) { int bn = VOIDP2INT(cb_data); - int k = event_key(); - if (k && k <= 7) { - _MSG("[%s], mouse button %d was pressed\n", button_names[bn], k); - _MSG("mouse button %d was pressed\n", k); + int b = Fl::event_button(); + if (b >= FL_LEFT_MOUSE && b <= FL_RIGHT_MOUSE) { + _MSG("[%s], mouse button %d was pressed\n", button_names[bn], b); + _MSG("mouse button %d was pressed\n", b); } switch (bn) { case UI_BACK: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_back(a_UIcmd_get_bw_by_widget(wid)); - } else if (k == 3) { + } else if (b == FL_RIGHT_MOUSE) { a_UIcmd_back_popup(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_FORW: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_forw(a_UIcmd_get_bw_by_widget(wid)); - } else if (k == 3) { + } else if (b == FL_RIGHT_MOUSE) { a_UIcmd_forw_popup(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_HOME: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_home(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_RELOAD: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_reload(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_SAVE: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_save(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_STOP: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_stop(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_BOOK: - if (k == 1) { + if (b == FL_LEFT_MOUSE) { a_UIcmd_book(a_UIcmd_get_bw_by_widget(wid)); } break; case UI_TOOLS: - if (k == 1 || k == 3) { + if (b == FL_LEFT_MOUSE || b == FL_RIGHT_MOUSE) { a_UIcmd_tools(a_UIcmd_get_bw_by_widget(wid), wid); } break; @@ -359,24 +390,14 @@ static void b1_cb(Widget *wid, void *cb_data) } /* - * Callback handler for fullscreen button press - */ -//static void fullscreen_cb(Widget *wid, void *data) -//{ -// /* TODO: do we want to toggle fullscreen or panelmode? -// maybe we need to add another button?*/ -// ((UI*)data)->panelmode_cb_i(); -//} - -/* * Callback for the bug meter button. */ -static void bugmeter_cb(Widget *wid, void *data) +static void bugmeter_cb(Fl_Widget *wid, void *data) { - int k = event_key(); - if (k == 1) { + int b = Fl::event_button(); + if (b == FL_LEFT_MOUSE) { a_UIcmd_view_page_bugs(a_UIcmd_get_bw_by_widget(wid)); - } else if (k == 3) { + } else if (b == FL_RIGHT_MOUSE) { a_UIcmd_bugmeter_popup(a_UIcmd_get_bw_by_widget(wid)); } } @@ -390,56 +411,41 @@ static void bugmeter_cb(Widget *wid, void *data) //---------------------------- /* + * Make a generic navigation button + */ +Fl_Button *UI::make_button(const char *label, Fl_Image *img, Fl_Image *deimg, + int b_n, int start) +{ + if (start) + p_xpos = 0; + + Fl_Button *b = new CustLightButton(p_xpos, 0, bw, bh, (lbl) ? label : NULL); + if (img) + b->image(img); + if (deimg) + b->deimage(deimg); + b->callback(b1_cb, (void *)b_n); + b->clear_visible_focus(); + b->labelsize(12); + b->box(FL_FLAT_BOX); + b->down_box(FL_THIN_DOWN_FRAME); + p_xpos += bw; + return b; +} + +/* * Create the archetipic browser buttons */ -PackedGroup *UI::make_toolbar(int tw, int th) +void UI::make_toolbar(int tw, int th) { - HighlightButton *b; - PackedGroup *p1=new PackedGroup(0,0,tw,th); - p1->begin(); - Back = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Back" : 0); - b->image(icons->ImgLeftMulti); - b->callback(b1_cb, (void *)UI_BACK); - b->clear_tab_to_focus(); - HighlightButton::default_style->highlight_color(CuteColor); - - Forw = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Forw" : 0); - b->image(icons->ImgRightMulti); - b->callback(b1_cb, (void *)UI_FORW); - b->clear_tab_to_focus(); - - Home = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Home" : 0); - b->image(icons->ImgHome); - b->callback(b1_cb, (void *)UI_HOME); - b->clear_tab_to_focus(); - - Reload = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Reload" : 0); - b->image(icons->ImgReload); - b->callback(b1_cb, (void *)UI_RELOAD); - b->clear_tab_to_focus(); - - Save = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Save" : 0); - b->image(icons->ImgSave); - b->callback(b1_cb, (void *)UI_SAVE); - b->clear_tab_to_focus(); - - Stop = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Stop" : 0); - b->image(icons->ImgStopMulti); - b->callback(b1_cb, (void *)UI_STOP); - b->clear_tab_to_focus(); - - Bookmarks = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Book" : 0); - b->image(icons->ImgBook); - b->callback(b1_cb, (void *)UI_BOOK); - b->clear_tab_to_focus(); - - Tools = b = new HighlightButton(xpos, 0, bw, bh, (lbl) ? "Tools" : 0); - b->image(icons->ImgTools); - b->callback(b1_cb, (void *)UI_TOOLS); - b->clear_tab_to_focus(); - - p1->type(PackedGroup::ALL_CHILDREN_VERTICAL); - p1->end(); + Back = make_button("Back", icons->ImgLeft, icons->ImgLeftIn, UI_BACK, 1); + Forw = make_button("Forw", icons->ImgRight, icons->ImgRightIn, UI_FORW); + Home = make_button("Home", icons->ImgHome, NULL, UI_HOME); + Reload = make_button("Reload", icons->ImgReload, NULL, UI_RELOAD); + Save = make_button("Save", icons->ImgSave, NULL, UI_SAVE); + Stop = make_button("Stop", icons->ImgStop, icons->ImgStopIn, UI_STOP); + Bookmarks = make_button("Book", icons->ImgBook, NULL, UI_BOOK); + Tools = make_button("Tools", icons->ImgTools, NULL, UI_TOOLS); if (prefs.show_tooltip) { Back->tooltip("Previous page"); @@ -451,41 +457,41 @@ PackedGroup *UI::make_toolbar(int tw, int th) Bookmarks->tooltip("View bookmarks"); Tools->tooltip("Settings"); } - return p1; } /* * Create the location box (Clear/Input/Search) */ -PackedGroup *UI::make_location() +void UI::make_location(int ww) { - Button *b; - PackedGroup *pg = new PackedGroup(0,0,0,0); - pg->begin(); - Clear = b = new CustHighlightButton(2,2,16,22,0); + Fl_Button *b; + + Clear = b = new CustPasteButton(p_xpos,0,16,lh,0); b->image(icons->ImgClear); b->callback(clear_cb, this); - b->clear_tab_to_focus(); + b->clear_visible_focus(); + b->box(FL_THIN_UP_BOX); + p_xpos += b->w(); - Input *i = Location = new CustInput(0,0,0,0,0); + Fl_Input *i = Location = new CustInput(p_xpos,0,ww-p_xpos-32,lh,0); i->color(CuteColor); - i->when(WHEN_ENTER_KEY); + i->when(FL_WHEN_ENTER_KEY); i->callback(location_cb, this); - i->set_click_to_focus(); + p_xpos += i->w(); - Search = b = new HighlightButton(0,0,16,22,0); + Search = b = new CustLightButton(p_xpos,0,16,lh,0); b->image(icons->ImgSearch); b->callback(search_cb, this); - b->clear_tab_to_focus(); + b->clear_visible_focus(); + b->box(FL_THIN_UP_BOX); + p_xpos += b->w(); - Help = b = new HighlightButton(0,0,16,22,0); + Help = b = new CustLightButton(p_xpos,0,16,lh,0); b->image(icons->ImgHelp); b->callback(help_cb, this); - b->clear_tab_to_focus(); - - pg->type(PackedGroup::ALL_CHILDREN_VERTICAL); - pg->resizable(i); - pg->end(); + b->clear_visible_focus(); + b->box(FL_THIN_UP_BOX); + p_xpos += b->w(); if (prefs.show_tooltip) { Clear->tooltip("Clear the URL box.\nMiddle-click to paste a URL."); @@ -493,56 +499,53 @@ PackedGroup *UI::make_location() Search->tooltip("Search the Web"); Help->tooltip("Help"); } - return pg; } /* * Create the progress bars */ -PackedGroup *UI::make_progress_bars(int wide, int thin_up) +void UI::make_progress_bars(int wide, int thin_up) { - ProgBox = new PackedGroup(0,0,0,0); - ProgBox->begin(); // Images - IProg = new CustProgressBox(0,0,0,0); - IProg->box(thin_up ? THIN_UP_BOX : EMBOSSED_BOX); - IProg->labelcolor(GRAY10); + IProg = new CustProgressBox(p_xpos,p_ypos,pw,bh); + IProg->labelsize(12); + IProg->box(thin_up ? FL_THIN_UP_BOX : FL_EMBOSSED_BOX); + IProg->labelcolor(FL_GRAY_RAMP + 2); IProg->update_label(wide ? "Images\n0 of 0" : "0 of 0"); + p_xpos += pw; // Page - PProg = new CustProgressBox(0,0,0,0); - PProg->box(thin_up ? THIN_UP_BOX : EMBOSSED_BOX); - PProg->labelcolor(GRAY10); + PProg = new CustProgressBox(p_xpos,p_ypos,pw,bh); + PProg->labelsize(12); + PProg->box(thin_up ? FL_THIN_UP_BOX : FL_EMBOSSED_BOX); + PProg->labelcolor(FL_GRAY_RAMP + 2); PProg->update_label(wide ? "Page\n0.0KB" : "0.0KB"); - ProgBox->type(PackedGroup::ALL_CHILDREN_VERTICAL); - ProgBox->end(); - - return ProgBox; } /* * Create the "File" menu * Static function for File menu callbacks. */ -Widget *UI::make_filemenu_button() +Fl_Widget *UI::make_filemenu_button() { - HighlightButton *btn; - int w,h, padding; + Fl_Button *btn; + int w = 0, h = 0, padding; - FileButton = btn = new HighlightButton(0,0,0,0,"W"); + FileButton = btn = new Fl_Button(p_xpos,0,bw,bh,"W"); + btn->labeltype(FL_FREE_LABELTYPE); btn->measure_label(w, h); padding = w; btn->copy_label(PanelSize == P_tiny ? "&F" : "&File"); btn->measure_label(w,h); - if (PanelSize == P_large) - h = fh; - btn->resize(w+padding,h); + h = (PanelSize == P_large) ? mh : (PanelSize == P_tiny) ? bh : lh; + btn->size(w+padding, h); + p_xpos += btn->w(); _MSG("UI::make_filemenu_button w=%d h=%d padding=%d\n", w, h, padding); - btn->box(PanelSize == P_large ? FLAT_BOX : THIN_UP_BOX); + btn->box(PanelSize == P_large ? FL_THIN_UP_BOX : FL_THIN_UP_BOX); btn->callback(filemenu_cb, this); if (prefs.show_tooltip) btn->tooltip("File menu"); - btn->clear_tab_to_focus(); - if (!prefs.show_filemenu && PanelSize != P_large) + btn->clear_visible_focus(); + if (!prefs.show_filemenu) btn->hide(); return btn; } @@ -551,161 +554,154 @@ Widget *UI::make_filemenu_button() /* * Create the control panel */ -Group *UI::make_panel(int ww) +void UI::make_panel(int ww) { - Widget *w; - Group *g1, *g2, *g3; - PackedGroup *pg; - - if (PanelSize > P_large) { - PanelSize = P_tiny; - Small_Icons = !Small_Icons; - } + Fl_Widget *w; if (Small_Icons) icons = &small_icons; else icons = &standard_icons; + pw = 70; + p_xpos = p_ypos = 0; if (PanelSize == P_tiny) { if (Small_Icons) - xpos = 0, bw = 22, bh = 22, fh = 0, lh = 22, lbl = 0; + bw = 22, bh = 22, mh = 0, lh = 22, lbl = 0; else - xpos = 0, bw = 28, bh = 28, fh = 0, lh = 28, lbl = 0; + bw = 28, bh = 28, mh = 0, lh = 28, lbl = 0; } else if (PanelSize == P_small) { if (Small_Icons) - xpos = 0, bw = 20, bh = 20, fh = 0, lh = 20, lbl = 0; + bw = 20, bh = 20, mh = 0, lh = 20, lbl = 0; else - xpos = 0, bw = 28, bh = 28, fh = 0, lh = 28, lbl = 0; + bw = 28, bh = 28, mh = 0, lh = 28, lbl = 0; } else if (PanelSize == P_medium) { if (Small_Icons) - xpos = 0, bw = 42, bh = 36, fh = 0, lh = 22, lbl = 1; + bw = 42, bh = 36, mh = 0, lh = 22, lbl = 1; else - xpos = 0, bw = 45, bh = 45, fh = 0, lh = 28, lbl = 1; + bw = 45, bh = 45, mh = 0, lh = 28, lbl = 1; } else { // P_large if (Small_Icons) - xpos = 0, bw = 42, bh = 36, fh = 22, lh = 22, lbl = 1; + bw = 42, bh = 36, mh = 22, lh = 22, lbl = 1; else - xpos = 0, bw = 45, bh = 45, fh = 24, lh = 28, lbl = 1; + bw = 45, bh = 45, mh = 24, lh = 28, lbl = 1; } + nh = bh, fh = 28; sh = 20; + current(0); if (PanelSize == P_tiny) { - g1 = new Group(0,0,ww,bh); - // Toolbar - pg = make_toolbar(ww,bh); - pg->box(EMBOSSED_BOX); - g1->add(pg); - w = make_filemenu_button(); - pg->add(w); - w = make_location(); - pg->add(w); - pg->resizable(w); - w = make_progress_bars(0,1); - pg->add(w); - - g1->resizable(pg); - + NavBar = new CustGroupHorizontal(0,0,ww,nh); + NavBar->box(FL_NO_BOX); + NavBar->begin(); + make_toolbar(ww,bh); + make_filemenu_button(); + make_location(ww); + NavBar->resizable(Location); + make_progress_bars(0,1); + NavBar->box(FL_THIN_UP_FRAME); + NavBar->end(); + NavBar->rearrange(); + TopGroup->insert(*NavBar,0); } else { - g1 = new Group(0,0,ww,fh+lh+bh); - g1->begin(); - // File menu - if (PanelSize == P_large) { - g3 = new Group(0,0,ww,lh); - g3->box(FLAT_BOX); - Widget *bn = make_filemenu_button(); - g3->add(bn); - g3->add_resizable(*new InvisibleBox(bn->w(),0,ww - bn->w(),lh)); - - g2 = new Group(0,fh,ww,lh); - g2->begin(); - pg = make_location(); - pg->resize(ww,lh); - } else { - g2 = new PackedGroup(0,fh,ww,lh); - g2->type(PackedGroup::ALL_CHILDREN_VERTICAL); - g2->begin(); + if (PanelSize == P_large) { + MenuBar = new CustGroupHorizontal(0,0,ww,mh); + MenuBar->begin(); + MenuBar->box(FL_THIN_UP_BOX); + Fl_Widget *bn = make_filemenu_button(); + MenuBar->add_resizable(*new Fl_Box(bn->w(),0,ww - bn->w(),mh)); + MenuBar->end(); + MenuBar->rearrange(); + TopGroup->insert(*MenuBar,0); + + p_xpos = 0; + LocBar = new CustGroupHorizontal(0,0,ww,lh); + LocBar->begin(); + make_location(ww); + LocBar->resizable(Location); + LocBar->end(); + LocBar->rearrange(); + TopGroup->insert(*LocBar,1); + } else { + LocBar = new CustGroupHorizontal(0,0,ww,lh); + LocBar->box(FL_NO_BOX); + LocBar->begin(); + p_xpos = 0; make_filemenu_button(); - pg = make_location(); - } - - g2->resizable(pg); - g2->end(); + make_location(ww); + LocBar->resizable(Location); + LocBar->end(); + LocBar->rearrange(); + TopGroup->insert(*LocBar,0); + } // Toolbar - g3 = new Group(0,fh+lh,ww,bh); - g3->begin(); - pg = make_toolbar(ww,bh); - //w = new InvisibleBox(0,0,0,0,"i n v i s i b l e"); - w = new InvisibleBox(0,0,0,0,0); - pg->add(w); - pg->resizable(w); - + p_ypos = 0; + NavBar = new CustGroupHorizontal(0,0,ww,bh); + NavBar->box(FL_NO_BOX); + NavBar->begin(); + make_toolbar(ww,bh); + w = new Fl_Box(p_xpos,0,ww-p_xpos-2*pw,bh); + w->box(FL_FLAT_BOX); + NavBar->resizable(w); + p_xpos = ww - 2*pw; if (PanelSize == P_small) { - w = make_progress_bars(0,0); + make_progress_bars(0,0); } else { - w = make_progress_bars(1,0); + make_progress_bars(1,0); } - pg->add(w); - - g3->resizable(pg); // Better than 'w3' and it also works - pg->box(BORDER_FRAME); - //g3->box(EMBOSSED_BOX); - g3->end(); - - g1->resizable(g3); - g1->end(); + NavBar->end(); + NavBar->rearrange(); + TopGroup->insert(*NavBar,(MenuBar ? 2 : 1)); } - - return g1; } /* * Create the status panel */ -Group *UI::make_status_panel(int ww) +void UI::make_status_bar(int ww, int wh) { - const int s_h = 20, bm_w = 16; - Group *g = new Group(0, 0, ww, s_h, 0); - - // Status box - Status = new Output(0, 0, ww-bm_w, s_h, 0); - Status->value(""); - Status->box(THIN_DOWN_BOX); - Status->clear_click_to_focus(); - Status->clear_tab_to_focus(); - Status->color(GRAY80); - g->add(Status); - //Status->throw_focus(); - - // Bug Meter - BugMeter = new HighlightButton(ww-bm_w,0,bm_w,s_h,0); - BugMeter->image(icons->ImgMeterOK); - BugMeter->box(THIN_DOWN_BOX); - BugMeter->align(ALIGN_INSIDE|ALIGN_CLIP|ALIGN_LEFT); - if (prefs.show_tooltip) - BugMeter->tooltip("Show HTML bugs\n(right-click for menu)"); - BugMeter->callback(bugmeter_cb, this); - BugMeter->clear_tab_to_focus(); - g->add(BugMeter); - - g->resizable(Status); - return g; + const int bm_w = 20; + StatusBar = new CustGroupHorizontal(0, wh-sh, ww, sh); + StatusBar->box(FL_NO_BOX); + + // Status box + StatusOutput = new Fl_Output(0, wh-sh, ww-bm_w, sh); + StatusOutput->value("http://www.dillo.org"); + StatusOutput->labelsize(8); + StatusOutput->box(FL_THIN_DOWN_BOX); + StatusOutput->clear_visible_focus(); + StatusOutput->color(FL_GRAY_RAMP + 18); + + // Bug Meter + BugMeter = new CustLightButton(ww-bm_w,wh-sh,bm_w,sh); + BugMeter->image(icons->ImgMeterOK); + BugMeter->box(FL_THIN_DOWN_BOX); + BugMeter->align(FL_ALIGN_INSIDE | FL_ALIGN_TEXT_NEXT_TO_IMAGE); + if (prefs.show_tooltip) + BugMeter->tooltip("Show HTML bugs\n(right-click for menu)"); + BugMeter->callback(bugmeter_cb, this); + BugMeter->clear_visible_focus(); + + StatusBar->end(); + StatusBar->resizable(StatusOutput); + StatusBar->rearrange(); } /* * User Interface constructor */ -UI::UI(int x, int y, int ww, int wh, const char* label, const UI *cur_ui) : - Group(x, y, ww, wh, label) +UI::UI(int x, int y, int ui_w, int ui_h, const char* label, const UI *cur_ui) : + CustGroupVertical(x, y, ui_w, ui_h, label) { PointerOnLink = FALSE; + MenuBar = LocBar = NavBar = StatusBar = NULL; + Tabs = NULL; TabTooltip = NULL; - TopGroup = new PackedGroup(0, 0, ww, wh); - add(TopGroup); - resizable(TopGroup); - set_flag(RAW_LABEL); + TopGroup = this; + TopGroup->box(FL_NO_BOX); + clear_flag(SHORTCUT_LABEL); if (cur_ui) { PanelSize = cur_ui->PanelSize; @@ -722,45 +718,48 @@ UI::UI(int x, int y, int ww, int wh, const char* label, const UI *cur_ui) : PanelSize = prefs.panel_size; Small_Icons = prefs.small_icons; CuteColor = 206; - Panelmode = (UIPanelmode) prefs.fullwindow_start; + Panelmode = (prefs.fullwindow_start) ? UI_HIDDEN : UI_NORMAL; } // Control panel - Panel = make_panel(ww); - TopGroup->add(Panel); - - // Render area - Main = new Widget(0,0,1,1,"Welcome..."); - Main->box(FLAT_BOX); - Main->color(GRAY15); - Main->labelfont(HELVETICA_BOLD_ITALIC); - Main->labelsize(36); - Main->labeltype(SHADOW_LABEL); - Main->labelcolor(WHITE); - TopGroup->add(Main); - TopGroup->resizable(Main); - MainIdx = TopGroup->find(Main); - - // Find text bar - findbar = new Findbar(ww, 28); - TopGroup->add(findbar); - - // Status Panel - StatusPanel = make_status_panel(ww); - TopGroup->add(StatusPanel); + TopGroup->begin(); + make_panel(ui_w); + + // Render area + Main = new Fl_Group(0,0,0,0,"Welcome..."); // size is set by rearrange() + Main->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + Main->box(FL_FLAT_BOX); + Main->color(FL_GRAY_RAMP + 3); + Main->labelfont(FL_HELVETICA_BOLD_ITALIC); + Main->labelsize(36); + Main->labeltype(FL_SHADOW_LABEL); + Main->labelcolor(FL_WHITE); + TopGroup->add(Main); + TopGroup->resizable(Main); + MainIdx = TopGroup->find(Main); + + // Find text bar + FindBarSpace = 1; + FindBar = new Findbar(ui_w, fh); + TopGroup->add(FindBar); + + // Status Panel + make_status_bar(ui_w, ui_h); + TopGroup->add(StatusBar); + TopGroup->end(); + TopGroup->rearrange(); // Make the full screen button (to be attached to the viewport later) // TODO: attach to the viewport - //FullScreen = new HighlightButton(0,0,15,15); + //FullScreen = new Fl_Button(0,0,15,15); //FullScreen->image(ImgFullScreenOn); //FullScreen->tooltip("Hide Controls"); //FullScreen->callback(fullscreen_cb, this); customize(0); - if (Panelmode) { - Panel->hide(); - StatusPanel->hide(); + if (Panelmode == UI_HIDDEN) { + fullscreen_toggle(); } } @@ -771,6 +770,9 @@ UI::~UI() { _MSG("UI::~UI()\n"); dFree(TabTooltip); + + if (!FindBarSpace) + delete FindBar; } /* @@ -778,14 +780,12 @@ UI::~UI() */ int UI::handle(int event) { - _MSG("UI::handle event=%d (%d,%d)\n", event, event_x(), event_y()); - _MSG("Panel->h()=%d Main->h()=%d\n", Panel->h() , Main->h()); + _MSG("UI::handle event=%d (%d,%d)\n", event, Fl::event_x(), Fl::event_y()); int ret = 0; - - if (event == KEY) { + if (event == FL_KEYBOARD) { return 0; // Receive as shortcut - } else if (event == SHORTCUT) { + } else if (event == FL_SHORTCUT) { KeysCommand_t cmd = Keys::getKeyCmd(); if (cmd == KEYS_NOP) { // Do nothing @@ -805,7 +805,7 @@ int UI::handle(int event) a_UIcmd_book(a_UIcmd_get_bw_by_widget(this)); ret = 1; } else if (cmd == KEYS_FIND) { - set_findbar_visibility(1); + findbar_toggle(1); ret = 1; } else if (cmd == KEYS_WEBSEARCH) { a_UIcmd_search_dialog(a_UIcmd_get_bw_by_widget(this)); @@ -813,19 +813,11 @@ int UI::handle(int event) } else if (cmd == KEYS_GOTO) { focus_location(); ret = 1; - } else if (cmd == KEYS_NEW_TAB) { - a_UIcmd_open_url_nt(a_UIcmd_get_bw_by_widget(this), NULL, 1); - ret = 1; - } else if (cmd == KEYS_CLOSE_TAB) { - a_UIcmd_close_bw(a_UIcmd_get_bw_by_widget(this)); - ret = 1; - } else if (cmd == KEYS_HIDE_PANELS && - get_panelmode() == UI_TEMPORARILY_SHOW_PANELS) { - set_panelmode(UI_HIDDEN); - ret = 1; - } else if (cmd == KEYS_NEW_WINDOW) { - a_UIcmd_browser_window_new(w(),h(),0,a_UIcmd_get_bw_by_widget(this)); + } else if (cmd == KEYS_HIDE_PANELS) { + fullscreen_toggle(); ret = 1; + //if (get_panelmode() == UI_TEMPORARILY_SHOW_PANELS) + // set_panelmode(UI_HIDDEN); } else if (cmd == KEYS_OPEN) { a_UIcmd_open_file(a_UIcmd_get_bw_by_widget(this)); ret = 1; @@ -842,28 +834,22 @@ int UI::handle(int event) a_UIcmd_save(a_UIcmd_get_bw_by_widget(this)); ret = 1; } else if (cmd == KEYS_FULLSCREEN) { - panelmode_cb_i(); + fullscreen_toggle(); ret = 1; } else if (cmd == KEYS_FILE_MENU) { a_UIcmd_file_popup(a_UIcmd_get_bw_by_widget(this), FileButton); ret = 1; - } else if (cmd == KEYS_CLOSE_ALL) { - a_Timeout_add(0.0, a_UIcmd_close_all_bw, NULL); - ret = 1; } - } else if (event == PUSH) { + } +#if 0 + } else if (event == FL_PUSH) { if (prefs.middle_click_drags_page == 0 && - event_button() == MiddleButton && + Fl::event_button() == FL_MIDDLE_MOUSE && !a_UIcmd_pointer_on_link(a_UIcmd_get_bw_by_widget(this))) { - if (Main->Rectangle::contains (event_x (), event_y ())) { + if (Main->contains(Fl::belowmouse())) { /* Offer the event to Main's children (form widgets) */ - int save_x = e_x, save_y = e_y; - - e_x -= Main->x(); - e_y -= Main->y(); - ret = ((Group *)Main)->Group::handle(event); - e_x = save_x; - e_y = save_y; + /* TODO: Try just offering it to Fl::belowmouse() */ + ret = ((Fl_Group *)Main)->Fl_Group::handle(event); } if (!ret) { /* middle click was not on a link or a form widget */ @@ -872,9 +858,9 @@ int UI::handle(int event) } } } - +#endif if (!ret) { - ret = Group::handle(event); + ret = Fl_Group::handle(event); } return ret; @@ -899,9 +885,7 @@ const char *UI::get_location() void UI::set_location(const char *str) { if (!str) str = ""; - // This text() call clears fl_pending_callback, avoiding - // an extra location_cb() call. - Location->text(str); + Location->value(str); Location->position(strlen(str)); } @@ -912,7 +896,8 @@ void UI::set_location(const char *str) void UI::focus_location() { if (get_panelmode() == UI_HIDDEN) { - set_panelmode(UI_TEMPORARILY_SHOW_PANELS); + // Temporary panel handling is disabled now. + //set_panelmode(UI_TEMPORARILY_SHOW_PANELS); } Location->take_focus(); // Make text selected when already focused. @@ -932,7 +917,7 @@ void UI::focus_main() */ void UI::set_status(const char *str) { - Status->value(str); + StatusOutput->value(str); } /* @@ -985,7 +970,7 @@ void UI::set_img_prog(int n_img, int t_img, int cmd) void UI::set_bug_prog(int n_bug) { char str[32]; - int new_w = 16; + int new_w = 20; if (n_bug == 0) { BugMeter->image(icons->ImgMeterOK); @@ -995,12 +980,10 @@ void UI::set_bug_prog(int n_bug) BugMeter->image(icons->ImgMeterBug); snprintf(str, 32, "%d", n_bug); BugMeter->copy_label(str); - BugMeter->redraw_label(); - new_w = strlen(str)*8 + 20; + new_w = strlen(str)*9 + 20; } - Status->resize(0,0,StatusPanel->w()-new_w,Status->h()); - BugMeter->resize(StatusPanel->w()-new_w, 0, new_w, BugMeter->h()); - StatusPanel->init_sizes(); + BugMeter->size(new_w, BugMeter->h()); + StatusBar->rearrange(); } /* @@ -1034,25 +1017,42 @@ void UI::customize(int flags) Search->hide(); if ( !prefs.show_help ) Help->hide(); - if ( !prefs.show_progress_box ) - ProgBox->hide(); + if ( !prefs.show_progress_box ) { + IProg->hide(); + PProg->hide(); + } + + if (NavBar) + NavBar->rearrange(); + if (LocBar) + LocBar->rearrange(); } /* * On-the-fly panel style change */ -void UI::panel_cb_i() +void UI::change_panel(int new_size, int small_icons) { - Group *NewPanel; - - // Create a new Panel - ++PanelSize; - NewPanel = make_panel(TopGroup->w()); - TopGroup->replace(*Panel, *NewPanel); - delete(Panel); - Panel = NewPanel; + // Remove current panel's bars + init_sizes(); + TopGroup->remove(MenuBar); + Fl::delete_widget(MenuBar); + TopGroup->remove(LocBar); + Fl::delete_widget(LocBar); + TopGroup->remove(NavBar); + Fl::delete_widget(NavBar); + MenuBar = LocBar = NavBar = NULL; + + // Set internal vars for panel size + PanelSize = new_size; + Small_Icons = small_icons; + + // make a new panel + make_panel(TopGroup->w()); customize(0); + a_UIcmd_set_buttons_sens(a_UIcmd_get_bw_by_widget(this)); + TopGroup->rearrange(); Location->take_focus(); } @@ -1069,7 +1069,6 @@ void UI::color_change_cb_i() MSG("Location color %d\n", CuteColor); Location->color(CuteColor); Location->redraw(); - HighlightButton::default_style->highlight_color(CuteColor); } /* @@ -1078,14 +1077,15 @@ void UI::color_change_cb_i() void UI::set_panelmode(UIPanelmode mode) { if (mode == UI_HIDDEN) { - Panel->hide(); - StatusPanel->hide(); + //Panel->hide(); + StatusBar->hide(); } else { /* UI_NORMAL or UI_TEMPORARILY_SHOW_PANELS */ - Panel->show(); - StatusPanel->show(); + //Panel->show(); + StatusBar->show(); } Panelmode = mode; + TopGroup->rearrange(); } /* @@ -1107,50 +1107,16 @@ void UI::panelmode_cb_i() /* * Set 'nw' as the main render area widget */ -void UI::set_render_layout(Widget &nw) +void UI::set_render_layout(Fl_Group *nw) { - // BUG: replace() is not working as it should. - // In our case, replacing the rendering area leaves the vertical - // scrollbar without events. - // - // We'll use a workaround in a_UIcmd_browser_window_new() instead. - TopGroup->replace(MainIdx, nw); - delete(Main); - Main = &nw; - //TopGroup->box(DOWN_BOX); - //TopGroup->box(BORDER_FRAME); - TopGroup->resizable(TopGroup->child(MainIdx)); -} + // Resize layout widget to current height + nw->resize(0,Main->y(),Main->w(),Main->h()); -/* - * Set the tab title - */ -void UI::set_tab_title(const char *label) -{ - char title[128]; - - dReturn_if_fail(label != NULL); - - if (*label) { - // Make a label for this tab - size_t tab_chars = 18, label_len = strlen(label); - - if (label_len > tab_chars) - tab_chars = a_Utf8_end_of_char(label, tab_chars - 1) + 1; - snprintf(title, tab_chars + 1, "%s", label); - if (label_len > tab_chars) - snprintf(title + tab_chars, 4, "..."); - // Avoid unnecessary redraws - if (strcmp(this->label(), title)) { - this->copy_label(title); - this->redraw_label(); - } - - // Disabled because of a bug in fltk::Tabgroup - //dFree(TabTooltip); - //TabTooltip = dStrdup(label); - //this->tooltip(TabTooltip); - } + TopGroup->insert(*nw, Main); + remove(Main); + delete(Main); + Main = nw; + TopGroup->resizable(Main); } /* @@ -1161,15 +1127,15 @@ void UI::button_set_sens(UIButton btn, int sens) switch (btn) { case UI_BACK: (sens) ? Back->activate() : Back->deactivate(); - Back->redraw(DAMAGE_HIGHLIGHT); +// Back->redraw(DAMAGE_HIGHLIGHT); break; case UI_FORW: (sens) ? Forw->activate() : Forw->deactivate(); - Forw->redraw(DAMAGE_HIGHLIGHT); +// Forw->redraw(DAMAGE_HIGHLIGHT); break; case UI_STOP: (sens) ? Stop->activate() : Stop->deactivate(); - Stop->redraw(DAMAGE_HIGHLIGHT); +// Stop->redraw(DAMAGE_HIGHLIGHT); break; default: break; @@ -1181,17 +1147,70 @@ void UI::button_set_sens(UIButton btn, int sens) */ void UI::paste_url() { - paste(*Clear, false); + Fl::paste(*Clear, false); } /* - * Shows or hides the findbar of this window + * Adjust space for the findbar (if necessary) and show or remove it */ -void UI::set_findbar_visibility(bool visible) +void UI::findbar_toggle(bool add) { - if (visible) { - findbar->show(); - } else { - findbar->hide(); + /* WORKAROUND: + * This is tricky: As fltk-1.3 resizes hidden widgets (which it + * doesn't resize when visible!). We need to go through hoops to + * get the desired behaviour. + * (STR#2639 in FLTK bug tracker). + */ + + if (add) { + if (!FindBarSpace) { + // show + Main->size(Main->w(), Main->h()-FindBar->h()); + insert(*FindBar, StatusBar); + FindBar->show(); + FindBarSpace = 1; + } else { + // select text + FindBar->show(); + } + } else if (!add && FindBarSpace) { + // hide + Main->size(Main->w(), Main->h()+FindBar->h()); + remove(FindBar); + FindBarSpace = 0; } + TopGroup->rearrange(); +} + +/* + * Make panels disappear growing the render area. + * WORKAROUND: here we avoid hidden widgets resize by setting their + * size to (0,0) while hidden. + * (Already reported to FLTK team) + */ +void UI::fullscreen_toggle() +{ + int hide = StatusBar->visible(); + + // hide/show panels + init_sizes(); + if (MenuBar) { + hide ? MenuBar->size(0,0) : MenuBar->size(w(),mh); + hide ? MenuBar->hide() : MenuBar->show(); + } + if (LocBar) { + hide ? LocBar->size(0,0) : LocBar->size(w(),lh); + hide ? LocBar->hide() : LocBar->show(); + } + if (NavBar) { + hide ? NavBar->size(0,0) : NavBar->size(w(),nh); + hide ? NavBar->hide() : NavBar->show(); + } + if (StatusBar) { + hide ? StatusBar->size(0,0) : StatusBar->size(w(),sh);; + hide ? StatusBar->hide() : StatusBar->show();; + StatusBar->rearrange(); + } + + TopGroup->rearrange(); } @@ -3,16 +3,13 @@ // UI for dillo -------------------------------------------------------------- -#include <fltk/Window.h> -#include <fltk/Widget.h> -#include <fltk/Button.h> -#include <fltk/Input.h> -#include <fltk/PackedGroup.h> -#include <fltk/Output.h> -#include <fltk/Image.h> -#include <fltk/MultiImage.h> -#include <fltk/MenuBuild.h> -#include <fltk/TabGroup.h> +#include <FL/Fl_Window.H> +#include <FL/Fl_Widget.H> +#include <FL/Fl_Button.H> +#include <FL/Fl_Input.H> +#include <FL/Fl_Output.H> +#include <FL/Fl_Image.H> +#include <FL/Fl_Tabs.H> #include "findbar.hh" @@ -37,41 +34,105 @@ typedef enum { // Private classes class CustProgressBox; -class CustTabGroup; +class CustTabs; + + +// Class definition ---------------------------------------------------------- +/* + * Used to reposition group's widgets when some of them are hidden. + * All children get the height of the group but retain their original width. + * The resizable child get's the remaining space. + */ +class CustGroupHorizontal : public Fl_Group { +public: + CustGroupHorizontal(int x,int y,int w ,int h,const char *l = 0) : + Fl_Group(x,y,w,h,l) { }; + + void rearrange() { + Fl_Widget*const* a = array(); + int sum = 0, _x = x(); + int children_ = children(); + + for (int i=0; i < children_; i++) + if (a[i] != resizable() && a[i]->visible()) + sum += a[i]->w(); + + for (int i=0; i < children_; i++) { + if (a[i] == resizable()) { + a[i]->resize(_x, y(), w() - sum, h()); + } else { + a[i]->resize(_x, y(), a[i]->w(), h()); + } + if (a[i]->visible()) + _x += a[i]->w(); + } + init_sizes(); + redraw(); + } +}; + +class CustGroupVertical : public Fl_Group { +public: + CustGroupVertical(int x,int y,int w ,int h,const char *l = 0) : + Fl_Group(x,y,w,h,l) { }; + + void rearrange() { + Fl_Widget*const* a = array(); + int sum = 0, _y = y(); + int children_ = children(); + + for (int i=0; i < children_; i++) + if (a[i] != resizable() && a[i]->visible()) + sum += a[i]->h(); + + for (int i=0; i < children_; i++) { + if (a[i] == resizable()) { + a[i]->resize(x(), _y, w(), h() - sum); + } else { + a[i]->resize(x(), _y, w(), a[i]->h()); + } + if (a[i]->visible()) + _y += a[i]->h(); + } + init_sizes(); + redraw(); + } +}; + // // UI class definition ------------------------------------------------------- // -class UI : public fltk::Group { - CustTabGroup *Tabs; +class UI : public CustGroupVertical { + CustTabs *Tabs; char *TabTooltip; - fltk::Group *TopGroup; - fltk::Button *Back, *Forw, *Home, *Reload, *Save, *Stop, *Bookmarks, *Tools, + CustGroupVertical *TopGroup; + Fl_Button *Back, *Forw, *Home, *Reload, *Save, *Stop, *Bookmarks, *Tools, *Clear, *Search, *Help, *FullScreen, *BugMeter, *FileButton; - fltk::Input *Location; - fltk::PackedGroup *ProgBox; + CustGroupHorizontal *MenuBar, *LocBar, *NavBar, *StatusBar; + Fl_Input *Location; CustProgressBox *PProg, *IProg; - fltk::Group *Panel, *StatusPanel; - fltk::Widget *Main; - fltk::Output *Status; + Fl_Group *Panel, *Main; + Fl_Output *StatusOutput; + Findbar *FindBar; - int MainIdx; + int FindBarSpace, MainIdx; // Panel customization variables int PanelSize, CuteColor, Small_Icons; - int xpos, bw, bh, fh, lh, lbl; + int p_xpos, p_ypos, bw, bh, mh, lh, nh, fh, sh, pw, lbl; UIPanelmode Panelmode; - Findbar *findbar; int PointerOnLink; - - fltk::PackedGroup *make_toolbar(int tw, int th); - fltk::PackedGroup *make_location(); - fltk::PackedGroup *make_progress_bars(int wide, int thin_up); + Fl_Button *make_button(const char *label, Fl_Image *img, + Fl_Image*deimg, int b_n, int start = 0); + void make_toolbar(int tw, int th); + void make_location(int ww); + void make_progress_bars(int wide, int thin_up); void make_menubar(int x, int y, int w, int h); - fltk::Widget *make_filemenu_button(); - fltk::Group *make_panel(int ww); - fltk::Group *make_status_panel(int ww); + Fl_Widget *make_filemenu_button(); + void make_panel(int ww); + void make_status_bar(int ww, int wh); public: @@ -89,24 +150,24 @@ public: void set_page_prog(size_t nbytes, int cmd); void set_img_prog(int n_img, int t_img, int cmd); void set_bug_prog(int n_bug); - void set_render_layout(Widget &nw); - void set_tab_title(const char *label); + void set_render_layout(Fl_Group *nw); void customize(int flags); void button_set_sens(UIButton btn, int sens); void paste_url(); void set_panelmode(UIPanelmode mode); UIPanelmode get_panelmode(); - void set_findbar_visibility(bool visible); - Widget *fullscreen_button() { return FullScreen; } - void fullscreen_toggle() { FullScreen->do_callback(); } - - CustTabGroup *tabs() { return Tabs; } - void tabs(CustTabGroup *tabs) { Tabs = tabs; } + int get_panelsize() { return PanelSize; } + int get_smallicons() { return Small_Icons; } + void change_panel(int new_size, int small_icons); + void findbar_toggle(bool add); + void fullscreen_toggle(); + + CustTabs *tabs() { return Tabs; } + void tabs(CustTabs *tabs) { Tabs = tabs; } int pointerOnLink() { return PointerOnLink; } void pointerOnLink(int flag) { PointerOnLink = flag; } // Hooks to method callbacks - void panel_cb_i(); void color_change_cb_i(); void toggle_cb_i(); void panelmode_cb_i(); diff --git a/src/uicmd.cc b/src/uicmd.cc index 5573db11..577e2a17 100644 --- a/src/uicmd.cc +++ b/src/uicmd.cc @@ -16,11 +16,12 @@ #include <stdarg.h> #include <math.h> /* for rint */ -#include <fltk/draw.h> -#include <fltk/damage.h> -#include <fltk/Widget.h> -#include <fltk/TabGroup.h> -#include <fltk/Tooltip.h> +#include <FL/Fl.H> +#include <FL/Fl_Widget.H> +#include <FL/Fl_Double_Window.H> +#include <FL/Fl_Wizard.H> +#include <FL/Fl_Box.H> +#include <FL/names.h> #include "paths.hh" #include "keys.hh" @@ -56,316 +57,301 @@ using namespace dw::fltk; */ static char *save_dir = NULL; -using namespace fltk; - +/* + * Forward declarations + */ +static BrowserWindow *UIcmd_tab_new(CustTabs *tabs, UI *old_ui, int focus); //---------------------------------------------------------------------------- -#define BTN_W 25 -#define BTN_H 20 -static int btn_x; +/* + * CustTabs --------------------------------------------------------------- + */ /* - * Adds a tab-close button at the rightmost part + * stores the respective UI pointer */ -class CustShrinkTabPager : public TabGroupPager { - bool btn_hl; - TabGroup *tg; +class CustTabButton : public Fl_Button { + UI *ui_; public: - int update_positions( - TabGroup *g, int numchildren, int &selected, - int &cumulated_width, int &available_width, - int *tab_pos, int *tab_width); - virtual int which(TabGroup* g, int m_x,int m_y); - virtual TabGroupPager* clone() const; - virtual const char * mode_name() const {return "Shrink";} - virtual int id() const {return PAGER_SHRINK;} - virtual int available_width(TabGroup *g) const; - virtual bool draw_tabs(TabGroup* g, int selected, int* tab_pos, - int* tab_width) { - if (!tg) tg = g; - if (g->children() > 1) { - fltk::Rectangle r(btn_x,0,BTN_W,BTN_H); - setcolor(btn_hl ? 206 : GRAY75); - fillrect(r); - if (btn_hl) { - setcolor(WHITE); - strokerect(r); - } - setcolor(GRAY10); - //fltk::setfont(fltk::getfont()->bold(), fltk::getsize()); - r.h(r.h()-2); - drawtext("X", r, ALIGN_CENTER); - return false; - } else { - // WORKAROUND: for http://fltk.org/str.php?L2062 - // By returning true we avoid a call to TabGroup::draw_tab() - // in TabGroup::draw() in case we don't show the tabs. - return true; - } - } + CustTabButton (int x,int y,int w,int h, const char* label = 0) : + Fl_Button (x,y,w,h,label) { ui_ = NULL; }; + void ui(UI *pui) { ui_ = pui; } + UI *ui(void) { return ui_; } +}; - void btn_highlight(bool flag) { - if (btn_hl != flag) { - btn_hl = flag; - if (tg) - tg->redraw(DAMAGE_VALUE); - } +/* + * Allows fine control of the tabbed interface + */ +class CustTabs : public CustGroupHorizontal { + int tab_w, tab_h, ctab_h, tab_n; + Fl_Wizard *Wizard; + int tabcolor_inactive, tabcolor_active, curtab_idx; +public: + CustTabs (int ww, int wh, int th, const char *lbl=0) : + CustGroupHorizontal(0,0,ww,th,lbl) { + tab_w = 80, tab_h = th, ctab_h = 1, tab_n = 0, curtab_idx = -1; + tabcolor_active = FL_DARK_CYAN; tabcolor_inactive = 206; + resize(0,0,ww,ctab_h); + resizable(NULL); + box(FL_FLAT_BOX); + end(); + + Wizard = new Fl_Wizard(0,ctab_h,ww,wh-ctab_h); + Wizard->box(FL_NO_BOX); + Wizard->end(); }; - bool btn_highlight() { return btn_hl; }; - - CustShrinkTabPager() : TabGroupPager() { - noclip(true); - btn_hl = false; - tg = NULL; - } + int handle(int e); + UI *add_new_tab(UI *old_ui, int focus); + void remove_tab(UI *ui); + Fl_Wizard *wizard(void) { return Wizard; } + int get_btn_idx(UI *ui); + int num_tabs() { return children(); } + void switch_tab(CustTabButton *cbtn); + void prev_tab(void); + void next_tab(void); + + void set_tab_label(UI *ui, const char *title); }; -int CustShrinkTabPager::available_width(TabGroup *g) const +/* + * Callback for mouse click + */ +static void tab_btn_cb (Fl_Widget *w, void *cb_data) { - _MSG("CustShrinkTabPager::available_width\n"); - int w = MAX (g->w() - this->slope()-1 - BTN_W, 0); - btn_x = w + 6; - return w; + CustTabButton *btn = (CustTabButton*) w; + CustTabs *tabs = (CustTabs*) cb_data; + int b = Fl::event_button(); + + if (b == FL_LEFT_MOUSE) { + tabs->switch_tab(btn); + } else if ((b == FL_RIGHT_MOUSE && prefs.right_click_closes_tab) || + (b == FL_MIDDLE_MOUSE && !prefs.right_click_closes_tab)) { + // TODO: just an example, not necessarily final + a_UIcmd_close_bw(a_UIcmd_get_bw_by_widget(btn->ui())); + } } -int CustShrinkTabPager::which(TabGroup* g, int event_x,int event_y) +int CustTabs::handle(int e) { - int H = g->tab_height(); - if (!H) return -1; - if (H < 0) { - if (event_y > g->h() || event_y < g->h()+H) return -1; - } else { - if (event_y > H || event_y < 0) return -1; - } - if (event_x < 0) return -1; - int p[128], w[128]; - int selected = g->tab_positions(p, w); - int d = (event_y-(H>=0?0:g->h()))*slope()/H; - for (int i=0; i<g->children(); i++) { - if (event_x < p[i+1]+(i<selected ? slope() - d : d)) return i; + int ret = 0; + + _MSG("CustTabs::handle e=%s\n", fl_eventnames[e]); + if (e == FL_KEYBOARD) { + return 0; // Receive as shortcut + } else if (e == FL_SHORTCUT) { + UI *ui = (UI*)wizard()->value(); + BrowserWindow *bw = a_UIcmd_get_bw_by_widget(ui); + KeysCommand_t cmd = Keys::getKeyCmd(); + if (Fl::event_key() == FL_Escape) { + // Hide findbar if present + ui->findbar_toggle(0); + ret = 1; + } else if (cmd == KEYS_NOP) { + // Do nothing + _MSG("CustTabs::handle KEYS_NOP\n"); + } else if (cmd == KEYS_NEW_TAB) { + a_UIcmd_open_url_nt(bw, NULL, 1); + ret = 1; + } else if (cmd == KEYS_CLOSE_TAB) { + a_UIcmd_close_bw(bw); + ret = 1; + } else if (cmd == KEYS_LEFT_TAB) { + prev_tab(); + ret = 1; + } else if (cmd == KEYS_RIGHT_TAB) { + next_tab(); + ret = 1; + } else if (cmd == KEYS_NEW_WINDOW) { + a_UIcmd_open_url_nw(bw, NULL); + ret = 1; + } else if (cmd == KEYS_FULLSCREEN) { + MSG("CustTabs::handle KEYS_FULLSCREEN\n"); + ret = 1; + } else if (cmd == KEYS_CLOSE_ALL) { + a_Timeout_add(0.0, a_UIcmd_close_all_bw, NULL); + ret = 1; + } } - return -1; + + return (ret) ? ret : CustGroupHorizontal::handle(e); } /* - * Prevents tabs from going over the close-tab button. - * Modified from fltk-2.0.x-r6525. + * Create a new tab with its own UI */ -int CustShrinkTabPager::update_positions( - TabGroup *g, int numchildren, int &selected, - int &cumulated_width, int &available_width, - int *tab_pos, int *tab_width) +UI *CustTabs::add_new_tab(UI *old_ui, int focus) { - available_width-=BTN_W; + char tab_label[64]; - // uh oh, they are too big, we must move them: - // special case when the selected tab itself is too big, make it fill - // cumulated_width: - int i; - - if (tab_width[selected] >= available_width) { - tab_width[selected] = available_width; - for (i = 0; i <= selected; i++) - tab_pos[i] = 0; - for (i = selected + 1; i <= numchildren; i++) - tab_pos[i] = available_width; - return selected; + if (num_tabs() == 1) { + // Show tabbar + ctab_h = tab_h; + Wizard->resize(0,ctab_h,Wizard->w(),window()->h()-ctab_h); + resize(0,0,window()->w(),ctab_h); // tabbar + child(0)->show(); // first tab button + window()->init_sizes(); } - int w2[128]; + current(0); + UI *new_ui = new UI(0,ctab_h,Wizard->w(),Wizard->h(),0,old_ui); + new_ui->tabs(this); + Wizard->add(new_ui); + new_ui->show(); + + snprintf(tab_label, 64,"ctab%d", ++tab_n); + CustTabButton *btn = new CustTabButton(num_tabs()*tab_w,0,tab_w,ctab_h); + btn->align(FL_ALIGN_INSIDE|FL_ALIGN_CLIP); + btn->copy_label(tab_label); + btn->clear_visible_focus(); + btn->box(FL_PLASTIC_ROUND_UP_BOX); + btn->color(focus ? tabcolor_active : tabcolor_inactive); + btn->ui(new_ui); + add(btn); + btn->callback(tab_btn_cb, this); - for (i = 0; i < numchildren; i++) - w2[i] = tab_width[i]; - i = numchildren - 1; - int j = 0; + if (focus) + switch_tab(btn); + if (num_tabs() == 1) + btn->hide(); + rearrange(); - int minsize = 5; + return new_ui; +} - bool right = true; +/* + * Remove tab by UI + */ +void CustTabs::remove_tab(UI *ui) +{ + CustTabButton *btn; - while (cumulated_width > available_width) { - int n; // which one to shrink + // get active tab idx + int act_idx = get_btn_idx((UI*)Wizard->value()); + // get to-be-removed tab idx + int rm_idx = get_btn_idx(ui); + btn = (CustTabButton*)child(rm_idx); - if (j < selected && (!right || i <= selected)) { // shrink a left one - n = j++; - right = true; - } else if (i > selected) { // shrink a right one - n = i--; - right = false; - } else { // no more space, start making them zero - minsize = 0; - i = numchildren - 1; - j = 0; - right = true; - continue; - } - cumulated_width -= w2[n] - minsize; - w2[n] = minsize; - if (cumulated_width < available_width) { - w2[n] = available_width - cumulated_width + minsize; - cumulated_width = available_width; - break; - } + if (act_idx == rm_idx) { + // Active tab is being closed, switch to another one + rm_idx > 0 ? prev_tab() : next_tab(); } - // re-sum the positions: - cumulated_width = 0; - for (i = 0; i < numchildren; i++) { - cumulated_width += w2[i]; - tab_pos[i+1] = cumulated_width; + remove(rm_idx); + delete btn; + rearrange(); + + Wizard->remove(ui); + delete(ui); + + if (num_tabs() == 0) { + window()->hide(); + // TODO: free memory + //delete window(); + + } else if (num_tabs() == 1) { + // hide tabbar + ctab_h = 1; + child(0)->hide(); // first tab button + resize(0,0,window()->w(),ctab_h); // tabbar + Wizard->resize(0,ctab_h,Wizard->w(),window()->h()-ctab_h); + window()->init_sizes(); + window()->redraw(); } - return selected; } -TabGroupPager* CustShrinkTabPager::clone() const { - return new CustShrinkTabPager(*this); +int CustTabs::get_btn_idx(UI *ui) +{ + for (int i = 0; i < num_tabs(); ++i) { + CustTabButton *btn = (CustTabButton*)child(i); + if (btn->ui() == ui) + return i; + } + return -1; } -//---------------------------------------------------------------------------- - /* - * For custom handling of keyboard + * Make cbtn's tab the active one */ -class CustTabGroup : public fltk::TabGroup { - Tooltip *toolTip; - bool tooltipEnabled; - bool buttonPushed; -public: - CustTabGroup (int x, int y, int ww, int wh, const char *lbl=0) : - TabGroup(x,y,ww,wh,lbl) { - // The parameter pager is cloned, so free it. - CustShrinkTabPager *cp = new CustShrinkTabPager(); - this->pager(cp); - delete cp; - toolTip = new Tooltip; - tooltipEnabled = false; - buttonPushed = false; - }; - ~CustTabGroup() { delete toolTip; } - int handle(int e) { - // Don't focus with arrow keys - _MSG("CustTabGroup::handle %d\n", e); - fltk::Rectangle r(btn_x,0,BTN_W,BTN_H); - if (e == KEY) { - int k = event_key(); - // We're only interested in some flags - unsigned modifier = event_state() & (SHIFT | CTRL | ALT); - if (k == UpKey || k == DownKey || k == TabKey) { - return 0; - } else if (k == LeftKey || k == RightKey) { - if (modifier == SHIFT) { - int i = value(); - if (k == LeftKey) {i = i ? i-1 : children()-1;} - else {i++; if (i >= children()) i = 0;} - selected_child(child(i)); - return 1; - } - // Avoid focus change. - return 0; - } - } else if (e == FOCUS_CHANGE) { - // Update the window title - BrowserWindow *bw = a_UIcmd_get_bw_by_widget(selected_child()); - const char *title = a_History_get_title(NAV_TOP_UIDX(bw), 1); - a_UIcmd_set_page_title(bw, title ? title : ""); - } else if (e == MOVE) { - CustShrinkTabPager *cstp = (CustShrinkTabPager *) pager(); - if (event_inside(r) && children() > 1) { - /* We're inside the button area */ - cstp->btn_highlight(true); - if (prefs.show_tooltip) { - /* Prepare the tooltip for pop-up */ - tooltipEnabled = true; - /* We use parent() if available because we are returning 0. - * Returning without having TabGroup processing makes the - * popup event never reach 'this', but it reaches parent() */ - toolTip->enter(parent() ?parent():this, r, "Close current Tab"); - } - return 0; // Change focus - } else { - cstp->btn_highlight(false); - - if (prefs.show_tooltip) { - /* Hide the tooltip or enable it again.*/ - if (tooltipEnabled) { - tooltipEnabled = false; - toolTip->exit(); - } else { - toolTip->enable(); - } - } - } - } else if (e == PUSH && event_inside(r) && - event_button() == 1 && children() > 1) { - buttonPushed = true; - return 1; /* non-zero */ - } else if (e == RELEASE) { - if (event_inside(r) && event_button() == 1 && - children() > 1 && buttonPushed) { - a_UIcmd_close_bw(a_UIcmd_get_bw_by_widget(selected_child())); - } else { - CustShrinkTabPager *cstp = (CustShrinkTabPager *) pager(); - cstp->btn_highlight(false); - } - buttonPushed = false; - } else if (e == DRAG) { - /* Ignore this event */ - return 1; +void CustTabs::switch_tab(CustTabButton *cbtn) +{ + int idx; + CustTabButton *btn; + BrowserWindow *bw; + UI *old_ui = (UI*)Wizard->value(); + + if (cbtn->ui() != old_ui) { + // Set old tab label to normal color + if ((idx = get_btn_idx(old_ui)) != -1) { + btn = (CustTabButton*)child(idx); + btn->color(tabcolor_inactive); + btn->redraw(); } - int ret = TabGroup::handle(e); + Wizard->value(cbtn->ui()); + cbtn->color(tabcolor_active); + cbtn->redraw(); - if (e == PUSH) { - /* WORKAROUND: FLTK raises the window on unhandled clicks, - * which we do not want. - */ - ret = 1; + // Update window title + if ((bw = a_UIcmd_get_bw_by_widget(cbtn->ui()))) { + const char *title = a_History_get_title(NAV_TOP_UIDX(bw), 1); + a_UIcmd_set_page_title(bw, title ? title : ""); } - return ret; } +} - void remove (Widget *w) { - TabGroup::remove (w); - /* fixup resizable in case we just removed it */ - if (resizable () == w) { - if (children () > 0) - resizable (child (children () - 1)); - else - resizable (NULL); - } +void CustTabs::prev_tab() +{ + int idx; - if (children () < 2) - hideLabels (); - } + if ((idx = get_btn_idx((UI*)Wizard->value())) != -1) + switch_tab( (CustTabButton*)child(idx > 0 ? idx-1 : num_tabs()-1) ); +} - void add (Widget *w) { - TabGroup::add (w); - if (children () > 1) - showLabels (); - } +void CustTabs::next_tab() +{ + int idx; - void hideLabels() { - for (int i = children () - 1; i >= 0; i--) - child(i)->resize(x(), y(), w(), h()); - } + if ((idx = get_btn_idx((UI*)Wizard->value())) != -1) + switch_tab( (CustTabButton*)child((idx+1 < num_tabs()) ? idx+1 : 0) ); +} + +/* + * Set this UI's tab button label + */ +void CustTabs::set_tab_label(UI *ui, const char *label) +{ + char title[128]; + int idx = get_btn_idx(ui); - void showLabels() { - for (int i = children () - 1; i >= 0; i--) - child(i)->resize(x(), y() + 20, w(), h() - 20); + if (idx != -1) { + // Make a label for this tab + size_t tab_chars = 7, label_len = strlen(label); + + if (label_len > tab_chars) + tab_chars = a_Utf8_end_of_char(label, tab_chars - 1) + 1; + snprintf(title, tab_chars + 1, "%s", label); + if (label_len > tab_chars) + snprintf(title + tab_chars, 4, "..."); + + // Avoid unnecessary redraws + if (strcmp(child(idx)->label(), title)) { + child(idx)->copy_label(title); + } } -}; +} + //---------------------------------------------------------------------------- -static void win_cb (fltk::Widget *w, void *cb_data) { - int choice = 0; - CustTabGroup *tabs = (CustTabGroup*) cb_data; +static void win_cb (Fl_Widget *w, void *cb_data) { + int choice = 1; + CustTabs *tabs = (CustTabs*) cb_data; - if (tabs->children () > 1) - choice = a_Dialog_choice3 ("Window contains more than one tab.", - "Close all tabs", "Cancel", NULL); - if (choice == 0) - while (tabs->children()) - a_UIcmd_close_bw(a_UIcmd_get_bw_by_widget(tabs->child(0))); + if (tabs->num_tabs() > 1) + choice = a_Dialog_choice5("Window contains more than one tab.", + "Close", "Cancel", NULL, NULL, NULL); + if (choice == 1) + while (tabs->num_tabs()) + a_UIcmd_close_bw(a_UIcmd_get_bw_by_widget(tabs->wizard()->value())); } /* @@ -376,27 +362,14 @@ BrowserWindow *a_UIcmd_get_bw_by_widget(void *v_wid) BrowserWindow *bw; for (int i = 0; i < a_Bw_num(); ++i) { bw = a_Bw_get(i); - if (((fltk::Widget*)bw->ui)->contains((fltk::Widget*)v_wid)) + if (((UI*)bw->ui)->contains((Fl_Widget*)v_wid)) { return bw; + } } return NULL; } /* - * FLTK regards SHIFT + {LeftKey, Right} as navigation keys. - * Special handling is required to override it. Here we route - * these events directly to the recipient. - * TODO: focus is not remembered correctly. - */ -void a_UIcmd_send_event_to_tabs_by_wid(int e, void *v_wid) -{ - BrowserWindow *bw = a_UIcmd_get_bw_by_widget(v_wid); - UI *ui = (UI*)bw->ui; - if (ui->tabs()) - ui->tabs()->handle(e); -} - -/* * Create a new UI and its associated BrowserWindow data structure. * Use style from v_ui. If non-NULL it must be of type UI*. */ @@ -405,7 +378,8 @@ BrowserWindow *a_UIcmd_browser_window_new(int ww, int wh, { BrowserWindow *old_bw = (BrowserWindow*)vbw; BrowserWindow *new_bw = NULL; - Window *win; + UI *old_ui = old_bw ? BW2UI(old_bw) : NULL; + Fl_Window *win; if (ww <= 0 || wh <= 0) { // Set default geometry from dillorc. @@ -415,96 +389,40 @@ BrowserWindow *a_UIcmd_browser_window_new(int ww, int wh, if (xid) win = new Xembed(xid, ww, wh); + else if (prefs.buffered_drawing != 2) + win = new Fl_Window(ww, wh); else - win = new Window(ww, wh); + win = new Fl_Double_Window(ww, wh); - win->shortcut(0); // Ignore Escape - if (prefs.buffered_drawing != 2) - win->clear_double_buffer(); - win->set_flag(RAW_LABEL); - CustTabGroup *DilloTabs = new CustTabGroup(0, 0, ww, wh); - DilloTabs->clear_tab_to_focus(); - DilloTabs->selection_color(156); - win->add(DilloTabs); + win->box(FL_NO_BOX); + CustTabs *DilloTabs = new CustTabs(ww, wh, 16); + win->end(); - // Create and set the UI - UI *new_ui = new UI(0, 0, ww, wh, DEFAULT_TAB_LABEL, - old_bw ? BW2UI(old_bw) : NULL); - new_ui->set_status("http://www.dillo.org/"); - new_ui->tabs(DilloTabs); - - DilloTabs->add(new_ui); - DilloTabs->resizable(new_ui); - DilloTabs->window()->resizable(new_ui); - DilloTabs->window()->show(); + int focus = 1; + new_bw = UIcmd_tab_new(DilloTabs, old_ui, focus); + win->resizable(BW2UI(new_bw)); + win->show(); if (old_bw == NULL && prefs.xpos >= 0 && prefs.ypos >= 0) { // position the first window according to preferences - fltk::Rectangle r; - new_ui->window()->borders(&r); - // borders() gives x and y border sizes as negative values - new_ui->window()->position(prefs.xpos - r.x(), prefs.ypos - r.y()); + DilloTabs->window()->position(prefs.xpos, prefs.ypos); } - // Now create the Dw render layout and viewport - FltkPlatform *platform = new FltkPlatform (); - Layout *layout = new Layout (platform); - style::Color *bgColor = style::Color::create (layout, prefs.bg_color); - layout->setBgColor (bgColor); - - FltkViewport *viewport = new FltkViewport (0, 0, 1, 1); - if (prefs.buffered_drawing == 1) - viewport->setBufferedDrawing (true); - else - viewport->setBufferedDrawing (false); - - layout->attachView (viewport); - new_ui->set_render_layout(*viewport); - - viewport->setScrollStep((int) rint(14.0 * prefs.font_factor)); - - // Now, create a new browser window structure - new_bw = a_Bw_new(); - - // Reference the UI from the bw - new_bw->ui = (void *)new_ui; - // Copy the layout pointer into the bw data - new_bw->render_layout = (void*)layout; - win->callback(win_cb, DilloTabs); - new_ui->focus_location(); - return new_bw; } /* - * Create a new Tab. - * i.e the new UI and its associated BrowserWindow data structure. + * Create a new Tab button, UI and its associated BrowserWindow data + * structure. */ -static BrowserWindow *UIcmd_tab_new(const void *vbw) +static BrowserWindow *UIcmd_tab_new(CustTabs *tabs, UI *old_ui, int focus) { - _MSG(" UIcmd_tab_new vbw=%p\n", vbw); - - dReturn_val_if_fail (vbw != NULL, NULL); - - BrowserWindow *new_bw = NULL; - BrowserWindow *old_bw = (BrowserWindow*)vbw; - UI *ui = BW2UI(old_bw); - - // WORKAROUND: limit the number of tabs because of a fltk bug - if (ui->tabs()->children() >= 127) - return a_UIcmd_browser_window_new(ui->window()->w(), ui->window()->h(), - 0, vbw); + _MSG(" UIcmd_tab_new\n"); // Create and set the UI - UI *new_ui = new UI(0, 0, ui->w(), ui->h(), DEFAULT_TAB_LABEL, ui); - new_ui->tabs(ui->tabs()); - - new_ui->tabs()->add(new_ui); - new_ui->tabs()->resizable(new_ui); - new_ui->tabs()->window()->resizable(new_ui); - new_ui->tabs()->window()->show(); + UI *new_ui = tabs->add_new_tab(old_ui, focus); // Now create the Dw render layout and viewport FltkPlatform *platform = new FltkPlatform (); @@ -512,21 +430,25 @@ static BrowserWindow *UIcmd_tab_new(const void *vbw) style::Color *bgColor = style::Color::create (layout, prefs.bg_color); layout->setBgColor (bgColor); - FltkViewport *viewport = new FltkViewport (0, 0, 1, 1); - + // set_render_layout() sets the proper viewport size + FltkViewport *viewport = new FltkViewport (0, 0, 0, 1); + viewport->box(FL_NO_BOX); + viewport->setBufferedDrawing (prefs.buffered_drawing ? true : false); layout->attachView (viewport); - new_ui->set_render_layout(*viewport); - - viewport->setScrollStep((int) rint(14.0 * prefs.font_factor)); + new_ui->set_render_layout(viewport); + viewport->setScrollStep((int) rint(28.0 * prefs.font_factor)); // Now, create a new browser window structure - new_bw = a_Bw_new(); + BrowserWindow *new_bw = a_Bw_new(); // Reference the UI from the bw new_bw->ui = (void *)new_ui; // Copy the layout pointer into the bw data new_bw->render_layout = (void*)layout; + // WORKAROUND: see findbar_toggle() + new_ui->findbar_toggle(0); + return new_bw; } @@ -543,15 +465,8 @@ void a_UIcmd_close_bw(void *vbw) a_Bw_stop_clients(bw, BW_Root + BW_Img + BW_Force); delete(layout); if (ui->tabs()) { - ui->tabs()->remove(ui); - ui->tabs()->value(ui->tabs()->children() - 1); - if (ui->tabs()->value() != -1) - ui->tabs()->selected_child()->take_focus(); - else - ui->tabs()->window()->hide(); + ui->tabs()->remove_tab(ui); } - delete(ui); - a_Bw_free(bw); } @@ -561,12 +476,12 @@ void a_UIcmd_close_bw(void *vbw) void a_UIcmd_close_all_bw(void *) { BrowserWindow *bw; - int choice = 0; + int choice = 1; if (a_Bw_num() > 1) - choice = a_Dialog_choice3 ("More than one open tab or Window.", - "Close all tabs and windows", "Cancel", NULL); - if (choice == 0) + choice = a_Dialog_choice5("More than one open tab or window.", + "Quit", "Cancel", NULL, NULL, NULL); + if (choice == 1) while ((bw = a_Bw_get(0))) a_UIcmd_close_bw((void*)bw); } @@ -616,10 +531,18 @@ void a_UIcmd_open_urlstr(void *vbw, const char *urlstr) */ void a_UIcmd_open_url(BrowserWindow *bw, const DilloUrl *url) { - a_Nav_push(bw, url, NULL); + if (url) { + a_Nav_push(bw, url, NULL); + } else { + // Used to start a bw with a blank screen + BW2UI(bw)->focus_location(); + a_UIcmd_set_buttons_sens(bw); + } +#if 0 if (BW2UI(bw)->get_panelmode() == UI_TEMPORARILY_SHOW_PANELS) BW2UI(bw)->set_panelmode(UI_HIDDEN); a_UIcmd_focus_main_area(bw); +#endif } static void UIcmd_open_url_nbw(BrowserWindow *new_bw, const DilloUrl *url) @@ -632,6 +555,7 @@ static void UIcmd_open_url_nbw(BrowserWindow *new_bw, const DilloUrl *url) BW2UI(new_bw)->focus_main(); } else { BW2UI(new_bw)->focus_location(); + a_UIcmd_set_buttons_sens(new_bw); } } @@ -654,11 +578,9 @@ void a_UIcmd_open_url_nw(BrowserWindow *bw, const DilloUrl *url) */ void a_UIcmd_open_url_nt(void *vbw, const DilloUrl *url, int focus) { - BrowserWindow *new_bw = UIcmd_tab_new(vbw); - - if (focus) - BW2UI(new_bw)->tabs()->selected_child(BW2UI(new_bw)); - + BrowserWindow *bw = (BrowserWindow *)vbw; + BrowserWindow *new_bw = UIcmd_tab_new(BW2UI(bw)->tabs(), + bw ? BW2UI(bw) : NULL, focus); UIcmd_open_url_nbw(new_bw, url); } @@ -1225,16 +1147,15 @@ void a_UIcmd_set_page_title(BrowserWindow *bw, const char *label) const int size = 128; char title[size]; - if (a_UIcmd_get_bw_by_widget(BW2UI(bw)->tabs()->selected_child()) == bw) { + if (a_UIcmd_get_bw_by_widget(BW2UI(bw)->tabs()->wizard()->value()) == bw) { // This is the focused bw, set window title if (snprintf(title, size, "Dillo: %s", label) >= size) { uint_t i = MIN(size - 4, 1 + a_Utf8_end_of_char(title, size - 8)); snprintf(title + i, 4, "..."); } BW2UI(bw)->window()->copy_label(title); - BW2UI(bw)->window()->redraw_label(); } - BW2UI(bw)->set_tab_title(label); + BW2UI(bw)->tabs()->set_tab_label(BW2UI(bw), label); } /* @@ -1330,6 +1251,14 @@ void a_UIcmd_findtext_reset(BrowserWindow *bw) } /* + * Tell the UI to hide/show the findbar + */ +void a_UIcmd_findbar_toggle(BrowserWindow *bw, int on) +{ + BW2UI(bw)->findbar_toggle(on); +} + +/* * Focus the rendered area. */ void a_UIcmd_focus_main_area(BrowserWindow *bw) diff --git a/src/uicmd.hh b/src/uicmd.hh index c8fea9e7..65394ff2 100644 --- a/src/uicmd.hh +++ b/src/uicmd.hh @@ -39,6 +39,7 @@ void a_UIcmd_findtext_dialog(BrowserWindow *bw); void a_UIcmd_findtext_search(BrowserWindow *bw,const char *key,int case_sens, int backwards); void a_UIcmd_findtext_reset(BrowserWindow *bw); +void a_UIcmd_findbar_toggle(BrowserWindow *bw, int on); void a_UIcmd_focus_main_area(BrowserWindow *bw); void a_UIcmd_focus_location(void *vbw); void a_UIcmd_page_popup(void *vbw, bool_t has_bugs, void *v_cssUrls); diff --git a/src/utf8.cc b/src/utf8.cc index 0138c616..a4a8504b 100644 --- a/src/utf8.cc +++ b/src/utf8.cc @@ -9,7 +9,7 @@ * (at your option) any later version. */ -#include <fltk/utf.h> +#include <FL/fl_utf8.h> #include "../dlib/dlib.h" /* TRUE/FALSE */ #include "utf8.hh" @@ -45,7 +45,7 @@ uint_t a_Utf8_end_of_char(const char *str, uint_t i) */ uint_t a_Utf8_decode(const char* str, const char* end, int* len) { - return utf8decode(str, end, len); + return fl_utf8decode(str, end, len); } /* @@ -53,7 +53,7 @@ uint_t a_Utf8_decode(const char* str, const char* end, int* len) */ int a_Utf8_encode(unsigned int ucs, char *buf) { - return utf8encode(ucs, buf); + return fl_utf8encode(ucs, buf); } /* @@ -63,7 +63,7 @@ int a_Utf8_encode(unsigned int ucs, char *buf) */ int a_Utf8_test(const char* src, unsigned int srclen) { - return utf8test(src, srclen); + return fl_utf8test(src, srclen); } /* diff --git a/src/xembed.cc b/src/xembed.cc index 04a4362a..f180d81d 100644 --- a/src/xembed.cc +++ b/src/xembed.cc @@ -12,14 +12,14 @@ #include <string.h> #include <ctype.h> -#include <fltk/Window.h> -#include <fltk/run.h> -#include <fltk/events.h> -#include <fltk/x.h> +#define FL_INTERNALS +#include <FL/Fl_Window.H> +#include <FL/Fl.H> +#include <FL/x.H> #include "xembed.hh" -#if USE_X11 +#ifdef X_PROTOCOL typedef enum { XEMBED_EMBEDDED_NOTIFY = 0, @@ -41,12 +41,12 @@ Xembed::setXembedInfo(unsigned long flags) { unsigned long buffer[2]; - Atom xembed_info_atom = XInternAtom (fltk::xdisplay, "_XEMBED_INFO", false); + Atom xembed_info_atom = XInternAtom (fl_display, "_XEMBED_INFO", false); buffer[0] = 1; buffer[1] = flags; - XChangeProperty (fltk::xdisplay, + XChangeProperty (fl_display, xid, xembed_info_atom, xembed_info_atom, 32, PropModeReplace, @@ -60,35 +60,36 @@ Xembed::sendXembedEvent(uint32_t message) { memset (&xclient, 0, sizeof (xclient)); xclient.window = xid; xclient.type = ClientMessage; - xclient.message_type = XInternAtom (fltk::xdisplay, "_XEMBED", false); + xclient.message_type = XInternAtom (fl_display, "_XEMBED", false); xclient.format = 32; - xclient.data.l[0] = fltk::event_time; + xclient.data.l[0] = fl_event_time; xclient.data.l[1] = message; - XSendEvent(fltk::xdisplay, xid, False, NoEventMask, (XEvent *)&xclient); - XSync(fltk::xdisplay, False); + XSendEvent(fl_display, xid, False, NoEventMask, (XEvent *)&xclient); + XSync(fl_display, False); } int Xembed::handle(int e) { - if (e == fltk::PUSH) + if (e == FL_PUSH) sendXembedEvent(XEMBED_REQUEST_FOCUS); - return Window::handle(e); + return Fl_Window::handle(e); } -static int event_handler(int e, fltk::Window *w) { - Atom xembed_atom = XInternAtom (fltk::xdisplay, "_XEMBED", false); +static int event_handler(int e, Fl_Window *w) { + Atom xembed_atom = XInternAtom (fl_display, "_XEMBED", false); - if (fltk::xevent.type == ClientMessage) { - if (fltk::xevent.xclient.message_type == xembed_atom) { - long message = fltk::xevent.xclient.data.l[1]; + if (fl_xevent->type == ClientMessage) { + if (fl_xevent->xclient.message_type == xembed_atom) { + long message = fl_xevent->xclient.data.l[1]; switch (message) { case XEMBED_WINDOW_ACTIVATE: // Force a ConfigureNotify message so fltk can get the new // coordinates after a move of the embedder window. - w->resize(0, 0, w->w(), w->h()); + if (w) + w->resize(0,0, w->w(), w->h()); break; case XEMBED_WINDOW_DEACTIVATE: break; @@ -98,20 +99,20 @@ static int event_handler(int e, fltk::Window *w) { } } - return 0; + return Fl::handle_(e, w); } // TODO: Implement more XEMBED support; -void Xembed::create() { +void Xembed::show() { createInternal(xid); setXembedInfo(1); - fltk::add_event_handler(event_handler); + Fl::event_dispatch(event_handler); } void Xembed::createInternal(uint32_t parent) { - fltk::Window *window = this; - Colormap colormap = fltk::xcolormap; + Fl_Window *window = this; + Colormap colormap = fl_colormap; XSetWindowAttributes attr; attr.border_pixel = 0; @@ -133,18 +134,18 @@ void Xembed::createInternal(uint32_t parent) { | EnterWindowMask | LeaveWindowMask | PointerMotionMask; - fltk::CreatedWindow::set_xid(window, - XCreateWindow(fltk::xdisplay, + Fl_X::set_xid(window, + XCreateWindow(fl_display, parent, X, Y, W, H, 0, // borderwidth - fltk::xvisual->depth, + fl_visual->depth, InputOutput, - fltk::xvisual->visual, + fl_visual->visual, mask, &attr)); } -#else // USE_X11 +#else // X_PROTOCOL void Xembed::setXembedInfo(unsigned long flags) {}; @@ -154,12 +155,12 @@ Xembed::sendXembedEvent(uint32_t message) {}; int Xembed::handle(int e) { - return Window::handle(e); + return Fl_Window::handle(e); } void -Xembed::create() { - Window::create(); +Xembed::show() { + Fl_Window::show(); } #endif diff --git a/src/xembed.hh b/src/xembed.hh index 70d79c5f..d7663c8e 100644 --- a/src/xembed.hh +++ b/src/xembed.hh @@ -1,11 +1,11 @@ #ifndef __XEMBED_HH__ #define __XEMBED_HH__ -#include <fltk/Window.h> +#include <FL/Fl_Window.H> #include "d_size.h" -class Xembed : public fltk::Window { +class Xembed : public Fl_Window { private: uint32_t xid; void createInternal(uint32_t parent); @@ -13,10 +13,10 @@ class Xembed : public fltk::Window { void sendXembedEvent(uint32_t message); public: - Xembed(uint32_t xid, int _w, int _h) : fltk::Window(_w, _h) { + Xembed(uint32_t xid, int _w, int _h) : Fl_Window(_w, _h) { this->xid = xid; }; - void create(); + void show(); int handle(int event); }; diff --git a/test/dw_anchors_test.cc b/test/dw_anchors_test.cc index 977d724a..e5fcdbf2 100644 --- a/test/dw_anchors_test.cc +++ b/test/dw_anchors_test.cc @@ -20,8 +20,8 @@ #include <ctype.h> -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl_Window.H> +#include <FL/Fl.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -36,7 +36,7 @@ using namespace dw::fltk; static FltkPlatform *platform; static Layout *layout; -static ::fltk::Window *window; +static Fl_Window *window; static FltkViewport *viewport; static Style *topWidgetStyle, *widgetStyle, *wordStyle, *headingStyle; static Textblock *topTextblock = NULL; @@ -47,7 +47,7 @@ static const char *numbers[10] = { "six", "seven", "eight", "nine", "ten" }; -static void anchorCallback (::fltk::Widget *widget, void *data) +static void anchorCallback (Fl_Widget *widget, void *data) { layout->setAnchor (numbers[(long)data]); } @@ -87,7 +87,7 @@ static void textTimeout (void *data) textblockNo++; if (textblockNo < 10) - ::fltk::repeat_timeout (1, textTimeout, NULL); + Fl::repeat_timeout (1, textTimeout, NULL); } @@ -98,10 +98,12 @@ int main(int argc, char **argv) platform = new FltkPlatform (); layout = new Layout (platform); - window = new ::fltk::Window(250, 200, "Dw Anchors Test"); + window = new Fl_Window(250, 200, "Dw Anchors Test"); + window->box(FL_NO_BOX); window->begin(); viewport = new FltkViewport (50, 0, 200, 200); + viewport->end(); layout->attachView (viewport); for (int i = 0; i < 10; i++) { @@ -109,10 +111,9 @@ int main(int argc, char **argv) strcpy (buf, numbers[i]); buf[0] = toupper (buf[0]); buttonLabel[i] = strdup(buf); - ::fltk::Button *button = - new ::fltk::Button(0, 20 * i, 50, 20, buttonLabel[i]); + Fl_Button *button = new Fl_Button(0, 20 * i, 50, 20, buttonLabel[i]); button->callback (anchorCallback, (void*)i); - button->when (::fltk::WHEN_RELEASE); + button->when (FL_WHEN_RELEASE); } FontAttrs fontAttrs; @@ -121,10 +122,11 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; StyleAttrs styleAttrs; styleAttrs.initValues (); - styleAttrs.font = Font::create (layout, &fontAttrs); + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.margin.setVal (5); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -140,22 +142,22 @@ int main(int argc, char **argv) fontAttrs.size = 28; fontAttrs.weight = 700; - styleAttrs.font = Font::create (layout, &fontAttrs); + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); headingStyle = Style::create (layout, &styleAttrs); - ::fltk::add_timeout (0, textTimeout, NULL); + Fl::add_timeout (0, textTimeout, NULL); window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); topWidgetStyle->unref (); widgetStyle->unref (); wordStyle->unref (); headingStyle->unref (); for (int i = 0; i < 10; i++) - delete buttonLabel[i]; + free(buttonLabel[i]); delete layout; return errorCode; diff --git a/test/dw_border_test.cc b/test/dw_border_test.cc index b7586608..988abc33 100644 --- a/test/dw_border_test.cc +++ b/test/dw_border_test.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl_Window.H> +#include <FL/Fl.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -38,7 +38,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(200, 300, "Dw Border Test"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Border Test"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 200, 300); @@ -58,7 +59,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -115,7 +117,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); widgetStyle2->unref(); wordStyle->unref(); diff --git a/test/dw_example.cc b/test/dw_example.cc index 1ce643f8..52aa2440 100644 --- a/test/dw_example.cc +++ b/test/dw_example.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl_Window.H> +#include <FL/Fl.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -33,7 +33,8 @@ int main(int argc, char **argv) dw::fltk::FltkPlatform *platform = new dw::fltk::FltkPlatform (); dw::core::Layout *layout = new dw::core::Layout (platform); - fltk::Window *window = new fltk::Window(200, 300, "Dw Example"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Example"); + window->box(FL_NO_BOX); window->begin(); dw::fltk::FltkViewport *viewport = @@ -50,6 +51,7 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = dw::core::style::FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; + fontAttrs.fontVariant = dw::core::style::FONT_VARIANT_NORMAL; styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = @@ -95,7 +97,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_find_test.cc b/test/dw_find_test.cc index a0743754..e5c79fd3 100644 --- a/test/dw_find_test.cc +++ b/test/dw_find_test.cc @@ -19,9 +19,9 @@ -#include <fltk/Window.h> -#include <fltk/run.h> - +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <FL/Fl_Box.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" #include "../dw/fltkviewport.hh" @@ -35,12 +35,12 @@ using namespace dw::fltk; static FltkPlatform *platform; static Layout *layout; -static ::fltk::Window *window; +static Fl_Window *window; static FltkViewport *viewport; -static ::fltk::Button *findButton, *resetButton; -static ::fltk::Widget *resultLabel; +static Fl_Button *findButton, *resetButton; +static Fl_Widget *resultLabel; -static void findCallback (::fltk::Widget *widget, void *data) +static void findCallback (Fl_Widget *widget, void *data) { //switch(layout->search ("worm", true)) { switch(layout->search ("WORM", false, false)) { @@ -60,7 +60,7 @@ static void findCallback (::fltk::Widget *widget, void *data) resultLabel->redraw (); } -static void resetCallback (::fltk::Widget *widget, void *data) +static void resetCallback (Fl_Widget *widget, void *data) { layout->resetSearch (); resultLabel->label("---"); @@ -72,21 +72,26 @@ int main(int argc, char **argv) platform = new FltkPlatform (); layout = new Layout (platform); - window = new ::fltk::Window(200, 300, "Dw Find Test"); + window = new Fl_Window(200, 300, "Dw Find Test"); + window->box(FL_NO_BOX); window->begin(); viewport = new FltkViewport (0, 0, 200, 280); + viewport->end(); layout->attachView (viewport); - findButton = new ::fltk::Button(0, 280, 50, 20, "Find"); + findButton = new Fl_Button(0, 280, 50, 20, "Find"); findButton->callback (findCallback, NULL); - findButton->when (::fltk::WHEN_RELEASE); + findButton->when (FL_WHEN_RELEASE); + findButton->clear_visible_focus (); - resetButton = new ::fltk::Button(50, 280, 50, 20, "Reset"); + resetButton = new Fl_Button(50, 280, 50, 20, "Reset"); resetButton->callback (resetCallback, NULL); - resetButton->when (::fltk::WHEN_RELEASE); + resetButton->when (FL_WHEN_RELEASE); + resetButton->clear_visible_focus (); - resultLabel = new ::fltk::Widget(100, 280, 100, 20, "---"); + resultLabel = new Fl_Box(100, 280, 100, 20, "---"); + resultLabel->box(FL_FLAT_BOX); FontAttrs fontAttrs; fontAttrs.name = "Bitstream Charter"; @@ -94,10 +99,11 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; StyleAttrs styleAttrs; styleAttrs.initValues (); - styleAttrs.font = Font::create (layout, &fontAttrs); + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.margin.setVal (10); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -143,7 +149,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_images_scaled.cc b/test/dw_images_scaled.cc index c9f6e76e..2f8896e6 100644 --- a/test/dw_images_scaled.cc +++ b/test/dw_images_scaled.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -87,7 +87,7 @@ static void imageDrawTimeout (void *data) } if(imgRow < 200) - ::fltk::repeat_timeout (0.5, imageDrawTimeout, NULL); + Fl::repeat_timeout (0.5, imageDrawTimeout, NULL); } int main(int argc, char **argv) @@ -95,7 +95,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(410, 210, "Dw Scaled Image"); + Fl_Window *window = new Fl_Window(410, 210, "Dw Scaled Image"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 410, 210); @@ -113,7 +114,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -142,10 +144,10 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - ::fltk::add_timeout (2.0, imageInitTimeout, NULL); - ::fltk::add_timeout (0.1, imageDrawTimeout, NULL); + Fl::add_timeout (2.0, imageInitTimeout, NULL); + Fl::add_timeout (0.1, imageDrawTimeout, NULL); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_images_scaled2.cc b/test/dw_images_scaled2.cc index 175ef414..b436ec94 100644 --- a/test/dw_images_scaled2.cc +++ b/test/dw_images_scaled2.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -64,7 +64,7 @@ static void imageDrawTimeout (void *data) } if(imgRow < 200) - ::fltk::repeat_timeout (0.5, imageDrawTimeout, NULL); + Fl::repeat_timeout (0.5, imageDrawTimeout, NULL); } int main(int argc, char **argv) @@ -72,7 +72,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(410, 210, "Dw Scaled Image 2"); + Fl_Window *window = new Fl_Window(410, 210, "Dw Scaled Image 2"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 410, 210); @@ -88,7 +89,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -137,10 +139,10 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - ::fltk::add_timeout (3.0, imageInitTimeout, NULL); - ::fltk::add_timeout (0.1, imageDrawTimeout, NULL); + Fl::add_timeout (3.0, imageInitTimeout, NULL); + Fl::add_timeout (0.1, imageDrawTimeout, NULL); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_images_simple.cc b/test/dw_images_simple.cc index 39b7ed90..8f00f847 100644 --- a/test/dw_images_simple.cc +++ b/test/dw_images_simple.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -66,7 +66,7 @@ static void imageDrawTimeout (void *data) } if(imgRow < 200) - ::fltk::repeat_timeout (0.5, imageDrawTimeout, NULL); + Fl::repeat_timeout (0.5, imageDrawTimeout, NULL); } */ @@ -88,7 +88,7 @@ static void imageDrawTimeout (void *data) } if(imgRow < 200) - ::fltk::repeat_timeout (0.5, imageDrawTimeout, NULL); + Fl::repeat_timeout (0.5, imageDrawTimeout, NULL); } int main(int argc, char **argv) @@ -96,7 +96,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(410, 210, "Dw Simple Image"); + Fl_Window *window = new Fl_Window(410, 210, "Dw Simple Image"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 410, 210); @@ -112,7 +113,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -141,10 +143,10 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - ::fltk::add_timeout (2.0, imageInitTimeout, NULL); - ::fltk::add_timeout (0.1, imageDrawTimeout, NULL); + Fl::add_timeout (2.0, imageInitTimeout, NULL); + Fl::add_timeout (0.1, imageDrawTimeout, NULL); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_imgbuf_mem_test.cc b/test/dw_imgbuf_mem_test.cc index 33131134..45beef8b 100644 --- a/test/dw_imgbuf_mem_test.cc +++ b/test/dw_imgbuf_mem_test.cc @@ -17,11 +17,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - - -#include <fltk/Window.h> -#include <fltk/run.h> - #include "../dw/core.hh" #include "../dw/fltkcore.hh" diff --git a/test/dw_links.cc b/test/dw_links.cc index 44628b28..5622cbd5 100644 --- a/test/dw_links.cc +++ b/test/dw_links.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -76,7 +76,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(200, 300, "Dw Links"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Links"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 200, 300); @@ -92,7 +93,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -153,7 +155,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_links2.cc b/test/dw_links2.cc index 294950af..b8e8c55b 100644 --- a/test/dw_links2.cc +++ b/test/dw_links2.cc @@ -19,8 +19,9 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <FL/Fl_Box.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -78,22 +79,23 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(200, 300, "Dw Links2"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Links2"); + window->box(FL_NO_BOX); window->begin(); - ::fltk::Widget *Panel = new ::fltk::Widget(0, 0, ww, lh, "CONTROL PANEL"); - - Panel->color(::fltk::GRAY15); - Panel->labelcolor(::fltk::WHITE); - ::fltk::Widget *Main = - new ::fltk::Widget(0, lh, ww, wh - 2*lh, "MAIN RENDERING AREA"); - Main->color(::fltk::GRAY20); - Main->labelcolor(::fltk::WHITE); + Fl_Widget *Panel = new Fl_Box(0, 0, ww, lh, "CONTROL PANEL"); + + Panel->color(FL_GRAY_RAMP + 3); + Panel->labelcolor(FL_WHITE); + Panel->box(FL_FLAT_BOX); + Fl_Widget *Main = new Fl_Box(0, lh, ww, wh - 2*lh, "MAIN RENDERING AREA"); + Main->color(FL_GRAY_RAMP + 4); + Main->labelcolor(FL_WHITE); MainIdx = window->find(Main); /* status bar */ - ::fltk::Widget *Bar = - new ::fltk::Widget(0, wh - lh, 200, lh, "STATUS BAR..."); - Bar->color(::fltk::GRAY15); - Bar->labelcolor(::fltk::WHITE); + Fl_Widget *Bar = new Fl_Box(0, wh - lh, 200, lh, "STATUS BAR..."); + Bar->color(FL_GRAY_RAMP + 3); + Bar->labelcolor(FL_WHITE); + Bar->box(FL_FLAT_BOX); window->resizable(Main); window->end(); @@ -120,7 +122,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -181,7 +184,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_lists.cc b/test/dw_lists.cc index 2725c34d..12fa1627 100644 --- a/test/dw_lists.cc +++ b/test/dw_lists.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -38,7 +38,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(200, 300, "Dw Lists"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Lists"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 200, 300); @@ -54,7 +55,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -126,7 +128,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_resource_test.cc b/test/dw_resource_test.cc index 28611bb0..a2a26c62 100644 --- a/test/dw_resource_test.cc +++ b/test/dw_resource_test.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -39,7 +39,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(410, 210, "Dw Resource test"); + Fl_Window *window = new Fl_Window(410, 210, "Dw Resource test"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 410, 210); @@ -55,7 +56,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xffffff); @@ -71,6 +73,8 @@ int main(int argc, char **argv) styleAttrs.margin.setVal (0); styleAttrs.backgroundColor = NULL; + widgetStyle = Style::create (layout, &styleAttrs); + SelectionResource *res = layout->getResourceFactory()->createListResource (ListResource::SELECTION_AT_MOST_ONE, 4); //SelectionResource *res = @@ -83,14 +87,14 @@ int main(int argc, char **argv) widgetStyle->unref(); for(int i = 0; i < 50; i++) - res->addItem ("Hello, world!", true, false); + res->addItem ("Hello, world!", true, i == 0 ? true : false); textblock->flush (); window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_table.cc b/test/dw_table.cc index b0e9c4db..75842e60 100644 --- a/test/dw_table.cc +++ b/test/dw_table.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -38,7 +38,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(300, 300, "Dw Table"); + Fl_Window *window = new Fl_Window(300, 300, "Dw Table"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 300, 300); @@ -62,7 +63,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); Style *tableStyle = Style::create (layout, &styleAttrs); @@ -107,7 +109,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_table_aligned.cc b/test/dw_table_aligned.cc index 67cf21f3..022e7026 100644 --- a/test/dw_table_aligned.cc +++ b/test/dw_table_aligned.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -38,7 +38,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(200, 300, "Dw Table Aligned"); + Fl_Window *window = new Fl_Window(200, 300, "Dw Table Aligned"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 200, 300); @@ -57,7 +58,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); styleAttrs.color = Color::create (layout, 0x000000); styleAttrs.backgroundColor = Color::create (layout, 0xa0a0a0); @@ -111,7 +113,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete layout; diff --git a/test/dw_ui_test.cc b/test/dw_ui_test.cc index 2bc35893..60893f06 100644 --- a/test/dw_ui_test.cc +++ b/test/dw_ui_test.cc @@ -19,8 +19,8 @@ -#include <fltk/Window.h> -#include <fltk/run.h> +#include <FL/Fl.H> +#include <FL/Fl_Window.H> #include "../dw/core.hh" #include "../dw/fltkcore.hh" @@ -43,7 +43,8 @@ int main(int argc, char **argv) FltkPlatform *platform = new FltkPlatform (); Layout *layout = new Layout (platform); - ::fltk::Window *window = new ::fltk::Window(400, 400, "Dw UI Test"); + Fl_Window *window = new Fl_Window(400, 400, "Dw UI Test"); + window->box(FL_NO_BOX); window->begin(); FltkViewport *viewport = new FltkViewport (0, 0, 400, 400); @@ -61,7 +62,8 @@ int main(int argc, char **argv) fontAttrs.weight = 400; fontAttrs.style = FONT_STYLE_NORMAL; fontAttrs.letterSpacing = 0; - styleAttrs.font = Font::create (layout, &fontAttrs); + fontAttrs.fontVariant = FONT_VARIANT_NORMAL; + styleAttrs.font = dw::core::style::Font::create (layout, &fontAttrs); Style *tableStyle = Style::create (layout, &styleAttrs); @@ -119,7 +121,7 @@ int main(int argc, char **argv) const char *radiovalues[] = { "radio1", "radio2", NULL }; form->addRadioButtonResource ("val3", radiores1, radiovalues); form->addCheckButtonResource ("check", checkres); - const char *selvalues[] = { "i1", "i11", "i12", "i13", "i2", + const char *selvalues[] = { "i1", "g1", "i11", "i12", "i13", "i2", "g2", "i21", "i22", "i23", "i3", NULL }; form->addSelectionResource ("val4", selres[0], selvalues); form->addSelectionResource ("val5", selres[1], selvalues); @@ -207,9 +209,9 @@ int main(int argc, char **argv) selres[i]->addItem("item 1/3", false, false); selres[i]->popGroup(); - selres[i]->addItem("item 2", true, i == 1); + selres[i]->addItem("item 2", false, i == 1); - selres[i]->pushGroup("group 2", false); + selres[i]->pushGroup("group 2", true); selres[i]->addItem("item 2/1", true, false); selres[i]->addItem("item 2/2", true, false); selres[i]->addItem("item 2/3", false, false); @@ -232,7 +234,7 @@ int main(int argc, char **argv) window->resizable(viewport); window->show(); - int errorCode = ::fltk::run(); + int errorCode = Fl::run(); delete form; delete layout; diff --git a/test/fltk_browser.cc b/test/fltk_browser.cc index 11dfcbeb..bdbec72c 100644 --- a/test/fltk_browser.cc +++ b/test/fltk_browser.cc @@ -19,28 +19,25 @@ -#include <fltk/Window.h> -#include <fltk/Browser.h> -#include <fltk/MultiBrowser.h> -#include <fltk/Item.h> -#include <fltk/run.h> - -using namespace fltk; +#include <FL/Fl_Window.H> +#include <FL/Fl_Multi_Browser.H> +#include <FL/Fl.H> int main (int argc, char *argv[]) { - Window *window = new Window (300, 300, "FLTK Browser"); + Fl_Window *window = new Fl_Window (300, 300, "FLTK Browser"); + window->box(FL_NO_BOX); window->begin (); - Browser *browser = new MultiBrowser (0, 0, 300, 300); + Fl_Multi_Browser *browser = new Fl_Multi_Browser (0, 0, 300, 300); browser->begin (); for (int i = 0; i < 10; i++) { - new Item ("first"); - new Item ("second"); - new Item ("third"); + browser->add("first"); + browser->add("second"); + browser->add("third"); } window->resizable(browser); window->show(); - return run(); + return Fl::run(); } diff --git a/test/form.cc b/test/form.cc index 4bebd520..82938a16 100644 --- a/test/form.cc +++ b/test/form.cc @@ -32,7 +32,7 @@ Form::ResourceDecorator::ResourceDecorator (const char *name) Form::ResourceDecorator::~ResourceDecorator () { - delete name; + free((char *)name); } Form::TextResourceDecorator::TextResourceDecorator (const char *name, @@ -57,15 +57,15 @@ Form::RadioButtonResourceDecorator::RadioButtonResourceDecorator while (values[n]) n++; this->values = new const char*[n + 1]; - for(int i = 0; i < n; i++) + for (int i = 0; i < n; i++) this->values[i] = strdup (values[i]); this->values[n] = 0; } Form::RadioButtonResourceDecorator::~RadioButtonResourceDecorator () { - for(int i = 0; values[i]; i++) - delete values[i]; + for (int i = 0; values[i]; i++) + free((char *)values[i]); delete[] values; } @@ -115,7 +115,7 @@ Form::SelectionResourceDecorator::SelectionResourceDecorator Form::SelectionResourceDecorator::~SelectionResourceDecorator () { for(int i = 0; values[i]; i++) - delete values[i]; + free((char *)values[i]); delete[] values; } @@ -159,8 +159,8 @@ Form::FormClickedReceiver::FormClickedReceiver (Form *form, const char *name, Form::FormClickedReceiver::~FormClickedReceiver () { - delete name; - delete[] value; + free((char *)name); + free((char *)value); } void Form::FormClickedReceiver::clicked (Resource *resource, |