summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Jamfile4
-rw-r--r--callbacks.c174
-rw-r--r--callbacks.h40
-rw-r--r--cmp3.c257
-rw-r--r--cmp3.h6
-rw-r--r--deadbeef.glade515
-rw-r--r--interface.c369
-rw-r--r--main.c5
-rw-r--r--playlist.c12
9 files changed, 1143 insertions, 239 deletions
diff --git a/Jamfile b/Jamfile
index 58c83f0e..d4026852 100644
--- a/Jamfile
+++ b/Jamfile
@@ -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);
diff --git a/cmp3.c b/cmp3.c
new file mode 100644
index 00000000..359f9eb3
--- /dev/null
+++ b/cmp3.c
@@ -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
+};
+
+
diff --git a/cmp3.h b/cmp3.h
new file mode 100644
index 00000000..d7c9dbb6
--- /dev/null
+++ b/cmp3.h
@@ -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;
}
diff --git a/main.c b/main.c
index d80fc50e..987f4365 100644
--- a/main.c
+++ b/main.c
@@ -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 ();
diff --git a/playlist.c b/playlist.c
index 2f25db67..5fc5b91a 100644
--- a/playlist.c
+++ b/playlist.c
@@ -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]);
}