Applied the 'recap.zip' files to the Cocoa patch. About diaog now correct. Much other stuff should work better now. Exciting!

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6965 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher
2009-12-12 18:26:12 +00:00
parent 3f689a7d2f
commit 64716f01e2
4 changed files with 300 additions and 273 deletions
+5 -1
View File
@@ -29,6 +29,7 @@
#define Fl_Sys_Menu_Bar_H #define Fl_Sys_Menu_Bar_H
#include "Fl_Menu_Bar.H" #include "Fl_Menu_Bar.H"
#include "x.H"
#ifdef __APPLE__ #ifdef __APPLE__
@@ -38,9 +39,12 @@ protected:
public: public:
Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l=0) Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l=0)
: Fl_Menu_Bar(x,y,w,h,l) { : Fl_Menu_Bar(x,y,w,h,l) {
deactivate(); // don't let the old area take events deactivate(); // don't let the old area take events
fl_sys_menu_bar = this;
} }
void menu(const Fl_Menu_Item *m); void menu(const Fl_Menu_Item *m);
int add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0);
void remove(int n);
}; };
#else #else
+92 -58
View File
@@ -65,6 +65,7 @@
#ifdef __APPLE_COCOA__ #ifdef __APPLE_COCOA__
extern void *MACMenuOrItemOperation(const char *operation, ...); extern void *MACMenuOrItemOperation(const char *operation, ...);
extern void *MACmainMenu(void);
#define MenuHandle void * #define MenuHandle void *
#endif #endif
@@ -77,7 +78,7 @@ typedef const Fl_Menu_Item *pFl_Menu_Item;
*/ */
#ifndef __APPLE_COCOA__ #ifndef __APPLE_COCOA__
static void catMenuText( const char *src, char *dst ) static void catMenuText( const char *src, char *dst )
{ {
char c; char c;
while ( *dst ) while ( *dst )
@@ -103,7 +104,7 @@ static void catMenuFont( const Fl_Menu_Item *m, char *dst )
return; return;
while ( *dst ) while ( *dst )
dst++; dst++;
if ( m->labelfont_ & FL_BOLD ) if ( m->labelfont_ & FL_BOLD )
strcat( dst, "<B" ); strcat( dst, "<B" );
if ( m->labelfont_ & FL_ITALIC ) if ( m->labelfont_ & FL_ITALIC )
@@ -112,28 +113,28 @@ static void catMenuFont( const Fl_Menu_Item *m, char *dst )
// strcat( dst, "<U" ); // strcat( dst, "<U" );
if ( m->labeltype_ == FL_EMBOSSED_LABEL ) if ( m->labeltype_ == FL_EMBOSSED_LABEL )
strcat( dst, "<U" ); strcat( dst, "<U" );
else if ( m->labeltype_ == FL_ENGRAVED_LABEL ) else if ( m->labeltype_ == FL_ENGRAVED_LABEL )
strcat( dst, "<O" ); strcat( dst, "<O" );
else if ( m->labeltype_ == FL_SHADOW_LABEL ) else if ( m->labeltype_ == FL_SHADOW_LABEL )
strcat( dst, "<S" ); strcat( dst, "<S" );
//else if ( m->labeltype_ == FL_SYMBOL_LABEL ) //else if ( m->labeltype_ == FL_SYMBOL_LABEL )
; // not supported ; // not supported
} }
/** /**
* append a marker to identify the menu shortcut * append a marker to identify the menu shortcut
* <B, I, U, O, and S * <B, I, U, O, and S
enum { enum {
kMenuNoModifiers = 0, kMenuNoModifiers = 0,
kMenuShiftModifier = (1 << 0), kMenuShiftModifier = (1 << 0),
kMenuOptionModifier = (1 << 1), kMenuOptionModifier = (1 << 1),
kMenuControlModifier = (1 << 2), kMenuControlModifier = (1 << 2),
kMenuNoCommandModifier = (1 << 3) kMenuNoCommandModifier = (1 << 3)
}; };
*/ */
#endif #endif
static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m ) static void setMenuShortcut( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
{ {
if ( !m->shortcut_ ) if ( !m->shortcut_ )
@@ -190,15 +191,15 @@ static void setMenuFlags( MenuHandle mh, int miCnt, const Fl_Menu_Item *m )
if ( m->flags & FL_MENU_TOGGLE ) if ( m->flags & FL_MENU_TOGGLE )
{ {
#ifdef __APPLE_COCOA__ #ifdef __APPLE_COCOA__
void *menuItem = MACMenuOrItemOperation("itemAtIndex", mh, miCnt); void *menuItem = MACMenuOrItemOperation("itemAtIndex", mh, miCnt);
MACMenuOrItemOperation("setState", menuItem, m->flags & FL_MENU_VALUE ); MACMenuOrItemOperation("setState", menuItem, m->flags & FL_MENU_VALUE );
#else #else
SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 ); SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 );
#endif #endif
} }
else if ( m->flags & FL_MENU_RADIO ) { else if ( m->flags & FL_MENU_RADIO ) {
#ifndef __APPLE_COCOA__ #ifndef __APPLE_COCOA__
SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 ); SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 );
#endif #endif
} }
} }
@@ -222,20 +223,20 @@ static void createSubMenu( void * mh, pFl_Menu_Item &mm )
menuItem = MACMenuOrItemOperation("itemAtIndex", mh, cnt); menuItem = MACMenuOrItemOperation("itemAtIndex", mh, cnt);
MACMenuOrItemOperation("setSubmenu", menuItem, submenu); MACMenuOrItemOperation("setSubmenu", menuItem, submenu);
if ( mm->flags & FL_MENU_INACTIVE ) { if ( mm->flags & FL_MENU_INACTIVE ) {
MACMenuOrItemOperation("setEnabled", menuItem, 0); MACMenuOrItemOperation("setEnabled", menuItem, 0);
} }
mm++; mm++;
while ( mm->text ) while ( mm->text )
{ {
MACMenuOrItemOperation("addNewItem", submenu, mm, &miCnt); MACMenuOrItemOperation("addNewItem", submenu, mm, &miCnt);
setMenuFlags( submenu, miCnt, mm ); setMenuFlags( submenu, miCnt, mm );
setMenuShortcut( submenu, miCnt, mm ); setMenuShortcut( submenu, miCnt, mm );
if ( mm->flags & FL_MENU_INACTIVE ) { if ( mm->flags & FL_MENU_INACTIVE ) {
void *item = MACMenuOrItemOperation("itemAtIndex", submenu, miCnt); void *item = MACMenuOrItemOperation("itemAtIndex", submenu, miCnt);
MACMenuOrItemOperation("setEnabled", item, 0); MACMenuOrItemOperation("setEnabled", item, 0);
} }
flags = mm->flags; flags = mm->flags;
if ( mm->flags & FL_SUBMENU ) if ( mm->flags & FL_SUBMENU )
{ {
createSubMenu( submenu, mm ); createSubMenu( submenu, mm );
@@ -246,35 +247,30 @@ static void createSubMenu( void * mh, pFl_Menu_Item &mm )
createSubMenu( submenu, smm ); createSubMenu( submenu, smm );
} }
if ( flags & FL_MENU_DIVIDER ) { if ( flags & FL_MENU_DIVIDER ) {
MACMenuOrItemOperation("addSeparatorItem", submenu); MACMenuOrItemOperation("addSeparatorItem", submenu);
} }
mm++; mm++;
} }
} }
static void convertToMenuBar(const Fl_Menu_Item *mm)
/** //convert a complete Fl_Menu_Item array into a series of menus in the top menu bar
* create a system menu bar using the given list of menu structs //ALL PREVIOUS SYSTEM MENUS, EXCEPT APPLICATION MENU, ARE REPLACED BY THE NEW DATA
*
* \author Matthias Melcher
*
* @param m list of Fl_Menu_Item
*/
extern void *MACmainMenu(void);
void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
{ {
fl_open_display(); int count;//first, delete all existing system menus
Fl_Menu_Bar::menu( m ); MACMenuOrItemOperation("numberOfItems", MACmainMenu(), &count);
fl_sys_menu_bar = this; for(int i = count - 1; i > 0; i--) {
MACMenuOrItemOperation("removeItem", MACmainMenu(), i);
}
const Fl_Menu_Item *mm = m; //now convert FLTK stuff into MacOS menus
for (;;) for (;;)
{ {
if ( !mm || !mm->text ) if ( !mm || !mm->text )
break; break;
char visible = mm->visible() ? 1 : 0; char visible = mm->visible() ? 1 : 0;
MACMenuOrItemOperation("addNewItem", MACmainMenu(), mm, NULL); MACMenuOrItemOperation("addNewItem", MACmainMenu(), mm, NULL);
if ( mm->flags & FL_SUBMENU ) if ( mm->flags & FL_SUBMENU )
createSubMenu( MACmainMenu(), mm ); createSubMenu( MACmainMenu(), mm );
else if ( mm->flags & FL_SUBMENU_POINTER ) { else if ( mm->flags & FL_SUBMENU_POINTER ) {
@@ -288,6 +284,45 @@ void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
} }
} }
/**
* create a system menu bar using the given list of menu structs
*
* \author Matthias Melcher
*
* @param m list of Fl_Menu_Item
*/
void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
{
fl_open_display();
Fl_Menu_Bar::menu( m );
convertToMenuBar(m);
}
/**
* Adds to the system menu bar a new menu item, with a title string, shortcut int,
* callback, argument to the callback, and flags.
*
* @see Fl_Menu_::add(const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags)
*/
int Fl_Sys_Menu_Bar::add(const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags)
{
fl_open_display();
int rank = Fl_Menu_::add(label, shortcut, cb, user_data, flags);
convertToMenuBar(Fl_Menu_::menu());
return rank;
}
/**
* remove an item from the system menu bar
*
* @param n the rank of the item to remove
*/
void Fl_Sys_Menu_Bar::remove(int n)
{
Fl_Menu_::remove(n);
convertToMenuBar(Fl_Menu_::menu());
}
#else #else
static void catMenuFlags( const Fl_Menu_Item *m, char *dst ) static void catMenuFlags( const Fl_Menu_Item *m, char *dst )
@@ -298,8 +333,7 @@ static void catMenuFlags( const Fl_Menu_Item *m, char *dst )
strcat( dst, "(" ); strcat( dst, "(" );
} }
/**
/**
* create a sub menu for a specific menu handle * create a sub menu for a specific menu handle
*/ */
static void createSubMenu( MenuHandle mh, int &cnt, pFl_Menu_Item &mm ) static void createSubMenu( MenuHandle mh, int &cnt, pFl_Menu_Item &mm )
@@ -394,17 +428,17 @@ void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
#endif //__APPLE_COCOA__ #endif //__APPLE_COCOA__
/* /*
const Fl_Menu_Item* Fl_Sys_Menu_Bar::picked(const Fl_Menu_Item* v) { const Fl_Menu_Item* Fl_Sys_Menu_Bar::picked(const Fl_Menu_Item* v) {
Fl_menu_Item *ret = Fl_Menu_Bar::picked( v ); Fl_menu_Item *ret = Fl_Menu_Bar::picked( v );
if ( m->flags & FL_MENU_TOGGLE ) if ( m->flags & FL_MENU_TOGGLE )
{ {
SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 ); SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 );
} }
return ret; return ret;
} }
*/ */
void Fl_Sys_Menu_Bar::draw() { void Fl_Sys_Menu_Bar::draw() {
} }
+202 -213
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -483,7 +483,7 @@ else {
ATSUAttributeTag iTag = kATSUCGContextTag; ATSUAttributeTag iTag = kATSUCGContextTag;
ATSUAttributeValuePtr iValuePtr=&fl_gc; ATSUAttributeValuePtr iValuePtr=&fl_gc;
ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr);
err = ATSUSetTextPointerLocation(layout, uniStr, kATSUFromTextBeginning, n, n); err = ATSUSetTextPointerLocation(layout, uniStr, kATSUFromTextBeginning, n, n);
#if defined(__APPLE_COCOA__) #if defined(__APPLE_COCOA__)
CGContextSetShouldAntialias(fl_gc, true); CGContextSetShouldAntialias(fl_gc, true);