summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2017-12-04 17:39:19 +0000
committerManolo Gouy <Manolo>2017-12-04 17:39:19 +0000
commit8612fea27712a41d7e8167cef964d7098b1d733d (patch)
tree4a92a869d02394605364270525c467022d2fd24d
parent6586b77975636da3d96d277d7556a8bbc8d0031b (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.H4
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/Fl_MacOS_Sys_Menu_Bar.mm54
-rw-r--r--src/Fl_Sys_Menu_Bar.cxx16
-rw-r--r--src/Fl_cocoa.mm2
-rw-r--r--src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H50
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$".
+//