diff options
| author | Manolo Gouy <Manolo> | 2017-12-04 17:39:19 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2017-12-04 17:39:19 +0000 |
| commit | 8612fea27712a41d7e8167cef964d7098b1d733d (patch) | |
| tree | 4a92a869d02394605364270525c467022d2fd24d | |
| parent | 6586b77975636da3d96d277d7556a8bbc8d0031b (diff) | |
Make Fl_Sys_Menu_Bar class usable in static initializers.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12579 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | FL/Fl_Sys_Menu_Bar_Driver.H | 4 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/Fl_MacOS_Sys_Menu_Bar.mm | 54 | ||||
| -rw-r--r-- | src/Fl_Sys_Menu_Bar.cxx | 16 | ||||
| -rw-r--r-- | src/Fl_cocoa.mm | 2 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H | 50 |
6 files changed, 84 insertions, 43 deletions
diff --git a/FL/Fl_Sys_Menu_Bar_Driver.H b/FL/Fl_Sys_Menu_Bar_Driver.H index 8ab45cc93..a1adbd953 100644 --- a/FL/Fl_Sys_Menu_Bar_Driver.H +++ b/FL/Fl_Sys_Menu_Bar_Driver.H @@ -23,9 +23,8 @@ class Fl_Sys_Menu_Bar_Driver { friend class Fl_Sys_Menu_Bar; -protected: - Fl_Sys_Menu_Bar *bar; public: + Fl_Sys_Menu_Bar *bar; Fl_Sys_Menu_Bar_Driver(); virtual ~Fl_Sys_Menu_Bar_Driver(); virtual void update() {} @@ -48,6 +47,7 @@ public: virtual void mode(int i, int fl) { bar->Fl_Menu_Bar::mode(i, fl); } static Fl_Sys_Menu_Bar_Driver *driver_; // to be assigned with a unique object of this class or of a derived class + static Fl_Sys_Menu_Bar_Driver* new_driver(); }; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4216518b8..176329c46 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -263,6 +263,7 @@ elseif (APPLE) drivers/Darwin/Fl_Darwin_System_Driver.H drivers/Cocoa/Fl_Cocoa_Screen_Driver.H drivers/Cocoa/Fl_Cocoa_Window_Driver.H + drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H drivers/Quartz/Fl_Quartz_Graphics_Driver.H drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H drivers/Quartz/Fl_Font.H diff --git a/src/Fl_MacOS_Sys_Menu_Bar.mm b/src/Fl_MacOS_Sys_Menu_Bar.mm index bf9af8145..93182d36f 100644 --- a/src/Fl_MacOS_Sys_Menu_Bar.mm +++ b/src/Fl_MacOS_Sys_Menu_Bar.mm @@ -16,50 +16,30 @@ // http://www.fltk.org/str.php // -/* - * This code has been tested on the "menubar" sample program and provides - * basic functionality. - * - * To use the System Menu Bar, simply replace the main Fl_Menu_Bar - * in an application with Fl_Sys_Menu_Bar. - * - * FLTK features not supported by the Mac System menu - * - * - no symbolic labels - * - no embossed labels - * - no font sizes - * - * Many other calls of the parent class don't work. - */ +#if defined(__APPLE__) + #include <FL/Fl_Sys_Menu_Bar_Driver.H> #include <FL/x.H> +#include "drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H" -#if defined(__APPLE__) - -class Fl_MacOS_Sys_Menu_Bar_Driver : public Fl_Sys_Menu_Bar_Driver { -public: - Fl_MacOS_Sys_Menu_Bar_Driver(); - virtual ~Fl_MacOS_Sys_Menu_Bar_Driver(); - virtual void update(); - virtual void draw() {} - virtual void about(Fl_Callback *cb, void *data); - virtual int add(const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags); - virtual int add(const char* str); - virtual int insert(int index, const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags); - virtual void menu(const Fl_Menu_Item *m); - virtual void shortcut (int i, int s); - virtual void setonly (Fl_Menu_Item *item); - virtual void clear(); - virtual int clear_submenu(int index); - virtual void remove(int index); - virtual void replace(int index, const char *name); - virtual void mode(int i, int fl); -}; +Fl_MacOS_Sys_Menu_Bar_Driver* Fl_MacOS_Sys_Menu_Bar_Driver::new_driver() { + static Fl_MacOS_Sys_Menu_Bar_Driver *once = new Fl_MacOS_Sys_Menu_Bar_Driver(); + if (Fl_Sys_Menu_Bar_Driver::driver_ != once) { + if (Fl_Sys_Menu_Bar_Driver::driver_) { + once->bar = Fl_Sys_Menu_Bar_Driver::driver_->bar; + delete Fl_Sys_Menu_Bar_Driver::driver_; + } + Fl_Sys_Menu_Bar_Driver::driver_ = once; + if (Fl_Sys_Menu_Bar_Driver::driver_->bar) Fl_Sys_Menu_Bar_Driver::driver_->bar->update(); + } + return once; +} // this runs once if this source file is linked in, and initializes the // static variable Fl_Sys_Menu_Bar_Driver::driver_ with an object of class Fl_MacOS_Sys_Menu_Bar_Driver -static int unused = (Fl_Sys_Menu_Bar_Driver::driver_ = new Fl_MacOS_Sys_Menu_Bar_Driver(), 0); +static Fl_MacOS_Sys_Menu_Bar_Driver *unused = Fl_MacOS_Sys_Menu_Bar_Driver::new_driver(); + #import <Cocoa/Cocoa.h> diff --git a/src/Fl_Sys_Menu_Bar.cxx b/src/Fl_Sys_Menu_Bar.cxx index 08c7186a7..71613dd0b 100644 --- a/src/Fl_Sys_Menu_Bar.cxx +++ b/src/Fl_Sys_Menu_Bar.cxx @@ -24,11 +24,19 @@ Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0; // initialize this static variable if it was not initialized previously -Fl_Sys_Menu_Bar_Driver *Fl_Sys_Menu_Bar_Driver::driver_ = - ( driver_ ? driver_ : new Fl_Sys_Menu_Bar_Driver() ); +Fl_Sys_Menu_Bar_Driver* Fl_Sys_Menu_Bar_Driver::new_driver() { + if (!driver_) { // initialize this static variable if it was not initialized previously + static Fl_Sys_Menu_Bar_Driver *once = new Fl_Sys_Menu_Bar_Driver(); + driver_ = once; + } + return driver_; +} -Fl_Sys_Menu_Bar_Driver *Fl_Sys_Menu_Bar::driver() {return Fl_Sys_Menu_Bar_Driver::driver_;} +inline Fl_Sys_Menu_Bar_Driver *Fl_Sys_Menu_Bar::driver() { + return Fl_Sys_Menu_Bar_Driver::new_driver(); +} +Fl_Sys_Menu_Bar_Driver *Fl_Sys_Menu_Bar_Driver::driver_ = Fl_Sys_Menu_Bar_Driver::new_driver(); /** The constructor. @@ -39,7 +47,7 @@ Fl_Sys_Menu_Bar::Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l) { if (fl_sys_menu_bar) delete fl_sys_menu_bar; fl_sys_menu_bar = this; - Fl_Sys_Menu_Bar_Driver::driver_->bar = this; + driver()->bar = this; } /** The destructor */ diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index d48b5308e..e550aee2e 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -50,6 +50,7 @@ extern "C" { #include "drivers/Cocoa/Fl_Cocoa_Screen_Driver.H" #include "drivers/Cocoa/Fl_Cocoa_Window_Driver.H" #include "drivers/Darwin/Fl_Darwin_System_Driver.H" +#include "drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H" #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -2907,6 +2908,7 @@ Fl_X* Fl_Cocoa_Window_Driver::makeWindow() fl_open_display(); NSInteger winlevel = NSNormalWindowLevel; NSUInteger winstyle; + Fl_MacOS_Sys_Menu_Bar_Driver::new_driver(); // useful if run in a static initializer Fl_Window* w = pWindow; if (w->parent()) { w->border(0); diff --git a/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H b/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H new file mode 100644 index 000000000..9ea966a79 --- /dev/null +++ b/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H @@ -0,0 +1,50 @@ +// +// "$Id$" +// +// system menu bar widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 2017 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: +// +// http://www.fltk.org/COPYING.php +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_MacOS_Sys_Menu_Bar_Driver_H +#define Fl_MacOS_Sys_Menu_Bar_Driver_H + +#include <FL/Fl_Sys_Menu_Bar_Driver.H> + +class Fl_MacOS_Sys_Menu_Bar_Driver : public Fl_Sys_Menu_Bar_Driver { +public: + Fl_MacOS_Sys_Menu_Bar_Driver(); + virtual ~Fl_MacOS_Sys_Menu_Bar_Driver(); + virtual void update(); + virtual void draw() {} + virtual void about(Fl_Callback *cb, void *data); + virtual int add(const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags); + virtual int add(const char* str); + virtual int insert(int index, const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags); + virtual void menu(const Fl_Menu_Item *m); + virtual void shortcut (int i, int s); + virtual void setonly (Fl_Menu_Item *item); + virtual void clear(); + virtual int clear_submenu(int index); + virtual void remove(int index); + virtual void replace(int index, const char *name); + virtual void mode(int i, int fl); + static Fl_MacOS_Sys_Menu_Bar_Driver* new_driver(); +}; + + +#endif /* Fl_MacOS_Sys_Menu_Bar_Driver_H */ + +// +// End of "$Id$". +// |
