summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H5
-rw-r--r--src/drivers/Pico/Fl_Pico_Screen_Driver.cxx1
-rw-r--r--src/drivers/Pico/Fl_Pico_Window_Driver.H4
-rw-r--r--src/drivers/Pico/Fl_Pico_Window_Driver.cxx26
-rw-r--r--src/drivers/PicoAndroid/Fl_PicoAndroid_Screen_Driver.cxx15
-rw-r--r--src/drivers/PicoSDL/Fl_PicoSDL_Screen_Driver.cxx111
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H6
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx52
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.H8
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.cxx42
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);