]> git.decadent.org.uk Git - videolink.git/blobdiff - webdvd.cpp
Added code to set the display resolution assumed by Mozilla.
[videolink.git] / webdvd.cpp
index d0f2e05f3e8dd2f9718f4f47e9636f119828ee3d..31ad122776a154586a14ea9baf4e7642331dcd5a 100644 (file)
@@ -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 = "&quot;"; break;
+           case '&':  entity = "&amp;";  break;
+           case '\'': entity = "&apos;"; break;
+           case '<':  entity = "&lt;";   break;
+           case '>':  entity = "&gt;";   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<menu> menus;
        std::vector<title> 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