⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 showlyricdlg.c.blk

📁 ShowLyric是一款用于Audacious的歌词显示插件
💻 BLK
📖 第 1 页 / 共 2 页
字号:
            gtk_widget_modify_fg(((LyricItem *) p->data)->pLabel,                                 GTK_STATE_NORMAL, &theApp.m_configs.colors.current);            ((LyricItem *) p->data)->process_color = TRUE;        } else if(p->next && iTime < pn_time + threshold) {            int delta = (pn_time + threshold - iTime) / 2;            GdkColor color;            color_between(&theApp.m_configs.colors.normal,                          &theApp.m_configs.colors.current, (gdouble) delta / threshold, &color);            gtk_widget_modify_fg(((LyricItem *) p->data)->pLabel, GTK_STATE_NORMAL, &color);            ((LyricItem *) p->data)->process_color = TRUE;        }    }// 如果已经是最后一项了,直接返回    if(!current->next || !current->data) {        return TRUE;    }// 保持当前行在最中间    LyricItem *pCurrentItem = (LyricItem *) current->data;    int iNewY = pVbox->allocation.y - pCurrentItem->pLabel->allocation.y +        		pLyricWnd->allocation.height / 2;    if(current->next) {        LyricItem *pNextItem = (LyricItem *) current->next->data;        double f = ((double)iTime - pCurrentItem->iTime) / (pNextItem->iTime - pCurrentItem->iTime);        int iAdd = (GTK_WIDGET(pNextItem->pLabel)->allocation.y -             		GTK_WIDGET(pCurrentItem->pLabel)->allocation.y) * f;        iNewY -= iAdd;    }    if(IsSmaller(&iNewY) || iNewY == 0) {        gtk_layout_move(GTK_LAYOUT(pLayout), pVbox, 18, iNewY);		//LyricDebug("iNewY=%d", iNewY);    }	return TRUE;}inline gint number_between(gint from, gint to, gdouble rate){    return from + rate * (to - from);}void color_between(GdkColor * from, GdkColor * to, gdouble rate, GdkColor * result){    if(!from || !to || !result)        return;    result->pixel = number_between(from->pixel, to->pixel, rate);    result->red = number_between(from->red, to->red, rate);    result->green = number_between(from->green, to->green, rate);    result->blue = number_between(from->blue, to->blue, rate);}inline gboolean IsSmaller(int *piNew){    static int iOldY;    static int iBuffer;         // 如果跳跃太大,多余的跳跃将缓存到该变量中,在后面的移动中慢慢释放出来,以防止跳跃太大    static int iRate;           // 释放缓存的速度    if(*piNew == 50000) {        iOldY = *piNew;        iBuffer = 0;        iRate = 0;        return TRUE;    }// 如果是后退则直接后退    if(*piNew > iOldY + 50) {        iOldY = *piNew;        iBuffer = 0;        iRate = 0;        return TRUE;    }// 如果是前进, 则做延缓处理    if(*piNew < iOldY || (*piNew == iOldY && iBuffer > 0)) {        int iTmp = iOldY - *piNew, iFlag = iRate + 1;        if(iTmp > iFlag && iTmp < 20) {            iBuffer += iOldY - *piNew - iFlag;            if(iBuffer <= 0)                iRate = 0;            else if(iBuffer <= 10)                iRate = 1;            else if(iBuffer <= 20)                iRate = 2;            else if(iBuffer <= 30)                iRate = 3;            else if(iBuffer <= 40)                iRate = 4;            else if(iBuffer <= 50)                iRate = 5;            else if(iBuffer <= 60)                iRate = 6;            else if(iBuffer > 60)                iRate = 10;            *piNew = iOldY - iFlag;        } else {            if(iBuffer > 0) {                int iAdd = iRate < iBuffer ? iRate : iBuffer;                *piNew += iAdd;                iBuffer -= iAdd;                if(iBuffer <= 0)                    iRate = 0;                else if(iBuffer <= 10)                    iRate = 1;                else if(iBuffer <= 20)                    iRate = 2;                else if(iBuffer <= 30)                    iRate = 3;                else if(iBuffer <= 40)                    iRate = 4;                else if(iBuffer <= 50)                    iRate = 5;                else if(iBuffer <= 60)                    iRate = 6;                else if(iBuffer > 60)                    iRate = 10;                if(iOldY - *piNew < 0) {                    iBuffer = iOldY - *piNew;                    *piNew = iOldY;                }            }        }// LyricDebug("iY=%d, iBuffer=%d, iRate=%d", iOldY - *piNew, iBuffer, iRate);        iOldY = *piNew;        return TRUE;    }    return FALSE;}void ShowLyric(){	GtkWidget *pLyricWnd = glade_xml_get_widget(theApp.m_xml, "ShowLyric");	GtkWidget* pVbox = glade_xml_get_widget(theApp.m_xml, "vboxLyrics");	gint iMaxWidth = 0;	// 显示歌词	GList* list = g_list_first(this->m_ListCurrLyric);	while (list) {		LyricItem* lpItem = list->data;		if (lpItem) {			lpItem->pLabel = (GtkWidget*)gtk_label_new(lpItem->lpszValue);			gtk_label_set_single_line_mode(GTK_LABEL(lpItem->pLabel), TRUE);			gtk_widget_modify_fg(GTK_WIDGET(lpItem->pLabel), GTK_STATE_NORMAL, &theApp.m_configs.colors.normal);			gtk_widget_show(GTK_WIDGET(lpItem->pLabel));			gtk_box_pack_start(GTK_BOX(pVbox), GTK_WIDGET(lpItem->pLabel), FALSE, FALSE, 0);						gint iWidth = gdk_string_width(gtk_style_get_font (gtk_widget_get_style(pLyricWnd)),							   lpItem->lpszValue);			if (iWidth > iMaxWidth)iMaxWidth = iWidth;		}		list = g_list_next(list);	}		gint iWndHeight = 0, iTemp = 0;	gtk_window_get_size(GTK_WINDOW(pLyricWnd), &iTemp, &iWndHeight);	gtk_window_resize(GTK_WINDOW(pLyricWnd), iMaxWidth - 20, iWndHeight);	    gtk_widget_show(GTK_WIDGET(pVbox));	SmartShowWnd(TRUE);    this->m_TimerId = gtk_timeout_add(100, ScrollLyric, &this->m_ListCurrLyric);    }// 刷新并生效配置void RefreshLyricSetting(){	GtkWidget *pLyricWnd = glade_xml_get_widget(theApp.m_xml, "ShowLyric");    gtk_widget_modify_bg(GTK_WIDGET(pLyricWnd),    					 GTK_STATE_NORMAL,                         &theApp.m_configs.colors.background);    gtk_widget_modify_fg(GTK_WIDGET(pLyricWnd),    					 GTK_STATE_NORMAL,                         &theApp.m_configs.colors.normal);    gtk_window_set_opacity(GTK_WINDOW(pLyricWnd), 1 - theApp.m_configs.iOpacity / 100.0);	GList* list = g_list_first(this->m_ListCurrLyric);	while (list) {		LyricItem* lpItem = list->data;		if (lpItem && lpItem->pLabel) {			gtk_widget_modify_fg(GTK_WIDGET(lpItem->pLabel),								GTK_STATE_NORMAL,								&theApp.m_configs.colors.normal);		}		list = g_list_next(list);	}}// 编辑歌词void EditLyric(){	}void on_MenuAbout_activate(GtkWidget* wideget, gpointer user_data){	theApp.About(GTK_WINDOW(user_data));}void on_MenuEditLyric_activate(GtkWidget* wideget, gpointer user_data){	EditLyric();}void on_MenuReDownLoad_activate(GtkWidget* wideget, gpointer user_data){	if (access(theApp.m_CurrSongInfo.szLyricFileName, W_OK) != -1)		remove(theApp.m_CurrSongInfo.szLyricFileName);	SongInfo info;	if(theApp.m_player.GetSongInfo(&info))	{		gchar szLrcFile[MAX_PATH] = {0};		sprintf(szLrcFile, "%s/%s/%s.lyric", theApp.m_configs.szLyricPath, info.szArtist, info.szTitle);		strcpy(info.szLyricFileName, szLrcFile);		theApp.SearchLyric(info, FALSE);	}}void on_MenuConfig_activate(GtkWidget* wideget, gpointer user_data){	gtk_widget_show(glade_xml_get_widget(theApp.m_xml, "ConfigDlg"));}void on_ShowLyric_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data){	GtkWidget *window = glade_xml_get_widget(theApp.m_xml, "LyricMenu");	if (event->button == 3 && window) {		gtk_menu_popup(GTK_MENU(window), NULL, NULL, NULL, NULL, event->button, 0);	}}void on_ShowLyric_window_state_event(gpointer data){	if (!data) return;	GtkWidget *window=GTK_WIDGET(data);	int istate = gdk_window_get_state(GDK_WINDOW(window->window));		gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), TRUE);	gtk_window_set_skip_pager_hint (GTK_WINDOW (window), TRUE);	switch(istate)	{			case GDK_WINDOW_STATE_ICONIFIED:					gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);					gtk_window_set_skip_pager_hint (GTK_WINDOW (window), FALSE);					//LyricDebug("GDK_WINDOW_STATE_ICONIFIED:the window is minimized.\n");					break;			case GDK_WINDOW_STATE_WITHDRAWN:					//LyricDebug("GDK_WINDOW_STATE_WITHDRAWN:the window is not shown.\n");					break;			case GDK_WINDOW_STATE_MAXIMIZED:					//LyricDebug("GDK_WINDOW_STATE_MAXIMIZED:the window is maximized.\n");					break;			case GDK_WINDOW_STATE_STICKY:					//LyricDebug("GDK_WINDOW_STATE_STICKY:the window is sticky.\n");					break;			case GDK_WINDOW_STATE_FULLSCREEN:					//LyricDebug("GDK_WINDOW_STATE_FULLSCREEN:the window is maximized without decorations.\n");					break;			case GDK_WINDOW_STATE_ABOVE:					//LyricDebug("GDK_WINDOW_STATE_ABOVE:the window is kept above other windows. \n");					break;			case GDK_WINDOW_STATE_BELOW:					//LyricDebug("GDK_WINDOW_STATE_BELOW:the window is kept below other windows. \n");					break;			/*			default:					//LyricDebug("unknow state(%d)\n", istate);					gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);					gtk_window_set_skip_pager_hint (GTK_WINDOW (window), FALSE);					break;					*/	} }gboolean on_ShowLyric_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data){	// 将关闭事件改成最小化	gtk_window_iconify(GTK_WINDOW(user_data));		// 如果返回FALSE,GTK将发出"destroy"信号;	// 如果返回TRUE, 则不让该窗口关闭	return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -