diff options
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H | 5 | ||||
| -rw-r--r-- | src/drivers/Pico/Fl_Pico_Screen_Driver.cxx | 1 | ||||
| -rw-r--r-- | src/drivers/Pico/Fl_Pico_Window_Driver.H | 4 | ||||
| -rw-r--r-- | src/drivers/Pico/Fl_Pico_Window_Driver.cxx | 26 | ||||
| -rw-r--r-- | src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx | 15 | ||||
| -rw-r--r-- | src/drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx | 111 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H | 6 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 52 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.H | 8 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.cxx | 42 |
10 files changed, 144 insertions, 126 deletions
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H index 86cf1c8d1..419469df7 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H @@ -60,6 +60,11 @@ private: public: Fl_Cocoa_Window_Driver(Fl_Window*); ~Fl_Cocoa_Window_Driver(); + + // --- window data + virtual int decorated_w(); + virtual int decorated_h(); + virtual void take_focus(); virtual void shape(const Fl_Image* img); virtual void draw(); diff --git a/src/drivers/Pico/Fl_Pico_Screen_Driver.cxx b/src/drivers/Pico/Fl_Pico_Screen_Driver.cxx index 463ff688a..2e51c28a8 100644 --- a/src/drivers/Pico/Fl_Pico_Screen_Driver.cxx +++ b/src/drivers/Pico/Fl_Pico_Screen_Driver.cxx @@ -21,6 +21,7 @@ #include "Fl_Pico_Screen_Driver.H" + Fl_Pico_Screen_Driver::Fl_Pico_Screen_Driver() { } diff --git a/src/drivers/Pico/Fl_Pico_Window_Driver.H b/src/drivers/Pico/Fl_Pico_Window_Driver.H index 14cf08b5c..51e9db920 100644 --- a/src/drivers/Pico/Fl_Pico_Window_Driver.H +++ b/src/drivers/Pico/Fl_Pico_Window_Driver.H @@ -33,6 +33,10 @@ class FL_EXPORT Fl_Pico_Window_Driver : public Fl_Window_Driver public: Fl_Pico_Window_Driver(Fl_Window *win); virtual ~Fl_Pico_Window_Driver(); + + // --- window data + virtual int decorated_w(); + virtual int decorated_h(); }; diff --git a/src/drivers/Pico/Fl_Pico_Window_Driver.cxx b/src/drivers/Pico/Fl_Pico_Window_Driver.cxx index d729083fa..b14696d6f 100644 --- a/src/drivers/Pico/Fl_Pico_Window_Driver.cxx +++ b/src/drivers/Pico/Fl_Pico_Window_Driver.cxx @@ -20,6 +20,18 @@ #include "../../config_lib.h" #include "Fl_Pico_Window_Driver.H" +#include <FL/x.H> +#include <FL/Fl_Window.H> + + + +// TODO: move this to Fl_Window_Driver +void Fl_X::flush() +{ + w->driver()->flush(); +} + + Fl_Pico_Window_Driver::Fl_Pico_Window_Driver(Fl_Window *win) : Fl_Window_Driver(win) @@ -32,6 +44,20 @@ Fl_Pico_Window_Driver::~Fl_Pico_Window_Driver() } +// --- window data + +int Fl_Pico_Window_Driver::decorated_w() +{ + return pWindow->w(); +} + + +int Fl_Pico_Window_Driver::decorated_h() +{ + return pWindow->h(); +} + + // // End of "$Id: Fl_Pico_Window_Driver.cxx 11253 2016-03-01 00:54:21Z matt $". //
\ No newline at end of file diff --git a/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx b/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx index bc042d497..26563689c 100644 --- a/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx +++ b/src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx @@ -561,11 +561,6 @@ int Fl_X::set_cursor(Fl_Cursor) { return 0; } int Fl_X::set_cursor(Fl_RGB_Image const*, int, int) { return 0; } void Fl_X::set_default_icons(Fl_RGB_Image const**, int) { } -void Fl_X::flush() -{ - w->driver()->flush(); -} - void Fl_X::set_icons() { } void Fl_Window::size_range_() { } void Fl_Window::fullscreen_x() { } @@ -615,16 +610,6 @@ void Fl::remove_fd(int) { } -int Fl_Window::decorated_h() -{ - return h(); -} - -int Fl_Window::decorated_w() -{ - return w(); -} - // these pointers are set by the Fl::lock() function: static void nothing() {} void (*fl_lock_function)() = nothing; diff --git a/src/drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx b/src/drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx index fb0974fab..82d94dcd5 100644 --- a/src/drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx +++ b/src/drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx @@ -43,61 +43,6 @@ Fl_PicoSDL_Screen_Driver::~Fl_PicoSDL_Screen_Driver() } -#if 0 -if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { - // fl_lock_function(); - int x = AMotionEvent_getX(event, 0); - int y = AMotionEvent_getY(event, 0); - int action = AKeyEvent_getAction(event); - Fl_Window *window = Fl::first_window(); - switch (action) { - case AMOTION_EVENT_ACTION_DOWN: - Fl::e_is_click = 1; - Fl::e_x = Fl::e_x_root = x/3; - Fl::e_y = (y-100)/3; - if (!window) break; - Fl::e_keysym = FL_Button+FL_LEFT_MOUSE; - Fl::e_state = FL_BUTTON1; - Fl::handle(FL_PUSH, window); - break; - case AMOTION_EVENT_ACTION_MOVE: - Fl::e_is_click = 1; - Fl::e_x = Fl::e_x_root = x/3; - Fl::e_y = (y-100)/3; - if (!window) break; - Fl::e_keysym = FL_Button+FL_LEFT_MOUSE; - Fl::e_state = FL_BUTTON1; - Fl::handle(FL_DRAG, window); - break; - case AMOTION_EVENT_ACTION_UP: - case AMOTION_EVENT_ACTION_CANCEL: - Fl::e_is_click = 1; - Fl::e_x = Fl::e_x_root = x/3; - Fl::e_y = (y-100)/3; - if (!window) break; - Fl::e_keysym = FL_Button+FL_LEFT_MOUSE; - Fl::e_state = 0; - Fl::handle(FL_RELEASE, window); - break; - // case AMOTION_EVENT_ACTION_HOVER_MOVE: - // Fl::e_is_click = 1; - // Fl::e_x = Fl::e_x_root = x/3; - // Fl::e_y = (y-100)/3; - // if (!window) break; - // Fl::e_keysym = 0; - // Fl::e_state = 0; - // Fl::handle(FL_MOVE, window); - // break; - } - // AMOTION_EVENT_ACTION_MASK - LOGI("Motion at %d, %d", x, y); - // fl_unlock_function(); - Fl_X::first->w->redraw(); - return 1; -} -return 0; -#endif - double Fl_PicoSDL_Screen_Driver::wait(double time_to_wait) { Fl::flush(); @@ -214,11 +159,6 @@ int Fl_X::set_cursor(Fl_Cursor) { return 0; } int Fl_X::set_cursor(Fl_RGB_Image const*, int, int) { return 0; } void Fl_X::set_default_icons(Fl_RGB_Image const**, int) { } -void Fl_X::flush() -{ - w->driver()->flush(); -} - void Fl_X::set_icons() { } void Fl_Window::size_range_() { } void Fl_Window::fullscreen_x() { } @@ -264,57 +204,6 @@ void Fl::remove_fd(int) { } -int Fl_Window::decorated_h() -{ -} - -int Fl_Window::decorated_w() -{ -} - -/* - #define __APPLE__ - #include <SDL2/SDL.h> - #undef __APPLE__ - - SDL_Window *win = NULL; - SDL_Renderer *renderer = NULL; - SDL_Texture *bitmapTex = NULL; - SDL_Surface *bitmapSurface = NULL; - int posX = 100, posY = 100, width = 320, height = 240; - - SDL_Init(SDL_INIT_VIDEO); - - win = SDL_CreateWindow("Hello World", posX, posY, width, height, 0); - - renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); - - bitmapSurface = SDL_LoadBMP("img/hello.bmp"); - bitmapTex = SDL_CreateTextureFromSurface(renderer, bitmapSurface); - SDL_FreeSurface(bitmapSurface); - - while (1) { - SDL_Event e; - if (SDL_PollEvent(&e)) { - if (e.type == SDL_QUIT) { - break; - } - } - - SDL_RenderClear(renderer); - SDL_RenderCopy(renderer, bitmapTex, NULL, NULL); - SDL_RenderPresent(renderer); - } - - SDL_DestroyTexture(bitmapTex); - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(win); - - SDL_Quit(); - - return 0; -*/ - // // End of "$Id: Fl_PicoSDL_Screen_Driver.cxx 11253 2016-03-01 00:54:21Z matt $". diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H index 7000356e3..f4521b5e7 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H @@ -61,11 +61,17 @@ struct Fl_Window_Driver::shape_data_type { class FL_EXPORT Fl_WinAPI_Window_Driver : public Fl_Window_Driver { private: + RECT border_width_title_bar_height(int &bx, int &by, int &bt); void shape_bitmap_(Fl_Image* b); void shape_alpha_(Fl_Image* img, int offset); public: Fl_WinAPI_Window_Driver(Fl_Window*); ~Fl_WinAPI_Window_Driver(); + + // --- window data + virtual int decorated_w(); + virtual int decorated_h(); + virtual void shape(const Fl_Image* img); virtual void draw(); virtual void icons(const Fl_RGB_Image *icons[], int count); diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx index 01f5225bd..6e7d546da 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx @@ -19,6 +19,7 @@ #include "../../config_lib.h" #include <FL/Fl.H> +#include <FL/Fl_Window.H> #include <FL/Fl_Image.H> #include <FL/Fl_Bitmap.H> #include <FL/Fl_Window.H> @@ -47,6 +48,57 @@ Fl_WinAPI_Window_Driver::~Fl_WinAPI_Window_Driver() } } + +// --- private + +RECT Fl_WinAPI_Window_Driver::border_width_title_bar_height(int &bx, int &by, int &bt) +{ + Fl_Window *win = pWindow; + RECT r = {0,0,0,0}; + bx = by = bt = 0; + if (win->shown() && !win->parent() && win->border() && win->visible()) { + static HMODULE dwmapi_dll = LoadLibrary("dwmapi.dll"); + typedef HRESULT (WINAPI* DwmGetWindowAttribute_type)(HWND hwnd, DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute); + static DwmGetWindowAttribute_type DwmGetWindowAttribute = dwmapi_dll ? + (DwmGetWindowAttribute_type)GetProcAddress(dwmapi_dll, "DwmGetWindowAttribute") : NULL; + int need_r = 1; + if (DwmGetWindowAttribute) { + const DWORD DWMWA_EXTENDED_FRAME_BOUNDS = 9; + if ( DwmGetWindowAttribute(fl_xid(win), DWMWA_EXTENDED_FRAME_BOUNDS, &r, sizeof(RECT)) == S_OK ) { + need_r = 0; + } + } + if (need_r) { + GetWindowRect(fl_xid(win), &r); + } + bx = (r.right - r.left - win->w())/2; + by = bx; + bt = r.bottom - r.top - win->h() - 2*by; + } + return RECT(r); +} + + +// --- window data + +int Fl_WinAPI_Window_Driver::decorated_w() +{ + int bt, bx, by; + border_width_title_bar_height(bx, by, bt); + return pWindow->w() + 2 * bx; +} + +int Fl_WinAPI_Window_Driver::decorated_h() +{ + int bt, bx, by; + border_width_title_bar_height(bx, by, bt); + return pWindow->h() + bt + 2 * by; +} + + + + + void Fl_WinAPI_Window_Driver::shape_bitmap_(Fl_Image* b) { shape_data_->shape_ = b; } diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H index 3e4a80880..02c0de989 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.H +++ b/src/drivers/X11/Fl_X11_Window_Driver.H @@ -60,13 +60,21 @@ struct Fl_Window_Driver::shape_data_type { class FL_EXPORT Fl_X11_Window_Driver : public Fl_Window_Driver { friend class Fl_X; + private: + void decorated_win_size(int &w, int &h); void combine_mask(); void shape_bitmap_(Fl_Image* b); void shape_alpha_(Fl_Image* img, int offset); + public: Fl_X11_Window_Driver(Fl_Window*); ~Fl_X11_Window_Driver(); + + // --- window data + virtual int decorated_w(); + virtual int decorated_h(); + virtual void take_focus(); virtual void shape(const Fl_Image* img); virtual void draw(); diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx index 05c27a972..6ff2158c2 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx @@ -72,6 +72,48 @@ Fl_X11_Window_Driver::~Fl_X11_Window_Driver() delete icon_; } + +// --- private + +void Fl_X11_Window_Driver::decorated_win_size(int &w, int &h) +{ + Fl_Window *win = pWindow; + w = win->w(); + h = win->h(); + if (!win->shown() || win->parent() || !win->border() || !win->visible()) return; + Window root, parent, *children; + unsigned n = 0; + Status status = XQueryTree(fl_display, Fl_X::i(win)->xid, &root, &parent, &children, &n); + if (status != 0 && n) XFree(children); + // when compiz is used, root and parent are the same window + // and I don't know where to find the window decoration + if (status == 0 || root == parent) return; + XWindowAttributes attributes; + XGetWindowAttributes(fl_display, parent, &attributes); + w = attributes.width; + h = attributes.height; +} + + +// --- window data + +int Fl_X11_Window_Driver::decorated_h() +{ + int w, h; + decorated_win_size(w, h); + return h; +} + +int Fl_X11_Window_Driver::decorated_w() +{ + int w, h; + + decorated_win_size(w, h); + return w; +} + + + void Fl_X11_Window_Driver::take_focus() { Fl_X *i = Fl_X::i(pWindow); |
