📄 xlyrics.c
字号:
/* define the func to render the data*/void line_color_func(GtkTreeViewColumn *column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data){ gchar *lyrics_line_buffer; gint stat; gchar *utf8; gtk_tree_model_get(tree_model, iter, 0, &lyrics_line_buffer, 1, &stat, -1); if(stat == TRUE)/* active color*/ g_object_set(cell, "foreground-gdk", &ac_color, "foreground-set", TRUE, NULL); else g_object_set(cell, "foreground-gdk", &ua_color, "foreground-set", TRUE, NULL); cell->xalign = 0.5; utf8 = locale2utf8(lyrics_line_buffer); g_object_set(cell, "text", utf8, NULL); if(utf8) g_free(utf8);}void redraw_list(void){ PangoFontDescription *desc; /* set the font*/ desc = pango_font_description_from_string(lyrics_font); gtk_widget_modify_font(list_view, desc); /* set the bg color*/ gtk_widget_modify_base(list_view, GTK_STATE_NORMAL, &bg_color); gtk_widget_modify_base(list_view, GTK_STATE_SELECTED, &bg_color); gtk_widget_modify_base(list_view, GTK_STATE_ACTIVE, &bg_color); g_object_set(cell, "background-gdk", &bg_color, "background-set", TRUE, NULL); gtk_widget_modify_bg(GTK_SCROLLED_WINDOW(scrolled_window)->vscrollbar, GTK_STATE_ACTIVE, &bg_color); /* set transparency */ if(!hiding) my_gtk_widget_set_transparency(window, opacity); /* cleanup the list_store and lyrics*/ gtk_list_store_clear(list_store); lyrics_cleanup(song); song = NULL; /* reload the lyrics */ if(is_fit_width) gtk_window_resize(GTK_WINDOW(window), 10, height); read_lyrics(lyrics_file); set_line(last_line_number, TRUE);}/*set the player time according the line*/void set_line_time(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data){ GtkTreeIter iter; gint line_number; struct LyricsLine *line = NULL; int session; if(song && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) { gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, 2, &line_number, -1); for(line = song->head; line != NULL; line = line->next) if(line->line_number == line_number) break; if((session = is_player_on()) > -1 && line != NULL) set_player_time(session, line->line_time); }}/*create a blank list */GtkWidget *create_list( void ){ GtkTreeViewColumn *column; scrolled_window = gtk_scrolled_window_new(NULL, NULL); if(is_fit_width){ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); }else{ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS); } gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE); list_store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT); list_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(list_store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE); g_signal_connect(G_OBJECT(list_view), "button-press-event", G_CALLBACK(deal_with_mouse), NULL); g_signal_connect(G_OBJECT(list_view), "button-release-event", G_CALLBACK(left_button_released), NULL); g_signal_connect(G_OBJECT(list_view), "row-activated", G_CALLBACK(set_line_time), NULL); g_signal_connect(G_OBJECT(list_view), "motion_notify_event", G_CALLBACK(move_with_mouse), NULL); cell = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "Xlyrics"); gtk_tree_view_append_column (GTK_TREE_VIEW (list_view), GTK_TREE_VIEW_COLUMN (column)); gtk_tree_view_column_pack_start(column, cell, TRUE); gtk_tree_view_column_set_cell_data_func(column, cell, line_color_func, NULL, NULL); gtk_container_add(GTK_CONTAINER(scrolled_window), list_view); gtk_widget_show_all(scrolled_window); return scrolled_window;}/* confirm exit*/gint confirm(void){ gint response; GtkWidget *dialog; dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, _("You will close the XLyrics \n Are you sure?")); gtk_widget_show_all (dialog); response = gtk_dialog_run(GTK_DIALOG(dialog)); switch(response) { case GTK_RESPONSE_OK: return FALSE; default: gtk_widget_destroy(dialog); return TRUE; }}/* convert ascii generated by IE,Netscape */void conv_ascii_to_nomal(char *s) { char num[3]; int n; if(!s) return; num[2]='\0'; for(;*s;s++) { if(*s=='+') *s=' '; else if(*s=='%') { num[0]=*(s+1); num[1]=*(s+2); sscanf(num,"%x",&n); *s=n; strcpy(s+1,s+3); } }}/*load lyrics file*/void load_lyrics_file(char *playfile_full){ char *lyricsfile = NULL; char *filename_begin; strcpy(last_song, get_player_song(session)); gtk_list_store_clear(list_store); lyrics_cleanup(song); song = NULL; conv_ascii_to_nomal(playfile_full); filename_begin = rindex(playfile_full, '/'); /* get the last "/" */ if(filename_begin) { playfile = filename_begin + 1; /* now the playfile point to the file name*/ int n = strlen(playfile_full); n -= strlen(playfile); strncpy(mp3_dir, playfile_full, n); mp3_dir[n] = '\0'; /*get the mp3 directory*/ } else { strcpy(mp3_dir, "./"); playfile = playfile_full; /*set the mp3 directory is current direcrory*/ } /*chop space*/ while(*playfile == ' ' || *playfile == '\t') playfile ++; if(strlen(playfile) != 0) { /* first try to find file in cache, this will speed up the load*/ lyricsfile = find_lyrics_from_cache(playfile); if(!lyricsfile)/*find the file in directory*/ { int i; gchar buf[1024]; for(i=0; i<2; i++) { if(look_in_mp3dir_mode && (lyricsfile = find_file_in_dir(mp3_dir, playfile, playfile_full, i))) break; else if((lyricsfile = find_file_in_dir(lyrics_dir, playfile, playfile_full, i))) break; }#if 1 /* if you think this is not good enough, just remove it */ if(!lyricsfile && !is_downloading) { /* no lyrics is found in the local directories, try to download it */ char *tmp, *ptr; tmp = (char*)strdup(playfile); ptr = strrchr(tmp, '.'); if(ptr) *ptr = '\0'; snprintf(buf, 1024, "%s/%s.lrc", lyrics_dir, tmp); if(lyrics_download(tmp, buf) == 0) is_downloading = 1; g_free(tmp); }else if(is_downloading) is_downloading = 0;#endif if(lyricsfile) add_item_to_cache(playfile, lyricsfile); } } if(lyricsfile)/* found the lyrics file*/ { if(hiding) { hiding = FALSE; gtk_widget_show_all(window); gtk_window_move(GTK_WINDOW(window), pos_x, pos_y); if(is_keep_above) gtk_window_set_keep_above(GTK_WINDOW(window), is_keep_above); } strcpy(lyrics_file, lyricsfile); is_lyrics_loaded = TRUE; redraw_list(); g_free(lyricsfile); } else /* not find the lyrics file*/ { if(hide_not_found) { hiding = TRUE; gtk_widget_hide_all(window); } if(strlen(playfile) == 0) strcpy(lyrics_file, "NULL file name"); else { lyricsfile = (char*)remove_ext(playfile); strcpy(lyrics_file, lyricsfile); g_free(lyricsfile); } is_lyrics_loaded = FALSE; redraw_list(); }}/*timeout function*/gboolean timeout(gpointer data){ static char *curr_song = NULL; if(is_config_update == TRUE) { is_config_update = FALSE; update_config("xlyrics"); redraw_list(); } if((session = is_player_on()) < 0) { quit(window, "nop"); return FALSE; } if((curr_song = get_player_song(session)) == NULL) { /* no song is in playlist*/ return TRUE; } if(strcmp(last_song, curr_song) != 0) { /* FIXME: the downloading process may be running, * if then, this action will make a mistake */ is_downloading = 0; load_lyrics_file(curr_song); if(is_lyrics_loaded) { gchar *utf8; set_line(last_line_number, FALSE); last_line_number = 0; set_line(last_line_number, TRUE); if(song->head) { utf8 = locale2utf8(song->head->buffer); gtk_window_set_title(GTK_WINDOW(window), utf8); g_free(utf8); } else {/* the lyrics file is not a right one */ utf8 = locale2utf8(playfile); gtk_window_set_title(GTK_WINDOW(window), utf8); g_free(utf8); } } } if(is_downloading) {/* check the downloading state */ switch(get_download_state()){ case 1: return TRUE; case -1: is_downloading = 0; break; default: load_lyrics_file(curr_song); break; } } if(is_lyrics_loaded) { static int time; time = get_player_time(session); lyrics_line = song->head; while (lyrics_line) { if (lyrics_line->line_time == time) break; lyrics_line = lyrics_line->next; } if(lyrics_line && (last_line_number != lyrics_line->line_number || last_line_number == 0)) { gchar *utf8; set_line(last_line_number, FALSE); last_line_number = lyrics_line->line_number; utf8 = locale2utf8(lyrics_line->buffer); gtk_window_set_title(GTK_WINDOW(window), utf8); g_free(utf8); set_line(last_line_number, TRUE); } }else gtk_window_set_title(GTK_WINDOW(window), "Xlyrics"); return TRUE;}int main(int argc, char* argv[]){ const gchar *lang; gchar stylerc[1024];#ifdef ENABLE_NLS bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE);#endif init_config("xlyrics"); if(argc > 1) strncpy(plugin_name, argv[1], 255); /*first run or initial plugin failed*/ if(!strcmp(plugin_name, "") || !init_plugin(plugin_name)) { gtk_init(&argc, &argv); config(NULL, (gpointer)-1); gtk_main(); return 0; } if((session = is_player_on()) < 0) session = launch_player(); gtk_set_locale(); snprintf(stylerc, 1024, "%s/stylerc", PACKAGE_MENU_DIR); gtk_rc_parse(stylerc);/*get style from stylerc file*/ gtk_init(&argc, &argv); /* create the main window*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_name(window, "main window"); gtk_window_set_title(GTK_WINDOW(window), "XLyrics"); gtk_window_set_default_size(GTK_WINDOW(window), width, height); gtk_window_move(GTK_WINDOW(window), pos_x, pos_y); gtk_window_set_decorated(GTK_WINDOW(window), have_border); gtk_window_set_resizable(GTK_WINDOW(window), TRUE); gtk_window_set_keep_above(GTK_WINDOW(window), is_keep_above); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(confirm), NULL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(quit), "win"); /* add the lyrics list*/ gtk_container_add(GTK_CONTAINER(window), create_list()); timer = g_timeout_add(300, &timeout, NULL); gtk_widget_show(window); my_gtk_widget_set_transparency(window, opacity); gtk_main(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -