* Since: UNRELEASED
**/
void
-gdk_window_fullscreen_on_monitor (GdkWindow *window,
- gint monitor)
+gdk_window_fullscreen_on_monitor (GdkWindow *window,
+ GdkMonitor *monitor)
{
- GdkDisplay *display = gdk_window_get_display (window);
-
- g_return_if_fail (monitor >= 0);
- g_return_if_fail (monitor < gdk_display_get_n_monitors (display));
+ g_return_if_fail (GDK_IS_WINDOW (window));
+ g_return_if_fail (GDK_IS_MONITOR (monitor));
+ g_return_if_fail (gdk_monitor_get_display (monitor) == gdk_window_get_display (window));
+ g_return_if_fail (gdk_monitor_is_valid (monitor));
if (GDK_WINDOW_IMPL_GET_CLASS (window->impl)->fullscreen_on_monitor != NULL)
GDK_WINDOW_IMPL_GET_CLASS (window->impl)->fullscreen_on_monitor (window, monitor);
#include <gdk/gdkdrawingcontext.h>
#include <gdk/gdkevents.h>
#include <gdk/gdkframeclock.h>
+#include <gdk/gdkmonitor.h>
G_BEGIN_DECLS
void gdk_window_fullscreen (GdkWindow *window);
GDK_AVAILABLE_IN_3_18
void gdk_window_fullscreen_on_monitor (GdkWindow *window,
- gint monitor);
+ GdkMonitor *monitor);
GDK_AVAILABLE_IN_3_8
void gdk_window_set_fullscreen_mode (GdkWindow *window,
GdkFullscreenMode mode);
void (* maximize) (GdkWindow *window);
void (* unmaximize) (GdkWindow *window);
void (* fullscreen) (GdkWindow *window);
- void (* fullscreen_on_monitor) (GdkWindow *window, gint monitor);
+ void (* fullscreen_on_monitor) (GdkWindow *window,
+ GdkMonitor *monitor);
void (* apply_fullscreen_mode) (GdkWindow *window);
void (* unfullscreen) (GdkWindow *window);
void (* set_keep_above) (GdkWindow *window,
#include "gdkinternals.h"
#include "gdkdeviceprivate.h"
#include "gdkprivate-wayland.h"
+#include "gdkmonitor-wayland.h"
#include <wayland/xdg-shell-unstable-v6-client-protocol.h>
#include <stdlib.h>
int margin_bottom;
gboolean margin_dirty;
- int initial_fullscreen_monitor;
+ struct wl_output *initial_fullscreen_output;
cairo_region_t *opaque_region;
gboolean opaque_region_dirty;
_gdk_window_impl_wayland_init (GdkWindowImplWayland *impl)
{
impl->scale = 1;
- impl->initial_fullscreen_monitor = -1;
+ impl->initial_fullscreen_output = NULL;
impl->saved_width = -1;
impl->saved_height = -1;
}
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (gdk_window_get_display (window));
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
const gchar *app_id;
- GdkDisplay *display = gdk_window_get_display (window);
- struct wl_output *fullscreen_output = NULL;
- if (impl->initial_fullscreen_monitor >= 0 &&
- impl->initial_fullscreen_monitor < gdk_display_get_n_monitors (display))
- fullscreen_output = _gdk_wayland_screen_get_wl_output (gdk_display_get_default_screen (gdk_window_get_display (window)), impl->initial_fullscreen_monitor);
impl->display_server.xdg_surface =
zxdg_shell_v6_get_xdg_surface (display_wayland->xdg_shell,
zxdg_toplevel_v6_set_maximized (impl->display_server.xdg_toplevel);
if (window->state & GDK_WINDOW_STATE_FULLSCREEN)
zxdg_toplevel_v6_set_fullscreen (impl->display_server.xdg_toplevel,
- fullscreen_output);
+ impl->initial_fullscreen_output);
+
+ impl->initial_fullscreen_output = NULL;
app_id = g_get_prgname ();
if (app_id == NULL)
}
static void
-gdk_wayland_window_fullscreen_on_monitor (GdkWindow *window, gint monitor)
+gdk_wayland_window_fullscreen_on_monitor (GdkWindow *window,
+ GdkMonitor *monitor)
{
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
GdkDisplay *display = gdk_window_get_display (window);
- GdkScreen *screen = gdk_display_get_default_screen (display);
- struct wl_output *fullscreen_output =
- _gdk_wayland_screen_get_wl_output (screen, monitor);
+ struct wl_output *output = ((GdkWaylandMonitor *)monitor)->output;
if (GDK_WINDOW_DESTROYED (window))
return;
_gdk_wayland_window_save_size (window);
if (impl->display_server.xdg_toplevel)
{
- zxdg_toplevel_v6_set_fullscreen (impl->display_server.xdg_toplevel,
- fullscreen_output);
+ zxdg_toplevel_v6_set_fullscreen (impl->display_server.xdg_toplevel, output);
}
else
{
gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
- impl->initial_fullscreen_monitor = monitor;
+ impl->initial_fullscreen_output = output;
}
}
if (GDK_WINDOW_DESTROYED (window))
return;
- impl->initial_fullscreen_monitor = -1;
+ impl->initial_fullscreen_output = NULL;
_gdk_wayland_window_save_size (window);
if (impl->display_server.xdg_toplevel)
if (GDK_WINDOW_DESTROYED (window))
return;
- impl->initial_fullscreen_monitor = -1;
+ impl->initial_fullscreen_output = NULL;
if (impl->display_server.xdg_toplevel)
zxdg_toplevel_v6_unset_fullscreen (impl->display_server.xdg_toplevel);
}
static void
-gdk_x11_window_fullscreen_on_monitor (GdkWindow *window,
- gint monitor)
+gdk_x11_window_fullscreen_on_monitor (GdkWindow *window,
+ GdkMonitor *monitor)
{
- GdkMonitor *m;
- GdkRectangle monitor_geom;
+ GdkRectangle geom;
if (GDK_WINDOW_DESTROYED (window) ||
!WINDOW_IS_TOPLEVEL_OR_FOREIGN (window))
return;
- m = gdk_display_get_monitor (gdk_window_get_display (window), monitor);
- gdk_monitor_get_geometry (m, &monitor_geom);
- gdk_window_move (window, monitor_geom.x, monitor_geom.y);
+ gdk_monitor_get_geometry (monitor, &geom);
+ gdk_window_move (window, geom.x, geom.y);
gdk_window_set_fullscreen_mode (window, GDK_FULLSCREEN_ON_CURRENT_MONITOR);
gdk_x11_window_fullscreen (window);
GtkWidget *titlebar;
GtkWidget *popup_menu;
- gint initial_fullscreen_monitor;
+ GdkMonitor *initial_fullscreen_monitor;
guint edge_constraints;
/* The following flags are initially TRUE (before a window is mapped).
priv->initial_timestamp = GDK_CURRENT_TIME;
priv->mnemonics_visible = TRUE;
priv->focus_visible = TRUE;
- priv->initial_fullscreen_monitor = -1;
+ priv->initial_fullscreen_monitor = NULL;
g_object_ref_sink (window);
priv->has_user_ref_count = TRUE;
GtkWindow *window = GTK_WINDOW (widget);
GtkWindowPrivate *priv = window->priv;
GdkWindow *gdk_window;
- GdkDisplay *display;
if (!_gtk_widget_is_toplevel (widget))
{
return;
}
- display = gtk_widget_get_display (widget);
- if (priv->initial_fullscreen_monitor > gdk_display_get_n_monitors (display))
- priv->initial_fullscreen_monitor = -1;
-
GTK_WIDGET_CLASS (gtk_window_parent_class)->map (widget);
child = gtk_bin_get_child (&(window->bin));
if (priv->fullscreen_initially)
{
- if (priv->initial_fullscreen_monitor < 0)
- gdk_window_fullscreen (gdk_window);
+ if (priv->initial_fullscreen_monitor)
+ gdk_window_fullscreen_on_monitor (gdk_window, priv->initial_fullscreen_monitor);
else
- gdk_window_fullscreen_on_monitor (gdk_window,
- priv->initial_fullscreen_monitor);
+ gdk_window_fullscreen (gdk_window);
}
else
gdk_window_unfullscreen (gdk_window);
gdk_window_fullscreen (toplevel);
}
+static void
+unset_fullscreen_monitor (GtkWindow *window)
+{
+ GtkWindowPrivate *priv = window->priv;
+
+ if (priv->initial_fullscreen_monitor)
+ {
+ g_signal_handlers_disconnect_by_func (priv->initial_fullscreen_monitor, unset_fullscreen_monitor, window);
+ g_object_unref (priv->initial_fullscreen_monitor);
+ priv->initial_fullscreen_monitor = NULL;
+ }
+}
+
/**
* gtk_window_fullscreen_on_monitor:
* @window: a #GtkWindow
- * @screen: a #GdkScreen to draw to
* @monitor: which monitor to go fullscreen on
*
* Asks to place @window in the fullscreen state. Note that you shouldn't assume
*
* You can track the fullscreen state via the "window-state-event" signal
* on #GtkWidget.
- *
- * Since: 3.18
*/
void
-gtk_window_fullscreen_on_monitor (GtkWindow *window,
- GdkScreen *screen,
- gint monitor)
+gtk_window_fullscreen_on_monitor (GtkWindow *window,
+ GdkMonitor *monitor)
{
GtkWindowPrivate *priv;
GtkWidget *widget;
GdkWindow *toplevel;
g_return_if_fail (GTK_IS_WINDOW (window));
- g_return_if_fail (GDK_IS_SCREEN (screen));
- g_return_if_fail (gdk_display_get_monitor (gdk_screen_get_display (screen), monitor) != NULL);
+ g_return_if_fail (GDK_IS_MONITOR (monitor));
+ g_return_if_fail (gdk_monitor_is_valid (monitor));
priv = window->priv;
widget = GTK_WIDGET (window);
- gtk_window_set_display (window, gdk_screen_get_display (screen));
+ gtk_window_set_display (window, gdk_monitor_get_display (monitor));
+ unset_fullscreen_monitor (window);
priv->initial_fullscreen_monitor = monitor;
+ g_signal_connect_swapped (priv->initial_fullscreen_monitor, "invalidate",
+ G_CALLBACK (unset_fullscreen_monitor), window);
+ g_object_ref (priv->initial_fullscreen_monitor);
+
priv->fullscreen_initially = TRUE;
toplevel = _gtk_widget_get_window (widget);
g_return_if_fail (GTK_IS_WINDOW (window));
- window->priv->initial_fullscreen_monitor = -1;
+ unset_fullscreen_monitor (window);
window->priv->fullscreen_initially = FALSE;
toplevel = _gtk_widget_get_window (GTK_WIDGET (window));
return;
/* reset initial_fullscreen_monitor since they are relative to the screen */
- priv->initial_fullscreen_monitor = -1;
-
+ unset_fullscreen_monitor (window);
+
widget = GTK_WIDGET (window);
previous_display = priv->display;
GDK_AVAILABLE_IN_ALL
void gtk_window_unfullscreen (GtkWindow *window);
GDK_AVAILABLE_IN_3_18
-void gtk_window_fullscreen_on_monitor(GtkWindow *window,
- GdkScreen *screen,
- gint monitor);
+void gtk_window_fullscreen_on_monitor (GtkWindow *window,
+ GdkMonitor *monitor);
GDK_AVAILABLE_IN_3_10
void gtk_window_close (GtkWindow *window);
GDK_AVAILABLE_IN_ALL