X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=webdvd.cpp;h=31ad122776a154586a14ea9baf4e7642331dcd5a;hb=86602dfc3c0f036cc061277b70607e2631b50229;hp=d0f2e05f3e8dd2f9718f4f47e9636f119828ee3d;hpb=51e4ad8512a2b11da8737f345676b03d94e0fa2a;p=videolink.git diff --git a/webdvd.cpp b/webdvd.cpp index d0f2e05..31ad122 100644 --- a/webdvd.cpp +++ b/webdvd.cpp @@ -142,6 +142,36 @@ namespace return result; } + + std::string xml_escape(const std::string & str) + { + std::string result; + std::size_t begin = 0; + + for (;;) + { + std::size_t end = str.find_first_of("\"&'<>", begin); + result.append(str, begin, end - begin); + if (end == std::string::npos) + return result; + + const char * entity = NULL; + switch (str[end]) + { + case '"': entity = """; break; + case '&': entity = "&"; break; + case '\'': entity = "'"; break; + case '<': entity = "<"; break; + case '>': entity = ">"; break; + } + assert(entity); + result.append(entity); + + begin = end + 1; + } + } + + struct dvd_contents { enum pgc_type { menu_pgc, title_pgc }; @@ -171,7 +201,7 @@ namespace std::vector menus; std::vector titles; }; - + class webdvd_window : public Gtk::Window { public: @@ -280,8 +310,7 @@ namespace filename + " is missing or not a regular file"); vob_list .append("<vob file='") - // FIXME: Should XML-escape the path - .append(filename) + .append(xml_escape(filename)) .append("'/>\n"); } else @@ -1000,16 +1029,17 @@ namespace void set_browser_preferences() { - // Disable IE-compatibility kluge that causes backgrounds to - // sometimes/usually be missing from snapshots. This is only - // effective from Mozilla 1.8 onward. -# if MOZ_VERSION_MAJOR > 1 \ - || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8) nsCOMPtr<nsIPrefService> pref_service; static const nsCID pref_service_cid = NS_PREFSERVICE_CID; check(CallGetService<nsIPrefService>(pref_service_cid, getter_AddRefs(pref_service))); nsCOMPtr<nsIPrefBranch> pref_branch; + + // Disable IE-compatibility kluge that causes backgrounds to + // sometimes/usually be missing from snapshots. This is only + // effective from Mozilla 1.8 onward. +# if MOZ_VERSION_MAJOR > 1 \ + || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8) check(pref_service->GetDefaultBranch("layout", getter_AddRefs(pref_branch))); check(pref_branch->SetBoolPref( @@ -1017,9 +1047,17 @@ namespace true)); # endif - // TODO: Set display resolution? Unfortunately Mozilla doesn't - // support non-square pixels (and neither do fontconfig or Xft - // anyway). + // Set display resolution. With standard-definition video we + // will be fitting ~600 pixels across a screen typically + // ranging from 10 to 25 inches wide, for a resolution of + // 24-60 dpi. I therefore declare the average horizontal + // resolution to be 40 dpi. The vertical resolution will be + // slightly higher (PAL/SECAM) or lower (NTSC), but + // unfortunately Mozilla doesn't support non-square pixels + // (and neither do fontconfig or Xft anyway). + check(pref_service->GetDefaultBranch("browser.display", + getter_AddRefs(pref_branch))); + check(pref_branch->SetIntPref("screen_resolution", 40)); } } // namespace