+- (IBAction)toggleAtoBloop:(id)sender
+{
+ [[VLCCoreInteraction sharedInstance] setAtoB];
+}
+
+#pragma mark -
+#pragma mark audio menu
+- (void)refreshAudioDeviceList
+{
+ char **ids, **names;
+ char *currentDevice;
+
+ [o_mu_device removeAllItems];
+
+ audio_output_t * p_aout = getAout();
+ if (!p_aout)
+ return;
+
+ int n = aout_DevicesList(p_aout, &ids, &names);
+ if (n == -1) {
+ vlc_object_release(p_aout);
+ return;
+ }
+
+ currentDevice = aout_DeviceGet(p_aout);
+ NSMenuItem * o_mi_tmp;
+
+ for (NSUInteger x = 0; x < n; x++) {
+ o_mi_tmp = [o_mu_device addItemWithTitle:[NSString stringWithFormat:@"%s", names[x]] action:@selector(toggleAudioDevice:) keyEquivalent:@""];
+ [o_mi_tmp setTarget:self];
+ [o_mi_tmp setTag:[[NSString stringWithFormat:@"%s", ids[x]] intValue]];
+ }
+ vlc_object_release(p_aout);
+
+ [[o_mu_device itemWithTag:[[NSString stringWithFormat:@"%s", currentDevice] intValue]] setState:NSOnState];
+
+ free(currentDevice);
+
+ for (NSUInteger x = 0; x < n; x++) {
+ free(ids[x]);
+ free(names[x]);
+ }
+ free(ids);
+ free(names);
+
+ [o_mu_device setAutoenablesItems:YES];
+ [o_mi_device setEnabled:YES];
+}
+
+- (IBAction)toggleAudioDevice:(id)sender
+{
+ audio_output_t * p_aout = getAout();
+ if (!p_aout)
+ return;
+
+ int returnValue = 0;
+
+ if ([sender tag] > 0)
+ returnValue = aout_DeviceSet(p_aout, [[NSString stringWithFormat:@"%li", [sender tag]] UTF8String]);
+ else
+ returnValue = aout_DeviceSet(p_aout, NULL);
+
+ if (returnValue != 0)
+ msg_Warn(VLCIntf, "failed to set audio device %li", [sender tag]);
+
+ vlc_object_release(p_aout);
+ [self refreshAudioDeviceList];
+}
+
+#pragma mark -
+#pragma mark video menu
+
+- (IBAction)toggleFullscreen:(id)sender
+{
+ [[VLCCoreInteraction sharedInstance] toggleFullscreen];
+}
+
+- (IBAction)resizeVideoWindow:(id)sender
+{
+ input_thread_t *p_input = pl_CurrentInput(VLCIntf);
+ if (p_input) {
+ vout_thread_t *p_vout = getVoutForActiveWindow();
+ if (p_vout) {
+ if (sender == o_mi_half_window)
+ var_SetFloat(p_vout, "zoom", 0.5);
+ else if (sender == o_mi_normal_window)
+ var_SetFloat(p_vout, "zoom", 1.0);
+ else if (sender == o_mi_double_window)
+ var_SetFloat(p_vout, "zoom", 2.0);
+ else
+ {
+ [[NSApp keyWindow] performZoom:sender];
+ }
+ vlc_object_release(p_vout);
+ }
+ vlc_object_release(p_input);
+ }
+}
+
+- (IBAction)floatOnTop:(id)sender
+{
+ input_thread_t *p_input = pl_CurrentInput(VLCIntf);
+ if (p_input) {
+ vout_thread_t *p_vout = getVoutForActiveWindow();
+ if (p_vout) {
+ var_ToggleBool(p_vout, "video-on-top");
+ vlc_object_release(p_vout);
+ }
+ vlc_object_release(p_input);
+ }
+}
+
+- (IBAction)createVideoSnapshot:(id)sender
+{
+ input_thread_t *p_input = pl_CurrentInput(VLCIntf);
+ if (p_input) {
+ vout_thread_t *p_vout = getVoutForActiveWindow();
+ if (p_vout) {
+ var_TriggerCallback(p_vout, "video-snapshot");
+ vlc_object_release(p_vout);
+ }
+ vlc_object_release(p_input);
+ }
+}
+
+- (IBAction)toggleFullscreenDevice:(id)sender
+{
+ config_PutInt(VLCIntf, "macosx-vdev", [sender tag]);
+ [self refreshVoutDeviceMenu: nil];
+}
+
+- (id)voutMenu
+{
+ return o_vout_menu;
+}
+
+#pragma mark - Subtitles Menu
+- (IBAction)addSubtitleFile:(id)sender
+{
+ NSInteger i_returnValue = 0;
+ input_thread_t * p_input = pl_CurrentInput(VLCIntf);
+ if (!p_input)
+ return;
+
+ input_item_t *p_item = input_GetItem(p_input);
+ if (!p_item) {
+ vlc_object_release(p_input);
+ return;
+ }
+
+ char *path = input_item_GetURI(p_item);
+ if (!path)
+ path = strdup("");
+
+ NSOpenPanel * openPanel = [NSOpenPanel openPanel];
+ [openPanel setCanChooseFiles: YES];
+ [openPanel setCanChooseDirectories: NO];
+ [openPanel setAllowsMultipleSelection: YES];
+ [openPanel setAllowedFileTypes: @[@"cdg",@"@idx",@"srt",@"sub",@"utf",@"ass",@"ssa",@"aqt",@"jss",@"psb",@"rt",@"smi",@"txt",@"smil"]];
+ [openPanel setDirectoryURL:[NSURL fileURLWithPath:[@(path) stringByExpandingTildeInPath]]];
+ i_returnValue = [openPanel runModal];
+ free(path);
+
+ if (i_returnValue == NSOKButton) {
+ NSUInteger c = 0;
+ if (!p_input)
+ return;
+
+ c = [[openPanel URLs] count];
+
+ for (int i = 0; i < c ; i++) {
+ msg_Dbg(VLCIntf, "loading subs from %s", [[[[openPanel URLs] objectAtIndex:i] path] UTF8String]);
+ if (input_AddSubtitle(p_input, [[[[openPanel URLs] objectAtIndex:i] path] UTF8String], TRUE))
+ msg_Warn(VLCIntf, "unable to load subtitles from '%s'",
+ [[[[openPanel URLs] objectAtIndex:i] path] UTF8String]);
+ }
+ }
+ vlc_object_release(p_input);
+}
+
+- (IBAction)switchSubtitleOption:(id)sender
+{
+ int intValue = [sender tag];
+ NSString *representedObject = [sender representedObject];
+
+ config_PutInt(p_intf, [representedObject UTF8String], intValue);
+
+ NSMenu *menu = [sender menu];
+ NSUInteger count = [menu numberOfItems];
+ for (NSUInteger x = 0; x < count; x++)
+ [[menu itemAtIndex:x] setState:NSOffState];
+ [[menu itemWithTag:intValue] setState:NSOnState];
+}
+
+- (IBAction)switchSubtitleBackgroundOpacity:(id)sender
+{
+ config_PutInt(p_intf, "freetype-background-opacity", [sender intValue]);
+}
+
+- (IBAction)telxTransparent:(id)sender
+{
+ vlc_object_t *p_vbi;
+ p_vbi = (vlc_object_t *) vlc_object_find_name(pl_Get(VLCIntf), "zvbi");
+ if (p_vbi) {
+ var_SetBool(p_vbi, "vbi-opaque", [sender state]);
+ [sender setState: ![sender state]];
+ vlc_object_release(p_vbi);
+ }
+}
+
+- (IBAction)telxNavLink:(id)sender
+{
+ intf_thread_t * p_intf = VLCIntf;
+ vlc_object_t *p_vbi;
+ int i_page = 0;
+
+ if ([[sender title] isEqualToString: _NS("Index")])
+ i_page = 'i' << 16;
+ else if ([[sender title] isEqualToString: _NS("Red")])
+ i_page = 'r' << 16;
+ else if ([[sender title] isEqualToString: _NS("Green")])
+ i_page = 'g' << 16;
+ else if ([[sender title] isEqualToString: _NS("Yellow")])
+ i_page = 'y' << 16;
+ else if ([[sender title] isEqualToString: _NS("Blue")])
+ i_page = 'b' << 16;
+ if (i_page == 0) return;
+
+ p_vbi = (vlc_object_t *) vlc_object_find_name(pl_Get(VLCIntf), "zvbi");
+ if (p_vbi) {
+ var_SetInteger(p_vbi, "vbi-page", i_page);
+ vlc_object_release(p_vbi);
+ }
+}