Skip to content

Commit

Permalink
added topmost and toggle_topmost, for Windows only. Similar to fullsc…
Browse files Browse the repository at this point in the history
…reen and toggle_fullscreen
  • Loading branch information
tscizzlebg authored and Roman committed Mar 30, 2020
1 parent 462a01b commit d773580
Show file tree
Hide file tree
Showing 11 changed files with 127 additions and 4 deletions.
19 changes: 19 additions & 0 deletions docs/examples/toggle_topmost.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Toggle topmost

Switch application window to topmost mode after five seconds (window stays on top of, or in front of, other windows).

``` python
import webview
import time

def toggle_topmost(window):
# wait a few seconds before toggling topmost:
time.sleep(5)

window.toggle_topmost()


if __name__ == '__main__':
window = webview.create_window('Topmost window', 'https://pywebview.flowrl.com/hello')
webview.start(window)
```
14 changes: 14 additions & 0 deletions docs/examples/topmost.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Topmost window

Create a window that stays on top of, or in front of, other windows.

``` python
import webview


if __name__ == '__main__':
webview.create_window('Topmost window',
'https://pywebview.flowrl.com/hello',
topmost=True)
webview.start()
```
18 changes: 18 additions & 0 deletions examples/toggle_topmost.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import webview
import time

"""
This example demonstrates how to toggle topmost mode programmatically.
"""


def toggle_topmost(window):
# wait a few seconds before toggle topmost:
time.sleep(5)

window.toggle_topmost()


if __name__ == '__main__':
window = webview.create_window('Topmost window', 'https://pywebview.flowrl.com/hello')
webview.start(toggle_topmost, window)
12 changes: 12 additions & 0 deletions examples/topmost.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import webview

"""
This example demonstrates how to create a topmost webview window.
"""

if __name__ == '__main__':
# Create webview window that stays on top of, or in front of, all other windows
webview.create_window('Topmost window',
'https://pywebview.flowrl.com/hello',
topmost=True)
webview.start()
14 changes: 14 additions & 0 deletions tests/test_toggle_topmost.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import webview
from .util import run_test


def test_toggle_topmost():
window = webview.create_window("Toggle topmost test", "https://www.example.org")
run_test(webview, window, toggle_topmost)


def toggle_topmost(window):
try:
window.toggle_topmost()
except NotImplementedError:
print('This OS/guilib does not yet have "topmost" feature.')
7 changes: 5 additions & 2 deletions webview/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ def _create_children(other_windows):

def create_window(title, url=None, html=None, js_api=None, width=800, height=600, x=None, y=None,
resizable=True, fullscreen=False, min_size=(200, 100), hidden=False, frameless=False,
minimized=False, confirm_close=False, background_color='#FFFFFF', text_select=False):
minimized=False, topmost=False, confirm_close=False, background_color='#FFFFFF',
text_select=False):
"""
Create a web view window using a native GUI. The execution blocks after this function is invoked, so other
program logic must be executed in a separate thread.
Expand All @@ -117,6 +118,7 @@ def create_window(title, url=None, html=None, js_api=None, width=800, height=600
:param hidden: Whether the window should be hidden.
:param frameless: Whether the window should have a frame.
:param minimized: Display window minimized
:param topmost: Keep window above other windows (required OS: Windows)
:param confirm_close: Display a window close confirmation dialog. Default is False
:param background_color: Background color as a hex string that is displayed before the content of webview is loaded. Default is white.
:param text_select: Allow text selection on page. Default is False.
Expand All @@ -131,7 +133,8 @@ def create_window(title, url=None, html=None, js_api=None, width=800, height=600

window = Window(uid, make_unicode(title), transform_url(url), html,
width, height, x, y, resizable, fullscreen, min_size, hidden, frameless,
minimized, confirm_close, background_color, js_api, text_select)
minimized, topmost, confirm_close, background_color, js_api,
text_select)
windows.append(window)

if threading.current_thread().name != 'MainThread' and guilib:
Expand Down
4 changes: 4 additions & 0 deletions webview/platforms/cocoa.py
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,10 @@ def toggle_fullscreen(uid):
BrowserView.instances[uid].toggle_fullscreen()


def toggle_topmost(uid):
raise NotImplementedError('toggle_topmost is not yet implemented for cocoa.')


def resize(width, height, uid):
BrowserView.instances[uid].resize(width, height)

Expand Down
6 changes: 6 additions & 0 deletions webview/platforms/gtk.py
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,12 @@ def _toggle_fullscreen():
glib.idle_add(_toggle_fullscreen)


def toggle_topmost(uid):
def _toggle_topmost():
raise NotImplementedError('toggle_topmost is not yet implemented for gtk.')
glib.idle_add(_toggle_topmost)


def resize(width, height, uid):
def _resize():
BrowserView.instances[uid].resize(width,height)
Expand Down
4 changes: 4 additions & 0 deletions webview/platforms/qt.py
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,10 @@ def toggle_fullscreen(uid):
BrowserView.instances[uid].toggle_fullscreen()


def toggle_topmost(uid):
raise NotImplementedError('toggle_topmost is not yet implemented for qt.')


def resize(width, height, uid):
BrowserView.instances[uid].resize_(width, height)

Expand Down
21 changes: 21 additions & 0 deletions webview/platforms/winforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,10 @@ def __init__(self, window):
self.frameless = window.frameless
self.FormBorderStyle = 0

self.is_topmost = False
if window.topmost:
self.toggle_topmost()

if is_cef:
CEF.create_browser(window, self.Handle.ToInt32(), BrowserView.alert)
elif is_edge:
Expand Down Expand Up @@ -491,6 +495,18 @@ def _toggle():
else:
_toggle()

def toggle_topmost(self):
def _toggle():
if not self.is_topmost:
self.TopMost = True
else:
self.TopMost = False

if self.InvokeRequired:
self.Invoke(Func[Type](_toggle))
else:
_toggle()

def resize(self, width, height):
windll.user32.SetWindowPos(self.Handle.ToInt32(), None, self.Location.X, self.Location.Y,
width, height, 64)
Expand Down Expand Up @@ -767,6 +783,11 @@ def toggle_fullscreen(uid):
window.toggle_fullscreen()


def toggle_topmost(uid):
window = BrowserView.instances[uid]
window.toggle_topmost()


def resize(width, height, uid):
window = BrowserView.instances[uid]
window.resize(width, height)
Expand Down
12 changes: 10 additions & 2 deletions webview/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ def _loaded_call(function):

class Window:
def __init__(self, uid, title, url, html, width, height, x, y, resizable, fullscreen,
min_size, hidden, frameless, minimized, confirm_close, background_color,
js_api, text_select):
min_size, hidden, frameless, minimized, topmost, confirm_close,
background_color, js_api, text_select):
self.uid = uid
self.title = make_unicode(title)
self.url = None if html else transform_url(url)
Expand All @@ -64,6 +64,7 @@ def __init__(self, uid, title, url, html, width, height, x, y, resizable, fullsc
self.frameless = frameless
self.hidden = hidden
self.minimized = minimized
self.topmost = topmost

self._js_api = js_api
self._functions = {}
Expand Down Expand Up @@ -248,6 +249,13 @@ def toggle_fullscreen(self):
"""
self.gui.toggle_fullscreen(self.uid)

@_shown_call
def toggle_topmost(self):
"""
Toggle topmost mode
"""
self.gui.toggle_topmost(self.uid)

@_shown_call
def move(self, x, y):
"""
Expand Down

0 comments on commit d773580

Please sign in to comment.