2001-11-27 20:44:08 +03:00
|
|
|
//
|
2005-02-25 00:55:12 +03:00
|
|
|
// "$Id$"
|
2001-11-27 20:44:08 +03:00
|
|
|
//
|
|
|
|
// Mac header file for the Fast Light Tool Kit (FLTK).
|
|
|
|
//
|
2011-01-18 02:52:32 +03:00
|
|
|
// Copyright 1998-2011 by Bill Spitzak and others.
|
2001-11-27 20:44:08 +03:00
|
|
|
//
|
2011-07-19 08:49:30 +04:00
|
|
|
// 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
|
2001-11-27 20:44:08 +03:00
|
|
|
//
|
2005-04-16 04:13:17 +04:00
|
|
|
// Please report all bugs and problems on the following page:
|
|
|
|
//
|
|
|
|
// http://www.fltk.org/str.php
|
2001-11-27 20:44:08 +03:00
|
|
|
//
|
|
|
|
|
|
|
|
// Do not directly include this file, instead use <FL/x.H>. It will
|
|
|
|
// include this file if "__APPLE__" is defined. This is to encourage
|
|
|
|
// portability of even the system-specific code...
|
2008-09-18 23:09:34 +04:00
|
|
|
#ifndef FL_DOXYGEN
|
2001-11-27 20:44:08 +03:00
|
|
|
|
2008-09-18 23:09:34 +04:00
|
|
|
#if !defined(Fl_X_H)
|
2002-06-07 19:06:32 +04:00
|
|
|
# error "Never use <FL/mac.H> directly; include <FL/x.H> instead."
|
|
|
|
#endif // !Fl_X_H
|
2001-11-27 20:44:08 +03:00
|
|
|
|
2011-11-12 17:06:54 +04:00
|
|
|
#ifdef __OBJC__
|
|
|
|
@class FLWindow; // a subclass of the NSWindow Cocoa class
|
|
|
|
typedef FLWindow *Window;
|
|
|
|
#else
|
|
|
|
typedef class FLWindow_opaque *Window; // pointer to the FLWindow objective-c class
|
|
|
|
#endif // __OBJC__
|
2011-01-10 15:42:17 +03:00
|
|
|
|
2011-01-18 02:52:32 +03:00
|
|
|
#if !(defined(FL_LIBRARY) || defined(FL_INTERNALS)) // this part is used when compiling an application program
|
2011-09-14 19:17:32 +04:00
|
|
|
# include <FL/Fl_Widget.H>
|
2010-12-23 17:24:29 +03:00
|
|
|
|
2011-09-14 19:17:32 +04:00
|
|
|
typedef struct flCocoaRegion* Fl_Region;
|
|
|
|
typedef struct CGContext* CGContextRef;
|
|
|
|
typedef struct OpaquePMPrintSettings* PMPrintSettings;
|
|
|
|
typedef struct OpaquePMPageFormat* PMPageFormat;
|
|
|
|
typedef struct OpaquePMPrintSession* PMPrintSession;
|
|
|
|
typedef struct CGImage* CGImageRef;
|
|
|
|
typedef CGContextRef Fl_Offscreen;
|
2010-12-23 17:24:29 +03:00
|
|
|
|
|
|
|
#else // this part must be compiled when building the FLTK libraries
|
|
|
|
|
2011-01-03 19:50:34 +03:00
|
|
|
// Standard MacOS C/C++ includes...
|
|
|
|
#include <ApplicationServices/ApplicationServices.h>
|
2010-12-23 17:24:29 +03:00
|
|
|
#undef check // because of Fl::check()
|
|
|
|
|
2011-09-14 19:17:32 +04:00
|
|
|
typedef CGContextRef Fl_Offscreen;
|
2009-12-09 02:15:30 +03:00
|
|
|
|
2010-12-23 17:24:29 +03:00
|
|
|
typedef struct flCocoaRegion {
|
|
|
|
int count;
|
|
|
|
CGRect *rects;
|
|
|
|
} *Fl_Region; // a region is the union of a series of rectangles
|
|
|
|
|
|
|
|
# include "Fl_Window.H"
|
|
|
|
|
|
|
|
// Some random X equivalents
|
|
|
|
struct XPoint { int x, y; };
|
|
|
|
struct XRectangle {int x, y, width, height;};
|
2009-12-09 02:15:30 +03:00
|
|
|
#ifndef CGFLOAT_DEFINED //appears with 10.5 in CGBase.h
|
|
|
|
#if defined(__LP64__) && __LP64__
|
|
|
|
typedef double CGFloat;
|
|
|
|
#else
|
2009-12-07 01:21:55 +03:00
|
|
|
typedef float CGFloat;
|
|
|
|
#endif
|
2010-01-30 00:16:20 +03:00
|
|
|
#endif // CGFLOAT_DEFINED
|
2009-12-09 02:15:30 +03:00
|
|
|
|
2010-03-14 21:07:24 +03:00
|
|
|
extern CGRect fl_cgrectmake_cocoa(int x, int y, int w, int h);
|
2009-12-07 01:21:55 +03:00
|
|
|
inline Fl_Region XRectangleRegion(int x, int y, int w, int h) {
|
|
|
|
Fl_Region R = (Fl_Region)malloc(sizeof(*R));
|
|
|
|
R->count = 1;
|
|
|
|
R->rects = (CGRect *)malloc(sizeof(CGRect));
|
2010-03-14 21:07:24 +03:00
|
|
|
*(R->rects) = fl_cgrectmake_cocoa(x, y, w, h);
|
2009-12-07 01:21:55 +03:00
|
|
|
return R;
|
|
|
|
}
|
|
|
|
inline void XDestroyRegion(Fl_Region r) {
|
|
|
|
if(r) {
|
2010-12-23 17:24:29 +03:00
|
|
|
free(r->rects);
|
|
|
|
free(r);
|
|
|
|
}
|
2009-12-07 01:21:55 +03:00
|
|
|
}
|
|
|
|
extern void *fl_system_menu;
|
2010-12-23 17:24:29 +03:00
|
|
|
extern void *fl_default_cursor;
|
2001-11-27 20:44:08 +03:00
|
|
|
|
|
|
|
// This object contains all mac-specific stuff about a window:
|
|
|
|
// WARNING: this object is highly subject to change!
|
2011-01-24 20:04:22 +03:00
|
|
|
class Fl_X {
|
|
|
|
|
2001-11-27 20:44:08 +03:00
|
|
|
public:
|
2010-12-19 01:31:01 +03:00
|
|
|
Window xid; // pointer to the Cocoa window object (FLWindow*)
|
2010-12-23 17:24:29 +03:00
|
|
|
Fl_Offscreen other_xid; // pointer for offscreen bitmaps (overlay window)
|
2002-01-03 11:08:21 +03:00
|
|
|
Fl_Window *w; // FLTK window for
|
2001-11-27 20:44:08 +03:00
|
|
|
Fl_Region region;
|
2002-01-03 11:08:21 +03:00
|
|
|
Fl_Region subRegion; // region for this specific subwindow
|
|
|
|
Fl_X *next; // linked tree to support subwindows
|
|
|
|
Fl_X *xidChildren, *xidNext; // more subwindow tree
|
2001-11-27 20:44:08 +03:00
|
|
|
int wait_for_expose;
|
2010-12-19 01:31:01 +03:00
|
|
|
void *cursor; // is really NSCursor*
|
2001-11-27 20:44:08 +03:00
|
|
|
static Fl_X* first;
|
|
|
|
static Fl_X* i(const Fl_Window* w) {return w->i;}
|
|
|
|
static int fake_X_wm(const Fl_Window*,int&,int&,int&,int&,int&);
|
|
|
|
static void make(Fl_Window*);
|
|
|
|
void flush();
|
2004-08-28 00:02:45 +04:00
|
|
|
// Quartz additions:
|
|
|
|
CGContextRef gc; // graphics context (NULL when using QD)
|
|
|
|
static void q_fill_context(); // fill a Quartz context with current FLTK state
|
|
|
|
static void q_clear_clipping(); // remove all clipping from a Quartz context
|
|
|
|
static void q_release_context(Fl_X *x=0); // free all resources associated with fl_gc
|
2004-09-01 02:00:49 +04:00
|
|
|
static void q_begin_image(CGRect&, int x, int y, int w, int h);
|
2004-08-31 04:27:40 +04:00
|
|
|
static void q_end_image();
|
2010-12-19 01:31:01 +03:00
|
|
|
// Cocoa additions
|
|
|
|
void destroy(void);
|
|
|
|
void map(void);
|
|
|
|
void unmap(void);
|
|
|
|
int unlink(Fl_X* start = NULL);
|
|
|
|
void collapse(void);
|
|
|
|
WindowRef window_ref(void);
|
|
|
|
void set_key_window(void);
|
|
|
|
void set_cursor(Fl_Cursor);
|
|
|
|
static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h);
|
|
|
|
static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel);
|
|
|
|
static Fl_Region intersect_region_and_rect(Fl_Region current, int x,int y,int w, int h);
|
|
|
|
static CGContextRef watch_cursor_image(void);
|
|
|
|
static CGContextRef help_cursor_image(void);
|
|
|
|
static CGContextRef nesw_cursor_image(void);
|
|
|
|
static CGContextRef nwse_cursor_image(void);
|
|
|
|
static CGContextRef none_cursor_image(void);
|
2011-01-03 19:50:34 +03:00
|
|
|
static void *get_carbon_function(const char *name);
|
Fix STR#2695 & 2697: correct computation of work areas with multiple screens.
This introduces 3 new functions
static void Fl::screen_work_area(X,Y,W,H)
static void Fl::screen_work_area(X,Y,W,H,mx,my)
static void Fl::screen_work_area(X,Y,W,H,screen_no)
that compute screen work areas and are used by FLTK to position menu windows.
The Fl::x(),y(),w(),h() functions are made consistent across platforms: they return
the origin/size of the work area of the main screen (as far as possible, see below).
On the Mac OS platform, all screen functions reflect changes in screen number and
positions without requiring the application to restart.
On the X11 platform, I did not find an API to compute the main screen work area
in all conditions. What's used does compute the correct work area when there's
a single screen, but not when there are several, because it returns an area that
encompasses all screens. The implemented workaround is that Fl::x(),y(),w(),h()
and Fl::screen_work_area(X,Y,W,H,0) return the exact work area when there's
a single screen, and return the full screen area when there are several.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9084 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
2011-09-29 20:04:24 +04:00
|
|
|
static void screen_work_area(int &X, int &Y, int &W, int &H, int n); // compute work area of a given screen
|
2010-12-19 01:31:01 +03:00
|
|
|
private:
|
|
|
|
static void relink(Fl_Window*, Fl_Window*);
|
2011-03-28 13:28:05 +04:00
|
|
|
bool subwindow;
|
2001-11-27 20:44:08 +03:00
|
|
|
};
|
|
|
|
|
2011-09-14 19:17:32 +04:00
|
|
|
extern Window fl_window;
|
2010-12-23 17:24:29 +03:00
|
|
|
|
2011-01-18 02:52:32 +03:00
|
|
|
#endif // FL_LIBRARY || FL_INTERNALS
|
2010-12-23 17:24:29 +03:00
|
|
|
|
2011-09-14 19:17:32 +04:00
|
|
|
#ifndef MAC_OS_X_VERSION_10_4
|
|
|
|
#define MAC_OS_X_VERSION_10_4 1040
|
|
|
|
#endif
|
|
|
|
#ifndef MAC_OS_X_VERSION_10_5
|
|
|
|
#define MAC_OS_X_VERSION_10_5 1050
|
|
|
|
#endif
|
|
|
|
#ifndef MAC_OS_X_VERSION_10_6
|
|
|
|
#define MAC_OS_X_VERSION_10_6 1060
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef CGImageRef Fl_Bitmask;
|
|
|
|
|
|
|
|
extern CGContextRef fl_gc;
|
|
|
|
extern class Fl_Sys_Menu_Bar *fl_sys_menu_bar;
|
2001-11-27 20:44:08 +03:00
|
|
|
|
2010-12-23 17:24:29 +03:00
|
|
|
extern Window fl_xid(const Fl_Window*);
|
2011-09-02 18:42:02 +04:00
|
|
|
extern Fl_Window* fl_find(Window xid);
|
2010-12-23 17:24:29 +03:00
|
|
|
void fl_clip_region(Fl_Region);
|
2001-11-27 20:44:08 +03:00
|
|
|
|
2011-09-14 19:17:32 +04:00
|
|
|
extern Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data);
|
|
|
|
extern Fl_Bitmask fl_create_alphamask(int w, int h, int d, int ld, const uchar *data);
|
|
|
|
extern void fl_delete_bitmask(Fl_Bitmask bm);
|
2001-11-27 20:44:08 +03:00
|
|
|
extern Fl_Offscreen fl_create_offscreen(int w, int h);
|
|
|
|
extern void fl_copy_offscreen(int x,int y,int w,int h, Fl_Offscreen gWorld, int srcx,int srcy);
|
|
|
|
extern void fl_delete_offscreen(Fl_Offscreen gWorld);
|
|
|
|
extern void fl_begin_offscreen(Fl_Offscreen gWorld);
|
|
|
|
extern void fl_end_offscreen();
|
|
|
|
|
2011-09-14 19:17:32 +04:00
|
|
|
extern int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b);
|
2001-11-27 20:44:08 +03:00
|
|
|
extern void fl_open_display();
|
|
|
|
|
2008-09-18 23:09:34 +04:00
|
|
|
#endif // FL_DOXYGEN
|
2010-03-16 17:47:40 +03:00
|
|
|
|
2011-02-02 00:31:57 +03:00
|
|
|
/** \defgroup group_macosx Mac OS X-specific symbols
|
|
|
|
Mac OS X-specific symbols declared in <FL/x.H> or <FL/gl.h>
|
2010-03-16 17:47:40 +03:00
|
|
|
@{ */
|
|
|
|
|
2011-02-02 00:31:57 +03:00
|
|
|
/** @brief Register a function called for each file dropped onto an application icon.
|
|
|
|
\e cb will be called with a single Unix-style file name and path.
|
|
|
|
If multiple files were dropped, \e cb will be called multiple times.
|
2010-07-01 20:51:28 +04:00
|
|
|
*/
|
|
|
|
extern void fl_open_callback(void (*cb)(const char *));
|
|
|
|
|
2010-03-16 17:47:40 +03:00
|
|
|
/**
|
2010-07-01 20:51:28 +04:00
|
|
|
* \brief Attaches a callback to the "About myprog" item of the system application menu.
|
2010-03-16 17:47:40 +03:00
|
|
|
*
|
|
|
|
* \param cb a callback that will be called by "About myprog" menu item
|
|
|
|
* with NULL 1st argument.
|
|
|
|
* \param user_data a pointer transmitted as 2nd argument to the callback.
|
|
|
|
* \param shortcut optional shortcut to attach to the "About myprog" menu item (e.g., FL_META+'a')
|
|
|
|
*/
|
|
|
|
extern void fl_mac_set_about( Fl_Callback *cb, void *user_data, int shortcut = 0);
|
2010-11-25 21:21:21 +03:00
|
|
|
|
2011-03-04 20:04:43 +03:00
|
|
|
/** \brief The version number of the running Mac OS X (e.g., 100604 for 10.6.4)
|
2010-11-25 21:21:21 +03:00
|
|
|
*/
|
2011-02-02 00:31:57 +03:00
|
|
|
extern int fl_mac_os_version;
|
|
|
|
|
|
|
|
class Fl_Mac_App_Menu {
|
|
|
|
public:
|
|
|
|
/** Localizable text for the "About xxx" application menu item */
|
|
|
|
static const char *about;
|
|
|
|
/** Localizable text for the "Print Front Window" application menu item.
|
|
|
|
This menu item won't be displayed if Fl_Mac_App_Menu::print
|
|
|
|
is set to an empty string.
|
|
|
|
*/
|
|
|
|
static const char *print;
|
|
|
|
/** Localizable text for the "Services" application menu item */
|
|
|
|
static const char *services;
|
|
|
|
/** Localizable text for the "Hide xxx" application menu item */
|
|
|
|
static const char *hide;
|
|
|
|
/** Localizable text for the "Hide Others" application menu item */
|
|
|
|
static const char *hide_others;
|
|
|
|
/** Localizable text for the "Show All" application menu item */
|
|
|
|
static const char *show;
|
|
|
|
/** Localizable text for the "Quit xxx" application menu item */
|
|
|
|
static const char *quit;
|
|
|
|
};
|
2010-11-25 21:21:21 +03:00
|
|
|
|
2010-03-16 17:47:40 +03:00
|
|
|
/** @} */
|
|
|
|
|
2001-11-27 20:44:08 +03:00
|
|
|
//
|
2005-02-25 00:55:12 +03:00
|
|
|
// End of "$Id$".
|
2001-11-27 20:44:08 +03:00
|
|
|
//
|
|
|
|
|