Skip to content

Commit 372f044

Browse files
authored
Use renderview.js (#125)
* Use renderview.js * JS lint in ci * ruff * Fix tests and use modern asyncio * new renderview.hs * update refs and make work * fix print * flake * Restore output helper * Fix request-draw * ruff * updated renderview * address todos related to performance
1 parent 652a168 commit 372f044

21 files changed

Lines changed: 1377 additions & 869 deletions

.github/workflows/ci.yml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ on:
1010
jobs:
1111

1212
lint:
13-
name: Lint
13+
name: Py linting
1414
runs-on: ubuntu-latest
1515
strategy:
1616
fail-fast: false
@@ -31,6 +31,19 @@ jobs:
3131
run: |
3232
ruff format --check .
3333
34+
jslint:
35+
name: JS Linting
36+
runs-on: ubuntu-latest
37+
strategy:
38+
fail-fast: false
39+
steps:
40+
- uses: actions/checkout@v4
41+
- uses: actions/setup-node@v6
42+
- name: Install JS dependencies
43+
run: npm install -g standard
44+
- name: Lint JS files
45+
run: standard jupyter_rfb
46+
3447
tests:
3548
name: ${{ matrix.name }}
3649
runs-on: ${{ matrix.os }}

README.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ To install use pip:
3737
$ pip install jupyter_rfb
3838

3939
For better performance, also ``pip install simplejpeg`` or ``pip install pillow``.
40-
On older versions of Jupyter notebook/lab an extra step might be needed
41-
to enable the widget.
42-
43-
To install into an existing conda environment:
44-
45-
$ conda install -c conda-forge jupyter-rfb
4640

4741

4842
## Developer notes

docs/guide.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ example:
5050
class MyRemoteFrameBuffer(jupyter_rfb.RemoteFrameBuffer):
5151
5252
def handle_event(self, event):
53-
event_type = event["event_type"]
54-
if event_type == "resize":
53+
if event["type"] == "resize":
5554
self.logical_size = event["width"], event["height"]
56-
self.pixel_ratio = event["pixel_ratio"]
57-
elif event_type == "pointer_down":
55+
self.pixel_ratio = event["ratio"]
56+
elif event["type"] == "pointer_down":
5857
pass # ...
5958
6059

examples/grid.ipynb

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,22 @@
1212
},
1313
{
1414
"cell_type": "code",
15-
"execution_count": 1,
15+
"execution_count": null,
1616
"id": "d5327490",
1717
"metadata": {},
1818
"outputs": [
1919
{
2020
"data": {
2121
"application/vnd.jupyter.widget-view+json": {
22-
"model_id": "0f32c2c9f5cc4ae182c9319c50b44540",
22+
"model_id": "f4a6df79054e438fb9c69a723f5fbfae",
2323
"version_major": 2,
24-
"version_minor": 0
25-
},
26-
"text/plain": [
27-
"RFBOutputContext()"
28-
]
29-
},
30-
"metadata": {},
31-
"output_type": "display_data"
32-
},
33-
{
34-
"data": {
35-
"application/vnd.jupyter.widget-view+json": {
36-
"model_id": "da51a5e8e63f47c28f7c26c269e81136",
37-
"version_major": 2,
38-
"version_minor": 0
24+
"version_minor": 1
3925
},
4026
"text/html": [
41-
"<div class='snapshot-da51a5e8e63f47c28f7c26c269e81136' style='position:relative;'><img src='data:image/png;base64,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' style='width:500.0px;height:300.0px;' /><div style='position: absolute; top:0; left:0; padding:1px 3px; background: #777; color:#fff; font-size: 90%; font-family:sans-serif; '>snapshot</div></div>"
27+
"<div class='snapshot-f4a6df79054e438fb9c69a723f5fbfae' style='position:relative;'><img src='data:image/png;base64,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' style='width:500.0px;height:300.0px;' /><div style='position: absolute; top:0; left:0; padding:1px 3px; background: #777; color:#fff; font-size: 90%; font-family:sans-serif; '>snapshot</div></div>"
4228
],
4329
"text/plain": [
44-
"Grid()"
30+
"<__main__.Grid object at 0x10ad28ec0>"
4531
]
4632
},
4733
"execution_count": 1,
@@ -56,12 +42,12 @@
5642
"\n",
5743
"class Grid(jupyter_rfb.RemoteFrameBuffer):\n",
5844
" def handle_event(self, event):\n",
59-
" if event[\"event_type\"] == \"resize\":\n",
45+
" if event[\"type\"] == \"resize\":\n",
6046
" self._size = event\n",
6147
" # self.print(event) # uncomment to display the event\n",
6248
"\n",
6349
" def get_frame(self):\n",
64-
" w, h, r = self._size[\"width\"], self._size[\"height\"], self._size[\"pixel_ratio\"]\n",
50+
" w, h, r = self._size[\"width\"], self._size[\"height\"], self._size[\"ratio\"]\n",
6551
" physical_size = int(h * r), int(w * r)\n",
6652
" a = np.zeros((physical_size[0], physical_size[1], 3), np.uint8)\n",
6753
" self.draw_grid(a)\n",
@@ -85,29 +71,15 @@
8571
{
8672
"data": {
8773
"application/vnd.jupyter.widget-view+json": {
88-
"model_id": "b28caefcd2224e4f94e3a78a961077cf",
89-
"version_major": 2,
90-
"version_minor": 0
91-
},
92-
"text/plain": [
93-
"RFBOutputContext()"
94-
]
95-
},
96-
"metadata": {},
97-
"output_type": "display_data"
98-
},
99-
{
100-
"data": {
101-
"application/vnd.jupyter.widget-view+json": {
102-
"model_id": "867783e4be764337a24bdae7c9a9494e",
74+
"model_id": "6231e3c1f7e84e06825c688af8d88ffb",
10375
"version_major": 2,
104-
"version_minor": 0
76+
"version_minor": 1
10577
},
10678
"text/html": [
107-
"<div class='snapshot-867783e4be764337a24bdae7c9a9494e' style='position:relative;'><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAEsCAIAAAC62dafAAAHe0lEQVR42u3XO47YQAxEwb3/pdeAMYGV89MGq6KnjEkPoJ9fOOPnL60v9M8vnJEzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7gYAAP4Lv3DG9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBffwBV2N4GxEqntQAAAABJRU5ErkJggg==' style='width:500.0px;height:300.0px;' /><div style='position: absolute; top:0; left:0; padding:1px 3px; background: #777; color:#fff; font-size: 90%; font-family:sans-serif; '>snapshot</div></div>"
79+
"<div class='snapshot-6231e3c1f7e84e06825c688af8d88ffb' style='position:relative;'><img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAEsCAIAAAC62dafAAAHe0lEQVR42u3XO47YQAxEwb3/pdeAMYGV89MGq6KnjEkPoJ9fOOPnL60v9M8vnJEzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7o44QmutdW1HHKG11rq23wdckDM8rbvb484hOcPTursjjtBaa13bEUdorbWu7fcBF+QMT+vu9rhzSM7wtO7uiCO01lrXdsQRWmuta/t9wAU5w9O6uz3uHJIzPK27O+IIrbXWtR1xhNZa69p+H3BBzvC07m6PO4fkDE/r7gYAAP4Lv3DG9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBj+0cZ5myvDQZtzw3mbK8NAAAAPrZ/lGHO9tpg0PbcYM722gAAAOBffwBV2N4GxEqntQAAAABJRU5ErkJggg==' style='width:500.0px;height:300.0px;' /><div style='position: absolute; top:0; left:0; padding:1px 3px; background: #777; color:#fff; font-size: 90%; font-family:sans-serif; '>snapshot</div></div>"
10880
],
10981
"text/plain": [
110-
"Grid2()"
82+
"<__main__.Grid2 object at 0x10ad2b8c0>"
11183
]
11284
},
11385
"execution_count": 2,
@@ -127,6 +99,14 @@
12799
"w = Grid2()\n",
128100
"w"
129101
]
102+
},
103+
{
104+
"cell_type": "code",
105+
"execution_count": null,
106+
"id": "74ebbac5",
107+
"metadata": {},
108+
"outputs": [],
109+
"source": []
130110
}
131111
],
132112
"metadata": {
@@ -145,7 +125,7 @@
145125
"name": "python",
146126
"nbconvert_exporter": "python",
147127
"pygments_lexer": "ipython3",
148-
"version": "3.9.9"
128+
"version": "3.14.0"
149129
}
150130
},
151131
"nbformat": 4,

0 commit comments

Comments
 (0)