Blame SOURCES/0001-Related-rhbz-919070-display-1-means-span-all-display.patch

2135ec
From eb27eda272dd9fe6dfa4ebcfef24069bd117e5b3 Mon Sep 17 00:00:00 2001
2135ec
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
2135ec
Date: Fri, 18 Oct 2013 10:04:45 +0100
2135ec
Subject: [PATCH] Related: rhbz#919070 display -1 means span all displays
2135ec
2135ec
So try to set size to full "screen" size. most window managers
2135ec
will ignore this however unless _NET_WM_FULLSCREEN_MONITORS is
2135ec
set, Under gtk3 we can use gdk_window_set_fullscreen_mode to
2135ec
do that. Its effectively impractical for LibreOffice to itself
2135ec
calculate the right parameters for _NET_WM_FULLSCREEN_MONITORS
2135ec
as far as I can see
2135ec
2135ec
Change-Id: Ia725f21048bfcec3dbf1478b4303ccd9cfec0b36
2135ec
(cherry picked from commit a8dd794356cb62480b2dc12504ad9e0158a0b583)
2135ec
2135ec
Resolves: rhbz#919070 offload set span-all-displays to a gtk3 utility
2135ec
2135ec
Jaw dropping hack to set a slideshow to span all
2135ec
monitors if gtk3 is available at runtime
2135ec
2135ec
(cherry picked from commit 14bb85e0a3d95419c484bfa23881f03c54031c5d)
2135ec
2135ec
Conflicts:
2135ec
	Repository.mk
2135ec
2135ec
Change-Id: I363f63c9855d5cb1f92d65d0b34add0c60f7263c
2135ec
2135ec
missing .mk
2135ec
2135ec
Change-Id: I923153579d6cc50354450a5b3a55ecc133ae5e41
2135ec
(cherry picked from commit 2d3dd8594ee3e43fcf9a65887f90d187a4393297)
2135ec
2135ec
move xid-fullscreen into gnome package
2135ec
2135ec
Change-Id: I2ad0838a12ce06b2c6e77b7f55cdc2cd0627a38b
2135ec
(cherry picked from commit 9c1170b25a9fab13084d2677aa4fc986db5ab675)
2135ec
2135ec
pScreen uninitialized
2135ec
2135ec
Change-Id: I244c3b5a949ae5c8a5bf46d1b58439e080b2c848
2135ec
(cherry picked from commit 1b4aa55ecd7b2c3f6e0d281642d0ed0a066dec69)
2135ec
---
2135ec
 Repository.mk                                      |   3 +
2135ec
 scp2/source/gnome/module_gnome.scp                 |   3 +-
2135ec
 scp2/source/ooo/file_library_ooo.scp               |  10 ++
2135ec
 vcl/Executable_xid_fullscreen_on_all_monitors.mk   |  20 +++
2135ec
 vcl/Module_vcl.mk                                  |   1 +
2135ec
 vcl/inc/unx/gtk/gtkframe.hxx                       |   1 +
2135ec
 vcl/unx/gtk/window/gtksalframe.cxx                 | 134 ++++++++++++++++-----
2135ec
 .../gtk/window/xid_fullscreen_on_all_monitors.c    |  99 +++++++++++++++
2135ec
 8 files changed, 243 insertions(+), 28 deletions(-)
2135ec
 create mode 100644 vcl/Executable_xid_fullscreen_on_all_monitors.mk
2135ec
 create mode 100644 vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c
2135ec
2135ec
diff --git a/Repository.mk b/Repository.mk
2135ec
index e0d4d7c..99278bc 100644
2135ec
--- a/Repository.mk
2135ec
+++ b/Repository.mk
2135ec
@@ -89,6 +89,9 @@ endif
2135ec
 $(eval $(call gb_Helper_register_executables,OOO, \
2135ec
     gnome-open-url.bin \
2135ec
     spadmin.bin \
2135ec
+    $(if $(filter $(GUIBASE)$(ENABLE_GTK),unxTRUE), \
2135ec
+        xid-fullscreen-on-all-monitors \
2135ec
+    ) \
2135ec
 	$(if $(filter $(GUIBASE)$(ENABLE_TDE),unxTRUE), \
2135ec
 		tdefilepicker \
2135ec
 	) \
2135ec
diff --git a/scp2/source/gnome/module_gnome.scp b/scp2/source/gnome/module_gnome.scp
2135ec
index e8a22bf..75214d5 100644
2135ec
--- a/scp2/source/gnome/module_gnome.scp
2135ec
+++ b/scp2/source/gnome/module_gnome.scp
2135ec
@@ -34,7 +34,8 @@ Module gid_Module_Optional_Gnome
2135ec
       gid_File_Share_Registry_Gnome_Xcd,
2135ec
 #endif
2135ec
       gid_File_Bin_Gnome_Open_Url,
2135ec
-      gid_File_Bin_Gnome_Open_Url_Bin
2135ec
+      gid_File_Bin_Gnome_Open_Url_Bin,
2135ec
+      gid_File_Bin_XidFullscreen
2135ec
     );
2135ec
 End
2135ec
 
2135ec
diff --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp
2135ec
index 36ec8d4..417f483 100644
2135ec
--- a/scp2/source/ooo/file_library_ooo.scp
2135ec
+++ b/scp2/source/ooo/file_library_ooo.scp
2135ec
@@ -343,6 +343,16 @@ File gid_File_Bin_KdeFilePicker
2135ec
     Name = "kdefilepicker";
2135ec
 End
2135ec
 #endif
2135ec
+
2135ec
+#ifdef ENABLE_GTK
2135ec
+File gid_File_Bin_XidFullscreen
2135ec
+    BIN_FILE_BODY;
2135ec
+    Styles = (PACKED);
2135ec
+    Dir = gid_Brand_Dir_Program;
2135ec
+    Name = "xid-fullscreen-on-all-monitors";
2135ec
+End
2135ec
+#endif
2135ec
+
2135ec
 #endif
2135ec
 
2135ec
 #ifdef MACOSX
2135ec
diff --git a/vcl/Executable_xid_fullscreen_on_all_monitors.mk b/vcl/Executable_xid_fullscreen_on_all_monitors.mk
2135ec
new file mode 100644
2135ec
index 0000000..5f9c127
2135ec
--- /dev/null
2135ec
+++ b/vcl/Executable_xid_fullscreen_on_all_monitors.mk
2135ec
@@ -0,0 +1,20 @@
2135ec
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
2135ec
+#
2135ec
+# This file is part of the LibreOffice project.
2135ec
+#
2135ec
+# This Source Code Form is subject to the terms of the Mozilla Public
2135ec
+# License, v. 2.0. If a copy of the MPL was not distributed with this
2135ec
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
2135ec
+#
2135ec
+
2135ec
+$(eval $(call gb_Executable_Executable,xid-fullscreen-on-all-monitors))
2135ec
+
2135ec
+$(eval $(call gb_Executable_add_libs,xid-fullscreen-on-all-monitors,\
2135ec
+    -ldl \
2135ec
+))
2135ec
+
2135ec
+$(eval $(call gb_Executable_add_cobjects,xid-fullscreen-on-all-monitors,\
2135ec
+    vcl/unx/gtk/window/xid_fullscreen_on_all_monitors \
2135ec
+))
2135ec
+
2135ec
+# vim: set noet sw=4 ts=4:
2135ec
diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk
2135ec
index fd2be4c5..47031b3 100644
2135ec
--- a/vcl/Module_vcl.mk
2135ec
+++ b/vcl/Module_vcl.mk
2135ec
@@ -39,6 +39,7 @@ $(eval $(call gb_Module_add_targets,vcl,\
2135ec
 
2135ec
 ifneq ($(ENABLE_GTK),)
2135ec
 $(eval $(call gb_Module_add_targets,vcl,\
2135ec
+    Executable_xid_fullscreen_on_all_monitors \
2135ec
     Library_vclplug_gtk \
2135ec
 ))
2135ec
 endif
2135ec
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
2135ec
index c3ea919..3edd2cb 100644
2135ec
--- a/vcl/inc/unx/gtk/gtkframe.hxx
2135ec
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
2135ec
@@ -196,6 +196,7 @@ class GtkSalFrame : public SalFrame
2135ec
     guint                           m_nGSMCookie;
2135ec
     int                             m_nWorkArea;
2135ec
     bool                            m_bFullscreen;
2135ec
+    bool                            m_bSpanMonitorsWhenFullscreen;
2135ec
     bool                            m_bDefaultPos;
2135ec
     bool                            m_bDefaultSize;
2135ec
     bool                            m_bSendModChangeOnRelease;
2135ec
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
2135ec
index fef8407..4a3d01c 100644
2135ec
--- a/vcl/unx/gtk/window/gtksalframe.cxx
2135ec
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
2135ec
@@ -29,6 +29,9 @@
2135ec
 #include <generic/genprn.h>
2135ec
 #include <generic/geninst.h>
2135ec
 #include <headless/svpgdi.hxx>
2135ec
+#include <osl/file.hxx>
2135ec
+#include <rtl/bootstrap.hxx>
2135ec
+#include <rtl/process.h>
2135ec
 #include <vcl/floatwin.hxx>
2135ec
 #include <vcl/svapp.hxx>
2135ec
 #include <vcl/window.hxx>
2135ec
@@ -814,6 +819,7 @@ void GtkSalFrame::InitCommon()
2135ec
     m_pCurrentCursor    = NULL;
2135ec
     m_nKeyModifiers     = 0;
2135ec
     m_bFullscreen       = false;
2135ec
+    m_bSpanMonitorsWhenFullscreen = false;
2135ec
     m_nState            = GDK_WINDOW_STATE_WITHDRAWN;
2135ec
     m_nVisibility       = GDK_VISIBILITY_FULLY_OBSCURED;
2135ec
     m_bSendModChangeOnRelease = false;
2135ec
@@ -2045,43 +2051,68 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz
2135ec
     if (maGeometry.nDisplayScreenNumber == nNewScreen && eType == SET_RETAIN_SIZE)
2135ec
         return;
2135ec
 
2135ec
-    gint nMonitor;
2135ec
-    bool bSameMonitor = false;
2135ec
-    GdkScreen *pScreen = getDisplay()->getSystem()->getScreenMonitorFromIdx( nNewScreen, nMonitor );
2135ec
-    if (!pScreen)
2135ec
+    GdkScreen *pScreen = NULL;
2135ec
+    GdkRectangle aNewMonitor;
2135ec
+
2135ec
+    bool bSpanAllScreens = nNewScreen == (unsigned int)-1;
2135ec
+    m_bSpanMonitorsWhenFullscreen = bSpanAllScreens && getDisplay()->getSystem()->GetDisplayScreenCount() > 1;
2135ec
+
2135ec
+    if (m_bSpanMonitorsWhenFullscreen)   //span all screens
2135ec
     {
2135ec
-        g_warning ("Attempt to move GtkSalFrame to invalid screen %d => "
2135ec
-                   "fallback to current\n", nNewScreen);
2135ec
         pScreen = gtk_widget_get_screen( m_pWindow );
2135ec
-        bSameMonitor = true;
2135ec
+        aNewMonitor.x = 0;
2135ec
+        aNewMonitor.y = 0;
2135ec
+        aNewMonitor.width = gdk_screen_get_width(pScreen);
2135ec
+        aNewMonitor.height = gdk_screen_get_height(pScreen);
2135ec
     }
2135ec
+    else
2135ec
+    {
2135ec
+        gint nMonitor;
2135ec
+        bool bSameMonitor = false;
2135ec
 
2135ec
-    // Heavy lifting, need to move screen ...
2135ec
-    if( pScreen != gtk_widget_get_screen( m_pWindow ))
2135ec
-        gtk_window_set_screen( GTK_WINDOW( m_pWindow ), pScreen );
2135ec
+        if (!bSpanAllScreens)
2135ec
+        {
2135ec
+            pScreen = getDisplay()->getSystem()->getScreenMonitorFromIdx( nNewScreen, nMonitor );
2135ec
+            if (!pScreen)
2135ec
+            {
2135ec
+                g_warning ("Attempt to move GtkSalFrame to invalid screen %d => "
2135ec
+                           "fallback to current\n", nNewScreen);
2135ec
+            }
2135ec
+        }
2135ec
 
2135ec
-    gint nOldMonitor = gdk_screen_get_monitor_at_window(
2135ec
-                            pScreen, widget_get_window( m_pWindow ) );
2135ec
-    if (bSameMonitor)
2135ec
-        nMonitor = nOldMonitor;
2135ec
+        if (!pScreen)
2135ec
+        {
2135ec
+            pScreen = gtk_widget_get_screen( m_pWindow );
2135ec
+            bSameMonitor = true;
2135ec
+        }
2135ec
 
2135ec
-#if OSL_DEBUG_LEVEL > 1
2135ec
-    if( nMonitor == nOldMonitor )
2135ec
-        g_warning( "An apparently pointless SetScreen - should we elide it ?" );
2135ec
-#endif
2135ec
+        // Heavy lifting, need to move screen ...
2135ec
+        if( pScreen != gtk_widget_get_screen( m_pWindow ))
2135ec
+            gtk_window_set_screen( GTK_WINDOW( m_pWindow ), pScreen );
2135ec
+
2135ec
+        gint nOldMonitor = gdk_screen_get_monitor_at_window(
2135ec
+                                pScreen, widget_get_window( m_pWindow ) );
2135ec
+        if (bSameMonitor)
2135ec
+            nMonitor = nOldMonitor;
2135ec
 
2135ec
-    GdkRectangle aOldMonitor, aNewMonitor;
2135ec
-    gdk_screen_get_monitor_geometry( pScreen, nOldMonitor, &aOldMonitor );
2135ec
-    gdk_screen_get_monitor_geometry( pScreen, nMonitor, &aNewMonitor );
2135ec
+    #if OSL_DEBUG_LEVEL > 1
2135ec
+        if( nMonitor == nOldMonitor )
2135ec
+            g_warning( "An apparently pointless SetScreen - should we elide it ?" );
2135ec
+    #endif
2135ec
+
2135ec
+        GdkRectangle aOldMonitor;
2135ec
+        gdk_screen_get_monitor_geometry( pScreen, nOldMonitor, &aOldMonitor );
2135ec
+        gdk_screen_get_monitor_geometry( pScreen, nMonitor, &aNewMonitor );
2135ec
+
2135ec
+        maGeometry.nX = aNewMonitor.x + maGeometry.nX - aOldMonitor.x;
2135ec
+        maGeometry.nY = aNewMonitor.y + maGeometry.nY - aOldMonitor.y;
2135ec
+    }
2135ec
 
2135ec
     bool bResize = false;
2135ec
     bool bVisible = IS_WIDGET_MAPPED( m_pWindow );
2135ec
     if( bVisible )
2135ec
         Show( sal_False );
2135ec
 
2135ec
-    maGeometry.nX = aNewMonitor.x + maGeometry.nX - aOldMonitor.x;
2135ec
-    maGeometry.nY = aNewMonitor.y + maGeometry.nY - aOldMonitor.y;
2135ec
-
2135ec
     if( eType == SET_FULLSCREEN )
2135ec
     {
2135ec
         maGeometry.nX = aNewMonitor.x;
2135ec
@@ -2093,8 +2124,8 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz
2135ec
 
2135ec
         // #i110881# for the benefit of compiz set a max size here
2135ec
         // else setting to fullscreen fails for unknown reasons
2135ec
-        m_aMaxSize.Width() = aNewMonitor.width+100;
2135ec
-        m_aMaxSize.Height() = aNewMonitor.height+100;
2135ec
+        m_aMaxSize.Width() = aNewMonitor.width;
2135ec
+        m_aMaxSize.Height() = aNewMonitor.height;
2135ec
     }
2135ec
 
2135ec
     if( pSize && eType == SET_UN_FULLSCREEN )
2135ec
@@ -2119,14 +2150,19 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz
2135ec
 
2135ec
 #if !GTK_CHECK_VERSION(3,0,0)
2135ec
     // _NET_WM_STATE_FULLSCREEN (Metacity <-> KWin)
2135ec
-    if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() )
2135ec
+   if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() )
2135ec
 #endif
2135ec
     {
2135ec
+#if GTK_CHECK_VERSION(3,8,0)
2135ec
+        gdk_window_set_fullscreen_mode( gtk_widget_get_window(m_pWindow), m_bSpanMonitorsWhenFullscreen
2135ec
+            ? GDK_FULLSCREEN_ON_ALL_MONITORS : GDK_FULLSCREEN_ON_CURRENT_MONITOR );
2135ec
+#endif
2135ec
         if( eType == SET_FULLSCREEN )
2135ec
             gtk_window_fullscreen( GTK_WINDOW( m_pWindow ) );
2135ec
         else if( eType == SET_UN_FULLSCREEN )
2135ec
             gtk_window_unfullscreen( GTK_WINDOW( m_pWindow ) );
2135ec
     }
2135ec
+
2135ec
     if( eType == SET_UN_FULLSCREEN &&
2135ec
         !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) )
2135ec
         gtk_window_set_resizable( GTK_WINDOW( m_pWindow ), FALSE );
2135ec
@@ -3339,10 +3375,54 @@ gboolean GtkSalFrame::signalFocus( GtkWidget*, GdkEventFocus* pEvent, gpointer f
2135ec
     return sal_False;
2135ec
 }
2135ec
 
2135ec
+#if !GTK_CHECK_VERSION(3,8,0)
2135ec
+static OString getDisplayString()
2135ec
+{
2135ec
+    int nParams = rtl_getAppCommandArgCount();
2135ec
+    OUString aParam;
2135ec
+    for( int i = 0; i < nParams; i++ )
2135ec
+    {
2135ec
+        rtl_getAppCommandArg( i, &aParam.pData );
2135ec
+        if( i < nParams-1 && (aParam == "-display" || aParam == "--display" ) )
2135ec
+        {
2135ec
+            rtl_getAppCommandArg( i+1, &aParam.pData );
2135ec
+            return OUStringToOString( aParam, osl_getThreadTextEncoding() );
2135ec
+        }
2135ec
+    }
2135ec
+    return OString();
2135ec
+}
2135ec
+#endif
2135ec
+
2135ec
 gboolean GtkSalFrame::signalMap( GtkWidget *pWidget, GdkEvent*, gpointer frame )
2135ec
 {
2135ec
     GtkSalFrame* pThis = (GtkSalFrame*)frame;
2135ec
 
2135ec
+#if !GTK_CHECK_VERSION(3,8,0)
2135ec
+    //Spawn off a helper program that will attempt to set this fullscreen
2135ec
+    //window to span all displays.
2135ec
+    if (pThis->m_bFullscreen && pThis->m_bSpanMonitorsWhenFullscreen)
2135ec
+    {
2135ec
+        GdkWindow* gdkwin = gtk_widget_get_window(pThis->m_pWindow);
2135ec
+        if (gdkwin)
2135ec
+        {
2135ec
+            OUString sProgramURL( "$BRAND_BASE_DIR/program/xid-fullscreen-on-all-monitors");
2135ec
+            rtl::Bootstrap::expandMacros(sProgramURL);
2135ec
+            OUString sProgram;
2135ec
+            if (osl::FileBase::getSystemPathFromFileURL(sProgramURL, sProgram) == osl::File::E_None)
2135ec
+            {
2135ec
+                OString sFinalProgram(OUStringToOString(sProgram, osl_getThreadTextEncoding())
2135ec
+                    + " " + OString::number((int)GDK_WINDOW_XID(gdkwin)));
2135ec
+                OString sDisplay(getDisplayString());
2135ec
+                if (!sDisplay.isEmpty())
2135ec
+                {
2135ec
+                    sFinalProgram += "--display " + sDisplay;
2135ec
+                }
2135ec
+                system(sFinalProgram.getStr());
2135ec
+            }
2135ec
+        }
2135ec
+    }
2135ec
+#endif
2135ec
+
2135ec
     bool bSetFocus = pThis->m_bSetFocusOnMap;
2135ec
     pThis->m_bSetFocusOnMap = false;
2135ec
 
2135ec
diff --git a/vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c b/vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c
2135ec
new file mode 100644
2135ec
index 0000000..00554b1
2135ec
--- /dev/null
2135ec
+++ b/vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c
2135ec
@@ -0,0 +1,99 @@
2135ec
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2135ec
+/*
2135ec
+ * This file is part of the LibreOffice project.
2135ec
+ *
2135ec
+ * This Source Code Form is subject to the terms of the Mozilla Public
2135ec
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
2135ec
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
2135ec
+ */
2135ec
+
2135ec
+#include <dlfcn.h>
2135ec
+#include <stdlib.h>
2135ec
+
2135ec
+typedef int Window;
2135ec
+typedef union  _GdkEvent GdkEvent;
2135ec
+typedef struct _GdkWindow GdkWindow;
2135ec
+typedef struct _GdkDisplay GdkDisplay;
2135ec
+typedef struct _GdkScreen GdkScreen;
2135ec
+
2135ec
+typedef enum
2135ec
+{
2135ec
+    GDK_FULLSCREEN_ON_CURRENT_MONITOR,
2135ec
+    GDK_FULLSCREEN_ON_ALL_MONITORS
2135ec
+} GdkFullscreenMode;
2135ec
+
2135ec
+int main(int argc, char *argv[])
2135ec
+{
2135ec
+    void *handle;
2135ec
+    void (*gtk_init)(int*, char***);
2135ec
+    GdkWindow* (*gdk_x11_window_foreign_new_for_display)(GdkDisplay*, Window);
2135ec
+    GdkDisplay* (*gdk_display_get_default)(void);
2135ec
+    GdkEvent* (*gdk_event_get)(void);
2135ec
+    void (*gtk_main_do_event)(GdkEvent*);
2135ec
+    void (*gdk_event_free)(GdkEvent*);
2135ec
+    void (*gdk_window_fullscreen)(GdkWindow *);
2135ec
+    void (*gdk_window_set_fullscreen_mode)(GdkWindow *, GdkFullscreenMode);
2135ec
+
2135ec
+    GdkEvent *event;
2135ec
+    GdkWindow *window;
2135ec
+    int windowid;
2135ec
+
2135ec
+    handle = dlopen("libgtk-3.so.0", RTLD_LAZY);
2135ec
+    if( NULL == handle )
2135ec
+        return -1;
2135ec
+
2135ec
+    gtk_init = (void (*) (int*, char***))
2135ec
+        dlsym(handle, "gtk_init");
2135ec
+    gdk_x11_window_foreign_new_for_display = (GdkWindow* (*)(GdkDisplay*, Window))
2135ec
+        dlsym(handle, "gdk_x11_window_foreign_new_for_display");
2135ec
+    gdk_display_get_default = (GdkDisplay* (*)(void))
2135ec
+        dlsym(handle, "gdk_display_get_default");
2135ec
+    gdk_event_get = (GdkEvent* (*)(void))
2135ec
+        dlsym(handle, "gdk_event_get");
2135ec
+    gtk_main_do_event = (void (*)(GdkEvent*))
2135ec
+        dlsym(handle, "gtk_main_do_event");
2135ec
+    gdk_event_free = (void (*)(GdkEvent*))
2135ec
+        dlsym(handle, "gdk_event_free");
2135ec
+    gdk_window_fullscreen = (void (*)(GdkWindow *))
2135ec
+        dlsym(handle, "gdk_window_fullscreen");
2135ec
+    gdk_window_set_fullscreen_mode = (void (*)(GdkWindow *, GdkFullscreenMode))
2135ec
+        dlsym(handle, "gdk_window_set_fullscreen_mode");
2135ec
+
2135ec
+    if (!gtk_init ||
2135ec
+        !gdk_x11_window_foreign_new_for_display ||
2135ec
+        !gdk_display_get_default ||
2135ec
+        !gdk_event_get ||
2135ec
+        !gtk_main_do_event ||
2135ec
+        !gdk_event_free ||
2135ec
+        !gdk_window_fullscreen ||
2135ec
+        !gdk_window_set_fullscreen_mode)
2135ec
+    {
2135ec
+        dlclose(handle);
2135ec
+        return -1;
2135ec
+    }
2135ec
+
2135ec
+    gtk_init(&argc, &argv);
2135ec
+
2135ec
+    windowid = atoi(argv[1]);
2135ec
+
2135ec
+    window = gdk_x11_window_foreign_new_for_display(gdk_display_get_default(), windowid);
2135ec
+    if (!window)
2135ec
+    {
2135ec
+        dlclose(handle);
2135ec
+        return -1;
2135ec
+    }
2135ec
+
2135ec
+    gdk_window_set_fullscreen_mode(window, GDK_FULLSCREEN_ON_ALL_MONITORS);
2135ec
+    gdk_window_fullscreen(window);
2135ec
+
2135ec
+    while ((event = gdk_event_get()) != NULL)
2135ec
+    {
2135ec
+        gtk_main_do_event(event);
2135ec
+        gdk_event_free(event);
2135ec
+    }
2135ec
+
2135ec
+    dlclose(handle);
2135ec
+    return 0;
2135ec
+}
2135ec
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
2135ec
+
2135ec
-- 
2135ec
1.8.3.1
2135ec