📄 playlistwin.c
字号:
skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 26, y, (w / 2) - 50, 0, 100, 20); /* Titlebar, right corner */ skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 153, y, w - 25, 0, 25, 20); /* Left and right side */ for (i = 0; i < (h - 58) / 29; i++) { skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 0, 42, 0, (i * 29) + 20, 12, 29); skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 32, 42, w - 19, (i * 29) + 20, 19, 29); } /* Bottom left corner (menu buttons) */ skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 0, 72, 0, h - 38, 125, 38); c = (w - 275) / 25; /* Visualization window */ if (c >= 3) { c -= 3; skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 205, 0, w - 225, h - 38, 75, 38); } /* Bottom blank parts */ for (i = 0; i < c; i++) skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 179, 0, (i * 25) + 125, h - 38, 25, 38); /* Bottom right corner (playbuttons etc) */ skin_draw_pixmap(playlistwin_bg, playlistwin_gc, src, 126, 72, w - 150, h - 38, 150, 38); }}void draw_playlist_window(gboolean force){ gboolean redraw; GList *wl; Widget *w; if (force) { playlistwin_draw_frame(); lock_widget_list(playlistwin_wlist); draw_widget_list(playlistwin_wlist, &redraw, TRUE); } else { lock_widget_list(playlistwin_wlist); draw_widget_list(playlistwin_wlist, &redraw, FALSE); } if (redraw || force) { if (force) gdk_window_clear(playlistwin->window); else { wl = playlistwin_wlist; while (wl) { w = (Widget *) wl->data; if (w->redraw && w->visible) { gdk_window_clear_area(playlistwin->window, w->x, w->y, w->width, w->height); w->redraw = FALSE; } wl = wl->next; } } gdk_flush(); } unlock_widget_list(playlistwin_wlist);}static void playlistwin_sort_menu_callback(gpointer cb_data, guint action, GtkWidget * w){ switch (action) { case PLAYLISTWIN_SORT_BYTITLE: playlist_sort_by_title(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_BYFILENAME: playlist_sort_by_filename(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_BYPATH: playlist_sort_by_path(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_BYDATE: playlist_sort_by_date(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_SEL_BYTITLE: playlist_sort_selected_by_title(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_SEL_BYFILENAME: playlist_sort_selected_by_filename(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_SEL_BYPATH: playlist_sort_selected_by_path(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_SEL_BYDATE: playlist_sort_selected_by_date(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_REVERSE: playlist_reverse(); playlistwin_update_list(); break; case PLAYLISTWIN_SORT_RANDOMIZE: playlist_random(); playlistwin_update_list(); break; }}static void playlistwin_sub_menu_callback(gpointer cb_data, guint action, GtkWidget * w){ switch (action) { case PLAYLISTWIN_REMOVE_DEAD_FILES: playlist_remove_dead_files(); break; case PLAYLISTWIN_PHYSICALLY_DELETE: playlistwin_physically_delete(); break; }}void playlistwin_hide_timer(void){ textbox_set_text(playlistwin_time_min, " "); textbox_set_text(playlistwin_time_sec, " ");}void playlistwin_vis_enable(void){ playlistwin_vis_enabled = TRUE; if (cfg.playlist_width >= 350) show_widget(playlistwin_vis);}void playlistwin_vis_disable(void){ playlistwin_vis_enabled = FALSE; hide_widget(playlistwin_vis); draw_playlist_window(TRUE);}void playlistwin_set_time(int time, int length, TimerMode mode){ char *text, sign; if (mode == TIMER_REMAINING && length != -1) { time = length - time; sign = '-'; } else sign = ' '; time /= 1000; if (time < 0) time = 0; if (time > 99 * 60) time /= 60; text = g_strdup_printf("%c%-2.2d", sign, time / 60); textbox_set_text(playlistwin_time_min, text); g_free(text); text = g_strdup_printf("%-2.2d", time % 60); textbox_set_text(playlistwin_time_sec, text); g_free(text);}static void playlistwin_drag_data_received(GtkWidget * widget, GdkDragContext * context, gint x, gint y, GtkSelectionData * selection_data, guint info, guint time, gpointer user_data){ guint pos; if (selection_data->data) { if (inside_widget(x, y, playlistwin_list)) { pos = ((y - ((Widget *) playlistwin_list)->y) / playlistwin_list->pl_fheight) + playlistwin_list->pl_first; if (pos > get_playlist_length()) pos = get_playlist_length(); playlist_ins_url_string(selection_data->data, pos); } else playlist_add_url_string(selection_data->data); }}static void playlistwin_close_cb(void){ playlistwin_show(FALSE);}static void playlistwin_create_widgets(void){ playlistwin_sinfo = create_textbox(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, 4, 4, cfg.playlist_width - 35, FALSE, SKIN_TEXT); if (!cfg.playlist_shaded) hide_widget(playlistwin_sinfo); if (cfg.playlist_shaded) playlistwin_shade = create_pbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 21, 3, 9, 9, 128, 45, 150, 42, playlistwin_shade_toggle, SKIN_PLEDIT); else playlistwin_shade = create_pbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 21, 3, 9, 9, 157, 3, 62, 42, playlistwin_shade_toggle, SKIN_PLEDIT); playlistwin_shade->pb_allow_draw = FALSE; playlistwin_close = create_pbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 11, 3, 9, 9, cfg.playlist_shaded ? 138 : 167, cfg.playlist_shaded ? 45 : 3, 52, 42, playlistwin_close_cb, SKIN_PLEDIT); playlistwin_close->pb_allow_draw = FALSE; playlistwin_list = create_playlist_list(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, 12, 20, cfg.playlist_width - 31, cfg.playlist_height - 58); playlist_list_set_font(cfg.playlist_font); playlistwin_slider = create_playlistslider(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 15, 20, cfg.playlist_height - 58, playlistwin_list); playlistwin_time_min = create_textbox(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 82, cfg.playlist_height - 15, 15, FALSE, SKIN_TEXT); playlistwin_time_sec = create_textbox(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 64, cfg.playlist_height - 15, 10, FALSE, SKIN_TEXT); playlistwin_info = create_textbox(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 143, cfg.playlist_height - 28, 85, FALSE, SKIN_TEXT); playlistwin_vis = create_vis(&playlistwin_wlist, playlistwin_bg, playlistwin->window, playlistwin_gc, cfg.playlist_width - 223, cfg.playlist_height - 26, 72, FALSE); hide_widget(playlistwin_vis); playlistwin_srew = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 144, cfg.playlist_height - 16, 8, 7, playlist_prev); playlistwin_splay = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 138, cfg.playlist_height - 16, 10, 7, mainwin_play_pushed); playlistwin_spause = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 128, cfg.playlist_height - 16, 10, 7, input_pause); playlistwin_sstop = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 118, cfg.playlist_height - 16, 9, 7, mainwin_stop_pushed); playlistwin_sfwd = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 109, cfg.playlist_height - 16, 8, 7, playlist_next); playlistwin_seject = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 100, cfg.playlist_height - 16, 9, 7, mainwin_eject_pushed); playlistwin_sscroll_up = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 14, cfg.playlist_height - 35, 8, 5, playlistwin_scroll_up_pushed); playlistwin_sscroll_down = create_sbutton(&playlistwin_wlist, playlistwin_bg, playlistwin_gc, cfg.playlist_width - 14, cfg.playlist_height - 30, 8, 5, playlistwin_scroll_down_pushed);}static void selection_received(GtkWidget *widget, GtkSelectionData *selection_data, gpointer data){ if (selection_data->type == GDK_SELECTION_TYPE_STRING && selection_data->length > 0) playlist_add_url_string(selection_data->data);}static void playlistwin_create_gtk(void){ playlistwin = gtk_window_new(GTK_WINDOW_DIALOG); dock_add_window(dock_window_list, playlistwin); gtk_widget_set_app_paintable(playlistwin, TRUE); if (cfg.show_wm_decorations) gtk_window_set_policy(GTK_WINDOW(playlistwin), TRUE, TRUE, FALSE); else gtk_window_set_policy(GTK_WINDOW(playlistwin), FALSE, FALSE, TRUE); gtk_window_set_title(GTK_WINDOW(playlistwin), _("XMMS Playlist")); gtk_window_set_wmclass(GTK_WINDOW(playlistwin), "XMMS_Playlist", "xmms"); gtk_window_set_transient_for(GTK_WINDOW(playlistwin), GTK_WINDOW(mainwin)); if (cfg.playlist_x != -1 && cfg.save_window_position) dock_set_uposition(playlistwin, cfg.playlist_x, cfg.playlist_y); gtk_widget_set_usize(playlistwin, cfg.playlist_width, cfg.playlist_shaded ? 14 : cfg.playlist_height); gtk_widget_set_events(playlistwin, GDK_FOCUS_CHANGE_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_widget_realize(playlistwin); hint_set_skip_winlist(playlistwin); playlistwin_set_hints(); util_set_cursor(playlistwin); gtk_signal_connect(GTK_OBJECT(playlistwin), "delete_event", GTK_SIGNAL_FUNC(playlistwin_delete), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "button_press_event", GTK_SIGNAL_FUNC(playlistwin_press), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "button_release_event", GTK_SIGNAL_FUNC(playlistwin_release), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "motion_notify_event", GTK_SIGNAL_FUNC(playlistwin_motion), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "focus_in_event", GTK_SIGNAL_FUNC(playlistwin_focus_in), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "focus_out_event", GTK_SIGNAL_FUNC(playlistwin_focus_out), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "configure_event", GTK_SIGNAL_FUNC(playlistwin_configure), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "client_event", GTK_SIGNAL_FUNC(playlistwin_client_event), NULL); xmms_drag_dest_set(playlistwin); gtk_signal_connect(GTK_OBJECT(playlistwin), "drag-data-received", GTK_SIGNAL_FUNC(playlistwin_drag_data_received), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "key-press-event", GTK_SIGNAL_FUNC(playlistwin_keypress), NULL); gtk_signal_connect(GTK_OBJECT(playlistwin), "selection_received", GTK_SIGNAL_FUNC(selection_received), NULL); if (!cfg.show_wm_decorations) gdk_window_set_decorations(playlistwin->window, 0); gdk_window_set_back_pixmap(playlistwin->window, playlistwin_bg, 0); playlistwin_create_mask();}void playlistwin_create(void){ GtkWidget *item, *menu; playlistwin_accel = gtk_accel_group_new(); playlistwin_sort_menu = gtk_item_factory_new(GTK_TYPE_MENU, "<Main>", NULL); gtk_item_factory_set_translate_func(playlistwin_sort_menu, util_menu_translate, NULL, NULL); gtk_item_factory_create_items(GTK_ITEM_FACTORY(playlistwin_sort_menu), playlistwin_sort_menu_entries_num, playlistwin_sort_menu_entries, NULL); playlistwin_sub_menu = gtk_item_factory_new(GTK_TYPE_MENU, "<Main>", NULL); gtk_item_factory_set_translate_func(playlistwin_sub_menu, util_menu_translate, NULL, NULL); gtk_item_factory_create_items(GTK_ITEM_FACTORY(playlistwin_sub_menu), playlistwin_sub_menu_entries_num, playlistwin_sub_menu_entries, NULL); playlistwin_bg = gdk_pixmap_new(NULL, cfg.playlist_width, cfg.playlist_height, gdk_rgb_get_visual()->depth); playlistwin_popup_menu = gtk_item_factory_new(GTK_TYPE_MENU, "<Main>", playlistwin_accel); gtk_item_factory_set_translate_func(playlistwin_popup_menu, util_menu_translate, NULL, NULL); gtk_item_factory_create_items(GTK_ITEM_FACTORY(playlistwin_popup_menu), playlistwin_popup_menu_entries_num, playlistwin_popup_menu_entries, NULL); item = gtk_item_factory_get_widget(playlistwin_popup_menu, "/Sort"); menu = gtk_item_factory_get_widget(playlistwin_sort_menu, ""); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu); item = gtk_item_factory_get_widget(playlistwin_popup_menu, "/Remove/Misc"); menu = gtk_item_factory_get_widget(playlistwin_sub_menu, ""); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu); playlistwin_save_menu = gtk_item_factory_new(GTK_TYPE_MENU, "<Save>", NULL); gtk_item_factory_set_translate_func(playlistwin_save_menu, util_menu_translate, NULL, NULL); gtk_item_factory_create_items(GTK_ITEM_FACTORY(playlistwin_save_menu), playlistwin_playlist_filetypes_num, playlistwin_playlist_filetypes, NULL); playlistwin_create_gtk(); playlistwin_gc = gdk_gc_new(playlistwin->window); playlistwin_create_widgets(); playlistwin_update_info();}void playlistwin_recreate(void){ dock_window_list = g_list_remove(dock_window_list, playlistwin); gtk_widget_destroy(playlistwin); playlistwin_create_gtk(); vis_set_window(playlistwin_vis, playlistwin->window);}void playlistwin_show(gboolean show){ GtkWidget *widget; widget = gtk_item_factory_get_widget(mainwin_general_menu, "/Playlist Editor"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), show);}void playlistwin_real_show(void){ if (!pposition_broken && cfg.playlist_x != -1 && cfg.save_window_position && cfg.show_wm_decorations) dock_set_uposition(playlistwin, cfg.playlist_x, cfg.playlist_y); gtk_widget_show(playlistwin); if (pposition_broken && cfg.playlist_x != -1 && cfg.save_window_position) dock_set_uposition(playlistwin, cfg.playlist_x, cfg.playlist_y); gtk_widget_set_usize(playlistwin, cfg.playlist_width, PLAYLIST_HEIGHT); gdk_flush(); draw_playlist_window(TRUE); tbutton_set_toggled(mainwin_pl, TRUE); cfg.playlist_visible = TRUE; playlistwin_set_toprow(0); playlist_check_pos_current(); hint_set_always(cfg.always_on_top); hint_set_sticky(cfg.sticky); hint_set_skip_winlist(playlistwin);}void playlistwin_real_hide(void){ gtk_widget_hide(playlistwin); cfg.playlist_visible = FALSE; tbutton_set_toggled(mainwin_pl, FALSE);}static void playlistwin_popup_menu_callback(gpointer cb_data, guint action, GtkWidget * w){ int pos = GPOINTER_TO_INT(gtk_item_factory_popup_data_from_widget(w)); switch (action) { case MISC_FILEINFO: if (pos == 0) /* We got here via an accelerator */ playlistwin_fileinfo(); else if (pos != -1) playlist_fileinfo(pos - 1); break; case MISC_QUEUE: if (pos == 0) /* We got here via an accelerator */ playlist_queue_selected(); else if (pos != -1) playlist_queue_position(pos - 1); break; case SEL_LOOKUP: playlist_read_info_selection(); break; default: playlistwin_popup_handler(action); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -