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

📄 keys.c

📁 avi player 使用Linux下 GDK,GTK
💻 C
📖 第 1 页 / 共 2 页
字号:
/***  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.****  key bindings*/#include "common.h"typedef struct action_struct{	char *name;	char *label;	cmd_type cmd;} action;static action actions[] ={	{ "play", N_("Play"), CMD_PLAY },	{ "pause", N_("Pause"), CMD_PAUSE },	{ "stop", N_("Stop"), CMD_STOP },	{ "next", N_("Next"), CMD_NEXT },	{ "previous", N_("Previous"), CMD_PREVIOUS },	{ "volume-up", N_("Increase volume"), CMD_VOLUME_UP },	{ "volume-down", N_("Decrease volume"), CMD_VOLUME_DOWN },	{ "speed-fast", N_("Increase playback speed"), CMD_SPEED_FAST },	{ "speed-slow", N_("Decrease playback speed"), CMD_SPEED_SLOW },	{ "av-offset-down", N_("Speed up video (if it lags behind)"), CMD_AV_OFFSET_DOWN },	{ "av-offset-up", N_("Slow down video (if audio lags behind)"), CMD_AV_OFFSET_UP },	{ "toggle-fullscreen", N_("Toggle fullscreen mode"), CMD_TOGGLE_FULLSCREEN },	{ "zoom-out", N_("Zoom out"), CMD_ZOOM_OUT },	{ "zoom-in", N_("Zoom in"), CMD_ZOOM_IN },	{ "zoom-reset", N_("Reset zoom"), CMD_ZOOM_RESET },	{ "toggle-aspect", N_("Change video aspect"), CMD_TOGGLE_ASPECT },	{ "toggle-interleave", N_("Toggle interleave"), CMD_TOGGLE_INTERLEAVE },	{ "toggle-tvmode", N_("Toggle TV mode of DXR3"), CMD_TOGGLE_TVMODE },	{ "window-1x1", N_("1x1 video size"), CMD_WINDOW_1x1 },	{ "window-2x2", N_("2x2 video size"), CMD_WINDOW_2x2 },	{ "window-fullscreen", N_("Fullscreen video"), CMD_WINDOW_FULLSCREEN },	{ "window-background", N_("Display video in background"), CMD_WINDOW_BACKGROUND },	{ "window-reduce", N_("Reduce video window"), CMD_WINDOW_REDUCE },	{ "window-enlarge", N_("Enlarge video window"), CMD_WINDOW_ENLARGE },	{ "audio-mute", N_("Toggle audio muting"), CMD_TOGGLE_MUTE },	{ "audio-next", N_("Next audio channel"), CMD_AUDIO_NEXT },	{ "audio-previous", N_("Previous audio channel"), CMD_AUDIO_PREVIOUS },	{ "show-playlist", N_("Show playlist window"), CMD_SHOW_PLAYLIST },	{ "show-tuner", N_("Show tuner window"), CMD_SHOW_TUNER },	{ "show-about", N_("Show about window"), CMD_SHOW_ABOUT },	{ "show-controls", N_("Show controls window"), CMD_SHOW_CONTROLS },	{ "show-video", N_("Show video window"), CMD_SHOW_VIDEO },	{ "toggle-gui", N_("Toggle all windows"), CMD_TOGGLE_GUI },	{ "quit", N_("Quit"), CMD_QUIT },	{ "event-menu1", N_("Menu 1"), CMD_EVENT_MENU1 },	{ "event-menu2", N_("Menu 2"), CMD_EVENT_MENU2 },	{ "event-menu3", N_("Menu 3"), CMD_EVENT_MENU3 },	{ "event-up", N_("Menu up"), CMD_EVENT_UP },	{ "event-down", N_("Menu down"), CMD_EVENT_DOWN },	{ "event-left", N_("Menu left"), CMD_EVENT_LEFT },	{ "event-right", N_("Menu right"), CMD_EVENT_RIGHT },	{ "event-next", N_("Menu next"), CMD_EVENT_NEXT },	{ "event-prior", N_("Menu previous"), CMD_EVENT_PRIOR },	{ "event-angle-next", N_("Menu next angle"), CMD_EVENT_ANGLE_NEXT },	{ "event-angle-prior", N_("Menu previous angle"), CMD_EVENT_ANGLE_PRIOR },	{ "event-select", N_("Menu select"), CMD_EVENT_SELECT },	{ "spu-next", N_("Next subtitle channel"), CMD_SPU_NEXT },	{ "spu-previous", N_("Previous subtitle channel"), CMD_SPU_PREVIOUS },	{ "mark-goto-0", N_("Go to mark 0"), CMD_GOTO_MARK_0 },	{ "mark-goto-1", N_("Go to mark 1"), CMD_GOTO_MARK_1 },	{ "mark-goto-2", N_("Go to mark 2"), CMD_GOTO_MARK_2 },	{ "mark-goto-3", N_("Go to mark 3"), CMD_GOTO_MARK_3 },	{ "mark-goto-4", N_("Go to mark 4"), CMD_GOTO_MARK_4 },	{ "mark-goto-5", N_("Go to mark 5"), CMD_GOTO_MARK_5 },	{ "mark-goto-6", N_("Go to mark 6"), CMD_GOTO_MARK_6 },	{ "mark-goto-7", N_("Go to mark 7"), CMD_GOTO_MARK_7 },	{ "mark-goto-8", N_("Go to mark 8"), CMD_GOTO_MARK_8 },	{ "mark-goto-9", N_("Go to mark 9"), CMD_GOTO_MARK_9 },	{ "mark-set-1", N_("Set mark 1"), CMD_SET_MARK_1 },	{ "mark-set-2", N_("Set mark 2"), CMD_SET_MARK_2 },	{ "mark-set-3", N_("Set mark 3"), CMD_SET_MARK_3 },	{ "mark-set-4", N_("Set mark 4"), CMD_SET_MARK_4 },	{ "mark-set-5", N_("Set mark 5"), CMD_SET_MARK_5 },	{ "mark-set-6", N_("Set mark 6"), CMD_SET_MARK_6 },	{ "mark-set-7", N_("Set mark 7"), CMD_SET_MARK_7 },	{ "mark-set-8", N_("Set mark 8"), CMD_SET_MARK_8 },	{ "mark-set-9", N_("Set mark 9"), CMD_SET_MARK_9 },	{ NULL, NULL, CMD_NONE }};#define MOD_SHIFT 1#define MOD_CONTROL 4#define MOD_ALT 8static struct defkeys_struct{	cmd_type cmd;	char *key;	int modifier;} defkeys[] ={	{ CMD_PLAY, "Return", 0 },	{ CMD_PAUSE, "space", 0 },	{ CMD_STOP, "s", 0 },	{ CMD_NEXT, "Next", 0 },	{ CMD_PREVIOUS, "Prior", 0 },	{ CMD_SPEED_FAST, "Up", 0 },	{ CMD_SPEED_SLOW, "Down", 0 },	{ CMD_AV_OFFSET_DOWN, "n", 0},	{ CMD_AV_OFFSET_UP, "m", 0},	{ CMD_TOGGLE_FULLSCREEN, "f", 0 },	{ CMD_ZOOM_OUT, "z", 0 },	{ CMD_ZOOM_IN, "z", MOD_SHIFT },	{ CMD_ZOOM_RESET, "x", 0 },	{ CMD_TOGGLE_ASPECT, "a", 0 },	{ CMD_TOGGLE_INTERLEAVE, "i", 0 },	{ CMD_TOGGLE_TVMODE, "o", MOD_CONTROL },	{ CMD_WINDOW_1x1, "1", MOD_CONTROL },	{ CMD_WINDOW_2x2, "2", MOD_CONTROL },	{ CMD_WINDOW_FULLSCREEN, "3", MOD_CONTROL },	{ CMD_WINDOW_BACKGROUND, "4", MOD_CONTROL },	{ CMD_WINDOW_REDUCE, "less", 0 },	{ CMD_WINDOW_ENLARGE, "greater", 0 },	{ CMD_TOGGLE_MUTE, "BackSpace", 0 },	{ CMD_AUDIO_NEXT, "plus", 0 },	{ CMD_AUDIO_PREVIOUS, "minus", 0 },	{ CMD_SHOW_PLAYLIST, "p", 0 },	{ CMD_SHOW_TUNER, "t", 0 },	{ CMD_SHOW_ABOUT, "question", 0 },	{ CMD_SHOW_CONTROLS, "c", 0 },	{ CMD_SHOW_VIDEO, "v", 0 },	{ CMD_TOGGLE_GUI, "g", 0 },	{ CMD_QUIT, "Escape", 0 },	{ CMD_EVENT_MENU1, "F1", 0 },	{ CMD_EVENT_MENU2, "F2", 0 },	{ CMD_EVENT_MENU3, "F3", 0 },	{ CMD_EVENT_UP, "KP_Up", 0 },	{ CMD_EVENT_DOWN, "KP_Down", 0 },	{ CMD_EVENT_LEFT, "KP_Left", 0 },	{ CMD_EVENT_RIGHT, "KP_Right", 0 },	{ CMD_EVENT_NEXT, "KP_Next", 0 },	{ CMD_EVENT_PRIOR, "KP_Prior", 0 },	{ CMD_EVENT_ANGLE_NEXT, "KP_1", 0 },	{ CMD_EVENT_ANGLE_PRIOR, "KP_7", 0 },	{ CMD_EVENT_SELECT, "KP_Enter", 0 },	{ CMD_SPU_NEXT, "period", 0 },	{ CMD_SPU_PREVIOUS, "comma", 0 },	{ CMD_GOTO_MARK_0, "0", 0 },	{ CMD_GOTO_MARK_1, "1", 0 },	{ CMD_GOTO_MARK_2, "2", 0 },	{ CMD_GOTO_MARK_3, "3", 0 },	{ CMD_GOTO_MARK_4, "4", 0 },	{ CMD_GOTO_MARK_5, "5", 0 },	{ CMD_GOTO_MARK_6, "6", 0 },	{ CMD_GOTO_MARK_7, "7", 0 },	{ CMD_GOTO_MARK_8, "8", 0 },	{ CMD_GOTO_MARK_9, "9", 0 },	{ CMD_SET_MARK_1, "1", MOD_SHIFT },	{ CMD_SET_MARK_2, "2", MOD_SHIFT },	{ CMD_SET_MARK_3, "3", MOD_SHIFT },	{ CMD_SET_MARK_4, "4", MOD_SHIFT },	{ CMD_SET_MARK_5, "5", MOD_SHIFT },	{ CMD_SET_MARK_6, "6", MOD_SHIFT },	{ CMD_SET_MARK_7, "7", MOD_SHIFT },	{ CMD_SET_MARK_8, "8", MOD_SHIFT },	{ CMD_SET_MARK_9, "9", MOD_SHIFT },	{ CMD_NONE, NULL, 0 }};typedef struct binding_struct{	struct binding_struct *next, *prev;	char *key;	int modifier;	struct action_struct *action;} binding;static binding *bindings, *last_binding;static GtkWidget *key_win;static GtkWidget *action_wid, *key_wid, *clist_wid;static int key_row;static action *find_action_by_event(char *key, int modifier);static action *find_action_by_name(char *action);static int load_keys(void);static void reset_keys(void);static char *key_name(char *key, int modifier);void keywin_init(void);void key_init(void){	int i;	for(i = 0; actions[i].name; i++)	{		actions[i].label = gettext(actions[i].label);	}	keywin_init();	if(!load_keys()) reset_keys();	gtk_clist_select_row(GTK_CLIST(clist_wid), 0, 0);}gboolean key_handle(unsigned long keyval, int modifier){	char *key;	action *act;	modifier &= (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK);	key = gdk_keyval_name(gdk_keyval_to_lower(keyval));	if(!key) return(FALSE);	act = find_action_by_event(key, modifier);	if(!act) return(FALSE);	execute_cmd(act->cmd);	return TRUE;}cmd_type find_cmd(char *command){	action *act;	act = find_action_by_name(command);	if(act) return(act->cmd);	return CMD_NONE;}static action *find_action_by_event(char *key, int modifier){	binding *kb, *tmp = NULL;	for(kb = bindings; kb; kb = kb->next)	{		if(strcasecmp(kb->key, key) == 0)		{			if(kb->modifier == modifier) return(kb->action);			tmp = kb;		}	}	if(tmp && tmp->modifier == 0) return(tmp->action);	return NULL;}static action *find_action_by_name(char *action){	int i;	for(i = 0; actions[i].name; i++)	{		if(strcasecmp(action, actions[i].name) == 0)			return &actions[i];	}	return NULL;}static action *find_action_by_cmd(cmd_type cmd){	int i;	for(i = 0; actions[i].name; i++)	{		if(actions[i].cmd == cmd) return(&actions[i]);	}	return NULL;}static int find_action_no(action *act){	int i;	for(i = 0; actions[i].name; i++)	{		if(act == &actions[i]) return(i);	}	return 0;}int key_add(action *act, char *key, int modifier){	char *buf[3];	binding *kb;	int row;	kb = malloc(sizeof(binding));	memset(kb, 0, sizeof(binding));	kb->action = act;	kb->key = key;	kb->modifier = modifier;	if(!bindings) bindings = kb;	if(last_binding)	{		last_binding->next = kb;		kb->prev = last_binding;	}	last_binding = kb;	buf[0] = act->label;	buf[1] = strdup(key_name(key, modifier));	row = gtk_clist_append(GTK_CLIST(clist_wid), buf);	gtk_clist_set_row_data(GTK_CLIST(clist_wid), row, (gpointer)kb);	gtk_clist_columns_autosize(GTK_CLIST(clist_wid));	return row;}void key_remove(binding *kb){	gtk_clist_remove(GTK_CLIST(clist_wid), gtk_clist_find_row_from_data(GTK_CLIST(clist_wid), (gpointer)kb));	if(bindings == kb) bindings = kb->next;	if(last_binding == kb) last_binding = kb->prev;	if(kb->prev) kb->prev->next = kb->next;	if(kb->next) kb->next->prev = kb->prev;	free(kb);}static void clear_keys(void){	binding *t, *t2;	for(t = bindings; t; t = t2)	{		t2 = t->next;		key_remove(t);	}}static void reset_keys(void){	int i;	gtk_clist_freeze(GTK_CLIST(clist_wid));	clear_keys();	for(i = 0; defkeys[i].cmd != CMD_NONE; i++)	{		key_add(find_action_by_cmd(defkeys[i].cmd), defkeys[i].key, defkeys[i].modifier);	}	gtk_clist_thaw(GTK_CLIST(clist_wid));	gtk_clist_select_row(GTK_CLIST(clist_wid), 0, 0);}static int load_keys(void){	action *act;	char *key;	int modifier;	char *fname;	iks *x, *y;	fname = g_strconcat(g_get_home_dir(), "/.xine/keys.xml", NULL);	x = iks_load(fname);	g_free(fname);	if(!x || iks_strcmp(iks_name(x), "skb") != 0) return(0);	for(y = iks_child(x); y; y = iks_next(y))	{		if(iks_type(y) == IKS_TAG && iks_strcmp(iks_name(y), "binding") == 0)		{			act = find_action_by_name(iks_find_attrib(y, "action"));			key = iks_strdup(iks_find_cdata(y, "key"));			modifier = 0;			if(iks_find(y, "shift")) modifier += MOD_SHIFT;			if(iks_find(y, "control")) modifier += MOD_CONTROL;			if(iks_find(y, "alt")) modifier += MOD_ALT;			key_add(act, key, modifier);		}	}	iks_delete(x);	return 1;}static void save_keys(void){	char *fname;	iks *x, *y;	binding *kb;	fname = g_strconcat(g_get_home_dir(), "/.xine/keys.xml", NULL);	x = iks_new("skb");	iks_insert_cdata(x, "\n", 1);	for(kb = bindings; kb; kb = kb->next)	{		y = iks_insert(x, "binding");		iks_insert_attrib(y, "action", kb->action->name);		iks_insert_cdata(y, "\n\t", 2);		iks_insert_cdata(iks_insert(y, "key"), kb->key, -1);		if(kb->modifier)		{			iks_insert_cdata(y, "\n\t", 2);			if(kb->modifier & MOD_SHIFT) iks_insert(y, "shift");			if(kb->modifier & MOD_CONTROL) iks_insert(y, "control");			if(kb->modifier & MOD_ALT) iks_insert(y, "alt");			iks_insert_cdata(y, "\n", 1);		}		else		{			iks_insert_cdata(y, "\n", 1);		}		iks_insert_cdata(x, "\n", 1);	}	iks_save(fname, x);	iks_delete(x);	g_free(fname);	gtk_widget_hide(key_win);}static char *key_name(char *key, int modifier){	static char buf[256];	char *t;	buf[0] = '\0';	t = buf;	if(modifier & MOD_ALT)	{		memcpy(t, "Alt ", 4);		t += 4;	}	if(modifier & MOD_CONTROL)	{		memcpy(t, "Control ", 8);		t += 8;	}	if(modifier & MOD_SHIFT)	{		memcpy(t, "Shift ", 6);		t += 6;	}	strcpy(t, key);	return buf;}static void cb_add_binding(void){	int row;	row = key_add(&actions[0], "", 0);	gtk_clist_select_row(GTK_CLIST(clist_wid), row, 0);	gtk_clist_moveto(GTK_CLIST(clist_wid), row, -1, 1.0, 0);}

⌨️ 快捷键说明

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