From: Felix Paul Kühne Date: Sat, 26 Dec 2009 03:16:30 +0000 (+0100) Subject: added a Minimal Dialog Provider for Mac OS X X-Git-Tag: 1.1.0-ff~1755 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d04d6561419a90cc1fac0c700188302c93f220b8;p=vlc added a Minimal Dialog Provider for Mac OS X Currently only used to display the question, login, error and critical core dialogs whenever VLC runs with a GUI on a Mac. Disabled by default. The login dialog's layout will need some more love. --- diff --git a/configure.ac b/configure.ac index 63eef3711a..4d72dcf311 100644 --- a/configure.ac +++ b/configure.ac @@ -4378,7 +4378,7 @@ AC_ARG_ENABLE(macosx, if test "x${enable_macosx}" = "xyes" then VLC_ADD_LDFLAGS([access_eyetv], [-Wl,-framework,Foundation]) - VLC_ADD_LDFLAGS([macosx minimal_macosx opengllayer qtcapture],[-Wl,-framework,Cocoa]) + VLC_ADD_LDFLAGS([macosx minimal_macosx macosx_dialog_provider opengllayer qtcapture],[-Wl,-framework,Cocoa]) VLC_ADD_LDFLAGS([macosx minimal_macosx opengllayer],[-Wl,-framework,OpenGL]) VLC_ADD_LDFLAGS([macosx minimal_macosx], [-Wl,-framework,Carbon]) VLC_ADD_LDFLAGS([macosx minimal_macosx], [-Wl,-framework,CoreServices]) @@ -4400,6 +4400,7 @@ then VLC_ADD_PLUGIN([macosx]) VLC_ADD_PLUGIN([minimal_macosx]) VLC_ADD_PLUGIN([opengllayer]) + VLC_ADD_PLUGIN([macosx_dialog_provider]) fi dnl @@ -4409,17 +4410,19 @@ AC_ARG_ENABLE(macosx-minimal, [ --enable-macosx-minimal minimal Mac OS X support (default disabled)]) if test "x${enable_macosx_minimal}" = "xyes" then - VLC_ADD_LDFLAGS([vout_macosx qtcapture],[-Wl,-framework,Cocoa]) + VLC_ADD_LDFLAGS([vout_macosx qtcapture macosx_dialog_provider],[-Wl,-framework,Cocoa]) VLC_ADD_LDFLAGS([vout_macosx], [-Wl,-framework,OpenGL]) VLC_ADD_LDFLAGS([qtcapture], [-Wl,-framework,QTKit]) VLC_ADD_LDFLAGS([qtcapture], [-Wl,-framework,CoreAudio]) - VLC_ADD_LDFLAGS([qtcapture], [-Wl,-framework,QuartzCore]) + VLC_ADD_LDFLAGS([opengllayer qtcapture], [-Wl,-framework,QuartzCore]) VLC_ADD_LDFLAGS([qtcapture], [-Wl,-framework,CoreVideo]) VLC_ADD_OBJCFLAGS([vout_macosx], [-fobjc-exceptions] ) VLC_ADD_PLUGIN([qtcapture]) - VLC_ADD_PLUGIN([vout_macosx]) + VLC_ADD_PLUGIN([minimal_macosx]) + VLC_ADD_PLUGIN([opengllayer]) + VLC_ADD_PLUGIN([macosx_dialog_provider]) fi dnl @@ -5188,6 +5191,7 @@ AC_CONFIG_FILES([ modules/gui/macosx/Makefile modules/gui/hildon/Makefile modules/gui/minimal_macosx/Makefile + modules/gui/macosx_dialog_provider/Makefile modules/gui/qnx/Makefile modules/gui/qt4/Makefile modules/gui/skins2/Makefile diff --git a/extras/package/macosx/vlc.xcodeproj/project.pbxproj b/extras/package/macosx/vlc.xcodeproj/project.pbxproj index 677a60f0ec..af22acfd22 100644 --- a/extras/package/macosx/vlc.xcodeproj/project.pbxproj +++ b/extras/package/macosx/vlc.xcodeproj/project.pbxproj @@ -279,8 +279,6 @@ CC0FB34B0F8BED1100F057F7 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = Resources/English.lproj/CoreDialogs.nib; sourceTree = ""; }; CC1941240B9C1F8400635F6B /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = ""; }; CC1C41D00D9BAD7F002728FA /* noart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = noart.png; path = Resources/noart.png; sourceTree = ""; }; - CC26BF3109A7A08C00E94D62 /* update.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = update.h; path = ../../../modules/gui/macosx/update.h; sourceTree = SOURCE_ROOT; }; - CC26BF3209A7A08C00E94D62 /* update.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = update.m; path = ../../../modules/gui/macosx/update.m; sourceTree = SOURCE_ROOT; }; CC33C2200D2572DE008C4683 /* pause_embedded_graphite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pause_embedded_graphite.png; path = Resources/pause_embedded_graphite.png; sourceTree = ""; }; CC33C2210D2572DE008C4683 /* play_embedded_graphite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = play_embedded_graphite.png; path = Resources/play_embedded_graphite.png; sourceTree = ""; }; CC33C2400D2578F5008C4683 /* add_embedded_graphite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_embedded_graphite.png; path = Resources/add_embedded_graphite.png; sourceTree = ""; }; @@ -411,6 +409,10 @@ CCCB86D80ACFDFB300CF1E10 /* fs_stop_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_stop_highlight.png; path = Resources/fs_stop_highlight.png; sourceTree = ""; }; CCCB86D90ACFDFB300CF1E10 /* fs_stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_stop.png; path = Resources/fs_stop.png; sourceTree = ""; }; CCCB86DA0ACFDFB300CF1E10 /* fs_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_background.png; path = Resources/fs_background.png; sourceTree = ""; }; + CCD590F010E5B73200D39094 /* dialogProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dialogProvider.h; path = ../../../modules/gui/macosx_dialog_provider/dialogProvider.h; sourceTree = SOURCE_ROOT; }; + CCD590F110E5B73200D39094 /* dialogProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = dialogProvider.m; path = ../../../modules/gui/macosx_dialog_provider/dialogProvider.m; sourceTree = SOURCE_ROOT; }; + CCD590F210E5B76300D39094 /* VLCLoginPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLoginPanel.h; path = ../../../modules/gui/macosx_dialog_provider/VLCLoginPanel.h; sourceTree = SOURCE_ROOT; }; + CCD590F310E5B76300D39094 /* VLCLoginPanel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLoginPanel.m; path = ../../../modules/gui/macosx_dialog_provider/VLCLoginPanel.m; sourceTree = SOURCE_ROOT; }; CCD90F4B0E87C86D0034564A /* add_schedule.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_schedule.png; path = Resources/add_schedule.png; sourceTree = ""; }; CCD90F4C0E87C86D0034564A /* add_vod.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_vod.png; path = Resources/add_vod.png; sourceTree = ""; }; CCD90F4D0E87C86D0034564A /* add_broadcast.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add_broadcast.png; path = Resources/add_broadcast.png; sourceTree = ""; }; @@ -455,6 +457,7 @@ 089C166AFE841209C02AAC07 /* vlc */ = { isa = PBXGroup; children = ( + CCD590EF10E5B71300D39094 /* Minimal Dialog Provider */, CC6C01A40DDF3E7800C7D754 /* Minimal Mac OS X Classes */, CCC8957F0D9A8A61005AE59C /* OSX-specific source files */, 08FB77AFFE84173DC02AAC07 /* Classes */, @@ -533,8 +536,6 @@ DC7F46F108A187F60027DB24 /* extended.m */, DCE7BD0708A5724D007B10AE /* bookmarks.h */, DCE7BD0608A5724D007B10AE /* bookmarks.m */, - CC26BF3109A7A08C00E94D62 /* update.h */, - CC26BF3209A7A08C00E94D62 /* update.m */, CC6D8D9C0A878DED006F2BBE /* AppleRemote.h */, CC6D8D9D0A878DED006F2BBE /* AppleRemote.m */, CCC593780AB4A9FB0004FF52 /* embeddedwindow.h */, @@ -824,6 +825,17 @@ name = "Native FSPanel icons"; sourceTree = ""; }; + CCD590EF10E5B71300D39094 /* Minimal Dialog Provider */ = { + isa = PBXGroup; + children = ( + CCD590F010E5B73200D39094 /* dialogProvider.h */, + CCD590F110E5B73200D39094 /* dialogProvider.m */, + CCD590F210E5B76300D39094 /* VLCLoginPanel.h */, + CCD590F310E5B76300D39094 /* VLCLoginPanel.m */, + ); + name = "Minimal Dialog Provider"; + sourceTree = ""; + }; CCD90F4A0E87C82D0034564A /* VLM */ = { isa = PBXGroup; children = ( diff --git a/modules/gui/Modules.am b/modules/gui/Modules.am index e78c6d14c2..8036166d34 100644 --- a/modules/gui/Modules.am +++ b/modules/gui/Modules.am @@ -1,11 +1,11 @@ -DIST_SUBDIRS = beos macosx hildon minimal_macosx qnx qt4 skins2 +DIST_SUBDIRS = beos macosx hildon minimal_macosx qnx qt4 skins2 macosx_dialog_provider SUBDIRS = if HAVE_BEOS SUBDIRS += beos endif if HAVE_DARWIN -SUBDIRS += macosx minimal_macosx +SUBDIRS += macosx minimal_macosx macosx_dialog_provider endif if BUILD_HILDON SUBDIRS += hildon diff --git a/modules/gui/macosx/wizard.m b/modules/gui/macosx/wizard.m index 598caa5158..824c2ac112 100644 --- a/modules/gui/macosx/wizard.m +++ b/modules/gui/macosx/wizard.m @@ -168,7 +168,7 @@ static VLCWizard *_o_sharedInstance = nil; NSArray * o_mpga; NSArray * o_mp3; -// NSArray * o_mp4a; + NSArray * o_mp4a; NSArray * o_a52; NSArray * o_vorb; NSArray * o_flac; @@ -184,9 +184,9 @@ static VLCWizard *_o_sharedInstance = nil; _NS("MPEG Audio Layer 3 (useable with MPEG PS, MPEG TS, MPEG1, ASF, OGG " "and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @"MUX_RAW", @"-1", @"-1", @"-1", nil]; -/* o_mp4a = [NSArray arrayWithObjects: @"MPEG 4 Audio", @"mp4a", + o_mp4a = [NSArray arrayWithObjects: @"MPEG 4 Audio", @"mp4a", _NS("Audio format for MPEG4 (useable with MPEG TS and MPEG4)"), @"MUX_TS", - @"MUX_MP4", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", nil]; */ + @"MUX_MP4", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", nil]; o_a52 = [NSArray arrayWithObjects: @"A/52", @"a52", _NS("DVD audio format (useable with MPEG PS, MPEG TS, MPEG1, ASF, OGG " "and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @@ -212,7 +212,7 @@ static VLCWizard *_o_sharedInstance = nil; _NS("Dummy codec (do not transcode, useable with all encapsulation " "formats)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_MP4", @"MUX_OGG", @"MUX_RAW", @"MUX_MOV", @"MUX_WAV", nil]; - o_audioCodecs = [[NSArray alloc] initWithObjects: o_mpga, o_mp3, //o_mp4a, + o_audioCodecs = [[NSArray alloc] initWithObjects: o_mpga, o_mp3, o_mp4a, o_a52, o_vorb, o_flac, o_spx, o_s16l, o_fl32, o_dummyAud, nil]; diff --git a/modules/gui/macosx_dialog_provider/Modules.am b/modules/gui/macosx_dialog_provider/Modules.am new file mode 100644 index 0000000000..d7d6c7d35e --- /dev/null +++ b/modules/gui/macosx_dialog_provider/Modules.am @@ -0,0 +1,12 @@ +# Automake forgets to add a proper tag to libtool with Objective-C files. +# Moreocer Libtool should default tag to CC when none is specified but +# obviously does not. Here is a fix for that. +LIBTOOL=@LIBTOOL@ --tag=CC + +SOURCES_macosx_dialog_provider = \ + VLCLoginPanel.m \ + dialogProvider.m \ + $(NULL) + +noinst_HEADERS = \ + VLCLoginPanel.h diff --git a/modules/gui/macosx_dialog_provider/VLCLoginPanel.h b/modules/gui/macosx_dialog_provider/VLCLoginPanel.h new file mode 100644 index 0000000000..8b9383561d --- /dev/null +++ b/modules/gui/macosx_dialog_provider/VLCLoginPanel.h @@ -0,0 +1,48 @@ +/***************************************************************************** + * VLCLoginPanel.h: A Generic Login Panel created for VLC + ***************************************************************************** + * Copyright (C) 2009-2010 the VideoLAN team + * $Id$ + * + * Authors: Felix Paul Kühne + * + * 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 + * GNU General Public License for more details. + * + * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import + + +@interface VLCLoginPanel : NSPanel { + IBOutlet NSButton * _cancelButton; + IBOutlet NSButton * _okayButton; + IBOutlet NSTextField * _userNameLabel; + IBOutlet NSTextField * _userNameField; + IBOutlet NSTextField * _passwordLabel; + IBOutlet NSSecureTextField * _passwordField; + IBOutlet NSTextField * _titleField; + IBOutlet NSTextField * _informativeTextField; + IBOutlet NSImageView * _iconView; +} + +- (IBAction)buttonAction:(id)sender; +- (void)createContentView; + +- (void)setDialogTitle:(NSString *)title; +- (void)setDialogMessage:(NSString *)message; + +- (NSString *)userName; +- (NSString *)password; + +@end diff --git a/modules/gui/macosx_dialog_provider/VLCLoginPanel.m b/modules/gui/macosx_dialog_provider/VLCLoginPanel.m new file mode 100644 index 0000000000..81663f8452 --- /dev/null +++ b/modules/gui/macosx_dialog_provider/VLCLoginPanel.m @@ -0,0 +1,194 @@ +/***************************************************************************** + * VLCLoginPanel.m: A Generic Login Panel created for VLC + ***************************************************************************** + * Copyright (C) 2009-2010 the VideoLAN team + * $Id$ + * + * Authors: Felix Paul Kühne + * + * 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 + * GNU General Public License for more details. + * + * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import "VLCLoginPanel.h" + + +@implementation VLCLoginPanel + +- (id)init +{ + NSRect windowRect; + windowRect.size.height = 278; + windowRect.size.width = 505; + windowRect.origin.x = windowRect.origin.y = 0; + + return [super initWithContentRect:windowRect + styleMask:NSTitledWindowMask + backing:NSBackingStoreBuffered + defer:YES]; +} + +#define addButton( theButton, ox, oy, title, action ) \ +s_rc.origin.x = ox; \ +s_rc.origin.y = oy; \ +s_rc.size.height = 32; \ +s_rc.size.width = 108; \ +theButton = [[NSButton alloc] initWithFrame:s_rc]; \ +[theButton setButtonType:NSMomentaryLightButton]; \ +[theButton setTitle:title]; \ +[theButton setBordered:NO]; \ +[theButton setTarget:self]; \ +[theButton setAction:@selector(action:)]; \ +[ourContentView addSubview:theButton] + +- (void)createContentView +{ + NSRect s_rc = [self frame]; + id ourContentView = [self contentView]; + + s_rc.origin.x = 275; + s_rc.origin.y = 44; + s_rc.size.height = 32; + s_rc.size.width = 108; + _cancelButton = [[NSButton alloc] initWithFrame:s_rc]; + [_cancelButton setButtonType:NSMomentaryLightButton]; + [_cancelButton setTitle:@"Cancel"]; + [_cancelButton setBezelStyle:NSRoundedBezelStyle]; + [_cancelButton setBordered:YES]; + [_cancelButton setTarget:self]; + [_cancelButton setAction:@selector(buttonAction:)]; + [ourContentView addSubview:_cancelButton]; + + s_rc.origin.x = 383; + s_rc.origin.y = 44; + s_rc.size.height = 32; + s_rc.size.width = 108; + _okayButton = [[NSButton alloc] initWithFrame:s_rc]; + [_okayButton setButtonType:NSMomentaryLightButton]; + [_okayButton setTitle:@"OK"]; + [_okayButton setBezelStyle:NSRoundedBezelStyle]; + [_okayButton setBordered:YES]; + [_okayButton setTarget:self]; + [_okayButton setAction:@selector(buttonAction:)]; + [ourContentView addSubview:_okayButton]; + + s_rc.origin.x = 94; + s_rc.origin.y = 170; + s_rc.size.height = 14; + s_rc.size.width = 129; + _userNameLabel = [[NSTextField alloc] initWithFrame:s_rc]; + [_userNameLabel setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [_userNameLabel setStringValue:@"User Name"]; + [_userNameLabel setBezeled:NO]; + [_userNameLabel setEditable:NO]; + [_userNameLabel setSelectable:NO]; + [_userNameLabel setDrawsBackground:NO]; + [ourContentView addSubview:_userNameLabel]; + + s_rc.origin.x = 97; + s_rc.origin.y = 148; + s_rc.size.height = 22; + s_rc.size.width = 310; + _userNameField = [[NSTextField alloc] initWithFrame:s_rc]; + [_userNameField setBezeled:YES]; + [_userNameField setEditable:YES]; + [_userNameField setImportsGraphics:NO]; + [ourContentView addSubview:_userNameField]; + + s_rc.origin.x = 94; + s_rc.origin.y = 116; + s_rc.size.height = 14; + s_rc.size.width = 129; + _passwordLabel = [[NSTextField alloc] initWithFrame:s_rc]; + [_passwordLabel setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [_passwordLabel setStringValue:@"Password"]; + [_passwordLabel setBezeled:NO]; + [_passwordLabel setEditable:NO]; + [_passwordLabel setSelectable:NO]; + [_passwordLabel setDrawsBackground:NO]; + [ourContentView addSubview:_passwordLabel]; + + s_rc.origin.x = 97; + s_rc.origin.y = 94; + s_rc.size.height = 22; + s_rc.size.width = 310; + _passwordField = [[NSSecureTextField alloc] initWithFrame:s_rc]; + [_passwordField setBezeled:YES]; + [_passwordField setEditable:YES]; + [_passwordField setImportsGraphics:NO]; + [ourContentView addSubview:_passwordField]; + + s_rc.origin.x = 94; + s_rc.origin.y = 238; + s_rc.size.height = 17; + s_rc.size.width = 316; + _titleField = [[NSTextField alloc] initWithFrame:s_rc]; + [_titleField setFont:[NSFont boldSystemFontOfSize:0]]; + [_titleField setBezeled:NO]; + [_titleField setEditable:NO]; + [_titleField setSelectable:YES]; + [_titleField setDrawsBackground:NO]; + [ourContentView addSubview:_titleField]; + + s_rc.origin.x = 94; + s_rc.origin.y = 183; + s_rc.size.height = 44; + s_rc.size.width = 394; + _informativeTextField = [[NSTextField alloc] initWithFrame:s_rc]; + [_informativeTextField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [_informativeTextField setBezeled:NO]; + [_informativeTextField setEditable:NO]; + [_informativeTextField setSelectable:YES]; + [_informativeTextField setDrawsBackground:NO]; + [ourContentView addSubview:_informativeTextField]; + + s_rc.origin.x = 20; + s_rc.origin.y = 188; + s_rc.size.height = s_rc.size.width = 64; + _iconView = [[NSImageView alloc] initWithFrame:s_rc]; + [_iconView setImage:[NSImage imageNamed:@"NSApplicationIcon"]]; + [_iconView setEditable:NO]; + [_iconView setAllowsCutCopyPaste:NO]; + [ourContentView addSubview:_iconView]; +} + +- (IBAction)buttonAction:(id)sender +{ + if (sender == _okayButton) + [NSApp stopModalWithCode: 1]; + else + [NSApp stopModalWithCode: 0]; +} + +- (void)setDialogTitle:(NSString *)title +{ + [_titleField setStringValue:title]; + [self setTitle:title]; +} +- (void)setDialogMessage:(NSString *)message +{ + [_informativeTextField setStringValue:message]; +} + +- (NSString *)userName +{ + return [_userNameField stringValue]; +} + +- (NSString *)password +{ + return [_passwordField stringValue]; +} + +@end diff --git a/modules/gui/macosx_dialog_provider/dialogProvider.h b/modules/gui/macosx_dialog_provider/dialogProvider.h new file mode 100644 index 0000000000..f11b590276 --- /dev/null +++ b/modules/gui/macosx_dialog_provider/dialogProvider.h @@ -0,0 +1,16 @@ +// +// dialogProvider.h +// +// +// Created by Felix Paul Kühne on 26.12.09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface dialogProvider : NSObject { + +} + +@end diff --git a/modules/gui/macosx_dialog_provider/dialogProvider.m b/modules/gui/macosx_dialog_provider/dialogProvider.m new file mode 100644 index 0000000000..d997292fc9 --- /dev/null +++ b/modules/gui/macosx_dialog_provider/dialogProvider.m @@ -0,0 +1,219 @@ +/***************************************************************************** + * dialogProvider.m: Minimal Dialog Provider for Mac OS X + ***************************************************************************** + * Copyright (C) 2009-2010 the VideoLAN team + * $Id$ + * + * Authors: Felix Paul Kühne + * + * 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 + * GNU General Public License for more details. + * + * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +/***************************************************************************** + * Preamble + *****************************************************************************/ +#import /* malloc(), free() */ +#import + +#ifdef HAVE_CONFIG_H +# import "config.h" +#endif + +#import +#import +#import +#import + +#import +#import "VLCLoginPanel.h" + +/***************************************************************************** + * Prototypes + *****************************************************************************/ +static int OpenIntf(vlc_object_t *); +static void CloseIntf(vlc_object_t *); +static void Run(intf_thread_t * ); + +static int DisplayError(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * ); +static int DisplayCritical(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * ); +static int DisplayQuestion(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * ); +static int DisplayLogin(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * ); + +struct intf_sys_t +{ + vlc_mutex_t lock; + vlc_cond_t wait; +}; + +/***************************************************************************** + * Module descriptor + *****************************************************************************/ + +vlc_module_begin() +/* Minimal interface. see intf.m */ +set_shortname("Mac OS X Dialogs") +add_shortcut("macosx_dialog_provider") +add_shortcut("miosx") +set_description("Minimal Mac OS X Dialog Provider") +set_capability("interface", 50) +set_callbacks(OpenIntf, CloseIntf) +set_category(CAT_INTERFACE) +set_subcategory(SUBCAT_INTERFACE_MAIN) +vlc_module_end() + +/***************************************************************************** + * OpenIntf: initialize interface + *****************************************************************************/ +int OpenIntf(vlc_object_t *p_this) +{ + intf_thread_t *p_intf = (intf_thread_t*) p_this; + + p_intf->p_sys = malloc(sizeof(intf_sys_t)); + if(!p_intf->p_sys) + return VLC_ENOMEM; + + memset(p_intf->p_sys,0,sizeof(*p_intf->p_sys)); + +// p_intf->b_should_run_on_first_thread = true; + p_intf->pf_run = Run; + + msg_Dbg(p_intf,"Opening Mac OS X dialog provider"); + return VLC_SUCCESS; +} + +/***************************************************************************** + * Run: waiting for the death + *****************************************************************************/ +static void Run( intf_thread_t *p_intf ) +{ + /* subscribe to various interactive dialogues */ + var_Create(p_intf,"dialog-error",VLC_VAR_ADDRESS); + var_AddCallback(p_intf,"dialog-error",DisplayError,p_intf); + var_Create(p_intf,"dialog-critical",VLC_VAR_ADDRESS); + var_AddCallback(p_intf,"dialog-critical",DisplayCritical,p_intf); + var_Create(p_intf,"dialog-login",VLC_VAR_ADDRESS); + var_AddCallback(p_intf,"dialog-login",DisplayLogin,p_intf); + var_Create(p_intf,"dialog-question",VLC_VAR_ADDRESS); + var_AddCallback(p_intf,"dialog-question",DisplayQuestion,p_intf); + // var_Create(p_intf,"dialog-progress-bar",VLC_VAR_ADDRESS); + // var_AddCallback(p_intf,"dialog-progress-bar",DisplayProgressPanelAction,p_intf); + dialog_Register(p_intf); + + msg_Dbg(p_intf,"Mac OS X dialog provider initialised"); + + /* idle */ + while(vlc_object_alive(p_intf)) + { + sleep( 100000 ); + } + + /* unsubscribe from the interactive dialogues */ + dialog_Unregister(p_intf ); + var_DelCallback(p_intf,"dialog-error",DisplayError,p_intf); + var_DelCallback(p_intf,"dialog-critical",DisplayCritical,p_intf); + var_DelCallback(p_intf,"dialog-login",DisplayLogin,p_intf); + var_DelCallback(p_intf,"dialog-question",DisplayQuestion,p_intf); + // var_DelCallback(p_intf,"dialog-progress-bar",DisplayProgressPanelAction,p_intf); +} +/***************************************************************************** + * CloseIntf: destroy interface + *****************************************************************************/ +void CloseIntf(vlc_object_t *p_this) +{ + intf_thread_t *p_intf = (intf_thread_t*) p_this; + + msg_Dbg(p_intf,"Mac OS X dialog provider closed"); + free(p_intf->p_sys); +} + + +/***************************************************************************** + * Callbacks triggered by the "dialog-*" variables + *****************************************************************************/ +static int DisplayError(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data) +{ + NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; + dialog_fatal_t *p_dialog = (dialog_fatal_t *)value.p_address; + NSRunInformationalAlertPanel([NSString stringWithUTF8String:p_dialog->title], + [NSString stringWithUTF8String:p_dialog->message], + @"OK", nil, nil); + [o_pool release]; +} + +static int DisplayCritical(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data) +{ + NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; + dialog_fatal_t *p_dialog = (dialog_fatal_t *)value.p_address; + NSRunCriticalAlertPanel([NSString stringWithUTF8String:p_dialog->title], + [NSString stringWithUTF8String:p_dialog->message], + @"OK", nil, nil); + [o_pool release]; +} + +static int DisplayQuestion(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data) +{ + NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; + dialog_question_t *p_dialog = (dialog_question_t *)value.p_address; + NSAlert *o_alert; + NSString *o_yes, *o_no, *o_cancel; + NSInteger i_returnValue = 0; + + if (p_dialog->yes != NULL) + o_yes = [NSString stringWithUTF8String:p_dialog->yes]; + if (p_dialog->no != NULL) + o_no = [NSString stringWithUTF8String:p_dialog->no]; + if (p_dialog->cancel != NULL) + o_cancel = [NSString stringWithUTF8String:p_dialog->cancel]; + + o_alert = [NSAlert alertWithMessageText:[NSString stringWithUTF8String:p_dialog->title] + defaultButton:o_yes + alternateButton:o_no + otherButton:o_cancel + informativeTextWithFormat:[NSString stringWithUTF8String:p_dialog->message]]; + [o_alert setAlertStyle:NSInformationalAlertStyle]; + i_returnValue = [o_alert runModal]; + + if (i_returnValue == NSAlertDefaultReturn) + p_dialog->answer = 1; + if (i_returnValue == NSAlertAlternateReturn) + p_dialog->answer = 2; + if (i_returnValue == NSAlertOtherReturn) + p_dialog->answer = 3; + [o_pool release]; +} + +static int DisplayLogin(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data) +{ + NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; + dialog_login_t *p_dialog = (dialog_login_t *)value.p_address; + NSInteger i_returnValue = 0; + VLCLoginPanel *thePanel = [[VLCLoginPanel alloc] init]; + [thePanel createContentView]; + [thePanel setDialogTitle:[NSString stringWithUTF8String:p_dialog->title]]; + [thePanel setDialogMessage:[NSString stringWithUTF8String:p_dialog->message]]; + [thePanel center]; + i_returnValue = [NSApp runModalForWindow: thePanel]; + [thePanel close]; + if( i_returnValue ) + { + *p_dialog->username = strdup( [[thePanel userName] UTF8String] ); + *p_dialog->password = strdup( [[thePanel password] UTF8String] ); + } + else + { + *p_dialog->username = *p_dialog->password = NULL; + } + [o_pool release]; +}