From 2530120d7d084f1ffbb9331e925153a3bcb15b92 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Thu, 24 Mar 2016 22:26:13 +0000 Subject: [PATCH] Rewrite Fl::handle_(int e, Fl_Window* window) and Fl_Widget::damage() to remove their platform dependent parts git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11419 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- FL/Fl_Graphics_Driver.H | 2 + src/Fl.cxx | 53 +++---------------- src/Fl_cocoa.mm | 13 +++++ src/drivers/GDI/Fl_GDI_Graphics_Driver.cxx | 6 +++ .../Quartz/Fl_Quartz_Graphics_Driver.cxx | 14 ++++- .../Quartz/Fl_Quartz_Graphics_Driver_font.cxx | 6 ++- src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx | 7 +++ 7 files changed, 51 insertions(+), 50 deletions(-) diff --git a/FL/Fl_Graphics_Driver.H b/FL/Fl_Graphics_Driver.H index 4d2f675b9..086651314 100644 --- a/FL/Fl_Graphics_Driver.H +++ b/FL/Fl_Graphics_Driver.H @@ -257,6 +257,8 @@ public: virtual uchar **mask_bitmap() { return 0; } /** Support for pixmap drawing */ virtual void mask_bitmap(uchar **) {} + // each platform implements that its own way + static void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h); protected: // --- implementation is in src/fl_vertex.cxx which includes src/cfg_gfx/xxx_rect.cxx virtual void transformed_vertex0(COORD_T x, COORD_T y); diff --git a/src/Fl.cxx b/src/Fl.cxx index a28aa91c2..34fe57453 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -17,10 +17,6 @@ // -// warning: the Apple Quartz version still uses some Quickdraw calls, -// mostly to get around the single active context in QD and -// to implement clipping. This should be changed into pure -// Quartz calls in the near future. #include "config_lib.h" /* We require Windows 2000 features (e.g. VK definitions) */ @@ -1280,29 +1276,15 @@ int Fl::handle_(int e, Fl_Window* window) if (grab()) wi = grab(); { int ret; Fl_Widget* pbm = belowmouse(); -#ifdef __APPLE__ // bug fix - if (fl_mac_os_version < 100500) { - // before 10.5, mouse moved events aren't sent to borderless windows such as tooltips - Fl_Window *tooltip = Fl_Tooltip::current_window(); - int inside = 0; - if (tooltip && tooltip->shown() ) { // check if a tooltip window is currently opened - // check if mouse is inside the tooltip - inside = (Fl::event_x_root() >= tooltip->x() && Fl::event_x_root() < tooltip->x() + tooltip->w() && - Fl::event_y_root() >= tooltip->y() && Fl::event_y_root() < tooltip->y() + tooltip->h() ); - } - // if inside, send event to tooltip window instead of background window - if (inside) ret = send_event(e, tooltip, window); - else ret = (wi && send_event(e, wi, window)); - } else -#endif ret = (wi && send_event(e, wi, window)); - if (pbm != belowmouse()) { + if (pbm != belowmouse()) { #ifdef DEBUG - printf("Fl::handle(e=%d, window=%p);\n", e, window); + printf("Fl::handle(e=%d, window=%p);\n", e, window); #endif // DEBUG - Fl_Tooltip::enter(belowmouse()); + Fl_Tooltip::enter(belowmouse()); + } + return ret; } - return ret;} case FL_RELEASE: { // printf("FL_RELEASE: window=%p, pushed() = %p, grab() = %p, modal() = %p\n", @@ -1582,29 +1564,7 @@ void Fl_Widget::damage(uchar fl, int X, int Y, int W, int H) { if (wi->damage()) { // if we already have damage we must merge with existing region: if (i->region) { -#if defined(USE_X11) - XRectangle R; - R.x = X; R.y = Y; R.width = W; R.height = H; - XUnionRectWithRegion(&R, i->region, i->region); -#elif defined(WIN32) - Fl_Region R = XRectangleRegion(X, Y, W, H); - CombineRgn(i->region, i->region, R, RGN_OR); - XDestroyRegion(R); -#elif defined(__APPLE_QUARTZ__) // PORTME: Fl_Window_Driver - platform damage region - CGRect arg = fl_cgrectmake_cocoa(X, Y, W, H); - int j; // don't add a rectangle totally inside the Fl_Region - for(j = 0; j < i->region->count; j++) { - if(CGRectContainsRect(i->region->rects[j], arg)) break; - } - if( j >= i->region->count) { - i->region->rects = (CGRect*)realloc(i->region->rects, (++(i->region->count)) * sizeof(CGRect)); - i->region->rects[i->region->count - 1] = arg; - } -#elif defined(FL_PORTING) -# pragma message "FL_PORTING: code to merge damage regions" -#else -# error unsupported platform -#endif + Fl_Graphics_Driver::add_rectangle_to_region(i->region, X, Y, W, H); } wi->damage_ |= fl; } else { @@ -1619,7 +1579,6 @@ void Fl_Widget::damage(uchar fl, int X, int Y, int W, int H) { #ifdef WIN32 # include "Fl_win32.cxx" -//#elif defined(__APPLE__) // nothing here to see #endif diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 3806a2e52..1762c17f5 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1139,6 +1139,19 @@ static void cocoaMouseHandler(NSEvent *theEvent) } mods_to_e_state( mods ); update_e_xy_and_e_xy_root([theEvent window]); + if (fl_mac_os_version < 100500) { + // before 10.5, mouse moved events aren't sent to borderless windows such as tooltips + Fl_Window *tooltip = Fl_Tooltip::current_window(); + int inside = 0; + if (tooltip && tooltip->shown() ) { // check if a tooltip window is currently opened + // check if mouse is inside the tooltip + inside = (Fl::event_x_root() >= tooltip->x() && Fl::event_x_root() < tooltip->x() + tooltip->w() && + Fl::event_y_root() >= tooltip->y() && Fl::event_y_root() < tooltip->y() + tooltip->h() ); + } + // if inside, send event to tooltip window instead of background window + if (inside) + window = tooltip; + } Fl::handle( sendEvent, window ); } break; diff --git a/src/drivers/GDI/Fl_GDI_Graphics_Driver.cxx b/src/drivers/GDI/Fl_GDI_Graphics_Driver.cxx index 45144c9a1..15defb9eb 100644 --- a/src/drivers/GDI/Fl_GDI_Graphics_Driver.cxx +++ b/src/drivers/GDI/Fl_GDI_Graphics_Driver.cxx @@ -144,6 +144,12 @@ void Fl_Translated_GDI_Graphics_Driver::untranslate_all() { SetWindowOrgEx((HDC)gc(), origins[depth].x, origins[depth].y, NULL); } +void Fl_Graphics_Driver::add_rectangle_to_region(Fl_Region r, int X, int Y, int W, int H) { + Fl_Region R = XRectangleRegion(X, Y, W, H); + CombineRgn(r, r, R, RGN_OR); + XDestroyRegion(R); +} + // // End of "$Id$". // diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx index f1b159960..6fdc3461e 100644 --- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx +++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.cxx @@ -18,7 +18,7 @@ #include "../../config_lib.h" -#include "Fl_Quartz_Graphics_Driver.h" +#include "Fl_Quartz_Graphics_Driver.H" /* Reference to the current CGContext For back-compatibility only. The preferred procedure to get this reference is @@ -70,6 +70,18 @@ void Fl_Quartz_Graphics_Driver::copy_offscreen(int x,int y,int w,int h,Fl_Offscr CGDataProviderRelease(src_bytes); } +void Fl_Graphics_Driver::add_rectangle_to_region(Fl_Region r, int X, int Y, int W, int H) { + CGRect arg = fl_cgrectmake_cocoa(X, Y, W, H); + int j; // don't add a rectangle totally inside the Fl_Region + for(j = 0; j < r->count; j++) { + if(CGRectContainsRect(r->rects[j], arg)) break; + } + if( j >= r->count) { + r->rects = (CGRect*)realloc(r->rects, (++(r->count)) * sizeof(CGRect)); + r->rects[r->count - 1] = arg; + } +} + // // End of "$Id$". // diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx index 48e2c8f19..7e0b22dec 100644 --- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx +++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_font.cxx @@ -580,7 +580,8 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) { // activate the current GC iSize = sizeof(CGContextRef); iTag = kATSUCGContextTag; - iValuePtr = &gc_; + CGContextRef value = (CGContextRef)fl_graphics_driver->gc(); + iValuePtr = &value; ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); // now measure the bounding box err = ATSUSetTextPointerLocation(layout, txt, kATSUFromTextBeginning, n, n); @@ -657,7 +658,8 @@ else { // activate the current GC iSize = sizeof(CGContextRef); iTag = kATSUCGContextTag; - iValuePtr = &gc_; + CGContextRef value = (CGContextRef)gc(); + iValuePtr = &value; ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); // now measure the bounding box err = ATSUSetTextPointerLocation(layout, txt, kATSUFromTextBeginning, n, n); diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx index 83103c7e4..967712490 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.cxx @@ -98,6 +98,13 @@ void Fl_Xlib_Graphics_Driver::copy_offscreen_with_alpha(int x, int y, int w, int } #endif + +void Fl_Graphics_Driver::add_rectangle_to_region(Fl_Region r, int X, int Y, int W, int H) { + XRectangle R; + R.x = X; R.y = Y; R.width = W; R.height = H; + XUnionRectWithRegion(&R, r, r); +} + // // End of "$Id$". //