2022-05-23 16:25:55 +08:00
# include "my_application.h"
# include <flutter_linux/flutter_linux.h>
# ifdef GDK_WINDOWING_X11
# include <gdk/gdkx.h>
# endif
# include "flutter/generated_plugin_registrant.h"
struct _MyApplication {
GtkApplication parent_instance ;
char * * dart_entrypoint_arguments ;
} ;
G_DEFINE_TYPE ( MyApplication , my_application , GTK_TYPE_APPLICATION )
// Implements GApplication::activate.
static void my_application_activate ( GApplication * application ) {
MyApplication * self = MY_APPLICATION ( application ) ;
GtkWindow * window =
GTK_WINDOW ( gtk_application_window_new ( GTK_APPLICATION ( application ) ) ) ;
2022-09-05 14:00:40 +08:00
// we have custom window frame
gtk_window_set_decorated ( window , FALSE ) ;
2022-05-23 16:25:55 +08:00
// Use a header bar when running in GNOME as this is the common style used
// by applications and is the setup most users will be using (e.g. Ubuntu
// desktop).
// If running on X and not using GNOME then just use a traditional title bar
// in case the window manager does more exotic layout, e.g. tiling.
// If running on Wayland assume the header bar will work (may need changing
// if future cases occur).
gboolean use_header_bar = TRUE ;
# ifdef GDK_WINDOWING_X11
GdkScreen * screen = gtk_window_get_screen ( window ) ;
if ( GDK_IS_X11_SCREEN ( screen ) ) {
const gchar * wm_name = gdk_x11_screen_get_window_manager_name ( screen ) ;
if ( g_strcmp0 ( wm_name , " GNOME Shell " ) ! = 0 ) {
use_header_bar = FALSE ;
}
}
# endif
if ( use_header_bar ) {
GtkHeaderBar * header_bar = GTK_HEADER_BAR ( gtk_header_bar_new ( ) ) ;
gtk_widget_show ( GTK_WIDGET ( header_bar ) ) ;
2022-05-30 13:25:06 +08:00
gtk_header_bar_set_title ( header_bar , " rustdesk " ) ;
2022-05-23 16:25:55 +08:00
gtk_header_bar_set_show_close_button ( header_bar , TRUE ) ;
gtk_window_set_titlebar ( window , GTK_WIDGET ( header_bar ) ) ;
} else {
2022-05-30 13:25:06 +08:00
gtk_window_set_title ( window , " rustdesk " ) ;
2022-05-23 16:25:55 +08:00
}
2022-08-18 09:51:19 +08:00
// auto bdw = bitsdojo_window_from(window); // <--- add this line
// bdw->setCustomFrame(true); // <-- add this line
2022-09-20 19:31:32 +08:00
gtk_window_set_default_size ( window , 800 , 600 ) ; // <-- comment this line
2022-05-23 16:25:55 +08:00
gtk_widget_show ( GTK_WIDGET ( window ) ) ;
2022-09-26 17:56:32 +08:00
gtk_widget_set_opacity ( GTK_WIDGET ( window ) , 0 ) ;
2022-05-23 16:25:55 +08:00
g_autoptr ( FlDartProject ) project = fl_dart_project_new ( ) ;
fl_dart_project_set_dart_entrypoint_arguments ( project , self - > dart_entrypoint_arguments ) ;
FlView * view = fl_view_new ( project ) ;
gtk_widget_show ( GTK_WIDGET ( view ) ) ;
2022-09-23 16:37:17 +08:00
auto border_frame = gtk_frame_new ( nullptr ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( border_frame ) , GTK_SHADOW_ETCHED_IN ) ;
gtk_container_add ( GTK_CONTAINER ( border_frame ) , GTK_WIDGET ( view ) ) ;
gtk_widget_show ( GTK_WIDGET ( border_frame ) ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , GTK_WIDGET ( border_frame ) ) ;
2022-05-23 16:25:55 +08:00
fl_register_plugins ( FL_PLUGIN_REGISTRY ( view ) ) ;
gtk_widget_grab_focus ( GTK_WIDGET ( view ) ) ;
}
// Implements GApplication::local_command_line.
static gboolean my_application_local_command_line ( GApplication * application , gchar * * * arguments , int * exit_status ) {
MyApplication * self = MY_APPLICATION ( application ) ;
// Strip out the first argument as it is the binary name.
self - > dart_entrypoint_arguments = g_strdupv ( * arguments + 1 ) ;
g_autoptr ( GError ) error = nullptr ;
if ( ! g_application_register ( application , nullptr , & error ) ) {
g_warning ( " Failed to register: %s " , error - > message ) ;
* exit_status = 1 ;
return TRUE ;
}
g_application_activate ( application ) ;
* exit_status = 0 ;
return TRUE ;
}
// Implements GObject::dispose.
static void my_application_dispose ( GObject * object ) {
MyApplication * self = MY_APPLICATION ( object ) ;
g_clear_pointer ( & self - > dart_entrypoint_arguments , g_strfreev ) ;
G_OBJECT_CLASS ( my_application_parent_class ) - > dispose ( object ) ;
}
static void my_application_class_init ( MyApplicationClass * klass ) {
G_APPLICATION_CLASS ( klass ) - > activate = my_application_activate ;
G_APPLICATION_CLASS ( klass ) - > local_command_line = my_application_local_command_line ;
G_OBJECT_CLASS ( klass ) - > dispose = my_application_dispose ;
}
static void my_application_init ( MyApplication * self ) { }
MyApplication * my_application_new ( ) {
return MY_APPLICATION ( g_object_new ( my_application_get_type ( ) ,
" application-id " , APPLICATION_ID ,
" flags " , G_APPLICATION_NON_UNIQUE ,
nullptr ) ) ;
}