X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmisc%2Fdarwin_specific.c;h=63830f610d33739199a1b21d9f2953ec60665506;hb=59c8165f0d981640ef4fcd30ba6918b0efa3edea;hp=906a2dc3575669407bcd719c182957ce9fd9d8bf;hpb=59b254b8dc228802bade4de46c5b2054acf0b8f2;p=vlc diff --git a/src/misc/darwin_specific.c b/src/misc/darwin_specific.c index 906a2dc357..63830f610d 100644 --- a/src/misc/darwin_specific.c +++ b/src/misc/darwin_specific.c @@ -1,16 +1,18 @@ /***************************************************************************** - * darwin_specific.c: Darwin specific features + * darwin_specific.m: Darwin specific features ***************************************************************************** - * Copyright (C) 2001 VideoLAN - * $Id: darwin_specific.c,v 1.15 2002/07/17 22:23:20 jlj Exp $ + * Copyright (C) 2001-2007 the VideoLAN team + * $Id$ * - * Authors: Samuel Hocevar + * Authors: Sam Hocevar + * Christophe Massiot + * Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -18,28 +20,109 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include /* strdup() */ -#include /* free() */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include +#include "../libvlc.h" +#include /* *dir() */ -/***************************************************************************** - * Static vars - *****************************************************************************/ -static char * psz_program_path; +#include + +#ifdef HAVE_LOCALE_H +# include +#endif +#ifdef HAVE_MACH_O_DYLD_H +# include +#endif + +#ifndef MAXPATHLEN +# define MAXPATHLEN 1024 +#endif + +/* CFLocaleCopyAvailableLocaleIdentifiers is present only on post-10.4 */ +extern CFArrayRef CFLocaleCopyAvailableLocaleIdentifiers(void) __attribute__((weak_import)); + +/* emulate CFLocaleCopyAvailableLocaleIdentifiers on pre-10.4 */ +static CFArrayRef copy_all_locale_indentifiers(void) +{ + CFMutableArrayRef available_locales; + DIR * dir; + struct dirent *file; + + dir = opendir( "/usr/share/locale" ); + available_locales = CFArrayCreateMutable( kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks ); + + while ( (file = readdir(dir)) ) + { + /* we should probably filter out garbage */ + /* we can't use CFStringCreateWithFileSystemRepresentation as it is + * supported only on post-10.4 (and this function is only for pre-10.4) */ + CFStringRef locale = CFStringCreateWithCString( kCFAllocatorDefault, file->d_name, kCFStringEncodingUTF8 ); + CFArrayAppendValue( available_locales, (void*)locale ); + CFRelease( locale ); + } + + closedir( dir ); + return available_locales; +} /***************************************************************************** - * system_Init: fill in program path. + * system_Init: fill in program path & retrieve language *****************************************************************************/ -void system_Init( vlc_t *p_this, int *pi_argc, char *ppsz_argv[] ) +void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] ) { char i_dummy; - char *p_char, *p_oldchar = &i_dummy; + char *p_char = NULL; + char *p_oldchar = &i_dummy; + unsigned int i; + (void)pi_argc; /* Get the full program path and name */ - p_char = psz_program_path = strdup( ppsz_argv[ 0 ] ); + + /* First try to see if we are linked to the framework */ + for (i = 0; i < _dyld_image_count(); i++) + { + const char * psz_img_name = _dyld_get_image_name(i); + /* Check for "VLCKit.framework/Versions/Current/VLCKit", + * as well as "VLCKit.framework/Versions/A/VLCKit" and + * "VLC.framework/Versions/B/VLCKit" */ + if( (p_char = strstr( psz_img_name, "VLCKit.framework/Versions/" )) ) + { + /* Look for the next forward slash */ + p_char += 26; /* p_char += strlen(" VLCKit.framework/Versions/" ) */ + while( *p_char != '\0' && *p_char != '/') + p_char++; + + /* If the string ends with VLC then we've found a winner */ + if ( !strcmp( p_char, "/VLCKit" ) ) + { + p_char = strdup( psz_img_name ); + break; + } + else + p_char = NULL; + } + } + + if( !p_char ) + { + char path[MAXPATHLEN+1]; + uint32_t path_len = MAXPATHLEN; + if ( !_NSGetExecutablePath(path, &path_len) ) + p_char = strdup(path); + } + if( !p_char ) + { + /* We are not linked to the VLC.framework, return the executable path */ + p_char = strdup( ppsz_argv[ 0 ] ); + } + + vlc_global()->psz_vlcpath = p_char; /* Remove trailing program name */ for( ; *p_char ; ) @@ -54,38 +137,61 @@ void system_Init( vlc_t *p_this, int *pi_argc, char *ppsz_argv[] ) p_char++; } - /* Run the interface with a real-time priority too */ + /* Check if $LANG is set. */ + if ( (p_char = getenv("LANG")) == NULL ) { - struct sched_param param; - param.sched_priority = 10; - if (pthread_setschedparam(pthread_self(), SCHED_RR, ¶m)) + /* + Retrieve the preferred language as chosen in System Preferences.app + (note that CFLocaleCopyCurrent() is not used because it returns the + prefered locale not language) + */ + CFArrayRef all_locales, preferred_locales; + char psz_locale[50]; + + if( CFLocaleCopyAvailableLocaleIdentifiers ) + all_locales = CFLocaleCopyAvailableLocaleIdentifiers(); + else + all_locales = copy_all_locale_indentifiers(); + + preferred_locales = CFBundleCopyLocalizationsForPreferences( all_locales, NULL ); + + if ( preferred_locales ) { - msg_Err( p_this, "pthread_setschedparam failed" ); + if ( CFArrayGetCount( preferred_locales ) ) + { + CFStringRef user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 ); + CFStringGetCString( user_language_string_ref, psz_locale, sizeof(psz_locale), kCFStringEncodingUTF8 ); + setenv( "LANG", psz_locale, 1 ); + } + CFRelease( preferred_locales ); } + CFRelease( all_locales ); } + + vlc_mutex_init( p_this, &vlc_global()->iconv_lock ); + vlc_global()->iconv_macosx = vlc_iconv_open( "UTF-8", "UTF-8-MAC" ); } /***************************************************************************** * system_Configure: check for system specific configuration options. *****************************************************************************/ -void system_Configure( vlc_t *p_this ) +void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] ) { - + (void)p_this; + (void)pi_argc; + (void)ppsz_argv; } /***************************************************************************** * system_End: free the program path. *****************************************************************************/ -void system_End( vlc_t *p_this ) +void system_End( libvlc_int_t *p_this ) { - free( psz_program_path ); -} + (void)p_this; + free( vlc_global()->psz_vlcpath ); -/***************************************************************************** - * system_GetProgramPath: get the full path to the program. - *****************************************************************************/ -char * system_GetProgramPath( void ) -{ - return( psz_program_path ); + if ( vlc_global()->iconv_macosx != (vlc_iconv_t)-1 ) + vlc_iconv_close( vlc_global()->iconv_macosx ); + vlc_mutex_destroy( &vlc_global()->iconv_lock ); }