Skip to content

Commit 4bd7096

Browse files
committed
feat: support topmost.(windows&linux)
1 parent a5ce2e2 commit 4bd7096

File tree

11 files changed

+291
-202
lines changed

11 files changed

+291
-202
lines changed

bitsdojo_window_linux/lib/src/native_api.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ typedef Void TSetWindowTitle(IntPtr window, Pointer<Utf8> title);
9393
typedef DSetWindowTitle = void Function(int window, Pointer<Utf8> title);
9494
final DSetWindowTitle setWindowTitle = _theAPI.ref.setWindowTitle.asFunction();
9595

96+
// setTopmost
97+
typedef Void TSetTopmost(IntPtr window, Int32 topmost);
98+
typedef DSetTopmost = void Function(int window, int topmost);
99+
final DSetTopmost setTopmost = _theAPI.ref.setTopMost.asFunction();
100+
96101
class BDWAPI extends Struct {
97102
external Pointer<NativeFunction<TGetAppWindowHandle>> getAppWindowHandle;
98103
external Pointer<NativeFunction<TGetScreenRect>> getScreenRect;
@@ -110,6 +115,7 @@ class BDWAPI extends Struct {
110115
external Pointer<NativeFunction<TMaximizeWindow>> maximizeWindow;
111116
external Pointer<NativeFunction<TUnmaximizeWindow>> unmaximizeWindow;
112117
external Pointer<NativeFunction<TSetWindowTitle>> setWindowTitle;
118+
external Pointer<NativeFunction<TSetTopmost>> setTopMost;
113119
}
114120

115121
typedef Pointer<BDWAPI> TBitsdojoWindowAPI();

bitsdojo_window_linux/lib/src/window.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@ class GtkWindow extends DesktopWindow {
201201
handle!, _maxSize!.width.toInt(), _maxSize!.height.toInt());
202202
}
203203

204+
@override
205+
set topmost(bool topmost) {
206+
if (!isValidHandle(handle, "set topmost")) return;
207+
native.setTopmost(handle!, topmost ? 1 : 0);
208+
}
209+
204210
@override
205211
set size(Size newSize) {
206212
if (!isValidHandle(handle, "set size")) return;

bitsdojo_window_linux/linux/api.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ BDWAPI _theAPI = {
1818
minimizeWindow,
1919
maximizeWindow,
2020
unmaximizeWindow,
21-
setWindowTitle
21+
setWindowTitle,
22+
setTopmost
2223
};
2324

2425
} // namespace bitsdojo_window

bitsdojo_window_linux/linux/api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ typedef struct _BDWAPI {
2626
TMaximizeWindow maximizeWindow;
2727
TUnmaximizeWindow unmaximizeWindow;
2828
TSetWindowTitle setWindowTitle;
29+
TSetTopmost setTopmost;
2930
} BDWAPI;
3031

3132
} // namespace bitsdojo_window

bitsdojo_window_linux/linux/api_impl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,8 @@ void setWindowTitle(GtkWindow* window, const gchar* title) {
209209
g_idle_add_full(G_PRIORITY_HIGH_IDLE, setWindowTitleProc, params, NULL);
210210
}
211211

212+
void setTopmost(GtkWindow* window, int topmost){
213+
gtk_window_set_keep_above(topmost == 1 ? TRUE : FALSE);
214+
}
215+
212216
} // namespace bitsdojo_window

bitsdojo_window_linux/linux/api_impl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ namespace bitsdojo_window {
4949

5050
typedef void (*TSetWindowTitle)(GtkWindow*, const gchar *);
5151
void setWindowTitle(GtkWindow* window, const gchar *title);
52+
53+
typedef void (*TSetTopmost)(GtkWindow*, int);
54+
void setTopmost(GtkWindow* window,int topmost);
5255
}
5356

5457
#endif // _BDW_API_IMPL_

bitsdojo_window_macos/lib/src/window.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,10 @@ class MacOSWindow extends DesktopWindow {
238238
if (!isValidHandle(handle, "maximizeOrRestore")) return;
239239
maximizeOrRestoreWindow(handle!);
240240
}
241+
242+
@override
243+
set topmost(bool topmost) {
244+
// TODO: implement topmost
245+
throw UnimplementedError();
246+
}
241247
}

bitsdojo_window_platform_interface/lib/window.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ abstract class DesktopWindow {
1818
set minSize(Size? newSize);
1919
set maxSize(Size? newSize);
2020

21+
set topmost(bool topmost);
22+
2123
Alignment? get alignment;
2224
set alignment(Alignment? newAlignment);
2325

bitsdojo_window_platform_interface/lib/window_not_implemented.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ class NotImplementedWindow extends DesktopWindow {
3939
throw UnimplementedError('maxSize setter has not been implemented.');
4040
}
4141

42+
set topmost(bool toomost) {
43+
throw UnimplementedError('topmost setter has not been implemented.');
44+
}
45+
4246
Alignment get alignment {
4347
throw UnimplementedError('alignment getter has not been implemented.');
4448
}

bitsdojo_window_windows/lib/src/window.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,11 @@ class WinWindow extends WinDesktopWindow {
293293
void startDragging() {
294294
BitsdojoWindowPlatform.instance.dragAppWindow();
295295
}
296+
297+
@override
298+
set topmost(bool topmost) {
299+
if (!isValidHandle(handle, "topmost")) return;
300+
301+
PostMessage(handle!, WM_USER + 1, topmost ? 1 : 0, 0);
302+
}
296303
}

0 commit comments

Comments
 (0)