diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2021-11-18 13:44:41 +0100 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2021-11-18 13:44:41 +0100 |
| commit | 0bc06e8f1a73e3df7f4173de90faaf5ecbd05297 (patch) | |
| tree | 207a311f9a51b7c577d8a5d02de695add215bc78 /test/clipboard.cxx | |
| parent | 4a2833b10447749ec626f2b26b32a0c24a38ca09 (diff) | |
Reformat and move clipboard demo from examples to test folder
The clipboard demo is more a test program than an example and very
useful even if the examples are not built.
Also update dependencies.
Diffstat (limited to 'test/clipboard.cxx')
| -rw-r--r-- | test/clipboard.cxx | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/test/clipboard.cxx b/test/clipboard.cxx new file mode 100644 index 000000000..50e1f25ab --- /dev/null +++ b/test/clipboard.cxx @@ -0,0 +1,180 @@ +// +// Clipboard display test application for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2021 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please see the following page on how to report bugs and issues: +// +// https://www.fltk.org/bugs.php +// + +#include <FL/Fl.H> +#include <FL/Fl_Window.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_Image.H> +#include <FL/Fl_Shared_Image.H> +#include <FL/Fl_Text_Buffer.H> +#include <FL/Fl_Text_Display.H> +#include <FL/Fl_Tabs.H> +#include <FL/Fl_Button.H> +#include <FL/fl_draw.H> +#ifdef _WIN32 +#include <windows.h> +#endif // _WIN32 + +/* Displays and follows the content of the clipboard with either image or text data + */ + +Fl_Box *image_box; +Fl_Box *image_size; +Fl_Text_Display *display; + +inline int fl_min(int a, int b) { + return (a < b ? a : b); +} + +// a box with a chess-like pattern below its image +class chess : public Fl_Box { +public: + chess(int x, int y, int w, int h) + : Fl_Box(FL_FLAT_BOX, x, y, w, h, 0) { + align(FL_ALIGN_CENTER | FL_ALIGN_CLIP); + } + void draw() { + draw_box(); + Fl_Image *im = image(); + if (im) { // draw the chess pattern below the box centered image + int X = x() + (w() - im->w()) / 2, Y = y() + (h() - im->h()) / 2, W = im->w(), H = im->h(); + fl_push_clip(X, Y, W, H); + fl_push_clip(x(), y(), w(), h()); + fl_color(FL_WHITE); + fl_rectf(X, Y, W, H); + fl_color(FL_LIGHT2); + const int side = 4, side2 = 2 * side; + for (int j = Y; j < Y + H; j += side) { + for (int i = X + (j - Y) % side2; i < X + W; i += side2) { + fl_rectf(i, j, side, side); + } + } + fl_pop_clip(); + fl_pop_clip(); + } + draw_label(); // draw the box image + } +}; + +#define TAB_COLOR FL_DARK3 + +// use tabs to display either the image or textual content of the clipboard +class clipboard_viewer : public Fl_Tabs { +public: + clipboard_viewer(int x, int y, int w, int h) + : Fl_Tabs(x, y, w, h) {} + virtual int handle(int event) { + if (event != FL_PASTE) + return Fl_Tabs::handle(event); + if (strcmp(Fl::event_clipboard_type(), Fl::clipboard_image) == 0) { // an image is being pasted + Fl_RGB_Image *im = (Fl_RGB_Image *)Fl::event_clipboard(); // get it as an Fl_RGB_Image object + if (!im) + return 1; + char title[300]; + sprintf(title, "%dx%d", im->w(), im->h()); // display the image original size +#ifdef _WIN32 + OpenClipboard(NULL); // display extra technical info about clipboard content + char *p = title + strlen(title); + int format = EnumClipboardFormats(0); + if (format && format < CF_MAX) { + sprintf(p, " %d", format); + p += strlen(p); + } + while (format) { + format = EnumClipboardFormats(format); + if (format && format < CF_MAX) { + sprintf(p, " %d", format); + p += strlen(p); + } + } + HANDLE h; + if ((h = GetClipboardData(CF_DIB))) { + LPBITMAPINFO lpBI = (LPBITMAPINFO)GlobalLock(h); + sprintf(p, " biBitCount=%d biCompression=%d biClrUsed=%d", lpBI->bmiHeader.biBitCount, + (int)lpBI->bmiHeader.biCompression, (int)lpBI->bmiHeader.biClrUsed); + } + CloseClipboard(); +#endif + Fl_Image *oldimg = image_box->image(); + delete oldimg; + if (im->w() > image_box->w() || im->h() > image_box->h()) + im->scale(image_box->w(), image_box->h()); + image_box->image(im); // show the scaled image + image_size->copy_label(title); + value(image_box->parent()); + window()->redraw(); + } else { // text is being pasted + display->buffer()->text(Fl::event_text()); + value(display); + display->redraw(); + } + return 1; + } +}; + +// global variables +// chess *chess_obj; + +clipboard_viewer *tabs; + + +void cb(Fl_Widget *wid, clipboard_viewer *tabs) { + if (Fl::clipboard_contains(Fl::clipboard_image)) { + Fl::paste(*tabs, 1, Fl::clipboard_image); // try to find image in the clipboard + return; + } + if (Fl::clipboard_contains(Fl::clipboard_plain_text)) + Fl::paste(*tabs, 1, Fl::clipboard_plain_text); // also try to find text +} + +void clip_callback(int source, void *data) { // called after clipboard was changed or at application activation + if (source == 1) + cb(NULL, (clipboard_viewer *)data); +} + +int main(int argc, char **argv) { + fl_register_images(); // required for the X11 platform to allow pasting of images + Fl_Window *win = new Fl_Window(500, 550, "clipboard viewer"); + tabs = new clipboard_viewer(0, 0, 500, 500); + Fl_Group *g = new Fl_Group(5, 30, 490, 460, Fl::clipboard_image); // g will display the image form + g->box(FL_FLAT_BOX); + image_box = new chess(5, 30, 490, 450); + image_size = new Fl_Box(FL_NO_BOX, 5, 485, 490, 10, 0); + g->end(); + g->selection_color(TAB_COLOR); + + Fl_Text_Buffer *buffer = new Fl_Text_Buffer(); + display = new Fl_Text_Display(5, 30, 490, 460, Fl::clipboard_plain_text); // display will display the text form + display->buffer(buffer); + display->selection_color(TAB_COLOR); + tabs->end(); + tabs->resizable(display); + + Fl_Group *g2 = new Fl_Group(10, 510, 200, 25); + Fl_Button *refresh = new Fl_Button(10, 510, 200, 25, "Refresh from clipboard"); + refresh->callback((Fl_Callback *)cb, tabs); + g2->end(); + g2->resizable(NULL); + win->end(); + win->resizable(tabs); + win->show(argc, argv); + clip_callback(1, tabs); // use clipboard content at start + Fl::add_clipboard_notify(clip_callback, + tabs); // will update with new clipboard content immediately or at application activation + + Fl_Image::RGB_scaling(FL_RGB_SCALING_BILINEAR); // set bilinear image scaling method + return Fl::run(); +} |
