📄 main.c
字号:
hide_widget(mainwin_position); hide_widget(mainwin_sposition); playlistwin_hide_timer(); draw_main_window(TRUE); vis_clear(active_vis); gtk_window_set_title(GTK_WINDOW(mainwin), "XMMS");}void mainwin_disable_seekbar(void){ /* * We dont call draw_main_window() here so this will not * remove them visually. It will only prevent us from sending * any seek calls to the input plugin before the input plugin * calls ->set_info(). */ hide_widget(mainwin_position); hide_widget(mainwin_sposition);}void mainwin_release(GtkWidget * widget, GdkEventButton * event, gpointer callback_data){ gdk_pointer_ungrab(GDK_CURRENT_TIME); /* * The gdk_flush() is just for making sure that the pointer really * gets ungrabbed before calling any button callbacks * */ gdk_flush(); if (dock_is_moving(mainwin)) { dock_move_release(mainwin); } if (mainwin_menurow->mr_doublesize_selected) { event->x /= 2; event->y /= 2; } handle_release_cb(mainwin_wlist, widget, event); draw_main_window(FALSE);}void mainwin_motion(GtkWidget * widget, GdkEventMotion * event, gpointer callback_data){ XEvent ev; gint i = 0; XSync(GDK_DISPLAY(), False); while (XCheckTypedEvent(GDK_DISPLAY(), MotionNotify, &ev)) { event->x = ev.xmotion.x; event->y = ev.xmotion.y; i++; } if (cfg.doublesize) { event->x /= 2; event->y /= 2; } if (dock_is_moving(mainwin)) { dock_move_motion(mainwin, event); } else { handle_motion_cb(mainwin_wlist, widget, event); draw_main_window(FALSE); } gdk_flush();}static gboolean inside_sensitive_widgets(gint x, gint y){ return (inside_widget(x, y, mainwin_menubtn) || inside_widget(x, y, mainwin_minimize) || inside_widget(x, y, mainwin_shade) || inside_widget(x, y, mainwin_close) || inside_widget(x, y, mainwin_rew) || inside_widget(x, y, mainwin_play) || inside_widget(x, y, mainwin_pause) || inside_widget(x, y, mainwin_stop) || inside_widget(x, y, mainwin_fwd) || inside_widget(x, y, mainwin_eject) || inside_widget(x, y, mainwin_shuffle) || inside_widget(x, y, mainwin_repeat) || inside_widget(x, y, mainwin_pl) || inside_widget(x, y, mainwin_eq) || inside_widget(x, y, mainwin_info) || inside_widget(x, y, mainwin_menurow) || inside_widget(x, y, mainwin_volume) || inside_widget(x, y, mainwin_balance) || (inside_widget(x, y, mainwin_position) && ((Widget *) mainwin_position)->visible) || inside_widget(x, y, mainwin_minus_num) || inside_widget(x, y, mainwin_10min_num) || inside_widget(x, y, mainwin_min_num) || inside_widget(x, y, mainwin_10sec_num) || inside_widget(x, y, mainwin_sec_num) || inside_widget(x, y, mainwin_vis) || inside_widget(x, y, mainwin_minimize) || inside_widget(x, y, mainwin_shade) || inside_widget(x, y, mainwin_close) || inside_widget(x, y, mainwin_menubtn) || inside_widget(x, y, mainwin_sposition) || inside_widget(x, y, mainwin_stime_min) || inside_widget(x, y, mainwin_stime_sec) || inside_widget(x, y, mainwin_srew) || inside_widget(x, y, mainwin_splay) || inside_widget(x, y, mainwin_spause) || inside_widget(x, y, mainwin_sstop) || inside_widget(x, y, mainwin_sfwd) || inside_widget(x, y, mainwin_seject) || inside_widget(x, y, mainwin_svis) || inside_widget(x, y, mainwin_about));}void mainwin_press(GtkWidget * widget, GdkEventButton * event, gpointer callback_data){ gboolean grab = TRUE; if (cfg.doublesize) { /* * A hack to make doublesize transparent to callbacks. * We should make a copy of this data instead of * tampering with the data we get from gtk+ */ event->x /= 2; event->y /= 2; } if ((event->button == 4 || event->button == 5) && event->type == GDK_BUTTON_PRESS) { /* Handle mouse wheel events */ int d = cfg.mouse_change; if (event->button == 5) d *= -1; mainwin_set_volume_diff(d); } if ((event->button == 6 || event->button == 7) && event->type == GDK_BUTTON_PRESS && playlist_get_current_length() != -1) { /* Horizontal scrolling seeks */ int d = cfg.mouse_change * 1000; if (event->button == 6) d *= -1; input_seek(CLAMP(input_get_time() + d, 0, playlist_get_current_length()) / 1000); } if (event->button == 1 && event->type == GDK_BUTTON_PRESS && !inside_sensitive_widgets(event->x, event->y) && (cfg.easy_move || event->y < 14)) { if (0 && hint_move_resize_available()) { hint_move_resize(mainwin, event->x_root, event->y_root, TRUE); grab = FALSE; } else { gdk_window_raise(mainwin->window); equalizerwin_raise(); playlistwin_raise(); dock_move_press(dock_window_list, mainwin, event, TRUE); } } else if (event->button == 1 && event->type == GDK_2BUTTON_PRESS && event->y < 14 && !inside_sensitive_widgets(event->x, event->y)) { mainwin_set_shade(!cfg.player_shaded); if (dock_is_moving(mainwin)) dock_move_release(mainwin); } else if (event->button == 1 && event->type == GDK_2BUTTON_PRESS && inside_widget(event->x, event->y, mainwin_info)) { playlist_fileinfo_current(); } else { handle_press_cb(mainwin_wlist, widget, event); draw_main_window(FALSE); } if ((event->button == 1) && event->type != GDK_2BUTTON_PRESS && (inside_widget(event->x, event->y, mainwin_vis) || inside_widget(event->x, event->y, mainwin_svis))) { cfg.vis_type++; if (cfg.vis_type > VIS_OFF) cfg.vis_type = VIS_ANALYZER; mainwin_vis_set_type(cfg.vis_type); } if (event->button == 3) { if (inside_widget(event->x, event->y, mainwin_info)) { util_item_factory_popup(mainwin_songname_menu, event->x_root, event->y_root, 3, event->time); grab = FALSE; } else if (inside_widget(event->x, event->y, mainwin_vis) || inside_widget(event->x, event->y, mainwin_svis)) { util_item_factory_popup(mainwin_vis_menu, event->x_root, event->y_root, 3, event->time); grab = FALSE; } else { /* * Pop up the main menu a few pixels down. * This will avoid that anything is selected * if one right-clicks to focus the window * without raising it. */ util_item_factory_popup(mainwin_general_menu, event->x_root, event->y_root + 2, 3, event->time); grab = FALSE; } } if (event->button == 1) { if ((event->x > 35 && event->x < 100 && event->y > 25 && event->y < 40) || inside_widget(event->x, event->y, mainwin_stime_min) || inside_widget(event->x, event->y, mainwin_stime_sec)) { if (cfg.timer_mode == TIMER_ELAPSED) set_timer_mode(TIMER_REMAINING); else set_timer_mode(TIMER_ELAPSED); } } if (grab) gdk_pointer_grab(mainwin->window, FALSE, GDK_BUTTON_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, GDK_NONE, GDK_NONE, GDK_CURRENT_TIME);}void mainwin_focus_in(GtkWidget * widget, GdkEvent * event, gpointer callback_data){ mainwin_focus = 1; if (!cfg.player_visible) { if (cfg.playlist_visible) playlistwin_raise(); else if (cfg.equalizer_visible) equalizerwin_raise(); } mainwin_menubtn->pb_allow_draw = TRUE; mainwin_minimize->pb_allow_draw = TRUE; mainwin_shade->pb_allow_draw = TRUE; mainwin_close->pb_allow_draw = TRUE; draw_main_window(TRUE);}void mainwin_focus_out(GtkWidget * widget, GdkEventButton * event, gpointer callback_data){ mainwin_focus = 0; mainwin_menubtn->pb_allow_draw = FALSE; mainwin_minimize->pb_allow_draw = FALSE; mainwin_shade->pb_allow_draw = FALSE; mainwin_close->pb_allow_draw = FALSE; draw_main_window(TRUE);}gboolean mainwin_keypress(GtkWidget * w, GdkEventKey * event, gpointer data){ switch(event->keyval) { case GDK_Up: case GDK_KP_Up: mainwin_set_volume_diff(2); break; case GDK_Down: case GDK_KP_Down: mainwin_set_volume_diff(-2); break; case GDK_Left: case GDK_KP_Left: if(playlist_get_current_length() != -1) input_seek(CLAMP(input_get_time() - 5000, 0, playlist_get_current_length()) / 1000); break; case GDK_Right: case GDK_KP_Right: if(playlist_get_current_length() != -1) input_seek(CLAMP(input_get_time() + 5000, 0, playlist_get_current_length()) / 1000); break; default: break; } return TRUE;}void mainwin_jump_to_time_cb(GtkWidget * widget, GtkWidget * entry){ guint min = 0, sec = 0, params, time; gchar timestr[6]; strcpy(timestr, gtk_entry_get_text(GTK_ENTRY(entry))); params = sscanf(timestr, "%u:%u", &min, &sec); if (params == 2) time = (min * 60) + sec; else if (params == 1) time = min; else return; if (playlist_get_current_length() > -1 && time <= (playlist_get_current_length() / 1000)) { input_seek(time); gtk_widget_destroy(mainwin_jtt); }}void mainwin_jump_to_time(void){ GtkWidget *vbox, *frame, *vbox_inside, *hbox_new, *hbox_total; GtkWidget *time_entry, *label, *bbox, *jump, *cancel; guint len, tindex; gchar timestr[10]; if (!get_input_playing()) return; mainwin_jtt = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_title(GTK_WINDOW(mainwin_jtt), _("Jump to time")); gtk_window_set_policy(GTK_WINDOW(mainwin_jtt), FALSE, FALSE, FALSE); gtk_window_set_transient_for(GTK_WINDOW(mainwin_jtt), GTK_WINDOW(mainwin)); gtk_signal_connect(GTK_OBJECT(mainwin_jtt), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &mainwin_jtt); gtk_container_border_width(GTK_CONTAINER(mainwin_jtt), 10); vbox = gtk_vbox_new(FALSE, 5); gtk_container_add(GTK_CONTAINER(mainwin_jtt), vbox); gtk_widget_show(vbox); frame = gtk_frame_new(_("Jump to:")); gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); gtk_widget_set_usize(frame, 250, -1); gtk_widget_show(frame); vbox_inside = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox_inside); gtk_widget_show(vbox_inside); hbox_new = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_inside), hbox_new, TRUE, TRUE, 5); gtk_widget_show(hbox_new); time_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox_new), time_entry, FALSE, FALSE, 5); gtk_signal_connect(GTK_OBJECT(time_entry), "activate", GTK_SIGNAL_FUNC(mainwin_jump_to_time_cb), time_entry); gtk_widget_show(time_entry); gtk_widget_set_usize(time_entry, 70, -1); label = gtk_label_new(_("minutes:seconds")); gtk_box_pack_start(GTK_BOX(hbox_new), label, FALSE, FALSE, 5); gtk_widget_show(label); hbox_total = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox_inside), hbox_total, TRUE, TRUE, 5); gtk_widget_show(hbox_total); label = gtk_label_new(_("Track length:")); gtk_box_pack_start(GTK_BOX(hbox_total), label, FALSE, FALSE, 5); gtk_widget_show(label); len = playlist_get_current_length() / 1000; sprintf(timestr, "%u:%2.2u", len / 60, len % 60); label = gtk_label_new(timestr); gtk_box_pack_start(GTK_BOX(hbox_total), label, FALSE, FALSE, 10); gtk_widget_show(label); bbox = gtk_hbutton_box_new();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -