📄 pl.c
字号:
#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <dirent.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <gdk/gdkkeysyms.h>#include <gtk/gtk.h>#include "../../config.h"#include "../../help_mp.h"#include "../stream/stream.h"#include "../interface.h"#include "../widgets.h"#include "pl.h"#include "common.h"static char * book_open_xpm[] = { "16 16 4 1", " c None s None", ". c black", "X c #808080", "o c white", " ", " .. ", " .Xo. ... ", " .Xoo. ..oo. ", " .Xooo.Xooo... ", " .Xooo.oooo.X. ", " .Xooo.Xooo.X. ", " .Xooo.oooo.X. ", " .Xooo.Xooo.X. ", " .Xooo.oooo.X. ", " .Xoo.Xoo..X. ", " .Xo.o..ooX. ", " .X..XXXXX. ", " ..X....... ", " .. ", " "};static char * book_closed_xpm[] = { "16 16 6 1", " c None s None", ". c black", "X c blue", "o c yellow", "O c #007FEA", "# c white", " ", " .. ", " ..XX. ", " ..XXXXX. ", " ..XXXXXXXX. ", ".ooXXXXXXXXX. ", "..ooXXXXXXXXX. ", ".X.ooXXXXXXXXX. ", ".XX.ooXXXXXX.. ", " .XX.ooXXX..#O ", " .XX.oo..##OO. ", " .XX..##OO.. ", " .X.#OO.. ", " ..O.. ", " .. ", " "}; GtkWidget * PlayList = NULL;static GtkWidget * CTDirTree;static GtkWidget * CLFiles;static GtkWidget * CLSelected;static GtkWidget * Add;static GtkWidget * Remove;static GtkWidget * Ok;static GtkWidget * Cancel;static GdkPixmap * pxOpenedBook;static GdkPixmap * pxClosedBook;static GdkBitmap * msOpenedBook;static GdkBitmap * msClosedBook;static int NrOfEntrys = 0;static int NrOfSelected = 0;static int * CLFileSelected = NULL;static int * CLListSelected = NULL;static int sigSel;static int sigUnsel;typedef struct{ int scaned; char * path;} DirNodeType;static GtkCTreeNode * sibling;static GtkCTreeNode * parent;static gchar * current_path;static gchar * old_path = NULL;static int compare_func(const void *a, const void *b){ char * tmp; int i; if ( !a || !b || !( (DirNodeType *)a )->path ) return -1; tmp=strdup( (char *)b ); tmp[strlen( tmp )-1]=0; i=strcmp( ( (DirNodeType *)a )->path,tmp ); free( tmp ); return i;}static void scan_dir( char * path );void ShowPlayList( void ){ if ( PlayList ) gtkActive( PlayList ); else PlayList=create_PlayList(); if ( old_path && *old_path ) { char * currentdir = strdup( old_path ); char * tpath,* pos; GtkCTreeNode * node,* nextnode; gboolean leaf; tpath=strdup( "/" ); pos=strtok( currentdir,"/" ); node=gtk_ctree_find_by_row_data_custom( GTK_CTREE( CTDirTree ),NULL,"/",compare_func ); do { char * tpathnew = g_strconcat( tpath,pos,"/",NULL ); free( tpath ); tpath=tpathnew; nextnode=gtk_ctree_find_by_row_data_custom( GTK_CTREE( CTDirTree ),node,tpath,compare_func ); if ( !nextnode ) break; node=nextnode; pos=strtok( NULL,"/" ); gtk_ctree_get_node_info( GTK_CTREE( CTDirTree ),node,NULL,NULL,NULL,NULL,NULL,NULL,&leaf,NULL ); if ( !leaf && pos ) gtk_ctree_expand( GTK_CTREE( CTDirTree ),node ); else { DirNodeType * DirNode; gtk_ctree_select( GTK_CTREE( CTDirTree ),node ); DirNode=gtk_ctree_node_get_row_data( GTK_CTREE( CTDirTree ),node ); current_path=DirNode->path; scan_dir( DirNode->path ); if ( CLFileSelected ) free( CLFileSelected ); CLFileSelected=calloc( 1,NrOfEntrys * sizeof( int ) ); break; } } while( pos ); free( tpath ); free( currentdir ); } else gtk_ctree_select( GTK_CTREE( CTDirTree ),parent ); gtk_clist_freeze( GTK_CLIST( CLSelected ) ); gtk_clist_clear( GTK_CLIST( CLSelected ) ); if ( plList ) { plItem * next = plList; while ( next || next->next ) { char * text[1][3]; text[0][2]=""; text[0][0]=next->name; text[0][1]=next->path; gtk_clist_append( GTK_CLIST( CLSelected ),text[0] ); NrOfSelected++; if ( next->next ) next=next->next; else break; } CLListSelected=calloc( 1,NrOfSelected * sizeof( int ) ); } gtk_clist_thaw( GTK_CLIST( CLSelected ) ); gtk_widget_show( PlayList );}void HidePlayList( void ){ if ( !PlayList ) return; NrOfSelected=NrOfEntrys=0; gfree( (void **)&CLListSelected ); gfree( (void **)&CLFileSelected ); if ( old_path ) free( old_path ); old_path=strdup( current_path ); gtk_widget_hide( PlayList ); gtk_widget_destroy( PlayList ); PlayList=NULL;}static void plRowSelect( GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data ){ switch ( (int) user_data ) { case 0: CLFileSelected[row]=1; break; case 1: CLListSelected[row]=1; break; }}static void plUnRowSelect( GtkCList * clist,gint row,gint column,GdkEvent * event,gpointer user_data ){ switch ( (int) user_data ) { case 0: CLFileSelected[row]=0; break; case 1: CLListSelected[row]=0; break; }}static void plButtonReleased( GtkButton * button,gpointer user_data ){ switch ( (int) user_data ) { case 1: // ok { int i; if ( plList ) gtkSet( gtkDelPl,0,NULL ); for ( i=0;i<NrOfSelected;i++ ) { plItem * item; char * text[3]; item=calloc( 1,sizeof( plItem ) ); gtk_clist_get_text( GTK_CLIST( CLSelected ),i,0,&text[0] ); gtk_clist_get_text( GTK_CLIST( CLSelected ),i,1,&text[1] ); item->name=strdup( text[0] ); item->path=strdup( text[1] ); gtkSet( gtkAddPlItem,0,(void*)item ); } if ( plCurrent ) { mplSetFileName( plCurrent->path,plCurrent->name,STREAMTYPE_FILE );// guiSetDF( guiIntfStruct.Filename,plCurrent->path,plCurrent->name );// guiIntfStruct.FilenameChanged=1;// guiIntfStruct.StreamType=STREAMTYPE_FILE; } } case 0: // cancel HidePlayList(); break; case 2: // remove { int i; int j; int c=0; gtk_signal_handler_block( GTK_OBJECT( CLSelected ),sigSel ); gtk_signal_handler_block( GTK_OBJECT( CLSelected ),sigUnsel ); gtk_clist_freeze( GTK_CLIST( CLSelected ) ); for ( i=0;i<NrOfSelected-c;i++ ) if ( CLListSelected[i] ) { gtk_clist_remove( GTK_CLIST( CLSelected ),i - c ); c++; for ( j=i;j<NrOfSelected-c;j++ ) CLListSelected[i] = CLListSelected[i+1]; } NrOfSelected-=c; gtk_clist_thaw( GTK_CLIST( CLSelected ) ); gtk_signal_handler_unblock( GTK_OBJECT( CLSelected ),sigSel ); gtk_signal_handler_unblock( GTK_OBJECT( CLSelected ),sigUnsel ); } break; case 3: // add { int i; char * itext[1][2]; char * text[1][3]; text[0][2]=""; gtk_clist_freeze( GTK_CLIST( CLSelected ) ); for ( i=0;i<NrOfEntrys;i++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -