From 44d1fcd1adce0a9d0c62bfc3c5afcdb2033b67a0 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Sat, 1 Mar 2014 17:48:25 -0500 Subject: [PATCH] ocarina: Remove old ocarina code I don't need it anymore, so it is just taking up space. Signed-off-by: Anna Schumaker --- ocarina/Sconscript | 33 - ocarina/images/dice.png | Bin 19717 -> 0 bytes ocarina/images/ocarina.png | Bin 13135 -> 0 bytes ocarina/images/random.png | Bin 988 -> 0 bytes ocarina/images/thumbs_down.png | Bin 1066 -> 0 bytes ocarina/images/thumbs_up.png | Bin 1150 -> 0 bytes ocarina/library.cpp | 147 ---- ocarina/notify.cpp | 52 -- ocarina/ocarina.cpp | 174 ----- ocarina/ocarina.h | 88 --- ocarina/ocarina.xml | 897 ------------------------ ocarina/pipe.cpp | 47 -- ocarina/playlist.cpp | 578 --------------- ocarina/scripts/ocarina | 30 - ocarina/scripts/ocarina-completion.bash | 18 - ocarina/status.cpp | 203 ------ ocarina/tabs.cpp | 283 -------- ocarina/window.cpp | 110 --- 18 files changed, 2660 deletions(-) delete mode 100644 ocarina/Sconscript delete mode 100644 ocarina/images/dice.png delete mode 100644 ocarina/images/ocarina.png delete mode 100644 ocarina/images/random.png delete mode 100644 ocarina/images/thumbs_down.png delete mode 100644 ocarina/images/thumbs_up.png delete mode 100644 ocarina/library.cpp delete mode 100644 ocarina/notify.cpp delete mode 100644 ocarina/ocarina.cpp delete mode 100644 ocarina/ocarina.h delete mode 100644 ocarina/ocarina.xml delete mode 100644 ocarina/pipe.cpp delete mode 100644 ocarina/playlist.cpp delete mode 100644 ocarina/scripts/ocarina delete mode 100644 ocarina/scripts/ocarina-completion.bash delete mode 100644 ocarina/status.cpp delete mode 100644 ocarina/tabs.cpp delete mode 100644 ocarina/window.cpp diff --git a/ocarina/Sconscript b/ocarina/Sconscript deleted file mode 100644 index eeb88135..00000000 --- a/ocarina/Sconscript +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/python -from config import * - -env.ParseConfig('pkg-config --cflags --libs gtk+-2.0') -env.ParseConfig('pkg-config --cflags --libs gmodule-export-2.0') - - -def script(target, source, env): - f = open(str(target[0]), 'w') - for line in open(str(source[0])): - line = line.replace("%DEBUG", str(DEBUG)) - f.write(line) - f.close() - os.chmod(str(target[0]), 0755) - - -extra_files = [ - ("ocarina.xml", "../lib/ocarina/ocarina.xml", copy), - ("images/random.png", "../lib/ocarina/random.png", copy), - ("images/ocarina.png", "../lib/ocarina/ocarina.png", copy), - ("images/thumbs_up.png", "../lib/ocarina/thumbs_up.png", copy), - ("images/thumbs_down.png", "../lib/ocarina/thumbs_down.png", copy), - ("scripts/ocarina", "../bin/ocarina", script), - ("scripts/ocarina-completion.bash", "../lib/ocarina/ocarina-completion.bash", copy), - ("../bin/ocarina", "../ocarina.bin", symlink), -] - -build = [env.Program("../bin/ocarina-player", libsaria + get_cpp_files())] -for (src, dst, func) in extra_files: - build.append(env.Command(dst, src, func)) - -env.Alias("ocarina", build) -Return('build') diff --git a/ocarina/images/dice.png b/ocarina/images/dice.png deleted file mode 100644 index 61c7684110f51ebaead627841653d0938842421e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19717 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 qKFi6;aiD2>6Gc%9GAaaI~=0q4|IPfvB% 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 diff --git a/ocarina/images/random.png b/ocarina/images/random.png deleted file mode 100644 index c67eb31a81ba4e6bd2ad26fd74fb473f31775894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988 zcmV<210(#2P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01HY001HY1Kw=|000007bV*G`2ign_ z6ci33ZZ@s}00Ue}L_t(I%WacSNNRZ;#n110O)D*Ln5LOXDBVB_gEtMt*k*`y(a!(oV`h+?sLp(x6})oML6o6S#Jtybn!sZ`Kn zv3%ERwZ0C8LKq$%#?H<4CL3GMCGR#l=NZ6os^S5 zFc=J!&*$0R-X2z0SIOygvRp0)MN#Pb`kGm-R*a60B9qC`)6)|Z1OWiRH5!fktE($W zlEid69jetTPEJl(xm<=U%ZSBdEElgR)8L{VgcKmb!yQ(XWN<<)96&d<-uX0u^o zVF3<@13b@zF@{_&hyMP4SS%Jan@!m5cFfGofam${gucGMd>|0O>FFtCSw^u~gxBkZ zR;vX7%+1ZATCKwAbfVR2q0{N$`S}?-ovz!UTCM)``uYk*QCOqVpnN`$gM$OSy}bbd zY&IL*Za3QPHdHDV?(XieySq!5mzQ0DMx$vEQLIv_pjN9fpU+1wmkVmO8UWC2Hjzvw zAxRQ?dU`04NDu&KGMT!7m6eq@v)TOP^78VLUav=~RAK`I1EkStKtxEV(}+YONT<_8 zM9k~;GQZz{?{GMN0RRpF*4Ebk_WS)m34-ujxm<2Xqfu6`*NNjeq*5uW*XtM=8DY(4 zvo$_G9-5z@|K8{G?EnD(`Bff|MPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipV? z4FLgna3z-j00XK?L_t(Y$E}o4Xk1kk#((GDH}hU%W|A}sNev{F8Y(dRl%ds@wATFVdzJw8I@)afBvJTzu2lSPKR9chy*I)) z&yLyGo`*)W{naZt2mj|3L02kJTqpkUEBw;pH~Gr)>+7RqYDR}4@hL20iKnl(2y#b0 zu_q_qv!}&RYsh2{4@E8!fJt7x^}vPSW$DM99uv8nK* zw-BGS2^2^YwB7{WWiPSAObkQRnRDK!xD9OUnJQ34oI-Qkq)tLlc)` zH|$JYTS2{0_`31x#dEsFYr%Bp=>76tv=*mv5NS`REt!c!j*sAH?tn|uP_!&|KrkET zuSGAtFdm(m0xKW}tbyVp8aHsiUrC#Zprvw3ozJBSi!zwOhmr0G?+qGcP?La9ReMze z$#;);T{wfkIfMTF7rHQqpT7szAP63_!&B7{4DaQZ!J@gMEqhpZIp~fJ0 zx(DhV{heWy2gIUA5V0uf!b~o}WbMY0*|`HNlnX1ka+97@185@wmtc?fv+%=YK!u7?%%86`bwznV?24p(|GF=w$bj#${8WyjWs8rltYh~m_c}aJ@ z?54YVzd)H%aNFF8RrRU9zKGtVovBrTwZg*fDy4D*V;GUsf<$>yEcixx*Tk{scCkue&E(_zG(QkQj9$t` z0h)M>z};d65k7sgyfV!J%IpVFh2AKHSV?M*rFz2Y%Gx^|u=Z8(P)6{vOE=#1#G+R? zMD45KUhJ?w&6he)f(|}Vf|`0(YfX$(@Jdtl_yZ;I@WIt;6^R|S*x^+FJq&>y1oUmT ksEsYxxS)2e2rbeQB5yL2$-C#C-#P!Y z5X|Fw^mul@EXrqOL4sHH9r<=s*VA*|A@c!j_$qUF*P6|@#8?Cz8$6F*SKomXCFk}n z7@)8rgYCPw0)(ib)PkChPjRZW>xMq&1t|FF&Y_ozDpv^{V3rgdIp2o*hmJ2CAg@0C z$Gs11%@v3riXh|UU^i+CK3f<-VO^G4mQ0h+7nOiA6&6`R{n=K0vgw~M{>{%E<@%wqKs`v>|qCpY_v<~#)jHC0=PgTEF{ck|l8)KQpJ z3ZgRO8aE-GU3(ncZV1S%PQO@IuyMue74Zn@IvATilSGlv0)fx3Ij+1~P}FyU8?L$fTSp}h@39oTYzKKubK5*>+rnej3H2_p8?)nRgC+;DnzW-@OC zo7I{_viIk(7b{B*Kqysw(5N4=%3{dGWE7h>6j)G1 zSbmCd3s8;{;2QIw?(0UCWWSQjUVf$=Dlf`k>M*>NcgHCQ7B92FcIy>hn@FpXhzy2Y z%y1QLih@YQ7m}A=-c_CI!_WHh^U8&Sb?;CSZ8dz>(gxw(NrjXF_Axx{9~NlT!p%kW)Go0BB(w6pbPanRLpq>@6=bJ_=! zjbQbfXkH6;U4Y1Ko9jpTo#}UmHKB%|fwwOZlDyr{@;CD#@`oLT0bXbt!#xkiaBx_T z*)!nwGMQ5E--j}Sb0^$zyzbzD=j?3VmT5pJDo2YKzDpXiO5*rH5wPnLxV^*y;*6ER z0Y5jn@p~-?Bt4tT)>Xt`3uyLW!lnC`XIO2Csg|%zvp_^1{Vylon7FKCYLG+2$LE5} z)_LJwXSM;z+qwjrO2ZOK0(yQJL-%XHl9X+BcE`pTSS@@l1lfNw5qNg4Km1U~*;ERl zcVib-_}#(U{=>a5a3`tEvQ!46ETSu)PLBrXTTYU)-Tpa0C`-(>Av#tiz?2l8O?ck1!D4okXvY#YSzD;ZU-s|1{4>2IJ8z2lX Q5C8xG07*qoM6N<$g7@emNdN!< diff --git a/ocarina/library.cpp b/ocarina/library.cpp deleted file mode 100644 index a9eff373..00000000 --- a/ocarina/library.cpp +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) 2012 Bryan Schumaker -#include -#include "ocarina.h" - -static inline GtkListStore *get_list() -{ - return GTK_LIST_STORE(get_object("LibraryList")); -} - -static bool find_iter(libsaria::library::Path *path, GtkTreeIter *iter) -{ - libsaria::library::Path *list_path; - - /* get_iter_first() return FALSE if the liststore is empty */ - if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(get_list()), iter)) - return false; - - do { - gtk_tree_model_get(GTK_TREE_MODEL(get_list()), iter, 0, &list_path, -1); - if (list_path == path) - return true; - } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(get_list()), iter)); - - return false; -} - -static libsaria::library::Path *find_path(gchar *path) -{ - GtkTreeIter iter; - libsaria::library::Path *lib_path = NULL; - - if (!gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(get_list()), &iter, path)) - return NULL; - gtk_tree_model_get(GTK_TREE_MODEL(get_list()), &iter, 0, &lib_path, -1); - return lib_path; -} - -static libsaria::library::Path *get_selected_path(GtkWidget *treeview) -{ - GtkTreeIter iter; - GtkTreeModel *model = GTK_TREE_MODEL(get_list()); - GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - libsaria::library::Path *path; - - if (!gtk_tree_selection_get_selected(sel, &model, &iter)) - return NULL; - gtk_tree_model_get(model, &iter, 0, &path, -1); - return path; -} - -static void path_updated(libsaria::library::Path *path) -{ - GtkTreeIter iter; - if (!find_iter(path, &iter)) - return; - - gtk_list_store_set(get_list(), &iter, - 1, path->visible, - 2, path->path.c_str(), - 3, path->tracks.size(), - -1); -} - -static void path_added(libsaria::library::Path *path) -{ - GtkTreeIter iter; - println("Path added: " + path->path); - gtk_list_store_append(get_list(), &iter); - gtk_list_store_set(get_list(), &iter, - 0, path, - 1, path->visible, - 2, path->path.c_str(), - 3, path->tracks.size(), - -1); -} - -static void path_removed(libsaria::library::Path *path) -{ - GtkTreeIter iter; - if (!find_iter(path, &iter)) - return; - gtk_list_store_remove(get_list(), &iter); -} - -void notify_library(notify_t event, libsaria::library::Path *path) -{ - switch (event) { - case PATH_ADDED: - path_added(path); - break; - case PATH_DELETED: - path_removed(path); - break; - case PATH_UPDATED: - path_updated(path); - default: - break; - } -} - -static void add_library(GtkWidget *b, gpointer d) -{ - string dir = run_chooser("DirectoryChooser"); - if (dir != "") { - println("Scanning dir: " + dir); - libsaria::library::add_path(dir); - } -} - -static void path_toggled(GtkCellRendererToggle *toggle, gchar *path, gpointer d) -{ - libsaria::library::Path *lib_path = find_path(path); - if (!path) - return; - - if (gtk_cell_renderer_toggle_get_active(toggle)) - libsaria::library::show_path(lib_path); - else - libsaria::library::hide_path(lib_path); -} - -static gboolean key_pressed(GtkWidget *treeview, GdkEvent *event, gpointer data) -{ - libsaria::library::Path *path; - string key = gdk_keyval_name(event->key.keyval); - println("Library settings handling key press: " + key); - - path = get_selected_path(treeview); - if (!path) - return FALSE; - - if (key == "Delete") - libsaria::library::delete_path(path); - else if (key == "plus" || key == "KP_Add") - add_library(NULL, NULL); - else - return FALSE; - return TRUE; -} - -void init_library() -{ - connect_signal("AddLibrary", "clicked", G_CALLBACK(add_library), NULL); - connect_signal("UpdateLibraries", "clicked", G_CALLBACK(libsaria::library::update_all), NULL); - connect_signal("LibraryToggle", "toggled", G_CALLBACK(path_toggled), NULL); - connect_signal("LibraryView", "key-press-event", G_CALLBACK(key_pressed), NULL); -} diff --git a/ocarina/notify.cpp b/ocarina/notify.cpp deleted file mode 100644 index 75b368d5..00000000 --- a/ocarina/notify.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2012 Bryan Schumaker. -#include -#include "ocarina.h" - -static void idle_add() -{ - if (libsaria::idle::size() == 1) { - println("Adding idle callback"); - g_idle_add(ocarina_idle, NULL); - } -} - -void on_notify(notify_t event, void *data) -{ - /* TODO: Array of function pointers */ - switch (event) { - case IDLE_ADD: - idle_add(); - break; - case TRACK_CHANGED: - update_labels((libsaria::Track *)data); - break; - case PATH_ADDED: - case PATH_DELETED: - case PATH_UPDATED: - notify_library(event, (libsaria::library::Path *)data); - break; - case PLAYING: - case PAUSED: - update_buttons(event); - break; - case PAUSE_TYPE: - update_autopause_type((AutoPauseType *)data); - break; - case PAUSE_COUNT: - update_autopause_count((unsigned int *)data); - break; - case PLAYLIST_NEW: - case PLAYLIST_DELETE: - case PLAYLIST_RENUMBER: - case PLAYLIST_CHANGED: - update_tabs(event, (libsaria::Playlist *)data); - break; - case PLAYLIST_ADD: - case PLAYLIST_RM: - case PLAYLIST_UPDATE: - case PLAYLIST_GOTO: - update_playlist(event, (libsaria::PlaylistNotification *)data); - default: - break; - } -} diff --git a/ocarina/ocarina.cpp b/ocarina/ocarina.cpp deleted file mode 100644 index 86c74306..00000000 --- a/ocarina/ocarina.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2011 Bryan Schumaker -#include -#include -#include -#include -#include -#include - -#include "ocarina.h" - -static string lib_path; -static GtkBuilder *builder; -static GtkWidget *ban_button; -static GtkWidget *yes_image; -static GtkWidget *no_image; - -static void find_exe_path(string &res) -{ - char buf[1024]; - ssize_t len = readlink("/proc/self/exe", buf, sizeof(buf) -1); - if (len != -1) - res = string(buf); -} - -static void rstrip_word(string &path) -{ - unsigned int index = path.rfind("/"); - if (index != string::npos) - path = path.substr(0, index); -} - -static void find_lib_path() -{ - string exe; - - find_exe_path(exe); - if (exe == "") - return; - - rstrip_word(exe); // ocarina-player - rstrip_word(exe); // bin/ - - lib_path = exe + "/lib/ocarina"; - println("Lib directory? %s", lib_path.c_str()); -} - -string lib_file(const string &path) -{ - string res = lib_path + "/" + path; - println("Expanding to path: " + res); - return res; -} - -gboolean ocarina_idle(gpointer data) -{ - int size = libsaria::idle::run_task(); - return update_idle_bar(size); -} - -static gboolean timeout_poll(gpointer data) -{ - update_progress(); - return TRUE; -} - -GObject *get_object(const string &name) -{ - /* TODO: Figure out GtkNotebook action area in GtkBuilder */ - if (name == "BanButton") - return G_OBJECT(ban_button); - else if (name == "YesImage") - return G_OBJECT(yes_image); - else if (name == "NoImage") - return G_OBJECT(no_image); - return gtk_builder_get_object(builder, name.c_str()); -} - -GtkWidget *get_widget(const string &name) -{ - GtkWidget *widget = GTK_WIDGET(get_object(name)); - if (!widget) - println(name + " is not a widget!"); - return widget; -} - -void connect_signal(const string &name, const string &signal, GCallback func, void *data) -{ - GObject *widget = get_object(name); - if (widget) - g_signal_connect(widget, signal.c_str(), func, data); -} - -string run_chooser(const string &name) -{ - char *file; - string filename = ""; - GtkWidget *chooser = get_widget(name); - - if (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_OK) { - file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - filename = file; - g_free(file); - } - gtk_widget_hide(chooser); - return filename; -} - -static void init_widgets() -{ - ban_button = gtk_toggle_button_new(); - yes_image = gtk_image_new_from_file(lib_file("thumbs_up.png").c_str()); - no_image = gtk_image_new_from_file(lib_file("thumbs_down.png").c_str()); - gtk_button_set_image(GTK_BUTTON(ban_button), yes_image); - - /* Prevent widgets from being destroyed when toggling banned button */ - g_object_ref(yes_image); - g_object_ref(no_image); -} - -static void init(int argc, char **argv) -{ - gtk_init(&argc, &argv); - - builder = gtk_builder_new(); - gtk_builder_add_from_file(builder, lib_file("ocarina.xml").c_str(), NULL); - - /* Set up small button style */ - gtk_rc_parse_string( - "style \"small-button-style\"\n" - "{\n" - " GtkButton::inner-border = {0,0,0,0}\n" - "}\n" - "widget \"*.ocarina-small-button\" style \"small-button-style\""); - - /* Initialize widgets static to this file */ - init_widgets(); - - /* Other setup */ - init_window(); - init_library(); - init_tabs(); - init_playlist(); - init_status(); - init_pipe(); - - /* Connect signals */ - connect_signal("PlayButton", "clicked", libsaria::audio::play, NULL); - connect_signal("PauseButton", "clicked", libsaria::audio::pause, NULL); - connect_signal("StopButton", "clicked", libsaria::audio::stop, NULL); - connect_signal("PrevButton", "clicked", libsaria::deck::prev, NULL); - connect_signal("NextButton", "clicked", libsaria::deck::next, NULL); - - /* Show any widgets that need showing */ - gtk_timeout_add(250, timeout_poll, NULL); -} - -int main(int argc, char **argv) -{ - struct libsaria::initdata ls_init = { - argc, - argv, - on_notify, /* notification handler */ - }; - println("Ocarina " + vers_str()); - find_lib_path(); - - libsaria::init(&ls_init); - init(argc, argv); - - gtk_main(); - libsaria::quit(); - - return 0; -} diff --git a/ocarina/ocarina.h b/ocarina/ocarina.h deleted file mode 100644 index 83d071b1..00000000 --- a/ocarina/ocarina.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef OCARINA_H -#define OCARINA_H - -#include -#include -#include -#include - -#include -#include -using namespace std; - -enum ExtraWidgets { - NO_EXTRA_WIDGETS = 0, - CLOSE_BUTTON = (1 << 0), - DISABLE_BUTTON = (1 << 1), - RANDOM_BUTTON = (1 << 2), - SORT_BUTTON = (1 << 3), -}; - -struct PlaylistWidgets { - libsaria::Playlist *playlist; - GtkListStore *liststore; - GtkBox *page_box; - GtkBox *tab_box; - GtkTreeView *treeview; - GtkTreeModel *filter; - GtkLabel *size_label; - GtkLabel *page_label; - GtkEntry *entry; - GtkToggleButton *disable; - GtkToggleButton *random; - GtkToggleButton *sort; - set *filter_text; -}; - -/* library.cpp */ -void notify_library(notify_t, libsaria::library::Path *); -void init_library(); - -/* notify.cpp */ -void on_notify(notify_t, void *); - -/* ocarina.cpp */ -string lib_file(const string &); -gboolean ocarina_idle(gpointer); -GObject *get_object(const string &); -GtkWidget *get_widget(const string &); -void connect_signal(const string &, const string &, GCallback, void *); -string run_chooser(const string &); - -/* pipe.cpp */ -void init_pipe(); - -/* playlist.cpp */ -void update_playlist(notify_t, libsaria::PlaylistNotification *); -bool playlist_key_pressed(GtkTreeView *treeview, string &); -void setup_widgets(struct PlaylistWidgets *, libsaria::Playlist *); -void setup_playlist_page(struct PlaylistWidgets *, int); -void init_playlist(); - -/* status.cpp */ -bool update_idle_bar(int); -void update_length_label(libsaria::Playlist *); -void update_labels(libsaria::Track *); -void update_buttons(notify_t); -void update_progress(); -void update_autopause_type(AutoPauseType *); -void update_autopause_count(unsigned int *); -void init_status(); - -/* tabs.cpp */ -struct PlaylistWidgets *find_playlist_widgets(libsaria::Playlist *); -struct PlaylistWidgets *current_widgets(); -libsaria::Playlist *current_playlist(); -bool playlist_entry_focused(); -void playlist_focus_entry(); -bool playlist_key_press(string &); -void playlist_focus_treeview(); -void playlist_switch_to(string &); -void playlist_switch_to_n(unsigned int); -void init_tabs(); -void update_tabs(notify_t, libsaria::Playlist *); - -/* window.cpp */ -void init_window(); - -#endif diff --git a/ocarina/ocarina.xml b/ocarina/ocarina.xml deleted file mode 100644 index 03df1cd4..00000000 --- a/ocarina/ocarina.xml +++ /dev/null @@ -1,897 +0,0 @@ - - - - - - - False - 5 - Choose a directory - GtkFileChooserDialog - dialog - select-folder - False - - - True - False - 2 - - - True - False - end - - - gtk-cancel - False - True - True - True - True - - - False - False - 0 - - - - - gtk-open - False - True - True - True - True - - - False - False - 1 - - - - - False - True - end - 0 - - - - - - - - - DirectoryCancelButton - DirectoryOpenButton - - - - False - 5 - Choose a file - GtkFileChooserDialog - dialog - - - True - False - 2 - - - True - False - end - - - gtk-cancel - False - True - True - True - True - - - False - False - 0 - - - - - gtk-open - False - True - True - True - True - - - False - False - 1 - - - - - False - True - end - 0 - - - - - - - - - FileCancelButton - FileOpenButton - - - - - - - - - - - - - - - - True - False - 900 - 600 - - - True - False - - - True - True - left - True - 0 - 0 - 0 - - - True - True - 0 - - - - - True - False - - - True - False - - - False - True - 0 - - - - - True - True - 0 - False - left - - - True - True - 1 - - - - - True - False - - - False - True - 2 - - - - - False - True - True - True - 0 - - - True - False - 0 - 0 - gtk-media-play - 1 - - - - - False - False - 3 - - - - - False - True - True - 0 - 0 - - - True - False - 0 - 0 - gtk-media-pause - 1 - - - - - False - False - 4 - - - - - False - True - True - True - 0 - 0 - - - True - False - gtk-media-stop - 1 - - - - - False - False - 5 - - - - - False - True - True - True - 0 - 0 - - - True - False - 0 - 0 - gtk-media-previous - 1 - - - - - False - False - 6 - - - - - False - True - True - True - 0 - 0 - - - True - False - gtk-media-next - 1 - - - - - False - False - 7 - - - - - False - True - 1 - - - - - True - False - True - - - True - True - automatic - never - - - True - False - etched-in - - - True - False - - - True - False - 0 - <span size='xx-large'> </span> - True - - - True - False - 0 - - - - - True - False - 0 - 0 - <span size='x-large'> </span> - True - - - True - False - 1 - - - - - True - False - 0 - 0 - <span size='x-large'> </span> - True - - - True - False - 2 - - - - - - - - - True - True - 0 - - - - - True - True - left - - - True - False - - - No automatic pause - False - True - True - False - True - True - - - True - True - 0 - - - - - True - False - - - Pause after - False - True - True - False - True - NoPause - - - False - False - 0 - - - - - True - True - - True - False - False - True - True - PauseAdjustment - - - False - False - 1 - - - - - True - False - songs - - - False - False - 2 - - - - - True - True - 1 - - - - - - - True - False - AutoPause - - - False - - - - - True - False - - - True - True - automatic - automatic - - - True - True - LibraryList - False - False - - - On - - - - 1 - - - - - - - Path - True - - - - 2 - - - - - - - Size - - - - 3 - - - - - - - - - True - True - 0 - - - - - True - False - - - False - True - True - True - 0 - 0 - - - True - False - gtk-add - 1 - - - - - False - False - 0 - - - - - False - True - True - True - 0 - 0 - - - True - False - gtk-refresh - 1 - - - - - False - False - 1 - - - - - False - False - 1 - - - - - 1 - - - - - True - False - Library - - - 1 - False - - - - - True - False - - - Show list recently played songs - False - True - True - False - True - True - - - False - False - 0 - - - - - Show list of banned songs - False - True - True - False - 0.54000002145767212 - True - True - - - False - False - 1 - - - - - - - - 2 - - - - - True - False - Settings - - - 2 - False - - - - - True - True - 1 - - - - - False - True - 2 - - - - - True - False - - - 10 - False - - - False - False - 0 - - - - - True - False - 1 - - - True - True - 1 - - - - - False - False - 3 - - - - - - - 256 - 1 - 10 - - - True - False - - - False - True - False - New queue (front) - True - - - - - False - True - False - New set (front) - True - - - - - False - True - False - - - - - False - True - False - New queue (back) - True - - - - - False - True - False - New set (back) - True - - - - - False - True - False - - - - - False - True - False - Add to playlist 0 - True - - - - - False - True - False - Add to playlist 1 - True - - - - - False - True - False - Add to playlist 2 - True - - - - - False - True - False - Add to playlist 3 - True - - - - - False - True - False - Add to playlist 4 - True - - - - - False - True - False - Add to playlist 5 - True - - - - - False - True - False - Add to playlist 6 - True - - - - - False - True - False - Add to playlist 7 - True - - - - - False - True - False - Add to playlist 8 - True - - - - - False - True - False - Add to playlist 9 - True - - - - diff --git a/ocarina/pipe.cpp b/ocarina/pipe.cpp deleted file mode 100644 index 590d4d3a..00000000 --- a/ocarina/pipe.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Bryan Schumaker 2012. -#include -#include -#include - -#include -#include -using namespace std; - -static GIOChannel *pipe_in; - -static void pipe_read_text(GIOChannel *source, string &text) -{ - gchar *str = NULL; - GError *error = NULL; - gsize size, end; - - g_io_channel_read_line(source, &str, &size, &end, &error); - - text = str; - /* Strip newline character */ - text = text.substr(0, text.size() - 1); - - /* g_io_channel_read_line allocates memory */ - g_free(str); -} - -static gboolean pipe_read(GIOChannel *source, GIOCondition condition, gpointer data) -{ - string text; - pipe_read_text(source, text); - libsaria::run_cmd(text); - return TRUE; -} - -void init_pipe() -{ - GError *error = NULL; - string pipe = libsaria::app::pipe_file(); - if (pipe == "") - return; - - pipe_in = g_io_channel_new_file(pipe.c_str(), "r+", &error); - if (!pipe_in) - return; - g_io_add_watch(pipe_in, G_IO_IN, pipe_read, NULL); -} diff --git a/ocarina/playlist.cpp b/ocarina/playlist.cpp deleted file mode 100644 index 0e2d80ea..00000000 --- a/ocarina/playlist.cpp +++ /dev/null @@ -1,578 +0,0 @@ -// Copyright (c) 2012 Bryan Schumaker -#include -#include -#include -#include -#include -#include "ocarina.h" - -static GType types[] = { - G_TYPE_POINTER, // libsaria::Track * - G_TYPE_UINT, // Track number - G_TYPE_STRING, // Title - G_TYPE_STRING, // Length - G_TYPE_STRING, // Artist - G_TYPE_STRING, // Album - G_TYPE_UINT, // Year - G_TYPE_UINT, // Count - G_TYPE_STRING, // Last played - G_TYPE_STRING, // Filepath -}; - -static string formatted(string str) -{ - char *escaped = g_markup_escape_text(str.c_str(), -1); - string ret = escaped; - g_free(escaped); - return ret; -} - -static void update_track(libsaria::Track *track, GtkListStore *liststore, - GtkTreeIter *iter) -{ - gtk_list_store_set(liststore, iter, - 0, track, - 1, track->track, - 2, track->title.c_str(), - 3, track->lenstr.c_str(), - 4, track->artist.c_str(), - 5, track->album.c_str(), - 6, track->year, - 7, track->count, - 8, track->get_last_played().c_str(), - 9, formatted(track->filepath).c_str(), - -1); -} - -static void playlist_add(libsaria::Playlist *plist, libsaria::Track *track, - unsigned int index) -{ - GtkTreeIter iter; - struct PlaylistWidgets *widgets = find_playlist_widgets(plist); - if (!widgets) - return; - - gtk_list_store_insert(widgets->liststore, &iter, index); - update_track(track, widgets->liststore, &iter); -} - -static void playlist_rm(libsaria::Playlist *plist, unsigned int index) -{ - GtkTreeIter iter; - PlaylistWidgets *widgets = find_playlist_widgets(plist); - gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(widgets->liststore), &iter, NULL, index); - gtk_list_store_remove(widgets->liststore, &iter); - update_length_label(current_playlist()); -} - -static void playlist_update(libsaria::Playlist *plist, libsaria::Track *track, - unsigned int index) -{ - GtkTreeIter iter; - PlaylistWidgets *widgets = find_playlist_widgets(plist); - gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(widgets->liststore), &iter, NULL, index); - update_track(track, widgets->liststore, &iter); -} - -static void set_playlist_size(libsaria::Playlist *plist) -{ - char buf[11]; - struct PlaylistWidgets *widgets = find_playlist_widgets(plist); - if (!widgets) - return; - - sprintf(buf, "%u", plist->get_size()); - gtk_label_set_text(widgets->size_label, buf); - update_length_label(current_playlist()); -} - -static void playlist_goto_index(libsaria::Playlist *playlist, unsigned int index) -{ - GtkTreeIter iter; - GtkTreePath *path; - struct PlaylistWidgets *widgets = find_playlist_widgets(playlist); - GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore); - - gtk_tree_model_get_iter_first(model, &iter); - path = gtk_tree_model_get_path(model, &iter); - for (unsigned int i = 0; i < index; i++) - gtk_tree_path_next(path); - - gtk_tree_view_set_cursor(widgets->treeview, path, NULL, FALSE); - gtk_tree_path_free(path); -} - -void update_playlist(notify_t event, libsaria::PlaylistNotification *data) -{ - if (event == PLAYLIST_ADD) { - playlist_add(data->plist, data->track, data->index); - set_playlist_size(data->plist); - } else if (event == PLAYLIST_RM) { - playlist_rm(data->plist, data->index); - set_playlist_size(data->plist); - } else if (event == PLAYLIST_UPDATE) - playlist_update(data->plist, data->track, data->index); - else if (event == PLAYLIST_GOTO) - playlist_goto_index(data->plist, data->index); -} - -static gboolean is_visible(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) -{ - libsaria::Track *track; - struct PlaylistWidgets *widgets = (struct PlaylistWidgets *)data; - - if (widgets->filter_text == NULL) - return true; - - gtk_tree_model_get(model, iter, 0, &track, -1); - return track->is_visible(widgets->filter_text); -} - -static void do_filter(GtkWidget *entry, gpointer data) -{ - struct PlaylistWidgets *widgets = (struct PlaylistWidgets *)data; - string text = gtk_entry_get_text(GTK_ENTRY(entry)); - widgets->filter_text = libsaria::format_text(text); - - gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(widgets->filter)); -} - -static void track_selected(GtkWidget *treeview, GtkTreePath *path, - GtkTreeViewColumn *col, gpointer data) -{ - GtkTreeIter iter; - GtkTreeModel *model; - libsaria::Track *track; - - model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); - gtk_tree_model_get_iter(model, &iter, path); - gtk_tree_model_get(model, &iter, 0, &track, -1); - track->load(true); -} - -static void do_tree_path_prev(GtkTreePath *path) -{ - gtk_tree_path_prev(path); -} - -static void do_move_cursor(GtkTreeView *treeview, void path_next(GtkTreePath *)) -{ - GtkTreePath *path, *scroll; - - gtk_widget_grab_focus(GTK_WIDGET(treeview)); - gtk_tree_view_get_cursor(treeview, &path, NULL); - if (path == NULL) - return; - - path_next(path); - scroll = gtk_tree_path_copy(path); - - for (unsigned int i = 0; i < 2; i++) - path_next(scroll); - - gtk_tree_view_scroll_to_cell(treeview, scroll, NULL, FALSE, 0, 0); - gtk_tree_view_set_cursor(treeview, path, NULL, FALSE); - - gtk_tree_path_free(path); - gtk_tree_path_free(scroll); -} - -static void move_cursor(GtkTreeView *treeview, const string &key) -{ - if (key == "j") - do_move_cursor(treeview, gtk_tree_path_next); - else - do_move_cursor(treeview, do_tree_path_prev); -} - -static void selected_foreach_list(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer data) -{ - libsaria::Track *track; - list *tracks = (list *)data; - gtk_tree_model_get(model, iter, 0, &track, -1); - tracks->push_back(track); -} - -static void list_selected_tracks(GtkTreeView *treeview, list *tracks) -{ - GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - gtk_tree_selection_selected_foreach(selection, selected_foreach_list, tracks); -} - -static void selected_foreach_index(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer data) -{ - list *indices = (list *)data; - unsigned int *index = (unsigned int *)gtk_tree_path_get_indices(path); - indices->push_back(*index); -} - -static void list_selected_indices(GtkTreeView *treeview, list *indices) -{ - GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - gtk_tree_selection_selected_foreach(selection, selected_foreach_index, indices); -} - -static void new_playlist(const string &key, GtkTreeView *treeview, bool front) -{ - list tracks; - unsigned int flags = PL_NONE; - - list_selected_tracks(treeview, &tracks); - if (tracks.size() == 0) - return; - - if (key == "s" || key == "S") - flags |= PL_SORTED | PL_RANDOM; - libsaria::deck::new_playlist(tracks, flags, front); -} - -static bool add_to_playlist(GtkTreeView *treeview, int n) -{ - list tracks; - libsaria::Playlist *playlist; - - list_selected_tracks(treeview, &tracks); - if (tracks.size() == 0) - return false; - - playlist = libsaria::deck::get_playlist(n); - if (playlist) - playlist->push_back(tracks); - return true; -} - -static void ban_selected(GtkTreeView *treeview, bool state) -{ - list tracks; - list::iterator it; - - list_selected_tracks(treeview, &tracks); - for (it = tracks.begin(); it != tracks.end(); it++) - (*it)->set_banned(state); -} - -static void delete_from_playlist(GtkTreeView *treeview) -{ - list indices; - libsaria::Playlist *playlist = current_playlist(); - - if (playlist == libsaria::library::get_playlist() || playlist == libsaria::ban::get_banned_plist()) { - ban_selected(treeview, playlist == libsaria::library::get_playlist()); - return; - } - - list_selected_indices(treeview, &indices); - - if (indices.back() == (playlist->get_size() - 1)) - move_cursor(treeview, "k"); - else - move_cursor(treeview, "j"); - - playlist->remove_indices(indices); - libsaria::deck::garbage_collect(); -} - -static bool on_escape_key(GtkTreeView *treeview) -{ - GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - if (gtk_tree_selection_count_selected_rows(selection) == 0) - return false; - gtk_tree_selection_unselect_all(selection); - return true; -} - -static void on_return_key(GtkTreeView *treeview) -{ - GtkTreePath *path; - GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview); - if (gtk_tree_selection_count_selected_rows(selection) == 0) - return; - gtk_tree_view_get_cursor(treeview, &path, NULL); - gtk_tree_view_row_activated(treeview, path, NULL); - gtk_tree_path_free(path); -} - -bool playlist_key_pressed(GtkTreeView *treeview, string &key) -{ - if (key == "j" || key == "k") - move_cursor(treeview, key); - else if (key == "s" || key == "q") - new_playlist(key, treeview, false); - else if (key == "S" || key == "Q") - new_playlist(key, treeview, true); - else if (key >= "0" && key <= "9") - return add_to_playlist(treeview, atoi(key.c_str())); - else if (key == "Delete" || key == "d") - delete_from_playlist(treeview); - else if (key == "Return") - on_return_key(treeview); - else if (key == "Escape") - return on_escape_key(treeview); - else - return false; - return true; -} - -static void on_menu_item(GtkWidget *item, gpointer data) -{ - struct PlaylistWidgets *widgets = current_widgets(); - if (item == get_widget("MenuQueueFront")) - new_playlist("Q", widgets->treeview, true); - else if (item == get_widget("MenuQueueBack")) - new_playlist("q", widgets->treeview, false); - else if (item == get_widget("MenuSetFront")) - new_playlist("S", widgets->treeview, true); - else if (item == get_widget("MenuSetBack")) - new_playlist("s", widgets->treeview, false); - else if (item == get_widget("AddPlaylist0")) - add_to_playlist(widgets->treeview, 0); - else if (item == get_widget("AddPlaylist1")) - add_to_playlist(widgets->treeview, 1); - else if (item == get_widget("AddPlaylist2")) - add_to_playlist(widgets->treeview, 2); - else if (item == get_widget("AddPlaylist3")) - add_to_playlist(widgets->treeview, 3); - else if (item == get_widget("AddPlaylist4")) - add_to_playlist(widgets->treeview, 4); - else if (item == get_widget("AddPlaylist5")) - add_to_playlist(widgets->treeview, 5); - else if (item == get_widget("AddPlaylist6")) - add_to_playlist(widgets->treeview, 6); - else if (item == get_widget("AddPlaylist7")) - add_to_playlist(widgets->treeview, 7); - else if (item == get_widget("AddPlaylist8")) - add_to_playlist(widgets->treeview, 8); - else if (item == get_widget("AddPlaylist9")) - add_to_playlist(widgets->treeview, 9); -} - -static gboolean entry_keypress(GtkEntry *entry, GdkEvent *event, gpointer data) -{ - string key = gdk_keyval_name(event->key.keyval); - if (key == "Return") { - playlist_focus_treeview(); - return TRUE; - } - return FALSE; -} - -static void show_menu_widget(const string &name, unsigned int plist_num, - unsigned int deck_size) -{ - if (plist_num < deck_size) - gtk_widget_show(get_widget(name)); - else - gtk_widget_hide(get_widget(name)); -} - -static void on_click(GtkTreeView *treeview, GdkEvent *event, gpointer data) -{ - unsigned int deck_size = libsaria::deck::size(); - - if (event->button.button != 3) - return; - - show_menu_widget("MenuQueueBack", deck_size, 10); - show_menu_widget("MenuQueueFront", deck_size, 10); - show_menu_widget("MenuSetBack", deck_size, 10); - show_menu_widget("MenuSetFront", deck_size, 10); - show_menu_widget("MenuNewSep", deck_size, 10); - - if (deck_size > 0 && deck_size < 10) - gtk_widget_show(get_widget("MenuAddSep")); - else - gtk_widget_hide(get_widget("MenuAddSep")); - - show_menu_widget("AddPlaylist0", 0, deck_size); - show_menu_widget("AddPlaylist1", 1, deck_size); - show_menu_widget("AddPlaylist2", 2, deck_size); - show_menu_widget("AddPlaylist3", 3, deck_size); - show_menu_widget("AddPlaylist4", 4, deck_size); - show_menu_widget("AddPlaylist5", 5, deck_size); - show_menu_widget("AddPlaylist6", 6, deck_size); - show_menu_widget("AddPlaylist7", 7, deck_size); - show_menu_widget("AddPlaylist8", 8, deck_size); - show_menu_widget("AddPlaylist9", 9, deck_size); - - gtk_menu_popup(GTK_MENU(get_widget("PlaylistMenu")), NULL, NULL, NULL, NULL, event->button.button, event->button.time); -} - -static void playlist_close(GtkWidget *button, gpointer data) -{ - struct libsaria::Playlist *playlist = (libsaria::Playlist *)data; - libsaria::deck::delete_playlist(playlist); -} - -static void playlist_disable(GtkToggleButton *button, gpointer data) -{ - struct libsaria::Playlist *playlist = (libsaria::Playlist *)data; - playlist->set_flag(PL_DISABLED, gtk_toggle_button_get_active(button)); -} - -static void playlist_random(GtkToggleButton *button, gpointer data) -{ - struct libsaria::Playlist *playlist = (libsaria::Playlist *)data; - if (playlist == libsaria::library::get_playlist()) - libsaria::library::set_random(gtk_toggle_button_get_active(button)); - else - playlist->set_flag(PL_RANDOM, gtk_toggle_button_get_active(button)); -} - -static void playlist_sort(GtkToggleButton *button, gpointer data) -{ - struct libsaria::Playlist *playlist = (libsaria::Playlist *)data; - playlist->set_flag(PL_SORTED, gtk_toggle_button_get_active(button)); -} - -void setup_widgets(struct PlaylistWidgets *widgets, libsaria::Playlist *playlist) -{ - unsigned int num_columns = sizeof(types) / sizeof(GType); - GtkTreeSelection *selection; - - widgets->playlist = playlist; - widgets->liststore = gtk_list_store_newv(num_columns, types); - widgets->page_box = GTK_BOX(gtk_vbox_new(FALSE, 0)); - widgets->treeview = GTK_TREE_VIEW(gtk_tree_view_new()); - widgets->filter = gtk_tree_model_filter_new( - GTK_TREE_MODEL(widgets->liststore), NULL); - widgets->size_label = GTK_LABEL(gtk_label_new("0")); - widgets->page_label = GTK_LABEL(gtk_label_new("")); - widgets->entry = GTK_ENTRY(gtk_entry_new()); - widgets->filter_text = NULL; - - selection = gtk_tree_view_get_selection(widgets->treeview); - gtk_tree_selection_set_mode(selection,GTK_SELECTION_MULTIPLE); - - gtk_tree_view_set_model(widgets->treeview, widgets->filter); - gtk_tree_view_set_rules_hint(widgets->treeview, TRUE); - gtk_tree_view_set_enable_search(widgets->treeview, FALSE); - gtk_tree_view_set_tooltip_column(widgets->treeview, 9); - - gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(widgets->filter), - is_visible, widgets, NULL); - - g_signal_connect(widgets->treeview, "row-activated", G_CALLBACK(track_selected), NULL); - g_signal_connect(widgets->treeview, "button-release-event", G_CALLBACK(on_click), NULL); - g_signal_connect(widgets->entry, "changed", G_CALLBACK(do_filter), widgets); - g_signal_connect(widgets->entry, "key-press-event", G_CALLBACK(entry_keypress), widgets); -} - -static GtkWidget *setup_close_button(struct PlaylistWidgets *widgets) -{ - GtkWidget *close = gtk_button_new(); - GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); - - gtk_button_set_image(GTK_BUTTON(close), image); - gtk_button_set_relief(GTK_BUTTON(close), GTK_RELIEF_NONE); - gtk_widget_set_name(close, "ocarina-small-button"); - g_signal_connect(close, "clicked", G_CALLBACK(playlist_close), widgets->playlist); - - return close; -} - -static GtkWidget *setup_disable_button(struct PlaylistWidgets *widgets) -{ - GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_MENU); - widgets->disable = GTK_TOGGLE_BUTTON(gtk_toggle_button_new()); - - gtk_button_set_image(GTK_BUTTON(widgets->disable), image); - gtk_widget_set_name(GTK_WIDGET(widgets->disable), "ocarina-small-button"); - g_signal_connect(GTK_WIDGET(widgets->disable), "toggled", G_CALLBACK(playlist_disable), widgets->playlist); - - return GTK_WIDGET(widgets->disable); -} - -static GtkWidget *setup_random_button(struct PlaylistWidgets *widgets) -{ - GtkWidget *image = gtk_image_new_from_file(lib_file("random.png").c_str()); - widgets->random = GTK_TOGGLE_BUTTON(gtk_toggle_button_new()); - - gtk_button_set_image(GTK_BUTTON(widgets->random), image); - gtk_widget_set_name(GTK_WIDGET(widgets->random), "ocarina-small-button"); - gtk_toggle_button_set_active(widgets->random, widgets->playlist->check_flag(PL_RANDOM)); - g_signal_connect(GTK_WIDGET(widgets->random), "toggled", G_CALLBACK(playlist_random), widgets->playlist); - - return GTK_WIDGET(widgets->random); -} - -static GtkWidget *setup_sort_button(struct PlaylistWidgets *widgets) -{ - GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU); - widgets->sort = GTK_TOGGLE_BUTTON(gtk_toggle_button_new()); - - gtk_button_set_image(GTK_BUTTON(widgets->sort), image); - gtk_widget_set_name(GTK_WIDGET(widgets->sort), "ocarina-small-button"); - gtk_toggle_button_set_active(widgets->sort, widgets->playlist->check_flag(PL_SORTED)); - g_signal_connect(GTK_WIDGET(widgets->sort), "toggled", G_CALLBACK(playlist_sort), widgets->playlist); - - return GTK_WIDGET(widgets->sort); -} - -static void add_column(GtkTreeView *treeview, const string &title, int index, - GtkTreeViewColumnSizing sizing, unsigned int fixed_width) -{ - GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes( - title.c_str(), cell, "text", index, NULL); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, sizing); - gtk_tree_view_column_set_fixed_width(column, fixed_width); - gtk_tree_view_column_set_min_width(column, 1); - gtk_tree_view_column_set_max_width(column, 700); - gtk_tree_view_append_column(treeview, column); -} - -void setup_playlist_page(struct PlaylistWidgets *widgets, int flags) -{ - GtkWidget *top_box = gtk_hbox_new(FALSE, 0); - GtkWidget *window = gtk_scrolled_window_new(NULL, NULL); - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - if (flags & CLOSE_BUTTON) - gtk_box_pack_start(GTK_BOX(top_box), setup_close_button(widgets), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(top_box), GTK_WIDGET(widgets->entry), TRUE, TRUE, 0); - if (flags & RANDOM_BUTTON) - gtk_box_pack_start(GTK_BOX(top_box), setup_random_button(widgets), FALSE, FALSE, 0); - if (flags & SORT_BUTTON) - gtk_box_pack_start(GTK_BOX(top_box), setup_sort_button(widgets), FALSE, FALSE, 0); - if (flags & DISABLE_BUTTON) - gtk_box_pack_start(GTK_BOX(top_box), setup_disable_button(widgets), FALSE, FALSE, 0); - - gtk_box_pack_start(widgets->page_box, top_box, FALSE, FALSE, 0); - gtk_box_pack_start(widgets->page_box, window, TRUE, TRUE, 0); - - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(widgets->treeview)); - add_column(widgets->treeview, "#", 1, GTK_TREE_VIEW_COLUMN_FIXED, 20); - add_column(widgets->treeview, "Title", 2, GTK_TREE_VIEW_COLUMN_FIXED, 300); - add_column(widgets->treeview, "Length", 3, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1); - add_column(widgets->treeview, "Artist", 4, GTK_TREE_VIEW_COLUMN_FIXED, 125); - add_column(widgets->treeview, "Album", 5, GTK_TREE_VIEW_COLUMN_FIXED, 125); - add_column(widgets->treeview, "Year", 6, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1); - add_column(widgets->treeview, "Count", 7, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1); - add_column(widgets->treeview, "Played", 8, GTK_TREE_VIEW_COLUMN_GROW_ONLY, 1); - - gtk_widget_show_all(GTK_WIDGET(widgets->page_box)); -} - -void init_playlist() -{ - connect_signal("MenuQueueFront", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("MenuSetFront", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("MenuQueueBack", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("MenuSetBack", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist0", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist1", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist2", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist3", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist4", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist5", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist6", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist7", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist8", "activate", G_CALLBACK(on_menu_item), NULL); - connect_signal("AddPlaylist9", "activate", G_CALLBACK(on_menu_item), NULL); -} diff --git a/ocarina/scripts/ocarina b/ocarina/scripts/ocarina deleted file mode 100644 index a6e4ef62..00000000 --- a/ocarina/scripts/ocarina +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -APPDIR="$HOME/.ocarina" -if [ "%DEBUG" == "True" ]; then - APPDIR="$APPDIR-debug" -fi - -function write_to_pipe -{ - pipe=$APPDIR/pipe - if [ -p $pipe ]; then - echo "$*" > $pipe - fi -} - -case $1 in -next|pause|play|prev|stop|toggle) - write_to_pipe $1 - exit 0 - ;; -esac - -cmd=`which ocarina-$1 2>/dev/null` -args="${@: +2}" -if [ "$cmd" ]; then - $cmd "$args" -else - cmd=`readlink -f $0` - `dirname $cmd`/ocarina-player "$*" -fi diff --git a/ocarina/scripts/ocarina-completion.bash b/ocarina/scripts/ocarina-completion.bash deleted file mode 100644 index 9dc258e5..00000000 --- a/ocarina/scripts/ocarina-completion.bash +++ /dev/null @@ -1,18 +0,0 @@ - -_ocarina() -{ - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - cmd="${COMP_WORDS[1]}" - - if [ $COMP_CWORD -eq 1 ]; then - opts=`compgen -c "ocarina-" | awk -F "-" '{print $2}'` - opts="$opts next pause play prev stop toggle" - fi - - COMPREPLY=($(compgen -W "${opts}" -- ${cur})) - return 0 - -} - -complete -F _ocarina ocarina diff --git a/ocarina/status.cpp b/ocarina/status.cpp deleted file mode 100644 index d1729917..00000000 --- a/ocarina/status.cpp +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2012 Bryan Schumaker -#include -#include -#include -#include -#include -#include -#include -#include "ocarina.h" - -#include -using namespace std; - -static void set_label(const string &name, const string &text, const string &size) -{ - GtkWidget *label = get_widget(name); - if (!label) - return; - - if (size == "") { - gtk_label_set_text(GTK_LABEL(label), text.c_str()); - } else { - char *escaped = g_markup_escape_text(text.c_str(), -1); - string markup = "" + escaped + ""; - gtk_label_set_markup(GTK_LABEL(label), markup.c_str()); - g_free(escaped); - } -} - -void update_labels(libsaria::Track *track) -{ - set_label("TitleLabel", track->title, "xx-large"); - set_label("ArtistLabel", track->artist, "x-large"); - set_label("AlbumLabel", track->album, "x-large"); - set_label("DurLabel", track->lenstr, ""); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(get_widget("BanButton")), - track->banned); -} - -void update_buttons(notify_t event) -{ - GtkWidget *play, *pause; - - play = get_widget("PlayButton"); - pause = get_widget("PauseButton"); - - if (event == PLAYING) { - gtk_widget_show(pause); - gtk_widget_hide(play); - } else { - gtk_widget_show(play); - gtk_widget_hide(pause); - } -} - -void update_progress() -{ - GtkWidget *label = get_widget("PosLabel"); - GtkWidget *progress = get_widget("TrackProgress"); - gint64 pos = libsaria::audio::position(); - gint64 dur = libsaria::audio::duration() + 1; - - gtk_label_set_text(GTK_LABEL(label), libsaria::audio::posstr().c_str()); - - /* - * This happens when gstreamer's "about-to-finish" signal - * is emitted and we queue up a shorter song before the - * pipeline finishes. - */ - if (pos > dur) - pos = 0; - gtk_range_set_range(GTK_RANGE(progress), 0, dur); - gtk_range_set_value(GTK_RANGE(progress), pos); -} - -static void slider_changed(GtkWidget *w, GtkScrollType s, gdouble v, gpointer d) -{ - libsaria::audio::seek_to(v); -} - -void update_autopause_type(AutoPauseType *type) -{ - GtkWidget *button; - if (*type == PS_NONE) - button = get_widget("NoPause"); - else - button = get_widget("PauseAfterN"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true); -} - -void update_autopause_count(unsigned int *count) -{ - gtk_spin_button_set_value(GTK_SPIN_BUTTON(get_widget("PauseCounter")), *count); -} - -static void toggle_pause(GtkWidget *b, gpointer d) -{ - if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(b))) - return; - - if (b == get_widget("NoPause")) - libsaria::deck::set_pause_type(PS_NONE, 0); - else { - unsigned short count = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(get_widget("PauseCounter"))); - libsaria::deck::set_pause_type(PS_AFTER_N, count); - } -} - -static void counter_changed(GtkWidget *b, GtkScrollType *s, gpointer d) -{ - unsigned short count = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(get_widget("PauseCounter"))); - libsaria::deck::set_pause_type(PS_AFTER_N, count); -} - -static void toggle_ban(GtkWidget *b, gpointer d) -{ - libsaria::Track *cur = libsaria::current_track(); - GtkWidget *ban = get_widget("BanButton"); - bool banned = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ban)); - if (banned) - gtk_button_set_image(GTK_BUTTON(ban), get_widget("NoImage")); - else - gtk_button_set_image(GTK_BUTTON(ban), get_widget("YesImage")); - - if (cur->banned == banned) - return; - - cur->set_banned(banned); - if (banned) - libsaria::deck::next(); -} - -static void toggle_playlist(GtkToggleButton *button, gpointer data) -{ - libsaria::Playlist *plist = (libsaria::Playlist *)data; - struct PlaylistWidgets *widgets = find_playlist_widgets(plist); - bool show = gtk_toggle_button_get_active(button); - - if (show) - gtk_widget_show(GTK_WIDGET(widgets->page_box)); - else - gtk_widget_hide(GTK_WIDGET(widgets->page_box)); - - if (GTK_WIDGET(button) == get_widget("ShowRecent")) - libsaria::prefs::set("ocarina.showrecent", show); - else if (GTK_WIDGET(button) == get_widget("ShowBanned")) - libsaria::prefs::set("ocarina.showbanned", show); -} - -bool update_idle_bar(int size) -{ - GtkWidget *idle = get_widget("IdleProgress"); - - if (size == 0) { - gtk_widget_hide(idle); - return false; - } - - gtk_widget_show(idle); - gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(idle), - libsaria::idle::progress()); - return true; -} - -void update_length_label(libsaria::Playlist *playlist) -{ - stringstream stream; - unsigned int size = playlist->get_size(); - GtkWidget *label = get_widget("LengthLabel"); - if (!label) - return; - - stream << size << " song"; - if (size != 1) - stream << "s"; - if (size != 0) - stream << ": " << libsaria::length_string(playlist->get_length()); - gtk_label_set_text(GTK_LABEL(label), stream.str().c_str()); -} - -void init_plist_visible_button(const string &button_name, const string &pref, - libsaria::Playlist *plist) -{ - bool show = libsaria::prefs::init(pref, true); - GtkToggleButton *button = GTK_TOGGLE_BUTTON(get_widget(button_name)); - - gtk_toggle_button_set_active(button, show); - connect_signal(button_name, "toggled", G_CALLBACK(toggle_playlist), plist); - toggle_playlist(button, (void *)plist); -} - -void init_status() -{ - connect_signal("TrackProgress", "change-value", G_CALLBACK(slider_changed), NULL); - connect_signal("NoPause", "toggled", G_CALLBACK(toggle_pause), NULL); - connect_signal("PauseAfterN", "toggled", G_CALLBACK(toggle_pause), NULL); - connect_signal("PauseCounter", "value-changed", G_CALLBACK(counter_changed), NULL); - connect_signal("BanButton", "toggled", G_CALLBACK(toggle_ban), NULL); - connect_signal("ShowBanned", "toggled", G_CALLBACK(toggle_playlist), libsaria::ban::get_banned_plist()); - - init_plist_visible_button("ShowRecent", "ocarina.showrecent", libsaria::deck::get_recent_plist()); - init_plist_visible_button("ShowBanned", "ocarina.showbanned", libsaria::ban::get_banned_plist()); -} diff --git a/ocarina/tabs.cpp b/ocarina/tabs.cpp deleted file mode 100644 index d57a6180..00000000 --- a/ocarina/tabs.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) 2011 Bryan Schumaker -#include -#include -#include -#include -#include - -#include "ocarina.h" - -#include -using namespace std; - -static GtkNotebook *tabs; -static PlaylistWidgets library_widgets; -static PlaylistWidgets recent_widgets; -static PlaylistWidgets banned_widgets; -static list dynamic_widgets; - -struct PlaylistWidgets *find_page_widgets(GtkWidget *page) -{ - list::iterator it; - for (it = dynamic_widgets.begin(); it != dynamic_widgets.end(); it++) { - if (GTK_WIDGET((*it)->page_box) == page) - return *it; - } - return NULL; -} - -struct PlaylistWidgets *find_playlist_widgets(libsaria::Playlist *plist) -{ - list::iterator it; - - if (plist == library_widgets.playlist) - return &library_widgets; - else if (plist == recent_widgets.playlist) - return &recent_widgets; - else if (plist == banned_widgets.playlist) - return &banned_widgets; - - for (it = dynamic_widgets.begin(); it != dynamic_widgets.end(); it++) { - if ((*it)->playlist == plist) - return *it; - } - return NULL; -} - -static struct PlaylistWidgets *find_nth_widgets(unsigned int n) -{ - unsigned int size = dynamic_widgets.size(); - - /* Dynamic playlists */ - if (n < size) - return find_playlist_widgets(libsaria::deck::get_playlist(n)); - - switch (n - size) { - case 0: - return &library_widgets; - case 1: - return &recent_widgets; - case 2: - return &banned_widgets; - } - return NULL; -} - -struct PlaylistWidgets *current_widgets() -{ - return find_nth_widgets(gtk_notebook_get_current_page(tabs)); -} - -libsaria::Playlist *current_playlist() -{ - return current_widgets()->playlist; -} - -void playlist_switch_to(string &key) -{ - unsigned int size = dynamic_widgets.size(); - - if (key == "l") - gtk_notebook_set_current_page(tabs, size); - else if (key == "r") - gtk_notebook_set_current_page(tabs, size + 1); - else if (key == "b") - gtk_notebook_set_current_page(tabs, size + 2); -} - -void playlist_switch_to_n(unsigned int n) -{ - unsigned int size = dynamic_widgets.size(); - if (size <= n) - return; - gtk_notebook_set_current_page(tabs, n); -} - -bool playlist_entry_focused() -{ - return gtk_widget_is_focus(GTK_WIDGET(current_widgets()->entry)); -} - -void playlist_focus_entry() -{ - gtk_widget_grab_focus(GTK_WIDGET(current_widgets()->entry)); -} - -bool playlist_key_press(string &key) -{ - GtkTreeView *treeview = current_widgets()->treeview; - if (gtk_widget_is_focus(GTK_WIDGET(treeview))) - return playlist_key_pressed(treeview, key); - return false; -} - -void playlist_focus_treeview() -{ - GtkTreePath *path; - GtkTreeView *treeview = current_widgets()->treeview; - - gtk_widget_grab_focus(GTK_WIDGET(treeview)); - gtk_tree_view_get_cursor(treeview, &path, NULL); - if (path == NULL) - return; - gtk_tree_view_set_cursor(treeview, path, NULL, FALSE); - gtk_tree_path_free(path); -} - -static void on_switch_page(GtkNotebook *tabs, gpointer page, - unsigned int page_num, gpointer data) -{ - struct PlaylistWidgets *widgets = find_nth_widgets(page_num); - update_length_label(widgets->playlist); -} - -static void on_page_reordered(GtkWidget *notebook, GtkWidget *page, guint num, gpointer d) -{ - struct PlaylistWidgets *widgets = find_page_widgets(page); - unsigned int n = libsaria::deck::move_playlist(widgets->playlist, num); - if (n != num) - gtk_notebook_reorder_child(tabs, page, n); -} - -static void on_click_open(GtkWidget *b, gpointer d) -{ - string file = run_chooser("FileChooser"); - if (file != "") { - println("Playing file: " + file); - libsaria::play_outside_song(file); - } -} - -static void init_tab_action() -{ - GtkWidget *box = gtk_vbox_new(FALSE, 0); - GtkWidget *img = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON); - GtkWidget *open = gtk_button_new(); - - gtk_button_set_image(GTK_BUTTON(open), img); - g_signal_connect(open, "clicked", G_CALLBACK(on_click_open), NULL); - - gtk_box_pack_start(GTK_BOX(box), open, false, false, 0); - gtk_box_pack_start(GTK_BOX(box), get_widget("BanButton"), false, false, 0); - gtk_widget_show_all(box); - gtk_notebook_set_action_widget(tabs, box, GTK_PACK_END); -} - -static void add_page(GtkWidget *page, GtkWidget *tab_label, int page_num) -{ - gtk_notebook_insert_page(tabs, page, tab_label, page_num); -} - -static void make_tab_label(const string &name, struct PlaylistWidgets *widgets) -{ - GtkWidget *box = gtk_vbox_new(FALSE, 0); - GtkWidget *label = gtk_label_new(name.c_str()); - widgets->tab_box = GTK_BOX(gtk_hbox_new(FALSE, 0)); - - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0); - gtk_misc_set_alignment(GTK_MISC(widgets->size_label), 1.0, 0.0); - - gtk_box_pack_start(widgets->tab_box, GTK_WIDGET(widgets->page_label), FALSE, FALSE, 0); - gtk_box_pack_start(widgets->tab_box, box, TRUE, TRUE, 0); - - gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(widgets->size_label), FALSE, FALSE, 0); - - gtk_widget_show_all(GTK_WIDGET(widgets->tab_box)); -} - -static void init_page(const string &name, struct PlaylistWidgets *widgets, - libsaria::Playlist *playlist, int page_num, unsigned int flags) -{ - setup_widgets(widgets, playlist); - setup_playlist_page(widgets, flags); - make_tab_label(name, widgets); - add_page(GTK_WIDGET(widgets->page_box), GTK_WIDGET(widgets->tab_box), page_num); -} - -void init_tabs() -{ - tabs = GTK_NOTEBOOK(get_widget("PlaylistTabs")); - init_tab_action(); - - init_page("Library", &library_widgets, libsaria::library::get_playlist(), -1, RANDOM_BUTTON); - init_page("Recent", &recent_widgets, libsaria::deck::get_recent_plist(), -1, NO_EXTRA_WIDGETS); - init_page("Banned", &banned_widgets, libsaria::ban::get_banned_plist(), -1, NO_EXTRA_WIDGETS); - - connect_signal("PlaylistTabs", "switch-page", G_CALLBACK(on_switch_page), NULL); - connect_signal("PlaylistTabs", "page-reordered", G_CALLBACK(on_page_reordered), NULL); -} - -static void new_playlist(libsaria::Playlist *playlist) -{ - struct PlaylistWidgets *widgets = new struct PlaylistWidgets; - dynamic_widgets.push_back(widgets); - init_page("Playlist", widgets, playlist, - libsaria::deck::get_playlist_index(playlist), - CLOSE_BUTTON | DISABLE_BUTTON | RANDOM_BUTTON | SORT_BUTTON); - gtk_notebook_set_tab_reorderable(tabs, GTK_WIDGET(widgets->page_box), true); -} - -static void delete_playlist(libsaria::Playlist *playlist) -{ - struct PlaylistWidgets *widgets = find_playlist_widgets(playlist); - int page_num = gtk_notebook_page_num(tabs, GTK_WIDGET(widgets->page_box)); - int cur_page = gtk_notebook_get_current_page(tabs); - - if (cur_page == page_num) - gtk_notebook_set_current_page(tabs, cur_page + 1); - - dynamic_widgets.remove(widgets); - delete widgets; - gtk_notebook_remove_page(tabs, page_num); -} - -static void renumber_playlist(libsaria::Playlist *playlist) -{ - stringstream s; - struct PlaylistWidgets *widgets = find_playlist_widgets(playlist); - s << "" << playlist->get_number() << " "; - gtk_label_set_markup(widgets->page_label, s.str().c_str()); - gtk_notebook_reorder_child(tabs, GTK_WIDGET(widgets->page_box), - playlist->get_number()); -} - -static void disable_playlist(libsaria::Playlist *playlist) -{ - bool enabled = !playlist->check_flag(PL_DISABLED); - struct PlaylistWidgets *widgets = find_playlist_widgets(playlist); - - if (widgets) { - gtk_toggle_button_set_active(widgets->disable, !enabled); - gtk_widget_set_sensitive(GTK_WIDGET(widgets->treeview), enabled); - gtk_widget_set_sensitive(GTK_WIDGET(widgets->tab_box), enabled); - } -} - -static void random_playlist(libsaria::Playlist *playlist) -{ - struct PlaylistWidgets *widgets = find_playlist_widgets(playlist); - if (widgets) - gtk_toggle_button_set_active(widgets->random, playlist->check_flag(PL_RANDOM)); -} - -static void sort_playlist(libsaria::Playlist *playlist) -{ - struct PlaylistWidgets *widgets = find_playlist_widgets(playlist); - if (widgets) - gtk_toggle_button_set_active(widgets->sort, playlist->check_flag(PL_SORTED)); -} - -void update_tabs(notify_t event, libsaria::Playlist *playlist) -{ - if (event == PLAYLIST_NEW) - new_playlist(playlist); - else if (event == PLAYLIST_DELETE) - delete_playlist(playlist); - else if (event == PLAYLIST_CHANGED) { - disable_playlist(playlist); - random_playlist(playlist); - sort_playlist(playlist); - } else if (event == PLAYLIST_RENUMBER) - renumber_playlist(playlist); -} diff --git a/ocarina/window.cpp b/ocarina/window.cpp deleted file mode 100644 index bfbbcd44..00000000 --- a/ocarina/window.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2011 Bryan Schumaker -#include -#include -#include -#include "ocarina.h" - -static int old_w, old_h; -static bool ignore_configure_event = false; - -static gboolean configure(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - int w = event->configure.width; - int h = event->configure.height; - int cur_w = libsaria::prefs::get("ocarina.window.w"); - int cur_h = libsaria::prefs::get("ocarina.window.h"); - - if (ignore_configure_event == true) { - ignore_configure_event = false; - return FALSE; - } - - if (w != cur_w) - libsaria::prefs::set("ocarina.window.w", w); - if (h != cur_h) - libsaria::prefs::set("ocarina.window.h", h); - return FALSE; -} - -static void window_state(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - bool maximized = libsaria::prefs::get("ocarina.window.maximized"); - - if (!(event->window_state.changed_mask & GDK_WINDOW_STATE_MAXIMIZED)) - return; - - maximized = event->window_state.new_window_state & GDK_WINDOW_STATE_MAXIMIZED; - - println("Maximization changed to: %d", maximized); - libsaria::prefs::set("ocarina.window.maximized", maximized); - ignore_configure_event = true; - if (maximized) { - println("Restoring old (w,h): (%d, %d)", old_w, old_h); - libsaria::prefs::set("ocarina.window.w", old_w); - libsaria::prefs::set("ocarina.window.h", old_h); - } -} - -static gboolean key_pressed(GtkWindow *window, GdkEvent *event, gpointer data) -{ - string key = gdk_keyval_name(event->key.keyval); - if (key.substr(0, 3) == "KP_") - key = key.substr(3); - - if (playlist_key_press(key)) - return TRUE; - - if (key == "Escape") { - gtk_window_set_focus(window, NULL); - return TRUE; - } - - if (playlist_entry_focused()) - return FALSE; - - /* - * TODO: something for banning / unbanning songs - * something for incrementing / decrementing the pause after N count - */ - if (key == "b" || key == "l" || key == "r") { - playlist_switch_to(key); - gtk_window_set_focus(window, NULL); - } else if (key == "j" || key == "k") - playlist_focus_treeview(); - else if (key >= "0" && key <= "9") - playlist_switch_to_n(atoi(key.c_str())); - else if (key == "n") - libsaria::deck::next(); - else if (key == "N") - libsaria::deck::prev(); - else if (key == "slash") - playlist_focus_entry(); - else if (key == "space") - libsaria::audio::toggle_play(); - else if (key == "Return") - playlist_focus_treeview(); - else { - println("Unhandled key: " + key); - return FALSE; - } - return TRUE; -} - -void init_window() -{ - GtkWindow *window = GTK_WINDOW(get_widget("MainWindow")); - - gtk_window_set_title(window, ("Ocarina " + vers_str()).c_str()); - gtk_window_set_icon_from_file(window, lib_file("ocarina.png").c_str(), NULL); - - old_h = libsaria::prefs::init("ocarina.window.h", 600); - old_w = libsaria::prefs::init("ocarina.window.w", 900); - gtk_window_resize(window, old_w, old_h); - if (libsaria::prefs::init("ocarina.window.maximized", false) == true) - gtk_window_maximize(window); - - connect_signal("MainWindow", "destroy", gtk_main_quit, NULL); - connect_signal("MainWindow", "configure-event", G_CALLBACK(configure), NULL); - connect_signal("MainWindow", "window-state-event", G_CALLBACK(window_state), NULL); - connect_signal("MainWindow", "key-press-event", G_CALLBACK(key_pressed), NULL); -}