Compare commits

...

4 Commits

2 changed files with 55 additions and 19 deletions

View File

@ -102,8 +102,12 @@ pub mod c {
imservice.pending = IMProtocolState { imservice.pending = IMProtocolState {
content_hint: { content_hint: {
ContentHint::from_bits(hint).unwrap_or_else(|| { ContentHint::from_bits(hint).unwrap_or_else(|| {
eprintln!("Warning: received invalid hint flags"); let out = ContentHint::from_bits_truncate(hint);
ContentHint::NONE eprintln!(
"Warning: received hint flags with unknown bits set: 0x{:x}",
hint ^ out.bits(),
);
out
}) })
}, },
content_purpose: { content_purpose: {
@ -142,19 +146,34 @@ pub mod c {
let imservice = check_imservice(imservice, im).unwrap(); let imservice = check_imservice(imservice, im).unwrap();
let active_changed = imservice.current.active ^ imservice.pending.active; let active_changed = imservice.current.active ^ imservice.pending.active;
fn is_visible(state: &IMProtocolState) -> bool {
state.active
&& !state.content_hint.contains(
ContentHint::ON_SCREEN_INPUT_PROVIDED
)
}
let visible_changed = is_visible(&imservice.current)
^ is_visible(&imservice.pending);
imservice.serial += Wrapping(1u32); imservice.serial += Wrapping(1u32);
imservice.current = imservice.pending.clone(); imservice.current = imservice.pending.clone();
imservice.pending = IMProtocolState { imservice.pending = IMProtocolState {
active: imservice.current.active, active: imservice.current.active,
..IMProtocolState::default() ..IMProtocolState::default()
}; };
if active_changed {
if imservice.current.active { if active_changed && imservice.current.active {
eekboard_context_service_show_keyboard(imservice.ui_manager);
eekboard_context_service_set_hint_purpose( eekboard_context_service_set_hint_purpose(
imservice.ui_manager, imservice.ui_manager,
imservice.current.content_hint.bits(), imservice.current.content_hint.bits(),
imservice.current.content_purpose.clone() as u32); imservice.current.content_purpose.clone() as u32,
);
}
if visible_changed {
if is_visible(&imservice.current) {
eekboard_context_service_show_keyboard(imservice.ui_manager);
} else { } else {
eekboard_context_service_hide_keyboard(imservice.ui_manager); eekboard_context_service_hide_keyboard(imservice.ui_manager);
} }
@ -219,6 +238,7 @@ bitflags!{
const SENSITIVE_DATA = 0x80; const SENSITIVE_DATA = 0x80;
const LATIN = 0x100; const LATIN = 0x100;
const MULTILINE = 0x200; const MULTILINE = 0x200;
const ON_SCREEN_INPUT_PROVIDED = 0x400;
} }
} }

View File

@ -12,6 +12,19 @@ except AttributeError:
print("Terminal purpose not available on this GTK version", file=sys.stderr) print("Terminal purpose not available on this GTK version", file=sys.stderr)
terminal = [] terminal = []
def new_grid(items, set_type):
grid = Gtk.Grid(orientation='vertical', column_spacing=8, row_spacing=8)
i = 0
for text, value in items:
l = Gtk.Label(label=text)
e = Gtk.Entry(hexpand=True)
set_type(e, value)
grid.attach(l, 0, i, 1, 1)
grid.attach(e, 1, i, 1, 1)
i += 1
return grid
class App(Gtk.Application): class App(Gtk.Application):
purposes = [ purposes = [
@ -27,20 +40,23 @@ class App(Gtk.Application):
("PIN", Gtk.InputPurpose.PIN), ("PIN", Gtk.InputPurpose.PIN),
] + terminal ] + terminal
hints = [
("OSK provided", Gtk.InputHints.INHIBIT_OSK)
]
def do_activate(self): def do_activate(self):
w = Gtk.ApplicationWindow(application=self) w = Gtk.ApplicationWindow(application=self)
grid = Gtk.Grid(orientation='vertical', column_spacing=8, row_spacing=8) notebook = Gtk.Notebook()
i = 0 def add_purpose(entry, purpose):
for text, purpose in self.purposes: entry.set_input_purpose(purpose)
def add_hint(entry, hint):
entry.set_input_hints(hint)
purpose_grid = new_grid(self.purposes, add_purpose)
hint_grid = new_grid(self.hints, add_hint)
l = Gtk.Label(label=text) notebook.append_page(purpose_grid, Gtk.Label(label="Purposes"))
e = Gtk.Entry(hexpand=True) notebook.append_page(hint_grid, Gtk.Label(label="Hints"))
e.set_input_purpose(purpose) w.add(notebook)
grid.attach(l, 0, i, 1, 1)
grid.attach(e, 1, i, 1, 1)
i += 1
w.add(grid)
w.show_all() w.show_all()
app = App() app = App()