Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
49173f5e
Commit
49173f5e
authored
Feb 01, 2003
by
Stephan Assmus
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Changes done since Feb 28 2003:
parent
46e7a04e
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
1621 additions
and
591 deletions
+1621
-591
modules/gui/beos/Interface.cpp
modules/gui/beos/Interface.cpp
+3
-5
modules/gui/beos/InterfaceWindow.cpp
modules/gui/beos/InterfaceWindow.cpp
+499
-259
modules/gui/beos/InterfaceWindow.h
modules/gui/beos/InterfaceWindow.h
+20
-6
modules/gui/beos/ListViews.cpp
modules/gui/beos/ListViews.cpp
+456
-154
modules/gui/beos/ListViews.h
modules/gui/beos/ListViews.h
+28
-4
modules/gui/beos/MediaControlView.cpp
modules/gui/beos/MediaControlView.cpp
+7
-5
modules/gui/beos/MessagesWindow.cpp
modules/gui/beos/MessagesWindow.cpp
+14
-12
modules/gui/beos/PlayListWindow.cpp
modules/gui/beos/PlayListWindow.cpp
+82
-41
modules/gui/beos/PlayListWindow.h
modules/gui/beos/PlayListWindow.h
+15
-4
modules/gui/beos/VideoOutput.cpp
modules/gui/beos/VideoOutput.cpp
+246
-61
modules/gui/beos/VideoWindow.h
modules/gui/beos/VideoWindow.h
+60
-6
modules/gui/beos/VlcWrapper.cpp
modules/gui/beos/VlcWrapper.cpp
+172
-31
modules/gui/beos/VlcWrapper.h
modules/gui/beos/VlcWrapper.h
+19
-3
No files found.
modules/gui/beos/Interface.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* intf_beos.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: Interface.cpp,v 1.
8 2003/01/25 20:15:41 titer
Exp $
* $Id: Interface.cpp,v 1.
9 2003/02/01 12:01:10 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
...
...
@@ -70,14 +70,12 @@ int E_(OpenIntf) ( vlc_object_t *p_this )
p_intf
->
pf_run
=
Run
;
/* Create the interface window */
BScreen
*
screen
;
screen
=
new
BScreen
();
BRect
rect
=
screen
->
Frame
();
BScreen
screen
(
B_MAIN_SCREEN_ID
);
BRect
rect
=
screen
.
Frame
();
rect
.
top
=
rect
.
bottom
-
100
;
rect
.
bottom
-=
50
;
rect
.
left
+=
50
;
rect
.
right
=
rect
.
left
+
350
;
delete
screen
;
p_intf
->
p_sys
->
p_window
=
new
InterfaceWindow
(
rect
,
VOUT_TITLE
" (BeOS interface)"
,
p_intf
);
...
...
modules/gui/beos/InterfaceWindow.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* InterfaceWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.cpp,v 1.2
5 2003/01/31 06:45:00 titer
Exp $
* $Id: InterfaceWindow.cpp,v 1.2
6 2003/02/01 12:01:10 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
...
...
@@ -52,30 +52,106 @@
#include "InterfaceWindow.h"
#define INTERFACE_UPDATE_TIMEOUT 80000 // 2 frames if at 25 fps
#define INTERFACE_LOCKING_TIMEOUT 5000
// make_sure_frame_is_on_screen
bool
make_sure_frame_is_on_screen
(
BRect
&
frame
)
{
BScreen
screen
(
B_MAIN_SCREEN_ID
);
if
(
frame
.
IsValid
()
&&
screen
.
IsValid
())
{
if
(
!
screen
.
Frame
().
Contains
(
frame
))
{
// make sure frame fits in the screen
if
(
frame
.
Width
()
>
screen
.
Frame
().
Width
())
frame
.
right
-=
frame
.
Width
()
-
screen
.
Frame
().
Width
()
+
10.0
;
if
(
frame
.
Height
()
>
screen
.
Frame
().
Height
())
frame
.
bottom
-=
frame
.
Height
()
-
screen
.
Frame
().
Height
()
+
30.0
;
// frame is now at the most the size of the screen
if
(
frame
.
right
>
screen
.
Frame
().
right
)
frame
.
OffsetBy
(
-
(
frame
.
right
-
screen
.
Frame
().
right
),
0.0
);
if
(
frame
.
bottom
>
screen
.
Frame
().
bottom
)
frame
.
OffsetBy
(
0.0
,
-
(
frame
.
bottom
-
screen
.
Frame
().
bottom
));
if
(
frame
.
left
<
screen
.
Frame
().
left
)
frame
.
OffsetBy
((
screen
.
Frame
().
left
-
frame
.
left
),
0.0
);
if
(
frame
.
top
<
screen
.
Frame
().
top
)
frame
.
OffsetBy
(
0.0
,
(
screen
.
Frame
().
top
-
frame
.
top
));
}
return
true
;
}
return
false
;
}
// make_sure_frame_is_within_limits
void
make_sure_frame_is_within_limits
(
BRect
&
frame
,
float
minWidth
,
float
minHeight
,
float
maxWidth
,
float
maxHeight
)
{
if
(
frame
.
Width
()
<
minWidth
)
frame
.
right
=
frame
.
left
+
minWidth
;
if
(
frame
.
Height
()
<
minHeight
)
frame
.
bottom
=
frame
.
top
+
minHeight
;
if
(
frame
.
Width
()
>
maxWidth
)
frame
.
right
=
frame
.
left
+
maxWidth
;
if
(
frame
.
Height
()
>
maxHeight
)
frame
.
bottom
=
frame
.
top
+
maxHeight
;
}
// get_volume_info
bool
get_volume_info
(
BVolume
&
volume
,
BString
&
volumeName
,
bool
&
isCDROM
,
BString
&
deviceName
)
{
bool
success
=
false
;
isCDROM
=
false
;
deviceName
=
""
;
volumeName
=
""
;
char
name
[
B_FILE_NAME_LENGTH
];
if
(
volume
.
GetName
(
name
)
>=
B_OK
)
// disk is currently mounted
{
volumeName
=
name
;
dev_t
dev
=
volume
.
Device
();
fs_info
info
;
if
(
fs_stat_dev
(
dev
,
&
info
)
==
B_OK
)
{
success
=
true
;
deviceName
=
info
.
device_name
;
if
(
volume
.
IsReadOnly
()
)
{
int
i_dev
=
open
(
info
.
device_name
,
O_RDONLY
);
if
(
i_dev
>=
0
)
{
device_geometry
g
;
if
(
ioctl
(
i_dev
,
B_GET_GEOMETRY
,
&
g
,
sizeof
(
g
)
)
>=
0
)
isCDROM
=
(
g
.
device_type
==
B_CD
);
close
(
i_dev
);
}
}
}
}
return
success
;
}
/*****************************************************************************
* InterfaceWindow
*****************************************************************************/
InterfaceWindow
::
InterfaceWindow
(
BRect
frame
,
const
char
*
name
,
intf_thread_t
*
p_interface
)
InterfaceWindow
::
InterfaceWindow
(
BRect
frame
,
const
char
*
name
,
intf_thread_t
*
p_interface
)
:
BWindow
(
frame
,
name
,
B_TITLED_WINDOW_LOOK
,
B_NORMAL_WINDOW_FEEL
,
B_NOT_ZOOMABLE
|
B_WILL_ACCEPT_FIRST_CLICK
|
B_ASYNCHRONOUS_CONTROLS
),
p_intf
(
p_interface
),
fFilePanel
(
NULL
),
fSubtitlesPanel
(
NULL
),
fLastUpdateTime
(
system_time
()
)
fLastUpdateTime
(
system_time
()
),
fSettings
(
new
BMessage
(
'
sett
'
)
),
p_wrapper
(
p_intf
->
p_sys
->
p_wrapper
)
{
p_intf
=
p_interface
;
p_wrapper
=
p_intf
->
p_sys
->
p_wrapper
;
// TODO: ?!? what about user settings?
p_intf
->
p_sys
->
b_dvdmenus
=
false
;
fPlaylistIsEmpty
=
!
(
p_wrapper
->
PlaylistSize
()
>
0
);
BScreen
*
p_screen
=
new
BScreen
();
BRect
screen_rect
=
p_screen
->
Frame
();
delete
p_screen
;
BScreen
screen
;
BRect
screen_rect
=
screen
.
Frame
();
BRect
window_rect
;
window_rect
.
Set
(
(
screen_rect
.
right
-
PREFS_WINDOW_WIDTH
)
/
2
,
(
screen_rect
.
bottom
-
PREFS_WINDOW_HEIGHT
)
/
2
,
...
...
@@ -129,7 +205,7 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name,
fileMenu
->
AddItem
(
new
CDMenu
(
"Open Disc"
)
);
fileMenu
->
AddItem
(
new
BMenuItem
(
"
Load a subtitle file
"
B_UTF8_ELLIPSIS
,
fileMenu
->
AddItem
(
new
BMenuItem
(
"
Open Subtitles
"
B_UTF8_ELLIPSIS
,
new
BMessage
(
LOAD_SUBFILE
)
)
);
fileMenu
->
AddSeparatorItem
();
...
...
@@ -176,7 +252,7 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name,
fMenuBar
->
AddItem
(
fSpeedMenu
);
/* Add the Show menu */
fShowMenu
=
new
BMenu
(
"
Sh
ow"
);
fShowMenu
=
new
BMenu
(
"
Wind
ow"
);
fShowMenu
->
AddItem
(
new
BMenuItem
(
"Play List"
B_UTF8_ELLIPSIS
,
new
BMessage
(
OPEN_PLAYLIST
),
'P'
)
);
fShowMenu
->
AddItem
(
new
BMenuItem
(
"Messages"
B_UTF8_ELLIPSIS
,
...
...
@@ -188,56 +264,106 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name,
/* Prepare fow showing */
_SetMenusEnabled
(
false
);
p_mediaControl
->
SetEnabled
(
false
);
_RestoreSettings
();
/* Restore interface settings */
/* // Restore interface settings
// main window size and position
int i_width = config_GetInt( p_intf, "beos-intf-width" ),
i_height = config_GetInt( p_intf, "beos-intf-height" ),
i_xpos = config_GetInt( p_intf, "beos-intf-xpos" ),
i_ypos = config_GetInt( p_intf, "beos-intf-ypos" );
if
(
i_width
&&
i_height
&&
i_xpos
&&
i_ypos
)
if( i_width
> 20 && i_height > 20 && i_xpos >= 0 && i_ypos >= 0
)
{
/* main window size and position */
ResizeTo
(
i_width
,
i_height
);
MoveTo
(
i_xpos
,
i_ypos
);
BRect r( i_xpos, i_ypos, i_xpos + i_width, i_ypos + i_height );
float minWidth, maxWidth, minHeight, maxHeight;
GetSizeLimits( &minWidth, &maxWidth, &minHeight, &maxHeight );
make_sure_frame_is_within_limits( r, minWidth, minHeight, maxWidth, maxHeight );
if ( make_sure_frame_is_on_screen( r ) )
{
ResizeTo( r.Width(), r.Height() );
MoveTo( r.LeftTop() );
}
}
// playlist window size and position
i_width = config_GetInt( p_intf, "beos-playlist-width" ),
i_height = config_GetInt( p_intf, "beos-playlist-height" ),
i_xpos = config_GetInt( p_intf, "beos-playlist-xpos" ),
i_ypos = config_GetInt( p_intf, "beos-playlist-ypos" );
if
(
i_width
&&
i_height
&&
i_xpos
&&
i_ypos
)
if( i_width
> 20 && i_height > 20 && i_xpos >= 0 && i_ypos >= 0
)
{
/* playlist window size and position */
fPlaylistWindow
->
ResizeTo
(
i_width
,
i_height
);
fPlaylistWindow
->
MoveTo
(
i_xpos
,
i_ypos
);
BRect r( i_xpos, i_ypos, i_xpos + i_width, i_ypos + i_height );
float minWidth, maxWidth, minHeight, maxHeight;
fPlaylistWindow->GetSizeLimits( &minWidth, &maxWidth, &minHeight, &maxHeight );
make_sure_frame_is_within_limits( r, minWidth, minHeight, maxWidth, maxHeight );
if ( make_sure_frame_is_on_screen( r ) )
{
fPlaylistWindow->ResizeTo( r.Width(), r.Height() );
fPlaylistWindow->MoveTo( r.LeftTop() );
}
}
// child windows are not running yet, that's why we aint locking them
// playlist showing
// messages window size and position
i_width = config_GetInt( p_intf, "beos-messages-width" ),
i_height = config_GetInt( p_intf, "beos-messages-height" ),
i_xpos = config_GetInt( p_intf, "beos-messages-xpos" ),
i_ypos = config_GetInt( p_intf, "beos-messages-ypos" );
if( i_width && i_height && i_xpos && i_ypos )
{
/* messages window size and position */
fMessagesWindow
->
ResizeTo
(
i_width
,
i_height
);
fMessagesWindow
->
MoveTo
(
i_xpos
,
i_ypos
);
BRect r( i_xpos, i_ypos, i_xpos + i_width, i_ypos + i_height );
float minWidth, maxWidth, minHeight, maxHeight;
fMessagesWindow->GetSizeLimits( &minWidth, &maxWidth, &minHeight, &maxHeight );
make_sure_frame_is_within_limits( r, minWidth, minHeight, maxWidth, maxHeight );
if ( make_sure_frame_is_on_screen( r ) )
{
fMessagesWindow->ResizeTo( r.Width(), r.Height() );
fMessagesWindow->MoveTo( r.LeftTop() );
}
}
if( config_GetInt( p_intf, "beos-playlist-show" ) )
{
/* playlist showing */
if
(
fPlaylistWindow
->
Lock
()
)
{
fPlaylistWindow
->
Show
();
fPlaylistWindow
->
Unlock
();
}
fPlaylistWindow->Show();
}
else
{
fPlaylistWindow->Hide();
fPlaylistWindow->Show();
}
// messages window size and position
i_width = config_GetInt( p_intf, "beos-messages-width" ),
i_height = config_GetInt( p_intf, "beos-messages-height" ),
i_xpos = config_GetInt( p_intf, "beos-messages-xpos" ),
i_ypos = config_GetInt( p_intf, "beos-messages-ypos" );
if( i_width > 20 && i_height > 20 && i_xpos >= 0 && i_ypos >= 0 )
{
BRect r( i_xpos, i_ypos, i_xpos + i_width, i_ypos + i_height );
float minWidth, maxWidth, minHeight, maxHeight;
fMessagesWindow->GetSizeLimits( &minWidth, &maxWidth, &minHeight, &maxHeight );
make_sure_frame_is_within_limits( r, minWidth, minHeight, maxWidth, maxHeight );
if ( make_sure_frame_is_on_screen( r ) )
{
fMessagesWindow->ResizeTo( r.Width(), r.Height() );
fMessagesWindow->MoveTo( r.LeftTop() );
}
}
// messages showing
if( config_GetInt( p_intf, "beos-messages-show" ) )
{
/* messages showing */
if
(
fMessagesWindow
->
Lock
()
)
{
fMessagesWindow
->
Show
();
fMessagesWindow
->
Unlock
();
}
fMessagesWindow->Show();
}
else
{
fMessagesWindow->Hide();
fMessagesWindow->Show();
}*/
Show
();
}
...
...
@@ -246,8 +372,12 @@ InterfaceWindow::~InterfaceWindow()
{
if
(
fPlaylistWindow
)
fPlaylistWindow
->
ReallyQuit
();
fPlaylistWindow
=
NULL
;
if
(
fMessagesWindow
)
fMessagesWindow
->
ReallyQuit
();
fMessagesWindow
=
NULL
;
delete
fFilePanel
;
delete
fSettings
;
}
/*****************************************************************************
...
...
@@ -285,16 +415,13 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
break
;
case
OPEN_FILE
:
if
(
fFilePanel
)
{
fFilePanel
->
Show
();
break
;
}
fFilePanel
=
new
BFilePanel
();
fFilePanel
->
SetTarget
(
this
);
fFilePanel
->
Show
();
_ShowFilePanel
(
B_REFS_RECEIVED
,
"VideoLAN Client: Open Media Files"
);
break
;
case
LOAD_SUBFILE
:
_ShowFilePanel
(
SUBFILE_RECEIVED
,
"VideoLAN Client: Open Subtitle File"
);
break
;
case
OPEN_PLAYLIST
:
if
(
fPlaylistWindow
->
Lock
())
{
...
...
@@ -318,18 +445,6 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
}
break
;
case
LOAD_SUBFILE
:
if
(
fSubtitlesPanel
)
{
fSubtitlesPanel
->
Show
();
break
;
}
fSubtitlesPanel
=
new
BFilePanel
();
fSubtitlesPanel
->
SetTarget
(
this
);
fSubtitlesPanel
->
SetMessage
(
new
BMessage
(
SUBFILE_RECEIVED
)
);
fSubtitlesPanel
->
Show
();
break
;
case
SUBFILE_RECEIVED
:
{
entry_ref
ref
;
...
...
@@ -337,7 +452,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
{
BPath
path
(
&
ref
);
if
(
path
.
InitCheck
()
==
B_OK
)
p_wrapper
->
LoadSubFile
(
(
char
*
)
path
.
Path
()
);
p_wrapper
->
LoadSubFile
(
path
.
Path
()
);
}
break
;
}
...
...
@@ -346,7 +461,6 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
// this currently stops playback not nicely
if
(
playback_status
>
UNDEF_S
)
{
snooze
(
400000
);
p_wrapper
->
PlaylistStop
();
p_mediaControl
->
SetStatus
(
NOT_STARTED_S
,
DEFAULT_RATE
);
}
...
...
@@ -512,73 +626,73 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
if
(
path
.
InitCheck
()
==
B_OK
)
{
bool
add
=
true
;
// has the user dropped a
dvd disk icon
?
// has the user dropped a
folder
?
BDirectory
dir
(
&
ref
);
if
(
dir
.
InitCheck
()
==
B_OK
&&
dir
.
IsRootDirectory
()
)
if
(
dir
.
InitCheck
()
==
B_OK
)
{
BVolumeRoster
volRoster
;
BVolume
vol
;
BDirectory
volumeRoot
;
status_t
status
=
volRoster
.
GetNextVolume
(
&
vol
);
while
(
status
==
B_NO_ERROR
)
{
if
(
vol
.
GetRootDirectory
(
&
volumeRoot
)
==
B_OK
&&
dir
==
volumeRoot
)
{
BString
volumeName
;
BString
deviceName
;
bool
isCDROM
=
false
;
bool
success
=
false
;
deviceName
=
""
;
volumeName
=
""
;
char
name
[
B_FILE_NAME_LENGTH
];
if
(
vol
.
GetName
(
name
)
>=
B_OK
)
// disk is currently mounted
{
volumeName
=
name
;
dev_t
dev
=
vol
.
Device
();
fs_info
info
;
if
(
fs_stat_dev
(
dev
,
&
info
)
==
B_OK
)
{
success
=
true
;
deviceName
=
info
.
device_name
;
if
(
vol
.
IsReadOnly
()
)
{
int
i_dev
=
open
(
info
.
device_name
,
O_RDONLY
);
if
(
i_dev
>=
0
)
{
device_geometry
g
;
if
(
ioctl
(
i_dev
,
B_GET_GEOMETRY
,
&
g
,
sizeof
(
g
)
)
>=
0
)
isCDROM
=
(
g
.
device_type
==
B_CD
);
close
(
i_dev
);
}
}
}
}
if
(
success
&&
isCDROM
)
{
BMessage
msg
(
OPEN_DVD
);
msg
.
AddString
(
"device"
,
deviceName
.
String
()
);
PostMessage
(
&
msg
);
add
=
false
;
}
break
;
}
else
{
vol
.
Unset
();
status
=
volRoster
.
GetNextVolume
(
&
vol
);
}
}
// has the user dropped a dvd disk icon?
// TODO: this code does not work for the following situation:
// if the user dropped the icon for his partition containing
// all his mp3 files, this routine will not do anything, because
// the folder that was dropped is a root folder, but no DVD drive
if
(
dir
.
IsRootDirectory
()
)
{
BVolumeRoster
volRoster
;
BVolume
vol
;
BDirectory
volumeRoot
;
status_t
status
=
volRoster
.
GetNextVolume
(
&
vol
);
while
(
status
==
B_NO_ERROR
)
{
if
(
vol
.
GetRootDirectory
(
&
volumeRoot
)
==
B_OK
&&
dir
==
volumeRoot
)
{
BString
volumeName
;
BString
deviceName
;
bool
isCDROM
;
if
(
get_volume_info
(
vol
,
volumeName
,
isCDROM
,
deviceName
)
&&
isCDROM
)
{
BMessage
msg
(
OPEN_DVD
);
msg
.
AddString
(
"device"
,
deviceName
.
String
()
);
PostMessage
(
&
msg
);
add
=
false
;
}
break
;
}
else
{
vol
.
Unset
();
status
=
volRoster
.
GetNextVolume
(
&
vol
);
}
}
}
else
{
// add all files from the dropped folder
// TODO: do this recursively
dir
.
Rewind
();
add
=
false
;
BEntry
entry
;
while
(
dir
.
GetNextEntry
(
&
entry
)
==
B_OK
)
{
// ", 0" is because we receive the files in reverse order
if
(
!
entry
.
IsDirectory
()
&&
entry
.
GetPath
(
&
path
)
==
B_OK
)
files
.
AddItem
(
new
BString
(
path
.
Path
()
),
0
);
}
}
}
if
(
add
)
{
files
.
AddItem
(
new
BString
(
(
char
*
)
path
.
Path
()
)
);
files
.
AddItem
(
new
BString
(
path
.
Path
()
)
);
}
}
}
// give the list to VLC
p_wrapper
->
OpenFiles
(
&
files
,
replace
);
// BString objects allocated here will be deleted there
int32
index
;
if
(
p_message
->
FindInt32
(
"drop index"
,
&
index
)
!=
B_OK
)
index
=
-
1
;
p_wrapper
->
OpenFiles
(
&
files
,
replace
,
index
);
_UpdatePlaylist
();
}
break
;
...
...
@@ -625,7 +739,7 @@ bool InterfaceWindow::QuitRequested()
p_mediaControl
->
SetStatus
(
NOT_STARTED_S
,
DEFAULT_RATE
);
/* Save interface settings */
BRect
frame
=
Frame
();
/*
BRect frame = Frame();
config_PutInt( p_intf, "beos-intf-width", (int)frame.Width() );
config_PutInt( p_intf, "beos-intf-height", (int)frame.Height() );
config_PutInt( p_intf, "beos-intf-xpos", (int)frame.left );
...
...
@@ -649,9 +763,10 @@ bool InterfaceWindow::QuitRequested()
config_PutInt( p_intf, "beos-messages-ypos", (int)frame.top );
config_PutInt( p_intf, "beos-messages-show", !fMessagesWindow->IsHidden() );
fMessagesWindow->Unlock();
}
}
*/
config_SaveConfigFile
(
p_intf
,
"beos"
);
_StoreSettings
();
p_intf
->
b_die
=
1
;
return
(
true
);
...
...
@@ -666,9 +781,9 @@ void InterfaceWindow::UpdateInterface()
{
if
(
acquire_sem
(
p_mediaControl
->
fScrubSem
)
==
B_OK
)
{
p_wrapper
->
SetTimeAsFloat
(
p_mediaControl
->
GetSeekTo
()
);
p_wrapper
->
SetTimeAsFloat
(
p_mediaControl
->
GetSeekTo
()
);
}
else
if
(
Lock
()
)
else
if
(
Lock
WithTimeout
(
INTERFACE_LOCKING_TIMEOUT
)
==
B_OK
)
{
p_mediaControl
->
SetEnabled
(
true
);
bool
hasTitles
=
p_wrapper
->
HasTitles
();
...
...
@@ -696,7 +811,7 @@ void InterfaceWindow::UpdateInterface()
Unlock
();
}
// update playlist as well
if
(
fPlaylistWindow
->
Lock
()
)
if
(
fPlaylistWindow
->
Lock
WithTimeout
(
INTERFACE_LOCKING_TIMEOUT
)
==
B_OK
)
{
fPlaylistWindow
->
UpdatePlaylist
();
fPlaylistWindow
->
Unlock
();
...
...
@@ -706,7 +821,7 @@ void InterfaceWindow::UpdateInterface()
{
_SetMenusEnabled
(
false
);
if
(
!
(
p_wrapper
->
PlaylistSize
()
>
0
)
)
p_mediaControl
->
SetEnabled
(
false
);
p_mediaControl
->
SetEnabled
(
false
);
else
p_mediaControl
->
SetProgress
(
0
);
}
...
...
@@ -718,8 +833,11 @@ void InterfaceWindow::UpdateInterface()
{
p_wrapper
->
SetVolume
(
i_volume
);
}
fMessagesWindow
->
UpdateMessages
();
// strangly, someone is calling this function even after the object has been destructed!
// even more strangly, this workarround seems to work
if
(
fMessagesWindow
)
fMessagesWindow
->
UpdateMessages
();
fLastUpdateTime
=
system_time
();
}
...
...
@@ -758,30 +876,30 @@ InterfaceWindow::_SetMenusEnabled(bool hasFile, bool hasChapters, bool hasTitles
hasChapters
=
false
;
hasTitles
=
false
;
}
if
(
Lock
()
)
if
(
LockWithTimeout
(
INTERFACE_LOCKING_TIMEOUT
)
==
B_OK
)
{
if
(
fNextChapterMI
->
IsEnabled
()
!=
hasChapters
)
fNextChapterMI
->
SetEnabled
(
hasChapters
);
if
(
fPrevChapterMI
->
IsEnabled
()
!=
hasChapters
)
fPrevChapterMI
->
SetEnabled
(
hasChapters
);
if
(
fChapterMenu
->
IsEnabled
()
!=
hasChapters
)
fChapterMenu
->
SetEnabled
(
hasChapters
);
if
(
fNextTitleMI
->
IsEnabled
()
!=
hasTitles
)
fNextTitleMI
->
SetEnabled
(
hasTitles
);
if
(
fPrevTitleMI
->
IsEnabled
()
!=
hasTitles
)
fPrevTitleMI
->
SetEnabled
(
hasTitles
);
if
(
fTitleMenu
->
IsEnabled
()
!=
hasTitles
)
fTitleMenu
->
SetEnabled
(
hasTitles
);
if
(
fAudioMenu
->
IsEnabled
()
!=
hasFile
)
fAudioMenu
->
SetEnabled
(
hasFile
);
if
(
fNavigationMenu
->
IsEnabled
()
!=
hasFile
)
fNavigationMenu
->
SetEnabled
(
hasFile
);
if
(
fLanguageMenu
->
IsEnabled
()
!=
hasFile
)
fLanguageMenu
->
SetEnabled
(
hasFile
);
if
(
fSubtitlesMenu
->
IsEnabled
()
!=
hasFile
)
fSubtitlesMenu
->
SetEnabled
(
hasFile
);
if
(
fSpeedMenu
->
IsEnabled
()
!=
hasFile
)
fSpeedMenu
->
SetEnabled
(
hasFile
);
if
(
fNextChapterMI
->
IsEnabled
()
!=
hasChapters
)
fNextChapterMI
->
SetEnabled
(
hasChapters
);
if
(
fPrevChapterMI
->
IsEnabled
()
!=
hasChapters
)
fPrevChapterMI
->
SetEnabled
(
hasChapters
);
if
(
fChapterMenu
->
IsEnabled
()
!=
hasChapters
)
fChapterMenu
->
SetEnabled
(
hasChapters
);
if
(
fNextTitleMI
->
IsEnabled
()
!=
hasTitles
)
fNextTitleMI
->
SetEnabled
(
hasTitles
);
if
(
fPrevTitleMI
->
IsEnabled
()
!=
hasTitles
)
fPrevTitleMI
->
SetEnabled
(
hasTitles
);
if
(
fTitleMenu
->
IsEnabled
()
!=
hasTitles
)
fTitleMenu
->
SetEnabled
(
hasTitles
);
if
(
fAudioMenu
->
IsEnabled
()
!=
hasFile
)
fAudioMenu
->
SetEnabled
(
hasFile
);
if
(
fNavigationMenu
->
IsEnabled
()
!=
hasFile
)
fNavigationMenu
->
SetEnabled
(
hasFile
);
if
(
fLanguageMenu
->
IsEnabled
()
!=
hasFile
)
fLanguageMenu
->
SetEnabled
(
hasFile
);
if
(
fSubtitlesMenu
->
IsEnabled
()
!=
hasFile
)
fSubtitlesMenu
->
SetEnabled
(
hasFile
);
if
(
fSpeedMenu
->
IsEnabled
()
!=
hasFile
)
fSpeedMenu
->
SetEnabled
(
hasFile
);
Unlock
();
}
}
...
...
@@ -820,20 +938,133 @@ InterfaceWindow::_InputStreamChanged()
p_wrapper
->
SetVolume
(
p_mediaControl
->
GetVolume
()
);
}
/*****************************************************************************
* InterfaceWindow::_ShowFilePanel
*****************************************************************************/
void
make_sure_frame_is_within_limits
(
BRect
&
frame
,
float
minWidth
,
float
minHeight
,
float
maxWidth
,
float
maxHeight
)
InterfaceWindow
::
_ShowFilePanel
(
uint32
command
,
const
char
*
windowTitle
)
{
if
(
frame
.
Width
()
<
minWidth
)
frame
.
right
=
frame
.
left
+
minWidth
;
if
(
frame
.
Height
()
<
minHeight
)
frame
.
bottom
=
frame
.
top
+
minHeight
;
if
(
frame
.
Width
()
>
maxWidth
)
frame
.
right
=
frame
.
left
+
maxWidth
;
if
(
frame
.
Height
()
>
maxHeight
)
frame
.
bottom
=
frame
.
top
+
maxHeight
;
if
(
!
fFilePanel
)
{
fFilePanel
=
new
BFilePanel
();
fFilePanel
->
SetTarget
(
this
);
}
fFilePanel
->
Window
()
->
SetTitle
(
windowTitle
);
BMessage
message
(
command
);
fFilePanel
->
SetMessage
(
&
message
);
if
(
!
fFilePanel
->
IsShowing
()
)
{
fFilePanel
->
Refresh
();
fFilePanel
->
Show
();
}
}
// set_window_pos
void
set_window_pos
(
BWindow
*
window
,
BRect
frame
)
{
// sanity checks: make sure window is not too big/small
// and that it's not off-screen
float
minWidth
,
maxWidth
,
minHeight
,
maxHeight
;
window
->
GetSizeLimits
(
&
minWidth
,
&
maxWidth
,
&
minHeight
,
&
maxHeight
);
make_sure_frame_is_within_limits
(
frame
,
minWidth
,
minHeight
,
maxWidth
,
maxHeight
);
if
(
make_sure_frame_is_on_screen
(
frame
)
)
{
window
->
MoveTo
(
frame
.
LeftTop
()
);
window
->
ResizeTo
(
frame
.
Width
(),
frame
.
Height
()
);
}
}
// set_window_pos
void
launch_window
(
BWindow
*
window
,
bool
showing
)
{
if
(
window
->
Lock
()
)
{
if
(
showing
)
{
if
(
window
->
IsHidden
()
)
window
->
Show
();
}
else
{
if
(
!
window
->
IsHidden
()
)
window
->
Hide
();
}
window
->
Unlock
();
}
}
/*****************************************************************************
* InterfaceWindow::_RestoreSettings
*****************************************************************************/
void
InterfaceWindow
::
_RestoreSettings
()
{
if
(
load_settings
(
fSettings
,
"interface_settings"
,
"VideoLAN Client"
)
==
B_OK
)
{
BRect
frame
;
if
(
fSettings
->
FindRect
(
"main frame"
,
&
frame
)
==
B_OK
)
set_window_pos
(
this
,
frame
);
if
(
fSettings
->
FindRect
(
"playlist frame"
,
&
frame
)
==
B_OK
)
set_window_pos
(
fPlaylistWindow
,
frame
);
if
(
fSettings
->
FindRect
(
"messages frame"
,
&
frame
)
==
B_OK
)
set_window_pos
(
fMessagesWindow
,
frame
);
if
(
fSettings
->
FindRect
(
"settings frame"
,
&
frame
)
==
B_OK
)
set_window_pos
(
fPreferencesWindow
,
frame
);
bool
showing
;
if
(
fSettings
->
FindBool
(
"playlist showing"
,
&
showing
)
==
B_OK
)
launch_window
(
fPlaylistWindow
,
showing
);
if
(
fSettings
->
FindBool
(
"messages showing"
,
&
showing
)
==
B_OK
)
launch_window
(
fMessagesWindow
,
showing
);
if
(
fSettings
->
FindBool
(
"settings showing"
,
&
showing
)
==
B_OK
)
launch_window
(
fPreferencesWindow
,
showing
);
}
}
/*****************************************************************************
* InterfaceWindow::_StoreSettings
*****************************************************************************/
void
InterfaceWindow
::
_StoreSettings
()
{
if
(
fSettings
->
ReplaceRect
(
"main frame"
,
Frame
()
)
!=
B_OK
)
fSettings
->
AddRect
(
"main frame"
,
Frame
()
);
if
(
fPlaylistWindow
->
Lock
()
)
{
if
(
fSettings
->
ReplaceRect
(
"playlist frame"
,
fPlaylistWindow
->
Frame
()
)
!=
B_OK
)
fSettings
->
AddRect
(
"playlist frame"
,
fPlaylistWindow
->
Frame
()
);
if
(
fSettings
->
ReplaceBool
(
"playlist showing"
,
!
fPlaylistWindow
->
IsHidden
()
)
!=
B_OK
)
fSettings
->
AddBool
(
"playlist showing"
,
!
fPlaylistWindow
->
IsHidden
()
);
fPlaylistWindow
->
Unlock
();
}
if
(
fMessagesWindow
->
Lock
()
)
{
if
(
fSettings
->
ReplaceRect
(
"messages frame"
,
fMessagesWindow
->
Frame
()
)
!=
B_OK
)
fSettings
->
AddRect
(
"messages frame"
,
fMessagesWindow
->
Frame
()
);
if
(
fSettings
->
ReplaceBool
(
"messages showing"
,
!
fMessagesWindow
->
IsHidden
()
)
!=
B_OK
)
fSettings
->
AddBool
(
"messages showing"
,
!
fMessagesWindow
->
IsHidden
()
);
fMessagesWindow
->
Unlock
();
}
if
(
fPreferencesWindow
->
Lock
()
)
{
if
(
fSettings
->
ReplaceRect
(
"settings frame"
,
fPreferencesWindow
->
Frame
()
)
!=
B_OK
)
fSettings
->
AddRect
(
"settings frame"
,
fPreferencesWindow
->
Frame
()
);
if
(
fSettings
->
ReplaceBool
(
"settings showing"
,
!
fPreferencesWindow
->
IsHidden
()
)
!=
B_OK
)
fSettings
->
AddBool
(
"settings showing"
,
!
fPreferencesWindow
->
IsHidden
()
);
fPreferencesWindow
->
Unlock
();
}
save_settings
(
fSettings
,
"interface_settings"
,
"VideoLAN Client"
);
}
/*****************************************************************************
* CDMenu::CDMenu
*****************************************************************************/
...
...
@@ -855,9 +1086,9 @@ CDMenu::~CDMenu()
void
CDMenu
::
AttachedToWindow
(
void
)
{
// remove all items
while
(
BMenuItem
*
item
=
RemoveItem
(
0L
)
)
while
(
BMenuItem
*
item
=
RemoveItem
(
0L
)
)
delete
item
;
GetCD
(
"/dev/disk"
);
GetCD
(
"/dev/disk"
);
BMenu
::
AttachedToWindow
();
}
...
...
@@ -866,54 +1097,26 @@ void CDMenu::AttachedToWindow(void)
*****************************************************************************/
int
CDMenu
::
GetCD
(
const
char
*
directory
)
{
BVolumeRoster
*
volRoster
;
BVolume
*
vol
;
BDirectory
*
dir
;
int
status
;
int
mounted
;
char
name
[
B_FILE_NAME_LENGTH
];
fs_info
info
;
dev_t
dev
;
volRoster
=
new
BVolumeRoster
();
vol
=
new
BVolume
();
dir
=
new
BDirectory
();
status
=
volRoster
->
GetNextVolume
(
vol
);
status
=
vol
->
GetRootDirectory
(
dir
);
while
(
status
==
B_NO_ERROR
)
{
mounted
=
vol
->
GetName
(
name
);
if
((
mounted
==
B_OK
)
&&
/* Disk is currently Mounted */
(
vol
->
IsReadOnly
())
)
/* Disk is read-only */
{
dev
=
vol
->
Device
();
fs_stat_dev
(
dev
,
&
info
);
device_geometry
g
;
int
i_dev
;
i_dev
=
open
(
info
.
device_name
,
O_RDONLY
);
if
(
i_dev
>=
0
)
{
if
(
ioctl
(
i_dev
,
B_GET_GEOMETRY
,
&
g
,
sizeof
(
g
))
>=
0
)
{
if
(
g
.
device_type
==
B_CD
)
//ensure the drive is a CD-ROM
{
BMessage
*
msg
;
msg
=
new
BMessage
(
OPEN_DVD
);
msg
->
AddString
(
"device"
,
info
.
device_name
);
BMenuItem
*
menu_item
;
menu_item
=
new
BMenuItem
(
name
,
msg
);
AddItem
(
menu_item
);
}
close
(
i_dev
);
}
}
}
vol
->
Unset
();
status
=
volRoster
->
GetNextVolume
(
vol
);
}
return
0
;
BVolumeRoster
volRoster
;
BVolume
vol
;
BDirectory
dir
;
status_t
status
=
volRoster
.
GetNextVolume
(
&
vol
);
while
(
status
==
B_NO_ERROR
)
{
BString
deviceName
;
BString
volumeName
;
bool
isCDROM
;
if
(
get_volume_info
(
vol
,
volumeName
,
isCDROM
,
deviceName
)
&&
isCDROM
)
{
BMessage
*
msg
=
new
BMessage
(
OPEN_DVD
);
msg
->
AddString
(
"device"
,
deviceName
.
String
()
);
BMenuItem
*
item
=
new
BMenuItem
(
volumeName
.
String
(),
msg
);
AddItem
(
item
);
}
vol
.
Unset
();
status
=
volRoster
.
GetNextVolume
(
&
vol
);
}
}
/*****************************************************************************
...
...
@@ -944,32 +1147,17 @@ void LanguageMenu::AttachedToWindow()
delete
item
;
SetRadioMode
(
true
);
_GetChannels
();
if
(
BList
*
list
=
p_wrapper
->
GetChannels
(
kind
)
)
{
for
(
int32
i
=
0
;
BMenuItem
*
item
=
(
BMenuItem
*
)
list
->
ItemAt
(
i
);
i
++
)
AddItem
(
item
);
if
(
list
->
CountItems
()
>
1
)
AddItem
(
new
BSeparatorItem
(),
1
);
}
BMenu
::
AttachedToWindow
();
}
/*****************************************************************************
* LanguageMenu::_GetChannels
*****************************************************************************/
void
LanguageMenu
::
_GetChannels
()
{
BMenuItem
*
item
;
BList
*
list
;
if
(
(
list
=
p_wrapper
->
GetChannels
(
kind
)
)
==
NULL
)
return
;
for
(
int
i
=
0
;
i
<
list
->
CountItems
();
i
++
)
{
item
=
(
BMenuItem
*
)
list
->
ItemAt
(
i
);
AddItem
(
item
);
}
if
(
list
->
CountItems
()
>
1
)
AddItem
(
new
BSeparatorItem
(),
1
);
}
/*****************************************************************************
* TitleMenu::TitleMenu
*****************************************************************************/
...
...
@@ -991,21 +1179,14 @@ TitleMenu::~TitleMenu()
*****************************************************************************/
void
TitleMenu
::
AttachedToWindow
()
{
BMenuItem
*
item
;
BList
*
list
;
while
(
(
item
=
RemoveItem
(
0L
)
)
)
while
(
BMenuItem
*
item
=
RemoveItem
(
0L
)
)
delete
item
;
if
(
(
list
=
p_intf
->
p_sys
->
p_wrapper
->
GetTitles
()
)
==
NULL
)
return
;
for
(
int
i
=
0
;
i
<
list
->
CountItems
();
i
++
)
{
item
=
(
BMenuItem
*
)
list
->
ItemAt
(
i
);
AddItem
(
item
);
}
if
(
BList
*
list
=
p_intf
->
p_sys
->
p_wrapper
->
GetTitles
()
)
{
for
(
int
i
=
0
;
BMenuItem
*
item
=
(
BMenuItem
*
)
list
->
ItemAt
(
i
);
i
++
)
AddItem
(
item
);
}
BMenu
::
AttachedToWindow
();
}
...
...
@@ -1031,21 +1212,80 @@ ChapterMenu::~ChapterMenu()
*****************************************************************************/
void
ChapterMenu
::
AttachedToWindow
()
{
BMenuItem
*
item
;
BList
*
list
;
while
(
(
item
=
RemoveItem
(
0L
)
)
)
while
(
BMenuItem
*
item
=
RemoveItem
(
0L
)
)
delete
item
;
if
(
(
list
=
p_intf
->
p_sys
->
p_wrapper
->
GetChapters
()
)
==
NULL
)
return
;
for
(
int
i
=
0
;
i
<
list
->
CountItems
();
i
++
)
{
item
=
(
BMenuItem
*
)
list
->
ItemAt
(
i
);
AddItem
(
item
);
}
if
(
BList
*
list
=
p_intf
->
p_sys
->
p_wrapper
->
GetChapters
()
)
{
for
(
int
i
=
0
;
BMenuItem
*
item
=
(
BMenuItem
*
)
list
->
ItemAt
(
i
);
i
++
)
AddItem
(
item
);
}
BMenu
::
AttachedToWindow
();
}
/*****************************************************************************
* load_settings
*****************************************************************************/
status_t
load_settings
(
BMessage
*
message
,
const
char
*
fileName
,
const
char
*
folder
)
{
status_t
ret
=
B_BAD_VALUE
;
if
(
message
)
{
BPath
path
;
if
(
(
ret
=
find_directory
(
B_USER_SETTINGS_DIRECTORY
,
&
path
)
)
==
B_OK
)
{
// passing folder is optional
if
(
folder
)
ret
=
path
.
Append
(
folder
);
if
(
ret
==
B_OK
&&
(
ret
=
path
.
Append
(
fileName
)
)
==
B_OK
)
{
BFile
file
(
path
.
Path
(),
B_READ_ONLY
);
if
(
(
ret
=
file
.
InitCheck
()
)
==
B_OK
)
{
ret
=
message
->
Unflatten
(
&
file
);
file
.
Unset
();
}
}
}
}
return
ret
;
}
/*****************************************************************************
* save_settings
*****************************************************************************/
status_t
save_settings
(
BMessage
*
message
,
const
char
*
fileName
,
const
char
*
folder
)
{
status_t
ret
=
B_BAD_VALUE
;
if
(
message
)
{
BPath
path
;
if
(
(
ret
=
find_directory
(
B_USER_SETTINGS_DIRECTORY
,
&
path
)
)
==
B_OK
)
{
// passing folder is optional
if
(
folder
&&
(
ret
=
path
.
Append
(
folder
)
)
==
B_OK
)
ret
=
create_directory
(
path
.
Path
(),
0777
);
if
(
ret
==
B_OK
&&
(
ret
=
path
.
Append
(
fileName
)
)
==
B_OK
)
{
BFile
file
(
path
.
Path
(),
B_WRITE_ONLY
|
B_CREATE_FILE
|
B_ERASE_FILE
);
if
(
(
ret
=
file
.
InitCheck
()
)
==
B_OK
)
{
ret
=
message
->
Flatten
(
&
file
);
file
.
Unset
();
}
}
}
}
return
ret
;
}
modules/gui/beos/InterfaceWindow.h
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* InterfaceWindow.h: BeOS interface window class prototype
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.h,v 1.1
0 2003/01/25 20:15:41 titer
Exp $
* $Id: InterfaceWindow.h,v 1.1
1 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Tony Castley <tcastley@mail.powerup.com.au>
...
...
@@ -36,6 +36,7 @@ class PlayListWindow;
class
BFilePanel
;
class
PreferencesWindow
;
class
MessagesWindow
;
class
VlcWrapper
;
class
CDMenu
:
public
BMenu
{
...
...
@@ -60,8 +61,6 @@ class LanguageMenu : public BMenu
virtual
void
AttachedToWindow
();
private:
void
_GetChannels
();
VlcWrapper
*
p_wrapper
;
int
kind
;
};
...
...
@@ -115,13 +114,16 @@ class InterfaceWindow : public BWindow
bool
hasTitles
=
false
);
void
_UpdateSpeedMenu
(
int
rate
);
void
_InputStreamChanged
();
void
_ShowFilePanel
(
uint32
command
,
const
char
*
windowTitle
);
void
_RestoreSettings
();
void
_StoreSettings
();
intf_thread_t
*
p_intf
;
es_descriptor_t
*
p_spu_es
;
bool
fPlaylistIsEmpty
;
BFilePanel
*
fFilePanel
;
BFilePanel
*
fSubtitlesPanel
;
PlayListWindow
*
fPlaylistWindow
;
PreferencesWindow
*
fPreferencesWindow
;
MessagesWindow
*
fMessagesWindow
;
...
...
@@ -143,8 +145,20 @@ class InterfaceWindow : public BWindow
BMenu
*
fSpeedMenu
;
BMenu
*
fShowMenu
;
bigtime_t
fLastUpdateTime
;
VlcWrapper
*
p_wrapper
;
BMessage
*
fSettings
;
// we keep the message arround
// for forward compatibility
VlcWrapper
*
p_wrapper
;
};
// some global support functions
status_t
load_settings
(
BMessage
*
message
,
const
char
*
fileName
,
const
char
*
folder
=
NULL
);
status_t
save_settings
(
BMessage
*
message
,
const
char
*
fileName
,
const
char
*
folder
=
NULL
);
#endif // BEOS_INTERFACE_WINDOW_H
modules/gui/beos/ListViews.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* ListViews.h: BeOS interface list view class implementation
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: ListViews.cpp,v 1.
2 2003/01/22 01:13:22 titer
Exp $
* $Id: ListViews.cpp,v 1.
3 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Stephan Aßmus <stippi@yellowbites.com>
*
...
...
@@ -22,6 +22,7 @@
*****************************************************************************/
#include <stdio.h>
#include <malloc.h>
#include <Bitmap.h>
#include <String.h>
...
...
@@ -128,6 +129,7 @@ DragSortableListView::DragSortableListView( BRect frame, const char* name,
list_view_type
type
,
uint32
resizingMode
,
uint32
flags
)
:
BListView
(
frame
,
name
,
type
,
resizingMode
,
flags
),
fDropRect
(
0.0
,
0.0
,
-
1.0
,
-
1.0
),
fDropIndex
(
-
1
)
{
SetViewColor
(
B_TRANSPARENT_32_BIT
);
...
...
@@ -168,6 +170,12 @@ DragSortableListView::Draw( BRect updateRect )
SetLowColor
(
255
,
255
,
255
,
255
);
FillRect
(
updateRect
,
B_SOLID_LOW
);
}
// drop anticipation indication
if
(
fDropRect
.
IsValid
()
)
{
SetHighColor
(
255
,
0
,
0
,
255
);
StrokeRect
(
fDropRect
);
}
}
/*****************************************************************************
...
...
@@ -176,7 +184,6 @@ DragSortableListView::Draw( BRect updateRect )
bool
DragSortableListView
::
InitiateDrag
(
BPoint
point
,
int32
index
,
bool
)
{
return
false
;
bool
success
=
false
;
BListItem
*
item
=
ItemAt
(
CurrentSelection
(
0
)
);
if
(
!
item
)
...
...
@@ -197,7 +204,7 @@ return false;
int32
numItems
;
bool
fade
=
false
;
for
(
numItems
=
0
;
BListItem
*
item
=
ItemAt
(
CurrentSelection
(
numItems
)
);
numItems
++
)
{
dragRect
.
bottom
+=
item
->
Height
()
;
dragRect
.
bottom
+=
ceilf
(
item
->
Height
()
)
+
1.0
;
if
(
dragRect
.
Height
()
>
MAX_DRAG_HEIGHT
)
{
fade
=
true
;
dragRect
.
bottom
=
MAX_DRAG_HEIGHT
;
...
...
@@ -216,7 +223,7 @@ return false;
for
(
int32
i
=
0
;
i
<
numItems
;
i
++
)
{
int32
index
=
CurrentSelection
(
i
);
BListItem
*
item
=
ItemAt
(
index
);
itemBounds
.
bottom
=
itemBounds
.
top
+
item
->
Height
()
-
1.0
;
itemBounds
.
bottom
=
itemBounds
.
top
+
ceilf
(
item
->
Height
()
)
;
if
(
itemBounds
.
bottom
>
dragRect
.
bottom
)
itemBounds
.
bottom
=
dragRect
.
bottom
;
DrawListItem
(
v
,
index
,
itemBounds
);
...
...
@@ -281,49 +288,40 @@ DragSortableListView::WindowActivated( bool active )
void
DragSortableListView
::
MessageReceived
(
BMessage
*
message
)
{
BListItem
*
item
=
NULL
;
DragSortableListView
*
list
=
NULL
;
if
(
message
->
FindPointer
(
"list"
,
(
void
**
)
&
list
)
==
B_OK
&&
list
==
this
)
switch
(
message
->
what
)
{
int32
count
=
CountItems
();
if
(
fDropIndex
<
0
||
fDropIndex
>
count
)
fDropIndex
=
count
;
bool
copy
=
(
modifiers
()
&
B_SHIFT_KEY
);
for
(
int32
i
=
0
;
message
->
FindPointer
(
"item"
,
i
,
(
void
**
)
&
item
)
==
B_OK
;
i
++
)
case
B_MODIFIERS_CHANGED
:
ModifiersChanged
();
break
;
case
B_SIMPLE_DATA
:
{
if
(
HasItem
(
item
)
)
DragSortableListView
*
list
=
NULL
;
if
(
message
->
FindPointer
(
"list"
,
(
void
**
)
&
list
)
==
B_OK
&&
list
==
this
)
{
BListItem
*
itemToAdd
=
NULL
;
int32
index
=
IndexOf
(
item
);
if
(
copy
)
{
// add cloned item
itemToAdd
=
CloneItem
(
index
);
Deselect
(
IndexOf
(
item
)
);
}
else
{
// drag sort
if
(
index
<
fDropIndex
)
fDropIndex
--
;
if
(
RemoveItem
(
item
)
)
itemToAdd
=
item
;
}
if
(
itemToAdd
)
int32
count
=
CountItems
();
if
(
fDropIndex
<
0
||
fDropIndex
>
count
)
fDropIndex
=
count
;
BList
items
;
int32
index
;
for
(
int32
i
=
0
;
message
->
FindInt32
(
"index"
,
i
,
&
index
)
==
B_OK
;
i
++
)
if
(
BListItem
*
item
=
ItemAt
(
index
)
)
items
.
AddItem
(
(
void
*
)
item
);
if
(
items
.
CountItems
()
>
0
)
{
if
(
AddItem
(
itemToAdd
,
fDropIndex
)
)
Select
(
IndexOf
(
itemToAdd
),
true
);
if
(
modifiers
()
&
B_SHIFT_KEY
)
CopyItems
(
items
,
fDropIndex
);
else
delete
itemToAdd
;
MoveItems
(
items
,
fDropIndex
)
;
}
fDropIndex
=
-
1
;
}
fDropIndex
++
;
break
;
}
fDropIndex
=
-
1
;
}
else
BListView
::
MessageReceived
(
message
);
default:
BListView
::
MessageReceived
(
message
);
break
;
}
}
/*****************************************************************************
...
...
@@ -334,120 +332,46 @@ DragSortableListView::MouseMoved(BPoint where, uint32 transit, const BMessage *m
{
if
(
msg
&&
msg
->
what
==
B_SIMPLE_DATA
)
{
bool
replaceAll
=
!
msg
->
HasPointer
(
"list"
)
&&
!
(
modifiers
()
&
B_SHIFT_KEY
);
switch
(
transit
)
{
case
B_ENTERED_VIEW
:
{
// draw drop mark
BRect
r
(
ItemFrame
(
0L
));
where
.
y
+=
r
.
Height
()
/
2.0
;
int32
count
=
CountItems
();
bool
found
=
false
;
for
(
int32
index
=
0
;
index
<=
count
;
index
++
)
{
r
=
ItemFrame
(
index
);
if
(
r
.
Contains
(
where
))
{
SetHighColor
(
255
,
0
,
0
,
255
);
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
r
.
top
++
;
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
fDropIndex
=
index
;
found
=
true
;
break
;
}
}
if
(
found
)
break
;
// mouse is after last item
fDropIndex
=
count
;
r
=
Bounds
();
if
(
count
>
0
)
r
.
top
=
ItemFrame
(
count
-
1
).
bottom
+
1.0
;
SetHighColor
(
255
,
0
,
0
,
255
);
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
r
.
top
++
;
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
break
;
}
case
B_INSIDE_VIEW
:
{
// draw drop mark and invalidate previous drop mark
BRect
r
(
ItemFrame
(
0L
));
where
.
y
+=
r
.
Height
()
/
2.0
;
int32
count
=
CountItems
();
// mouse still after last item?
if
(
fDropIndex
==
count
)
if
(
replaceAll
)
{
r
=
Bounds
();
if
(
count
>
0
)
r
.
top
=
ItemFrame
(
count
-
1
).
bottom
+
1.0
;
if
(
r
.
Contains
(
where
))
break
;
else
{
r
.
bottom
=
r
.
top
+
2.0
;
Invalidate
(
r
);
}
BRect
r
(
Bounds
()
);
r
.
bottom
--
;
// compensate for scrollbar offset
_SetDropAnticipationRect
(
r
);
fDropIndex
=
-
1
;
}
// mouse still over same item?
if
(
ItemFrame
(
fDropIndex
).
Contains
(
where
))
break
;
else
InvalidateItem
(
fDropIndex
);
// mouse over new item
bool
found
=
false
;
for
(
int32
index
=
0
;
index
<=
count
;
index
++
)
{
r
=
ItemFrame
(
index
);
if
(
r
.
Contains
(
where
))
{
SetHighColor
(
255
,
0
,
0
,
255
);
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
r
.
top
++
;
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
fDropIndex
=
index
;
found
=
true
;
break
;
}
// offset where by half of item height
BRect
r
(
ItemFrame
(
0
)
);
where
.
y
+=
r
.
Height
()
/
2.0
;
int32
index
=
IndexOf
(
where
);
if
(
index
<
0
)
index
=
CountItems
();
_SetDropIndex
(
index
);
}
if
(
found
)
break
;
// mouse is after last item
fDropIndex
=
count
;
r
=
Bounds
();
if
(
count
>
0
)
r
.
top
=
ItemFrame
(
count
-
1
).
bottom
+
1.0
;
SetHighColor
(
255
,
0
,
0
,
255
);
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
r
.
top
++
;
StrokeLine
(
r
.
LeftTop
(),
r
.
RightTop
(),
B_SOLID_HIGH
);
break
;
}
case
B_EXITED_VIEW
:
{
int32
count
=
CountItems
();
if
(
count
>
0
)
{
if
(
fDropIndex
==
count
)
{
BRect
r
(
Bounds
());
r
.
top
=
ItemFrame
(
count
-
1
).
bottom
+
1.0
;
r
.
bottom
=
r
.
top
+
2.0
;
Invalidate
(
r
);
}
else
InvalidateItem
(
fDropIndex
);
}
break
;
}
case
B_OUTSIDE_VIEW
:
_RemoveDropAnticipationRect
();
break
;
}
// remember drag message
// this is needed to react on modifier changes
fDragMessageCopy
=
*
msg
;
}
else
{
_RemoveDropAnticipationRect
();
BListView
::
MouseMoved
(
where
,
transit
,
msg
);
}
}
/*****************************************************************************
...
...
@@ -457,8 +381,7 @@ void
DragSortableListView
::
MouseUp
(
BPoint
where
)
{
// remove drop mark
if
(
fDropIndex
>=
0
&&
fDropIndex
<
CountItems
()
)
InvalidateItem
(
fDropIndex
);
_SetDropAnticipationRect
(
BRect
(
0.0
,
0.0
,
-
1.0
,
-
1.0
)
);
BListView
::
MouseUp
(
where
);
}
...
...
@@ -471,25 +394,204 @@ DragSortableListView::DrawItem( BListItem *item, BRect itemFrame, bool complete
DrawListItem
(
this
,
IndexOf
(
item
),
itemFrame
);
}
/*****************************************************************************
* DragSortableListView::ModifiersChaned
*****************************************************************************/
void
DragSortableListView
::
ModifiersChanged
()
{
BPoint
where
;
uint32
buttons
;
GetMouse
(
&
where
,
&
buttons
,
false
);
uint32
transit
=
Bounds
().
Contains
(
where
)
?
B_INSIDE_VIEW
:
B_OUTSIDE_VIEW
;
MouseMoved
(
where
,
transit
,
&
fDragMessageCopy
);
}
/*****************************************************************************
* DragSortableListView::MoveItems
*****************************************************************************/
void
DragSortableListView
::
MoveItems
(
BList
&
items
,
int32
index
)
{
DeselectAll
();
// we remove the items while we look at them, the insertion index is decreased
// when the items index is lower, so that we insert at the right spot after
// removal
BList
removedItems
;
int32
count
=
items
.
CountItems
();
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
BListItem
*
item
=
(
BListItem
*
)
items
.
ItemAt
(
i
);
int32
removeIndex
=
IndexOf
(
item
);
if
(
RemoveItem
(
item
)
&&
removedItems
.
AddItem
(
(
void
*
)
item
)
)
{
if
(
removeIndex
<
index
)
index
--
;
}
// else ??? -> blow up
}
for
(
int32
i
=
0
;
BListItem
*
item
=
(
BListItem
*
)
removedItems
.
ItemAt
(
i
);
i
++
)
{
if
(
AddItem
(
item
,
index
)
)
{
// after we're done, the newly inserted items will be selected
Select
(
index
,
true
);
// next items will be inserted after this one
index
++
;
}
else
delete
item
;
}
}
/*****************************************************************************
* DragSortableListView::CopyItems
*****************************************************************************/
void
DragSortableListView
::
CopyItems
(
BList
&
items
,
int32
index
)
{
DeselectAll
();
// by inserting the items after we copied all items first, we avoid
// cloning an item we already inserted and messing everything up
// in other words, don't touch the list before we know which items
// need to be cloned
BList
clonedItems
;
int32
count
=
items
.
CountItems
();
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
BListItem
*
item
=
CloneItem
(
IndexOf
(
(
BListItem
*
)
items
.
ItemAt
(
i
)
)
);
if
(
item
&&
!
clonedItems
.
AddItem
(
(
void
*
)
item
)
)
delete
item
;
}
for
(
int32
i
=
0
;
BListItem
*
item
=
(
BListItem
*
)
clonedItems
.
ItemAt
(
i
);
i
++
)
{
if
(
AddItem
(
item
,
index
)
)
{
// after we're done, the newly inserted items will be selected
Select
(
index
,
true
);
// next items will be inserted after this one
index
++
;
}
else
delete
item
;
}
}
/*****************************************************************************
* DragSortableListView::RemoveItemList
*****************************************************************************/
void
DragSortableListView
::
RemoveItemList
(
BList
&
items
)
{
int32
count
=
items
.
CountItems
();
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
BListItem
*
item
=
(
BListItem
*
)
items
.
ItemAt
(
i
);
if
(
RemoveItem
(
item
)
)
delete
item
;
}
}
/*****************************************************************************
* DragSortableListView::RemoveSelected
*****************************************************************************/
void
DragSortableListView
::
RemoveSelected
()
{
BList
items
;
for
(
int32
i
=
0
;
BListItem
*
item
=
ItemAt
(
CurrentSelection
(
i
)
);
i
++
)
items
.
AddItem
(
(
void
*
)
item
);
RemoveItemList
(
items
);
}
/*****************************************************************************
* DragSortableListView::_SetDropAnticipationRect
*****************************************************************************/
void
DragSortableListView
::
_SetDropAnticipationRect
(
BRect
r
)
{
if
(
fDropRect
!=
r
)
{
if
(
fDropRect
.
IsValid
()
)
Invalidate
(
fDropRect
);
fDropRect
=
r
;
if
(
fDropRect
.
IsValid
()
)
Invalidate
(
fDropRect
);
}
}
/*****************************************************************************
* DragSortableListView::_SetDropAnticipationRect
*****************************************************************************/
void
DragSortableListView
::
_SetDropIndex
(
int32
index
)
{
if
(
fDropIndex
!=
index
)
{
fDropIndex
=
index
;
if
(
fDropIndex
==
-
1
)
_SetDropAnticipationRect
(
BRect
(
0.0
,
0.0
,
-
1.0
,
-
1.0
)
);
else
{
int32
count
=
CountItems
();
if
(
fDropIndex
==
count
)
{
BRect
r
;
if
(
BListItem
*
item
=
ItemAt
(
count
-
1
)
)
{
r
=
ItemFrame
(
count
-
1
);
r
.
top
=
r
.
bottom
+
1.0
;
r
.
bottom
=
r
.
top
+
1.0
;
}
else
{
r
=
Bounds
();
r
.
bottom
--
;
// compensate for scrollbars moved slightly out of window
}
_SetDropAnticipationRect
(
r
);
}
else
{
BRect
r
=
ItemFrame
(
fDropIndex
);
r
.
bottom
=
r
.
top
+
1.0
;
_SetDropAnticipationRect
(
r
);
}
}
}
}
/*****************************************************************************
* DragSortableListView::_RemoveDropAnticipationRect
*****************************************************************************/
void
DragSortableListView
::
_RemoveDropAnticipationRect
()
{
_SetDropAnticipationRect
(
BRect
(
0.0
,
0.0
,
-
1.0
,
-
1.0
)
);
_SetDropIndex
(
-
1
);
}
/*****************************************************************************
* PlaylistView class
*****************************************************************************/
PlaylistView
::
PlaylistView
(
BRect
frame
,
InterfaceWindow
*
mainWindow
,
VlcWrapper
*
p_wrapper
)
VlcWrapper
*
wrapper
,
BMessage
*
selectionChangeMessage
)
:
DragSortableListView
(
frame
,
"playlist listview"
,
B_MULTIPLE_SELECTION_LIST
,
B_FOLLOW_ALL_SIDES
,
B_WILL_DRAW
|
B_NAVIGABLE
|
B_PULSE_NEEDED
|
B_FRAME_EVENTS
|
B_FULL_UPDATE_ON_RESIZE
),
fCurrentIndex
(
-
1
),
fPlaying
(
false
),
fMainWindow
(
mainWindow
)
fMainWindow
(
mainWindow
),
fSelectionChangeMessage
(
selectionChangeMessage
),
fVlcWrapper
(
wrapper
)
{
this
->
p_wrapper
=
p_wrapper
;
}
PlaylistView
::~
PlaylistView
()
{
delete
fSelectionChangeMessage
;
}
/*****************************************************************************
...
...
@@ -499,7 +601,34 @@ void
PlaylistView
::
AttachedToWindow
()
{
// get pulse message every two frames
Window
()
->
SetPulseRate
(
80000
);
Window
()
->
SetPulseRate
(
80000
);
}
/*****************************************************************************
* PlaylistView::MessageReceived
*****************************************************************************/
void
PlaylistView
::
MessageReceived
(
BMessage
*
message
)
{
switch
(
message
->
what
)
{
case
B_SIMPLE_DATA
:
if
(
message
->
HasPointer
(
"list"
)
)
{
// message comes from ourself
DragSortableListView
::
MessageReceived
(
message
);
}
else
{
// message comes from another app (for example Tracker)
message
->
AddInt32
(
"drop index"
,
fDropIndex
);
fMainWindow
->
PostMessage
(
message
,
fMainWindow
);
}
break
;
default:
DragSortableListView
::
MessageReceived
(
message
);
break
;
}
}
/*****************************************************************************
...
...
@@ -518,7 +647,7 @@ PlaylistView::MouseDown( BPoint where )
{
if
(
clicks
==
2
)
{
p_w
rapper
->
PlaylistJumpTo
(
i
);
fVlcW
rapper
->
PlaylistJumpTo
(
i
);
handled
=
true
;
}
else
if
(
i
==
fCurrentIndex
)
...
...
@@ -544,20 +673,12 @@ PlaylistView::MouseDown( BPoint where )
void
PlaylistView
::
KeyDown
(
const
char
*
bytes
,
int32
numBytes
)
{
if
(
numBytes
<
1
)
if
(
numBytes
<
1
)
return
;
if
(
(
bytes
[
0
]
==
B_BACKSPACE
)
||
(
bytes
[
0
]
==
B_DELETE
)
)
{
int32
i
=
CurrentSelection
();
if
(
BListItem
*
item
=
ItemAt
(
i
)
)
{
/* if ( RemoveItem( item ) )
{
delete item;
Select( i + 1 );
}*/
}
RemoveSelected
();
}
DragSortableListView
::
KeyDown
(
bytes
,
numBytes
);
}
...
...
@@ -568,10 +689,173 @@ PlaylistView::KeyDown( const char* bytes, int32 numBytes )
void
PlaylistView
::
Pulse
()
{
if
(
fMainWindow
->
IsStopped
()
)
if
(
fMainWindow
->
IsStopped
()
)
SetPlaying
(
false
);
}
/*****************************************************************************
* PlaylistView::SelectionChanged
*****************************************************************************/
void
PlaylistView
::
SelectionChanged
()
{
BLooper
*
looper
=
Looper
();
if
(
fSelectionChangeMessage
&&
looper
)
{
BMessage
message
(
*
fSelectionChangeMessage
);
looper
->
PostMessage
(
&
message
);
}
}
/*****************************************************************************
* PlaylistView::MoveItems
*****************************************************************************/
void
PlaylistView
::
MoveItems
(
BList
&
items
,
int32
index
)
{
DeselectAll
();
// we remove the items while we look at them, the insertion index is decreased
// when the items index is lower, so that we insert at the right spot after
// removal
if
(
fVlcWrapper
->
PlaylistLock
()
)
{
BList
removedItems
;
BList
removeItems
;
int32
count
=
items
.
CountItems
();
int32
indexOriginal
=
index
;
// remember currently playing item
int32
currentIndex
,
size
;
fVlcWrapper
->
GetPlaylistInfo
(
currentIndex
,
size
);
BListItem
*
playingItem
=
ItemAt
(
currentIndex
);
// collect item pointers for removal by index
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
int32
removeIndex
=
IndexOf
(
(
BListItem
*
)
items
.
ItemAt
(
i
)
);
void
*
item
=
fVlcWrapper
->
PlaylistItemAt
(
removeIndex
);
if
(
item
&&
removeItems
.
AddItem
(
item
)
)
{
if
(
removeIndex
<
index
)
index
--
;
}
// else ??? -> blow up
}
// actually remove items using pointers
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
void
*
item
=
fVlcWrapper
->
PlaylistRemoveItem
(
removeItems
.
ItemAt
(
i
)
);
if
(
item
&&
!
removedItems
.
AddItem
(
item
)
)
free
(
item
);
}
// add items at index
for
(
int32
i
=
0
;
void
*
item
=
removedItems
.
ItemAt
(
i
);
i
++
)
{
if
(
fVlcWrapper
->
PlaylistAddItem
(
item
,
index
)
)
// next items will be inserted after this one
index
++
;
else
free
(
item
);
}
// update GUI
DragSortableListView
::
MoveItems
(
items
,
indexOriginal
);
// restore currently playing item
for
(
int32
i
=
0
;
BListItem
*
item
=
ItemAt
(
i
);
i
++
)
{
if
(
item
==
playingItem
)
{
fVlcWrapper
->
PlaylistSetPlaying
(
i
);
SetCurrent
(
i
);
break
;
}
}
fVlcWrapper
->
PlaylistUnlock
();
}
}
/*****************************************************************************
* PlaylistView::CopyItems
*****************************************************************************/
void
PlaylistView
::
CopyItems
(
BList
&
items
,
int32
toIndex
)
{
DeselectAll
();
// we remove the items while we look at them, the insertion index is decreased
// when the items index is lower, so that we insert at the right spot after
// removal
if
(
fVlcWrapper
->
PlaylistLock
()
)
{
BList
clonedItems
;
int32
count
=
items
.
CountItems
();
// remember currently playing item
int32
currentIndex
,
size
;
fVlcWrapper
->
GetPlaylistInfo
(
currentIndex
,
size
);
BListItem
*
playingItem
=
ItemAt
(
currentIndex
);
// collect cloned item pointers
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
int32
index
=
IndexOf
(
(
BListItem
*
)
items
.
ItemAt
(
i
)
);
void
*
item
=
fVlcWrapper
->
PlaylistItemAt
(
index
);
void
*
cloned
=
fVlcWrapper
->
PlaylistCloneItem
(
item
);
if
(
cloned
&&
!
clonedItems
.
AddItem
(
cloned
)
)
free
(
cloned
);
}
// add cloned items at index
int32
index
=
toIndex
;
for
(
int32
i
=
0
;
void
*
item
=
clonedItems
.
ItemAt
(
i
);
i
++
)
{
if
(
fVlcWrapper
->
PlaylistAddItem
(
item
,
index
)
)
// next items will be inserted after this one
index
++
;
else
free
(
item
);
}
// update GUI
DragSortableListView
::
CopyItems
(
items
,
toIndex
);
// restore currently playing item
for
(
int32
i
=
0
;
BListItem
*
item
=
ItemAt
(
i
);
i
++
)
{
if
(
item
==
playingItem
)
{
fVlcWrapper
->
PlaylistSetPlaying
(
i
);
SetCurrent
(
i
);
break
;
}
}
fVlcWrapper
->
PlaylistUnlock
();
}
}
/*****************************************************************************
* PlaylistView::RemoveItemList
*****************************************************************************/
void
PlaylistView
::
RemoveItemList
(
BList
&
items
)
{
if
(
fVlcWrapper
->
PlaylistLock
()
)
{
// collect item pointers for removal
BList
removeItems
;
int32
count
=
items
.
CountItems
();
for
(
int32
i
=
0
;
i
<
count
;
i
++
)
{
int32
index
=
IndexOf
(
(
BListItem
*
)
items
.
ItemAt
(
i
)
);
void
*
item
=
fVlcWrapper
->
PlaylistItemAt
(
index
);
if
(
item
&&
!
removeItems
.
AddItem
(
item
)
)
free
(
item
);
}
// remove items from playlist
count
=
removeItems
.
CountItems
();
for
(
int32
i
=
0
;
void
*
item
=
removeItems
.
ItemAt
(
i
);
i
++
)
{
fVlcWrapper
->
PlaylistRemoveItem
(
item
);
}
// update GUI
DragSortableListView
::
RemoveItemList
(
items
);
fVlcWrapper
->
PlaylistUnlock
();
}
}
/*****************************************************************************
* PlaylistView::CloneItem
*****************************************************************************/
...
...
@@ -603,8 +887,10 @@ PlaylistView::MakeDragMessage( BMessage* message ) const
if
(
message
)
{
message
->
AddPointer
(
"list"
,
(
void
*
)
this
);
for
(
int32
i
=
0
;
BListItem
*
item
=
ItemAt
(
CurrentSelection
(
i
)
);
i
++
)
message
->
AddPointer
(
"item"
,
(
void
*
)
item
);
int32
index
;
for
(
int32
i
=
0
;
(
index
=
CurrentSelection
(
i
)
)
>=
0
;
i
++
)
message
->
AddInt32
(
"index"
,
index
);
// TODO: add refs to message (inter application communication)
}
}
...
...
@@ -634,3 +920,19 @@ PlaylistView::SetPlaying( bool playing )
InvalidateItem
(
fCurrentIndex
);
}
}
/*****************************************************************************
* PlaylistView::SetPlaying
*****************************************************************************/
void
PlaylistView
::
RebuildList
()
{
// remove all items
int32
count
=
CountItems
();
while
(
BListItem
*
item
=
RemoveItem
(
--
count
)
)
delete
item
;
// rebuild listview from VLC's playlist
for
(
int
i
=
0
;
i
<
fVlcWrapper
->
PlaylistSize
();
i
++
)
AddItem
(
new
PlaylistItem
(
fVlcWrapper
->
PlaylistItemName
(
i
)
)
);
}
modules/gui/beos/ListViews.h
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* ListViews.h: BeOS interface list view class prototype
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: ListViews.h,v 1.
2 2003/01/22 01:13:22 titer
Exp $
* $Id: ListViews.h,v 1.
3 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Stephan Aßmus <stippi@yellowbites.com>
*
...
...
@@ -73,13 +73,28 @@ class DragSortableListView : public BListView
bool
complete
=
false
);
// DragSortableListView
virtual
void
ModifiersChanged
();
// called by window
virtual
void
MoveItems
(
BList
&
items
,
int32
toIndex
);
virtual
void
CopyItems
(
BList
&
items
,
int32
toIndex
);
virtual
void
RemoveItemList
(
BList
&
indices
);
void
RemoveSelected
();
// uses RemoveItemList()
virtual
BListItem
*
CloneItem
(
int32
atIndex
)
const
=
0
;
virtual
void
DrawListItem
(
BView
*
owner
,
int32
index
,
BRect
itemFrame
)
const
=
0
;
virtual
void
MakeDragMessage
(
BMessage
*
message
)
const
=
0
;
private:
int32
fDropIndex
;
void
_SetDropAnticipationRect
(
BRect
r
);
void
_SetDropIndex
(
int32
index
);
void
_RemoveDropAnticipationRect
();
BRect
fDropRect
;
BMessage
fDragMessageCopy
;
protected:
int32
fDropIndex
;
};
// PlaylistView
...
...
@@ -88,16 +103,23 @@ class PlaylistView : public DragSortableListView
public:
PlaylistView
(
BRect
frame
,
InterfaceWindow
*
mainWindow
,
VlcWrapper
*
p_wrapper
);
VlcWrapper
*
wrapper
,
BMessage
*
selectionChangeMessage
=
NULL
);
~
PlaylistView
();
// BListView
virtual
void
AttachedToWindow
();
virtual
void
MessageReceived
(
BMessage
*
message
);
virtual
void
MouseDown
(
BPoint
where
);
virtual
void
KeyDown
(
const
char
*
bytes
,
int32
numBytes
);
virtual
void
Pulse
();
virtual
void
SelectionChanged
();
// DragSortableListView
virtual
void
MoveItems
(
BList
&
items
,
int32
toIndex
);
virtual
void
CopyItems
(
BList
&
items
,
int32
toIndex
);
virtual
void
RemoveItemList
(
BList
&
indices
);
virtual
BListItem
*
CloneItem
(
int32
atIndex
)
const
;
virtual
void
DrawListItem
(
BView
*
owner
,
int32
index
,
BRect
itemFrame
)
const
;
...
...
@@ -106,13 +128,15 @@ class PlaylistView : public DragSortableListView
// PlaylistView
void
SetCurrent
(
int32
index
);
void
SetPlaying
(
bool
playing
);
void
RebuildList
();
private:
int32
fCurrentIndex
;
bool
fPlaying
;
InterfaceWindow
*
fMainWindow
;
BMessage
*
fSelectionChangeMessage
;
VlcWrapper
*
p_w
rapper
;
VlcWrapper
*
fVlcW
rapper
;
};
#endif // LIST_VIEWS_H
modules/gui/beos/MediaControlView.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* MediaControlView.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: MediaControlView.cpp,v 1.1
3 2003/01/25 01:03:44 titer
Exp $
* $Id: MediaControlView.cpp,v 1.1
4 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Tony Castley <tony@castley.net>
* Stephan Aßmus <stippi@yellowbites.com>
...
...
@@ -773,9 +773,11 @@ SeekSlider::ResizeToPreferred()
void
SeekSlider
::
SetPosition
(
float
position
)
{
LockLooper
();
SetValue
(
fMinValue
+
(
int32
)
floorf
((
fMaxValue
-
fMinValue
)
*
position
+
0.5
));
UnlockLooper
();
if
(
LockLooper
()
)
{
SetValue
(
fMinValue
+
(
int32
)
floorf
((
fMaxValue
-
fMinValue
)
*
position
+
0.5
));
UnlockLooper
();
}
}
/*****************************************************************************
...
...
@@ -1321,7 +1323,7 @@ PositionInfoView::Pulse()
{
int32
index
,
size
;
p_intf
->
p_sys
->
p_wrapper
->
GetPlaylistInfo
(
index
,
size
);
SetFile
(
index
,
size
);
SetFile
(
index
+
1
,
size
);
p_intf
->
p_sys
->
p_wrapper
->
TitleInfo
(
index
,
size
);
SetTitle
(
index
,
size
);
p_intf
->
p_sys
->
p_wrapper
->
ChapterInfo
(
index
,
size
);
...
...
modules/gui/beos/MessagesWindow.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* MessagesWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: MessagesWindow.cpp,v 1.
5 2003/01/31 06:45:00 titer
Exp $
* $Id: MessagesWindow.cpp,v 1.
6 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Eric Petit <titer@videolan.org>
*
...
...
@@ -147,17 +147,19 @@ void MessagesWindow::UpdateMessages()
case
VLC_OBJECT_SOUT
:
psz_module_type
=
"stream output"
;
break
;
}
fMessagesView
->
LockLooper
();
oldLength
=
fMessagesView
->
TextLength
();
BString
string
;
string
<<
p_sub
->
p_msg
[
i_start
].
psz_module
<<
" "
<<
psz_module_type
<<
" : "
<<
p_sub
->
p_msg
[
i_start
].
psz_msg
<<
"
\n
"
;
fMessagesView
->
Insert
(
string
.
String
()
);
fMessagesView
->
SetFontAndColor
(
oldLength
,
fMessagesView
->
TextLength
(),
NULL
,
0
,
&
color
);
fMessagesView
->
Draw
(
fMessagesView
->
Bounds
()
);
fMessagesView
->
UnlockLooper
();
if
(
fMessagesView
->
LockLooper
()
)
{
oldLength
=
fMessagesView
->
TextLength
();
BString
string
;
string
<<
p_sub
->
p_msg
[
i_start
].
psz_module
<<
" "
<<
psz_module_type
<<
" : "
<<
p_sub
->
p_msg
[
i_start
].
psz_msg
<<
"
\n
"
;
fMessagesView
->
Insert
(
string
.
String
()
);
fMessagesView
->
SetFontAndColor
(
oldLength
,
fMessagesView
->
TextLength
(),
NULL
,
0
,
&
color
);
fMessagesView
->
Draw
(
fMessagesView
->
Bounds
()
);
fMessagesView
->
UnlockLooper
();
}
/* Scroll at the end */
if
(
fScrollBar
->
LockLooper
()
)
...
...
modules/gui/beos/PlayListWindow.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* PlayListWindow.cpp: beos interface
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: PlayListWindow.cpp,v 1.
6 2003/01/22 01:13:22 titer
Exp $
* $Id: PlayListWindow.cpp,v 1.
7 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
...
...
@@ -43,13 +43,15 @@
enum
{
MSG_SELECT_ALL
=
'
sall
'
,
MSG_SELECT_NONE
=
'
none
'
,
MSG_RANDOMIZE
=
'
rndm
'
,
MSG_SORT_NAME
=
'
srtn
'
,
MSG_SORT_PATH
=
'
srtp
'
,
MSG_REMOVE
=
'
rmov
'
,
MSG_REMOVE_ALL
=
'
rmal
'
,
MSG_SELECT_ALL
=
'
sall
'
,
MSG_SELECT_NONE
=
'
none
'
,
MSG_RANDOMIZE
=
'
rndm
'
,
MSG_SORT_NAME
=
'
srtn
'
,
MSG_SORT_PATH
=
'
srtp
'
,
MSG_REMOVE
=
'
rmov
'
,
MSG_REMOVE_ALL
=
'
rmal
'
,
MSG_SELECTION_CHANGED
=
'
slch
'
,
};
...
...
@@ -93,32 +95,33 @@ PlayListWindow::PlayListWindow( BRect frame, const char* name,
// Add the Edit menu
BMenu
*
editMenu
=
new
BMenu
(
"Edit"
);
fMenuBar
->
AddItem
(
editMenu
);
item
=
new
BMenuItem
(
"Select All"
,
new
BMessage
(
MSG_SELECT_ALL
),
'A'
);
editMenu
->
AddItem
(
item
);
item
=
new
BMenuItem
(
"Select None"
,
new
BMessage
(
MSG_SELECT_NONE
),
'A'
,
B_SHIFT_KEY
);
editMenu
->
AddItem
(
item
);
fSelectAllMI
=
new
BMenuItem
(
"Select All"
,
new
BMessage
(
MSG_SELECT_ALL
),
'A'
);
editMenu
->
AddItem
(
fSelectAllMI
);
fSelectNoneMI
=
new
BMenuItem
(
"Select None"
,
new
BMessage
(
MSG_SELECT_NONE
),
'A'
,
B_SHIFT_KEY
);
editMenu
->
AddItem
(
fSelectNoneMI
);
editMenu
->
AddSeparatorItem
();
item
=
new
BMenuItem
(
"Sort by Name"
,
new
BMessage
(
MSG_SORT_NAME
),
'N'
);
editMenu
->
AddItem
(
item
);
item
=
new
BMenuItem
(
"Sort by Path"
,
new
BMessage
(
MSG_SORT_PATH
),
'P'
);
editMenu
->
AddItem
(
item
);
item
=
new
BMenuItem
(
"Randomize"
,
new
BMessage
(
MSG_RANDOMIZE
),
'R'
);
editMenu
->
AddItem
(
item
);
fSortNameMI
=
new
BMenuItem
(
"Sort by Name"
,
new
BMessage
(
MSG_SORT_NAME
),
'N'
);
fSortNameMI
->
SetEnabled
(
false
);
editMenu
->
AddItem
(
fSortNameMI
);
fSortPathMI
=
new
BMenuItem
(
"Sort by Path"
,
new
BMessage
(
MSG_SORT_PATH
),
'P'
);
fSortPathMI
->
SetEnabled
(
false
);
editMenu
->
AddItem
(
fSortPathMI
);
fRandomizeMI
=
new
BMenuItem
(
"Randomize"
,
new
BMessage
(
MSG_RANDOMIZE
),
'R'
);
fRandomizeMI
->
SetEnabled
(
false
);
editMenu
->
AddItem
(
fRandomizeMI
);
editMenu
->
AddSeparatorItem
();
item
=
new
BMenuItem
(
"Remove"
,
fRemoveMI
=
new
BMenuItem
(
"Remove"
,
new
BMessage
(
MSG_REMOVE
)
);
editMenu
->
AddItem
(
item
);
item
=
new
BMenuItem
(
"Remove All"
,
new
BMessage
(
MSG_REMOVE_ALL
)
);
editMenu
->
AddItem
(
item
);
editMenu
->
SetEnabled
(
false
);
editMenu
->
AddItem
(
fRemoveMI
);
fRemoveAllMI
=
new
BMenuItem
(
"Remove All"
,
new
BMessage
(
MSG_REMOVE_ALL
)
);
editMenu
->
AddItem
(
fRemoveAllMI
);
// make menu bar resize to correct height
float
menuWidth
,
menuHeight
;
...
...
@@ -130,7 +133,8 @@ editMenu->SetEnabled( false );
frame
.
top
+=
fMenuBar
->
Bounds
().
IntegerHeight
()
+
1
;
frame
.
right
-=
B_V_SCROLL_BAR_WIDTH
;
fListView
=
new
PlaylistView
(
frame
,
fMainWindow
,
p_wrapper
);
fListView
=
new
PlaylistView
(
frame
,
fMainWindow
,
p_wrapper
,
new
BMessage
(
MSG_SELECTION_CHANGED
)
);
fBackgroundView
=
new
BScrollView
(
"playlist scrollview"
,
fListView
,
B_FOLLOW_ALL_SIDES
,
0
,
false
,
true
,
...
...
@@ -182,8 +186,10 @@ PlayListWindow::MessageReceived( BMessage * p_message )
fMainWindow
->
PostMessage
(
p_message
);
break
;
case
MSG_SELECT_ALL
:
fListView
->
Select
(
0
,
fListView
->
CountItems
()
-
1
);
break
;
case
MSG_SELECT_NONE
:
fListView
->
DeselectAll
();
break
;
case
MSG_RANDOMIZE
:
break
;
...
...
@@ -192,8 +198,17 @@ PlayListWindow::MessageReceived( BMessage * p_message )
case
MSG_SORT_PATH
:
break
;
case
MSG_REMOVE
:
fListView
->
RemoveSelected
();
break
;
case
MSG_REMOVE_ALL
:
fListView
->
Select
(
0
,
fListView
->
CountItems
()
-
1
);
fListView
->
RemoveSelected
();
break
;
case
MSG_SELECTION_CHANGED
:
_CheckItemsEnableState
();
break
;
case
B_MODIFIERS_CHANGED
:
fListView
->
ModifiersChanged
();
break
;
default:
BWindow
::
MessageReceived
(
p_message
);
...
...
@@ -235,16 +250,42 @@ void
PlayListWindow
::
UpdatePlaylist
(
bool
rebuild
)
{
if
(
rebuild
)
{
// remove all items
int32
count
=
fListView
->
CountItems
();
while
(
BListItem
*
item
=
fListView
->
RemoveItem
(
--
count
)
)
delete
item
;
// rebuild listview from VLC's playlist
for
(
int
i
=
0
;
i
<
p_wrapper
->
PlaylistSize
();
i
++
)
fListView
->
AddItem
(
new
PlaylistItem
(
p_wrapper
->
PlaylistItemName
(
i
)
)
);
}
fListView
->
RebuildList
();
fListView
->
SetCurrent
(
p_wrapper
->
PlaylistCurrent
()
);
fListView
->
SetPlaying
(
p_wrapper
->
IsPlaying
()
);
_CheckItemsEnableState
();
}
/*****************************************************************************
* PlayListWindow::_CheckItemsEnableState
*****************************************************************************/
void
PlayListWindow
::
_CheckItemsEnableState
()
const
{
// check if one item selected
int32
test
=
fListView
->
CurrentSelection
(
0
);
bool
enable1
=
test
>=
0
;
// check if at least two items selected
// test = fListView->CurrentSelection( 1 );
// bool enable2 = test >= 0;
bool
notEmpty
=
fListView
->
CountItems
()
>
0
;
_SetMenuItemEnabled
(
fSelectAllMI
,
notEmpty
);
_SetMenuItemEnabled
(
fSelectNoneMI
,
enable1
);
// _SetMenuItemEnabled( fSortNameMI, enable2 );
// _SetMenuItemEnabled( fSortPathMI, enable2 );
// _SetMenuItemEnabled( fRandomizeMI, enable2 );
_SetMenuItemEnabled
(
fRemoveMI
,
enable1
);
_SetMenuItemEnabled
(
fRemoveAllMI
,
notEmpty
);
}
/*****************************************************************************
* PlayListWindow::_SetMenuItemEnabled
*****************************************************************************/
void
PlayListWindow
::
_SetMenuItemEnabled
(
BMenuItem
*
item
,
bool
enabled
)
const
{
// this check should actally be done in BMenuItem::SetEnabled(), but it is not...
if
(
item
->
IsEnabled
()
!=
enabled
)
item
->
SetEnabled
(
enabled
);
}
modules/gui/beos/PlayListWindow.h
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* PlayListWindow.h: BeOS interface window class prototype
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: PlayListWindow.h,v 1.
5 2002/11/27 05:36:41 titer
Exp $
* $Id: PlayListWindow.h,v 1.
6 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Tony Castley <tcastley@mail.powerup.com.au>
...
...
@@ -29,8 +29,7 @@
#include <Window.h>
class
BListView
;
class
CDMenu
;
class
BMenuItem
;
class
InterfaceWindow
;
class
PlaylistView
;
...
...
@@ -53,13 +52,25 @@ class PlayListWindow : public BWindow
void
UpdatePlaylist
(
bool
rebuild
=
false
);
private:
void
_CheckItemsEnableState
()
const
;
void
_SetMenuItemEnabled
(
BMenuItem
*
item
,
bool
enabled
)
const
;
PlaylistView
*
fListView
;
BView
*
fBackgroundView
;
BMenuBar
*
fMenuBar
;
InterfaceWindow
*
fMainWindow
;
BMenuItem
*
fSelectAllMI
;
BMenuItem
*
fSelectNoneMI
;
BMenuItem
*
fSortNameMI
;
BMenuItem
*
fSortPathMI
;
BMenuItem
*
fRandomizeMI
;
BMenuItem
*
fRemoveMI
;
BMenuItem
*
fRemoveAllMI
;
intf_thread_t
*
p_intf
;
VlcWrapper
*
p_wrapper
;
VlcWrapper
*
p_wrapper
;
};
#endif // BEOS_PLAY_LIST_WINDOW_H
...
...
modules/gui/beos/VideoOutput.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* vout_beos.cpp: beos video output display method
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
* $Id: VideoOutput.cpp,v 1.1
0 2003/01/24 06:31:56 titer
Exp $
* $Id: VideoOutput.cpp,v 1.1
1 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
...
...
@@ -48,10 +48,12 @@
#include <vlc/intf.h>
#include <vlc/vout.h>
#include "
VideoWindow.h"
#include "
InterfaceWindow.h" // for load/save_settings()
#include "DrawingTidbits.h"
#include "MsgVals.h"
#include "VideoWindow.h"
/*****************************************************************************
* vout_sys_t: BeOS video output method descriptor
*****************************************************************************
...
...
@@ -147,6 +149,99 @@ class BackgroundView : public BView
VLCView
*
fVideoView
;
};
/*****************************************************************************
* VideoSettings constructor and destructor
*****************************************************************************/
VideoSettings
::
VideoSettings
()
:
fVideoSize
(
SIZE_100
),
fFlags
(
FLAG_CORRECT_RATIO
),
fSettings
(
new
BMessage
(
'
sett
'
)
)
{
// read settings from disk
status_t
ret
=
load_settings
(
fSettings
,
"video_settings"
,
"VideoLAN Client"
);
if
(
ret
==
B_OK
)
{
uint32
flags
;
if
(
fSettings
->
FindInt32
(
"flags"
,
(
int32
*
)
&
flags
)
==
B_OK
)
SetFlags
(
flags
);
uint32
size
;
if
(
fSettings
->
FindInt32
(
"video size"
,
(
int32
*
)
&
size
)
==
B_OK
)
SetVideoSize
(
size
);
}
else
{
fprintf
(
stderr
,
"error loading video settings: %s
\n
"
,
strerror
(
ret
)
);
// figure out if we should use vertical sync by default
BScreen
screen
(
B_MAIN_SCREEN_ID
);
if
(
screen
.
IsValid
())
{
display_mode
mode
;
screen
.
GetMode
(
&
mode
);
float
refresh
=
(
mode
.
timing
.
pixel_clock
*
1000
)
/
((
mode
.
timing
.
h_total
)
*
(
mode
.
timing
.
v_total
));
if
(
refresh
<
MIN_AUTO_VSYNC_REFRESH
)
AddFlags
(
FLAG_SYNC_RETRACE
);
}
}
}
VideoSettings
::
VideoSettings
(
const
VideoSettings
&
clone
)
:
fVideoSize
(
clone
.
VideoSize
()
),
fFlags
(
clone
.
Flags
()
),
fSettings
(
NULL
)
{
}
VideoSettings
::~
VideoSettings
()
{
if
(
fSettings
)
{
// we are the default settings
// and write our settings to disk
if
(
fSettings
->
ReplaceInt32
(
"video size"
,
VideoSize
()
)
!=
B_OK
)
fSettings
->
AddInt32
(
"video size"
,
VideoSize
()
);
if
(
fSettings
->
ReplaceInt32
(
"flags"
,
Flags
()
)
!=
B_OK
)
fSettings
->
AddInt32
(
"flags"
,
Flags
()
);
status_t
ret
=
save_settings
(
fSettings
,
"video_settings"
,
"VideoLAN Client"
);
if
(
ret
!=
B_OK
)
fprintf
(
stderr
,
"error saving video settings: %s
\n
"
,
strerror
(
ret
)
);
delete
fSettings
;
}
else
{
// we are just a clone of the default settings
fDefaultSettings
.
SetVideoSize
(
VideoSize
()
);
fDefaultSettings
.
SetFlags
(
Flags
()
);
}
}
/*****************************************************************************
* VideoSettings::DefaultSettings
*****************************************************************************/
VideoSettings
*
VideoSettings
::
DefaultSettings
()
{
return
&
fDefaultSettings
;
}
/*****************************************************************************
* VideoSettings::SetVideoSize
*****************************************************************************/
void
VideoSettings
::
SetVideoSize
(
uint32
mode
)
{
fVideoSize
=
mode
;
}
// static variable initialization
VideoSettings
VideoSettings
::
fDefaultSettings
;
/*****************************************************************************
* VideoWindow constructor and destructor
*****************************************************************************/
...
...
@@ -155,16 +250,15 @@ VideoWindow::VideoWindow(int v_width, int v_height, BRect frame,
:
BWindow
(
frame
,
NULL
,
B_TITLED_WINDOW
,
B_NOT_CLOSABLE
|
B_NOT_MINIMIZABLE
),
i_width
(
frame
.
IntegerWidth
()),
i_height
(
frame
.
IntegerHeight
()),
is_zoomed
(
false
),
vsync
(
false
),
winSize
(
frame
),
i_buffer
(
0
),
teardownwindow
(
false
),
fTrueWidth
(
v_width
),
fTrueHeight
(
v_height
),
fCorrectAspect
(
true
),
fCachedFeel
(
B_NORMAL_WINDOW_FEEL
),
fInterfaceShowing
(
false
),
fInitStatus
(
B_ERROR
)
fInitStatus
(
B_ERROR
),
fSettings
(
new
VideoSettings
(
*
VideoSettings
::
DefaultSettings
()))
{
p_vout
=
p_videoout
;
...
...
@@ -176,17 +270,6 @@ VideoWindow::VideoWindow(int v_width, int v_height, BRect frame,
AddChild
(
mainView
);
mainView
->
AddChild
(
view
);
// figure out if we should use vertical sync by default
BScreen
screen
(
this
);
if
(
screen
.
IsValid
())
{
display_mode
mode
;
screen
.
GetMode
(
&
mode
);
float
refresh
=
(
mode
.
timing
.
pixel_clock
*
1000
)
/
((
mode
.
timing
.
h_total
)
*
(
mode
.
timing
.
v_total
));
vsync
=
(
refresh
<
MIN_AUTO_VSYNC_REFRESH
);
}
// allocate bitmap buffers
for
(
int32
i
=
0
;
i
<
3
;
i
++
)
bitmap
[
i
]
=
NULL
;
...
...
@@ -204,10 +287,11 @@ VideoWindow::VideoWindow(int v_width, int v_height, BRect frame,
(
i_height
*
r
.
min_height_scale
),
i_height
*
r
.
max_height_scale
);
}
if
(
config_GetInt
(
p_vout
,
"fullscreen"
)
)
{
BWindow
::
Zoom
();;
}
// vlc settings override settings from disk
if
(
config_GetInt
(
p_vout
,
"fullscreen"
))
fSettings
->
AddFlags
(
VideoSettings
::
FLAG_FULL_SCREEN
);
_SetToSettings
();
}
VideoWindow
::~
VideoWindow
()
...
...
@@ -217,6 +301,7 @@ VideoWindow::~VideoWindow()
teardownwindow
=
true
;
wait_for_thread
(
fDrawThreadID
,
&
result
);
_FreeBuffers
();
delete
fSettings
;
}
/*****************************************************************************
...
...
@@ -233,12 +318,12 @@ VideoWindow::MessageReceived( BMessage *p_message )
case
RESIZE_50
:
case
RESIZE_100
:
case
RESIZE_200
:
if
(
is_zoomed
)
if
(
IsFullScreen
()
)
BWindow
::
Zoom
();
_SetVideoSize
(
p_message
->
what
);
break
;
case
VERT_SYNC
:
vsync
=
!
vsync
;
SetSyncToRetrace
(
!
IsSyncedToRetrace
())
;
break
;
case
WINDOW_FEEL
:
{
...
...
@@ -247,11 +332,15 @@ VideoWindow::MessageReceived( BMessage *p_message )
{
SetFeel
(
winFeel
);
fCachedFeel
=
winFeel
;
if
(
winFeel
==
B_FLOATING_ALL_WINDOW_FEEL
)
fSettings
->
AddFlags
(
VideoSettings
::
FLAG_ON_TOP_ALL
);
else
fSettings
->
ClearFlags
(
VideoSettings
::
FLAG_ON_TOP_ALL
);
}
}
break
;
case
ASPECT_CORRECT
:
SetCorrectAspectRatio
(
!
fCorrectAspect
);
SetCorrectAspectRatio
(
!
CorrectAspectRatio
()
);
break
;
case
SCREEN_SHOT
:
// save a screen shot
...
...
@@ -299,24 +388,7 @@ VideoWindow::MessageReceived( BMessage *p_message )
void
VideoWindow
::
Zoom
(
BPoint
origin
,
float
width
,
float
height
)
{
if
(
is_zoomed
)
{
MoveTo
(
winSize
.
left
,
winSize
.
top
);
ResizeTo
(
winSize
.
IntegerWidth
(),
winSize
.
IntegerHeight
());
be_app
->
ShowCursor
();
fInterfaceShowing
=
true
;
}
else
{
BScreen
screen
(
this
);
BRect
rect
=
screen
.
Frame
();
Activate
();
MoveTo
(
0.0
,
0.0
);
ResizeTo
(
rect
.
IntegerWidth
(),
rect
.
IntegerHeight
());
be_app
->
ObscureCursor
();
fInterfaceShowing
=
false
;
}
is_zoomed
=
!
is_zoomed
;
ToggleFullScreen
();
}
/*****************************************************************************
...
...
@@ -325,8 +397,9 @@ VideoWindow::Zoom(BPoint origin, float width, float height )
void
VideoWindow
::
FrameMoved
(
BPoint
origin
)
{
if
(
is_zoomed
)
return
;
winSize
=
Frame
();
if
(
IsFullScreen
())
return
;
winSize
=
Frame
();
}
/*****************************************************************************
...
...
@@ -335,8 +408,8 @@ VideoWindow::FrameMoved(BPoint origin)
void
VideoWindow
::
FrameResized
(
float
width
,
float
height
)
{
int32
useWidth
=
fCorrectAspect
?
i_width
:
fTrueWidth
;
int32
useHeight
=
fCorrectAspect
?
i_height
:
fTrueHeight
;
int32
useWidth
=
CorrectAspectRatio
()
?
i_width
:
fTrueWidth
;
int32
useHeight
=
CorrectAspectRatio
()
?
i_height
:
fTrueHeight
;
float
out_width
,
out_height
;
float
out_left
,
out_top
;
float
width_scale
=
width
/
useWidth
;
...
...
@@ -359,7 +432,7 @@ VideoWindow::FrameResized( float width, float height )
view
->
MoveTo
(
out_left
,
out_top
);
view
->
ResizeTo
(
out_width
,
out_height
);
if
(
!
is_zoomed
)
if
(
!
IsFullScreen
()
)
winSize
=
Frame
();
}
...
...
@@ -374,8 +447,7 @@ VideoWindow::ScreenChanged(BRect frame, color_space format)
screen
.
GetMode
(
&
mode
);
float
refresh
=
(
mode
.
timing
.
pixel_clock
*
1000
)
/
((
mode
.
timing
.
h_total
)
*
(
mode
.
timing
.
v_total
));
if
(
refresh
<
MIN_AUTO_VSYNC_REFRESH
)
vsync
=
true
;
SetSyncToRetrace
(
refresh
<
MIN_AUTO_VSYNC_REFRESH
);
}
/*****************************************************************************
...
...
@@ -395,7 +467,7 @@ VideoWindow::drawBuffer(int bufferIndex)
i_buffer
=
bufferIndex
;
// sync to the screen if required
if
(
vsync
)
if
(
IsSyncedToRetrace
()
)
{
BScreen
screen
(
this
);
screen
.
WaitForRetrace
(
22000
);
...
...
@@ -464,13 +536,92 @@ VideoWindow::SetInterfaceShowing(bool showIt)
void
VideoWindow
::
SetCorrectAspectRatio
(
bool
doIt
)
{
if
(
fCorrectAspect
!=
doIt
)
if
(
CorrectAspectRatio
()
!=
doIt
)
{
fCorrectAspect
=
doIt
;
if
(
doIt
)
fSettings
->
AddFlags
(
VideoSettings
::
FLAG_CORRECT_RATIO
);
else
fSettings
->
ClearFlags
(
VideoSettings
::
FLAG_CORRECT_RATIO
);
FrameResized
(
Bounds
().
Width
(),
Bounds
().
Height
());
}
}
/*****************************************************************************
* VideoWindow::CorrectAspectRatio
*****************************************************************************/
bool
VideoWindow
::
CorrectAspectRatio
()
const
{
return
fSettings
->
HasFlags
(
VideoSettings
::
FLAG_CORRECT_RATIO
);
}
/*****************************************************************************
* VideoWindow::ToggleFullScreen
*****************************************************************************/
void
VideoWindow
::
ToggleFullScreen
()
{
SetFullScreen
(
!
IsFullScreen
());
}
/*****************************************************************************
* VideoWindow::SetFullScreen
*****************************************************************************/
void
VideoWindow
::
SetFullScreen
(
bool
doIt
)
{
if
(
doIt
)
{
BScreen
screen
(
this
);
BRect
rect
=
screen
.
Frame
();
Activate
();
MoveTo
(
0.0
,
0.0
);
ResizeTo
(
rect
.
IntegerWidth
(),
rect
.
IntegerHeight
());
be_app
->
ObscureCursor
();
fInterfaceShowing
=
false
;
fSettings
->
AddFlags
(
VideoSettings
::
FLAG_FULL_SCREEN
);
}
else
{
MoveTo
(
winSize
.
left
,
winSize
.
top
);
ResizeTo
(
winSize
.
IntegerWidth
(),
winSize
.
IntegerHeight
());
be_app
->
ShowCursor
();
fInterfaceShowing
=
true
;
fSettings
->
ClearFlags
(
VideoSettings
::
FLAG_FULL_SCREEN
);
}
}
/*****************************************************************************
* VideoWindow::IsFullScreen
*****************************************************************************/
bool
VideoWindow
::
IsFullScreen
()
const
{
return
fSettings
->
HasFlags
(
VideoSettings
::
FLAG_FULL_SCREEN
);
}
/*****************************************************************************
* VideoWindow::SetSyncToRetrace
*****************************************************************************/
void
VideoWindow
::
SetSyncToRetrace
(
bool
doIt
)
{
if
(
doIt
)
fSettings
->
AddFlags
(
VideoSettings
::
FLAG_SYNC_RETRACE
);
else
fSettings
->
ClearFlags
(
VideoSettings
::
FLAG_SYNC_RETRACE
);
}
/*****************************************************************************
* VideoWindow::IsSyncedToRetrace
*****************************************************************************/
bool
VideoWindow
::
IsSyncedToRetrace
()
const
{
return
fSettings
->
HasFlags
(
VideoSettings
::
FLAG_SYNC_RETRACE
);
}
/*****************************************************************************
* VideoWindow::_AllocateBuffers
*****************************************************************************/
...
...
@@ -651,8 +802,8 @@ void
VideoWindow
::
_SetVideoSize
(
uint32
mode
)
{
// let size depend on aspect correction
int32
width
=
fCorrectAspect
?
i_width
:
fTrueWidth
;
int32
height
=
fCorrectAspect
?
i_height
:
fTrueHeight
;
int32
width
=
CorrectAspectRatio
()
?
i_width
:
fTrueWidth
;
int32
height
=
CorrectAspectRatio
()
?
i_height
:
fTrueHeight
;
switch
(
mode
)
{
case
RESIZE_50
:
...
...
@@ -667,8 +818,42 @@ VideoWindow::_SetVideoSize(uint32 mode)
default:
break
;
}
fSettings
->
ClearFlags
(
VideoSettings
::
FLAG_FULL_SCREEN
);
ResizeTo
(
width
,
height
);
is_zoomed
=
false
;
}
/*****************************************************************************
* VideoWindow::_SetToSettings
*****************************************************************************/
void
VideoWindow
::
_SetToSettings
()
{
// adjust dimensions
uint32
mode
=
RESIZE_100
;
switch
(
fSettings
->
VideoSize
())
{
case
VideoSettings
:
:
SIZE_50
:
mode
=
RESIZE_50
;
break
;
case
VideoSettings
:
:
SIZE_200
:
mode
=
RESIZE_200
;
break
;
case
VideoSettings
:
:
SIZE_100
:
case
VideoSettings
:
:
SIZE_OTHER
:
default:
break
;
}
bool
fullscreen
=
IsFullScreen
();
// remember settings
_SetVideoSize
(
mode
);
// because this will reset settings
// the fullscreen status is reflected in the settings,
// but not yet in the windows state
if
(
fullscreen
)
SetFullScreen
(
true
);
if
(
fSettings
->
HasFlags
(
VideoSettings
::
FLAG_ON_TOP_ALL
))
fCachedFeel
=
B_FLOATING_ALL_WINDOW_FEEL
;
else
fCachedFeel
=
B_NORMAL_WINDOW_FEEL
;
SetFeel
(
fCachedFeel
);
}
/*****************************************************************************
...
...
@@ -683,8 +868,8 @@ VideoWindow::_SaveScreenShot( BBitmap* bitmap, char* path,
info
->
bitmap
=
bitmap
;
info
->
path
=
path
;
info
->
translatorID
=
translatorID
;
info
->
width
=
fCorrectAspect
?
i_width
:
fTrueWidth
;
info
->
height
=
fCorrectAspect
?
i_height
:
fTrueHeight
;
info
->
width
=
CorrectAspectRatio
()
?
i_width
:
fTrueWidth
;
info
->
height
=
CorrectAspectRatio
()
?
i_height
:
fTrueHeight
;
// spawn a new thread to take care of the actual saving to disk
thread_id
thread
=
spawn_thread
(
_save_screen_shot
,
"screen shot saver"
,
...
...
@@ -921,14 +1106,14 @@ VLCView::MouseDown(BPoint where)
menu
->
AddItem
(
doubleItem
);
// Toggle FullScreen
BMenuItem
*
zoomItem
=
new
BMenuItem
(
"Fullscreen"
,
new
BMessage
(
TOGGLE_FULL_SCREEN
));
zoomItem
->
SetMarked
(
videoWindow
->
is_zoomed
);
zoomItem
->
SetMarked
(
videoWindow
->
IsFullScreen
()
);
menu
->
AddItem
(
zoomItem
);
menu
->
AddSeparatorItem
();
// Toggle vSync
BMenuItem
*
vsyncItem
=
new
BMenuItem
(
"Vertical Sync"
,
new
BMessage
(
VERT_SYNC
));
vsyncItem
->
SetMarked
(
videoWindow
->
vsync
);
vsyncItem
->
SetMarked
(
videoWindow
->
IsSyncedToRetrace
()
);
menu
->
AddItem
(
vsyncItem
);
// Correct Aspect Ratio
BMenuItem
*
aspectItem
=
new
BMenuItem
(
"Correct Aspect Ratio"
,
new
BMessage
(
ASPECT_CORRECT
));
...
...
@@ -1032,7 +1217,7 @@ VLCView::Pulse()
fCursorHidden
=
true
;
VideoWindow
*
videoWindow
=
dynamic_cast
<
VideoWindow
*>
(
Window
());
// hide the interface window as well if full screen
if
(
videoWindow
&&
videoWindow
->
is_zoomed
)
if
(
videoWindow
&&
videoWindow
->
IsFullScreen
()
)
videoWindow
->
SetInterfaceShowing
(
false
);
}
}
...
...
@@ -1057,7 +1242,7 @@ VLCView::KeyDown(const char *bytes, int32 numBytes)
break
;
case
B_ESCAPE
:
// go back to window mode
if
(
videoWindow
->
is_zoomed
)
if
(
videoWindow
->
IsFullScreen
()
)
videoWindow
->
PostMessage
(
TOGGLE_FULL_SCREEN
);
break
;
case
B_SPACE
:
...
...
modules/gui/beos/VideoWindow.h
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* VideoWindow.h: BeOS video window class prototype
*****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: VideoWindow.h,v 1.
5 2002/12/07 22:00:36 titer
Exp $
* $Id: VideoWindow.h,v 1.
6 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Tony Castley <tcastley@mail.powerup.com.au>
...
...
@@ -55,6 +55,54 @@ colorcombo colspace[]=
#define COLOR_COUNT 5
#define DEFAULT_COL 3
class
VideoSettings
{
public:
VideoSettings
(
const
VideoSettings
&
clone
);
virtual
~
VideoSettings
();
static
VideoSettings
*
DefaultSettings
();
enum
{
SIZE_OTHER
=
0
,
SIZE_50
=
1
,
SIZE_100
=
2
,
SIZE_200
=
3
,
};
void
SetVideoSize
(
uint32
mode
);
inline
uint32
VideoSize
()
const
{
return
fVideoSize
;
}
enum
{
FLAG_CORRECT_RATIO
=
0x0001
,
FLAG_SYNC_RETRACE
=
0x0002
,
FLAG_ON_TOP_ALL
=
0x0004
,
FLAG_FULL_SCREEN
=
0x0008
,
};
inline
void
SetFlags
(
uint32
flags
)
{
fFlags
=
flags
;
}
inline
void
AddFlags
(
uint32
flags
)
{
fFlags
|=
flags
;
}
inline
void
ClearFlags
(
uint32
flags
)
{
fFlags
&=
~
flags
;
}
inline
bool
HasFlags
(
uint32
flags
)
const
{
return
fFlags
&
flags
;
}
inline
uint32
Flags
()
const
{
return
fFlags
;
}
private:
VideoSettings
();
// reserved for default settings
static
VideoSettings
fDefaultSettings
;
uint32
fVideoSize
;
uint32
fFlags
;
BMessage
*
fSettings
;
};
class
VLCView
:
public
BView
{
...
...
@@ -107,8 +155,14 @@ public:
void
SetInterfaceShowing
(
bool
showIt
);
void
SetCorrectAspectRatio
(
bool
doIt
);
inline
bool
CorrectAspectRatio
()
const
{
return
fCorrectAspect
;
}
bool
CorrectAspectRatio
()
const
;
void
ToggleFullScreen
();
void
SetFullScreen
(
bool
doIt
);
bool
IsFullScreen
()
const
;
void
SetOnTop
(
bool
doIt
);
bool
IsOnTop
()
const
;
void
SetSyncToRetrace
(
bool
doIt
);
bool
IsSyncedToRetrace
()
const
;
inline
status_t
InitCheck
()
const
{
return
fInitStatus
;
}
...
...
@@ -117,9 +171,8 @@ public:
int32
i_width
;
// aspect corrected bitmap size
int32
i_height
;
BRect
winSize
;
// current window size
bool
is_zoomed
,
vsync
;
BBitmap
*
bitmap
[
3
];
BBitmap
*
overlaybitmap
;
//
BBitmap *overlaybitmap;
VLCView
*
view
;
int
i_buffer
;
volatile
bool
teardownwindow
;
...
...
@@ -134,6 +187,7 @@ private:
void
_FreeBuffers
();
void
_BlankBitmap
(
BBitmap
*
bitmap
)
const
;
void
_SetVideoSize
(
uint32
mode
);
void
_SetToSettings
();
void
_SaveScreenShot
(
BBitmap
*
bitmap
,
char
*
path
,
...
...
@@ -153,10 +207,10 @@ private:
int32
fTrueWidth
;
// incomming bitmap size
int32
fTrueHeight
;
bool
fCorrectAspect
;
window_feel
fCachedFeel
;
bool
fInterfaceShowing
;
status_t
fInitStatus
;
VideoSettings
*
fSettings
;
};
#endif // BEOS_VIDEO_WINDOW_H
...
...
modules/gui/beos/VlcWrapper.cpp
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* VlcWrapper.cpp: BeOS plugin for vlc (derived from MacOS X port)
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: VlcWrapper.cpp,v 1.2
3 2003/01/29 00:02:09 titer
Exp $
* $Id: VlcWrapper.cpp,v 1.2
4 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
...
...
@@ -358,35 +358,47 @@ bool VlcWrapper::IsPlaying()
* playlist *
************/
void
VlcWrapper
::
OpenFiles
(
BList
*
o_files
,
bool
replace
)
void
VlcWrapper
::
OpenFiles
(
BList
*
o_files
,
bool
replace
,
int32
index
)
{
BString
*
o_file
;
int
size
=
PlaylistSize
();
bool
wasEmpty
=
(
size
<
1
);
/* delete current playlist */
if
(
replace
)
{
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
playlist_Delete
(
p_playlist
,
0
);
}
}
/* append files */
while
(
(
o_file
=
(
BString
*
)
o_files
->
LastItem
()
)
)
{
playlist_Add
(
p_playlist
,
o_file
->
String
(),
PLAYLIST_APPEND
,
PLAYLIST_END
);
o_files
->
RemoveItem
(
o_files
->
CountItems
()
-
1
);
}
/* eventually restart playing */
if
(
replace
||
wasEmpty
)
{
playlist_Stop
(
p_playlist
);
playlist_Play
(
p_playlist
);
}
if
(
o_files
&&
o_files
->
CountItems
()
>
0
)
{
int
size
=
PlaylistSize
();
bool
wasEmpty
=
(
size
<
1
);
if
(
index
==
-
1
)
index
=
PLAYLIST_END
;
int
mode
=
index
==
PLAYLIST_END
?
PLAYLIST_APPEND
:
PLAYLIST_INSERT
;
/* delete current playlist */
if
(
replace
)
{
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
playlist_Delete
(
p_playlist
,
0
);
}
}
/* insert files */
int32
count
=
o_files
->
CountItems
();
for
(
int32
i
=
count
-
1
;
i
>=
0
;
i
--
)
{
if
(
BString
*
o_file
=
(
BString
*
)
o_files
->
RemoveItem
(
i
)
)
{
playlist_Add
(
p_playlist
,
o_file
->
String
(),
mode
,
index
);
if
(
mode
==
PLAYLIST_INSERT
)
index
++
;
delete
o_file
;
}
}
// TODO: implement a user setting
// if to start automatically
/* eventually restart playing */
if
(
replace
||
wasEmpty
)
{
playlist_Stop
(
p_playlist
);
playlist_Play
(
p_playlist
);
}
}
}
void
VlcWrapper
::
OpenDisc
(
BString
o_type
,
BString
o_device
,
int
i_title
,
int
i_chapter
)
...
...
@@ -455,11 +467,15 @@ void VlcWrapper::GetPlaylistInfo( int32& currentIndex, int32& maxIndex )
maxIndex
=
-
1
;
if
(
p_playlist
)
{
vlc_mutex_lock
(
&
p_playlist
->
object_lock
);
maxIndex
=
p_playlist
->
i_size
;
if
(
maxIndex
>
0
)
currentIndex
=
p_playlist
->
i_index
+
1
;
currentIndex
=
p_playlist
->
i_index
/* + 1 -> why?!?*/
;
else
maxIndex
=
-
1
;
vlc_mutex_unlock
(
&
p_playlist
->
object_lock
);
}
}
...
...
@@ -611,6 +627,131 @@ void VlcWrapper::NavigateNext()
PlaylistNext
();
}
/*************************
* Playlist manipulation *
*************************/
// PlaylistLock
bool
VlcWrapper
::
PlaylistLock
()
const
{
// TODO: search and destroy -> deadlock!
return
true
;
if
(
p_playlist
)
{
vlc_mutex_lock
(
&
p_playlist
->
object_lock
);
return
true
;
}
return
false
;
}
// PlaylistUnlock
void
VlcWrapper
::
PlaylistUnlock
()
const
{
// TODO: search and destroy -> deadlock!
return
;
vlc_mutex_unlock
(
&
p_playlist
->
object_lock
);
}
// PlaylistItemAt
void
*
VlcWrapper
::
PlaylistItemAt
(
int
index
)
const
{
playlist_item_t
*
item
=
NULL
;
if
(
index
>=
0
&&
index
<
p_playlist
->
i_size
)
item
=
p_playlist
->
pp_items
[
index
];
return
(
void
*
)
item
;
}
// PlaylistRemoveItem
void
*
VlcWrapper
::
PlaylistRemoveItem
(
int
index
)
const
{
playlist_item_t
*
copy
=
NULL
;
// check if item exists at the provided index
if
(
index
>=
0
&&
index
<
p_playlist
->
i_size
)
{
playlist_item_t
*
item
=
p_playlist
->
pp_items
[
index
];
if
(
item
)
{
// make a copy of the removed item
copy
=
(
playlist_item_t
*
)
PlaylistCloneItem
(
(
void
*
)
item
);
// remove item from playlist (unfortunately, this frees it)
playlist_Delete
(
p_playlist
,
index
);
}
}
return
(
void
*
)
copy
;
}
// PlaylistRemoveItem
void
*
VlcWrapper
::
PlaylistRemoveItem
(
void
*
item
)
const
{
playlist_item_t
*
copy
=
NULL
;
for
(
int32
i
=
0
;
i
<
p_playlist
->
i_size
;
i
++
)
{
if
(
p_playlist
->
pp_items
[
i
]
==
item
)
{
copy
=
(
playlist_item_t
*
)
PlaylistRemoveItem
(
i
);
break
;
}
}
return
(
void
*
)
copy
;
}
// PlaylistAddItem
bool
VlcWrapper
::
PlaylistAddItem
(
void
*
item
,
int
index
)
const
{
if
(
item
)
{
playlist_AddItem
(
p_playlist
,
(
playlist_item_t
*
)
item
,
PLAYLIST_INSERT
,
index
);
}
// TODO: once playlist is returning useful info, return that instead
return
true
;
}
// PlaylistCloneItem
void
*
VlcWrapper
::
PlaylistCloneItem
(
void
*
castToItem
)
const
{
playlist_item_t
*
copy
=
NULL
;
playlist_item_t
*
item
=
(
playlist_item_t
*
)
castToItem
;
if
(
item
)
{
copy
=
(
playlist_item_t
*
)
malloc
(
sizeof
(
playlist_item_t
)
);
if
(
copy
)
{
// make a copy of the item at index
copy
->
psz_name
=
strdup
(
item
->
psz_name
);
copy
->
psz_uri
=
strdup
(
item
->
psz_uri
);
copy
->
i_type
=
item
->
i_type
;
copy
->
i_status
=
item
->
i_status
;
copy
->
b_autodeletion
=
item
->
b_autodeletion
;
}
}
return
(
void
*
)
copy
;
}
// Careful! You need to know what you're doing here!
// The reason for having it, is to be able to deal with
// the rather lame list implementation of the playlist.
// It is meant to help manipulate the playlist with the above
// methods while keeping it valid.
//
// PlaylistSetPlaying
void
VlcWrapper
::
PlaylistSetPlaying
(
int
index
)
const
{
if
(
index
<
0
)
index
=
0
;
if
(
index
>=
p_playlist
->
i_size
)
index
=
p_playlist
->
i_size
-
1
;
p_playlist
->
i_index
=
index
;
}
/*********
* audio *
...
...
@@ -853,7 +994,7 @@ void VlcWrapper::ChapterInfo( int32 ¤tIndex, int32 &maxIndex )
* Miscellanous *
****************/
void
VlcWrapper
::
LoadSubFile
(
char
*
psz_file
)
void
VlcWrapper
::
LoadSubFile
(
c
onst
c
har
*
psz_file
)
{
config_PutPsz
(
p_intf
,
"sub-file"
,
strdup
(
psz_file
)
);
}
...
...
modules/gui/beos/VlcWrapper.h
View file @
49173f5e
...
...
@@ -2,7 +2,7 @@
* VlcWrapper.h: BeOS plugin for vlc (derived from MacOS X port)
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: VlcWrapper.h,v 1.1
8 2003/01/29 00:02:09 titer
Exp $
* $Id: VlcWrapper.h,v 1.1
9 2003/02/01 12:01:11 stippi
Exp $
*
* Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net>
...
...
@@ -79,7 +79,8 @@ public:
bool
IsPlaying
();
/* Playlist */
void
OpenFiles
(
BList
*
o_files
,
bool
replace
=
true
);
void
OpenFiles
(
BList
*
o_files
,
bool
replace
=
true
,
int32
index
=
-
1
);
void
OpenDisc
(
BString
o_type
,
BString
o_device
,
int
i_title
,
int
i_chapter
);
int
PlaylistSize
();
...
...
@@ -99,6 +100,21 @@ public:
void
NavigatePrev
();
void
NavigateNext
();
/* Playlist manipulation */
bool
PlaylistLock
()
const
;
void
PlaylistUnlock
()
const
;
// playlist must be locked prior to calling all of these!
void
*
PlaylistItemAt
(
int
index
)
const
;
// both functions return a copy of the removed item
// so that it can be added at another index
void
*
PlaylistRemoveItem
(
int
index
)
const
;
void
*
PlaylistRemoveItem
(
void
*
item
)
const
;
// uses playlist_AddItem()
bool
PlaylistAddItem
(
void
*
item
,
int
index
)
const
;
void
*
PlaylistCloneItem
(
void
*
item
)
const
;
// only modifies playlist, doesn't effect playback
void
PlaylistSetPlaying
(
int
index
)
const
;
/* Audio */
bool
HasAudio
();
unsigned
short
GetVolume
();
...
...
@@ -123,7 +139,7 @@ public:
void
ChapterInfo
(
int32
&
currentIndex
,
int32
&
maxIndex
);
/* Miscellanous */
void
LoadSubFile
(
char
*
psz_file
);
void
LoadSubFile
(
c
onst
c
har
*
psz_file
);
void
FilterChange
();
private:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment