diff --git a/sim/fakes/audio.py b/sim/fakes/audio.py
index bd492028366c2542e65d395a413c101b60c4d286..254ef1040aa284f1d82bf60f6becd3e48ac45b75 100644
--- a/sim/fakes/audio.py
+++ b/sim/fakes/audio.py
@@ -147,3 +147,19 @@ def input_engines_get_source_avail(source):
 
 def headset_mic_get_allowed():
     return False
+
+
+def input_engines_get_source():
+    return None
+
+
+def input_thru_get_mute():
+    return False
+
+
+def input_thru_set_mute(mute):
+    pass
+
+
+def input_engines_set_source(source):
+    pass
diff --git a/sim/fakes/ctx.py b/sim/fakes/ctx.py
index c282c8bc3b97234095c027203ea739235805673c..742455da344b331d4d1c59028f54c3a82e767a07 100644
--- a/sim/fakes/ctx.py
+++ b/sim/fakes/ctx.py
@@ -106,9 +106,13 @@ class Context:
     END = "end"
     MIDDLE = "middle"
     BEVEL = "bevel"
+    NONE = "none"
+    COPY = "copy"
 
     def __init__(self, _ctx):
         self._ctx = _ctx
+        self._font_size = 0
+        self._line_width = 0
 
     @property
     def image_smoothing(self):
@@ -136,7 +140,7 @@ class Context:
 
     @property
     def compositing_mode(self):
-        return None
+        return Context.NONE
 
     @compositing_mode.setter
     def compositing_mode(self, v):
@@ -144,10 +148,11 @@ class Context:
 
     @property
     def line_width(self):
-        return None
+        return self._line_width
 
     @line_width.setter
     def line_width(self, v):
+        self._line_width = v
         self._emit(f"lineWidth {v:.3f}")
 
     @property
@@ -160,10 +165,11 @@ class Context:
 
     @property
     def font_size(self):
-        return None
+        return self._font_size
 
     @font_size.setter
     def font_size(self, v):
+        self._font_size = v
         self._emit(f"fontSize {v:.3f}")
 
     @property
@@ -174,23 +180,42 @@ class Context:
     def global_alpha(self, v):
         self._emit(f"globalAlpha {v:.3f}")
 
+    @property
+    def x(self):
+        return 0
+
+    @property
+    def y(self):
+        return 0
+
     def _emit(self, text):
         _wasm.ctx_parse(self._ctx, text)
 
+    def logo(self, x, y, r):
+        return self
+
     def move_to(self, x, y):
-        self._emit(f"moveTo {int(x)} {int(y)}")
+        self._emit(f"moveTo {x:.3f} {y:.3f}")
         return self
 
     def curve_to(self, a, b, c, d, e, f):
-        self._emit(f"curveTo {int(a)} {int(b)} {int(c)} {int(d)}")
+        self._emit(f"curveTo {a:.3f} {b:.3f} {c:.3f} {d:.3f} {e:.3f} {f:.3f}")
+        return self
+
+    def quad_to(self, a, b, c, d):
+        self._emit(f"quadTo {a:.3f} {b:.3f} {c:.3f} {d:.3f}")
         return self
 
     def rel_move_to(self, x, y):
-        self._emit(f"relMoveTo {int(x)} {int(y)}")
+        self._emit(f"relMoveTo {x:.3f} {y:.3f}")
         return self
 
     def rel_curve_to(self, a, b, c, d, e, f):
-        self._emit(f"relCurveTo {int(a)} {int(b)} {int(c)} {int(d)}")
+        self._emit(f"relCurveTo {a:.3f} {b:.3f} {c:.3f} {d:.3f} {e:.3f} {f:.3f}")
+        return self
+
+    def rel_quad_to(self, a, b, c, d):
+        self._emit(f"relQuadTo {a:.3f} {b:.3f} {c:.3f} {d:.3f}")
         return self
 
     def close_path(self):
@@ -198,7 +223,7 @@ class Context:
         return self
 
     def translate(self, x, y):
-        self._emit(f"translate {int(x)} {int(y)}")
+        self._emit(f"translate {x:.3f} {y:.3f}")
         return self
 
     def scale(self, x, y):
@@ -206,7 +231,11 @@ class Context:
         return self
 
     def line_to(self, x, y):
-        self._emit(f"lineTo {int(x)} {int(y)}")
+        self._emit(f"lineTo {x:.3f} {y:.3f}")
+        return self
+
+    def rel_line_to(self, x, y):
+        self._emit(f"relLineTo {x:.3f} {y:.3f}")
         return self
 
     def rotate(self, v):
@@ -244,7 +273,7 @@ class Context:
 
     def round_rectangle(self, x, y, width, height, radius):
         self._emit(
-            f"roundRectangle {int(x)} {int(y)} {int(width)} {int(height)} {radius}"
+            f"roundRectangle {x:.3f} {y:.3f} {width:.3f} {height:.3f} {radius:.3f}"
         )
         return self
 
@@ -287,7 +316,12 @@ class Context:
         )
         return self
 
-    def add_stop(self, pos, red, green, blue, alpha):
+    def linear_gradient(self, x0, y0, x1, y1):
+        self._emit(f"linearGradient {x0:.3f} {y0:.3f} {x1:.3f} {y1:.3f}")
+        return self
+
+    def add_stop(self, pos, color, alpha):
+        red, green, blue = color
         if red > 1.0 or green > 1.0 or blue > 1.0:
             red /= 255.0
             green /= 255.0
@@ -310,9 +344,13 @@ class Context:
         )
         return self
 
+    def begin_path(self):
+        self._emit(f"beginPath")
+        return self
+
     def arc(self, x, y, radius, arc_from, arc_to, direction):
         self._emit(
-            f"arc {int(x)} {int(y)} {int(radius)} {arc_from:.4f} {arc_to:.4f} {1 if direction else 0}"
+            f"arc {x:.3f} {y:.3f} {radius:.3f} {arc_from:.4f} {arc_to:.4f} {1 if direction else 0}"
         )
         return self
 
@@ -320,7 +358,8 @@ class Context:
         return _wasm.ctx_text_width(self._ctx, text)
 
     def clip(self):
-        return
+        self._emit(f"clip")
+        return self
 
     def get_font_name(self, i):
         return [