📄 wmxmms.c
字号:
if (seekslider_dragging) { seekslider_pos = event->x - SEEKSLIDER_X - seekslider_drag_offset; if (seekslider_pos < 0) seekslider_pos = 0; if (seekslider_pos > SEEKSLIDER_MAX) seekslider_pos = SEEKSLIDER_MAX; draw_seekslider(); }}void destroy_cb(GtkWidget *w, gpointer data){ gtk_exit(0);}static void update_tooltip(void){ static int pl_pos = -1; static char *filename; int new_pos; if (!tooltips) return; new_pos = xmms_remote_get_playlist_pos(xmms_session); if (new_pos == 0) { /* * Need to do some extra checking, as we get 0 also on * a empty playlist */ char *current = xmms_remote_get_playlist_file(xmms_session, 0); if (!filename && current) { filename = current; new_pos = -1; } else if (filename && !current) { g_free(filename); filename = NULL; new_pos = -1; } else if (filename && current && strcmp(filename, current)) { g_free(filename); filename = current; new_pos = -1; } } if (pl_pos != new_pos) { char *tip = NULL; char *title = xmms_remote_get_playlist_title(xmms_session, new_pos); if (title) { tip = g_strdup_printf("%d. %s", new_pos+1, title); g_free(title); } gtk_tooltips_set_tip(tooltips, window, tip, NULL); g_free(tip); pl_pos = new_pos; }}int timeout_func(gpointer data){ int new_pos, pos; gboolean playing, running; running = xmms_remote_is_running(xmms_session); if (running) { if (!xmms_running) { gtk_widget_shape_combine_mask(icon_win, mask, 0, 0); gtk_widget_shape_combine_mask(window, mask, 0, 0); xmms_running = running; redraw_window(); } if (!volslider_dragging) { int vl, vr; xmms_remote_get_volume(xmms_session, &vl, &vr); new_pos = ((vl > vr ? vl : vr) * 40) / 100; if (new_pos < 0) new_pos = 0; if (new_pos > VOLSLIDER_HEIGHT) new_pos = VOLSLIDER_HEIGHT; if (volslider_pos != new_pos) { volslider_pos = new_pos; draw_volslider(); } } update_tooltip(); playing = xmms_remote_is_playing(xmms_session); if (!playing && seekslider_visible) { seekslider_visible = FALSE; seekslider_dragging = FALSE; seekslider_pos = -1; draw_seekslider(); } else if (playing) { int len, p = xmms_remote_get_playlist_pos(xmms_session); len = xmms_remote_get_playlist_time(xmms_session, p); if (len == -1) { seekslider_visible = FALSE; seekslider_dragging = FALSE; seekslider_pos = -1; draw_seekslider(); } else if (!seekslider_dragging) { seekslider_visible = TRUE; pos = xmms_remote_get_output_time(xmms_session); if (len != 0) new_pos = (pos * SEEKSLIDER_MAX) / len; else new_pos = 0; if (new_pos < 0) new_pos = 0; if (new_pos > SEEKSLIDER_MAX) new_pos = SEEKSLIDER_MAX; if (seekslider_pos != new_pos) { seekslider_pos = new_pos; draw_seekslider(); } } } } else { if (xmms_running) { if (tooltips != NULL) gtk_tooltips_set_tip(tooltips, window, NULL, NULL); gtk_widget_shape_combine_mask(icon_win, launch_mask, 0, 0); gtk_widget_shape_combine_mask(window, launch_mask, 0, 0); xmms_running = FALSE; redraw_window(); } } return TRUE;}void drag_data_received(GtkWidget *widget, GdkDragContext *context, int x, int y, GtkSelectionData *selection_data, guint info, guint time){ if (selection_data->data) { char *url = selection_data->data; xmms_remote_playlist_clear(xmms_session); xmms_remote_playlist_add_url_string(xmms_session, url); xmms_remote_play(xmms_session); }}void init(void){ GdkColor bg_color; GdkWindow *leader; XWMHints hints; int i, w, h; GdkGC *mask_gc; for (i = 0; i < NUM_BUTTONS; i++) button_list = g_list_append(button_list, &buttons[i]); if (song_title) { tooltips = gtk_tooltips_new(); gtk_tooltips_set_delay(tooltips, 1000); } window = gtk_window_new(GTK_WINDOW_DIALOG); if (has_geometry) gtk_widget_set_uposition(window, win_x, win_y); gtk_widget_set_usize(window, 64, 64); gtk_widget_set_app_paintable(window, TRUE); gtk_widget_set_events(window, GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK); gtk_signal_connect(GTK_OBJECT(window), "expose_event", GTK_SIGNAL_FUNC(expose_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(button_press_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "button_release_event", GTK_SIGNAL_FUNC(button_release_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "motion_notify_event", GTK_SIGNAL_FUNC(motion_notify_cb), NULL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy_cb), NULL); gtk_drag_dest_set(window, GTK_DEST_DEFAULT_ALL, drop_types, 1, GDK_ACTION_COPY); gtk_signal_connect(GTK_OBJECT(window), "drag_data_received", GTK_SIGNAL_FUNC(drag_data_received), NULL); gtk_widget_realize(window); bg_color.red = 0; bg_color.green = 0; bg_color.blue = 0; gdk_colormap_alloc_color(gdk_colormap_get_system(), &bg_color, FALSE, TRUE); gdk_window_set_background(window->window, &bg_color); gdk_window_clear(window->window); hints.initial_state = WithdrawnState; hints.flags = StateHint; XSetWMHints(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(window->window), &hints); icon_win = gtk_window_new(GTK_WINDOW_DIALOG); gtk_widget_set_app_paintable(icon_win, TRUE); gtk_widget_set_uposition(icon_win, 0, 0); gtk_widget_set_usize(icon_win, 64, 64); gtk_widget_set_events(icon_win, GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK); gtk_signal_connect(GTK_OBJECT(icon_win), "expose_event", GTK_SIGNAL_FUNC(expose_cb), NULL); gtk_signal_connect(GTK_OBJECT(icon_win), "button_press_event", GTK_SIGNAL_FUNC(button_press_cb), NULL); gtk_signal_connect(GTK_OBJECT(icon_win), "button_release_event", GTK_SIGNAL_FUNC(button_release_cb), NULL); gtk_signal_connect(GTK_OBJECT(icon_win), "motion_notify_event", GTK_SIGNAL_FUNC(motion_notify_cb), NULL); gtk_signal_connect(GTK_OBJECT(icon_win), "destroy", GTK_SIGNAL_FUNC(destroy_cb), NULL); gtk_drag_dest_set(icon_win, GTK_DEST_DEFAULT_ALL, drop_types, 1, GDK_ACTION_COPY); gtk_signal_connect(GTK_OBJECT(icon_win), "drag_data_received", GTK_SIGNAL_FUNC(drag_data_received), NULL); gtk_widget_realize(icon_win); bg_color.red = 0; bg_color.green = 0; bg_color.blue = 0; gdk_colormap_alloc_color(gdk_colormap_get_system(), &bg_color, FALSE, TRUE); gdk_window_set_background(icon_win->window, &bg_color); gdk_window_clear(icon_win->window); dock_gc = gdk_gc_new(icon_win->window); launch_pixmap = gdk_pixmap_new(window->window, 64, 64, gdk_visual_get_best_depth()); launch_mask = gdk_pixmap_new(window->window, 64, 64, 1); mask_gc = gdk_gc_new(launch_mask); bg_color.pixel = 0; gdk_gc_set_foreground(mask_gc, &bg_color); gdk_draw_rectangle(launch_mask, mask_gc, TRUE, 0, 0, -1, -1); if (!icon_name) icon_name = g_strdup_printf("%s/wmxmms.xpm", DATA_DIR); pixmap = gdk_pixmap_create_from_xpm(window->window, &mask, NULL, icon_name); if (!pixmap) { printf(_("ERROR: Couldn't find %s\n"), icon_name); g_free(icon_name); gtk_exit(1); } g_free(icon_name); gdk_window_get_size(pixmap, &w, &h); if (w > 64) w = 64; if (h > 64) h = 64; gdk_draw_pixmap(launch_pixmap, dock_gc, pixmap, 0, 0, 32 - (w / 2), 32 - (h / 2), w, h); gdk_draw_pixmap(launch_mask, mask_gc, mask, 0, 0, 32 - (w / 2), 32 - (h / 2), w, h); gdk_gc_unref(mask_gc); gdk_pixmap_unref(pixmap); gdk_bitmap_unref(mask); gtk_widget_shape_combine_mask(window, launch_mask, 0, 0); gtk_widget_shape_combine_mask(icon_win, launch_mask, 0, 0); pixmap = gdk_pixmap_create_from_xpm_d(window->window, &mask, NULL, xmms_dock_master_xpm); leader = gdk_window_foreign_new(gdk_leader_window); gdk_window_set_icon(leader, icon_win->window, NULL, NULL); gdk_window_reparent(icon_win->window, leader, 0, 0); gdk_window_unref(leader); gtk_widget_show(icon_win); gtk_widget_show(window); timeout_tag = gtk_timeout_add(100, timeout_func, NULL);}void display_usage(char *cmd){ printf(_( "Usage: %s [options]\n\n" "Options:\n" "--------\n\n" "-h, --help Display this text and exit.\n" "-g, --geometry Set the geometry (for example +20+20)\n" "-s, --session Set the xmms session to use (Default: 0)\n" "-c, --command Command to launch xmms (Default: xmms)\n" "-i, --icon Set the icon to use when xmms is not running\n" "-n, --single Only a single click is needed to start xmms\n" "-t, --title Display song title when mouse is in window\n" "-v, --version Display version information and exit\n\n"), cmd);}static struct option lopt[] ={ {"help", 0, NULL, 'h'}, {"geometry", 1, NULL, 'g'}, {"session", 1, NULL, 's'}, {"command", 1, NULL, 'c'}, {"icon", 1, NULL, 'i'}, {"single", 0, NULL, 'n'}, {"title", 0, NULL, 't'}, {"version", 0, NULL, 'v'}, {NULL, 0, NULL, 0}};int main(int argc, char **argv){ int c; gtk_set_locale();#ifdef ENABLE_NLS bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE);#endif gtk_init(&argc, &argv); while ((c = getopt_long(argc, argv, "hg:s:c:i:ntv", lopt, NULL)) != -1) { switch (c) { case 'h': display_usage(argv[0]); gtk_exit(0); break; case 'g': XParseGeometry(optarg, &win_x, &win_y, NULL, NULL); has_geometry = TRUE; break; case 's': xmms_session = atoi(optarg); break; case 'c': xmms_cmd = g_strdup(optarg); break; case 'i': icon_name = g_strdup(optarg); break; case 'n': single_click = TRUE; break; case 't': song_title = TRUE; break; case 'v': printf("wmxmms %s\n", VERSION); gtk_exit(0); break; } } init(); gtk_main(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -