📄 osd_parser.c
字号:
path[MAX_FILE_PATH-1] = '\0'; i_len = strlen(&path[0]); if( i_len == MAX_FILE_PATH ) i_len--; /* truncate to prevent buffer overflow */#if defined(WIN32) || defined(UNDER_CE) if( (i_len > 0) && path[i_len] != '\\' ) path[i_len] = '\\';#else if( (i_len > 0) && path[i_len] != '/' ) path[i_len] = '/';#endif path[i_len+1] = '\0'; if( result == 0 || result == EOF ) goto error; msg_Dbg( p_this, "%s=%s", &action[0], &path[0] ); if( i_len == 0 ) *p_menu = osd_MenuNew( *p_menu, NULL, 0, 0 ); else *p_menu = osd_MenuNew( *p_menu, &path[0], 0, 0 ); } if( !*p_menu ) goto error; /* read successive lines */ while( !feof( fd ) ) { osd_state_t *p_state_current = NULL; /* button state currently processed */ osd_state_t *p_state_prev = NULL; /* previous state processed button */ char cmd[25] = ""; char action[25] = ""; char state[25] = ""; char file[256] = ""; char path[512] = ""; int i_x = 0; int i_y = 0; result = fscanf( fd, "%24s %24s (%d,%d)", &cmd[0], &action[0], &i_x, &i_y ); if( result == 0 ) goto error; if( strncmp( &cmd[0], "action", 6 ) != 0 ) break; msg_Dbg( p_this, " + %s hotkey=%s (%d,%d)", &cmd[0], &action[0], i_x, i_y ); p_prev = p_current; p_current = osd_ButtonNew( &action[0], i_x, i_y ); if( !p_current ) goto error; if( p_prev ) p_prev->p_next = p_current; else (*p_menu)->p_button = p_current; p_current->p_prev = p_prev; /* parse all states */ while( !feof( fd ) ) { char type[25] = ""; result = fscanf( fd, "\t%24s", &state[0] ); if( result == 0 ) goto error; /* FIXME: We only parse one level deep now */ if( strncmp( &state[0], "action", 6 ) == 0 ) { osd_button_t *p_up = NULL; result = fscanf( fd, "%24s (%d,%d)", &action[0], &i_x, &i_y ); if( result == 0 ) goto error; /* create new button */ p_up = osd_ButtonNew( &action[0], i_x, i_y ); if( !p_up ) goto error; /* Link to list */ p_up->p_down = p_current; p_current->p_up = p_up; msg_Dbg( p_this, " + (menu up) hotkey=%s (%d,%d)", &action[0], i_x, i_y ); /* Parse type state */ result = fscanf( fd, "\t%24s %24s", &cmd[0], &type[0] ); if( result == 0 ) goto error; if( strncmp( &cmd[0], "type", 4 ) == 0 ) { if( strncmp( &type[0], "volume", 6 ) == 0 ) { (*p_menu)->p_state->p_volume = p_up; msg_Dbg( p_this, " + type=%s", &type[0] ); } } /* Parse range state */ result = fscanf( fd, "\t%24s", &state[0] ); if( result == 0 ) goto error; /* Parse the range state */ if( strncmp( &state[0], "range", 5 ) == 0 ) { osd_state_t *p_range_current = NULL; /* range state currently processed */ osd_state_t *p_range_prev = NULL; /* previous state processed range */ int i_index = 0; p_up->b_range = VLC_TRUE; result = fscanf( fd, "\t%24s", &action[0] ); if( result == 0 ) goto error; result = fscanf( fd, "\t%d", &i_index ); if( result == 0 ) goto error; msg_Dbg( p_this, " + (menu up) hotkey down %s, file=%s%s", &action[0], (*p_menu)->psz_path, &file[0] ); if( p_up->psz_action_down ) free( p_up->psz_action_down ); p_up->psz_action_down = strdup( &action[0] ); /* Parse range contstruction : * range <hotkey> * <state1> <file1> * * <stateN> <fileN> * end */ while( !feof( fd ) ) { result = fscanf( fd, "\t%255s", &file[0] ); if( result == 0 ) goto error; if( strncmp( &file[0], "end", 3 ) == 0 ) break; p_range_prev = p_range_current; if( (*p_menu)->psz_path ) { size_t i_path_size = strlen( (*p_menu)->psz_path ); size_t i_file_size = strlen( &file[0] ); strncpy( &path[0], (*p_menu)->psz_path, i_path_size ); strncpy( &path[i_path_size], &file[0], 512 - (i_path_size + i_file_size) ); path[ i_path_size + i_file_size ] = '\0'; p_range_current = osd_StateNew( p_this, &path[0], "pressed" ); } else /* absolute paths are used. */ p_range_current = osd_StateNew( p_this, &file[0], "pressed" ); if( !p_range_current || !p_range_current->p_pic ) goto error; /* increment the number of ranges for this button */ p_up->i_ranges++; if( p_range_prev ) p_range_prev->p_next = p_range_current; else p_up->p_states = p_range_current; p_range_current->p_prev = p_range_prev; msg_Dbg( p_this, " |- range=%d, file=%s%s", p_up->i_ranges, (*p_menu)->psz_path, &file[0] ); } if( i_index > 0 ) { osd_state_t *p_range = NULL; /* Find the default index for state range */ p_range = p_up->p_states; while( (--i_index > 0) && p_range->p_next ) { osd_state_t *p_temp = NULL; p_temp = p_range->p_next; p_range = p_temp; } p_up->p_current_state = p_range; } else p_up->p_current_state = p_up->p_states; } result = fscanf( fd, "\t%24s", &state[0] ); if( result == 0 ) goto error; if( strncmp( &state[0], "end", 3 ) != 0 ) goto error; /* Continue at the beginning of the while() */ continue; } /* Parse the range state */ if( strncmp( &state[0], "range", 5 ) == 0 ) { osd_state_t *p_range_current = NULL; /* range state currently processed */ osd_state_t *p_range_prev = NULL; /* previous state processed range */ int i_index = 0; p_current->b_range = VLC_TRUE; result = fscanf( fd, "\t%24s", &action[0] ); if( result == 0 ) goto error; result = fscanf( fd, "\t%d", &i_index ); if( result == 0 ) goto error; msg_Dbg( p_this, " + hotkey down %s, file=%s%s", &action[0], (*p_menu)->psz_path, &file[0] ); if( p_current->psz_action_down ) free( p_current->psz_action_down ); p_current->psz_action_down = strdup( &action[0] ); /* Parse range contstruction : * range <hotkey> * <state1> <file1> * * <stateN> <fileN> * end */ while( !feof( fd ) ) { result = fscanf( fd, "\t%255s", &file[0] ); if( result == 0 ) goto error; if( strncmp( &file[0], "end", 3 ) == 0 ) break; p_range_prev = p_range_current; if( (*p_menu)->psz_path ) { size_t i_path_size = strlen( (*p_menu)->psz_path ); size_t i_file_size = strlen( &file[0] ); strncpy( &path[0], (*p_menu)->psz_path, i_path_size ); strncpy( &path[i_path_size], &file[0], 512 - (i_path_size + i_file_size) ); path[ i_path_size + i_file_size ] = '\0'; p_range_current = osd_StateNew( p_this, &path[0], "pressed" ); } else /* absolute paths are used. */ p_range_current = osd_StateNew( p_this, &file[0], "pressed" ); if( !p_range_current || !p_range_current->p_pic ) goto error; /* increment the number of ranges for this button */ p_current->i_ranges++; if( p_range_prev ) p_range_prev->p_next = p_range_current; else p_current->p_states = p_range_current; p_range_current->p_prev = p_range_prev; msg_Dbg( p_this, " |- range=%d, file=%s%s", p_current->i_ranges, (*p_menu)->psz_path, &file[0] ); } if( i_index > 0 ) { osd_state_t *p_range = NULL; /* Find the default index for state range */ p_range = p_current->p_states; while( (--i_index > 0) && p_range->p_next ) { osd_state_t *p_temp = NULL; p_temp = p_range->p_next; p_range = p_temp; } p_current->p_current_state = p_range; } else p_current->p_current_state = p_current->p_states; /* Continue at the beginning of the while() */ continue; } if( strncmp( &state[0], "end", 3 ) == 0 ) break; result = fscanf( fd, "\t%255s", &file[0] ); if( result == 0 ) goto error; p_state_prev = p_state_current; if( ( strncmp( ppsz_button_states[0], &state[0], strlen(ppsz_button_states[0]) ) != 0 ) && ( strncmp( ppsz_button_states[1], &state[0], strlen(ppsz_button_states[1]) ) != 0 ) && ( strncmp( ppsz_button_states[2], &state[0], strlen(ppsz_button_states[2]) ) != 0 ) ) { msg_Err( p_this, "invalid button state %s for button %s expected %d: unselect, select or pressed)", &state[0], &action[0], strlen(&state[0])); goto error; } if( (*p_menu)->psz_path ) { size_t i_path_size = strlen( (*p_menu)->psz_path ); size_t i_file_size = strlen( &file[0] ); strncpy( &path[0], (*p_menu)->psz_path, i_path_size ); strncpy( &path[i_path_size], &file[0], 512 - (i_path_size + i_file_size) ); path[ i_path_size + i_file_size ] = '\0'; p_state_current = osd_StateNew( p_this, &path[0], &state[0] ); } else /* absolute paths are used. */ p_state_current = osd_StateNew( p_this, &file[0], &state[0] ); if( !p_state_current || !p_state_current->p_pic ) goto error; if( p_state_prev ) p_state_prev->p_next = p_state_current; else p_current->p_states = p_state_current; p_state_current->p_prev = p_state_prev; msg_Dbg( p_this, " |- state=%s, file=%s%s", &state[0], (*p_menu)->psz_path, &file[0] ); } p_current->p_current_state = p_current->p_states; } /* Find the last button and store its pointer. * The OSD menu behaves like a roundrobin list. */ p_current = (*p_menu)->p_button; while( p_current && p_current->p_next ) { osd_button_t *p_temp = NULL; p_temp = p_current->p_next; p_current = p_temp; } (*p_menu)->p_last_button = p_current; fclose( fd ); return 0;#undef MAX_FILE_PATHerror: msg_Err( p_this, "parsing file failed (returned %d)", result ); fclose( fd ); return 1;}/***************************************************************************** * osd_ConfigUnload: Load and parse osd text configurationfile *****************************************************************************/void osd_ConfigUnload( vlc_object_t *p_this, osd_menu_t **p_osd){ msg_Dbg( p_this, "unloading OSD menu structure" ); osd_MenuFree( p_this, *p_osd );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -