]> git.sesse.net Git - vlc/commitdiff
Updated & cleaned up intf_macosx.c and vout_macosx.c - added Open menu
authorEugenio Jarosiewicz <ej@videolan.org>
Wed, 11 Apr 2001 13:30:30 +0000 (13:30 +0000)
committerEugenio Jarosiewicz <ej@videolan.org>
Wed, 11 Apr 2001 13:30:30 +0000 (13:30 +0000)
function support and a no-frills About box

Created macosx_common.h in plugins/macosx/ to hold , well, common stuff
(the way I see it, there is inherently a difficult separation of intf and
vout on Mac OS, if anyone has suggestions I'm open)

Cleaned up debug spew I left in modules.c and video_text.c

Hacked main.c to disregard argv[1] when compiled for OSX & run as a full
app (ie., double clicked and not launched from command line)... read the
file for more details.  UGLY.

Updated Makefile.in to make vlc.app by default on Mac OS X & Darwin, added
clean code for it as well

Makefile.in
plugins/macosx/intf_macosx.c
plugins/macosx/macosx_common.h [new file with mode: 0755]
plugins/macosx/vout_macosx.c
src/misc/modules.c
src/video_output/video_text.c

index 23a89699bb7f6cc596c56d7cbc9600cf32bc4650..1fdedee686cbaf5f3308b2a4d301607d47587609 100644 (file)
@@ -484,6 +484,7 @@ clean:
        rm -f plugins/*/*.o plugins/*/*.moc plugins/*/*.bak
        rm -f src/*/*.o extras/*/*.o
        rm -f lib/*.so vlc gnome-vlc gvlc kvlc qvlc
+       rm -rf vlc.app
 
 distclean: clean
        rm -f **/*.o **/*~ *.log
@@ -491,6 +492,7 @@ distclean: clean
        rm -f config.status config.cache config.log
        rm -f gmon.out core build-stamp
        rm -Rf .dep
+       rm -f .gdb_history
 
 install:
        mkdir -p $(DESTDIR)$(bindir)
@@ -682,8 +684,6 @@ ifeq ($(SYS),beos)
        rm -f ./plugins/_APP_
        ln -s ../vlc ./plugins/_APP_
 endif
-
-vlc.app: all
 ifneq (,$(findstring darwin,$(SYS)))
        mkdir -p vlc.app/Contents/MacOS
        mkdir -p vlc.app/Contents/MacOS/lib
index b214566649e0c3366dd2c2fc5810034fdd68efb1..2e3732c531827b1e779e141e9f69c72a65421f53 100644 (file)
@@ -3,7 +3,7 @@
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
  *
- * Authors: 
+ * Authors: Colin Delacroix <colin@zoy.org>
  *
  * 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
@@ -29,6 +29,7 @@
 #include "defs.h"
 
 #include <stdlib.h>                                      /* malloc(), free() */
+#include <sys/param.h>                                    /* for MAXPATHLEN */
 
 #include "config.h"
 #include "common.h"
 #include "mtime.h"
 #include "tests.h"
 
-#include "intf_msg.h"
 #include "interface.h"
-
-#include "modules.h"
+#include "intf_msg.h"
+#include "intf_playlist.h"
 
 #include "stream_control.h"
 #include "input_ext-intf.h"
 
-#include "intf_playlist.h"
 #include "audio_output.h"
 
+#include "video.h"
+#include "video_output.h"
+
+#include "modules.h"
 #include "main.h"
 
-#include <Carbon/Carbon.h>
+#include "macosx_common.h"
+
+extern main_t *p_main;
+
+
+/*****************************************************************************
+ * Constants & more
+ *****************************************************************************/
 
 //how often to have callback to main loop.  Target of 30fps then 30hz + maybe some more...
 //it doesn't really scale if we move to 2x the hz...  something else is slowing us down...
-
 #define kMainLoopFrequency  (kEventDurationSecond / 45)                //45 for good measure
 
-#define PLAYING                0
-#define PAUSED         1
-
 // Menu defs
 enum
 {
@@ -92,8 +98,8 @@ enum
 */
 
     kMenuApple  = 128,
-    kMenuFile   = 129,
-    kMenuControls   = 130,
+    kMenuFile,
+    kMenuControls,
 
     kAppleAbout = 1, 
     kAppleQuit = 8, //is this always the same?
@@ -120,7 +126,6 @@ enum
     kControlsEjectDiv,
     kControlsEject 
 
-
 #if 0
 //virtual key codes ; raw subtract 0x40 from these values
 //http://devworld.apple.com/techpubs/mac/Text/Text-577.html#HEADING577-0
@@ -137,13 +142,23 @@ enum
 
 };
 
+// Initial Window Constants
+enum
+{
+    kAboutWindowOffset = 200,
+    kAboutWindowWidth = 200, //400
+    kAboutWindowHeight = 50 //100
+};
+
+
 /*****************************************************************************
  * intf_sys_t: description and status of the interface
  *****************************************************************************/
 typedef struct intf_sys_s
 {
     EventLoopTimerRef manageTimer;
-    
+    Rect aboutRect;
+    WindowRef  p_aboutWindow;
 } intf_sys_t;
 
 /*****************************************************************************
@@ -156,13 +171,22 @@ static void intf_Run       ( intf_thread_t *p_intf );
 
 /* OS Specific */
 
+static int MakeAboutWindow             ( intf_thread_t *p_intf );
+
 void CarbonManageCallback ( EventLoopTimerRef inTimer, void *inUserData );
 
+OSErr MyOpenDocument(const FSSpecPtr defaultLocationfssPtr);
+
+void playorpause ( intf_thread_t *p_intf );
+void stop ( intf_thread_t *p_intf );
+
+
 #ifndef CarbonEvents
 void EventLoop( intf_thread_t *p_intf );
 void DoEvent( intf_thread_t *p_intf , EventRecord *event);
 void DoMenuCommand( intf_thread_t *p_intf , long menuResult);
 void DrawWindow(WindowRef window);
+void DrawAboutWindow(WindowRef window);
 #else
 /*
 pascal OSErr   QuitEventHandler(const AppleEvent *theEvent, AppleEvent *theReply, SInt32 refCon);
@@ -287,10 +311,22 @@ static int intf_Open( intf_thread_t *p_intf )
 
     InsertMenu( menu, 0 );
 
+//Hmm, eventually we might want more than one player window, but for now we assume one only (like OS 9 player)
+//and since we start with a window open, we temporarily disable the 'new' menu
+    DisableMenuItem( GetMenuHandle(kMenuFile), kFileNew);
 
+//FIXME - Disabled Menus which are not implemented yet
+    DisableMenuItem( GetMenuHandle(kMenuControls), kControlsDVDMenu);
+    DisableMenuItem( GetMenuHandle(kMenuControls), kControlsEject);
 
     DrawMenuBar();
 
+    if( MakeAboutWindow( p_intf ) )
+    {
+        intf_ErrMsg( "vout error: can't make about window" );
+        return( 1 );
+    }
+
     return( 0 );
 }
 
@@ -309,20 +345,17 @@ static void intf_Close( intf_thread_t *p_intf )
 static void intf_Run( intf_thread_t *p_intf )
 {
     OSStatus err;
-
     EventLoopTimerUPP manageUPP;
 
 /*
 Eventually we want to use Carbon events, or maybe even write this app in Cocoa
-*/
-
-//    EventTypeSpec windowEventType = { kEventClassWindow, kEventWindowClose };
-//    EventHandlerUPP windowHandlerUPP;
+//kinda going out of bounds here... need to bring window creation to this file.
+    main_t *p_main;
 
-    //kinda going out of bounds here... need to bring window creation to this file.
-//    main_t *p_main;
+    EventTypeSpec windowEventType = { kEventClassWindow, kEventWindowClose };
+    EventHandlerUPP windowHandlerUPP;
 
-/*
     EventTypeSpec keyboardEventType = { kEventClassKeyboard, kEventRawKeyDown };
     EventHandlerUPP keyboardHandlerUPP;
 */
@@ -332,8 +365,9 @@ Eventually we want to use Carbon events, or maybe even write this app in Cocoa
     assert(err == noErr);
     DisposeEventLoopTimerUPP(manageUPP);
 
-/*    windowHandlerUPP = NewEventHandlerUPP ( MyWindowEventHandler );
-    err = InstallWindowEventHandler ( p_main->p_vout->p_sys->p_window , windowHandlerUPP, GetEventTypeCount(windowEventType), &windowEventType, (void *) p_intf, NULL );
+/*
+    windowHandlerUPP = NewEventHandlerUPP ( MyWindowEventHandler );
+    err = InstallWindowEventHandler ( p_main->p_vout->p_sys->p_window , windowHandlerUPP,      GetEventTypeCount(windowEventType), &windowEventType, (void *) p_intf, NULL );
     assert(err == noErr);
     DisposeEventHandlerUPP(windowHandlerUPP);
 */
@@ -343,7 +377,6 @@ Eventually we want to use Carbon events, or maybe even write this app in Cocoa
     //UGLY Event Loop!
     EventLoop( p_intf );
 #else
-    //Our big event loop !-)
     RunApplicationEventLoop();
 #endif
     err = RemoveEventLoopTimer(p_intf->p_sys->manageTimer);
@@ -351,6 +384,37 @@ Eventually we want to use Carbon events, or maybe even write this app in Cocoa
 }
 
 
+/*****************************************************************************
+ * MakeAboutWindow: similar to MakeWindow in vout_macosx.c ; 
+ * open and set-up a Mac OS window to be used for 'about' program... 
+ * create it hidden and only show it when requested
+ *****************************************************************************/
+static int MakeAboutWindow( intf_thread_t *p_intf )
+{
+    int left = 0;
+    int top = 0;
+    int bottom = kAboutWindowHeight;
+    int right = kAboutWindowWidth;
+
+    WindowAttributes windowAttr = kWindowCloseBoxAttribute |
+                                    kWindowStandardHandlerAttribute |
+                                    kWindowInWindowMenuAttribute;
+    
+    SetRect( &p_intf->p_sys->aboutRect, left, top, right, bottom );
+    OffsetRect( &p_intf->p_sys->aboutRect, kAboutWindowOffset, kAboutWindowOffset );
+
+    CreateNewWindow( kDocumentWindowClass, windowAttr, &p_intf->p_sys->aboutRect, &p_intf->p_sys->p_aboutWindow );
+    if ( p_intf->p_sys->p_aboutWindow == nil )
+    {
+        return( 1 );
+    }
+
+    InstallStandardEventHandler(GetWindowEventTarget(p_intf->p_sys->p_aboutWindow));
+    SetWindowTitleWithCFString( p_intf->p_sys->p_aboutWindow, CFSTR("About DVD.app & VLC") );
+    
+    return( 0 );
+}
+
 
 void CarbonManageCallback ( EventLoopTimerRef inTimer, void *inUserData )
 {
@@ -421,8 +485,6 @@ void DoEvent( intf_thread_t *p_intf , EventRecord *event)
                 case inGoAway:
                     p_intf->b_die = true;
                     return;
-                    //DisposeWindow(whichWindow);
-                    //ExitToShell();
                     break;
                     
                 case inZoomIn:
@@ -450,25 +512,71 @@ void DoEvent( intf_thread_t *p_intf , EventRecord *event)
                     break;
                     
                 case updateEvt:
-                       DrawWindow((WindowRef) event->message);
-                       break;
+                        DrawWindow((WindowRef) event->message);
+                    break;
                         
                 case kHighLevelEvent:
                        AEProcessAppleEvent( event );
-                       break;
+                    break;
                
                 case diskEvt:
-                       break;
+                    break;
        }
 }
 
+//the code for playorpause and stop taken almost directly from the BeOS code
+void playorpause ( intf_thread_t *p_intf )
+{
+// pause the playback
+    if (p_intf->p_input != NULL )
+    {
+            // mute the volume if currently playing
+            if (p_main->p_vout->p_sys->playback_status == PLAYING)
+            {
+                    if (p_main->p_aout != NULL)
+                    {
+                            p_main->p_aout->vol = 0;
+                    }
+                    p_main->p_vout->p_sys->playback_status = PAUSED;
+                SetMenuItemText( GetMenuHandle(kMenuControls), kControlsPlayORPause, "\pPlay");
+            }
+            else
+            // restore the volume
+            {
+                    if (p_main->p_aout != NULL)
+                    {
+                            p_main->p_aout->vol = p_main->p_vout->p_sys->vol_val;
+                    }
+                    p_main->p_vout->p_sys->playback_status = PLAYING;
+                SetMenuItemText( GetMenuHandle(kMenuControls), kControlsPlayORPause, "\pPause");
+            }
+            //snooze(400000);
+            input_SetStatus(p_intf->p_input, INPUT_STATUS_PAUSE);
+    }
+}
+
+void stop ( intf_thread_t *p_intf )
+{
+    // this currently stops playback not nicely
+    if (p_intf->p_input != NULL )
+    {
+            // silence the sound, otherwise very horrible
+            if (p_main->p_aout != NULL)
+            {
+                    p_main->p_aout->vol = 0;
+            }
+            //snooze(400000);
+            input_SetStatus(p_intf->p_input, INPUT_STATUS_END);
+    }
+    p_main->p_vout->p_sys->playback_status = STOPPED;
+}
+
+
 void DoMenuCommand( intf_thread_t *p_intf , long menuResult)
 {
     short      menuID;         /* the resource ID of the selected menu */
     short      menuItem;       /* the item number of the selected menu */
        
-    static int vol_val;        // remember the current volume
-    static int playback_status;                // remember playback state
 
     menuID = HiWord(menuResult);    /* use macros to get item & menu number */
     menuItem = LoWord(menuResult);
@@ -479,16 +587,15 @@ void DoMenuCommand( intf_thread_t *p_intf , long menuResult)
             switch (menuItem) 
             {
                 case kAppleAbout:
-                    //Fixme
-                    SysBeep(30);
-                    //DoAboutBox();
+                    ShowWindow( p_intf->p_sys->p_aboutWindow );
+                    SelectWindow( p_intf->p_sys->p_aboutWindow );
+                    DrawAboutWindow( p_intf->p_sys->p_aboutWindow); //kludge
+                    EnableMenuItem( GetMenuHandle(kMenuFile), kFileClose);
                     break;
                     
                 case kAppleQuit:
                     p_intf->b_die = true;
-                    //hrmm...
-                    ExitToShell();
-                    return;
+                    //hrmm... don't know what is going on w/ the Quit item in the new application menu...documentation???
                     break;
                                
                 default:
@@ -500,36 +607,34 @@ void DoMenuCommand( intf_thread_t *p_intf , long menuResult)
             switch (menuItem) 
             {
                 case kFileNew:
-                    //Fixme
-                    SysBeep(30);
-                    //DoAboutBox();
+                    ShowWindow( p_main->p_vout->p_sys->p_window );
+                    SelectWindow( p_main->p_vout->p_sys->p_window );
+                    DisableMenuItem( GetMenuHandle(kMenuFile), kFileNew);
+                    EnableMenuItem( GetMenuHandle(kMenuFile), kFileClose);
+                    //hmm, can't say to play() right now because I don't know if a file is in playlist yet.
+                    //need to see if I can tell this or eve if calling play() w/o a file is bad...not sure of either
                     break;
 
                 case kFileOpen:
-                    //Fixme
-/*
-           const char **device;
-           char device_method_and_name[B_FILE_NAME_LENGTH + 4];
-           if(p_message->FindString("device", device) != B_ERROR)
-               {
-               sprintf(device_method_and_name, "dvd:%s", *device); 
-               intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, device_method_and_name );
-               }
-
-*/
-                    SysBeep(30);
-                    //DoAboutBox();
+                    playorpause( p_intf );
+                    MyOpenDocument(nil);
+                    // starts playing automatically on open? playorpause( p_intf );
                     break;
 
                 case kFileClose:
                     HideWindow( FrontWindow() );
-                    //Fixme
-                    SysBeep(30);
-                    //DoAboutBox();
+                    if ( ! IsWindowVisible( p_main->p_vout->p_sys->p_window ) && ! IsWindowVisible( p_intf->p_sys->p_aboutWindow ) )
+                    {
+                        //calling this even if no file open shouldn't be bad... not sure of opposite situation above
+                        stop( p_intf );
+                        EnableMenuItem( GetMenuHandle(kMenuFile), kFileNew);
+                        DisableMenuItem( GetMenuHandle(kMenuFile), kFileClose);
+                    }
                     break;
                     
                 case kFileQuitHack:
-                    p_intf->b_die = true;
+                        stop( p_intf );
+                        p_intf->b_die = true;
                     break;
                     
                 default:
@@ -541,44 +646,11 @@ void DoMenuCommand( intf_thread_t *p_intf , long menuResult)
             switch (menuItem) 
             {
                 case kControlsPlayORPause:
-                // pause the playback
-                    if (p_intf->p_input != NULL )
-                    {
-                            // mute the volume if currently playing
-                            if (playback_status == PLAYING)
-                            {
-                                    if (p_main->p_aout != NULL)
-                                    {
-                                            p_main->p_aout->vol = 0;
-                                    }
-                                    playback_status = PAUSED;
-                            }
-                            else
-                            // restore the volume
-                            {
-                                    if (p_main->p_aout != NULL)
-                                    {
-                                            p_main->p_aout->vol = vol_val;
-                                    }
-                                    playback_status = PLAYING;
-                            }
-                            //snooze(400000);
-                            input_SetStatus(p_intf->p_input, INPUT_STATUS_PAUSE);
-                    }
+                        playorpause( p_intf );
                     break;
 
                 case kControlsStop:
-                // this currently stops playback not nicely
-                    if (p_intf->p_input != NULL )
-                    {
-                            // silence the sound, otherwise very horrible
-                            if (p_main->p_aout != NULL)
-                            {
-                                    p_main->p_aout->vol = 0;
-                            }
-                            //snooze(400000);
-                            input_SetStatus(p_intf->p_input, INPUT_STATUS_END);
-                    }
+                        stop( p_intf );
                     break;
 
                 case kControlsForward:
@@ -653,12 +725,12 @@ void DoMenuCommand( intf_thread_t *p_intf , long menuResult)
                                     if (p_main->p_aout->vol == 0)
                                     {
                                             //p_vol->SetEnabled(true);
-                                            p_main->p_aout->vol = vol_val;
+                                            p_main->p_aout->vol = p_main->p_vout->p_sys->vol_val;
                                     }  
                                     else
                                     {
                                             //p_vol->SetEnabled(false);
-                                            vol_val = p_main->p_aout->vol;
+                                            p_main->p_vout->p_sys->vol_val = p_main->p_aout->vol;
                                             p_main->p_aout->vol = 0;
                                     }
                             }
@@ -682,19 +754,31 @@ void DoMenuCommand( intf_thread_t *p_intf , long menuResult)
 
 void DrawWindow(WindowRef window)
 {
-    Rect               tempRect;
-    GrafPtr            curPort;
-       
-    GetPort(&curPort);
+    Rect tempRect;
+    GrafPtr previousPort;
+    
+    GetPort(&previousPort);
     SetPort(GetWindowPort(window));
     BeginUpdate(window);
     EraseRect(GetWindowPortBounds(window, &tempRect));
     DrawControls(window);
     DrawGrowIcon(window);
     EndUpdate(window);
-    SetPort(curPort);
+    SetPort(previousPort);
 }
 
+void DrawAboutWindow(WindowRef window)
+{
+    GrafPtr previousPort;
+
+    GetPort(&previousPort);
+    SetPort(GetWindowPort(window));
+    
+    MoveTo(10,30);
+    DrawString("\phttp://www.videolan.org");
+
+    SetPort(previousPort);
+}
 
 #else
 
@@ -785,4 +869,111 @@ static pascal OSStatus MyEventHandler(EventHandlerCallRef myHandler, EventRef ev
     }
     return result;
 }
-#endif
\ No newline at end of file
+#endif
+
+//FIXME Adding this has introduced or surfaced a lot of bugs...
+//comented out a lot of things to strip this down to make this a 'quicky'
+OSErr MyOpenDocument(const FSSpecPtr defaultLocationfssPtr)
+{
+    NavDialogOptions    dialogOptions;
+//    AEDesc              defaultLocation;
+//    NavEventUPP         eventProc = NewNavEventProc(myEventProc);
+//    NavObjectFilterUPP  filterProc = 
+//                        NewNavObjectFilterProc(myFilterProc);
+    OSErr               anErr = noErr;
+    
+    //  Specify default options for dialog box
+    anErr = NavGetDefaultDialogOptions(&dialogOptions);
+    if (anErr == noErr)
+    {
+        //  Adjust the options to fit our needs
+        //  Set default location option
+//        dialogOptions.dialogOptionFlags |= kNavSelectDefaultLocation;
+        //  Clear preview option
+        dialogOptions.dialogOptionFlags ^= kNavAllowPreviews;
+        
+        // make descriptor for default location
+//        anErr = AECreateDesc(typeFSS, defaultLocationfssPtr,
+//                             sizeof(*defaultLocationfssPtr),
+//                             &defaultLocation );
+        if (anErr == noErr)
+        {
+            // Get 'open' resource. A nil handle being returned is OK,
+            // this simply means no automatic file filtering.
+            NavTypeListHandle typeList = (NavTypeListHandle)GetResource(
+                                        'open', 128);
+            NavReplyRecord reply;
+            
+            // Call NavGetFile() with specified options and
+            // declare our app-defined functions and type list
+//            anErr = NavGetFile (&defaultLocation, &reply, &dialogOptions,
+            anErr = NavGetFile (nil, &reply, &dialogOptions,
+//                                eventProc, nil, filterProc,
+                                nil, nil, nil,
+                                typeList, nil);
+            if (anErr == noErr && reply.validRecord)
+            {
+                //  Deal with multiple file selection
+                long    count;
+                
+                anErr = AECountItems(&(reply.selection), &count);
+                // Set up index for file list
+                if (anErr == noErr)
+                {
+                    long index;
+                    
+                    for (index = 1; index <= count; index++)
+                    {
+                        AEKeyword   theKeyword;
+                        DescType    actualType;
+                        Size        actualSize;
+                        FSSpec      documentFSSpec;
+                        
+                        // Get a pointer to selected file
+                        anErr = AEGetNthPtr(&(reply.selection), index,
+                                            typeFSS, &theKeyword,
+                                            &actualType,&documentFSSpec,
+                                            sizeof(documentFSSpec),
+                                            &actualSize);
+                        if (anErr == noErr)
+                        {
+//                            anErr = DoOpenFile(&documentFSSpec);
+//HERE
+                            FSRef newRef;
+                            char path[MAXPATHLEN];
+                            
+                            //make an FSRef out of an FSSpec
+                            anErr = FSpMakeFSRef( &documentFSSpec, &newRef);
+                            if (anErr != noErr)
+                            {
+                                return(anErr);
+                            }
+                            //make a path out of the FSRef
+                            anErr = FSRefMakePath( &newRef, path, MAXPATHLEN);
+                            if (anErr != noErr)
+                            {
+                                return(anErr);
+                            }
+                            
+                            //else, ok...add it to playlist!
+                            intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, path );
+
+                            
+                        }
+                    }
+                }
+                //  Dispose of NavReplyRecord, resources, descriptors
+                anErr = NavDisposeReply(&reply);
+            }
+            if (typeList != NULL)
+            {
+                ReleaseResource( (Handle)typeList);
+            }
+            //(void) AEDisposeDesc(&defaultLocation);
+        }
+    }
+//    DisposeRoutineDescriptor(eventProc);
+//    DisposeRoutineDescriptor(filterProc);
+    return anErr;
+}
+
diff --git a/plugins/macosx/macosx_common.h b/plugins/macosx/macosx_common.h
new file mode 100755 (executable)
index 0000000..a3a4c05
--- /dev/null
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * macosx.c : MacOS X plugin for vlc
+ *****************************************************************************
+ * Copyright (C) 2001 VideoLAN
+ * $$
+ *
+ * Authors: Colin Delacroix <colin@zoy.org>
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Constants & more
+ *****************************************************************************/
+
+#ifndef __CARBONPREFIX__
+    #define __CARBONPREFIX__
+
+    // Needed for carbonization
+    #define TARGET_API_MAC_CARBON 1
+
+    // For the pascal to C or C to pascal string conversions in carbon
+    #define OLDP2C 1
+#endif
+
+#include <Carbon/Carbon.h>
+
+
+#define PLAYING                0
+#define PAUSED         1
+#define STOPPED                2
+
+
+/*****************************************************************************
+ * Type declarations that unfortunately need to be known to both
+ * ...
+ * Kind of a hack due to the fact that on Mac OS, there is little difference 
+ * between the interface and the video output, and hence little separation
+ * between those elements.
+ *****************************************************************************/
+
+/*****************************************************************************
+ * vout_sys_t: MacOS X video output method descriptor
+ *****************************************************************************
+ * This structure is part of the video output thread descriptor.
+ * It describes the MacOS X specific properties of an output thread.
+ *****************************************************************************/
+typedef struct vout_sys_s
+{
+    Rect       wrect;
+    WindowRef  p_window;
+    short gwLocOffscreen;
+    GWorldPtr p_gw[ 2 ];
+    Boolean gNewNewGWorld;      /* can we allocate in VRAm or AGP memory ? */
+    
+    GDHandle  theGDList;
+    Ptr                                theBase;
+    int                                theRow;
+    int                                theDepth;
+
+    int playback_status;               // remember playback state
+    int vol_val;       // remember the current volume
+} vout_sys_t;
index 1809d4158db502102cfdc9340c394b4310538746..7690712af18173954f0c0248348ce5f9da7ea9ce 100644 (file)
@@ -3,7 +3,7 @@
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
  *
- * Authors: 
+ * Authors: Colin Delacroix <colin@zoy.org>
  *
  * 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
 #include "mtime.h"
 #include "tests.h"
 
-#include "video.h"
-#include "video_output.h"
-
 #include "intf_msg.h"
 
-#include "main.h"
+#include "video.h"
+#include "video_output.h"
 
 #include "modules.h"
+#include "main.h"
 
-#ifndef __CARBONPREFIX__
-    #define __CARBONPREFIX__
+#include "macosx_common.h"
 
-    // Needed for carbonization
-    #define TARGET_API_MAC_CARBON 1
 
-    // For the pascal to C or C to pascal string conversions in carbon
-    #define OLDP2C 1
-#endif
-
-#include <Carbon/Carbon.h>
+/*****************************************************************************
+ * Constants & more
+ *****************************************************************************/
 
 // Initial Window Constants
 enum
@@ -74,32 +68,6 @@ enum
     kInSystem
 };
 
-/*****************************************************************************
- * vout_sys_t: MacOS X video output method descriptor
- *****************************************************************************
- * This structure is part of the video output thread descriptor.
- * It describes the MacOS X specific properties of an output thread.
- *****************************************************************************/
-typedef struct vout_sys_s
-{
-    /* MacOS X video memory */
-    byte_t *                    p_video;                      /* base adress */
-    size_t                      i_page_size;                    /* page size */
-    
-    Rect       wrect;
-    WindowRef  p_window;
-    short gwLocOffscreen;
-    GWorldPtr p_gw[ 2 ];
-    Boolean gNewNewGWorld;      /* can we allocate in VRAm or AGP memory ? */
-    
-    // Boolean gDone;
-    // SInt32 gSleepTime;
-    
-    GDHandle  theGDList;
-    Ptr                                theBase;
-    int                                theRow;
-    int                                theDepth;
-} vout_sys_t;
 
 /*****************************************************************************
  * Local prototypes
@@ -174,8 +142,6 @@ static int vout_Create( vout_thread_t *p_vout )
     p_vout->p_sys->p_window       = NULL;
     p_vout->p_sys->p_gw[ 0 ]      = NULL;
     p_vout->p_sys->p_gw[ 1 ]      = NULL;
-    p_vout->p_sys->i_page_size    = p_vout->i_width * p_vout->i_height
-                                  * p_vout->i_bytes_per_pixel;
     
     if ( CreateDisplay( p_vout ) )
     {
@@ -189,22 +155,6 @@ static int vout_Create( vout_thread_t *p_vout )
     intf_ErrMsg( "vout p_vout->i_height %d" , p_vout->i_height);
     intf_ErrMsg( "vout p_vout->i_bytes_per_pixel %d" , p_vout->i_bytes_per_pixel);
     intf_ErrMsg( "vout p_vout->i_screen_depth %d" , p_vout->i_screen_depth);
-    intf_ErrMsg( "vout p_vout->p_sys->i_page_size %d" , p_vout->p_sys->i_page_size);
-#endif
-
-#if 0
-    /* Map two framebuffers a the very beginning of the fb */
-    p_vout->p_sys->p_video = malloc( 2 * p_vout->p_sys->i_page_size );
-    if( p_vout->p_sys->p_video == NULL )
-    {
-        intf_ErrMsg( "vout error: can't map video memory (%s)",
-                     strerror(errno) );
-        free( p_vout->p_sys );
-        return( 1 );
-    }
-    /* Set and initialize buffers */
-    vout_SetBuffers( p_vout, p_vout->p_sys->p_video,
-                    p_vout->p_sys->p_video + p_vout->p_sys->i_page_size );
 #endif
 
     return( 0 );
@@ -237,9 +187,7 @@ void FindBestMemoryLocation( vout_thread_t *p_vout )
 #if 0
         p_vout->i_screen_depth = wPixDepth;
         p_vout->i_bytes_per_pixel = wPixDepth;
-        p_vout->i_bytes_per_line   = p_vout->i_width * p_vout->i_bytes_per_pixel;
-        p_vout->p_sys->i_page_size = p_vout->i_width * p_vout->i_height * p_vout->i_bytes_per_pixel;
-//p_vout->i_bytes_per_line = (**(**hgdWindow).gdPMap).rowBytes & 0x3FFF ;
+        p_vout->i_bytes_per_line = (**(**hgdWindow).gdPMap).rowBytes & 0x3FFF ;
 #endif
         if(    ( noErr == NewGWorld( &pgwTest, wPixDepth, &rectTest, NULL, hgdWindow,
                                      noNewDevice | useDistantHdwrMem ) ) 
@@ -322,6 +270,7 @@ static int MakeWindow( vout_thread_t *p_vout )
     int top = 0;
     int bottom = p_vout->i_height;
     int right = p_vout->i_width;
+    ProcessSerialNumber PSN;
 
     WindowAttributes windowAttr = kWindowStandardDocumentAttributes | 
                                     kWindowStandardHandlerAttribute |
@@ -339,16 +288,18 @@ static int MakeWindow( vout_thread_t *p_vout )
     InstallStandardEventHandler(GetWindowEventTarget(p_vout->p_sys->p_window));
     SetPort( GetWindowPort( p_vout->p_sys->p_window ) );
     SetWindowTitleWithCFString( p_vout->p_sys->p_window, CFSTR("VLC") );
-//    ShowWindow( p_vout->p_sys->p_window );
-    TransitionWindow( p_vout->p_sys->p_window, kWindowZoomTransitionEffect, kWindowShowTransitionAction, NULL);
-    BringToFront(  p_vout->p_sys->p_window );
+    ShowWindow( p_vout->p_sys->p_window );
+    SelectWindow( p_vout->p_sys->p_window );
+
+    //in case we are run from the command line, bring us to front instead of Terminal
+    GetCurrentProcess(&PSN);
+    SetFrontProcess(&PSN);
 
 {
     short wPixDepth = (**(GetPortPixMap( GetWindowPort( p_vout->p_sys->p_window ) ))).pixelSize;
     p_vout->i_screen_depth = wPixDepth;
     p_vout->i_bytes_per_pixel = p_vout->i_screen_depth / 8;
     p_vout->i_bytes_per_line   = p_vout->i_width * p_vout->i_bytes_per_pixel;
-    p_vout->p_sys->i_page_size = p_vout->i_width * p_vout->i_height * p_vout->i_bytes_per_pixel;
 
     p_vout->i_bytes_per_line = (**(**GetWindowDevice( p_vout )).gdPMap).rowBytes & 0x3FFF ;
 
@@ -369,6 +320,7 @@ static int MakeWindow( vout_thread_t *p_vout )
         default:
             break;
     }
+}
 
 #if 0
     p_vout->i_red_lshift = 0x10;
@@ -383,7 +335,6 @@ static int MakeWindow( vout_thread_t *p_vout )
     p_vout->i_gray_pixel = 0x808080;
     p_vout->i_blue_pixel = 0x32;
 #endif
-}
 
     return( 0 );
 }
@@ -459,18 +410,13 @@ static void vout_Destroy( vout_thread_t *p_vout )
 {
     //intf_ErrMsg( "vout_Destroy()" );
 
-//FIXME KLUDGE to lock pixels
-#if 1
-{
+//FIXME Big Lock around Gworlds
     PixMapHandle hPixmap0, hPixmap1;
     hPixmap0 = GetGWorldPixMap( p_vout->p_sys->p_gw[0] );
     hPixmap1 = GetGWorldPixMap( p_vout->p_sys->p_gw[1] );
     UnlockPixels(hPixmap0);
     UnlockPixels(hPixmap1);
-}
-#endif
 
-#if 1
     if ( p_vout->p_sys->p_gw[0] )
     {
         DisposeGWorld( p_vout->p_sys->p_gw[0] );
@@ -483,8 +429,7 @@ static void vout_Destroy( vout_thread_t *p_vout )
     {
         DisposeWindow( p_vout->p_sys->p_window );
     }
-#endif
-    free( p_vout->p_sys->p_video );
+
     free( p_vout->p_sys );
 }
 
@@ -510,7 +455,8 @@ static void vout_Display( vout_thread_t *p_vout )
 {
 //    intf_ErrMsg( "vout_Display()" );
 
-    BlitToWindow ( p_vout, p_vout->i_buffer_index );
+    if ( p_vout->p_sys->playback_status != PAUSED &&  p_vout->p_sys->playback_status != STOPPED )
+        BlitToWindow ( p_vout, p_vout->i_buffer_index );
 }
 
 
@@ -562,9 +508,17 @@ void BlitToWindow( vout_thread_t *p_vout, short index )
 //FIXME have global lock - kinda bad but oh well 
 //    if ( LockPixels( GetGWorldPixMap( p_vout->p_sys->p_gw[index] ) ) )
 //    {
+
+//LockPortBits(GetWindowPort( p_vout->p_sys->p_window ));
+//NoPurgePixels( GetGWorldPixMap( p_vout->p_sys->p_gw[index] ) );
+
         CopyBits( GetPortBitMapForCopyBits( p_vout->p_sys->p_gw[index] ), 
                     GetPortBitMapForCopyBits( GetWindowPort( p_vout->p_sys->p_window ) ), 
                     &rectSource, &rectDest, srcCopy, NULL);
+
+//UnlockPortBits(GetWindowPort( p_vout->p_sys->p_window ));
+//AllowPurgePixels( GetGWorldPixMap( p_vout->p_sys->p_gw[index] ) );
+
 //        UnlockPixels( GetGWorldPixMap( p_vout->p_sys->p_gw[index] ) );
         //flushQD( p_vout );
 //    }
index 4c467d8f55683e98e7a16c077c06cc329bcad19f..25af10772be7f57f4d7086b4b1927b99731c65bd 100644 (file)
@@ -2,7 +2,7 @@
  * modules.c : Built-in and dynamic modules management functions
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: modules.c,v 1.20 2001/04/06 18:18:10 massiot Exp $
+ * $Id: modules.c,v 1.21 2001/04/11 13:30:30 ej Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Ethan C. Baldridge <BaldridgeE@cadmus.com>
@@ -122,10 +122,8 @@ void module_InitBank( module_bank_t * p_bank )
     {
         once = 1;
         strncpy( app_path, p_main->ppsz_argv[ 0 ], i_pathlen );
-        intf_ErrMsg( "%s", p_main->ppsz_argv[ 0 ] );
         strcat( app_path, "lib" );
         path[ 3 ] = app_path ;
-        intf_ErrMsg( "%s", path[ 3 ] );
     }
 #endif
 
index bbc552552314cb15d01e5df7403fcab6ba3b6099..b575d5a6ceaf6956b57eb995a48f465a828cccfd 100644 (file)
@@ -2,7 +2,7 @@
  * video_text.c : text manipulation functions
  *****************************************************************************
  * Copyright (C) 1999, 2000 VideoLAN
- * $Id: video_text.c,v 1.21 2001/04/06 18:18:10 massiot Exp $
+ * $Id: video_text.c,v 1.22 2001/04/11 13:30:30 ej Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -43,7 +43,6 @@
 #include "video_text.h"
 
 #ifdef SYS_DARWIN1_3
-// #include <CFBundle.h>
 #include <sys/param.h>                                    /* for MAXPATHLEN */
 #include "main.h"
 extern main_t *p_main;
@@ -229,7 +228,6 @@ vout_font_t *vout_LoadFont( const char *psz_name )
     static char         app_path[ MAXPATHLEN ];
     /* HACK TO CUT OUT trailing 'vlc' */
     int                 i_pathlen = strlen( p_main->ppsz_argv[ 0 ] ) - 3;
-    // CFBundleRef         mainBundle;
 #endif
     int                 i_char, i_line;        /* character and line indexes */
     int                 i_file = -1;                          /* source file */
@@ -237,17 +235,12 @@ vout_font_t *vout_LoadFont( const char *psz_name )
     vout_font_t *       p_font;                           /* the font itself */
 
 #ifdef SYS_DARWIN1_3
-    // Get the main bundle for the app
-    // mainBundle = CFBundleGetMainBundle();
-
     if( !once )
     {
-       once = 1;
+        once = 1;
         strncpy( app_path, p_main->ppsz_argv[ 0 ], i_pathlen );
-        intf_ErrMsg( "%s", p_main->ppsz_argv[ 0 ] );
         strcat( app_path, "share" );
         path[ 2 ] = app_path ;
-        intf_ErrMsg( "%s", path[ 2 ] );
     }
 #endif