From e4b0668fad36fe28497cf5fa9242e92b0865c90f Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Sat, 27 Apr 2024 08:13:17 +0200 Subject: X11: simpler code to capture window decoration under xfce --- src/drivers/X11/Fl_X11_Screen_Driver.cxx | 5 ++++- src/drivers/X11/Fl_X11_Window_Driver.cxx | 19 ++----------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/drivers/X11/Fl_X11_Screen_Driver.cxx b/src/drivers/X11/Fl_X11_Screen_Driver.cxx index 02ab347b2..fffce8d35 100644 --- a/src/drivers/X11/Fl_X11_Screen_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Screen_Driver.cxx @@ -640,6 +640,10 @@ extern "C" { } } + +// When capturing window decoration, w is negative and X,Y,w and h are in pixels; +// otherwise X,Y,w and h are in FLTK units. +// Fl_RGB_Image *Fl_X11_Screen_Driver::read_win_rectangle(int X, int Y, int w, int h, Fl_Window *win, bool may_capture_subwins, bool *did_capture_subwins) { XImage *image; // Captured image @@ -665,7 +669,6 @@ Fl_RGB_Image *Fl_X11_Screen_Driver::read_win_rectangle(int X, int Y, int w, int // int allow_outside = w < 0; // negative w allows negative X or Y, that is, window frame if (w < 0) w = - w; -// when capturing window decoration, X,Y,w and h are in pixels (not in FLTK units). Window xid = (win && !allow_outside ? fl_xid(win) : fl_window); float s = allow_outside ? 1 : Fl_Surface_Device::surface()->driver()->scale(); diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx index aed4b146f..39d01a7ae 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx @@ -382,28 +382,13 @@ void Fl_X11_Window_Driver::capture_titlebar_and_borders(Fl_RGB_Image*& top, Fl_R fl_window = parent; if (htop) { if (true_sides) { - top = Fl::screen_driver()->read_win_rectangle(1, 1, -(ww-1), htop, pWindow); - if (top) top->scale(decorated_w()+1, (htop / s)+1, 0, 1); + top = Fl::screen_driver()->read_win_rectangle(1, 1, -(ww-2), hh-2, pWindow); + if (top) top->scale(decorated_w(), decorated_h(), 0, 1); } else { top = Fl::screen_driver()->read_win_rectangle(wsides, wsides, -(ww-1), htop, pWindow); if (top) top->scale(w(), htop / s, 0, 1); } } - if (true_sides && wsides) { - left = Fl::screen_driver()->read_win_rectangle(1, htop, -wsides, hh - htop - wsides, pWindow); - if (left) { - left->scale(wsides/s, h(), 0, 1); - } - if (left) { - right = (Fl_RGB_Image*)left->copy(left->data_w(), left->data_h()); - right->scale(left->w(), left->h(), 0, 1); - } else right = NULL; - - bottom = Fl::screen_driver()->read_win_rectangle(1, hh-wsides, -(ww-1), wsides, pWindow); - if (bottom) { - bottom->scale(decorated_w(), wsides / s, 0, 1); - } - } fl_window = from; } -- cgit v1.2.3