Skip to content

Commit 539462c

Browse files
committed
Linux GTK WebKit Transparent
1 parent fc3a965 commit 539462c

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

src/webui.c

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@ typedef struct webui_event_inf_t {
213213
typedef void (*gtk_window_set_resizable_func)(void *, int);
214214
typedef void (*gtk_window_set_position_func)(void *, int);
215215
typedef unsigned long (*g_signal_connect_data_func)(void *, const char *, void (*callback)(void), void *, void *, int);
216+
typedef void (*gtk_widget_set_visual_func)(void *, void *);
217+
typedef void *(*gtk_widget_get_screen_func)(void *);
218+
typedef void *(*gdk_screen_get_rgba_visual_func)(void *);
219+
typedef void (*gtk_widget_set_app_paintable_func)(void *, int);
216220
// GTK Symbol Initialization
217221
static gtk_init_func gtk_init = NULL;
218222
static gtk_widget_show_all_func gtk_widget_show_all = NULL;
@@ -236,6 +240,10 @@ typedef struct webui_event_inf_t {
236240
static gtk_window_set_position_func gtk_window_set_position = NULL;
237241
static g_signal_connect_data_func g_signal_connect_data = NULL;
238242
static g_idle_add_func g_idle_add = NULL;
243+
static gtk_widget_set_visual_func gtk_widget_set_visual = NULL;
244+
static gtk_widget_get_screen_func gtk_widget_get_screen = NULL;
245+
static gdk_screen_get_rgba_visual_func gdk_screen_get_rgba_visual = NULL;
246+
static gtk_widget_set_app_paintable_func gtk_widget_set_app_paintable = NULL;
239247
// GTK Structs
240248
typedef struct {
241249
int x;
@@ -251,13 +259,15 @@ typedef struct webui_event_inf_t {
251259
typedef int (*webkit_1ptr_arg_2int_func)(void *);
252260
typedef void *(*webkit_1ptr_arg_2ptr_func)(void *);
253261
typedef const char *(*webkit_1ptr_arg_2str_func)(void *);
262+
typedef void (*webkit_web_view_set_background_color_func)(void *, void *);
254263
static webkit_web_view_new_func webkit_web_view_new = NULL;
255264
static webkit_web_view_load_uri_func webkit_web_view_load_uri = NULL;
256265
static webkit_web_view_get_title_func webkit_web_view_get_title = NULL;
257266
static webkit_1ptr_arg_func webkit_policy_decision_ignore = NULL;
258267
static webkit_1ptr_arg_2int_func webkit_navigation_policy_decision_get_navigation_type = NULL;
259268
static webkit_1ptr_arg_2ptr_func webkit_navigation_policy_decision_get_request = NULL;
260269
static webkit_1ptr_arg_2str_func webkit_uri_request_get_uri = NULL;
270+
static webkit_web_view_set_background_color_func webkit_web_view_set_background_color = NULL;
261271

262272
typedef struct _webui_wv_linux_t {
263273
// Linux WebView
@@ -12116,9 +12126,38 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
1211612126
// Initialize GTK Window
1211712127
win->webView->gtk_win = gtk_window_new(0);
1211812128

12129+
// GTK transparent window
12130+
if (win->transparent) {
12131+
// Enable transparency if the APIs are available
12132+
if (gtk_widget_set_visual && gtk_widget_get_screen && gdk_screen_get_rgba_visual) {
12133+
void* screen = gtk_widget_get_screen(win->webView->gtk_win);
12134+
if (screen) {
12135+
void* visual = gdk_screen_get_rgba_visual(screen);
12136+
if (visual) {
12137+
gtk_widget_set_visual(win->webView->gtk_win, visual);
12138+
}
12139+
}
12140+
}
12141+
// Enable app paintable for transparency
12142+
if (gtk_widget_set_app_paintable) {
12143+
gtk_widget_set_app_paintable(win->webView->gtk_win, 1);
12144+
}
12145+
}
12146+
1211912147
// Initialize WebView
1212012148
win->webView->gtk_wv = webkit_web_view_new();
1212112149

12150+
// WebView transparent
12151+
if (win->transparent && webkit_web_view_set_background_color) {
12152+
struct {
12153+
double red;
12154+
double green;
12155+
double blue;
12156+
double alpha;
12157+
} transparent_color = {0.0, 0.0, 0.0, 0.0};
12158+
webkit_web_view_set_background_color(win->webView->gtk_wv, &transparent_color);
12159+
}
12160+
1212212161
// Window Settings
1212312162
gtk_window_set_default_size(win->webView->gtk_win, win->webView->width, win->webView->height);
1212412163
gtk_container_add(win->webView->gtk_win, win->webView->gtk_wv);
@@ -12289,7 +12328,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
1228912328
libgtk, "g_signal_connect_data");
1229012329
g_idle_add = (g_idle_add_func)dlsym(
1229112330
libgtk, "g_idle_add");
12292-
12331+
gtk_widget_set_visual = (gtk_widget_set_visual_func)dlsym(
12332+
libgtk, "gtk_widget_set_visual");
12333+
gtk_widget_get_screen = (gtk_widget_get_screen_func)dlsym(
12334+
libgtk, "gtk_widget_get_screen");
12335+
gdk_screen_get_rgba_visual = (gdk_screen_get_rgba_visual_func)dlsym(
12336+
libgtk, "gdk_screen_get_rgba_visual");
12337+
gtk_widget_set_app_paintable = (gtk_widget_set_app_paintable_func)dlsym(
12338+
libgtk, "gtk_widget_set_app_paintable");
12339+
1229312340
// WebView Symbol Addresses
1229412341
webkit_web_view_new = (webkit_web_view_new_func)dlsym(
1229512342
libwebkit, "webkit_web_view_new");
@@ -12305,6 +12352,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
1230512352
libwebkit, "webkit_navigation_policy_decision_get_request");
1230612353
webkit_uri_request_get_uri = (webkit_1ptr_arg_2str_func)dlsym(
1230712354
libwebkit, "webkit_uri_request_get_uri");
12355+
webkit_web_view_set_background_color = (webkit_web_view_set_background_color_func)dlsym(
12356+
libwebkit, "webkit_web_view_set_background_color");
1230812357

1230912358
// Check GTK
1231012359
if (

0 commit comments

Comments
 (0)