Skip to content

Commit b6687c5

Browse files
committed
fix some more macOS variants
1 parent b31a681 commit b6687c5

File tree

4 files changed

+468
-425
lines changed

4 files changed

+468
-425
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
2+
"diffEditor.ignoreTrimWhitespace": false,
23
"rust-analyzer.cargo.features": [
34
"generating_convert"
4-
]
5+
],
56
}

scripts/rust_gen_convert.py

Lines changed: 75 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@
1111

1212
# %%
1313
columns = [
14-
("hut", ";hut::HUT"),
15-
("winput", "winput::Vk"),
16-
("vk", "windows::VIRTUAL_KEY"),
17-
("vk_value", "vkcode"),
18-
("hut_value", "hkcode"),
19-
("enigo_attr", "#[cfg(enigo::Key)]"),
20-
("enigo", "enigo::Key"),
21-
("keysym", "xkeysym::Keysym"),
22-
("cg", "macos::KeyCode"),
14+
("hut", ";hut::HUT" , "todo!(HUT)"),
15+
("winput", "winput::Vk" , "na!(Vk)"),
16+
("vk", "windows::VIRTUAL_KEY" , "todo!(VK_)"),
17+
("vk_value", "vkcode" , "n!()"),
18+
("hut_value", "hkcode" , "n!()"),
19+
("enigo", "enigo::Key" , "todo!(Enigo)"),
20+
("enigo_attr", "#[cfg(enigo::Key)]" , ""),
21+
("keysym", "xkeysym::Keysym" , "todo!(Keysym)"),
22+
("cg", "macos::KeyCode" , "todo!(CG)"),
2323
]
2424
col_map = {col[0]: col[1] for col in columns}
25+
col_default = {col[0]: col[2] for col in columns}
2526
col_map_rev = {col[1]: col[0] for col in columns}
2627
def load_csv(filename: str):
2728
df = pl.read_csv(filename)
@@ -51,11 +52,7 @@ def get_col_name(col: str, length: int):
5152
(pl.col(col).str.pad_end(max_col_lengths[col] - 1 if max_col_lengths[col] >= 10 else max_col_lengths[col] - 2).str.pad_start(max_col_lengths[col])
5253
.alias(get_col_name(col, max_col_lengths[col]))) for col in df.columns
5354
]+[pl.lit(None).alias(" ")]).write_csv(filename)
54-
df = load_csv(csv_filename)
55-
save_csv(df, csv_filename)
56-
df
5755

58-
# %%
5956
def parse_rs_match(code: str, starts_with: str = "", blocking: tuple[str, str] | None = None) -> list[tuple[str, str]]:
6057
result = []
6158
starts = blocking is None
@@ -84,62 +81,34 @@ def df_check_key_map(df: pl.DataFrame, df_map: pl.DataFrame):
8481
col_key = df_map.columns[0]
8582
col_value = df_map.columns[1]
8683
col_value_right = f"{col_value}_right"
87-
mismatched_keys = df.join(df_map, on=col_key).select([col_key, col_value, col_value_right]).filter(pl.col(col_value).eq(pl.col(col_value_right)).not_())
84+
mismatched_keys = df.join(df_map, on=col_key, how="right", nulls_equal=True).select([col_key, col_value, col_value_right]).filter(pl.col(col_value).eq_missing(pl.col(col_value_right)).not_())
8885
if not mismatched_keys.is_empty():
8986
print(f"Mismatch found in {col_key} -> {col_value} mapping:")
9087
print(mismatched_keys)
9188
return mismatched_keys
9289

93-
def df_insert_key_map(df: pl.DataFrame, df_map: pl.DataFrame, index: int, default: str | None = None, force: bool = False):
90+
def df_insert_key_map(df: pl.DataFrame, df_map: pl.DataFrame, after: str, default: str | None = None, force: bool = False):
9491
col_key = df_map.columns[0]
9592
col_value = df_map.columns[1]
9693
if default is None:
97-
default = f"todo!({col_value})"
98-
if force and col_value in df.columns:
99-
df = df.drop(col_value)
100-
if col_value not in df.columns:
101-
df1 = df.join(df_map, on=col_key, how="left").select(col_value).fill_null(pl.lit(default))
102-
columns = [pl.col(col) for col in df.columns]
103-
columns.insert(index, pl.lit(default))
104-
df = df.select(columns).replace_column(index, df1[col_value])
94+
default = col_default.get(col_value, f"todo!({col_value})")
95+
if not force and col_value in df.columns:
96+
return df
97+
df1 = df.select(col_key).join(df_map, how="full", on=col_key).select(col_value).fill_null(pl.lit(default))
98+
df = df.select(df.columns)
99+
if col_value in df.columns:
100+
df.replace_column(df.get_column_index(col_value), df1[col_value])
101+
else:
102+
index = df.get_column_index(after)
103+
print(df.columns, after, index)
104+
df = df.insert_column(index, df1[col_value])
105105
return df
106106

107-
with open(enigo__keycodes_rs) as rsfile:
108-
content = rsfile.read()
109-
110-
data = parse_rs_match(content, blocking=('impl From<Key> for xkeysym::Keysym {', '}'))
111-
key_map_enigo_keysym = {k.replace("Key::", "Enigo::"): v for k,v in data if "Key::" in k and "(" not in k}
112-
df_map_enigo_keysym = pl.DataFrame({
113-
"enigo": key_map_enigo_keysym.keys(),
114-
"keysym": key_map_enigo_keysym.values()
115-
})
116-
df_check_key_map(df, df_map_enigo_keysym)
117-
118-
data = parse_rs_match(content, blocking=('impl TryFrom<Key> for windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY {', '}'))
119-
key_map_enigo_vk = {k.replace("Key::", "Enigo::"): v for k,v in data if "Key::" in k and "(" not in k}
120-
df_map_enigo_vk = pl.DataFrame({
121-
"enigo": key_map_enigo_vk.keys(),
122-
"vk": key_map_enigo_vk.values()
123-
})
124-
df_check_key_map(df, df_map_enigo_vk)
125-
126-
with open(enigo__macos_impl_rs) as rsfile:
127-
content = rsfile.read()
128-
data = parse_rs_match(content, blocking=('impl TryFrom<Key> for core_graphics::event::CGKeyCode {', '}'))
129-
def fix_macos_impl_value(v: str):
130-
if v.startswith("ANSI_"): return "KeyCode::" + v
131-
try: return f"KeyCode::from({int(v)})"
132-
except: pass
133-
return v
134-
key_map_enigo_cg = {k.replace("Key::", "Enigo::"): fix_macos_impl_value(v) for k,v in data if "Key::" in k and "(" not in k}
135-
df_map_enigo_cg = pl.DataFrame({
136-
"enigo": key_map_enigo_cg.keys(),
137-
"cg": key_map_enigo_cg.values()
138-
})
139-
df = df_insert_key_map(df, df_map_enigo_cg,index=df.get_column_index("keysym")+1)
140-
df_check_key_map(df, df_map_enigo_cg)
107+
def df_fill_na(df: pl.DataFrame):
108+
return df.select([
109+
pl.col(col).fill_null(pl.lit(col_default.get(col, f"todo!({col})"))).alias(col) for col in df.columns
110+
])
141111

142-
# %%
143112
def parse_rs_attr(code: str, line_starts: str = "#[cfg(", line_not_starts: list[str] = ["#[", "//"], blocking: tuple[str, str] | None = None):
144113
result = []
145114
starts = blocking is None
@@ -174,6 +143,10 @@ def parse_rs_attr(code: str, line_starts: str = "#[cfg(", line_not_starts: list[
174143
'#[cfg(any(target_os = "windows", all(unix, not(target_os = "macos"))))]': 'windows|linux'
175144
}
176145

146+
# %%
147+
df = load_csv(csv_filename)
148+
save_csv(df, csv_filename)
149+
177150
with open(enigo__keycodes_rs) as rsfile:
178151
content = rsfile.read()
179152
enigo_attrs = parse_rs_attr(content, blocking=("pub enum Key {", "}"))
@@ -183,12 +156,53 @@ def parse_rs_attr(code: str, line_starts: str = "#[cfg(", line_not_starts: list[
183156
"enigo_attr": map_enigo_attrs.values(),
184157
})
185158

186-
df = df_insert_key_map(df, df_map_enigo_keysym, df.get_column_index("enigo") + 1, default="", force=True)
159+
df = df_fill_na(df.join(df_map_enigo_attrs.select('enigo'), on="enigo", coalesce=True, how="full", maintain_order="left_right"))
160+
df = df_insert_key_map(df, df_map_enigo_attrs, after="enigo")
187161
df_check_key_map(df, df_map_enigo_attrs)
162+
df
188163

189164
# %%
190-
save_csv(df, csv_filename)
165+
with open(enigo__keycodes_rs) as rsfile:
166+
content = rsfile.read()
167+
168+
data = parse_rs_match(content, blocking=('impl From<Key> for xkeysym::Keysym {', '}'))
169+
key_map_enigo_keysym = {k.replace("Key::", "Enigo::"): v for k,v in data if "Key::" in k and "(" not in k}
170+
df_map_enigo_keysym = pl.DataFrame({
171+
"enigo": key_map_enigo_keysym.keys(),
172+
"keysym": key_map_enigo_keysym.values()
173+
})
174+
df_check_key_map(df, df_map_enigo_keysym)
175+
176+
data = parse_rs_match(content, blocking=('impl TryFrom<Key> for windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY {', '}'))
177+
key_map_enigo_vk = {k.replace("Key::", "Enigo::"): v for k,v in data if "Key::" in k and "(" not in k}
178+
df_map_enigo_vk = pl.DataFrame({
179+
"enigo": key_map_enigo_vk.keys(),
180+
"vk": key_map_enigo_vk.values()
181+
})
182+
df_check_key_map(df, df_map_enigo_vk)
183+
184+
with open(enigo__macos_impl_rs) as rsfile:
185+
content = rsfile.read()
186+
data = parse_rs_match(content, blocking=('impl TryFrom<Key> for core_graphics::event::CGKeyCode {', '}'))
187+
def fix_macos_impl_value(v: str):
188+
# if v.startswith("ANSI_"): return "KeyCode::" + v
189+
if v.startswith("return Err(())"): return None
190+
if v.startswith("ANSI_"): return "KeyCodeExt::kVK_ANSI_" + v.removeprefix("ANSI_").title().replace("_", "")
191+
try: return f"KeyCode::from({int(v)})"
192+
except: pass
193+
return v
194+
key_map_enigo_cg = {k.replace("Key::", "Enigo::"): fix_macos_impl_value(v) for k,v in data if "Key::" in k and "(" not in k} | \
195+
{f"Enigo::Num{i}": f"KeyCodeExt::kVK_ANSI_{i}" for i in range(10)} | {f"Enigo::{chr(X)}": f"KeyCodeExt::kVK_ANSI_{chr(X)}" for X in range(ord('A'), ord('Z')+1)}
196+
197+
df_map_enigo_cg = pl.DataFrame({
198+
"enigo": key_map_enigo_cg.keys(),
199+
"cg": key_map_enigo_cg.values()
200+
})
201+
df = df_insert_key_map(df, df_map_enigo_cg, after="keysym", force=True)
202+
df_check_key_map(df, df_map_enigo_cg)
203+
df
191204

192205
# %%
193-
i
206+
save_csv(df, csv_filename)
207+
194208
# %%

0 commit comments

Comments
 (0)