diff options
-rw-r--r-- | Jamfile | 4 | ||||
-rw-r--r-- | callbacks.c | 174 | ||||
-rw-r--r-- | callbacks.h | 40 | ||||
-rw-r--r-- | cmp3.c | 257 | ||||
-rw-r--r-- | cmp3.h | 6 | ||||
-rw-r--r-- | deadbeef.glade | 515 | ||||
-rw-r--r-- | interface.c | 369 | ||||
-rw-r--r-- | main.c | 5 | ||||
-rw-r--r-- | playlist.c | 12 |
9 files changed, 1143 insertions, 239 deletions
@@ -11,7 +11,7 @@ HDRS += /usr/include/pango-1.0 ; HDRS += /usr/include/cairo ; Main deadbeef : - cmod.c codec.c cvorbis.c cwav.c playlist.c psdl.c main.c support.c interface.c callbacks.c threading.c ; + cmod.c codec.c cvorbis.c cwav.c cmp3.c playlist.c psdl.c main.c support.c interface.c callbacks.c threading.c ; -LINKLIBS on deadbeef = -lmikmod -lm -lvorbis -logg -lvorbisfile -lmikmod -lSDL -lsamplerate -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 ; +LINKLIBS on deadbeef = -lmikmod -lm -lvorbis -logg -lvorbisfile -lmikmod -lmad -lSDL -lsamplerate -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 ; diff --git a/callbacks.c b/callbacks.c index e19545a6..766887d7 100644 --- a/callbacks.c +++ b/callbacks.c @@ -17,7 +17,7 @@ extern GtkWidget *mainwin; static GdkPixmap *backbuf; -static int rowheight = 12; +static int rowheight = 17; int trackerscroll = 0; static int playlist_row = -1; static double playlist_clicktime = 0; @@ -45,36 +45,6 @@ setup_ps_scrollbar (void) { gtk_range_set_adjustment (GTK_RANGE (scroll), adj); } -void -on_addbtn_clicked (GtkButton *button, - gpointer user_data) -{ - GtkWidget *dlg = gtk_file_chooser_dialog_new ("Add file(s) to playlist...", GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); - - GtkFileFilter* flt; - flt = gtk_file_filter_new (); - gtk_file_filter_set_name (flt, "Supported music files"); - gtk_file_filter_add_pattern (flt, "*.ogg"); - gtk_file_filter_add_pattern (flt, "*.mod"); - gtk_file_filter_add_pattern (flt, "*.wav"); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); - gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dlg), flt); - flt = gtk_file_filter_new (); - gtk_file_filter_set_name (flt, "Other files (*)"); - gtk_file_filter_add_pattern (flt, "*"); - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); - gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dlg), TRUE); - - if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK) - { - GSList *lst = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dlg)); - g_slist_foreach(lst, addfile_func, NULL); - g_slist_free (lst); - } - gtk_widget_destroy (dlg); - setup_ps_scrollbar (); -} - void on_playbtn_clicked (GtkButton *button, @@ -125,18 +95,21 @@ draw_ps_row_back (GdkDrawable *drawable, cairo_t *cr, int row) { gdk_drawable_get_size (drawable, &width, &height); w = width; if (row == playlist_row) { - cairo_set_source_rgb (cr, 0.22, 0.1, 0.1); - cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, width, rowheight); + cairo_set_source_rgb (cr, 0xae/255.f, 0xa6/255.f, 0x9d/255.f); + cairo_rectangle (cr, 1, row * rowheight - trackerscroll * rowheight+1, width-2, rowheight-2); cairo_fill (cr); + cairo_set_source_rgb (cr, 0x7f/255.f, 0x7f/255.f, 0x7f/255.f); + cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, width, rowheight); + cairo_stroke (cr); } else { if (row % 2) { - cairo_set_source_rgb (cr, 0.88, 0.88, 0.88); + cairo_set_source_rgb (cr, 0x1d/255.f, 0x1f/255.f, 0x1b/255.f); cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, w, rowheight); cairo_fill (cr); } else { - cairo_set_source_rgb (cr, 0.77, 0.77, 0.77); + cairo_set_source_rgb (cr, 0x21/255.f, 0x23/255.f, 0x1f/255.f); cairo_rectangle (cr, 0, row * rowheight - trackerscroll * rowheight, width, rowheight); cairo_fill (cr); } @@ -161,10 +134,10 @@ text_draw (cairo_t *cr, int x, int y, const char *text) { void draw_ps_row (GdkDrawable *drawable, cairo_t *cr, int row, playItem_t *it) { if (row == playlist_row) { - cairo_set_source_rgb (cr, 1, 1, 1); + cairo_set_source_rgb (cr, 0, 0, 0); } else { - cairo_set_source_rgb (cr, 0, 0, 0); + cairo_set_source_rgb (cr, 0xf4/255.f, 0x7e/255.f, 0x46/255.f); } text_draw (cr, 0, row * rowheight - trackerscroll * rowheight, it->displayname); } @@ -184,8 +157,8 @@ redraw_ps_row (GtkWidget *widget, int row) { return; } - cairo_select_font_face (cr, "fixed", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cr, rowheight); +// cairo_select_font_face (cr, "fixed", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); +// cairo_set_font_size (cr, rowheight); playItem_t *it = ps_get_for_idx (row); if (it) { @@ -203,8 +176,8 @@ void draw_playlist (GtkWidget *widget, int x, int y, int w, int h) { return; } - cairo_select_font_face (cr, "fixed", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cr, rowheight); +// cairo_select_font_face (cr, "fixed", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); +// cairo_set_font_size (cr, rowheight); int row; int row1; int row2; @@ -305,3 +278,122 @@ on_playscroll_value_changed (GtkRange *range, draw_playlist (playlist, 0, 0, playlist->allocation.width, playlist->allocation.height); } + +void +on_open_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ +} + + +void +on_add_files_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + GtkWidget *dlg = gtk_file_chooser_dialog_new ("Add file(s) to playlist...", GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); + + GtkFileFilter* flt; + flt = gtk_file_filter_new (); + gtk_file_filter_set_name (flt, "Supported music files"); + gtk_file_filter_add_pattern (flt, "*.ogg"); + gtk_file_filter_add_pattern (flt, "*.mod"); + gtk_file_filter_add_pattern (flt, "*.wav"); + gtk_file_filter_add_pattern (flt, "*.mp3"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); + gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dlg), flt); + flt = gtk_file_filter_new (); + gtk_file_filter_set_name (flt, "Other files (*)"); + gtk_file_filter_add_pattern (flt, "*"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dlg), flt); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dlg), TRUE); + + if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK) + { + GSList *lst = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dlg)); + g_slist_foreach(lst, addfile_func, NULL); + g_slist_free (lst); + } + gtk_widget_destroy (dlg); + setup_ps_scrollbar (); + GtkWidget *playlist = lookup_widget (mainwin, "playlist"); + draw_playlist (playlist, 0, 0, playlist->allocation.width, playlist->allocation.height); +} + + +void +on_add_folder1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + + GtkWidget *dlg = gtk_file_chooser_dialog_new ("Add folder to playlist...", GTK_WINDOW (mainwin), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); + + if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK) + { + gchar *folder = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlg)); + if (folder) { + ps_add_dir (folder); + g_free (folder); + } + } + gtk_widget_destroy (dlg); + setup_ps_scrollbar (); + GtkWidget *playlist = lookup_widget (mainwin, "playlist"); + draw_playlist (playlist, 0, 0, playlist->allocation.width, playlist->allocation.height); +} + + +void +on_preferences1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_quit1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_clear1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_select_all1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_remove1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_crop1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_about1_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + diff --git a/callbacks.h b/callbacks.h index da43fd9c..d1e51964 100644 --- a/callbacks.h +++ b/callbacks.h @@ -39,3 +39,43 @@ on_playlist_button_press_event (GtkWidget *widget, void on_playscroll_value_changed (GtkRange *range, gpointer user_data); + +void +on_open_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_add_files_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_add_folder1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_preferences1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_quit1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_clear1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_select_all1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_remove1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_crop1_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_about1_activate (GtkMenuItem *menuitem, + gpointer user_data); @@ -0,0 +1,257 @@ +#include <string.h> +#include <stdio.h> +#include <mad.h> +#include <assert.h> +#include "codec.h" +#include "cmp3.h" + +FILE *outf; + +#define min(x,y) ((x)<(y)?(x):(y)) +#define max(x,y) ((x)>(y)?(x):(y)) + +#define READBUFFER 5*8192 +#define CACHESIZE 81920 +struct buffer { + FILE *file; + + // input buffer, for MPEG data + char input[READBUFFER]; + int remaining; + + // output buffer, supplied by player + char *output; + int readsize; + + // cache, for extra decoded samples + char cache[CACHESIZE]; + int cachefill; +}; + +static struct buffer buffer; +static struct mad_stream stream; +static struct mad_frame frame; +static struct mad_synth synth; +static mad_timer_t timer; +static int frame_count; +unsigned char *GuardPtr = NULL; + +int +cmp3_init (const char *fname) { + buffer.file = fopen (fname, "rb"); + if (!buffer.file) { + printf ("failed to read %s\n", fname); + return -1; + } + cmp3.info.bitsPerSample = 16; + cmp3.info.dataSize = -1; + cmp3.info.channels = 2; + cmp3.info.samplesPerSecond = 44100; + buffer.remaining = 0; + buffer.output = NULL; + buffer.readsize = 0; + buffer.cachefill = 0; + frame_count = 0; + GuardPtr = NULL; + mad_stream_init(&stream); + mad_frame_init(&frame); + mad_synth_init(&synth); + mad_timer_reset(&timer); + + outf = fopen ("out.raw", "w+b"); + + return 0; +} + +/**************************************************************************** + * Converts a sample from libmad's fixed point number format to a signed * + * short (16 bits). * + ****************************************************************************/ +static signed short MadFixedToSshort(mad_fixed_t Fixed) +{ + /* A fixed point number is formed of the following bit pattern: + * + * SWWWFFFFFFFFFFFFFFFFFFFFFFFFFFFF + * MSB LSB + * S ==> Sign (0 is positive, 1 is negative) + * W ==> Whole part bits + * F ==> Fractional part bits + * + * This pattern contains MAD_F_FRACBITS fractional bits, one + * should alway use this macro when working on the bits of a fixed + * point number. It is not guaranteed to be constant over the + * different platforms supported by libmad. + * + * The signed short value is formed, after clipping, by the least + * significant whole part bit, followed by the 15 most significant + * fractional part bits. Warning: this is a quick and dirty way to + * compute the 16-bit number, madplay includes much better + * algorithms. + */ + + /* Clipping */ + if(Fixed>=MAD_F_ONE) + return(32767); + if(Fixed<=-MAD_F_ONE) + return(-32768); + + /* Conversion. */ + Fixed=Fixed>>(MAD_F_FRACBITS-15); + return((signed short)Fixed); +} + +#define MadErrorString(x) mad_stream_errorstr(x) + +void +cmp3_decode (void) { + for (;;) { + // read more MPEG data if needed + if(stream.buffer==NULL || stream.error==MAD_ERROR_BUFLEN) { + // copy part of last frame to beginning + if (stream.next_frame != NULL) { + buffer.remaining = stream.bufend - stream.next_frame; + memmove (buffer.input, stream.next_frame, buffer.remaining); + } + int size = READBUFFER - buffer.remaining; + char *bytes = buffer.input + buffer.remaining; + for (;;) { + int bytesread = fread (bytes, 1, size, buffer.file); + if (bytesread < size) { + fseek (buffer.file, 0, SEEK_SET); + size -= bytesread; + bytes += bytesread; + } + else { + break; + } + } + mad_stream_buffer(&stream,buffer.input,READBUFFER); + stream.error=0; + } + // decode next frame + if(mad_frame_decode(&frame,&stream)) + { + if(MAD_RECOVERABLE(stream.error)) + { + if(stream.error!=MAD_ERROR_LOSTSYNC || + stream.this_frame!=GuardPtr) + { + fprintf(stderr,"recoverable frame level error (%s)\n", + MadErrorString(&stream)); + fflush(stderr); + } + continue; + } + else { + if(stream.error==MAD_ERROR_BUFLEN) + continue; + else + { + fprintf(stderr,"unrecoverable frame level error (%s).\n", + MadErrorString(&stream)); + break; + } + } + } + + if(frame_count==0) { + // all info about stream is here, set params + cmp3.info.bitsPerSample = 16; + cmp3.info.dataSize = -1; + cmp3.info.channels = MAD_NCHANNELS(&frame.header); + cmp3.info.samplesPerSecond = frame.header.samplerate; +// break; + } + + frame_count++; + mad_timer_add(&timer,frame.header.duration); + + mad_synth_frame(&synth,&frame); + + char *cache = &buffer.cache[buffer.cachefill]; + int i; + for(i=0;i<synth.pcm.length;i++) + { + if (buffer.readsize > 0) { + *((int16_t*)buffer.output) = MadFixedToSshort(synth.pcm.samples[0][i]); + buffer.output+=2; + buffer.readsize-=2; + + if(MAD_NCHANNELS(&frame.header)==2) { + *((int16_t*)buffer.output) = MadFixedToSshort(synth.pcm.samples[1][i]); + buffer.output+=2; + buffer.readsize-=2; + } + } + else if (buffer.cachefill < CACHESIZE) { + assert (buffer.cachefill < CACHESIZE-2); + *((int16_t*)cache) = MadFixedToSshort(synth.pcm.samples[0][i]); + cache+=2; + buffer.cachefill+=2; + if (MAD_NCHANNELS(&frame.header) == 2) { + assert (buffer.cachefill < CACHESIZE-2); + *((int16_t*)cache) = MadFixedToSshort(synth.pcm.samples[1][i]); + cache+=2; + buffer.cachefill+=2; + } + } + else { + printf ("cache overflow!\n"); + break; + } + } + if (buffer.readsize == 0) { + break; + } + } +} + +void +cmp3_free (void) { + if (buffer.file) { + fclose (buffer.file); + buffer.file = NULL; + mad_synth_finish (&synth); + mad_frame_finish (&frame); + mad_stream_finish (&stream); + } + if (outf) { + fclose (outf); + outf = NULL; + } +} + +int +cmp3_read (char *bytes, int size) { + int result; + int totalread = 0; + if (buffer.cachefill > 0) { + int sz = min (size, buffer.cachefill); + memcpy (bytes, buffer.cache, sz); + bytes += sz; + size -= sz; + totalread += sz; + if (buffer.cachefill > sz) { + memmove (buffer.cache, &buffer.cache[sz], buffer.cachefill-sz); + buffer.cachefill -= sz; + } + else { + buffer.cachefill = 0; + } + } + if (size > 0) { + buffer.output = bytes; + buffer.readsize = size; + cmp3_decode ();//mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC); + totalread += size; + } + return 0; +} + +codec_t cmp3 = { + .init = cmp3_init, + .free = cmp3_free, + .read = cmp3_read +}; + + @@ -0,0 +1,6 @@ +#ifndef __CMP3_H +#define __CMP3_H + +extern codec_t cmp3; + +#endif // __CMP3_H diff --git a/deadbeef.glade b/deadbeef.glade index 73da0a0f..b7d8b5dd 100644 --- a/deadbeef.glade +++ b/deadbeef.glade @@ -29,136 +29,435 @@ <property name="spacing">0</property> <child> - <widget class="GtkHBox" id="hbox1"> + <widget class="GtkHBox" id="hbox2"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property> <child> - <widget class="GtkToolbar" id="toolbar1"> + <widget class="GtkHandleBox" id="handlebox1"> <property name="visible">True</property> - <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property> - <property name="toolbar_style">GTK_TOOLBAR_BOTH</property> - <property name="tooltips">True</property> - <property name="show_arrow">True</property> + <property name="shadow_type">GTK_SHADOW_OUT</property> + <property name="handle_position">GTK_POS_LEFT</property> + <property name="snap_edge">GTK_POS_TOP</property> <child> - <widget class="GtkToolItem" id="toolitem1"> + <widget class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">False</property> + <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property> + <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property> <child> - <widget class="GtkButton" id="addbtn"> + <widget class="GtkMenuItem" id="menuitem1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Add</property> + <property name="label" translatable="yes">_File</property> <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_addbtn_clicked" last_modification_time="Fri, 03 Jul 2009 23:36:03 GMT"/> + + <child> + <widget class="GtkMenu" id="menuitem1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="open"> + <property name="visible">True</property> + <property name="label">gtk-open</property> + <property name="use_stock">True</property> + <signal name="activate" handler="on_open_activate" last_modification_time="Sat, 04 Jul 2009 12:57:58 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator2"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="add_files"> + <property name="visible">True</property> + <property name="label" translatable="yes">Add files</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_add_files_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="add_folder1"> + <property name="visible">True</property> + <property name="label" translatable="yes">Add folder</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_add_folder1_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator1"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="preferences1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Preferences</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_preferences1_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem1"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="quit1"> + <property name="visible">True</property> + <property name="label">gtk-quit</property> + <property name="use_stock">True</property> + <signal name="activate" handler="on_quit1_activate" last_modification_time="Sat, 04 Jul 2009 12:57:58 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="edit1"> + <property name="visible">True</property> + <property name="label" translatable="yes">Edit</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="edit1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="clear1"> + <property name="visible">True</property> + <property name="label">gtk-clear</property> + <property name="use_stock">True</property> + <signal name="activate" handler="on_clear1_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkImageMenuItem" id="select_all1"> + <property name="visible">True</property> + <property name="label">gtk-select-all</property> + <property name="use_stock">True</property> + <signal name="activate" handler="on_select_all1_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="selection1"> + <property name="visible">True</property> + <property name="label" translatable="yes">Selection</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="selection1_menu"> + + <child> + <widget class="GtkImageMenuItem" id="remove1"> + <property name="visible">True</property> + <property name="label">gtk-remove</property> + <property name="use_stock">True</property> + <signal name="activate" handler="on_remove1_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="crop1"> + <property name="visible">True</property> + <property name="label" translatable="yes">Crop</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_crop1_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="menuitem4"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Help</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="menuitem4_menu"> + + <child> + <widget class="GtkMenuItem" id="about1"> + <property name="visible">True</property> + <property name="label" translatable="yes">_About</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_about1_activate" last_modification_time="Sat, 04 Jul 2009 12:57:58 GMT"/> + </widget> + </child> + </widget> + </child> </widget> </child> </widget> - <packing> - <property name="expand">False</property> - <property name="homogeneous">False</property> - </packing> </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHandleBox" id="handlebox2"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_OUT</property> + <property name="handle_position">GTK_POS_LEFT</property> + <property name="snap_edge">GTK_POS_TOP</property> <child> - <widget class="GtkToolItem" id="toolitem2"> + <widget class="GtkHBox" id="hbox3"> <property name="visible">True</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">False</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> <child> - <widget class="GtkButton" id="playbtn"> + <widget class="GtkButton" id="button4"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Play</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="relief">GTK_RELIEF_NONE</property> <property name="focus_on_click">True</property> - <signal name="clicked" handler="on_playbtn_clicked" last_modification_time="Fri, 03 Jul 2009 23:36:16 GMT"/> + + <child> + <widget class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-media-stop</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="homogeneous">False</property> - </packing> - </child> - <child> - <widget class="GtkToolItem" id="toolitem3"> - <property name="visible">True</property> - <property name="visible_horizontal">True</property> - <property name="visible_vertical">True</property> - <property name="is_important">False</property> + <child> + <widget class="GtkButton" id="button5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NONE</property> + <property name="focus_on_click">True</property> + + <child> + <widget class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-media-play</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> <child> - <widget class="GtkButton" id="button3"> + <widget class="GtkButton" id="button6"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Stop</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="relief">GTK_RELIEF_NONE</property> + <property name="focus_on_click">True</property> + + <child> + <widget class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="stock">gtk-media-pause</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button7"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NONE</property> + <property name="focus_on_click">True</property> + + <child> + <widget class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="stock">gtk-media-previous</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NONE</property> <property name="focus_on_click">True</property> + + <child> + <widget class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="stock">gtk-media-next</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="button9"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NONE</property> + <property name="focus_on_click">True</property> + + <child> + <widget class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox4"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child> + <widget class="GtkImage" id="image6"> + <property name="visible">True</property> + <property name="stock">gtk-media-play</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="label" translatable="yes">?</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> </widget> - <packing> - <property name="expand">False</property> - <property name="homogeneous">False</property> - </packing> </child> </widget> <packing> <property name="padding">0</property> - <property name="expand">True</property> + <property name="expand">False</property> <property name="fill">True</property> </packing> </child> <child> - <widget class="GtkVBox" id="vbox2"> + <widget class="GtkHandleBox" id="handlebox3"> + <property name="border_width">1</property> <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Volume</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> + <property name="shadow_type">GTK_SHADOW_OUT</property> + <property name="handle_position">GTK_POS_LEFT</property> + <property name="snap_edge">GTK_POS_TOP</property> <child> <widget class="GtkHScale" id="volume"> - <property name="width_request">100</property> + <property name="width_request">80</property> <property name="visible">True</property> - <property name="can_focus">True</property> <property name="draw_value">False</property> <property name="value_pos">GTK_POS_TOP</property> <property name="digits">1</property> @@ -167,11 +466,6 @@ <property name="adjustment">100 0 100 0 0 0</property> <signal name="value_changed" handler="on_volume_value_changed" last_modification_time="Fri, 03 Jul 2009 23:43:47 GMT"/> </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> </child> </widget> <packing> @@ -182,41 +476,17 @@ </child> <child> - <widget class="GtkVBox" id="vbox3"> + <widget class="GtkHandleBox" id="handlebox4"> + <property name="border_width">1</property> <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes">Play position</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> + <property name="shadow_type">GTK_SHADOW_OUT</property> + <property name="handle_position">GTK_POS_LEFT</property> + <property name="snap_edge">GTK_POS_TOP</property> <child> <widget class="GtkHScale" id="playpos"> <property name="width_request">200</property> <property name="visible">True</property> - <property name="can_focus">True</property> <property name="draw_value">False</property> <property name="value_pos">GTK_POS_TOP</property> <property name="digits">1</property> @@ -225,11 +495,6 @@ <property name="adjustment">0 0 1000 0 0 0</property> <signal name="value_changed" handler="on_playpos_value_changed" last_modification_time="Fri, 03 Jul 2009 23:43:55 GMT"/> </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> </child> </widget> <packing> @@ -289,6 +554,18 @@ <property name="fill">True</property> </packing> </child> + + <child> + <widget class="GtkStatusbar" id="statusbar1"> + <property name="visible">True</property> + <property name="has_resize_grip">True</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> </widget> </child> </widget> diff --git a/interface.c b/interface.c index 38a936e9..b86a8825 100644 --- a/interface.c +++ b/interface.c @@ -31,24 +31,58 @@ create_mainwin (void) { GtkWidget *mainwin; GtkWidget *vbox1; - GtkWidget *hbox1; - GtkWidget *toolbar1; - GtkIconSize tmp_toolbar_icon_size; - GtkWidget *toolitem1; - GtkWidget *addbtn; - GtkWidget *toolitem2; - GtkWidget *playbtn; - GtkWidget *toolitem3; - GtkWidget *button3; - GtkWidget *vbox2; - GtkWidget *label1; + GtkWidget *hbox2; + GtkWidget *handlebox1; + GtkWidget *menubar1; + GtkWidget *menuitem1; + GtkWidget *menuitem1_menu; + GtkWidget *open; + GtkWidget *separator2; + GtkWidget *add_files; + GtkWidget *add_folder1; + GtkWidget *separator1; + GtkWidget *preferences1; + GtkWidget *separatormenuitem1; + GtkWidget *quit1; + GtkWidget *edit1; + GtkWidget *edit1_menu; + GtkWidget *clear1; + GtkWidget *select_all1; + GtkWidget *selection1; + GtkWidget *selection1_menu; + GtkWidget *remove1; + GtkWidget *crop1; + GtkWidget *menuitem4; + GtkWidget *menuitem4_menu; + GtkWidget *about1; + GtkWidget *handlebox2; + GtkWidget *hbox3; + GtkWidget *button4; + GtkWidget *image1; + GtkWidget *button5; + GtkWidget *image2; + GtkWidget *button6; + GtkWidget *image3; + GtkWidget *button7; + GtkWidget *image4; + GtkWidget *button8; + GtkWidget *image5; + GtkWidget *button9; + GtkWidget *alignment1; + GtkWidget *hbox4; + GtkWidget *image6; + GtkWidget *label3; + GtkWidget *handlebox3; GtkWidget *volume; - GtkWidget *vbox3; - GtkWidget *label2; + GtkWidget *handlebox4; GtkWidget *playpos; GtkWidget *_; GtkWidget *playlist; GtkWidget *playscroll; + GtkWidget *statusbar1; + GtkAccelGroup *accel_group; + + accel_group = gtk_accel_group_new (); mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (mainwin), "DeaDBeeF"); @@ -58,66 +92,197 @@ create_mainwin (void) gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (mainwin), vbox1); - hbox1 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox1); - gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0); + hbox2 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox2); + gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 0); + + handlebox1 = gtk_handle_box_new (); + gtk_widget_show (handlebox1); + gtk_box_pack_start (GTK_BOX (hbox2), handlebox1, FALSE, TRUE, 0); + + menubar1 = gtk_menu_bar_new (); + gtk_widget_show (menubar1); + gtk_container_add (GTK_CONTAINER (handlebox1), menubar1); + + menuitem1 = gtk_menu_item_new_with_mnemonic ("_File"); + gtk_widget_show (menuitem1); + gtk_container_add (GTK_CONTAINER (menubar1), menuitem1); + + menuitem1_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem1), menuitem1_menu); + + open = gtk_image_menu_item_new_from_stock ("gtk-open", accel_group); + gtk_widget_show (open); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), open); + + separator2 = gtk_separator_menu_item_new (); + gtk_widget_show (separator2); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), separator2); + gtk_widget_set_sensitive (separator2, FALSE); + + add_files = gtk_menu_item_new_with_mnemonic ("Add files"); + gtk_widget_show (add_files); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), add_files); + + add_folder1 = gtk_menu_item_new_with_mnemonic ("Add folder"); + gtk_widget_show (add_folder1); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), add_folder1); + + separator1 = gtk_separator_menu_item_new (); + gtk_widget_show (separator1); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), separator1); + gtk_widget_set_sensitive (separator1, FALSE); + + preferences1 = gtk_menu_item_new_with_mnemonic ("_Preferences"); + gtk_widget_show (preferences1); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), preferences1); + + separatormenuitem1 = gtk_separator_menu_item_new (); + gtk_widget_show (separatormenuitem1); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), separatormenuitem1); + gtk_widget_set_sensitive (separatormenuitem1, FALSE); + + quit1 = gtk_image_menu_item_new_from_stock ("gtk-quit", accel_group); + gtk_widget_show (quit1); + gtk_container_add (GTK_CONTAINER (menuitem1_menu), quit1); + + edit1 = gtk_menu_item_new_with_mnemonic ("Edit"); + gtk_widget_show (edit1); + gtk_container_add (GTK_CONTAINER (menubar1), edit1); + + edit1_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (edit1), edit1_menu); + + clear1 = gtk_image_menu_item_new_from_stock ("gtk-clear", accel_group); + gtk_widget_show (clear1); + gtk_container_add (GTK_CONTAINER (edit1_menu), clear1); + + select_all1 = gtk_image_menu_item_new_from_stock ("gtk-select-all", accel_group); + gtk_widget_show (select_all1); + gtk_container_add (GTK_CONTAINER (edit1_menu), select_all1); + + selection1 = gtk_menu_item_new_with_mnemonic ("Selection"); + gtk_widget_show (selection1); + gtk_container_add (GTK_CONTAINER (edit1_menu), selection1); + + selection1_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (selection1), selection1_menu); + + remove1 = gtk_image_menu_item_new_from_stock ("gtk-remove", accel_group); + gtk_widget_show (remove1); + gtk_container_add (GTK_CONTAINER (selection1_menu), remove1); + + crop1 = gtk_menu_item_new_with_mnemonic ("Crop"); + gtk_widget_show (crop1); + gtk_container_add (GTK_CONTAINER (selection1_menu), crop1); + + menuitem4 = gtk_menu_item_new_with_mnemonic ("_Help"); + gtk_widget_show (menuitem4); + gtk_container_add (GTK_CONTAINER (menubar1), menuitem4); - toolbar1 = gtk_toolbar_new (); - gtk_widget_show (toolbar1); - gtk_box_pack_start (GTK_BOX (hbox1), toolbar1, TRUE, TRUE, 0); - gtk_toolbar_set_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_BOTH); - tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar1)); + menuitem4_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem4), menuitem4_menu); - toolitem1 = (GtkWidget*) gtk_tool_item_new (); - gtk_widget_show (toolitem1); - gtk_container_add (GTK_CONTAINER (toolbar1), toolitem1); + about1 = gtk_menu_item_new_with_mnemonic ("_About"); + gtk_widget_show (about1); + gtk_container_add (GTK_CONTAINER (menuitem4_menu), about1); - addbtn = gtk_button_new_with_mnemonic ("Add"); - gtk_widget_show (addbtn); - gtk_container_add (GTK_CONTAINER (toolitem1), addbtn); + handlebox2 = gtk_handle_box_new (); + gtk_widget_show (handlebox2); + gtk_box_pack_start (GTK_BOX (hbox2), handlebox2, FALSE, TRUE, 0); - toolitem2 = (GtkWidget*) gtk_tool_item_new (); - gtk_widget_show (toolitem2); - gtk_container_add (GTK_CONTAINER (toolbar1), toolitem2); + hbox3 = gtk_hbox_new (FALSE, 0); + gtk_widget_show (hbox3); + gtk_container_add (GTK_CONTAINER (handlebox2), hbox3); - playbtn = gtk_button_new_with_mnemonic ("Play"); - gtk_widget_show (playbtn); - gtk_container_add (GTK_CONTAINER (toolitem2), playbtn); + button4 = gtk_button_new (); + gtk_widget_show (button4); + gtk_box_pack_start (GTK_BOX (hbox3), button4, FALSE, FALSE, 0); + gtk_button_set_relief (GTK_BUTTON (button4), GTK_RELIEF_NONE); - toolitem3 = (GtkWidget*) gtk_tool_item_new (); - gtk_widget_show (toolitem3); - gtk_container_add (GTK_CONTAINER (toolbar1), toolitem3); + image1 = gtk_image_new_from_stock ("gtk-media-stop", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image1); + gtk_container_add (GTK_CONTAINER (button4), image1); - button3 = gtk_button_new_with_mnemonic ("Stop"); - gtk_widget_show (button3); - gtk_container_add (GTK_CONTAINER (toolitem3), button3); + button5 = gtk_button_new (); + gtk_widget_show (button5); + gtk_box_pack_start (GTK_BOX (hbox3), button5, FALSE, FALSE, 0); + gtk_button_set_relief (GTK_BUTTON (button5), GTK_RELIEF_NONE); - vbox2 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox2); - gtk_box_pack_start (GTK_BOX (hbox1), vbox2, FALSE, TRUE, 0); + image2 = gtk_image_new_from_stock ("gtk-media-play", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image2); + gtk_container_add (GTK_CONTAINER (button5), image2); - label1 = gtk_label_new ("Volume"); - gtk_widget_show (label1); - gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0); + button6 = gtk_button_new (); + gtk_widget_show (button6); + gtk_box_pack_start (GTK_BOX (hbox3), button6, FALSE, FALSE, 0); + gtk_button_set_relief (GTK_BUTTON (button6), GTK_RELIEF_NONE); + + image3 = gtk_image_new_from_stock ("gtk-media-pause", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image3); + gtk_container_add (GTK_CONTAINER (button6), image3); + + button7 = gtk_button_new (); + gtk_widget_show (button7); + gtk_box_pack_start (GTK_BOX (hbox3), button7, FALSE, FALSE, 0); + gtk_button_set_relief (GTK_BUTTON (button7), GTK_RELIEF_NONE); + + image4 = gtk_image_new_from_stock ("gtk-media-previous", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image4); + gtk_container_add (GTK_CONTAINER (button7), image4); + + button8 = gtk_button_new (); + gtk_widget_show (button8); + gtk_box_pack_start (GTK_BOX (hbox3), button8, FALSE, FALSE, 0); + gtk_button_set_relief (GTK_BUTTON (button8), GTK_RELIEF_NONE); + + image5 = gtk_image_new_from_stock ("gtk-media-next", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image5); + gtk_container_add (GTK_CONTAINER (button8), image5); + + button9 = gtk_button_new (); + gtk_widget_show (button9); + gtk_box_pack_start (GTK_BOX (hbox3), button9, FALSE, FALSE, 0); + gtk_button_set_relief (GTK_BUTTON (button9), GTK_RELIEF_NONE); + + alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0); + gtk_widget_show (alignment1); + gtk_container_add (GTK_CONTAINER (button9), alignment1); + + hbox4 = gtk_hbox_new (FALSE, 2); + gtk_widget_show (hbox4); + gtk_container_add (GTK_CONTAINER (alignment1), hbox4); + + image6 = gtk_image_new_from_stock ("gtk-media-play", GTK_ICON_SIZE_BUTTON); + gtk_widget_show (image6); + gtk_box_pack_start (GTK_BOX (hbox4), image6, FALSE, FALSE, 0); + + label3 = gtk_label_new_with_mnemonic ("?"); + gtk_widget_show (label3); + gtk_box_pack_start (GTK_BOX (hbox4), label3, FALSE, FALSE, 0); + + handlebox3 = gtk_handle_box_new (); + gtk_widget_show (handlebox3); + gtk_box_pack_start (GTK_BOX (hbox2), handlebox3, FALSE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (handlebox3), 1); volume = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 0, 100, 0, 0, 0))); gtk_widget_show (volume); - gtk_box_pack_start (GTK_BOX (vbox2), volume, TRUE, TRUE, 0); - gtk_widget_set_size_request (volume, 100, -1); + gtk_container_add (GTK_CONTAINER (handlebox3), volume); + gtk_widget_set_size_request (volume, 80, -1); + GTK_WIDGET_UNSET_FLAGS (volume, GTK_CAN_FOCUS); gtk_scale_set_draw_value (GTK_SCALE (volume), FALSE); - vbox3 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox3); - gtk_box_pack_start (GTK_BOX (hbox1), vbox3, FALSE, TRUE, 0); - - label2 = gtk_label_new ("Play position"); - gtk_widget_show (label2); - gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0); + handlebox4 = gtk_handle_box_new (); + gtk_widget_show (handlebox4); + gtk_box_pack_start (GTK_BOX (hbox2), handlebox4, FALSE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (handlebox4), 1); playpos = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1000, 0, 0, 0))); gtk_widget_show (playpos); - gtk_box_pack_start (GTK_BOX (vbox3), playpos, TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (handlebox4), playpos); gtk_widget_set_size_request (playpos, 200, -1); + GTK_WIDGET_UNSET_FLAGS (playpos, GTK_CAN_FOCUS); gtk_scale_set_draw_value (GTK_SCALE (playpos), FALSE); _ = gtk_hbox_new (FALSE, 0); @@ -133,14 +298,42 @@ create_mainwin (void) gtk_widget_show (playscroll); gtk_box_pack_start (GTK_BOX (_), playscroll, FALSE, FALSE, 0); + statusbar1 = gtk_statusbar_new (); + gtk_widget_show (statusbar1); + gtk_box_pack_start (GTK_BOX (vbox1), statusbar1, FALSE, FALSE, 0); + g_signal_connect ((gpointer) mainwin, "destroy", G_CALLBACK (gtk_main_quit), NULL); - g_signal_connect ((gpointer) addbtn, "clicked", - G_CALLBACK (on_addbtn_clicked), + g_signal_connect ((gpointer) open, "activate", + G_CALLBACK (on_open_activate), + NULL); + g_signal_connect ((gpointer) add_files, "activate", + G_CALLBACK (on_add_files_activate), + NULL); + g_signal_connect ((gpointer) add_folder1, "activate", + G_CALLBACK (on_add_folder1_activate), + NULL); + g_signal_connect ((gpointer) preferences1, "activate", + G_CALLBACK (on_preferences1_activate), + NULL); + g_signal_connect ((gpointer) quit1, "activate", + G_CALLBACK (on_quit1_activate), NULL); - g_signal_connect ((gpointer) playbtn, "clicked", - G_CALLBACK (on_playbtn_clicked), + g_signal_connect ((gpointer) clear1, "activate", + G_CALLBACK (on_clear1_activate), + NULL); + g_signal_connect ((gpointer) select_all1, "activate", + G_CALLBACK (on_select_all1_activate), + NULL); + g_signal_connect ((gpointer) remove1, "activate", + G_CALLBACK (on_remove1_activate), + NULL); + g_signal_connect ((gpointer) crop1, "activate", + G_CALLBACK (on_crop1_activate), + NULL); + g_signal_connect ((gpointer) about1, "activate", + G_CALLBACK (on_about1_activate), NULL); g_signal_connect ((gpointer) volume, "value_changed", G_CALLBACK (on_volume_value_changed), @@ -167,23 +360,57 @@ create_mainwin (void) /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (mainwin, mainwin, "mainwin"); GLADE_HOOKUP_OBJECT (mainwin, vbox1, "vbox1"); - GLADE_HOOKUP_OBJECT (mainwin, hbox1, "hbox1"); - GLADE_HOOKUP_OBJECT (mainwin, toolbar1, "toolbar1"); - GLADE_HOOKUP_OBJECT (mainwin, toolitem1, "toolitem1"); - GLADE_HOOKUP_OBJECT (mainwin, addbtn, "addbtn"); - GLADE_HOOKUP_OBJECT (mainwin, toolitem2, "toolitem2"); - GLADE_HOOKUP_OBJECT (mainwin, playbtn, "playbtn"); - GLADE_HOOKUP_OBJECT (mainwin, toolitem3, "toolitem3"); - GLADE_HOOKUP_OBJECT (mainwin, button3, "button3"); - GLADE_HOOKUP_OBJECT (mainwin, vbox2, "vbox2"); - GLADE_HOOKUP_OBJECT (mainwin, label1, "label1"); + GLADE_HOOKUP_OBJECT (mainwin, hbox2, "hbox2"); + GLADE_HOOKUP_OBJECT (mainwin, handlebox1, "handlebox1"); + GLADE_HOOKUP_OBJECT (mainwin, menubar1, "menubar1"); + GLADE_HOOKUP_OBJECT (mainwin, menuitem1, "menuitem1"); + GLADE_HOOKUP_OBJECT (mainwin, menuitem1_menu, "menuitem1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, open, "open"); + GLADE_HOOKUP_OBJECT (mainwin, separator2, "separator2"); + GLADE_HOOKUP_OBJECT (mainwin, add_files, "add_files"); + GLADE_HOOKUP_OBJECT (mainwin, add_folder1, "add_folder1"); + GLADE_HOOKUP_OBJECT (mainwin, separator1, "separator1"); + GLADE_HOOKUP_OBJECT (mainwin, preferences1, "preferences1"); + GLADE_HOOKUP_OBJECT (mainwin, separatormenuitem1, "separatormenuitem1"); + GLADE_HOOKUP_OBJECT (mainwin, quit1, "quit1"); + GLADE_HOOKUP_OBJECT (mainwin, edit1, "edit1"); + GLADE_HOOKUP_OBJECT (mainwin, edit1_menu, "edit1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, clear1, "clear1"); + GLADE_HOOKUP_OBJECT (mainwin, select_all1, "select_all1"); + GLADE_HOOKUP_OBJECT (mainwin, selection1, "selection1"); + GLADE_HOOKUP_OBJECT (mainwin, selection1_menu, "selection1_menu"); + GLADE_HOOKUP_OBJECT (mainwin, remove1, "remove1"); + GLADE_HOOKUP_OBJECT (mainwin, crop1, "crop1"); + GLADE_HOOKUP_OBJECT (mainwin, menuitem4, "menuitem4"); + GLADE_HOOKUP_OBJECT (mainwin, menuitem4_menu, "menuitem4_menu"); + GLADE_HOOKUP_OBJECT (mainwin, about1, "about1"); + GLADE_HOOKUP_OBJECT (mainwin, handlebox2, "handlebox2"); + GLADE_HOOKUP_OBJECT (mainwin, hbox3, "hbox3"); + GLADE_HOOKUP_OBJECT (mainwin, button4, "button4"); + GLADE_HOOKUP_OBJECT (mainwin, image1, "image1"); + GLADE_HOOKUP_OBJECT (mainwin, button5, "button5"); + GLADE_HOOKUP_OBJECT (mainwin, image2, "image2"); + GLADE_HOOKUP_OBJECT (mainwin, button6, "button6"); + GLADE_HOOKUP_OBJECT (mainwin, image3, "image3"); + GLADE_HOOKUP_OBJECT (mainwin, button7, "button7"); + GLADE_HOOKUP_OBJECT (mainwin, image4, "image4"); + GLADE_HOOKUP_OBJECT (mainwin, button8, "button8"); + GLADE_HOOKUP_OBJECT (mainwin, image5, "image5"); + GLADE_HOOKUP_OBJECT (mainwin, button9, "button9"); + GLADE_HOOKUP_OBJECT (mainwin, alignment1, "alignment1"); + GLADE_HOOKUP_OBJECT (mainwin, hbox4, "hbox4"); + GLADE_HOOKUP_OBJECT (mainwin, image6, "image6"); + GLADE_HOOKUP_OBJECT (mainwin, label3, "label3"); + GLADE_HOOKUP_OBJECT (mainwin, handlebox3, "handlebox3"); GLADE_HOOKUP_OBJECT (mainwin, volume, "volume"); - GLADE_HOOKUP_OBJECT (mainwin, vbox3, "vbox3"); - GLADE_HOOKUP_OBJECT (mainwin, label2, "label2"); + GLADE_HOOKUP_OBJECT (mainwin, handlebox4, "handlebox4"); GLADE_HOOKUP_OBJECT (mainwin, playpos, "playpos"); GLADE_HOOKUP_OBJECT (mainwin, _, "_"); GLADE_HOOKUP_OBJECT (mainwin, playlist, "playlist"); GLADE_HOOKUP_OBJECT (mainwin, playscroll, "playscroll"); + GLADE_HOOKUP_OBJECT (mainwin, statusbar1, "statusbar1"); + + gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group); return mainwin; } @@ -25,11 +25,6 @@ psdl_thread (uintptr_t ctx) { int main (int argc, char *argv[]) { - if (argc <= 1) { - printf ("syntax: deadbeef <filename>\n"); - return -1; - } - thread_start (psdl_thread, 0); gtk_set_locale (); @@ -8,6 +8,7 @@ #include "cwav.h" #include "cvorbis.h" #include "cmod.h" +#include "cmp3.h" playItem_t *playlist_head; playItem_t *playlist_tail; @@ -43,6 +44,9 @@ ps_add_file (const char *fname) { else if (!strcasecmp (eol, "mod")) { it->codec = &cmod; } + else if (!strcasecmp (eol, "mp3")) { + it->codec = &cmp3; + } else { return -1; } @@ -91,7 +95,13 @@ ps_add_dir (const char *dirname) { // no hidden files if (namelist[n]->d_name[0] != '.') { - ps_add_file (namelist[n]->d_name); + char fullname[1024]; + strcpy (fullname, dirname); + strncat (fullname, "/", 1024); + strncat (fullname, namelist[n]->d_name, 1024); + if (ps_add_dir (fullname)) { + ps_add_file (fullname); + } } free (namelist[n]); } |