void prop_reorder_create(prop_t *dst, prop_t *src, int flags, const char *id) { prop_reorder_t *pr = calloc(1, sizeof(prop_reorder_t)); pr->pr_order = htsmsg_store_load(id); if(pr->pr_order == NULL) pr->pr_order = htsmsg_create_list(); pr->pr_store = strdup(id); pr->pr_dst = flags & PROP_REORDER_TAKE_DST_OWNERSHIP ? dst : prop_xref_addref(dst); hts_mutex_lock(&prop_mutex); pr->pr_srcsub = prop_subscribe(PROP_SUB_INTERNAL | PROP_SUB_DONTLOCK | PROP_SUB_TRACK_DESTROY, PROP_TAG_CALLBACK, src_cb, pr, PROP_TAG_ROOT, src, NULL); pr->pr_dstsub = prop_subscribe(PROP_SUB_INTERNAL | PROP_SUB_DONTLOCK | PROP_SUB_TRACK_DESTROY, PROP_TAG_CALLBACK, dst_cb, pr, PROP_TAG_ROOT, dst, NULL); hts_mutex_unlock(&prop_mutex); }
static void audio_mastervol_init(void) { htsmsg_t *m = htsmsg_store_load("audiomixer"); int32_t i32; prop_t *pa, *mv, *mm; pa = prop_create(prop_get_global(), "audio"); mv = prop_create(pa, "mastervolume"); mm = prop_create(pa, "mastermute"); prop_set_float_clipping_range(mv, -75, 12); if(m != NULL && !htsmsg_get_s32(m, "master-volume", &i32)) prop_set_float(mv, (float)i32 / 1000); prop_set_int(mm, 0); htsmsg_release(m); prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, PROP_TAG_CALLBACK_FLOAT, save_matervol, NULL, PROP_TAG_ROOT, mv, NULL); prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, PROP_TAG_SET_INT, &audio_master_mute, PROP_TAG_ROOT, mm, NULL); }
void usage_report_send(int stored) { if(gconf.device_id[0] == 0) return; htsmsg_t *m; if(stored) { m = htsmsg_store_load("usage"); if(m == NULL) return; htsmsg_store_remove("usage"); // Legacy cleanup, remove some day htsmsg_store_remove("usagecounters"); htsmsg_store_remove("plugincounters"); } else { hts_mutex_lock(&usage_mutex); m = make_usage_report(); hts_mutex_unlock(&usage_mutex); } hts_thread_create_detached("report", send_report, m, THREAD_PRIO_BGTASK); }
void bookmarks_init(void) { htsmsg_field_t *f; htsmsg_t *m, *n, *o; hts_mutex_init(&bookmark_mutex); bookmarks = prop_create(settings_add_dir(NULL, "Bookmarks", "bookmark", NULL), "model"); prop_set_int(prop_create(bookmarks, "mayadd"), 1); prop_subscribe(0, PROP_TAG_CALLBACK, bookmarks_callback, NULL, PROP_TAG_ROOT, prop_create(bookmarks, "nodes"), PROP_TAG_MUTEX, &bookmark_mutex, NULL); if((m = htsmsg_store_load("bookmarks")) != NULL) { n = htsmsg_get_map(m, "nodes"); HTSMSG_FOREACH(f, n) { if((o = htsmsg_get_map_by_field(f)) == NULL) continue; bookmark_load(o); } htsmsg_destroy(m); }
void audio_mastervol_init(void) { htsmsg_t *m = htsmsg_store_load("audiomixer"); int32_t i32; prop_t *prop_audio; prop_audio = prop_create(prop_get_global(), "audio"); prop_mastervol = prop_create(prop_audio, "mastervolume"); prop_mastermute = prop_create(prop_audio, "mastermute"); prop_set_float_clipping_range(prop_mastervol, -75, 0); prop_set_int(prop_mastermute, 0); if(m != NULL && !htsmsg_get_s32(m, "master-volume", &i32)) prop_set_float(prop_mastervol, (float)i32 / 1000); htsmsg_destroy(m); prop_subscribe(PROP_SUB_NO_INITIAL_UPDATE, PROP_TAG_CALLBACK_FLOAT, save_matervol, NULL, PROP_TAG_ROOT, prop_mastervol, NULL); }
void opensub_init(void) { prop_t *s; hts_mutex_init(&opensub_mutex); s = subtitle_settings_dir; settings_create_divider(s, _p("Settings for opensubtitles.org")); htsmsg_t *store = htsmsg_store_load("opensubtitles"); if(store == NULL) store = htsmsg_create_map(); settings_create_bool(s, "enable", _p("Use opensubtitles.org"), 0, store, set_enable, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"opensubtitles"); settings_create_string(s, "username", _p("Username"), NULL, store, set_username, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"opensubtitles"); settings_create_string(s, "password", _p("Password"), NULL, store, set_password, NULL, SETTINGS_INITIAL_UPDATE | SETTINGS_PASSWORD, NULL, settings_generic_save_settings, (void *)"opensubtitles"); }
void keyring_init(void) { hts_mutex_init(&keyring_mutex); if((persistent_keyring = htsmsg_store_load("keyring")) == NULL) persistent_keyring = htsmsg_create_map(); temporary_keyring = htsmsg_create_map(); }
void audio_init(void) { audio_fifo_init(&af0, 16000, 8000); htsmsg_t *m = htsmsg_store_load("audio/current"); if(m == NULL) m = htsmsg_create_map(); audio_mastervol_init(); audio_settings_root = settings_add_dir(NULL, _p("Audio output"), "sound", NULL, _p("Select audio output device and related configurations"), "settings:audio"); audio_settings_current_device = settings_create_multiopt(audio_settings_root, "currentdevice", _p("Current output device"), 0); TAILQ_INIT(&audio_modes); #ifdef CONFIG_LIBOGC audio_wii_init(); #endif #if PS3 audio_ps3_init(); #endif int have_pulse_audio __attribute__((unused)) = 0; #ifdef CONFIG_LIBPULSE have_pulse_audio |= audio_pa_init(); #endif #ifdef CONFIG_LIBASOUND audio_alsa_init(have_pulse_audio); #endif #ifdef CONFIG_COREAUDIO audio_coreaudio_init(); #endif audio_dummy_init(); settings_multiopt_initiate(audio_settings_current_device, audio_change_output_device, NULL, NULL, m, settings_generic_save_settings, (void *)"audio/current"); audio_run = 1; hts_thread_create_joinable("audio output", &audio_thread_id, audio_output_thread, NULL, THREAD_PRIO_HIGH); }
void keyring_init(void) { hts_mutex_init(&keyring_mutex); if((persistent_keyring = htsmsg_store_load("keyring")) == NULL) persistent_keyring = htsmsg_create_map(); temporary_keyring = htsmsg_create_map(); settings_create_action(settings_general, _p("Forget remembered passwords"), keyring_clear, NULL, NULL); }
void notifications_init(void) { hts_mutex_init(&news_mutex); prop_t *root = prop_create(prop_get_global(), "notifications"); if((dismissed_news_in = htsmsg_store_load("dismissed_news")) == NULL) dismissed_news_in = htsmsg_create_map(); dismissed_news_out = htsmsg_create_map(); notify_prop_entries = prop_create(root, "nodes"); }
void audio_init(void) { htsmsg_t *store = htsmsg_store_load("audio2"); if(store == NULL) store = htsmsg_create_map(); prop_t *asettings = settings_add_dir(NULL, _p("Audio settings"), NULL, NULL, _p("Setup audio output"), "settings:audio"); audio_mastervol_init(); audio_class = audio_driver_init(asettings, store); settings_create_separator(asettings, _p("Audio settings during video playback")); gconf.setting_av_volume = setting_create(SETTING_INT, asettings, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Audio gain adjustment during video playback")), SETTING_RANGE(-12, 12), SETTING_UNIT_CSTR("dB"), SETTING_HTSMSG("videovolume", store, "audio2"), SETTING_VALUE_ORIGIN("global"), NULL); gconf.setting_av_sync = setting_create(SETTING_INT, asettings, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Audio delay")), SETTING_RANGE(-5000, 5000), SETTING_STEP(50), SETTING_UNIT_CSTR("ms"), SETTING_HTSMSG("avdelta", store, "audio2"), SETTING_VALUE_ORIGIN("global"), NULL); #if CONFIG_AUDIOTEST audio_test_init(asettings); #endif }
void audio_mode_register(audio_mode_t *am) { prop_t *r; htsmsg_t *m; TAILQ_INSERT_TAIL(&audio_modes, am, am_link); settings_multiopt_add_opt_cstr(audio_settings_current_device, am->am_id, am->am_title, 0); m = htsmsg_store_load("audio/devices/%s", am->am_id); r = settings_add_dir_cstr(audio_settings_root, am->am_title, "sound", NULL, am->am_description, NULL); settings_create_int(r, "delay", _p("Audio/Video sync delay"), 0, m, -1000, 1000, 10, am_set_av_sync, am, SETTINGS_INITIAL_UPDATE, "ms", NULL, NULL, NULL); if(am->am_multich_controls) { settings_create_bool(r, "phantom_center", _p("Phantom center"), 0, m, am_set_phantom_center, am, SETTINGS_INITIAL_UPDATE, NULL, NULL, NULL); settings_create_bool(r, "phantom_lfe", _p("Phantom LFE"), 0, m, am_set_phantom_lfe, am, SETTINGS_INITIAL_UPDATE, NULL, NULL, NULL); settings_create_bool(r, "small_front", _p("Small front speakers"), 0, m, am_set_small_front, am, SETTINGS_INITIAL_UPDATE, NULL, NULL, NULL); settings_create_bool(r, "force_downmix", _p("Force stereo downmix"), 0, m, am_set_force_downmix, am, SETTINGS_INITIAL_UPDATE, NULL, NULL, NULL); settings_create_bool(r, "swap_surround", _p("Swap LFE+center with surround"), 0, m, am_set_swap_surround, am, SETTINGS_INITIAL_UPDATE, NULL, NULL, NULL); } if(m != NULL) htsmsg_destroy(m); }
static void init_dev_settings(void) { htsmsg_t *store; if((store = htsmsg_store_load("dev")) == NULL) store = htsmsg_create_map(); settings_dev = settings_add_dir(prop_create_root(NULL), _p("Developer settings"), NULL, NULL, _p("Settings useful for developers"), "settings:dev"); prop_t *r = setting_add(settings_dev, NULL, "info", 0); prop_set_string(prop_create(r, "description"), "Settings for developers. If you don't know what this is, don't touch it"); prop_t *t; t = prop_create_root(NULL); prop_set_string(t, "Enable binrelpace"); settings_create_bool(settings_dev, "binreplace", t, 0, store, settings_generic_set_bool, &gconf.enable_bin_replace, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); t = prop_create_root(NULL); prop_set_string(t, "Enable omnigrade"); settings_create_bool(settings_dev, "omnigrade", t, 0, store, settings_generic_set_bool, &gconf.enable_omnigrade, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); }
static void init_autostandby(void) { htsmsg_t *store = htsmsg_store_load("runcontrol"); if(store == NULL) store = htsmsg_create_map(); settings_create_int(settings_general, "autostandby", _p("Automatic standby"), 0, store, 0, 60, 5, set_autostandby, NULL, SETTINGS_INITIAL_UPDATE, " min", NULL, runcontrol_save_settings, NULL); last_activity = showtime_get_ts(); prop_subscribe(0, PROP_TAG_NAME("global", "media", "current", "playstatus"), PROP_TAG_CALLBACK_STRING, current_media_playstatus, NULL, NULL); callout_arm(&autostandby_timer, check_autostandby, NULL, 1); }
void notifications_init(void) { hts_mutex_init(&news_mutex); prop_t *root = prop_create(prop_get_global(), "notifications"); if((dismissed_news_in = htsmsg_store_load("dismissed_news")) == NULL) dismissed_news_in = htsmsg_create_map(); dismissed_news_out = htsmsg_create_map(); notify_prop_entries = prop_create(root, "nodes"); #if ENABLE_WEBPOPUP prop_t *dir = setting_get_dir("general:misc"); setting_create(SETTING_BOOL, dir, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Show news on home screen")), SETTING_VALUE(1), SETTING_WRITE_BOOL(&shownews), SETTING_STORE("notifications", "shownews"), NULL); #endif }
void glw_settings_init(void) { glw_settings.gs_settings_store = htsmsg_store_load("glw"); if(glw_settings.gs_settings_store == NULL) glw_settings.gs_settings_store = htsmsg_create_map(); glw_settings.gs_settings = prop_create_root(NULL); prop_concat_add_source(gconf.settings_look_and_feel, prop_create(glw_settings.gs_settings, "nodes"), NULL); prop_t *s = glw_settings.gs_settings; htsmsg_t *store = glw_settings.gs_settings_store; glw_settings.gs_setting_size = setting_create(SETTING_INT, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Font and icon size")), SETTING_RANGE(-10, 30), SETTING_UNIT_CSTR("px"), SETTING_WRITE_INT(&glw_settings.gs_size), SETTING_HTSMSG("size", store, "glw"), NULL); glw_settings.gs_setting_underscan_h = setting_create(SETTING_INT, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Horizontal underscan")), SETTING_RANGE(-100, 100), SETTING_UNIT_CSTR("px"), SETTING_WRITE_INT(&glw_settings.gs_underscan_h), SETTING_HTSMSG("underscan_h", store, "glw"), NULL); glw_settings.gs_setting_underscan_v = setting_create(SETTING_INT, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Vertical underscan")), SETTING_RANGE(-100, 100), SETTING_UNIT_CSTR("px"), SETTING_WRITE_INT(&glw_settings.gs_underscan_v), SETTING_HTSMSG("underscan_v", store, "glw"), NULL); glw_settings.gs_setting_screensaver = setting_create(SETTING_INT, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Screensaver delay")), SETTING_VALUE(10), SETTING_RANGE(0, 60), SETTING_ZERO_TEXT(_p("Off")), SETTING_UNIT_CSTR("min"), SETTING_WRITE_INT(&glw_settings.gs_screensaver_delay), SETTING_HTSMSG("screensaver", store, "glw"), NULL); glw_settings.gs_setting_wrap = setting_create(SETTING_BOOL, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Wrap when reaching beginning/end of lists")), SETTING_VALUE(1), SETTING_WRITE_BOOL(&glw_settings.gs_wrap), SETTING_HTSMSG("wrap", store, "glw"), NULL); prop_t *p = prop_create(prop_get_global(), "glw"); p = prop_create(p, "osk"); kv_prop_bind_create(p, "showtime:glw:osk"); }
void i18n_init(void) { prop_t *s = settings_add_dir(NULL, _p("Languages"), NULL, NULL, _p("Preferred languages")); setting_t *x; int i; htsmsg_t *store = htsmsg_store_load("i18n"); if(store == NULL) store = htsmsg_create_map(); nls_init(s, store); settings_create_info(s, NULL, _p("Language codes should be configured as three character ISO codes, example (eng, swe, fra)")); settings_create_string(s, "audio1", _p("Primary audio language code"), NULL, store, set_lang, &lang_audio[0], SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"i18n"); settings_create_string(s, "audio2", _p("Secondary audio language code"), NULL, store, set_lang, &lang_audio[1], SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"i18n"); settings_create_string(s, "audio3", _p("Tertiary audio language code"), NULL, store, set_lang, &lang_audio[2], SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"i18n"); settings_create_string(s, "subtitle1", _p("Primary subtitle language code"), NULL, store, set_lang, &lang_subtitle[0], SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"i18n"); settings_create_string(s, "subtitle2", _p("Secondary subtitle language code"), NULL, store, set_lang, &lang_subtitle[1], SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"i18n"); settings_create_string(s, "subtitle3", _p("Tertiary subtitle language code"), NULL, store, set_lang, &lang_subtitle[2], SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"i18n"); x = settings_create_multiopt(s, "srt_charset", _p("SRT character set")); const charset_t *cs; for(i = 0; (cs = charset_get_idx(i)) != NULL; i++) settings_multiopt_add_opt_cstr(x, cs->id, cs->title, i == 0); settings_multiopt_initiate(x, set_srt_charset, NULL, NULL, store, settings_generic_save_settings, (void *)"i18n"); }
void video_settings_init(void) { htsmsg_t *store; prop_t *s; setting_t *x; s = settings_add_dir(NULL, _p("Video playback"), "video", NULL, _p("Video acceleration and display behaviour"), NULL); if((store = htsmsg_store_load("videoplayback")) == NULL) store = htsmsg_create_map(); #if ENABLE_VDPAU settings_create_bool(s, "vdpau", _p("Enable VDPAU"), 1, store, set_vdpau, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"videoplayback"); x = settings_create_multiopt(s, "vdpau_deinterlace", _p("Preferred VDPAU deinterlacer method"), 0); settings_multiopt_add_opt(x, "2", _p("Temporal/Spatial"), 1); settings_multiopt_add_opt(x, "1", _p("Temporal"), 0); settings_multiopt_add_opt(x, "0", _p("Off"), 0); settings_multiopt_initiate(x, set_vdpau_deinterlace, NULL, NULL, store, settings_generic_save_settings, (void *)"videoplayback"); x = settings_create_multiopt(s, "vdpau_deinterlace_resolution_limit", _p("Maximum resolution for deinterlacer"), 0); settings_multiopt_add_opt(x, "576", _p("576"), 0); settings_multiopt_add_opt(x, "720", _p("720"), 0); settings_multiopt_add_opt(x, "1080", _p("1080"), 0); settings_multiopt_add_opt(x, "0", _p("No limit"), 1); settings_multiopt_initiate(x, set_vdpau_deinterlace_resolution_limit, NULL, NULL, store, settings_generic_save_settings, (void *)"videoplayback"); #endif #if ENABLE_VDA settings_create_bool(s, "vda", _p("Enable VDA"), 1, store, set_vda, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"videoplayback"); #endif settings_create_bool(s, "stretch_horizontal", _p("Stretch video to widescreen"), 0, store, set_stretch_horizontal, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"videoplayback"); settings_create_bool(s, "stretch_fullscreen", _p("Stretch video to fullscreen"), 0, store, set_stretch_fullscreen, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"videoplayback"); settings_create_int(s, "vzoom", _p("Video zoom"), 100, store, 50, 200, 1, set_vzoom, NULL, SETTINGS_INITIAL_UPDATE, "%", NULL, settings_generic_save_settings, (void *)"videoplayback"); video_settings.resume_mode = 1; x = settings_create_multiopt(s, "resumemode", _p("Resume video playback"), 0); settings_multiopt_add_opt(x, "1", _p("Yes"), 1); settings_multiopt_add_opt(x, "0", _p("No"), 0); settings_multiopt_initiate(x, set_video_resumemode, NULL, NULL, store, settings_generic_save_settings, (void *)"videoplayback"); settings_create_int(s, "played_threshold", _p("Count video as played when reaching"), 90, store, 1, 100, 1, set_played_threshold, NULL, SETTINGS_INITIAL_UPDATE, "%", NULL, settings_generic_save_settings, (void *)"videoplayback"); settings_create_bool(s, "continuous_playback", _p("Automatically play next video in list"), 0, store, set_continuous_playback, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"videoplayback"); //---------------------------------------------------------- s = settings_add_dir(NULL, _p("Subtitles"), "subtitle", NULL, _p("Generic settings for video subtitles"), NULL); subtitle_settings_dir = s; if((store = htsmsg_store_load("subtitles")) == NULL) store = htsmsg_create_map(); settings_create_bool(s, "allsubsindir", _p("Include all subtitle files from movie directory"), 0, store, set_subtitle_include_all_subs, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_bool(s, "alwaysselect", _p("Always try to select a subtitle"), 1, store, set_subtitle_always_select, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_divider(s, _p("Subtitle size and positioning")); settings_create_int(s, "scale", _p("Subtitle size"), 100, store, 30, 500, 5, set_subtitle_scale, NULL, SETTINGS_INITIAL_UPDATE, "%", NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_bool(s, "subonvideoframe", _p("Force subtitles to reside on video frame"), 0, store, set_subtitle_align_on_video, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); x = settings_create_multiopt(s, "align", _p("Subtitle position"), 0); settings_multiopt_add_opt(x, "2", _p("Center"), 1); settings_multiopt_add_opt(x, "1", _p("Left"), 0); settings_multiopt_add_opt(x, "3", _p("Right"), 0); settings_multiopt_add_opt(x, "0", _p("Auto"), 0); settings_multiopt_initiate(x,set_subtitle_alignment, NULL, NULL, store, settings_generic_save_settings, (void *)"subtitles"); settings_create_divider(s, _p("Subtitle styling")); settings_create_string(s, "color", _p("Color"), "FFFFFF", store, set_subtitle_color, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_string(s, "shadowcolor", _p("Shadow color"), "000000", store, set_subtitle_shadow_color, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_int(s, "shadowcolorsize", _p("Shadow offset"), 2, store, 0, 10, 1, set_subtitle_shadow_size, NULL, SETTINGS_INITIAL_UPDATE, "px", NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_string(s, "outlinecolor", _p("Outline color"), "000000", store, set_subtitle_outline_color, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_int(s, "shadowoutlinesize", _p("Outline size"), 1, store, 0, 4, 1, set_subtitle_outline_size, NULL, SETTINGS_INITIAL_UPDATE, "px", NULL, settings_generic_save_settings, (void *)"subtitles"); settings_create_bool(s, "styleoverride", _p("Ignore embedded styling"), 0, store, set_subtitle_style_override, NULL, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"subtitles"); }
void i18n_init(void) { prop_t *s = settings_add_dir(NULL, _p("Languages"), "i18n", NULL, _p("Preferred languages"), "settings:i18n"); int i; htsmsg_t *store = htsmsg_store_load("i18n"); if(store == NULL) store = htsmsg_create_map(); nls_init(s, store); #ifdef STOS setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Timezone")), SETTING_CALLBACK(set_timezone, NULL), SETTING_HTSMSG("timezone", store, "i18n"), NULL); #endif setting_create(SETTING_MULTIOPT, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Time format")), SETTING_HTSMSG("timeformat", store, "i18n"), SETTING_WRITE_INT(&gconf.time_format), SETTING_OPTION(gconf.time_format_system ? "0" : NULL, _p("System default")), SETTING_OPTION("1", _p("24 Hour")), SETTING_OPTION("2", _p("12 Hour")), NULL); settings_create_info(s, NULL, _p("Language codes should be configured as three character ISO codes, example (eng, swe, fra)")); setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Primary audio language code")), SETTING_CALLBACK(set_lang, &lang_audio[0]), SETTING_HTSMSG("audio1", store, "i18n"), NULL); setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Secondary audio language code")), SETTING_CALLBACK(set_lang, &lang_audio[1]), SETTING_HTSMSG("audio2", store, "i18n"), NULL); setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Tertiary audio language code")), SETTING_CALLBACK(set_lang, &lang_audio[2]), SETTING_HTSMSG("audio3", store, "i18n"), NULL); setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Primary subtitle language code")), SETTING_CALLBACK(&set_lang, &lang_subtitle[0]), SETTING_HTSMSG("subtitle1", store, "i18n"), NULL); setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Secondary subtitle language code")), SETTING_CALLBACK(&set_lang, &lang_subtitle[1]), SETTING_HTSMSG("subtitle2", store, "i18n"), NULL); setting_create(SETTING_STRING, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Tertiary subtitle language code")), SETTING_CALLBACK(&set_lang, &lang_subtitle[2]), SETTING_HTSMSG("subtitle3", store, "i18n"), NULL); const char **optlist = NULL; const charset_t *cs; for(i = 0; (cs = charset_get_idx(i)) != NULL; i++) {} optlist = alloca((i * 2 + 3) * sizeof(const char *)); optlist[0] = "auto"; optlist[1] = "Auto"; for(i = 0; (cs = charset_get_idx(i)) != NULL; i++) { optlist[i * 2 + 2] = cs->id; optlist[i * 2 + 3] = cs->title; } optlist[i * 2 + 2] = NULL; setting_create(SETTING_MULTIOPT, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Default character set")), SETTING_HTSMSG("default_charset", store, "i18n"), SETTING_CALLBACK(set_default_charset, NULL), SETTING_OPTION_LIST(optlist), NULL); setting_create(SETTING_BOOL, s, SETTINGS_INITIAL_UPDATE, SETTING_TITLE(_p("Ignore 'The' at beginning of words when sorting")), SETTING_HTSMSG("skipthe", store, "i18n"), SETTING_WRITE_BOOL(&gconf.ignore_the_prefix), NULL); }
static void glw_init_settings(glw_root_t *gr, const char *instance, const char *instance_title) { prop_t *r = gr->gr_uii.uii_prop; if(gr->gr_base_size == 0) gr->gr_base_size = 20; gr->gr_settings_instance = strdup(instance); gr->gr_settings_store = htsmsg_store_load("displays/%s", instance); if(gr->gr_settings_store == NULL) gr->gr_settings_store = htsmsg_create_map(); if(instance_title) { char title[256]; snprintf(title, sizeof(title), "Display and user interface on screen %s", instance_title); gr->gr_settings = settings_add_dir_cstr(NULL, title, "display", NULL, NULL); } else { gr->gr_settings = settings_add_dir(NULL, _p("Display and user interface"), "display", NULL, NULL); } gr->gr_prop_size = prop_create(r, "size"); gr->gr_prop_underscan_h = prop_create(r, "underscan_h"); gr->gr_prop_underscan_v = prop_create(r, "underscan_v"); gr->gr_setting_size = settings_create_int(gr->gr_settings, "size", _p("Userinterface size"), 0, gr->gr_settings_store, -10, 30, 1, glw_change_size, gr, SETTINGS_INITIAL_UPDATE, "px", gr->gr_courier, glw_settings_save, gr); gr->gr_setting_underscan_h = settings_create_int(gr->gr_settings, "underscan_h", _p("Horizontal underscan"), 0, gr->gr_settings_store, -100, +100, 1, glw_change_underscan_h, gr, SETTINGS_INITIAL_UPDATE, "px", gr->gr_courier, glw_settings_save, gr); gr->gr_setting_underscan_v = settings_create_int(gr->gr_settings, "underscan_v", _p("Vertical underscan"), 0, gr->gr_settings_store, -100, +100, 1, glw_change_underscan_v, gr, SETTINGS_INITIAL_UPDATE, "px", gr->gr_courier, glw_settings_save, gr); gr->gr_setting_screensaver = settings_create_int(gr->gr_settings, "screensaver", _p("Screensaver delay"), 10, gr->gr_settings_store, 1, 60, 1, glw_set_screensaver_delay, gr, SETTINGS_INITIAL_UPDATE, " min", gr->gr_courier, glw_settings_save, gr); gr->gr_pointer_visible = prop_create(r, "pointerVisible"); gr->gr_is_fullscreen = prop_create(r, "fullscreen"); gr->gr_screensaver_active = prop_create(r, "screensaverActive"); gr->gr_prop_width = prop_create(r, "width"); gr->gr_prop_height = prop_create(r, "height"); prop_set_int(gr->gr_screensaver_active, 0); }
static void init_dev_settings(void) { htsmsg_t *store; if((store = htsmsg_store_load("dev")) == NULL) store = htsmsg_create_map(); gconf.settings_dev = settings_add_dir(prop_create_root(NULL), _p("Developer settings"), NULL, NULL, _p("Settings useful for developers"), "settings:dev"); prop_t *r = setting_add(gconf.settings_dev, NULL, "info", 0); prop_set_string(prop_create(r, "description"), "Settings for developers. If you don't know what this is, don't touch it"); prop_t *t; t = prop_create_root(NULL); prop_set_string(t, "Experimental features (Use at own risk)"); settings_create_bool(gconf.settings_dev, "experimental", t, 0, store, settings_generic_set_bool, &gconf.enable_experimental, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); t = prop_create_root(NULL); prop_set_string(t, "Enable binrelpace"); settings_create_bool(gconf.settings_dev, "binreplace", t, 0, store, settings_generic_set_bool, &gconf.enable_bin_replace, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); t = prop_create_root(NULL); prop_set_string(t, "Enable omnigrade"); settings_create_bool(gconf.settings_dev, "omnigrade", t, 0, store, settings_generic_set_bool, &gconf.enable_omnigrade, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); t = prop_create_root(NULL); prop_set_string(t, "Debug all HTTP requests"); settings_create_bool(gconf.settings_dev, "httpdebug", t, 0, store, settings_generic_set_bool, &gconf.enable_http_debug, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); t = prop_create_root(NULL); prop_set_string(t, "Disable HTTP connection reuse"); settings_create_bool(gconf.settings_dev, "nohttpreuse", t, 0, store, settings_generic_set_bool, &gconf.disable_http_reuse, SETTINGS_INITIAL_UPDATE, NULL, settings_generic_save_settings, (void *)"dev"); }
void load_site_news(void) { #if ENABLE_WEBPOPUP struct http_header_list response_headers; buf_t *b; char errbuf[512]; b = fa_load("https://movian.tv/projects/movian/news.json", FA_LOAD_FLAGS(FA_DISABLE_AUTH | FA_COMPRESSION), FA_LOAD_RESPONSE_HEADERS(&response_headers), FA_LOAD_ERRBUF(errbuf, sizeof(errbuf)), NULL); if(b == NULL) { TRACE(TRACE_DEBUG, "News", "Unable to load news -- %s", errbuf); return; } const char *dateheader = http_header_get(&response_headers, "date"); if(dateheader == NULL) { buf_release(b); http_headers_free(&response_headers); return; } dateheader = mystrdupa(dateheader); http_headers_free(&response_headers); htsmsg_t *newsinfo = htsmsg_store_load("sitenews"); time_t no_news_before; if(newsinfo == NULL) newsinfo = htsmsg_create_map(); no_news_before = htsmsg_get_u32_or_default(newsinfo, "nothingbefore", 0); if(no_news_before == 0) { if(http_ctime(&no_news_before, dateheader)) { buf_release(b); htsmsg_release(newsinfo); return; } htsmsg_add_u32(newsinfo, "nothingbefore", no_news_before); htsmsg_store_save(newsinfo, "sitenews"); htsmsg_release(newsinfo); } htsmsg_t *doc = htsmsg_json_deserialize(buf_cstr(b)); buf_release(b); if(doc == NULL) { return; } hts_mutex_lock(&news_mutex); htsmsg_t *news = htsmsg_get_list(doc, "news"); if(news != NULL) { htsmsg_field_t *f; HTSMSG_FOREACH(f, news) { htsmsg_t *entry; if((entry = htsmsg_get_map_by_field(f)) == NULL) continue; const char *title = htsmsg_get_str(entry, "title"); const char *created_on = htsmsg_get_str(entry, "created_on"); int id = htsmsg_get_u32_or_default(entry, "id", 0); if(created_on == NULL || title == NULL || id == 0) continue; time_t t; if(parse_created_on_time(&t, created_on)) continue; if(t < no_news_before) continue; char idstr[64]; snprintf(idstr, sizeof(idstr), "sitenews:%d", id); prop_t *p = add_news_locked(idstr, title, NULL, "Read more", idstr); if(p != NULL) { prop_subscribe(PROP_SUB_TRACK_DESTROY, PROP_TAG_CALLBACK, open_news, p, PROP_TAG_ROOT, prop_create(p, "eventSink"), PROP_TAG_MUTEX, &news_mutex, NULL); } }
static void glw_init_settings(glw_root_t *gr, const char *instance) { prop_t *r = gr->gr_prop; if(gr->gr_base_size == 0) gr->gr_base_size = 20; gr->gr_settings_instance = strdup(instance); gr->gr_settings_store = htsmsg_store_load("displays/%s", instance); if(gr->gr_settings_store == NULL) gr->gr_settings_store = htsmsg_create_map(); gr->gr_settings = settings_add_dir(NULL, _p("Display and user interface"), "display", NULL, NULL, NULL); gr->gr_prop_size = prop_create(r, "size"); gr->gr_prop_underscan_h = prop_create(r, "underscan_h"); gr->gr_prop_underscan_v = prop_create(r, "underscan_v"); gr->gr_setting_size = settings_create_int(gr->gr_settings, "size", _p("Userinterface size"), 0, gr->gr_settings_store, -10, 30, 1, glw_change_user_size, gr, SETTINGS_INITIAL_UPDATE, "px", gr->gr_courier, glw_settings_save, gr); gr->gr_setting_underscan_h = settings_create_int(gr->gr_settings, "underscan_h", _p("Horizontal underscan"), 0, gr->gr_settings_store, -100, +100, 1, glw_change_underscan_h, gr, SETTINGS_INITIAL_UPDATE, "px", gr->gr_courier, glw_settings_save, gr); gr->gr_setting_underscan_v = settings_create_int(gr->gr_settings, "underscan_v", _p("Vertical underscan"), 0, gr->gr_settings_store, -100, +100, 1, glw_change_underscan_v, gr, SETTINGS_INITIAL_UPDATE, "px", gr->gr_courier, glw_settings_save, gr); gr->gr_setting_screensaver = settings_create_int(gr->gr_settings, "screensaver", _p("Screensaver delay"), 10, gr->gr_settings_store, 1, 60, 1, glw_set_screensaver_delay, gr, SETTINGS_INITIAL_UPDATE, " min", gr->gr_courier, glw_settings_save, gr); gr->gr_pointer_visible = prop_create(r, "pointerVisible"); gr->gr_is_fullscreen = prop_create(r, "fullscreen"); gr->gr_screensaver_active = prop_create(r, "screensaverActive"); gr->gr_prop_width = prop_create(r, "width"); gr->gr_prop_height = prop_create(r, "height"); prop_set_int(gr->gr_screensaver_active, 0); gr->gr_evsub = prop_subscribe(0, PROP_TAG_CALLBACK, glw_eventsink, gr, PROP_TAG_NAME("ui", "eventSink"), PROP_TAG_ROOT, r, PROP_TAG_COURIER, gr->gr_courier, NULL); }