summaryrefslogtreecommitdiffstats
path: root/macosx/ttkMacOSXTheme.c
diff options
context:
space:
mode:
authordas <das>2007-04-23 21:24:32 (GMT)
committerdas <das>2007-04-23 21:24:32 (GMT)
commit11dbb8af58fd851913e5c781e3164e8211e93745 (patch)
tree1a0bc7c114e940c5e46d3704ac14fb34f4cc029e /macosx/ttkMacOSXTheme.c
parent24b160e09ae3ca4b52502fe59ddcd5fc80e00713 (diff)
downloadtk-11dbb8af58fd851913e5c781e3164e8211e93745.zip
tk-11dbb8af58fd851913e5c781e3164e8211e93745.tar.gz
tk-11dbb8af58fd851913e5c781e3164e8211e93745.tar.bz2
* macosx/tkMacOSXCarbonEvents.c: add window event target carbon event
* macosx/tkMacOSXEvent.c: handler for all kEventClassWindow and * macosx/tkMacOSXEvent.h: kEventClassMouse events; * macosx/tkMacOSXNotify.c: move all remaining events except for * macosx/tkMacOSXWindowEvent.c: kEventClassKeyboard from dispatcher to application event handler; pass event handler callRef downstream; fix debug event tracing; process all tcl event types in carbon event timer; delay carbon event timer first fire; add TkMacOSXTrackingLoop() to mark enter/exit of event tracking loop during which all tcl events but only carbon update events should be processed by the timer (replaces various calls to Tcl_SetServiceMode()); rename TkMacOSXReceiveAndProcessEvent() to TkMacOSXReceiveAndDispatchEvent(), move it from tkMacOSXEvent.c to tkMacOSXCarbonEvents.c and modify it to dequeue only update events during a tracking loop; add TkMacOSXRunTclEventLoop() to standardize the various ways in use to run the tcl event loop; add handling of kEventClassAppearance events (for ScrollBarVariantChanged event). * macosx/tkMacOSXDialog.c: use new TkMacOSXTrackingLoop() around * macosx/tkMacOSXEvent.c: blocking API that puts up modal dialogs * macosx/tkMacOSXMenu.c: or when entering/exiting menu/control * macosx/tkMacOSXMouseEvent.c: tracking, window dragging and other * macosx/tkMacOSXScale.c: mouse tracking loops. * macosx/tkMacOSXScrlbr.c: * macosx/tkMacOSXWindowEvent.c: * macosx/tkMacOSXWm.c: * macosx/tkMacOSXDialog.c: use new TkMacOSXRunTclEventLoop() * macosx/tkMacOSXScale.c: instead of Tcl_DoOneEvent(), * macosx/tkMacOSXScrlbr.c: Tcl_ServiceAll(), TclServiceIdle() * macosx/tkMacOSXWindowEvent.c: and Tcl_GlobalEval("update idletasks"). * macosx/tkMacOSXColor.c: make available as Tk system colors all * macosx/tkMacOSXPort.h: appearance manager brushes, text colors and backgrounds with new and legacy names, as well as the fully transparent color "systemTransparent"; add TkMacOSXSetColorIn{Port,Context}() to directly set an X pixel color value in the current QD port resp. the given CG context without requiring passage through rgb representation (lossy for most system colors); modernize/remove Classic-era code; replace crufty strcmp() elseifs by Tcl_GetIndexFromObjStruct(). * macosx/tkMacOSXButton.c: use new TkMacOSXSetColorInPort() * macosx/tkMacOSXDraw.c: instead of setting rgb color directly * macosx/tkMacOSXMenubutton.c: to allow for non-rgb system colors. * macosx/tkMacOSXCursor.c: implement "none" cursor as on other platforms [Patch 1615427]; add all missing appearance manager cursors. * macosx/tkMacOSXDefault.h: set SELECT_FG_COLORs to None to match aqua L&F; use standard system color names; use new 'menu' system font; correct default scrollbar width. * macosx/tkMacOSXDraw.c: standardize initialization, use and * macosx/tkMacOSXInt.h: emptying of various static temp rgns * macosx/tkMacOSXRegion.c: onto two global RgnHandles; in debug * macosx/tkMacOSXSubwindows.c: builds, verify emptiness of these temp * macosx/tkMacOSXWindowEvent.c: rgns before use. * macosx/tkMacOSXDraw.c: add TkMacOSX{Setup,Restore}DrawingContext() to * macosx/tkMacOSXInt.h: abstract common setup & teardown of drawing environment (for both CG and QD); save/restore QD theme drawing state; handle GC clip region; add TkpClipDrawableToRect() to allow clipped drawing into drawable regardless of GC used; use new system color "systemWindowHeaderBackground" to setup background in themed toplevels; correct implementation of TkMacOSXMakeStippleMap(). * macosx/tkMacOSXEntry.c: use new TkMacOSXSetupDrawingContext() and * macosx/tkMacOSXFont.c: TkMacOSXRestoreDrawingContext() instead of * macosx/ttkMacOSXTheme.c: various setup/teardown procs like TkMacOSX{SetUp,Release}CGContext(), TkMacOSXQuarz{Start,End}Draw(), TkMacOSXSetUpGraphicsPort() etc. * macosx/tkMacOSXEmbed.c: add CG context and drawable clip rgn fields * macosx/tkMacOSXInt.h: to MacDrawable struct. * macosx/tkMacOSXSubwindows.c: * macosx/tkMacOSXDialog.c: make -parent option of tk_getOpenFile et al. use the sheet version of NavServices dialogs; ensure native parent win exists before using StandardSheet API for tk_messageBox [Bug 1677611]; force sheets to behave like app-modal dialogs via WindowModality() API; use more modern ColorPicker API. * macosx/tkAboutDlg.r: use themed movable modal dialog, fix (c) year. * macosx/tkMacOSXEntry.c: take xOff/yOff of MacDrawable into account * macosx/ttkMacOSXTheme.c: when computing locations/bounds to ensure correct posititioning when not drawing into intermediate pixmap. * macosx/tkMacOSXFont.c: use appearance manager API to map system font * macosx/tkMacOSXFont.h: names to TkFonts; add "menu" system font for menu item text drawing from MDEF; always draw with CG; remove QD dependent stippling algorithm; move most header declarations into the source file (as they were not used anywhere else). * macosx/tkMacOSXMenu.c: large-scale rewrite of custom * macosx/tkMacOSXMenu.r (removed): MDEF and related code that * macosx/Wish.xcode/project.pbxproj: restores many longtime-MIA * macosx/Wish.xcodeproj/project.pbxproj: features to working order * unix/Makefile.in: (e.g. images, custom colors & fonts in menus etc); implement compound menu items; use Appearance Mgr and ThemeText APIs to mimic native MDEF as closely as possible when default "menu" system font is used; remove now obsolete SICN drawing code and resources. * macosx/tkMacOSXCarbonEvents.c: handle additional menu carbon events * macosx/tkMacOSXEvent.c: in order to support <<MenuSelect>> in * macosx/tkMacOSXMenu.c: the menubar and in menus that are not * macosx/tkMacOSXMenus.c: using the custom MDEF [Bug 1620826]; fix early and missing clearing of current Tk active menu entry; fix extraneous sending of <<MenuSelect>> during active menu entry clearing. * macosx/tkMacOSXMouseEvent.c: add support for async window dragging by the window server; set the corresponding window attribute by default. * macosx/tkMacOSXMouseEvent.c: rationalized handling order of non-mousedown events; add TkMacOSXModifierState() to retrieve the current key modifiers in carbon format. * macosx/tkMacOSXScrlbr.c: use appearance manager API to retrieve scrollbar component metrics; add awareness of multiple possibilites for scrollbar arrow position in aqua and handle user changes to arrow position pref; handle difference in metrics of small & large scrollbar variants; handle aqua "jump to here" scrollbar behaviour; correct computation of scroll view size and position; enforce min scrollbar height to avoid scrollbar component overlap; erase scrollbar area outside of standard width; remove broken auto-adjust code; account for window class when leaving space for grow box; remove code to manually draw grow box; use modern API for thumb scroll proc; replace HiliteControl() by modern API; replace control mgr constants with appearance mgr equivalents. * macosx/tkMacOSXSubwindows.c: use SetWindowBounds() API instead of SizeWindow(); invalidate clip regions after X{Map,Unmap}Window as fix for [Bug 940117] made them dependent on mapping state; remove unneeded calls to TkMacOSXInvalClipRgns() and unnecessary setting of QD port; use native-endian pixmap on intel; remove obsolete pixmap pix locking. * macosx/tkMacOSXWindowEvent.c: handle only the first of a batch of kEventAppAvailableWindowBoundsChanged events sent per transaction; handle kEventWindowBoundsChanged event to support live window resizing and centralized sending of location/size changed ConfigureNotify events; ensure HIGrowBox is redrawn after bounds change; constrain window after dragging to ensure titlebar is not inacessible offscreen or under dock/menubar; handle kEventWindowGetRegion and kEventWindowDrawContent for transparent windows to mark resp. paint content region as transparent; handle kEventWindowConstrain for fullscreen windows to ensure bounds match new screen size; enter/exit fullscreen UIMode upon activation/deactivation of fullscreen window. * macosx/tkMacOSXWm.c: use live-resize and async-drag carbon window * macosx/tkMacOSXWm.h: attributes for toplevels by default; implement new [wm attributes] -topmost, -transparent and -fullscreen; refactor WmAttributesCmd() parallelling the tkUnixWm.c implementation, use thus factored proc to set proxy icon from [wm iconbitmap]; dynamically determine default values for toplevel min and max sizes (similar to tkWinWm.c impl): min sizes depend on window class & attributes to ensure visibility of all titlebar widgets and grow box, max sizes depend on maximal window bounds for all active displays; factor out code that puts into effect changes to master or override_redirect; use RepositionWindow() API to determine staggered initial window bounds; correct resize limit calculations, handle gridding and use modern resize API in TkMacOSXGrowToplevel(); remove sending of ConfigureNotify after resize or zoom (now handled by BoundsChanged handler); correct composite carbon window attribute handling, remove currently unusable attributes and add new attributes in [tk::unsupported::MacWindowStyle]; ensure validity of window class and attributes before use; apply changes to window class when handling carbon window attribute changes (if HIWindowChangeClass() API available); add debug build warning message when deprecated window style is used instead of window class; use transparent HIGrowBox for resizable windows; avoid unnecessary calls to window structure width API; use tcl time API in TkpGetMS(); add TkMacOSXEnterExitFullscreen() to enter/exit UIMode with dock and menubar hidden; restrict wmTracing output to debug builds; remove unneeded calls to TkMacOSXInvalClipRgns() and unnecessary setting of QD port; workaround GetWindowStructureWidths() Carbon bug (bogus results for never-mapped floating windows). * macosx/tkMacOSXXStubs.c (TkMacOSXDisplayChanged): add maximal window bounds field to Screen record (in ext_data), computed as the union of available window positioning bounds of all graphics devices (displays). * macosx/tkMacOSXBitmap.c: fix macRoman encoding leak. * macosx/tkMacOSXCursor.c: * macosx/tkMacOSXDebug.c (TkMacOSXCarbonEventToAscii): use static * macosx/tkMacOSXDebug.h: buffer to simplify callers; const fixes. * macosx/tkMacOSXBitmap.c: use more efficient QDSwapPort() instead of * macosx/tkMacOSXButton.c: GetPort()/SetPort()/GetGWorld()/SetGWorld(). * macosx/tkMacOSXDraw.c: * macosx/tkMacOSXMenubutton.c: * macosx/tkMacOSXScale.c: * macosx/tkMacOSXScrlbr.c: * macosx/tkMacOSXXStubs.c: * macosx/tkMacOSXColor.c: use kHIToolboxVersionNumber for runtime OS * macosx/tkMacOSXEntry.c: version check rather than Gestalt() etc. * macosx/tkMacOSXInt.h: * macosx/tkMacOSXWm.c: * macosx/tkMacOSXDraw.c: remove obsolete and now incorrect * macosx/tkMacOSXInt.h: tkMenuCascadeRgn clipping code. * macosx/tkMacOSXMenu.c: * macosx/tkMacOSXHLEvents.c: replace Tcl_GlobalEval() resp. Tcl_Eval() * macosx/tkMacOSXScrlbr.c: by Tcl_EvalEx(). * macosx/tkMacOSXInit.c: * macosx/tkMacOSXInit.c (TkpInit): reorder initialization steps. * macosx/tkMacOSXKeyEvent.c: remove pre-10.2 support. * macosx/tkMacOSXMenus.c: remove now useless call to TkMacOSXHandleTearoffMenu(); use \x.. quoting for non-latin1 macroman literar chars to allow file to be edited as utf-8. * macosx/tkMacOSXScale.c: replace TrackControl() by modern * macosx/tkMacOSXScrlbr.c: HandleControlClick() API (using new TkMacOSXModifierState()). * macosx/tkMacOSXInt.h: move all constant #defines needed to * macosx/tkMacOSXColor.c: support building on older OS X releases * macosx/tkMacOSXEvent.h: to a central location in tkMacOSXInt.h. * macosx/tkMacOSXFont.c: * macosx/tkMacOSXMenu.c: * macosx/tkMacOSXMenubutton.c: * macosx/tkMacOSXMenus.c: * macosx/tkMacOSXMouseEvent.c: * macosx/tkMacOSXWm.c: * macosx/ttkMacOSXTheme.c: * macosx/tkMacOSXInt.h: add ChkErr() macro to factor out * macosx/tkMacOSXButton.c: Carbon OSStatus return value checking * macosx/tkMacOSXCarbonEvents.c: and TkMacOSXDbgMsg() macro to factour * macosx/tkMacOSXClipboard.c: out debug message output; use these * macosx/tkMacOSXColor.c: macros to replace #ifdef TK_MAC_DEBUG * macosx/tkMacOSXCursor.c: blocks & direct printing to stderr, * macosx/tkMacOSXDebug.c: and to do additional OSStatus return * macosx/tkMacOSXDialog.c: checking, and to standardize OSStatus * macosx/tkMacOSXDraw.c: usage. * macosx/tkMacOSXEntry.c: * macosx/tkMacOSXEvent.c: * macosx/tkMacOSXFont.c: * macosx/tkMacOSXHLEvents.c: * macosx/tkMacOSXInit.c: * macosx/tkMacOSXKeyEvent.c: * macosx/tkMacOSXMenu.c: * macosx/tkMacOSXMenubutton.c: * macosx/tkMacOSXMenus.c: * macosx/tkMacOSXMouseEvent.c: * macosx/tkMacOSXScrlbr.c: * macosx/tkMacOSXSubwindows.c: * macosx/tkMacOSXWindowEvent.c: * macosx/tkMacOSXWm.c: * macosx/tkMacOSXXStubs.c: * macosx/tkMacOSXSend.c: remove duplicate/unused declarations * macosx/tkMacOSXXStubs.c: * macosx/tkMacOSXDebug.c: const fixes. * macosx/tkMacOSXInit.c: * macosx/tkMacOSXTest.c: * macosx/tkMacOSXWm.c: * macosx/tkMacOSXXStubs.c: * macosx/Wish-Info.plist.in: add tcl document extensions/mime types and LSMinimumSystemVersion, LSRequiresCarbon & NSAppleScriptEnabled keys. * macosx/Wish-Common.xcconfig: add Wish's Info.plist as __info_plist section to tktest; enable more warnings. * macosx/Wish.xcodeproj/project.pbxproj: add 'DebugMemCompile' build configuration that calls configure with --enable-symbols=all; disable configure check for __attribute__((__visibility__("hidden"))) in Debug configuration to restore availability of ZeroLink. * macosx/Wish-Common.xcconfig: fix whitespace. * macosx/Wish-Debug.xcconfig: * macosx/Wish-Release.xcconfig: * macosx/tkMacOSXAETE.r: * macosx/tkMacOSXConfig.c: * macosx/tkMacOSXCursors.r: * macosx/tkMacOSXKeyboard.c: * macosx/tkMacOSXSend.c: * macosx/ttkMacOSXTheme.c: * macosx/tkMacOSXXCursors.r: * macosx/README: * macosx/GNUmakefile: fix/add copyright and license refs. * macosx/Tk-Info.plist.in: * macosx/Wish-Info.plist.in: * macosx/Wish.xcode/project.pbxproj: * macosx/Wish.xcodeproj/project.pbxproj: * macosx/tkMacOSX.h:
Diffstat (limited to 'macosx/ttkMacOSXTheme.c')
-rw-r--r--macosx/ttkMacOSXTheme.c303
1 files changed, 158 insertions, 145 deletions
diff --git a/macosx/ttkMacOSXTheme.c b/macosx/ttkMacOSXTheme.c
index e2bd709..31e3668 100644
--- a/macosx/ttkMacOSXTheme.c
+++ b/macosx/ttkMacOSXTheme.c
@@ -1,10 +1,11 @@
/*
- * $Id: ttkMacOSXTheme.c,v 1.5 2006/12/30 23:23:26 cc_benny Exp $
+ * ttkMacOSXTheme.c --
*
- * Tk theme engine for Mac OSX, using the Appearance Manager API.
+ * Tk theme engine for Mac OSX, using the Appearance Manager API.
*
* Copyright (c) 2004 Joe English
* Copyright (c) 2005 Neil Madden
+ * Copyright (c) 2006-2007 Daniel A. Steffen <das@users.sourceforge.net>
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -12,30 +13,27 @@
* See also:
*
* <URL: http://developer.apple.com/documentation/Carbon/Reference/
- * Appearance_Manager/appearance_manager/APIIndex.html >
+ * Appearance_Manager/appearance_manager/APIIndex.html >
*
* Notes:
- * "Active" means different things in Mac and Tk terminology --
+ * "Active" means different things in Mac and Tk terminology --
* On Aqua, widgets are "Active" if they belong to the foreground window,
* "Inactive" if they are in a background window.
* Tk/ttk uses the term "active" to mean that the mouse cursor
* is over a widget; aka "hover", "prelight", or "hot-tracked".
* (Aqua doesn't use this kind of feedback).
*
- * The QuickDraw/Carbon coordinate system is relative to the
- * top-level window, *not* to the Tk_Window. However,
+ * The QuickDraw/Carbon coordinate system is relative to the
+ * top-level window, *not* to the Tk_Window. However,
* since we're drawing into an off-screen port (Tk "Pixmap),
* we don't need to account for this.
+ *
+ * RCS: @(#) $Id: ttkMacOSXTheme.c,v 1.6 2007/04/23 21:24:34 das Exp $
*/
#include "tkMacOSXInt.h"
#include "ttk/ttkTheme.h"
-/* Define a constant that was renamed for Mac OS X 10.4 */
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1040
-#define kThemeDisclosureTriangle kThemeDisclosureButton
-#endif
-
/*----------------------------------------------------------------------
* +++ Utilities.
*/
@@ -44,6 +42,7 @@ static
Rect BoxToRect(Ttk_Box b)
{
Rect rect;
+
rect.top = b.y;
rect.left = b.x;
rect.bottom = b.y + b.height;
@@ -52,18 +51,24 @@ Rect BoxToRect(Ttk_Box b)
}
/* DontErase --
- * No-op ThemeEraseProc, can be passed to DrawThemeButton &c.
+ * No-op ThemeEraseProc, can be passed to DrawThemeButton &c.
*/
static void DontErase(
const Rect *bounds, UInt32 eraseData, SInt16 depth, Boolean isColorDev)
{ }
-#define BEGIN_DRAWING(d) { \
- CGrafPtr saveWorld; GDHandle saveDevice; \
- GetGWorld(&saveWorld, &saveDevice); \
- SetGWorld(TkMacOSXGetDrawablePort(d), 0) ;
-#define END_DRAWING \
- SetGWorld(saveWorld,saveDevice); }
+#define BEGIN_DRAWING(d) do { \
+ TkMacOSXDrawingContext dc; \
+ TkMacOSXSetupDrawingContext((d), NULL, 0, &dc)
+#define END_DRAWING() \
+ TkMacOSXRestoreDrawingContext(&dc); \
+ } while (0)
+#define OFFSET_RECT(d, r) do { \
+ OffsetRect(&(r), ((MacDrawable*)(d))->xOff, ((MacDrawable*)(d))->yOff);\
+ } while (0)
+#define OFFSET_POINT(d, p) do { \
+ (p).h += ((MacDrawable*)(d))->xOff; (p).v += ((MacDrawable*)(d))->yOff;\
+ } while (0)
/* Table mapping Tk states to Appearance manager ThemeStates
*/
@@ -86,7 +91,7 @@ static Ttk_StateTable ThemeStateTable[] = {
};
/*----------------------------------------------------------------------
- * +++ Button element: Used for elements drawn with DrawThemeButton.
+ * +++ Button element: Used for elements drawn with DrawThemeButton.
*/
/* Extra margins to account for drop shadow.
@@ -96,8 +101,8 @@ static Ttk_Padding ButtonMargins = {2,2,2,2};
#define NoThemeMetric 0xFFFFFFFF
typedef struct {
- ThemeButtonKind kind;
- ThemeMetric heightMetric;
+ ThemeButtonKind kind;
+ ThemeMetric heightMetric;
} ThemeButtonParms;
static ThemeButtonParms
@@ -130,6 +135,7 @@ static ThemeButtonDrawInfo computeButtonDrawInfo(
ThemeButtonParms *parms, Ttk_State state)
{
ThemeButtonDrawInfo info;
+
info.state = Ttk_StateTableLookup(ThemeStateTable, state);
info.value = Ttk_StateTableLookup(ButtonValueTable, state);
info.adornment = Ttk_StateTableLookup(ButtonAdornmentTable, state);
@@ -144,6 +150,7 @@ static void ButtonElementGeometryNoPadding(
if (parms->heightMetric != NoThemeMetric) {
SInt32 gratuitouslyOverspecifiedType;
+
GetThemeMetric(parms->heightMetric, &gratuitouslyOverspecifiedType);
*heightPtr = gratuitouslyOverspecifiedType;
}
@@ -158,9 +165,8 @@ static void ButtonElementGeometry(
Rect scratchRect, contentsRect;
const int scratchSize = 100;
- ButtonElementGeometryNoPadding(
- clientData, elementRecord, tkwin,
- widthPtr, heightPtr, paddingPtr);
+ ButtonElementGeometryNoPadding(clientData, elementRecord, tkwin, widthPtr,
+ heightPtr, paddingPtr);
/* To compute internal padding, query the appearance manager
* for the content bounds of a dummy rectangle, then use
@@ -192,14 +198,14 @@ static void ButtonElementDraw(
ThemeButtonParms *parms = clientData;
ThemeButtonDrawInfo info = computeButtonDrawInfo(parms, state);
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeButton(&bounds, parms->kind, &info,
NULL/*prevInfo*/,NULL/*eraseProc*/,NULL/*labelProc*/,0/*userData*/);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec ButtonElementSpec =
-{
+static Ttk_ElementSpec ButtonElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -214,7 +220,7 @@ static Ttk_ElementSpec ButtonElementSpec =
static Ttk_StateTable TabStyleTable[] = {
{ kThemeTabFrontInactive, TTK_STATE_SELECTED|TTK_STATE_BACKGROUND, 0 },
{ kThemeTabNonFrontInactive, TTK_STATE_BACKGROUND, 0 },
- { kThemeTabFrontUnavailable, TTK_STATE_DISABLED|TTK_STATE_SELECTED, 0 },
+ { kThemeTabFrontUnavailable, TTK_STATE_DISABLED|TTK_STATE_SELECTED, 0 },
{ kThemeTabNonFrontUnavailable, TTK_STATE_DISABLED, 0 },
{ kThemeTabFront, TTK_STATE_SELECTED, 0 },
{ kThemeTabNonFrontPressed, TTK_STATE_PRESSED, 0 },
@@ -243,16 +249,17 @@ static void TabElementDraw(
Drawable d, Ttk_Box b, Ttk_State state)
{
Rect bounds = BoxToRect(b);
+
bounds.bottom += TAB_OVERLAP;
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeTab(
- &bounds, Ttk_StateTableLookup(TabStyleTable, state), kThemeTabNorth,
+ &bounds, Ttk_StateTableLookup(TabStyleTable, state), kThemeTabNorth,
0/*labelProc*/,0/*userData*/);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec TabElementSpec =
-{
+static Ttk_ElementSpec TabElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -275,14 +282,15 @@ static void PaneElementDraw(
Drawable d, Ttk_Box b, Ttk_State state)
{
Rect bounds = BoxToRect(b);
- BEGIN_DRAWING(d)
+
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeTabPane(
- &bounds, Ttk_StateTableLookup(ThemeStateTable, state));
- END_DRAWING
+ &bounds, Ttk_StateTableLookup(ThemeStateTable, state));
+ END_DRAWING();
}
-static Ttk_ElementSpec PaneElementSpec =
-{
+static Ttk_ElementSpec PaneElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -311,14 +319,14 @@ static void GroupElementDraw(
Drawable d, Ttk_Box b, Ttk_State state)
{
Rect bounds = BoxToRect(b);
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemePrimaryGroup(
- &bounds, Ttk_StateTableLookup(ThemeStateTable, state));
- END_DRAWING
+ &bounds, Ttk_StateTableLookup(ThemeStateTable, state));
+ END_DRAWING();
}
-static Ttk_ElementSpec GroupElementSpec =
-{
+static Ttk_ElementSpec GroupElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -327,9 +335,9 @@ static Ttk_ElementSpec GroupElementSpec =
};
/*----------------------------------------------------------------------
- * +++ Entry element --
- * 3 pixels padding for focus rectangle
- * 2 pixels padding for EditTextFrame
+ * +++ Entry element --
+ * 3 pixels padding for focus rectangle
+ * 2 pixels padding for EditTextFrame
*/
typedef struct {
@@ -358,29 +366,27 @@ static void EntryElementDraw(
Ttk_Box inner = Ttk_PadBox(b, Ttk_UniformPadding(3));
Rect bounds = BoxToRect(inner);
- BEGIN_DRAWING(d)
-
/* Erase w/background color:
*/
XFillRectangle(Tk_Display(tkwin), d,
Tk_3DBorderGC(tkwin, backgroundPtr, TK_3D_FLAT_GC),
inner.x,inner.y, inner.width, inner.height);
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
/* Draw border:
*/
DrawThemeEditTextFrame(
- &bounds, Ttk_StateTableLookup(ThemeStateTable, state));
+ &bounds, Ttk_StateTableLookup(ThemeStateTable, state));
/* Draw focus highlight:
*/
if (state & TTK_STATE_FOCUS)
DrawThemeFocusRect(&bounds, 1);
-
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec EntryElementSpec =
-{
+static Ttk_ElementSpec EntryElementSpec = {
TK_STYLE_VERSION_2,
sizeof(EntryElement),
EntryElementOptions,
@@ -395,7 +401,7 @@ static Ttk_ElementSpec EntryElementSpec =
*/
static void PopupArrowElementGeometry(
- void *clientData, void *elementRecord, Tk_Window tkwin,
+ void *clientData, void *elementRecord, Tk_Window tkwin,
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
{
*widthPtr = 12; /* wild-assed guess */
@@ -403,11 +409,10 @@ static void PopupArrowElementGeometry(
}
static void PopupArrowElementDraw(
- void *clientData, void *elementRecord, Tk_Window tkwin,
+ void *clientData, void *elementRecord, Tk_Window tkwin,
Drawable d, Ttk_Box b, Ttk_State state)
{
Rect bounds = BoxToRect(b);
-
ThemeButtonParms *parms = clientData;
ThemeButtonDrawInfo info = computeButtonDrawInfo(parms, state);
@@ -416,7 +421,8 @@ static void PopupArrowElementDraw(
bounds.right -= 6;
bounds.bottom -= 2;
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeButton(&bounds, kThemeArrowButton, &info,
NULL/*prevInfo*/,NULL/*eraseProc*/,NULL/*labelProc*/,0/*userData*/);
@@ -426,16 +432,16 @@ static void PopupArrowElementDraw(
bounds.left -= 2;
bounds.right -= 2;
+ OFFSET_RECT(d, bounds);
DrawThemePopupArrow(&bounds,
- kThemeArrowDown,
+ kThemeArrowDown,
kThemeArrow9pt, /* ??? */
Ttk_StateTableLookup(ThemeStateTable, state),
NULL /*eraseProc*/,0/*eraseData*/);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec PopupArrowElementSpec =
-{
+static Ttk_ElementSpec PopupArrowElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -445,7 +451,7 @@ static Ttk_ElementSpec PopupArrowElementSpec =
/*----------------------------------------------------------------------
* +++ DrawThemeTrack-based elements --
- * Progress bars and scales. (See also: <<NOTE-TRACKS>>)
+ * Progress bars and scales. (See also: <<NOTE-TRACKS>>)
*/
static Ttk_StateTable ThemeTrackEnableTable[] = {
@@ -460,14 +466,15 @@ typedef struct { /* TrackElement client data */
SInt32 thicknessMetric;
} TrackElementData;
-static TrackElementData ScaleData =
- { kThemeSlider, kThemeMetricHSliderHeight };
+static TrackElementData ScaleData = {
+ kThemeSlider, kThemeMetricHSliderHeight
+};
typedef struct {
Tcl_Obj *fromObj; /* minimum value */
Tcl_Obj *toObj; /* maximum value */
Tcl_Obj *valueObj; /* current value */
- Tcl_Obj *orientObj; /* horizontal / vertical */
+ Tcl_Obj *orientObj; /* horizontal / vertical */
} TrackElement;
static Ttk_ElementOptionSpec TrackElementOptions[] = {
@@ -484,6 +491,7 @@ static void TrackElementGeometry(
{
TrackElementData *data = clientData;
SInt32 size = 24; /* reasonable default ... */
+
GetThemeMetric(data->thicknessMetric, &size);
*widthPtr = *heightPtr = size;
}
@@ -518,20 +526,21 @@ static void TrackElementDraw(
drawInfo.enableState = Ttk_StateTableLookup(ThemeTrackEnableTable, state);
switch (data->kind) {
- case kThemeProgressBar:
- drawInfo.trackInfo.progress.phase = 0; /* 1-4: animation phase */
- break;
- case kThemeSlider:
- drawInfo.trackInfo.slider.pressState = 0; /* @@@ fill this in */
- drawInfo.trackInfo.slider.thumbDir = kThemeThumbPlain;
- /* kThemeThumbUpward, kThemeThumbDownward, kThemeThumbPlain */
- break;
+ case kThemeProgressBar:
+ drawInfo.trackInfo.progress.phase = 0; /* 1-4: animation phase */
+ break;
+ case kThemeSlider:
+ drawInfo.trackInfo.slider.pressState = 0; /* @@@ fill this in */
+ drawInfo.trackInfo.slider.thumbDir = kThemeThumbPlain;
+ /* kThemeThumbUpward, kThemeThumbDownward, kThemeThumbPlain */
+ break;
}
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, drawInfo.bounds);
+ BEGIN_DRAWING(d);
DrawThemeTrack(&drawInfo,
- NULL/*rgnGhost*/,NULL/*eraseProc*/,0/*eraseData*/);
- END_DRAWING
+ NULL/*rgnGhost*/,NULL/*eraseProc*/,0/*eraseData*/);
+ END_DRAWING();
}
static Ttk_ElementSpec TrackElementSpec = {
@@ -544,8 +553,8 @@ static Ttk_ElementSpec TrackElementSpec = {
/* Slider element -- <<NOTE-TRACKS>>
- * Has geometry only. The Scale widget adjusts the position of this element,
- * and uses it for hit detection. In the Aqua theme, the slider is actually
+ * Has geometry only. The Scale widget adjusts the position of this element,
+ * and uses it for hit detection. In the Aqua theme, the slider is actually
* drawn as part of the trough element.
*
* Also buggy: The geometry here is a Wild-Assed-Guess; I can't
@@ -569,14 +578,14 @@ static Ttk_ElementSpec SliderElementSpec = {
/*----------------------------------------------------------------------
* +++ Progress bar element (new):
- *
+ *
* @@@ NOTE: According to an older revision of the Aqua reference docs,
- * @@@ the 'phase' field is between 0 and 4. Newer revisions say
+ * @@@ the 'phase' field is between 0 and 4. Newer revisions say
* @@@ that it can be any UInt8 value.
*/
typedef struct {
- Tcl_Obj *orientObj; /* horizontal / vertical */
+ Tcl_Obj *orientObj; /* horizontal / vertical */
Tcl_Obj *valueObj; /* current value */
Tcl_Obj *maximumObj; /* maximum value */
Tcl_Obj *phaseObj; /* animation phase */
@@ -584,16 +593,16 @@ typedef struct {
} PbarElement;
static Ttk_ElementOptionSpec PbarElementOptions[] = {
- { "-orient", TK_OPTION_STRING,
+ { "-orient", TK_OPTION_STRING,
Tk_Offset(PbarElement,orientObj), "horizontal" },
{ "-value", TK_OPTION_DOUBLE,
- Tk_Offset(PbarElement,valueObj), "0" },
+ Tk_Offset(PbarElement,valueObj), "0" },
{ "-maximum", TK_OPTION_DOUBLE,
- Tk_Offset(PbarElement,maximumObj), "100" },
+ Tk_Offset(PbarElement,maximumObj), "100" },
{ "-phase", TK_OPTION_INT,
- Tk_Offset(PbarElement,phaseObj), "0" },
- { "-mode", TK_OPTION_STRING,
- Tk_Offset(PbarElement,modeObj), "determinate" },
+ Tk_Offset(PbarElement,phaseObj), "0" },
+ { "-mode", TK_OPTION_STRING,
+ Tk_Offset(PbarElement,modeObj), "determinate" },
{0,0,0,0}
};
@@ -602,6 +611,7 @@ static void PbarElementGeometry(
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
{
SInt32 size = 24; /* @@@ Check HIG for correct default */
+
GetThemeMetric(kThemeMetricLargeProgressBarThickness, &size);
*widthPtr = *heightPtr = size;
}
@@ -636,10 +646,11 @@ static void PbarElementDraw(
drawInfo.enableState = Ttk_StateTableLookup(ThemeTrackEnableTable, state);
drawInfo.trackInfo.progress.phase = phase;
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, drawInfo.bounds);
+ BEGIN_DRAWING(d);
DrawThemeTrack(&drawInfo,
- NULL/*rgnGhost*/,NULL/*eraseProc*/,0/*eraseData*/);
- END_DRAWING
+ NULL/*rgnGhost*/,NULL/*eraseProc*/,0/*eraseData*/);
+ END_DRAWING();
}
static Ttk_ElementSpec PbarElementSpec = {
@@ -674,13 +685,13 @@ static void SeparatorElementDraw(
/* DrawThemeSeparator only supports kThemeStateActive / kThemeStateInactive
*/
state &= TTK_STATE_BACKGROUND;
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeSeparator(&bounds, Ttk_StateTableLookup(ThemeStateTable, state));
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec SeparatorElementSpec =
-{
+static Ttk_ElementSpec SeparatorElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -691,19 +702,18 @@ static Ttk_ElementSpec SeparatorElementSpec =
/*----------------------------------------------------------------------
* +++ Size grip element.
*/
-static const ThemeGrowDirection sizegripGrowDirection
+static const ThemeGrowDirection sizegripGrowDirection
= kThemeGrowRight|kThemeGrowDown;
static void SizegripElementSize(
void *clientData, void *elementRecord, Tk_Window tkwin,
int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr)
{
- Point origin;
+ Point origin = {0, 0};
Rect bounds;
- origin.h = origin.v = 0;
GetThemeStandaloneGrowBoxBounds(
- origin, sizegripGrowDirection, false, &bounds);
+ origin, sizegripGrowDirection, false, &bounds);
*widthPtr = bounds.right - bounds.left;
*heightPtr = bounds.bottom - bounds.top;
}
@@ -713,20 +723,21 @@ static void SizegripElementDraw(
Drawable d, Ttk_Box b, unsigned int state)
{
Point origin;
+
origin.h = b.x; origin.v = b.y;
/* Grow box only supports kThemeStateActive, kThemeStateInactive */
state &= TTK_STATE_BACKGROUND;
- BEGIN_DRAWING(d)
+ OFFSET_POINT(d, origin);
+ BEGIN_DRAWING(d);
DrawThemeStandaloneGrowBox(
- origin, sizegripGrowDirection, false,
+ origin, sizegripGrowDirection, false,
Ttk_StateTableLookup(ThemeStateTable, state));
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec SizegripElementSpec =
-{
+static Ttk_ElementSpec SizegripElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -743,18 +754,18 @@ static Ttk_ElementSpec SizegripElementSpec =
* and the type of the top-level window.
*
* Also: patterned backgrounds should be aligned with the coordinate
- * system of the top-level window. Since we're drawing into an
- * off-screen graphics port with its own coordinate system,
+ * system of the top-level window. Since we're drawing into an
+ * off-screen graphics port with its own coordinate system,
* this leads to alignment glitches.
*
* Available kTheme constants:
- * kThemeBackgroundTabPane,
- * kThemeBackgroundPlacard,
- * kThemeBackgroundWindowHeader,
- * kThemeBackgroundListViewWindowHeader,
- * kThemeBackgroundSecondaryGroupBox,
+ * kThemeBackgroundTabPane,
+ * kThemeBackgroundPlacard,
+ * kThemeBackgroundWindowHeader,
+ * kThemeBackgroundListViewWindowHeader,
+ * kThemeBackgroundSecondaryGroupBox,
*
- * GetThemeBrush() and SetThemeBackground() offer more choices.
+ * GetThemeBrush() and SetThemeBackground() offer more choices.
*
*/
@@ -781,17 +792,18 @@ static void BackgroundElementDraw(
bounds.right = Tk_Width(tkwin);
bounds.bottom = Tk_Height(tkwin);
- BEGIN_DRAWING(d)
+ OFFSET_POINT(d, origin);
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
ApplyThemeBackground(kind, &bounds,
- Ttk_StateTableLookup(ThemeStateTable, state),
+ Ttk_StateTableLookup(ThemeStateTable, state),
depth, inColor);
QDSetPatternOrigin(origin);
EraseRect(&bounds);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec BackgroundElementSpec =
-{
+static Ttk_ElementSpec BackgroundElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -802,14 +814,14 @@ static Ttk_ElementSpec BackgroundElementSpec =
/*----------------------------------------------------------------------
* +++ ToolbarBackground element -- toolbar style for frames.
*
- * This is very similar to the normal background element, but uses a
- * different ThemeBrush in order to get the lighter pinstripe effect
- * used in toolbars. We use SetThemeBackground() rather than
- * ApplyThemeBackground() in order to get the right style.
+ * This is very similar to the normal background element, but uses a
+ * different ThemeBrush in order to get the lighter pinstripe effect
+ * used in toolbars. We use SetThemeBackground() rather than
+ * ApplyThemeBackground() in order to get the right style.
*
* <URL: http://developer.apple.com/documentation/Carbon/Reference/
- * Appearance_Manager/appearance_manager/constant_7.html#/
- * /apple_ref/doc/uid/TP30000243/C005321>
+ * Appearance_Manager/appearance_manager/constant_7.html#/
+ * /apple_ref/doc/uid/TP30000243/C005321>
*
*/
static void ToolbarBackgroundElementDraw(
@@ -825,15 +837,15 @@ static void ToolbarBackgroundElementDraw(
bounds.right = Tk_Width(tkwin);
bounds.bottom = Tk_Height(tkwin);
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
SetThemeBackground(brush,
depth, inColor);
EraseRect(&bounds);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec ToolbarBackgroundElementSpec =
-{
+static Ttk_ElementSpec ToolbarBackgroundElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -864,14 +876,14 @@ static void TreeHeaderElementDraw(
info.value = Ttk_StateTableLookup(ButtonValueTable, state);
info.adornment = Ttk_StateTableLookup(TreeHeaderAdornmentTable, state);
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeButton(&bounds, parms->kind, &info,
NULL/*prevInfo*/,NULL/*eraseProc*/,NULL/*labelProc*/,0/*userData*/);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec TreeHeaderElementSpec =
-{
+static Ttk_ElementSpec TreeHeaderElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -904,21 +916,22 @@ static void DisclosureElementDraw(
Rect bounds = BoxToRect(b);
ThemeButtonDrawInfo info;
- if (state & TTK_TREEVIEW_STATE_LEAF)
+ if (state & TTK_TREEVIEW_STATE_LEAF) {
return;
+ }
info.state = Ttk_StateTableLookup(ThemeStateTable, state);
info.value = Ttk_StateTableLookup(DisclosureValueTable, state);
info.adornment = kThemeAdornmentDrawIndicatorOnly;
- BEGIN_DRAWING(d)
+ OFFSET_RECT(d, bounds);
+ BEGIN_DRAWING(d);
DrawThemeButton(&bounds, kThemeDisclosureTriangle, &info,
NULL/*prevInfo*/,DontErase,NULL/*labelProc*/,0/*userData*/);
- END_DRAWING
+ END_DRAWING();
}
-static Ttk_ElementSpec DisclosureElementSpec =
-{
+static Ttk_ElementSpec DisclosureElementSpec = {
TK_STYLE_VERSION_2,
sizeof(NullElement),
TtkNullElementOptions,
@@ -995,19 +1008,19 @@ static int AquaTheme_Init(Tcl_Interp *interp)
&ToolbarBackgroundElementSpec, 0);
Ttk_RegisterElementSpec(themePtr, "Button.button",
- &ButtonElementSpec, &PushButtonParms);
+ &ButtonElementSpec, &PushButtonParms);
Ttk_RegisterElementSpec(themePtr, "Checkbutton.button",
- &ButtonElementSpec, &CheckBoxParms);
+ &ButtonElementSpec, &CheckBoxParms);
Ttk_RegisterElementSpec(themePtr, "Radiobutton.button",
- &ButtonElementSpec, &RadioButtonParms);
+ &ButtonElementSpec, &RadioButtonParms);
Ttk_RegisterElementSpec(themePtr, "Toolbutton.border",
- &ButtonElementSpec, &BevelButtonParms);
+ &ButtonElementSpec, &BevelButtonParms);
Ttk_RegisterElementSpec(themePtr, "Menubutton.button",
- &ButtonElementSpec, &PopupButtonParms);
+ &ButtonElementSpec, &PopupButtonParms);
Ttk_RegisterElementSpec(themePtr, "Treeitem.indicator",
- &DisclosureElementSpec, &DisclosureParms);
+ &DisclosureElementSpec, &DisclosureParms);
Ttk_RegisterElementSpec(themePtr, "Treeheading.cell",
- &TreeHeaderElementSpec, &ListHeaderParms);
+ &TreeHeaderElementSpec, &ListHeaderParms);
Ttk_RegisterElementSpec(themePtr, "Notebook.tab", &TabElementSpec, 0);
Ttk_RegisterElementSpec(themePtr, "Notebook.client", &PaneElementSpec, 0);
@@ -1017,7 +1030,7 @@ static int AquaTheme_Init(Tcl_Interp *interp)
Ttk_RegisterElementSpec(themePtr, "Combobox.field",&EntryElementSpec,0);
Ttk_RegisterElementSpec(themePtr, "Combobox.downarrow",
- &PopupArrowElementSpec, 0);
+ &PopupArrowElementSpec, 0);
Ttk_RegisterElementSpec(themePtr, "separator",&SeparatorElementSpec,0);
Ttk_RegisterElementSpec(themePtr, "hseparator",&SeparatorElementSpec,0);
@@ -1031,7 +1044,7 @@ static int AquaTheme_Init(Tcl_Interp *interp)
* we do all the drawing in the ".track" element and leave the .pbar out.
*/
Ttk_RegisterElementSpec(themePtr,"Scale.trough",
- &TrackElementSpec, &ScaleData);
+ &TrackElementSpec, &ScaleData);
Ttk_RegisterElementSpec(themePtr,"Scale.slider",&SliderElementSpec,0);
Ttk_RegisterElementSpec(themePtr,"Progressbar.track", &PbarElementSpec, 0);