]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/extended.m
* Only allow playlist files in open playlist (Refs:#940)
[vlc] / modules / gui / macosx / extended.m
index 09a8aabde6c1bdb80d9d2afcaab66f26bd7aa7be..4925ab2266729c368c6277d31ad8967f68abe575 100644 (file)
 #import "extended.h"
 #import "intf.h"
 #import "vout.h"
-#import <vlc/aout.h>
-#import <aout_internal.h>
-#import <vlc/vout.h>
-#import <vlc/intf.h>
+#import <vlc_aout.h>
+#import <vlc_vout.h>
+#import <vlc_interface.h>
 
 /*****************************************************************************
  * VLCExtended implementation
@@ -83,16 +82,20 @@ static VLCExtended *_o_sharedInstance = nil;
     [o_lbl_videoFlts setStringValue: _NS("Video filters")];
     [o_lbl_adjustImage setStringValue: _NS("Image adjustment")];
     [o_btn_vidFlts_mrInfo setTitle: _NS("More Info")];
-    [o_ckb_blur setTitle: _NS("Blurring")];
+    [o_ckb_wave setTitle: _NS("Wave")];
+    [o_ckb_ripple setTitle: _NS("Ripple")];
+    [o_ckb_psycho setTitle: _NS("Psychedelic")];
+    [o_ckb_gradient setTitle: _NS("Gradient")];
+    [o_lbl_general setStringValue: _NS("General editing filters")];
+    [o_lbl_distort setStringValue: _NS("Distortion filters")];
+    [o_ckb_blur setTitle: _NS("Blur")];
     [o_ckb_blur setToolTip: _NS("Adds motion blurring to the image")];
-    [o_ckb_distortion setTitle: _NS("Distortion")];
-    [o_ckb_distortion setToolTip: _NS("Adds distortion effects")];
     [o_ckb_imgClone setTitle: _NS("Image clone")];
     [o_ckb_imgClone setToolTip: _NS("Creates several copies of the Video "
                                     "output window" )];
     [o_ckb_imgCrop setTitle: _NS("Image cropping")];
     [o_ckb_imgCrop setToolTip: _NS("Crops a defined part of the image")];
-    [o_ckb_imgInvers setTitle: _NS("Image inversion")];
+    [o_ckb_imgInvers setTitle: _NS("Invert colors")];
     [o_ckb_imgInvers setToolTip: _NS("Inverts the colors of the image")];
     [o_ckb_trnsform setTitle: _NS("Transformation")];
     [o_ckb_trnsform setToolTip: _NS("Rotates or flips the image")];
@@ -123,7 +126,21 @@ static VLCExtended *_o_sharedInstance = nil;
     char * psz_vfilters;
     intf_thread_t * p_intf = VLCIntf;
     psz_vfilters = config_GetPsz( p_intf, "vout-filter" );
-    if( psz_vfilters && strstr( psz_vfilters, "adjust" ) )
+    /* set the video-filter-checkboxes to the correct values */
+    if( psz_vfilters )
+    {
+        [o_ckb_blur setState: (int)strstr( psz_vfilters, "motionblur")];
+        [o_ckb_imgClone setState: (int)strstr( psz_vfilters, "clone")];
+        [o_ckb_imgCrop setState: (int)strstr( psz_vfilters, "crop")];
+        [o_ckb_trnsform setState: (int)strstr( psz_vfilters, "transform")];
+
+        free( psz_vfilters );
+    }
+    
+    /* set the video-filter checkboxes to the correct values */
+    char * psz_vifilters;
+    psz_vifilters = config_GetPsz( p_intf, "video-filter" );
+    if( psz_vifilters && strstr( psz_vifilters, "adjust" ) )
     {
         [o_ckb_enblAdjustImg setState: NSOnState];
         [o_btn_rstrDefaults setEnabled: YES];
@@ -143,18 +160,15 @@ static VLCExtended *_o_sharedInstance = nil;
         [o_sld_hue setEnabled: NO];
         [o_sld_saturation setEnabled: NO];
     }
-    
-    /* set the other video-filter-checkboxes to the correct values */
-    if( psz_vfilters )
+    if( psz_vifilters )
     {
-        [o_ckb_blur setState: (int)strstr( psz_vfilters, "motionblur")];
-        [o_ckb_distortion setState: (int)strstr( psz_vfilters, "distort")];
-        [o_ckb_imgClone setState: (int)strstr( psz_vfilters, "clone")];
-        [o_ckb_imgCrop setState: (int)strstr( psz_vfilters, "crop")];
-        [o_ckb_imgInvers setState: (int)strstr( psz_vfilters, "invert")];
-        [o_ckb_trnsform setState: (int)strstr( psz_vfilters, "transform")];
-        
-        free( psz_vfilters );
+        [o_ckb_wave setState: (int)strstr( psz_vifilters, "wave")];
+        [o_ckb_psycho setState: (int)strstr( psz_vifilters, "psychedelic")];
+        [o_ckb_ripple setState: (int)strstr( psz_vifilters, "ripple")];
+        [o_ckb_gradient setState: (int)strstr( psz_vifilters, "gradient")];
+        [o_ckb_imgInvers setState: (int)strstr( psz_vifilters, "invert")];
+
+        free( psz_vifilters );
     }
     
     /* set the audio-filter-checkboxes to the values taken from the prefs */
@@ -255,7 +269,7 @@ static VLCExtended *_o_sharedInstance = nil;
         [o_sld_gamma setEnabled: YES];
         [o_sld_hue setEnabled: YES];
         [o_sld_saturation setEnabled: YES];
-        [self changeVFiltersString: "adjust" onOrOff: VLC_TRUE];
+        [self changeVideoFiltersString: "adjust" onOrOff: VLC_TRUE];
     }else{
         [o_btn_rstrDefaults setEnabled: NO];
         [o_sld_brightness setEnabled: NO];
@@ -263,7 +277,7 @@ static VLCExtended *_o_sharedInstance = nil;
         [o_sld_gamma setEnabled: NO];
         [o_sld_hue setEnabled: NO];
         [o_sld_saturation setEnabled: NO];
-        [self changeVFiltersString: "adjust" onOrOff: VLC_FALSE];
+        [self changeVideoFiltersString: "adjust" onOrOff: VLC_FALSE];
     }
 }
 
@@ -353,8 +367,7 @@ static VLCExtended *_o_sharedInstance = nil;
     id o_window = [NSApp keyWindow];
     NSArray *o_windows = [NSApp orderedWindows];
     NSEnumerator *o_enumerator = [o_windows objectEnumerator];
-    playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
-        FIND_ANYWHERE );
+    playlist_t * p_playlist = pl_Yield( VLCIntf );
     vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
     vout_thread_t *p_real_vout;
 
@@ -437,20 +450,20 @@ static VLCExtended *_o_sharedInstance = nil;
     {
         /* move the window contents upwards (partially done through settings
          * inside the nib) and resize the window */
-        o_win_rect.size.height = o_win_rect.size.height - 171;
-        o_win_rect.origin.y = [o_extended_window frame].origin.y + 171;
-        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 171;
-        o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y + 171;
+        o_win_rect.size.height = o_win_rect.size.height - 193;
+        o_win_rect.origin.y = [o_extended_window frame].origin.y + 193;
+        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 193;
+        o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y + 193;
         
         /* remove the inserted view */
         [o_adjustImg_view removeFromSuperviewWithoutNeedingDisplay];
     }else{
     
         /* move the window contents downwards and resize the window */
-        o_win_rect.size.height = o_win_rect.size.height + 171;
-        o_win_rect.origin.y = [o_extended_window frame].origin.y - 171;
-        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 171;
-        o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y - 171;
+        o_win_rect.size.height = o_win_rect.size.height + 193;
+        o_win_rect.origin.y = [o_extended_window frame].origin.y - 193;
+        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 193;
+        o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y - 193;
     }
     
     [o_box_audFlts setFrameFromContentFrame: o_box_audFlts_rect];
@@ -460,12 +473,12 @@ static VLCExtended *_o_sharedInstance = nil;
     
     if (o_adjImg_expanded)
     {
-        o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height - 171;
+        o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height - 193;
         o_adjImg_expanded = NO;
     } else {
         /* insert view */
-        o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height + 171;
-        [o_adjustImg_view setFrame: NSMakeRect( 20, -10, 370, 181)];
+        o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height + 193;
+        [o_adjustImg_view setFrame: NSMakeRect( 20, -10, 370, 203)];
         [o_adjustImg_view setNeedsDisplay:YES];
         [o_adjustImg_view setAutoresizesSubviews: YES];
         [[o_box_adjImg contentView] addSubview: o_adjustImg_view];
@@ -525,18 +538,18 @@ static VLCExtended *_o_sharedInstance = nil;
     {
         /* move the window contents upwards (partially done through settings
          * inside the nib) and resize the window */
-        o_win_rect.size.height = o_win_rect.size.height - 116;
-        o_win_rect.origin.y = [o_extended_window frame].origin.y + 116;
-        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 116;
+        o_win_rect.size.height = o_win_rect.size.height - 188;
+        o_win_rect.origin.y = [o_extended_window frame].origin.y + 188;
+        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 188;
         
         /* remove the inserted view */
         [o_videoFilters_view removeFromSuperviewWithoutNeedingDisplay];
     }else{
     
         /* move the window contents downwards and resize the window */
-        o_win_rect.size.height = o_win_rect.size.height + 116;
-        o_win_rect.origin.y = [o_extended_window frame].origin.y - 116;
-        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 116;
+        o_win_rect.size.height = o_win_rect.size.height + 188;
+        o_win_rect.origin.y = [o_extended_window frame].origin.y - 188;
+        o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 188;
     }
     
     [o_box_audFlts setFrameFromContentFrame: o_box_audFlts_rect];
@@ -545,12 +558,12 @@ static VLCExtended *_o_sharedInstance = nil;
     
     if (o_vidFlts_expanded)
     {
-        o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height - 116;
+        o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height - 188;
         o_vidFlts_expanded = NO;
     } else {
         /* insert view */
-        o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height + 116;
-        [o_videoFilters_view setFrame: NSMakeRect( 20, -10, 370, 116)];
+        o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height + 188;
+        [o_videoFilters_view setFrame: NSMakeRect( 20, -10, 370, 188)];
         [o_videoFilters_view setNeedsDisplay:YES];
         [o_videoFilters_view setAutoresizesSubviews: YES];
         [[o_box_vidFlts contentView] addSubview: o_videoFilters_view];
@@ -563,33 +576,36 @@ static VLCExtended *_o_sharedInstance = nil;
 {
     /* en-/disable video filters */
     if (sender == o_ckb_blur)
-    {
-        [self changeVFiltersString: "motionblur" onOrOff: [o_ckb_blur state]];
-    }
-    else if (sender == o_ckb_distortion)
-    {
-        [self changeVFiltersString: "distort" onOrOff: [o_ckb_distortion state]];
-    }
+        [self changeVoutFiltersString: "motionblur" onOrOff: [o_ckb_blur state]];
+
     else if (sender == o_ckb_imgClone)
-    {
-        [self changeVFiltersString: "clone" onOrOff: [o_ckb_imgClone state]];
-    }
+        [self changeVoutFiltersString: "clone" onOrOff: [o_ckb_imgClone state]];
+
     else if (sender == o_ckb_imgCrop)
-    {
-        [self changeVFiltersString: "crop" onOrOff: [o_ckb_imgCrop state]];
-    }
+        [self changeVoutFiltersString: "crop" onOrOff: [o_ckb_imgCrop state]];
+
     else if (sender == o_ckb_imgInvers)
-    {
-        [self changeVFiltersString: "invert" onOrOff: [o_ckb_imgInvers state]];
-    }
+        [self changeVideoFiltersString: "invert" onOrOff: [o_ckb_imgInvers state]];
+
     else if (sender == o_ckb_trnsform)
-    {
-        [self changeVFiltersString: "transform" onOrOff: [o_ckb_trnsform state]];
-    }
+        [self changeVoutFiltersString: "transform" onOrOff: [o_ckb_trnsform state]];
+
     else if (sender == o_ckb_intZoom )
-    {
-        [self changeVFiltersString: "magnify" onOrOff: [o_ckb_intZoom state]];
-    } else {
+        [self changeVoutFiltersString: "magnify" onOrOff: [o_ckb_intZoom state]];
+
+    else if (sender == o_ckb_wave )
+        [self changeVideoFiltersString: "wave" onOrOff: [o_ckb_wave state]];
+
+    else if (sender == o_ckb_gradient )
+        [self changeVideoFiltersString: "gradient" onOrOff: [o_ckb_gradient state]];
+
+    else if (sender == o_ckb_psycho )
+        [self changeVideoFiltersString: "psychedelic" onOrOff: [o_ckb_psycho state]];
+
+    else if (sender == o_ckb_ripple )
+        [self changeVideoFiltersString: "ripple" onOrOff: [o_ckb_ripple state]];
+
+    else {
         /* this shouldn't happen */
         msg_Warn (VLCIntf, "cannot find switched video-filter");
     }
@@ -612,10 +628,13 @@ static VLCExtended *_o_sharedInstance = nil;
  * methods to communicate changes to VLC's core
  *****************************************************************************/
 
-- (void)changeVFiltersString:(char *)psz_name onOrOff:(vlc_bool_t )b_add 
+- (void)changeVoutFiltersString:(char *)psz_name onOrOff:(vlc_bool_t )b_add 
 {
     /* copied from ../wxwidgets/extrapanel.cpp
      * renamed to conform with Cocoa's rules */
+    /* this method only changes 1st generation video filters (the ones which 
+     * can't be used for transcoding). Have a look at changeVideoFiltersString
+     * for the 2nd generation filters. */
      
     vout_thread_t *p_vout;
     intf_thread_t * p_intf = VLCIntf;
@@ -679,6 +698,72 @@ static VLCExtended *_o_sharedInstance = nil;
 }
 
 
+- (void)changeVideoFiltersString:(char *)psz_name onOrOff:(vlc_bool_t )b_add 
+{
+    /* same as changeVoutFiltersString but addressing the "video-filter"
+     * variable which represents the video filter 2 modules */
+     
+    vout_thread_t *p_vout;
+    intf_thread_t * p_intf = VLCIntf;
+    
+    char *psz_parser, *psz_string;
+    psz_string = config_GetPsz( p_intf, "video-filter" );
+    
+    if( !psz_string ) psz_string = strdup("");
+
+    psz_parser = strstr( psz_string, psz_name );
+
+    if( b_add )
+    {
+        if( !psz_parser )
+        {
+            psz_parser = psz_string;
+            asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s",
+                            psz_string, psz_name );
+            free( psz_parser );
+        }
+        else
+        {
+            return;
+        }
+    }
+    else
+    {
+        if( psz_parser )
+        {
+            memmove( psz_parser, psz_parser + strlen(psz_name) +
+                            (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ),
+                            strlen(psz_parser + strlen(psz_name)) + 1 );
+
+            /* Remove trailing : : */
+            if( *(psz_string+strlen(psz_string ) -1 ) == ':' )
+            {
+                *(psz_string+strlen(psz_string ) -1 ) = '\0';
+            }
+         }
+         else
+         {
+             free( psz_string );
+             return;
+         }
+    }
+    /* Vout is not kept, so put that in the config */
+    config_PutPsz( p_intf, "video-filter", psz_string );
+
+    /* Try to set on the fly */
+    p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
+                                              FIND_ANYWHERE );
+    if( p_vout )
+    {
+        var_SetString( p_vout, "video-filter", psz_string );
+        vlc_object_release( p_vout );
+    }
+
+    free( psz_string );
+
+    o_config_changed = YES;
+}
+
 - (void)changeAFiltersString: (char *)psz_name onOrOff: (vlc_bool_t )b_add;
 {
     /* copied from ../wxwidgets/extrapanel.cpp
@@ -760,8 +845,7 @@ static VLCExtended *_o_sharedInstance = nil;
 {    
     /* save the preferences to make sure that our module-changes will up on
      * next launch again */
-    playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
-        FIND_ANYWHERE );
+    playlist_t * p_playlist = pl_Yield( VLCIntf );
     int returnedValue;
     NSArray * theModules;
     theModules = [[NSArray alloc] initWithObjects: @"main", @"headphone",