Merge branch 'master' into windows
[ardour.git] / gtk2_ardour / cocoacarbon.mm
1 /*
2     Copyright (C) 2007 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #include <string>
20 #include <ctype.h>
21 #include <stdlib.h>
22 #include <pbd/error.h>
23 #include <gtkmm2ext/gtkapplication.h>
24 #include <gdk/gdkquartz.h>
25 #undef check
26 #undef YES
27 #undef NO
28
29 #include "ardour_ui.h"
30 #include "actions.h"
31 #include "opts.h"
32
33 #include <CoreFoundation/CFLocale.h>
34 #import <CoreFoundation/CFString.h>
35 #import <Foundation/NSString.h>
36 #import <Foundation/NSAutoreleasePool.h>
37
38 using namespace std;
39 using namespace PBD;
40
41 void
42 ARDOUR_UI::platform_specific ()
43 {
44         gtk_application_ready ();
45
46         if (!ARDOUR_COMMAND_LINE::finder_invoked_ardour) {
47                 
48                 /* if invoked from the command line, make sure we're visible */
49                 
50                 [NSApp activateIgnoringOtherApps:1];
51         } 
52 }
53
54 void
55 ARDOUR_UI::platform_setup ()
56 {
57 }
58
59 bool
60 cocoa_open_url (const char* uri)
61 {
62         NSString* struri = [[NSString alloc] initWithUTF8String:uri];
63         NSURL* nsurl = [[NSURL alloc] initWithString:struri];
64
65         bool ret = [[NSWorkspace sharedWorkspace] openURL:nsurl];
66
67         [struri release];
68         [nsurl release];
69
70         return ret;
71 }
72
73 void
74 set_language_preference ()
75 {
76         gtk_disable_setlocale ();
77
78         if (g_getenv ("LANGUAGE") || g_getenv ("LC_ALL") || g_getenv ("LANG")) {
79                 return;
80         }
81
82         if (g_getenv ("ARDOUR_EN")) {
83                 return;
84         }
85
86         /* the gettext manual is potentially misleading about the utility of
87            LANGUAGE.  It notes that if LANGUAGE is set to include a dialect/region-free
88            language code, like "it", it will assume that you mean the main
89            dialect (e.g. "it_IT"). But in reality, it doesn't bother looking for
90            locale dirs with the full name, only the short code (it doesn't
91            know any better).
92            
93            Since Apple's preferred language list only consists of short language codes,
94            if we set LANGUAGE then gettext will not look for the relevant long-form
95            variants.
96         */
97
98         /* how to get language preferences with CoreFoundation
99          */
100
101         NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
102         
103         /* push into LANGUAGE */
104
105         if (languages && [languages count] > 0) {
106
107                 int i, count = [languages count];
108                 for (i = 0; i < count; ++i) {
109                         if ([[languages objectAtIndex:i]
110                              isEqualToString:@"en"]) {
111                                 count = i+1;
112                                 break;
113                         }
114                 }
115                 NSRange r = { 0, static_cast<NSUInteger> (count) };
116                 setenv ("LANGUAGE", [[[languages subarrayWithRange:r] componentsJoinedByString:@":"] UTF8String], 0);
117                 cout << "LANGUAGE set to " << getenv ("LANGUAGE") << endl;
118         }
119
120         /* now get AppleLocale value and use that for LANG */
121
122         CFLocaleRef cflocale = CFLocaleCopyCurrent();
123         NSString* nslocale = (NSString*) CFLocaleGetValue (cflocale, kCFLocaleIdentifier);
124
125         /* the full POSIX locale specification allows for lots of things. that could be an issue. Silly Apple.
126          */
127
128         cout << "LANG set to " << [nslocale UTF8String] << endl;
129         setenv ("LANG", [nslocale UTF8String], 0);
130         CFRelease (cflocale);
131 }