Skip to main content

ImeContentType

Enum ImeContentType 

Source
#[non_exhaustive]
pub enum ImeContentType { Normal, Password, NoSuggestions, Terminal, }
Expand description

The event-pass/IME-surface EditingState — see this module’s own docs for the split against text::EditingState, frust_text::editor’s distinct, byte-indexed type. ImeContentType is the input-purpose hint an editable widget publishes on its ImeState so a shell can lock a secret field’s keyboard down. What kind of content a focused editable field holds — the hint a widget publishes so each shell can configure the platform input method.

This is the framework’s input-purpose vocabulary: renderer- and platform-neutral names a widget states its intent in, which each shell maps onto its own host API. It is deliberately tiny — it exists to let a secret field tell the platform it is secret, not to model every keyboard layout.

§Why this exists (security, not ergonomics)

Visual masking (TextInput::obscured) hides the glyphs the app draws; it says nothing to the input method. A stock soft keyboard given no hint will happily render the field’s text in its suggestion strip above the masked field, and may commit it to its persistent learned-word dictionary. Only a content-type hint suppresses that; an accessibility Role::PasswordInput does not.

§Platform mapping

Each shell owns its own constants (core holds no platform integers). The intended mapping, which downstream shell work must honour:

VariantAndroid (InputType / EditorInfo.imeOptions)iOS (UITextInputTraits)Desktop (winit)
NormalTYPE_CLASS_TEXTplatform defaultsImePurpose::Normal
PasswordTYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD, plus TYPE_TEXT_FLAG_NO_SUGGESTIONS and IME_FLAG_NO_PERSONALIZED_LEARNINGisSecureTextEntry = true, textContentType = .password, autocorrectionType = .no, spellCheckingType = .no, plus smart-punctuation suppression (see Terminal)ImePurpose::Password
NoSuggestionsTYPE_CLASS_TEXT | TYPE_TEXT_FLAG_NO_SUGGESTIONS, plus IME_FLAG_NO_PERSONALIZED_LEARNINGautocorrectionType = .no, spellCheckingType = .no, plus smart-punctuation suppressionno equivalent — ImePurpose::Normal
TerminalTYPE_CLASS_TEXT | TYPE_TEXT_FLAG_NO_SUGGESTIONS, plus IME_FLAG_NO_PERSONALIZED_LEARNING (same as NoSuggestions)isSecureTextEntry = false, autocorrectionType = .no, spellCheckingType = .no, smartQuotesType = .no, smartDashesType = .no, smartInsertDeleteType = .no, autocapitalizationType = .none, textContentType = nilImePurpose::Terminal

Sources: Android android.text.InputType / android.view.inputmethod.EditorInfo and Apple UITextInputTraits reference docs, retrieved 2026-08-01.

Unsupported is a first-class outcome. winit 0.30’s Window::set_ime_purpose is documented as unsupported on iOS/Android/Web/ Windows/X11/macOS/Orbital (Wayland text-input-v3 is the only implementation), so the desktop shell may legitimately honour nothing here. A shell that cannot express a hint drops it — it must never refuse to publish, and core never asserts that a hint took effect.

§Matching rule for shells

This enum is #[non_exhaustive]: adding a variant later (numeric password, email, one-time code…) must not break a shell. So a shell branches its security behaviour on is_secret / suppresses_suggestions, never on a variant match with a _ => fallback — a catch-all arm would silently downgrade a future secret variant to a non-secret keyboard, which is exactly the leak this type exists to close. Variant matching is fine for the cosmetic choice (which keyboard layout to request).

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

Normal

No hint: ordinary text, platform defaults (suggestions, autocorrect and personalized learning all as the user configured them).

The default, and what every field publishes unless it opts in.

§

Password

Secret text (password / passphrase / PIN entered as text).

The shell must request secure entry and suppress suggestions and personalized learning.

§

NoSuggestions

Non-secret text that must not be autocorrected, suggested, or learned (recovery codes, identifiers, usernames).

Distinct from Password: the platform does not switch to secure entry, so autofill/reveal-last-character behaviour is unchanged; only the suggestion/learning channel is closed.

§

Terminal

A raw byte-entry surface (a terminal/shell keystroke source): no suggestion strip, no autocorrect, no smart quotes/dashes/insert-delete, no autocapitalization. Text is not masked — this is not a secret field, it is a field where every character the user typed must reach the app byte-for-byte with zero platform “correction” applied to it.

The defect this closes is the same class Password closes for secrets: a smart keyboard silently substituting " for a curly quote or -- for an em dash corrupts a shell command exactly as it corrupts a password, just without the confidentiality angle. Distinct from NoSuggestions: that variant suppresses the suggestion/learning channel only, while Terminal additionally suppresses smart punctuation and autocapitalization, both of which silently rewrite the text a suggestion-only hint leaves untouched.

Implementations§

Source§

impl ImeContentType

Source

pub fn is_secret(self) -> bool

Whether the field holds a secret the platform must treat as such (secure entry on iOS, a password InputType variation on Android).

Shells gate secure-entry configuration on this, not on a variant match (see the type docs’ matching rule).

This predicate and suppresses_suggestions match exhaustively (no _ arm) on purpose: adding a variant to this enum is a compile error here until it is classified as secret or not.

Source

pub fn suppresses_suggestions(self) -> bool

Whether the platform must suppress its suggestion strip, autocorrect, and persistent word learning for this field.

True for every secret content type and for NoSuggestions and Terminal.

Trait Implementations§

Source§

impl Clone for ImeContentType

Source§

fn clone(&self) -> ImeContentType

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ImeContentType

Source§

impl Debug for ImeContentType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Default for ImeContentType

Source§

fn default() -> ImeContentType

Returns the “default value” for a type. Read more
Source§

impl Eq for ImeContentType

Source§

impl Hash for ImeContentType

Source§

fn hash<__H>(&self, state: &mut __H)
where __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ImeContentType

Source§

fn eq(&self, other: &ImeContentType) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ImeContentType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Brush for T
where T: Clone + PartialEq + Default + Debug,

Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> NoneValue for T
where T: Default,

Source§

type NoneType = T

Source§

fn null_value() -> T

The none-equivalent value.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more