Yes, it’s by design; and, no: the button is hidden if the shell cannot create the following GStreamer pipeline:
static canScreencast() {
const elements = [
'pipewiresrc',
'filesink',
...DEFAULT_PIPELINE.split('!').map(e => e.trim().split(' ').at(0)),
];
return Gst.init_check(null) &&
elements.every(e => Gst.ElementFactory.find(e) != null);
}
with the DEFAULT_PIPELINE
being:
const DEFAULT_PIPELINE = 'videoconvert chroma-mode=GST_VIDEO_CHROMA_MODE_NONE dither=GST_VIDEO_DITHER_NONE matrix-mode=GST_VIDEO_MATRIX_MODE_OUTPUT_ONLY n-threads=%T ! queue ! vp8enc cpu-used=16 max-quantizer=17 deadline=1 keyframe-mode=disabled threads=%T static-threshold=1000 buffer-size=20000 ! queue ! webmmux';
I would recommend asking on a postmarketOS forum how to ensure that pipewire is running and can be used by GStreamer.