📄 bindings.c
字号:
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <sys/time.h>#include <ogle/dvdcontrol.h>#include <ogle/msgevents.h>#include <X11/Xlib.h>#include <X11/Xutil.h>#include "debug_print.h"#include "bindings.h"extern DVDNav_t *nav;extern int bookmarks_autosave;int prevpg_timeout = 1;int digit_timeout = 0;int number_timeout = 0;int default_skip_seconds = 15;int skip_seconds = 15;static int fs = 0;static int isPaused = 0;static double speed = 1.0;struct action_number{ int valid; int32_t nr; struct timeval timestamp;};static struct action_number user_nr = { 0, 0 };void actionUpperButtonSelect(void *data){ DVDUpperButtonSelect(nav); }void actionLowerButtonSelect(void *data){ DVDLowerButtonSelect(nav);}void actionLeftButtonSelect(void *data){ DVDLeftButtonSelect(nav);}void actionRightButtonSelect(void *data){ DVDRightButtonSelect(nav);}void actionButtonActivate(void *data){ struct action_number *user = (struct action_number *)data; if(user != NULL && user->valid && (user->nr >= 0)) { DVDButtonSelectAndActivate(nav, user->nr); } else { DVDButtonActivate(nav); } if(user != NULL) { user->valid = 0; }}void actionMenuCallTitle(void *data){ DVDMenuCall(nav, DVD_MENU_Title);}void actionMenuCallRoot(void *data){ DVDMenuCall(nav, DVD_MENU_Root);}void actionMenuCallSubpicture(void *data){ DVDMenuCall(nav, DVD_MENU_Subpicture);}void actionMenuCallAudio(void *data){ DVDMenuCall(nav, DVD_MENU_Audio);}void actionMenuCallAngle(void *data){ DVDMenuCall(nav, DVD_MENU_Angle);}void actionMenuCallPTT(void *data){ DVDMenuCall(nav, DVD_MENU_Part);}void actionResume(void *data){ DVDResume(nav);}void actionPauseToggle(void *data){ if(isPaused) { DVDPauseOff(nav); isPaused = 0; } else { DVDPauseOn(nav); isPaused = 1; } }void actionPauseOn(void *data){ DVDPauseOn(nav); isPaused = 1;}void actionPauseOff(void *data){ DVDPauseOff(nav); isPaused = 0;}void actionSubpictureToggle(void *data){ DVDResult_t res; int spu_nr; DVDStream_t spu_this; DVDBool_t spu_shown; res = DVDGetCurrentSubpicture(nav, &spu_nr, &spu_this, &spu_shown); if(res != DVD_E_Ok) { return; } if(spu_shown == DVDTrue) { DVDSetSubpictureState(nav, DVDFalse); } else { DVDSetSubpictureState(nav, DVDTrue); }}struct timeval pg_timestamp = {0, 0};void actionNextPG(void *data){ struct timeval curtime; gettimeofday(&curtime, NULL); pg_timestamp = curtime; DVDNextPGSearch(nav);}void actionPrevPG(void *data){ struct timeval curtime; long diff; gettimeofday(&curtime, NULL); diff = curtime.tv_sec - pg_timestamp.tv_sec; pg_timestamp = curtime; if((prevpg_timeout && (diff > prevpg_timeout))) { DVDTopPGSearch(nav); } else { DVDPrevPGSearch(nav); }}void autosave_bookmark(void){ DVDBookmark_t *bm; unsigned char id[16]; char volid[33]; int volid_type; char *state = NULL; int n; if(bookmarks_autosave) { if(DVDGetDiscID(nav, id) != DVD_E_Ok) { NOTE("%s", "GetDiscID failed\n"); return; } if(DVDGetVolumeIdentifiers(nav, 0, &volid_type, volid, NULL) != DVD_E_Ok) { DNOTE("%s", "GetVolumeIdentifiers failed\n"); volid_type = 0; } if(DVDGetState(nav, &state) == DVD_E_Ok) { if((bm = DVDBookmarkOpen(id, NULL, 1)) == NULL) { if(errno != ENOENT) { NOTE("%s", "BookmarkOpen failed: "); perror(""); } free(state); return; } n = DVDBookmarkGetNr(bm); if(n == -1) { NOTE("%s", "DVDBookmarkGetNr failed\n"); } else if(n > 0) { for(n--; n >= 0; n--) { char *appinfo; if(DVDBookmarkGet(bm, n, NULL, NULL, "common", &appinfo) != -1) { if(appinfo) { if(!strcmp(appinfo, "autobookmark")) { if(DVDBookmarkRemove(bm, n) == -1) { NOTE("%s", "DVDBookmarkRemove failed\n"); } } free(appinfo); } } else { NOTE("%s", "DVDBookmarkGet failed\n"); } } } if(DVDBookmarkAdd(bm, state, NULL, "common", "autobookmark") == -1) { DNOTE("%s", "BookmarkAdd failed\n"); DVDBookmarkClose(bm); free(state); return; } free(state); if(volid_type != 0) { char *disccomment = NULL; if(DVDBookmarkGetDiscComment(bm, &disccomment) != -1) { if((disccomment == NULL) || (disccomment[0] == '\0')) { if(DVDBookmarkSetDiscComment(bm, volid) == -1) { DNOTE("%s", "SetDiscComment failed\n"); } } if(disccomment) { free(disccomment); } } } if(DVDBookmarkSave(bm, 0) == -1) { NOTE("%s", "BookmarkSave failed\n"); } DVDBookmarkClose(bm); } }}void actionQuit(void *data){ DVDResult_t res; autosave_bookmark(); res = DVDCloseNav(nav); if(res != DVD_E_Ok ) { DVDPerror("DVDCloseNav", res); } exit(0);}void actionFullScreenToggle(void *data){ fs = !fs; if(fs) { DVDSetZoomMode(nav, ZoomModeFullScreen); } else { DVDSetZoomMode(nav, ZoomModeResizeAllowed); }}void actionForwardScan(void *data){ DVDForwardScan(nav, 1.0);}void actionPlay(void *data){ if(isPaused) { isPaused = 0; DVDPauseOff(nav); } speed = 1.0; DVDForwardScan(nav, speed);}void actionFastForward(void *data){ if(isPaused) { isPaused = 0; DVDPauseOff(nav); } if((speed >= 1.0) && (speed < 8.0)) { speed +=0.5; } else if(speed < 1.0) { speed = 1.5; } DVDForwardScan(nav, speed);}void actionSlowForward(void *data){ if(isPaused) { isPaused = 0; DVDPauseOff(nav); } if(speed > 1.0) { speed = 0.5; } else if((speed > 0.1) && (speed <= 1.0)) { speed /= 2.0; } DVDForwardScan(nav, speed);}void actionFaster(void *data){ if(isPaused) { isPaused = 0; DVDPauseOff(nav); } if((speed >= 1.0) && (speed < 8.0)) { speed += 0.5; } else if(speed < 1.0) { speed *= 2.0; } DVDForwardScan(nav, speed);}void actionSlower(void *data){ if(isPaused) { isPaused = 0; DVDPauseOff(nav); } if(speed > 1.0) { speed -= 0.5; } else if((speed > 0.1) && (speed <= 1.0)) { speed /= 2.0; } DVDForwardScan(nav, speed);}void actionBookmarkAdd(void *data){ DVDBookmark_t *bm; unsigned char id[16]; char *state = NULL; char volid[33]; int volid_type; char *disccomment = NULL; if(DVDGetDiscID(nav, id) != DVD_E_Ok) { NOTE("%s", "GetDiscID failed\n"); return; } if(DVDGetVolumeIdentifiers(nav, 0, &volid_type, volid, NULL) != DVD_E_Ok) { DNOTE("%s", "GetVolumeIdentifiers failed\n"); volid_type = 0; } if(DVDGetState(nav, &state) == DVD_E_Ok) { if((bm = DVDBookmarkOpen(id, NULL, 1)) == NULL) { if(errno != ENOENT) { NOTE("%s", "BookmarkOpen failed: "); perror(""); } free(state); return; } if(DVDBookmarkAdd(bm, state, NULL, NULL, NULL) == -1) { DNOTE("%s", "BookmarkAdd failed\n"); DVDBookmarkClose(bm); free(state); return; } free(state); if(volid_type != 0) { if(DVDBookmarkGetDiscComment(bm, &disccomment) != -1) { if((disccomment == NULL) || (disccomment[0] == '\0')) { if(DVDBookmarkSetDiscComment(bm, volid) == -1) { DNOTE("%s", "SetDiscComment failed\n"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -