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

📄 control.c

📁 avi player 使用Linux下 GDK,GTK
💻 C
字号:
/***  Sinek (Media Player)**  Copyright (c) 2001-2002 Gurer Ozen****  This code is free software; you can redistribute it and/or**  modify it under the terms of the GNU General Public License.****  control window*/#include "common.h"#include "nextmrl.xpm"#include "prevmrl.xpm"#include "play.xpm"#include "stop.xpm"#include "pause.xpm"#include "playlist.xpm"#include "fullscreen.xpm"#include "repeat.xpm"#include "norepeat.xpm"#include "mute.xpm"#include "nomute.xpm"#include <X11/Xlib.h>static GtkWidget *mrl_wid, *time_wid, *info_wid, *vol_wid;static GtkObject *time_adj, *vol_adj;static GtkWidget *jump_win = NULL;static GtkWidget *h_spin, *m_spin, *s_spin;static int total_h = 0, total_m = 0, total_s = 0;static int current_h = 0, current_m = 0, current_s = 0;static void cb_jump(GtkWidget *w, gpointer data);static void cb_browse(GtkWidget *w, gpointer data);static void cb_seek(void);static void cb_mrl(void);static void cb_volume(GtkAdjustment *tadj);static int cb_lala(GtkWidget *w, GdkEventButton *ev, gpointer data);static void register_icons(void){	static GtkStockItem items[] =	{		{ STOCK_PREV, NULL, 0, 0, NULL },		{ STOCK_PLAY, NULL, 0, 0, NULL },		{ STOCK_PAUSE, NULL, 0, 0, NULL },		{ STOCK_STOP, NULL, 0, 0, NULL },		{ STOCK_NEXT, NULL, 0, 0, NULL },		{ STOCK_PLAYLIST, NULL, 0, 0, NULL },		{ STOCK_FULLSCREEN, NULL, 0, 0, NULL },		{ STOCK_REPEAT_ON, NULL, 0, 0, NULL },		{ STOCK_REPEAT_OFF, NULL, 0, 0, NULL },		{ STOCK_MUTE_ON, NULL, 0, 0, NULL },		{ STOCK_MUTE_OFF, NULL, 0, 0, NULL },	};	GtkIconFactory *factory;	GdkPixbuf *pb;	GtkIconSet *icon;	gtk_stock_add(items, G_N_ELEMENTS(items));	factory = gtk_icon_factory_new();	gtk_icon_factory_add_default(factory);#define ADD_ICON(x,y) \	pb = gdk_pixbuf_new_from_xpm_data( (const char **) (y) ); \	icon = gtk_icon_set_new_from_pixbuf(pb); \	gtk_icon_factory_add(factory, (x) , icon);	ADD_ICON(STOCK_PREV, prevmrl_xpm);	ADD_ICON(STOCK_PLAY, play_xpm);	ADD_ICON(STOCK_PAUSE, pause_xpm);	ADD_ICON(STOCK_STOP, stop_xpm);	ADD_ICON(STOCK_NEXT, nextmrl_xpm);	ADD_ICON(STOCK_PLAYLIST, playlist_xpm);	ADD_ICON(STOCK_FULLSCREEN, fullscreen_xpm);	ADD_ICON(STOCK_REPEAT_ON, repeat_xpm);	ADD_ICON(STOCK_REPEAT_OFF, norepeat_xpm);	ADD_ICON(STOCK_MUTE_ON, mute_xpm);	ADD_ICON(STOCK_MUTE_OFF, nomute_xpm);}int control_build(GtkWidget **win){	GtkWidget *control_win;	GtkWidget *vb, *hb, *hb2, *bb;	GtkWidget *lab, *b;	register_icons();	control_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);	gtk_window_set_title(GTK_WINDOW(control_win), _("Sinek Media Player"));	gtk_window_set_wmclass(GTK_WINDOW(control_win), "control", "sinek");	vb = gtk_vbox_new(FALSE, 5);	gtk_widget_show(vb);	gtk_container_add(GTK_CONTAINER(control_win), vb);	gtk_container_set_border_width(GTK_CONTAINER(vb), 5);	hb = gtk_hbox_new(FALSE, 5);	gtk_widget_show(hb);	gtk_box_pack_start(GTK_BOX(vb), hb, TRUE, TRUE, 0);	gtk_container_set_border_width(GTK_CONTAINER(hb), 2);	lab = gtk_label_new(_("Media"));	gtk_widget_show(lab);	gtk_box_pack_start(GTK_BOX(hb), lab, FALSE, FALSE, 0);	mrl_wid = gtk_entry_new();	gtk_widget_show(mrl_wid);	gtk_box_pack_start(GTK_BOX(hb), mrl_wid, TRUE, TRUE, 0);	g_signal_connect(G_OBJECT(mrl_wid), "activate", G_CALLBACK(cb_mrl), NULL);	add_tooltip(mrl_wid, _("Enter a media resource locator"));	b = gtk_button_new_from_stock(GTK_STOCK_OPEN);	gtk_widget_show(b);	gtk_box_pack_start(GTK_BOX(hb), b, FALSE, FALSE, 0);	g_signal_connect(G_OBJECT(b), "clicked", G_CALLBACK(cb_browse), NULL);	add_tooltip(b, _("Open a video file"));	time_adj = gtk_adjustment_new(0, 0, 0, 1, 0, 0);	time_wid = gtk_hscale_new(GTK_ADJUSTMENT(time_adj));	gtk_widget_show(time_wid);	gtk_box_pack_start(GTK_BOX(vb), time_wid, TRUE, TRUE, 0);	gtk_scale_set_draw_value(GTK_SCALE(time_wid), FALSE);	g_signal_connect(G_OBJECT(time_adj), "value_changed", G_CALLBACK(cb_seek), NULL);	g_signal_connect(G_OBJECT(time_wid), "button_release_event", G_CALLBACK(cb_lala), NULL);	add_tooltip(time_wid, _("Seek a position"));	hb2 = gtk_hbox_new(FALSE, 5);	gtk_widget_show(hb2);	gtk_box_pack_start(GTK_BOX(vb), hb2, TRUE, TRUE, 0);	gtk_container_set_border_width(GTK_CONTAINER(hb2), 1);	b = gtk_button_new_from_stock(GTK_STOCK_JUMP_TO);	gtk_widget_show(b);	gtk_box_pack_start(GTK_BOX(hb2), b, FALSE, FALSE, 0);	g_signal_connect(G_OBJECT(b), "clicked", G_CALLBACK(cb_jump), NULL);	add_tooltip(b, _("Jump to a position"));	info_wid = gtk_entry_new();	gtk_widget_show(info_wid);	gtk_box_pack_start(GTK_BOX(hb2), info_wid, FALSE, TRUE, 0);	gtk_entry_set_width_chars(GTK_ENTRY(info_wid), 20);	gtk_editable_set_editable(GTK_EDITABLE(info_wid), FALSE);	GTK_WIDGET_UNSET_FLAGS(info_wid, GTK_CAN_FOCUS);	lab = gtk_label_new(_("Volume"));	gtk_widget_show(lab);	gtk_box_pack_start(GTK_BOX(hb2), lab, FALSE, FALSE, 0);	vol_adj = gtk_adjustment_new(audio_get_volume(), 0, 100, 1, 0, 0);	vol_wid = gtk_hscale_new(GTK_ADJUSTMENT(vol_adj));	gtk_widget_show(vol_wid);	gtk_box_pack_start(GTK_BOX(hb2), vol_wid, TRUE, TRUE, 0);	gtk_scale_set_draw_value(GTK_SCALE(vol_wid), FALSE);	g_signal_connect(G_OBJECT(vol_adj), "value_changed", G_CALLBACK(cb_volume), NULL);	add_tooltip(vol_wid, _("Adjust audio volume"));	bb = gtk_hbox_new(TRUE, 5);	gtk_widget_show(bb);	gtk_box_pack_start(GTK_BOX(vb), bb, TRUE, TRUE, 2);	gtk_container_set_border_width(GTK_CONTAINER(bb), 1);	b = create_pix_button(STOCK_PREV, CMD_PREVIOUS, _("Previous mrl"));	gtk_container_add(GTK_CONTAINER(bb), b);	b = create_pix_button(STOCK_PLAY, CMD_PLAY, _("Play"));	gtk_container_add(GTK_CONTAINER(bb), b);	b = create_pix_button(STOCK_PAUSE, CMD_PAUSE, _("Pause"));	gtk_container_add(GTK_CONTAINER(bb), b);	b = create_pix_button(STOCK_STOP, CMD_STOP, _("Stop"));	gtk_container_add(GTK_CONTAINER(bb), b);	b = create_pix_button(STOCK_NEXT, CMD_NEXT, _("Next mrl"));	gtk_container_add(GTK_CONTAINER(bb), b);	b = create_pix_button(STOCK_PLAYLIST, CMD_SHOW_PLAYLIST, _("Open playlist window"));	gtk_container_add(GTK_CONTAINER(bb), b);	b = create_pix_button(STOCK_FULLSCREEN, CMD_TOGGLE_FULLSCREEN, _("Toggle fullscreen mode"));	gtk_container_add(GTK_CONTAINER(bb), b);	sinek.repeat_tog = create_pix_toggle(STOCK_REPEAT_ON, STOCK_REPEAT_OFF, sinek.repeat_one, CMD_TOGGLE_REPEAT, _("Toggle repeat mode"));	gtk_container_add(GTK_CONTAINER(bb), sinek.repeat_tog);	sinek.mute_tog = create_pix_toggle(STOCK_MUTE_ON, STOCK_MUTE_OFF, sinek.mute, CMD_TOGGLE_MUTE, _("Toggle mute mode"));	gtk_container_add(GTK_CONTAINER(bb), sinek.mute_tog);	*win = control_win;	return WM_NORMAL;}void control_update_slider(unsigned long cur, unsigned long total){	static char buf[30];	current_h = cur / 3600;	current_m = (cur % 3600) / 60;	current_s = cur % 60;	total_h = total / 3600;	total_m = (total % 3600) / 60;	total_s = total % 60;	GTK_ADJUSTMENT(time_adj)->upper = total;	GTK_ADJUSTMENT(time_adj)->value = cur;	gtk_adjustment_value_changed(GTK_ADJUSTMENT(time_adj));	sinek.seeking = 0;	sprintf(buf, "%02d:%02d:%02d of %02d:%02d:%02d", current_h, current_m, current_s, total_h, total_m, total_s);	gtk_entry_set_text(GTK_ENTRY(info_wid), buf);}void control_mrl(char *mrl){	gtk_entry_set_text(GTK_ENTRY(mrl_wid), mrl);	gtk_editable_set_position(GTK_EDITABLE(mrl_wid), -1);}void control_volume(int value){	GTK_ADJUSTMENT(vol_adj)->value = value;	gtk_adjustment_value_changed(GTK_ADJUSTMENT(vol_adj));}static void cb_seek(void){	static char buf[30];	int secs, h, m, s;	sinek.seeking = 1;	secs = GTK_ADJUSTMENT(time_adj)->value;	h = secs / 3600;	m = (secs % 3600) / 60;	s = secs % 60;	sprintf(buf, "%02d:%02d:%02d of %02d:%02d:%02d", h, m, s, total_h, total_m, total_s);	gtk_entry_set_text(GTK_ENTRY(info_wid), buf);}static void cb_volume(GtkAdjustment *vadj){	audio_set_volume(vadj->value);}static int cb_lala(GtkWidget *w, GdkEventButton *ev, gpointer data){	if(sinek.seeking)	{		video_seek(GTK_ADJUSTMENT(time_adj)->value);		sinek.seeking = 0;	}	return FALSE;}static void cb_mrl(void){	const gchar *mrl;	mrl = gtk_entry_get_text(GTK_ENTRY(mrl_wid));	if(!mrl || *mrl == 0) return;	video_play((char *)mrl);}static void cb_browse(GtkWidget *w, gpointer data){	file_request(FALSE);}static void cb_jump_go(GtkWidget *w, GtkWidget *win){	int h, m, s, secs;	h = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(h_spin));	m = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_spin));	s = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(s_spin));	secs = h * 3600 + m * 60 + s;	video_seek(secs);	gtk_widget_hide(win);}static void cb_jump(GtkWidget *w, gpointer data){	GtkObject *adj;	GtkWidget *vb, *fr, *hb, *b;	if(jump_win) goto out;	jump_win = gtk_dialog_new();	gtk_dialog_set_has_separator(GTK_DIALOG(jump_win), FALSE);	gtk_window_set_title(GTK_WINDOW(jump_win), _("Go to..."));	vb = GTK_DIALOG(jump_win)->vbox;	gtk_widget_show(vb);	fr = gtk_frame_new(NULL);	gtk_widget_show(fr);	gtk_box_pack_start(GTK_BOX(vb), fr, TRUE, TRUE, 0);	gtk_container_set_border_width(GTK_CONTAINER(fr), 5);	hb = gtk_hbox_new(TRUE, 0);	gtk_widget_show(hb);	gtk_container_add(GTK_CONTAINER(fr), hb);	gtk_container_set_border_width(GTK_CONTAINER(hb), 5);	adj = gtk_adjustment_new(current_h, 0, 100, 1, 0, 0);	h_spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);	gtk_widget_show(h_spin);	gtk_box_pack_start(GTK_BOX(hb), h_spin, FALSE, FALSE, 0);	adj = gtk_adjustment_new(current_m, 0, 60, 1, 0, 0);	m_spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);	gtk_widget_show(m_spin);	gtk_box_pack_start(GTK_BOX(hb), m_spin, FALSE, FALSE, 0);	adj = gtk_adjustment_new(current_s, 0, 60, 1, 0, 0);	s_spin = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);	gtk_widget_show(s_spin);	gtk_box_pack_start(GTK_BOX(hb), s_spin, FALSE, FALSE, 0);	hb = GTK_DIALOG(jump_win)->action_area;	gtk_widget_show(hb);	gtk_container_set_border_width(GTK_CONTAINER(hb), 10);	b = gtk_button_new_from_stock(GTK_STOCK_JUMP_TO);	gtk_widget_show(b);	gtk_container_add(GTK_CONTAINER(hb), b);	g_signal_connect(G_OBJECT(b), "clicked", G_CALLBACK(cb_jump_go), jump_win);	b = gtk_button_new_from_stock(GTK_STOCK_CANCEL);	gtk_widget_show(b);	gtk_container_add(GTK_CONTAINER(hb), b);	g_signal_connect_swapped(G_OBJECT(b), "clicked", G_CALLBACK(gtk_widget_hide), GTK_OBJECT(jump_win));	wm_manage(jump_win, WM_AUTOHIDE);out:	gtk_spin_button_set_value(GTK_SPIN_BUTTON(h_spin), current_h);	gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_spin), current_m);	gtk_spin_button_set_value(GTK_SPIN_BUTTON(s_spin), current_s);	gtk_window_present(GTK_WINDOW(jump_win));}

⌨️ 快捷键说明

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