Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
fd1da66f
Commit
fd1da66f
authored
May 06, 2001
by
Stéphane Borel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* Gnome playlist should work better with the files to create it :)
parent
bc118e19
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
751 additions
and
0 deletions
+751
-0
plugins/gnome/gnome_playlist.c
plugins/gnome/gnome_playlist.c
+716
-0
plugins/gnome/gnome_playlist.h
plugins/gnome/gnome_playlist.h
+35
-0
No files found.
plugins/gnome/gnome_playlist.c
0 → 100644
View file @
fd1da66f
/*****************************************************************************
* gnome_playlist.c : Interface for the playlist dialog
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: gnome_playlist.c,v 1.1 2001/05/06 18:41:52 stef Exp $
*
* Authors: Pierre Baillet <oct@zoy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#define MODULE_NAME gnome
#include "modules_inner.h"
/*****************************************************************************
* Preamble
*****************************************************************************/
#include "defs.h"
#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
#include <sys/types.h>
/* for readdir and stat stuff */
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include "config.h"
#include "common.h"
#include "threads.h"
#include "mtime.h"
#include "stream_control.h"
#include "input_ext-intf.h"
#include "interface.h"
#include "intf_playlist.h"
#include "intf_msg.h"
#include "intf_urldecode.h"
#include "gnome_callbacks.h"
#include "gnome_interface.h"
#include "gnome_support.h"
#include "gnome_playlist.h"
#include "intf_gnome.h"
#include "main.h"
/*****************************************************************************
* Playlist callbacks
*****************************************************************************
* The following callbacks are related to the playlist.
*****************************************************************************/
void
on_intf_playlist_destroy
(
GtkObject
*
object
,
gpointer
user_data
)
{
gtk_widget_hide
(
GTK_WIDGET
(
object
));
}
void
on_playlist_ok_clicked
(
GtkButton
*
button
,
gpointer
user_data
)
{
gtk_widget_hide
(
gtk_widget_get_toplevel
(
GTK_WIDGET
(
button
)
)
);
}
void
on_playlist_apply_clicked
(
GtkButton
*
button
,
gpointer
user_data
)
{
}
void
on_playlist_cancel_clicked
(
GtkButton
*
button
,
gpointer
user_data
)
{
gtk_widget_hide
(
gtk_widget_get_toplevel
(
GTK_WIDGET
(
button
)
)
);
}
void
on_playlist_close_clicked
(
GtkButton
*
button
,
gpointer
user_data
)
{
gtk_widget_hide
(
gtk_widget_get_toplevel
(
GTK_WIDGET
(
button
)
)
);
}
void
on_playlist_disc_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
menuitem
),
"intf_playlist"
);
/* If we have never used the file selector, open it */
if
(
!
GTK_IS_WIDGET
(
p_intf
->
p_sys
->
p_disc
)
)
{
p_intf
->
p_sys
->
p_disc
=
create_intf_disc
();
gtk_object_set_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_disc
),
"p_intf"
,
p_intf
);
}
gtk_widget_show
(
p_intf
->
p_sys
->
p_disc
);
gdk_window_raise
(
p_intf
->
p_sys
->
p_disc
->
window
);
}
void
on_playlist_file_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
menuitem
),
"intf_playlist"
);
/* If we have never used the file selector, open it */
if
(
!
GTK_IS_WIDGET
(
p_intf
->
p_sys
->
p_fileopen
)
)
{
p_intf
->
p_sys
->
p_fileopen
=
create_intf_fileopen
();
gtk_object_set_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_fileopen
),
"p_intf"
,
p_intf
);
}
gtk_widget_show
(
p_intf
->
p_sys
->
p_fileopen
);
gdk_window_raise
(
p_intf
->
p_sys
->
p_fileopen
->
window
);
}
void
on_playlist_network_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
menuitem
),
"intf_playlist"
);
/* If we have never used the file selector, open it */
if
(
!
GTK_IS_WIDGET
(
p_intf
->
p_sys
->
p_network
)
)
{
p_intf
->
p_sys
->
p_network
=
create_intf_network
();
gtk_object_set_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_network
),
"p_intf"
,
p_intf
);
}
gtk_widget_show
(
p_intf
->
p_sys
->
p_network
);
gdk_window_raise
(
p_intf
->
p_sys
->
p_network
->
window
);
}
void
on_playlist_url_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
}
void
on_playlist_delete_all_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
}
void
on_playlist_delete_item_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
/* user wants to delete a file in the queue */
GList
*
p_selection
;
GtkCList
*
p_clist
;
playlist_t
*
p_playlist
;
/* catch the thread back */
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
menuitem
),
"intf_playlist"
);
p_playlist
=
p_main
->
p_playlist
;
/* lock the struct */
vlc_mutex_lock
(
&
p_intf
->
change_lock
);
p_clist
=
GTK_CLIST
(
gtk_object_get_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_playlist
),
"playlist_clist"
)
);
/* I use UNDOCUMENTED features to retrieve the selection... */
p_selection
=
p_clist
->
selection
;
if
(
g_list_length
(
p_selection
)
>
0
)
{
/* reverse-sort so that we can delete from the furthest
* to the closest item to delete...
*/
p_selection
=
g_list_sort
(
p_selection
,
GnomeCompareItems
);
g_list_foreach
(
p_selection
,
GnomeDeleteGListItem
,
p_intf
);
/* rebuild the CList */
GnomeRebuildCList
(
p_clist
,
p_playlist
);
}
vlc_mutex_unlock
(
&
p_intf
->
change_lock
);
}
void
on_playlist_crop_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
/* Ok, this is a really small thing, but, hey, it works and
might be useful, who knows ? */
on_playlist_invert_activate
(
menuitem
,
user_data
);
on_playlist_delete_item_activate
(
menuitem
,
user_data
);
}
void
on_playlist_invert_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
playlist_t
*
p_playlist
;
GtkCList
*
p_clist
;
int
*
pi_selected
;
int
i_sel_l
;
int
i_dummy
;
/* catch the thread back */
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
menuitem
),
"intf_playlist"
);
p_playlist
=
p_main
->
p_playlist
;
/* lock the struct */
vlc_mutex_lock
(
&
p_intf
->
change_lock
);
p_clist
=
GTK_CLIST
(
gtk_object_get_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_playlist
),
"playlist_clist"
)
);
/* have to copy the selection to an int *
I wasn't able to copy the g_list to another g_list
glib only does pointer copies, not real copies :( */
pi_selected
=
malloc
(
sizeof
(
int
)
*
g_list_length
(
p_clist
->
selection
)
);
i_sel_l
=
g_list_length
(
p_clist
->
selection
);
for
(
i_dummy
=
0
;
i_dummy
<
i_sel_l
;
i_dummy
++
)
{
pi_selected
[
i_dummy
]
=
(
int
)
g_list_nth_data
(
p_clist
->
selection
,
i_dummy
);
}
gtk_clist_freeze
(
p_clist
);
gtk_clist_select_all
(
p_clist
);
for
(
i_dummy
=
0
;
i_dummy
<
i_sel_l
;
i_dummy
++
)
{
gtk_clist_unselect_row
(
p_clist
,
pi_selected
[
i_dummy
],
0
);
gtk_clist_unselect_row
(
p_clist
,
pi_selected
[
i_dummy
],
1
);
}
free
(
pi_selected
);
gtk_clist_thaw
(
p_clist
);
vlc_mutex_unlock
(
&
p_intf
->
change_lock
);
}
void
on_playlist_select_activate
(
GtkMenuItem
*
menuitem
,
gpointer
user_data
)
{
}
gboolean
on_playlist_clist_event
(
GtkWidget
*
widget
,
GdkEvent
*
event
,
gpointer
user_data
)
{
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
widget
),
"intf_playlist"
);
if
(
(
event
->
button
).
type
==
GDK_2BUTTON_PRESS
)
{
GtkCList
*
p_clist
;
gint
i_row
;
gint
i_col
;
p_clist
=
GTK_CLIST
(
gtk_object_get_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_playlist
),
"playlist_clist"
)
);
if
(
gtk_clist_get_selection_info
(
p_clist
,
(
event
->
button
).
x
,
(
event
->
button
).
y
,
&
i_row
,
&
i_col
)
==
1
)
{
/* clicked is in range. */
if
(
p_intf
->
p_input
!=
NULL
)
{
/* FIXME: temporary hack */
p_intf
->
p_input
->
b_eof
=
1
;
}
intf_PlaylistJumpto
(
p_main
->
p_playlist
,
i_row
-
1
);
}
return
TRUE
;
}
return
FALSE
;
}
void
on_playlist_clist_drag_data_received
(
GtkWidget
*
widget
,
GdkDragContext
*
drag_context
,
gint
x
,
gint
y
,
GtkSelectionData
*
data
,
guint
info
,
guint
time
,
gpointer
user_data
)
{
/* catch the interface back */
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
widget
),
"intf_playlist"
);
GtkCList
*
p_clist
;
gint
i_row
;
gint
i_col
;
p_clist
=
GTK_CLIST
(
gtk_object_get_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_playlist
),
"playlist_clist"
)
);
if
(
gtk_clist_get_selection_info
(
p_clist
,
x
,
y
,
&
i_row
,
&
i_col
)
==
1
)
{
/* we are dropping somewhere into the clist items */
GnomeDropDataReceived
(
p_intf
,
data
,
info
,
i_row
);
}
else
{
/* else, put that at the end of the playlist */
GnomeDropDataReceived
(
p_intf
,
data
,
info
,
PLAYLIST_END
);
}
}
gboolean
on_playlist_clist_drag_motion
(
GtkWidget
*
widget
,
GdkDragContext
*
drag_context
,
gint
x
,
gint
y
,
guint
time
,
gpointer
user_data
)
{
GtkCList
*
p_clist
;
gint
i_row
;
gint
i_col
;
int
i_dummy
;
GdkColor
color
;
intf_thread_t
*
p_intf
=
GetIntf
(
GTK_WIDGET
(
widget
),
"intf_playlist"
);
p_clist
=
GTK_CLIST
(
gtk_object_get_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_playlist
),
"playlist_clist"
)
);
if
(
!
GTK_WIDGET_TOPLEVEL
(
widget
)
)
{
gdk_window_raise
(
p_intf
->
p_sys
->
p_playlist
->
window
);
}
color
.
red
=
0xffff
;
color
.
blue
=
0xffff
;
color
.
green
=
0xffff
;
gtk_clist_freeze
(
p_clist
);
for
(
i_dummy
=
0
;
i_dummy
<
p_clist
->
rows
;
i_dummy
++
)
{
gtk_clist_set_background
(
p_clist
,
i_dummy
,
&
color
);
}
color
.
red
=
0xffff
;
color
.
blue
=
0
;
color
.
green
=
0
;
gtk_clist_set_background
(
p_clist
,
p_main
->
p_playlist
->
i_index
,
&
color
);
if
(
gtk_clist_get_selection_info
(
p_clist
,
x
,
y
,
&
i_row
,
&
i_col
)
==
1
)
{
color
.
red
=
0
;
color
.
blue
=
0xf000
;
color
.
green
=
0x9000
;
gtk_clist_set_background
(
p_clist
,
i_row
-
1
,
&
color
);
gtk_clist_set_background
(
p_clist
,
i_row
,
&
color
);
}
gtk_clist_thaw
(
p_clist
);
return
TRUE
;
}
void
GnomeDropDataReceived
(
intf_thread_t
*
p_intf
,
GtkSelectionData
*
p_data
,
guint
i_info
,
int
i_position
)
{
/* first we'll have to split against all the '\n' we have */
gchar
*
p_protocol
;
gchar
*
p_temp
;
gchar
*
p_string
=
p_data
->
data
;
GList
*
p_files
=
NULL
;
GtkCList
*
p_clist
;
/* catch the playlist back */
playlist_t
*
p_playlist
=
p_main
->
p_playlist
;
/* if this has been URLencoded, decode it
*
* Is it a good thing to do it in place ?
* probably not...
*/
if
(
i_info
==
DROP_ACCEPT_TEXT_URI_LIST
)
{
urldecode_path
(
p_string
);
}
/* this cuts string into single file drops */
/* this code was borrowed from xmms, thx guys :) */
while
(
*
p_string
)
{
p_temp
=
strchr
(
p_string
,
'\n'
);
if
(
p_temp
)
{
if
(
*
(
p_temp
-
1
)
==
'\r'
)
{
*
(
p_temp
-
1
)
=
'\0'
;
}
*
p_temp
=
'\0'
;
}
/* do we have a protocol or something ? */
p_protocol
=
strstr
(
p_string
,
":/"
);
if
(
p_protocol
!=
NULL
)
{
p_protocol
=
calloc
(
p_protocol
-
p_string
+
2
,
sizeof
(
char
)
);
p_protocol
=
strncpy
(
p_protocol
,
p_string
,
strstr
(
p_string
,
":/"
)
+
1
-
p_string
);
intf_WarnMsg
(
1
,
"Protocol dropped is %s"
,
p_protocol
);
p_string
+=
strlen
(
p_protocol
);
/* Allowed things are proto: or proto:// */
if
(
p_string
[
0
]
==
'/'
&&
p_string
[
1
]
==
'/'
)
{
/* eat one '/' */
p_string
++
;
}
intf_WarnMsg
(
1
,
" Dropped %s"
,
p_string
);
}
else
{
p_protocol
=
strdup
(
""
);
}
/* if it uses the file protocol we can do something, else, sorry :(
* I think this is a good choice for now, as we don't have any
* ability to read http:// or ftp:// files
* what about adding dvd:// to the list of authorized proto ? */
if
(
strcmp
(
p_protocol
,
"file:"
)
==
0
)
{
p_files
=
g_list_concat
(
p_files
,
GnomeReadFiles
(
p_string
)
);
}
/* free the malloc and go on... */
free
(
p_protocol
);
if
(
!
p_temp
)
{
break
;
}
p_string
=
p_temp
+
1
;
}
/* At this point, we have a nice big list maybe NULL */
if
(
p_files
!=
NULL
)
{
/* lock the interface */
vlc_mutex_lock
(
&
p_intf
->
change_lock
);
intf_WarnMsg
(
1
,
"List has %d elements"
,
g_list_length
(
p_files
)
);
GnomeAppendList
(
p_playlist
,
i_position
,
p_files
);
/* get the CList and rebuild it. */
p_clist
=
GTK_CLIST
(
lookup_widget
(
p_intf
->
p_sys
->
p_playlist
,
"playlist_clist"
)
);
GnomeRebuildCList
(
p_clist
,
p_playlist
);
/* unlock the interface */
vlc_mutex_unlock
(
&
p_intf
->
change_lock
);
}
}
void
GnomeDeleteGListItem
(
gpointer
data
,
gpointer
param
)
{
int
i_cur_row
=
(
int
)
data
;
intf_thread_t
*
p_intf
=
param
;
intf_PlaylistDelete
(
p_main
->
p_playlist
,
i_cur_row
);
/* are we deleting the current played stream */
if
(
p_intf
->
p_sys
->
i_playing
==
i_cur_row
)
{
/* next ! */
p_intf
->
p_input
->
b_eof
=
1
;
/* this has to set the slider to 0 */
/* step minus one */
p_intf
->
p_sys
->
i_playing
--
;
p_main
->
p_playlist
->
i_index
--
;
}
}
gint
GnomeCompareItems
(
gconstpointer
a
,
gconstpointer
b
)
{
return
b
-
a
;
}
/* check a file (string) against supposed valid extension */
int
GnomeHasValidExtension
(
gchar
*
psz_filename
)
{
char
*
ppsz_ext
[
6
]
=
{
"mpg"
,
"mpeg"
,
"vob"
,
"mp2"
,
"ts"
,
"ps"
};
int
i_ext
=
6
;
int
i_dummy
;
gchar
*
psz_ext
=
strrchr
(
psz_filename
,
'.'
)
+
sizeof
(
char
);
for
(
i_dummy
=
0
;
i_dummy
<
i_ext
;
i_dummy
++
)
{
if
(
strcmp
(
psz_ext
,
ppsz_ext
[
i_dummy
]
)
==
0
)
{
return
1
;
}
}
return
0
;
}
/* recursive function: descend into folders and build a list of
* valid filenames */
GList
*
GnomeReadFiles
(
gchar
*
psz_fsname
)
{
struct
stat
statbuf
;
GList
*
p_current
=
NULL
;
/* get the attributes of this file */
stat
(
psz_fsname
,
&
statbuf
);
/* is it a regular file ? */
if
(
S_ISREG
(
statbuf
.
st_mode
)
)
{
if
(
GnomeHasValidExtension
(
psz_fsname
)
)
{
intf_WarnMsg
(
3
,
"%s is a valid file. Stacking on the playlist"
,
psz_fsname
);
return
g_list_append
(
NULL
,
g_strdup
(
psz_fsname
)
);
}
else
{
return
NULL
;
}
}
/* is it a directory (should we check for symlinks ?) */
else
if
(
S_ISDIR
(
statbuf
.
st_mode
)
)
{
/* have to cd into this dir */
DIR
*
p_current_dir
=
opendir
(
psz_fsname
);
struct
dirent
*
p_dir_content
;
intf_WarnMsg
(
3
,
"%s is a folder."
,
psz_fsname
);
if
(
p_current_dir
==
NULL
)
{
/* something went bad, get out of here ! */
return
p_current
;
}
p_dir_content
=
readdir
(
p_current_dir
);
/* while we still have entries in the directory */
while
(
p_dir_content
!=
NULL
)
{
/* if it is "." or "..", forget it */
if
(
(
strcmp
(
p_dir_content
->
d_name
,
"."
)
!=
0
)
&&
(
strcmp
(
p_dir_content
->
d_name
,
".."
)
!=
0
)
)
{
/* else build the new directory by adding
fsname "/" and the current entry name
(kludgy :()
*/
char
*
psz_newfs
=
malloc
(
2
+
strlen
(
psz_fsname
)
+
strlen
(
p_dir_content
->
d_name
)
*
sizeof
(
char
)
);
strcpy
(
psz_newfs
,
psz_fsname
);
strcpy
(
psz_newfs
+
strlen
(
psz_fsname
)
+
1
,
p_dir_content
->
d_name
);
psz_newfs
[
strlen
(
psz_fsname
)]
=
'/'
;
p_current
=
g_list_concat
(
p_current
,
GnomeReadFiles
(
psz_newfs
)
);
g_free
(
psz_newfs
);
}
p_dir_content
=
readdir
(
p_current_dir
);
}
return
p_current
;
}
return
NULL
;
}
/* add items in a playlist
* when i_pos==-1 add to the end of the list...
*/
int
GnomeAppendList
(
playlist_t
*
p_playlist
,
int
i_pos
,
GList
*
p_list
)
{
guint
i_dummy
;
guint
i_length
;
i_length
=
g_list_length
(
p_list
);
for
(
i_dummy
=
0
;
i_dummy
<
i_length
;
i_dummy
++
)
{
intf_PlaylistAdd
(
p_playlist
,
/* ok; this is a really nasty trick to insert
the item where they are suppose to go but, hey
this works :P (btw, you are really nasty too) */
i_pos
==
PLAYLIST_END
?
PLAYLIST_END
:
(
i_pos
+
i_dummy
),
g_list_nth_data
(
p_list
,
i_dummy
)
);
}
return
0
;
}
/* statis timeouted function */
void
GnomePlayListManage
(
intf_thread_t
*
p_intf
)
{
/* this thing really sucks for now :( */
/* TODO speak more with interface/intf_playlist.c */
playlist_t
*
p_playlist
=
p_main
->
p_playlist
;
GtkCList
*
p_clist
;
p_clist
=
GTK_CLIST
(
gtk_object_get_data
(
GTK_OBJECT
(
p_intf
->
p_sys
->
p_playlist
),
"playlist_clist"
)
);
if
(
p_intf
->
p_sys
->
i_playing
!=
p_playlist
->
i_index
)
{
GdkColor
color
;
color
.
red
=
0xffff
;
color
.
blue
=
0
;
color
.
green
=
0
;
gtk_clist_set_background
(
p_clist
,
p_playlist
->
i_index
,
&
color
);
if
(
p_intf
->
p_sys
->
i_playing
!=
-
1
)
{
color
.
red
=
0xffff
;
color
.
blue
=
0xffff
;
color
.
green
=
0xffff
;
gtk_clist_set_background
(
p_clist
,
p_intf
->
p_sys
->
i_playing
,
&
color
);
}
p_intf
->
p_sys
->
i_playing
=
p_playlist
->
i_index
;
}
}
void
GnomeRebuildCList
(
GtkCList
*
p_clist
,
playlist_t
*
p_playlist
)
{
int
i_dummy
;
gchar
*
ppsz_text
[
2
];
GdkColor
red
;
red
.
red
=
65535
;
red
.
blue
=
0
;
red
.
green
=
0
;
gtk_clist_freeze
(
p_clist
);
gtk_clist_clear
(
p_clist
);
for
(
i_dummy
=
0
;
i_dummy
<
p_playlist
->
i_size
;
i_dummy
++
)
{
#ifdef WIN32
/* WIN32 HACK */
ppsz_text
[
0
]
=
g_strdup
(
""
);
#else
ppsz_text
[
0
]
=
g_strdup
(
rindex
(
(
char
*
)(
p_playlist
->
p_item
[
p_playlist
->
i_size
-
1
-
i_dummy
].
psz_name
),
'/'
)
+
1
);
#endif
ppsz_text
[
1
]
=
g_strdup
(
"no info"
);
gtk_clist_insert
(
p_clist
,
0
,
ppsz_text
);
free
(
ppsz_text
[
0
]
);
free
(
ppsz_text
[
1
]
);
}
gtk_clist_set_background
(
p_clist
,
p_playlist
->
i_index
,
&
red
);
gtk_clist_thaw
(
p_clist
);
}
plugins/gnome/gnome_playlist.h
0 → 100644
View file @
fd1da66f
/*****************************************************************************
* gnome_playlist.h : Playlist functions for the Gnome plugin.
*****************************************************************************
* Copyright (C) 2000, 2001 VideoLAN
* $Id: gnome_playlist.h,v 1.1 2001/05/06 18:41:52 stef Exp $
*
* Authors: Pierre Baillet <oct@zoy.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
void
GnomeDropDataReceived
(
intf_thread_t
*
,
GtkSelectionData
*
,
guint
,
int
);
void
GnomeRebuildCList
(
GtkCList
*
,
playlist_t
*
);
int
GnomeHasValidExtension
(
gchar
*
);
int
GnomeAppendList
(
playlist_t
*
,
int
,
GList
*
);
void
GnomePlayListManage
(
intf_thread_t
*
);
gint
GnomeCompareItems
(
gconstpointer
,
gconstpointer
);
GList
*
GnomeReadFiles
(
gchar
*
);
void
GnomeDeleteGListItem
(
gpointer
,
gpointer
);
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