85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
# piker: trading gear for hackers
|
|
# Copyright (C) Tyler Goodlet (in stewardship for pikers)
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
'''
|
|
IB api client data feed reset hack for i3.
|
|
|
|
'''
|
|
import subprocess
|
|
|
|
import i3ipc
|
|
|
|
i3 = i3ipc.Connection()
|
|
t = i3.get_tree()
|
|
|
|
orig_win_id = t.find_focused().window
|
|
|
|
# for tws
|
|
win_names: list[str] = [
|
|
'Interactive Brokers', # tws running in i3
|
|
'IB Gateway', # gw running in i3
|
|
# 'IB', # gw running in i3 (newer version?)
|
|
]
|
|
|
|
for name in win_names:
|
|
results = t.find_titled(name)
|
|
print(f'results for {name}: {results}')
|
|
if results:
|
|
con = results[0]
|
|
print(f'Resetting data feed for {name}')
|
|
win_id = str(con.window)
|
|
w, h = con.rect.width, con.rect.height
|
|
|
|
# TODO: seems to be a few libs for python but not sure
|
|
# if they support all the sub commands we need, order of
|
|
# most recent commit history:
|
|
# https://github.com/rr-/pyxdotool
|
|
# https://github.com/ShaneHutter/pyxdotool
|
|
# https://github.com/cphyc/pyxdotool
|
|
|
|
# TODO: only run the reconnect (2nd) kc on a detected
|
|
# disconnect?
|
|
for key_combo, timeout in [
|
|
# only required if we need a connection reset.
|
|
# ('ctrl+alt+r', 12),
|
|
# data feed reset.
|
|
('ctrl+alt+f', 6)
|
|
]:
|
|
subprocess.call([
|
|
'xdotool',
|
|
'windowactivate', '--sync', win_id,
|
|
|
|
# move mouse to bottom left of window (where there should
|
|
# be nothing to click).
|
|
'mousemove_relative', '--sync', str(w-4), str(h-4),
|
|
|
|
# NOTE: we may need to stick a `--retry 3` in here..
|
|
'click', '--window', win_id,
|
|
'--repeat', '3', '1',
|
|
|
|
# hackzorzes
|
|
'key', key_combo,
|
|
],
|
|
timeout=timeout,
|
|
)
|
|
|
|
# re-activate and focus original window
|
|
subprocess.call([
|
|
'xdotool',
|
|
'windowactivate', '--sync', str(orig_win_id),
|
|
'click', '--window', str(orig_win_id), '1',
|
|
])
|