]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/utils.cpp
alpha support for Scale added
[wxWidgets.git] / src / mac / carbon / utils.cpp
CommitLineData
e9576ca5
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: utils.cpp
3// Purpose: Various utilities
a31a5f85 4// Author: Stefan Csomor
e9576ca5 5// Modified by:
a31a5f85 6// Created: 1998-01-01
e9576ca5 7// RCS-ID: $Id$
a31a5f85 8// Copyright: (c) Stefan Csomor
65571936 9// Licence: wxWindows licence
e9576ca5
SC
10/////////////////////////////////////////////////////////////////////////////
11
3d1a4878 12#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
e9576ca5 13// Note: this is done in utilscmn.cpp now.
e9576ca5
SC
14// #pragma implementation "utils.h"
15#endif
16
3d1a4878
SC
17#include "wx/wxprec.h"
18
e9576ca5
SC
19#include "wx/utils.h"
20#include "wx/app.h"
2bf2d09e 21#include "wx/apptrait.h"
b6ed2b86
VZ
22
23#if wxUSE_GUI
24 #include "wx/mac/uma.h"
9d8aca48 25 #include "wx/font.h"
fe929141 26#else
9d8aca48 27 #include "wx/intl.h"
b6ed2b86 28#endif
e9576ca5
SC
29
30#include <ctype.h>
31
32#include <stdio.h>
33#include <stdlib.h>
34#include <string.h>
35#include <stdarg.h>
36
a2b77260 37#include "MoreFilesX.h"
518af45b 38
66a09d47
SC
39#ifndef __DARWIN__
40#include <Threads.h>
41#include <Sound.h>
42#endif
43
7d9bf1f1 44#if wxUSE_GUI
29d91661
SC
45#if TARGET_API_MAC_OSX
46#include <CoreServices/CoreServices.h>
47#else
48#include <DriverServices.h>
49#include <Multiprocessing.h>
50#endif
51
7f0c3a63
SC
52#include <ATSUnicode.h>
53#include <TextCommon.h>
54#include <TextEncodingConverter.h>
7d9bf1f1 55#endif // wxUSE_GUI
427ff662 56
8aa701ed 57#include "wx/mac/private.h" // includes mac headers
a434b43f
VZ
58
59#if defined(__MWERKS__) && wxUSE_UNICODE
60 #include <wtime.h>
61#endif
62
659b3e8b
VZ
63// ---------------------------------------------------------------------------
64// code used in both base and GUI compilation
65// ---------------------------------------------------------------------------
66
67// our OS version is the same in non GUI and GUI cases
68static int DoGetOSVersion(int *majorVsn, int *minorVsn)
69{
70 long theSystem ;
71
72 // are there x-platform conventions ?
73
74 Gestalt(gestaltSystemVersion, &theSystem) ;
75 if (minorVsn != NULL) {
76 *minorVsn = (theSystem & 0xFF ) ;
77 }
78 if (majorVsn != NULL) {
79 *majorVsn = (theSystem >> 8 ) ;
80 }
81#ifdef __DARWIN__
82 return wxMAC_DARWIN;
83#else
84 return wxMAC;
85#endif
86}
87
ee8bf34f
RD
88
89#if wxUSE_BASE
90
e5a9c663
SC
91// ----------------------------------------------------------------------------
92// debugging support
93// ----------------------------------------------------------------------------
94
95#if defined(__WXMAC__) && !defined(__DARWIN__) && defined(__MWERKS__) && (__MWERKS__ >= 0x2400)
96
97// MetroNub stuff doesn't seem to work in CodeWarrior 5.3 Carbon builds...
98
99#ifndef __MetroNubUtils__
100#include "MetroNubUtils.h"
101#endif
102
103#ifndef __GESTALT__
104#include <Gestalt.h>
105#endif
106
107#if TARGET_API_MAC_CARBON
108
109 #include <CodeFragments.h>
110
111 extern "C" long CallUniversalProc(UniversalProcPtr theProcPtr, ProcInfoType procInfo, ...);
112
113 ProcPtr gCallUniversalProc_Proc = NULL;
114
115#endif
116
117static MetroNubUserEntryBlock* gMetroNubEntry = NULL;
118
119static long fRunOnce = false;
120
121/* ---------------------------------------------------------------------------
122 IsMetroNubInstalled
123 --------------------------------------------------------------------------- */
124
125Boolean IsMetroNubInstalled()
126{
127 if (!fRunOnce)
128 {
129 long result, value;
130
131 fRunOnce = true;
132 gMetroNubEntry = NULL;
133
134 if (Gestalt(gestaltSystemVersion, &value) == noErr && value < 0x1000)
135 {
136 /* look for MetroNub's Gestalt selector */
137 if (Gestalt(kMetroNubUserSignature, &result) == noErr)
138 {
139
140 #if TARGET_API_MAC_CARBON
141 if (gCallUniversalProc_Proc == NULL)
142 {
143 CFragConnectionID connectionID;
144 Ptr mainAddress;
145 Str255 errorString;
146 ProcPtr symbolAddress;
147 OSErr err;
148 CFragSymbolClass symbolClass;
149
150 symbolAddress = NULL;
151 err = GetSharedLibrary("\pInterfaceLib", kPowerPCCFragArch, kFindCFrag,
152 &connectionID, &mainAddress, errorString);
153
154 if (err != noErr)
155 {
156 gCallUniversalProc_Proc = NULL;
157 goto end;
158 }
159
160 err = FindSymbol(connectionID, "\pCallUniversalProc",
161 (Ptr *) &gCallUniversalProc_Proc, &symbolClass);
162
163 if (err != noErr)
164 {
165 gCallUniversalProc_Proc = NULL;
166 goto end;
167 }
168 }
169 #endif
170
171 {
172 MetroNubUserEntryBlock* block = (MetroNubUserEntryBlock *)result;
173
174 /* make sure the version of the API is compatible */
175 if (block->apiLowVersion <= kMetroNubUserAPIVersion &&
176 kMetroNubUserAPIVersion <= block->apiHiVersion)
177 gMetroNubEntry = block; /* success! */
178 }
179
180 }
181 }
182 }
183
184end:
185
186#if TARGET_API_MAC_CARBON
187 return (gMetroNubEntry != NULL && gCallUniversalProc_Proc != NULL);
188#else
189 return (gMetroNubEntry != NULL);
190#endif
191}
192
193/* ---------------------------------------------------------------------------
194 IsMWDebuggerRunning [v1 API]
195 --------------------------------------------------------------------------- */
196
197Boolean IsMWDebuggerRunning()
198{
199 if (IsMetroNubInstalled())
200 return CallIsDebuggerRunningProc(gMetroNubEntry->isDebuggerRunning);
201 else
202 return false;
203}
204
205/* ---------------------------------------------------------------------------
206 AmIBeingMWDebugged [v1 API]
207 --------------------------------------------------------------------------- */
208
209Boolean AmIBeingMWDebugged()
210{
211 if (IsMetroNubInstalled())
212 return CallAmIBeingDebuggedProc(gMetroNubEntry->amIBeingDebugged);
213 else
214 return false;
215}
216
217extern bool WXDLLEXPORT wxIsDebuggerRunning()
218{
219 return IsMWDebuggerRunning() && AmIBeingMWDebugged();
220}
221
222#else
223
224extern bool WXDLLEXPORT wxIsDebuggerRunning()
225{
226 return false;
227}
228
229#endif // defined(__WXMAC__) && !defined(__DARWIN__) && (__MWERKS__ >= 0x2400)
230
a434b43f 231
f5c6eb5c 232#ifndef __DARWIN__
03e11df5
GD
233// defined in unix/utilsunx.cpp for Mac OS X
234
2f1ae414
SC
235// get full hostname (with domain name if possible)
236bool wxGetFullHostName(wxChar *buf, int maxSize)
237{
238 return wxGetHostName(buf, maxSize);
239}
240
241// Get hostname only (without domain name)
427ff662 242bool wxGetHostName(wxChar *buf, int maxSize)
e9576ca5 243{
e40298d5
JS
244 // Gets Chooser name of user by examining a System resource.
245
246 const short kComputerNameID = -16413;
5be55d56 247
e40298d5
JS
248 short oldResFile = CurResFile() ;
249 UseResFile(0);
250 StringHandle chooserName = (StringHandle)::GetString(kComputerNameID);
251 UseResFile(oldResFile);
252
253 if (chooserName && *chooserName)
254 {
427ff662
SC
255 HLock( (Handle) chooserName ) ;
256 wxString name = wxMacMakeStringFromPascal( *chooserName ) ;
257 HUnlock( (Handle) chooserName ) ;
258 ReleaseResource( (Handle) chooserName ) ;
259 wxStrncpy( buf , name , maxSize - 1 ) ;
e40298d5
JS
260 }
261 else
262 buf[0] = 0 ;
0a67a93b 263
9d8aca48 264 return true;
e9576ca5
SC
265}
266
267// Get user ID e.g. jacs
427ff662 268bool wxGetUserId(wxChar *buf, int maxSize)
e9576ca5 269{
0a67a93b 270 return wxGetUserName( buf , maxSize ) ;
e9576ca5
SC
271}
272
5b781a67
SC
273const wxChar* wxGetHomeDir(wxString *pstr)
274{
e40298d5
JS
275 *pstr = wxMacFindFolder( (short) kOnSystemDisk, kPreferencesFolderType, kDontCreateFolder ) ;
276 return pstr->c_str() ;
5b781a67
SC
277}
278
a31a5f85 279// Get user name e.g. Stefan Csomor
427ff662 280bool wxGetUserName(wxChar *buf, int maxSize)
e9576ca5 281{
e40298d5
JS
282 // Gets Chooser name of user by examining a System resource.
283
284 const short kChooserNameID = -16096;
5be55d56 285
e40298d5
JS
286 short oldResFile = CurResFile() ;
287 UseResFile(0);
288 StringHandle chooserName = (StringHandle)::GetString(kChooserNameID);
289 UseResFile(oldResFile);
290
291 if (chooserName && *chooserName)
292 {
427ff662
SC
293 HLock( (Handle) chooserName ) ;
294 wxString name = wxMacMakeStringFromPascal( *chooserName ) ;
295 HUnlock( (Handle) chooserName ) ;
296 ReleaseResource( (Handle) chooserName ) ;
297 wxStrncpy( buf , name , maxSize - 1 ) ;
e40298d5
JS
298 }
299 else
300 buf[0] = 0 ;
0a67a93b 301
9d8aca48 302 return true;
e9576ca5
SC
303}
304
e0f6b731 305int wxKill(long pid, wxSignal sig , wxKillError *rc, int flags)
e9576ca5
SC
306{
307 // TODO
308 return 0;
309}
310
5dbb17e2
SC
311WXDLLEXPORT bool wxGetEnv(const wxString& var, wxString *value)
312{
e40298d5
JS
313 // TODO : under classic there is no environement support, under X yes
314 return false ;
5dbb17e2
SC
315}
316
9d8aca48 317// set the env var name to the given value, return true on success
5dbb17e2
SC
318WXDLLEXPORT bool wxSetEnv(const wxString& var, const wxChar *value)
319{
e40298d5
JS
320 // TODO : under classic there is no environement support, under X yes
321 return false ;
5dbb17e2
SC
322}
323
e9576ca5
SC
324//
325// Execute a program in an Interactive Shell
326//
327bool wxShell(const wxString& command)
328{
329 // TODO
9d8aca48 330 return false;
e9576ca5
SC
331}
332
5be55d56 333// Shutdown or reboot the PC
f6ba47d9
VZ
334bool wxShutdown(wxShutdownFlags wFlags)
335{
336 // TODO
9d8aca48 337 return false;
f6ba47d9
VZ
338}
339
8ea92b4d
WS
340wxPowerType wxGetPowerType()
341{
342 // TODO
343 return wxPOWER_UNKNOWN;
344}
345
346wxBatteryState wxGetBatteryState()
347{
348 // TODO
349 return wxBATTERY_UNKNOWN_STATE;
350}
351
e9576ca5 352// Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
9d8aca48 353wxMemorySize wxGetFreeMemory()
e9576ca5 354{
9d8aca48 355 return (wxMemorySize)FreeMem() ;
0a67a93b
SC
356}
357
7f7b52b4
SC
358#ifndef __DARWIN__
359
360void wxMicroSleep(unsigned long microseconds)
0a67a93b 361{
9d8aca48
WS
362 AbsoluteTime wakeup = AddDurationToAbsolute( microseconds * durationMicrosecond , UpTime());
363 MPDelayUntil( & wakeup);
7f7b52b4
SC
364}
365
366void wxMilliSleep(unsigned long milliseconds)
367{
9d8aca48
WS
368 AbsoluteTime wakeup = AddDurationToAbsolute( milliseconds, UpTime());
369 MPDelayUntil( & wakeup);
e9576ca5
SC
370}
371
372void wxSleep(int nSecs)
373{
7f7b52b4 374 wxMilliSleep(1000*nSecs);
e9576ca5
SC
375}
376
7f7b52b4
SC
377#endif
378
e9576ca5
SC
379// Consume all events until no more left
380void wxFlushEvents()
381{
382}
383
f5c6eb5c 384#endif // !__DARWIN__
e9576ca5
SC
385
386// Emit a beeeeeep
387void wxBell()
388{
0a67a93b 389 SysBeep(30);
e9576ca5
SC
390}
391
324899f6 392wxToolkitInfo& wxConsoleAppTraits::GetToolkitInfo()
29c99ad3 393{
a8eaaeb2 394 static wxToolkitInfo info;
66b6b57c 395 info.os = DoGetOSVersion(&info.versionMajor, &info.versionMinor);
a8eaaeb2 396 info.name = _T("wxBase");
324899f6 397 return info;
29c99ad3
VZ
398}
399
b6ed2b86
VZ
400#endif // wxUSE_BASE
401
402#if wxUSE_GUI
536732e4 403
324899f6 404wxToolkitInfo& wxGUIAppTraits::GetToolkitInfo()
29c99ad3 405{
a8eaaeb2 406 static wxToolkitInfo info;
66b6b57c 407 info.os = DoGetOSVersion(&info.versionMajor, &info.versionMinor);
a8eaaeb2
VS
408 info.shortName = _T("mac");
409 info.name = _T("wxMac");
410#ifdef __WXUNIVERSAL__
411 info.shortName << _T("univ");
412 info.name << _T("/wxUniversal");
413#endif
324899f6 414 return info;
29c99ad3
VZ
415}
416
e9576ca5
SC
417// Reading and writing resources (eg WIN.INI, .Xdefaults)
418#if wxUSE_RESOURCES
419bool wxWriteResource(const wxString& section, const wxString& entry, const wxString& value, const wxString& file)
420{
421 // TODO
9d8aca48 422 return false;
e9576ca5
SC
423}
424
425bool wxWriteResource(const wxString& section, const wxString& entry, float value, const wxString& file)
426{
427ff662
SC
427 wxString buf;
428 buf.Printf(wxT("%.4f"), value);
429
e40298d5 430 return wxWriteResource(section, entry, buf, file);
e9576ca5
SC
431}
432
433bool wxWriteResource(const wxString& section, const wxString& entry, long value, const wxString& file)
434{
427ff662
SC
435 wxString buf;
436 buf.Printf(wxT("%ld"), value);
437
e40298d5 438 return wxWriteResource(section, entry, buf, file);
e9576ca5
SC
439}
440
441bool wxWriteResource(const wxString& section, const wxString& entry, int value, const wxString& file)
442{
427ff662
SC
443 wxString buf;
444 buf.Printf(wxT("%d"), value);
445
e40298d5 446 return wxWriteResource(section, entry, buf, file);
e9576ca5
SC
447}
448
449bool wxGetResource(const wxString& section, const wxString& entry, char **value, const wxString& file)
450{
451 // TODO
9d8aca48 452 return false;
e9576ca5
SC
453}
454
455bool wxGetResource(const wxString& section, const wxString& entry, float *value, const wxString& file)
456{
e40298d5
JS
457 char *s = NULL;
458 bool succ = wxGetResource(section, entry, (char **)&s, file);
459 if (succ)
460 {
461 *value = (float)strtod(s, NULL);
462 delete[] s;
9d8aca48 463 return true;
e40298d5 464 }
9d8aca48 465 else return false;
e9576ca5
SC
466}
467
468bool wxGetResource(const wxString& section, const wxString& entry, long *value, const wxString& file)
469{
e40298d5
JS
470 char *s = NULL;
471 bool succ = wxGetResource(section, entry, (char **)&s, file);
472 if (succ)
473 {
474 *value = strtol(s, NULL, 10);
475 delete[] s;
9d8aca48 476 return true;
e40298d5 477 }
9d8aca48 478 else return false;
e9576ca5
SC
479}
480
481bool wxGetResource(const wxString& section, const wxString& entry, int *value, const wxString& file)
482{
e40298d5
JS
483 char *s = NULL;
484 bool succ = wxGetResource(section, entry, (char **)&s, file);
485 if (succ)
486 {
487 *value = (int)strtol(s, NULL, 10);
488 delete[] s;
9d8aca48 489 return true;
e40298d5 490 }
9d8aca48 491 else return false;
e9576ca5
SC
492}
493#endif // wxUSE_RESOURCES
494
6b57b49a 495int gs_wxBusyCursorCount = 0;
e40298d5
JS
496extern wxCursor gMacCurrentCursor ;
497wxCursor gMacStoredActiveCursor ;
e9576ca5
SC
498
499// Set the cursor to the busy cursor for all windows
500void wxBeginBusyCursor(wxCursor *cursor)
501{
e40298d5
JS
502 if (gs_wxBusyCursorCount++ == 0)
503 {
504 gMacStoredActiveCursor = gMacCurrentCursor ;
505 cursor->MacInstall() ;
506 }
507 //else: nothing to do, already set
e9576ca5
SC
508}
509
510// Restore cursor to normal
511void wxEndBusyCursor()
512{
6b57b49a 513 wxCHECK_RET( gs_wxBusyCursorCount > 0,
e40298d5 514 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
5be55d56 515
e40298d5
JS
516 if (--gs_wxBusyCursorCount == 0)
517 {
518 gMacStoredActiveCursor.MacInstall() ;
519 gMacStoredActiveCursor = wxNullCursor ;
520 }
e9576ca5
SC
521}
522
9d8aca48 523// true if we're between the above two calls
e9576ca5
SC
524bool wxIsBusy()
525{
e40298d5 526 return (gs_wxBusyCursorCount > 0);
ec5d7799 527}
e9576ca5 528
2dbc444a
RD
529#endif // wxUSE_GUI
530
531#if wxUSE_BASE
532
e7e1b01e 533wxString wxMacFindFolder( short vol,
e40298d5
JS
534 OSType folderType,
535 Boolean createFolder)
2f1ae414 536{
9d8aca48 537 FSRef fsRef ;
2d4e4f80 538 wxString strDir ;
5be55d56 539
a2b77260 540 if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr)
814af667 541 strDir = wxMacFSRefToPath( &fsRef ) + wxFILE_SEP_PATH ;
a2b77260 542
2d4e4f80 543 return strDir ;
2f1ae414
SC
544}
545
2dbc444a
RD
546#endif // wxUSE_BASE
547
548#if wxUSE_GUI
549
e9576ca5
SC
550// Check whether this window wants to process messages, e.g. Stop button
551// in long calculations.
552bool wxCheckForInterrupt(wxWindow *wnd)
553{
554 // TODO
9d8aca48 555 return false;
e9576ca5
SC
556}
557
558void wxGetMousePosition( int* x, int* y )
559{
519cb848 560 Point pt ;
ec5d7799 561
519cb848
SC
562 GetMouse( &pt ) ;
563 LocalToGlobal( &pt ) ;
564 *x = pt.h ;
565 *y = pt.v ;
e9576ca5
SC
566};
567
9d8aca48 568// Return true if we have a colour display
e9576ca5
SC
569bool wxColourDisplay()
570{
9d8aca48 571 return true;
e9576ca5
SC
572}
573
574// Returns depth of screen
575int wxDisplayDepth()
576{
e40298d5
JS
577 Rect globRect ;
578 SetRect(&globRect, -32760, -32760, 32760, 32760);
579 GDHandle theMaxDevice;
2f1ae414 580
e40298d5
JS
581 int theDepth = 8;
582 theMaxDevice = GetMaxDevice(&globRect);
583 if (theMaxDevice != nil)
584 theDepth = (**(**theMaxDevice).gdPMap).pixelSize;
ec5d7799 585
e40298d5 586 return theDepth ;
e9576ca5
SC
587}
588
589// Get size of display
590void wxDisplaySize(int *width, int *height)
591{
e40298d5
JS
592 BitMap screenBits;
593 GetQDGlobalsScreenBits( &screenBits );
5be55d56
VZ
594
595 if (width != NULL) {
e8ca7105
GD
596 *width = screenBits.bounds.right - screenBits.bounds.left ;
597 }
5be55d56 598 if (height != NULL) {
e8ca7105
GD
599 *height = screenBits.bounds.bottom - screenBits.bounds.top ;
600 }
e9576ca5
SC
601}
602
5fde6fcc
GD
603void wxDisplaySizeMM(int *width, int *height)
604{
5b028d57
SC
605 wxDisplaySize(width, height);
606 // on mac 72 is fixed (at least now ;-)
607 float cvPt2Mm = 25.4 / 72;
e8ca7105 608
5be55d56 609 if (width != NULL) {
e8ca7105
GD
610 *width = int( *width * cvPt2Mm );
611 }
5be55d56 612 if (height != NULL) {
e8ca7105
GD
613 *height = int( *height * cvPt2Mm );
614 }
5fde6fcc
GD
615}
616
ec5d7799
RD
617void wxClientDisplayRect(int *x, int *y, int *width, int *height)
618{
ee658398
SC
619 Rect r ;
620 GetAvailableWindowPositioningBounds( GetMainDevice() , &r ) ;
621 if ( x )
622 *x = r.left ;
623 if ( y )
624 *y = r.top ;
625 if ( width )
626 *width = r.right - r.left ;
627 if ( height )
628 *height = r.bottom - r.top ;
ec5d7799
RD
629}
630
57591e0e
JS
631wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
632{
633 return wxGenericFindWindowAtPoint(pt);
634}
5dbb17e2 635
b6ed2b86
VZ
636#endif // wxUSE_GUI
637
638#if wxUSE_BASE
639
5dbb17e2
SC
640wxString wxGetOsDescription()
641{
6e73695c
GD
642#ifdef WXWIN_OS_DESCRIPTION
643 // use configure generated description if available
5f3f0f17 644 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION) + wxString(wxT(")"));
6e73695c 645#else
427ff662 646 return wxT("MacOS") ; //TODO:define further
6e73695c
GD
647#endif
648}
649
b6ed2b86
VZ
650#ifndef __DARWIN__
651wxChar *wxGetUserHome (const wxString& user)
652{
653 // TODO
654 return NULL;
655}
656
657bool wxGetDiskSpace(const wxString& path, wxLongLong *pTotal, wxLongLong *pFree)
658{
659 if ( path.empty() )
9d8aca48 660 return false;
b6ed2b86
VZ
661
662 wxString p = path ;
71111c40 663 if (p[0u] == ':' ) {
b6ed2b86
VZ
664 p = wxGetCwd() + p ;
665 }
666
667 int pos = p.Find(':') ;
668 if ( pos != wxNOT_FOUND ) {
669 p = p.Mid(1,pos) ;
670 }
671
672 p = p + wxT(":") ;
673
a2b77260 674 OSErr err = noErr ;
9d8aca48 675
a2b77260
SC
676 FSRef fsRef ;
677 err = wxMacPathToFSRef( p , &fsRef ) ;
678 if ( noErr == err )
679 {
680 FSVolumeRefNum vRefNum ;
681 err = FSGetVRefNum( &fsRef , &vRefNum ) ;
682 if ( noErr == err )
683 {
684 UInt64 freeBytes , totalBytes ;
685 err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes ) ;
686 if ( noErr == err )
687 {
9d8aca48 688 if ( pTotal )
a2b77260
SC
689 *pTotal = wxLongLong( totalBytes ) ;
690 if ( pFree )
691 *pFree = wxLongLong( freeBytes ) ;
692 }
693 }
b6ed2b86 694 }
9d8aca48 695
b6ed2b86
VZ
696 return err == noErr ;
697}
698#endif // !__DARWIN__
699
3d963f81
SC
700//---------------------------------------------------------------------------
701// wxMac Specific utility functions
702//---------------------------------------------------------------------------
703
5be55d56 704void wxMacStringToPascal( const wxString&from , StringPtr to )
427ff662 705{
939fba6c 706 wxCharBuffer buf = from.mb_str( wxConvLocal ) ;
427ff662
SC
707 int len = strlen(buf) ;
708
709 if ( len > 255 )
710 len = 255 ;
711 to[0] = len ;
712 memcpy( (char*) &to[1] , buf , len ) ;
713}
714
5be55d56 715wxString wxMacMakeStringFromPascal( ConstStringPtr from )
427ff662 716{
939fba6c 717 return wxString( (char*) &from[1] , wxConvLocal , from[0] ) ;
427ff662
SC
718}
719
e50d5284 720
73280e05
SC
721// ----------------------------------------------------------------------------
722// Common Event Support
723// ----------------------------------------------------------------------------
724
d13ea1bd 725
73280e05
SC
726extern ProcessSerialNumber gAppProcess ;
727
728void wxMacWakeUp()
729{
730 ProcessSerialNumber psn ;
731 Boolean isSame ;
732 psn.highLongOfPSN = 0 ;
733 psn.lowLongOfPSN = kCurrentProcess ;
734 SameProcess( &gAppProcess , &psn , &isSame ) ;
735 if ( isSame )
736 {
737#if TARGET_CARBON
8dfef0c2
SC
738 static wxMacCarbonEvent s_wakeupEvent ;
739 OSStatus err = noErr ;
740 if ( !s_wakeupEvent.IsValid() )
d6c69b17 741 {
8dfef0c2
SC
742 err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
743 kEventAttributeNone ) ;
d6c69b17 744 }
8dfef0c2 745 if ( err == noErr )
73280e05 746 {
8dfef0c2 747 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) )
9d8aca48 748 return ;
8dfef0c2 749 s_wakeupEvent.SetTime(0) ;
d6c69b17 750 err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent,
73280e05 751 kEventPriorityHigh);
8dfef0c2 752 }
73280e05
SC
753#else
754 PostEvent( nullEvent , 0 ) ;
755#endif
756 }
757 else
758 {
759 WakeUpProcess( &gAppProcess ) ;
760 }
761}
762
d13ea1bd
RD
763#endif // wxUSE_BASE
764
765#if wxUSE_GUI
766
767
facd6764
SC
768// ----------------------------------------------------------------------------
769// Carbon Event Support
770// ----------------------------------------------------------------------------
771
772
773OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData)
774{
9d8aca48 775 return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData ) ;
facd6764
SC
776}
777
21fd5529 778OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData)
facd6764 779{
9d8aca48 780 return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData ) ;
facd6764
SC
781}
782
86d8b744
SC
783// ----------------------------------------------------------------------------
784// Control Access Support
785// ----------------------------------------------------------------------------
786
5ca0d812
SC
787void wxMacControl::Dispose()
788{
789 ::DisposeControl( m_controlRef ) ;
790 m_controlRef = NULL ;
791}
792
9d8aca48 793void wxMacControl::SetReference( SInt32 data )
5ca0d812
SC
794{
795 SetControlReference( m_controlRef , data ) ;
796}
797
29d91661 798OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const
86d8b744 799{
9d8aca48 800 return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize ) ;
86d8b744
SC
801}
802
29d91661 803OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const
86d8b744 804{
9d8aca48 805 return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize ) ;
86d8b744
SC
806}
807
808OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData)
809{
9d8aca48 810 return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData ) ;
86d8b744
SC
811}
812
9d8aca48 813OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions )
21fd5529 814{
e996f509 815#if TARGET_API_MAC_OSX
9d8aca48
WS
816 return SendEventToEventTargetWithOptions( event,
817 HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions );
e996f509 818#else
9d8aca48 819 #pragma unused(inOptions)
e996f509
SC
820 return SendEventToEventTarget(event,GetControlEventTarget( m_controlRef ) ) ;
821#endif
21fd5529
SC
822}
823
9d8aca48 824OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions )
21fd5529
SC
825{
826 wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess ) ;
827 event.SetParameter<HICommand>(kEventParamDirectObject,command) ;
9d8aca48 828 return SendEvent( event , inOptions ) ;
21fd5529
SC
829}
830
9d8aca48 831OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions )
21fd5529
SC
832{
833 HICommand command ;
834 memset( &command, 0 , sizeof(command) ) ;
835 command.commandID = commandID ;
836 return SendHICommand( command , inOptions ) ;
837}
838
9d8aca48 839void wxMacControl::Flash( ControlPartCode part , UInt32 ticks )
21fd5529
SC
840{
841 HiliteControl( m_controlRef , part ) ;
842 unsigned long finalTicks ;
843 Delay( ticks , &finalTicks ) ;
844 HiliteControl( m_controlRef , kControlNoPart ) ;
845}
846
7f7b52b4 847SInt32 wxMacControl::GetValue() const
9d8aca48
WS
848{
849 return ::GetControl32BitValue( m_controlRef ) ;
7f7b52b4
SC
850}
851
852SInt32 wxMacControl::GetMaximum() const
9d8aca48
WS
853{
854 return ::GetControl32BitMaximum( m_controlRef ) ;
7f7b52b4
SC
855}
856
857SInt32 wxMacControl::GetMinimum() const
9d8aca48
WS
858{
859 return ::GetControl32BitMinimum( m_controlRef ) ;
7f7b52b4
SC
860}
861
9d8aca48
WS
862void wxMacControl::SetValue( SInt32 v )
863{
864 ::SetControl32BitValue( m_controlRef , v ) ;
7f7b52b4
SC
865}
866
9d8aca48
WS
867void wxMacControl::SetMinimum( SInt32 v )
868{
869 ::SetControl32BitMinimum( m_controlRef , v ) ;
7f7b52b4
SC
870}
871
9d8aca48
WS
872void wxMacControl::SetMaximum( SInt32 v )
873{
7f7b52b4
SC
874 ::SetControl32BitMaximum( m_controlRef , v ) ;
875}
876
877void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum )
878{
879 ::SetControl32BitMinimum( m_controlRef , minimum ) ;
9d8aca48 880 ::SetControl32BitMaximum( m_controlRef , maximum ) ;
7f7b52b4
SC
881 ::SetControl32BitValue( m_controlRef , value ) ;
882}
883
9d8aca48 884OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart )
5ca0d812 885{
9d8aca48 886 return SetKeyboardFocus( GetControlOwner( m_controlRef ) ,
5ca0d812
SC
887 m_controlRef , focusPart ) ;
888}
889
9d8aca48 890bool wxMacControl::HasFocus() const
5ca0d812
SC
891{
892 ControlRef control ;
893 GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
894 return control == m_controlRef ;
895}
896
9d8aca48 897bool wxMacControl::NeedsFocusRect() const
5ca0d812
SC
898{
899 return false ;
900}
901
9d8aca48 902void wxMacControl::VisibilityChanged(bool shown)
29d91661
SC
903{
904}
905
9d8aca48 906void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
29d91661
SC
907{
908 m_font = font ;
9d8aca48
WS
909 ControlFontStyleRec fontStyle;
910 if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
911 {
912 switch( font.MacGetThemeFontID() )
913 {
914 case kThemeSmallSystemFont : fontStyle.font = kControlFontSmallSystemFont ; break ;
915 case 109 /*mini font */ : fontStyle.font = -5 ; break ;
916 case kThemeSystemFont : fontStyle.font = kControlFontBigSystemFont ; break ;
917 default : fontStyle.font = kControlFontBigSystemFont ; break ;
918 }
919 fontStyle.flags = kControlUseFontMask ;
920 }
921 else
922 {
923 fontStyle.font = font.MacGetFontNum() ;
924 fontStyle.style = font.MacGetFontStyle() ;
925 fontStyle.size = font.MacGetFontSize() ;
926 fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask ;
927 }
29d91661
SC
928
929 fontStyle.just = teJustLeft ;
930 fontStyle.flags |= kControlUseJustMask ;
931 if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL )
932 fontStyle.just = teJustCenter ;
933 else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
934 fontStyle.just = teJustRight ;
935
9d8aca48 936
29d91661
SC
937 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
938 // won't get grayed out by the system anymore
9d8aca48 939
29d91661
SC
940 if ( foreground != *wxBLACK )
941 {
942 fontStyle.foreColor = MAC_WXCOLORREF(foreground.GetPixel() ) ;
943 fontStyle.flags |= kControlUseForeColorMask ;
944 }
9d8aca48
WS
945
946 ::SetControlFontStyle( m_controlRef , &fontStyle );
29d91661
SC
947}
948
9d8aca48 949void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
7ea087b7 950{
9d8aca48 951 // TODO
7ea087b7
SC
952 // setting up a color proc is not recommended anymore
953}
954
7f7b52b4
SC
955void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
956{
957 ::SetControl32BitMinimum( m_controlRef , minimum ) ;
9d8aca48 958 ::SetControl32BitMaximum( m_controlRef , maximum ) ;
7f7b52b4
SC
959}
960
9d8aca48 961short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers )
5ca0d812
SC
962{
963 return HandleControlKey( m_controlRef , keyCode , charCode , modifiers ) ;
964}
965
966void wxMacControl::SetActionProc( ControlActionUPP actionProc )
967{
968 SetControlAction( m_controlRef , actionProc ) ;
969}
970
971void wxMacControl::SetViewSize( SInt32 viewSize )
972{
973 SetControlViewSize(m_controlRef , viewSize ) ;
974}
975
976SInt32 wxMacControl::GetViewSize() const
977{
978 return GetControlViewSize( m_controlRef ) ;
979}
980
9d8aca48 981bool wxMacControl::IsVisible() const
5ca0d812
SC
982{
983 return IsControlVisible( m_controlRef ) ;
984}
985
9d8aca48 986void wxMacControl::SetVisibility( bool visible , bool redraw )
5ca0d812
SC
987{
988 SetControlVisibility( m_controlRef , visible , redraw ) ;
989}
990
9d8aca48 991bool wxMacControl::IsEnabled() const
5ca0d812
SC
992{
993#if TARGET_API_MAC_OSX
994 return IsControlEnabled( m_controlRef ) ;
995#else
996 return IsControlActive( m_controlRef ) ;
997#endif
998}
999
9d8aca48 1000bool wxMacControl::IsActive() const
5ca0d812
SC
1001{
1002 return IsControlActive( m_controlRef ) ;
1003}
1004
9d8aca48 1005void wxMacControl::Enable( bool enable )
5ca0d812
SC
1006{
1007#if TARGET_API_MAC_OSX
1008 if ( enable )
1009 EnableControl( m_controlRef ) ;
1010 else
1011 DisableControl( m_controlRef ) ;
1012#else
1013 if ( enable )
1014 ActivateControl( m_controlRef ) ;
1015 else
1016 DeactivateControl( m_controlRef ) ;
1017#endif
1018}
1019
9d8aca48 1020void wxMacControl::SetDrawingEnabled( bool enable )
5ca0d812
SC
1021{
1022#if TARGET_API_MAC_OSX
1023 HIViewSetDrawingEnabled( m_controlRef , enable ) ;
1024#endif
1025}
1026
9d8aca48 1027bool wxMacControl::GetNeedsDisplay() const
5ca0d812
SC
1028{
1029#if TARGET_API_MAC_OSX
1030 return HIViewGetNeedsDisplay( m_controlRef ) ;
1031#else
1032 return false ;
1033#endif
1034}
1035
9d8aca48 1036void wxMacControl::SetNeedsDisplay( bool needsDisplay , RgnHandle where )
5ca0d812
SC
1037{
1038#if TARGET_API_MAC_OSX
1039 if ( where != NULL )
1040 HIViewSetNeedsDisplayInRegion( m_controlRef , where , needsDisplay ) ;
1041 else
1042 HIViewSetNeedsDisplay( m_controlRef , needsDisplay ) ;
1043#endif
1044}
1045
9d8aca48 1046void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
5ca0d812
SC
1047{
1048#if TARGET_API_MAC_OSX
1049 HIPoint hiPoint ;
1050 hiPoint.x = pt->x ;
1051 hiPoint.y = pt->y ;
1052 HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef ) ;
6ea4a266
VZ
1053 pt->x = (int)hiPoint.x ;
1054 pt->y = (int)hiPoint.y ;
5ca0d812
SC
1055#endif
1056}
1057
9d8aca48 1058void wxMacControl::SetRect( Rect *r )
5ca0d812
SC
1059{
1060#if TARGET_API_MAC_OSX
9d8aca48
WS
1061 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1062 //CGPoint and CGSize, which have two floats each
af4fc79b 1063 HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } } ;
5ca0d812
SC
1064 HIViewSetFrame ( m_controlRef , &hir ) ;
1065#else
1066 SetControlBounds( m_controlRef , r ) ;
1067#endif
1068
1069}
1070
9d8aca48 1071void wxMacControl::GetRect( Rect *r )
5ca0d812
SC
1072{
1073 GetControlBounds( m_controlRef , r ) ;
1074}
1075
9d8aca48 1076void wxMacControl::GetRectInWindowCoords( Rect *r )
5ca0d812
SC
1077{
1078 UMAGetControlBoundsInWindowCoords( m_controlRef , r ) ;
1079}
1080
9d8aca48 1081void wxMacControl::GetBestRect( Rect *r )
5ca0d812 1082{
5ca0d812
SC
1083 short baselineoffset ;
1084 GetBestControlRect( m_controlRef , r , &baselineoffset ) ;
1085}
1086
9d8aca48 1087void wxMacControl::SetTitle( const wxString &title )
5ca0d812 1088{
10a59880
RD
1089 wxFontEncoding encoding;
1090
1091 if ( m_font.Ok() )
1092 encoding = m_font.GetEncoding();
1093 else
1094 encoding = wxFont::GetDefaultEncoding();
9d8aca48 1095
10a59880 1096 UMASetControlTitle( m_controlRef , title , encoding ) ;
5ca0d812
SC
1097}
1098
1099void wxMacControl::GetFeatures( UInt32 * features )
1100{
1101 GetControlFeatures( m_controlRef , features ) ;
1102}
1103
9d8aca48 1104OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
5ca0d812
SC
1105{
1106 return GetControlRegion( m_controlRef , partCode , region ) ;
1107}
1108
9d8aca48 1109OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
5ca0d812
SC
1110{
1111#if TARGET_API_MAC_OSX
9d8aca48 1112 return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
5ca0d812
SC
1113 (other != NULL) ? other->m_controlRef : NULL) ;
1114#else
1115 return 0 ;
1116#endif
1117}
1118
1119
1120#if TARGET_API_MAC_OSX
1121// SetNeedsDisplay would not invalidate the children
1122static void InvalidateControlAndChildren( HIViewRef control )
1123{
1124 HIViewSetNeedsDisplay( control , true ) ;
1125 UInt16 childrenCount = 0 ;
9d8aca48 1126 OSStatus err = CountSubControls( control , &childrenCount ) ;
5ca0d812
SC
1127 if ( err == errControlIsNotEmbedder )
1128 return ;
1129 wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ;
1130
1131 for ( UInt16 i = childrenCount ; i >=1 ; --i )
1132 {
1133 HIViewRef child ;
1134 err = GetIndexedSubControl( control , i , & child ) ;
1135 if ( err == errControlIsNotEmbedder )
1136 return ;
1137 InvalidateControlAndChildren( child ) ;
1138 }
1139}
1140#endif
1141
9d8aca48 1142void wxMacControl::InvalidateWithChildren()
5ca0d812
SC
1143{
1144#if TARGET_API_MAC_OSX
1145 InvalidateControlAndChildren( m_controlRef ) ;
1146#endif
1147}
1148
9d8aca48 1149void wxMacControl::ScrollRect( const wxRect &r , int dx , int dy )
5ca0d812
SC
1150{
1151#if TARGET_API_MAC_OSX
1152 HIRect scrollarea = CGRectMake( r.x , r.y , r.width , r.height) ;
1153 HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy ) ;
1154#endif
1155}
1156
1157
1158// SetNeedsDisplay would not invalidate the children
1159
1160//
1161// Databrowser
1162//
1163
9d8aca48 1164OSStatus wxMacControl::SetSelectionFlags( DataBrowserSelectionFlags options )
5ca0d812
SC
1165{
1166 return SetDataBrowserSelectionFlags( m_controlRef , options ) ;
1167}
1168
1169OSStatus wxMacControl::AddListViewColumn( DataBrowserListViewColumnDesc *columnDesc,
9d8aca48 1170 DataBrowserTableViewColumnIndex position )
5ca0d812
SC
1171{
1172 return AddDataBrowserListViewColumn( m_controlRef , columnDesc, position ) ;
1173}
1174
1175OSStatus wxMacControl::AutoSizeListViewColumns()
1176{
1177 return AutoSizeDataBrowserListViewColumns(m_controlRef) ;
1178}
1179
9d8aca48 1180OSStatus wxMacControl::SetHasScrollBars( bool horiz , bool vert )
5ca0d812
SC
1181{
1182 return SetDataBrowserHasScrollBars( m_controlRef , horiz , vert ) ;
1183}
1184
1185OSStatus wxMacControl::SetTableViewHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
1186{
1187 return SetDataBrowserTableViewHiliteStyle( m_controlRef , hiliteStyle ) ;
1188}
1189
9d8aca48 1190OSStatus wxMacControl::SetListViewHeaderBtnHeight(UInt16 height)
5ca0d812
SC
1191{
1192 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef ,height ) ;
1193}
1194
9d8aca48 1195OSStatus wxMacControl::SetCallbacks(const DataBrowserCallbacks * callbacks)
5ca0d812
SC
1196{
1197 return SetDataBrowserCallbacks( m_controlRef , callbacks ) ;
1198}
1199
1200OSStatus wxMacControl::UpdateItems( DataBrowserItemID container, UInt32 numItems,
9d8aca48 1201 const DataBrowserItemID* items,
5ca0d812 1202 DataBrowserPropertyID preSortProperty,
9d8aca48 1203 DataBrowserPropertyID propertyID )
5ca0d812
SC
1204{
1205 return UpdateDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty, propertyID ) ;
1206}
1207
9d8aca48 1208bool wxMacControl::IsItemSelected( DataBrowserItemID item )
5ca0d812
SC
1209{
1210 return IsDataBrowserItemSelected( m_controlRef , item ) ;
1211}
1212
1213OSStatus wxMacControl::AddItems( DataBrowserItemID container, UInt32 numItems,
9d8aca48
WS
1214 const DataBrowserItemID* items,
1215 DataBrowserPropertyID preSortProperty )
5ca0d812
SC
1216{
1217 return AddDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty ) ;
1218}
1219
1220OSStatus wxMacControl::RemoveItems( DataBrowserItemID container, UInt32 numItems,
9d8aca48
WS
1221 const DataBrowserItemID* items,
1222 DataBrowserPropertyID preSortProperty )
5ca0d812
SC
1223{
1224 return RemoveDataBrowserItems( m_controlRef , container, numItems, items, preSortProperty ) ;
1225}
1226
1227OSStatus wxMacControl::RevealItem( DataBrowserItemID item,
1228 DataBrowserPropertyID propertyID,
9d8aca48 1229 DataBrowserRevealOptions options )
5ca0d812
SC
1230{
1231 return RevealDataBrowserItem( m_controlRef , item , propertyID , options ) ;
1232}
1233
1234OSStatus wxMacControl::SetSelectedItems(UInt32 numItems,
1235 const DataBrowserItemID * items,
9d8aca48 1236 DataBrowserSetOption operation )
5ca0d812
SC
1237{
1238 return SetDataBrowserSelectedItems( m_controlRef , numItems , items, operation ) ;
1239}
1240
9d8aca48 1241OSStatus wxMacControl::GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last )
c020f421
SC
1242{
1243 return GetDataBrowserSelectionAnchor( m_controlRef , first , last ) ;
1244}
1245
5ca0d812
SC
1246//
1247// Tab Control
1248//
9d8aca48
WS
1249
1250OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
5ca0d812
SC
1251{
1252 return ::SetTabEnabled( m_controlRef , tabNo , enable ) ;
1253}
9d8aca48 1254
b6ed2b86
VZ
1255#endif // wxUSE_GUI
1256