gtk2/gdk/broadway/gdkscreen-broadway.c

343 lines
9.4 KiB
C
Raw Normal View History

2010-11-12 12:18:58 +00:00
/*
* gdkscreen-broadway.c
*
* Copyright 2001 Sun Microsystems Inc.
*
* Erwann Chenede <erwann.chenede@sun.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "gdkscreen-broadway.h"
#include "gdkscreen.h"
#include "gdkdisplay.h"
#include "gdkdisplay-broadway.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
static void gdk_broadway_screen_dispose (GObject *object);
static void gdk_broadway_screen_finalize (GObject *object);
2010-11-12 12:18:58 +00:00
G_DEFINE_TYPE (GdkBroadwayScreen, gdk_broadway_screen, GDK_TYPE_SCREEN)
2010-11-12 12:18:58 +00:00
static void
gdk_broadway_screen_init (GdkBroadwayScreen *screen)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
screen->width = 1024;
screen->height = 768;
2010-11-12 12:18:58 +00:00
}
static GdkDisplay *
gdk_broadway_screen_get_display (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
return GDK_BROADWAY_SCREEN (screen)->display;
2010-11-12 12:18:58 +00:00
}
2010-11-15 19:08:18 +00:00
static gint
gdk_broadway_screen_get_width (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
return GDK_BROADWAY_SCREEN (screen)->width;
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_height (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
return GDK_BROADWAY_SCREEN (screen)->height;
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_width_mm (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
2010-11-12 12:18:58 +00:00
2010-11-15 19:08:18 +00:00
return gdk_screen_get_width (screen) * 25.4 / 96;
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_height_mm (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
2010-11-15 19:08:18 +00:00
return gdk_screen_get_height (screen) * 25.4 / 96;
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_number (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
2010-11-15 19:08:18 +00:00
return 0;
2010-11-12 12:18:58 +00:00
}
static GdkWindow *
gdk_broadway_screen_get_root_window (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
return GDK_BROADWAY_SCREEN (screen)->root_window;
2010-11-12 12:18:58 +00:00
}
void
_gdk_broadway_screen_size_changed (GdkScreen *screen, BroadwayInputScreenResizeNotify *msg)
{
GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
gint width, height;
width = gdk_screen_get_width (screen);
height = gdk_screen_get_height (screen);
broadway_screen->width = msg->width;
broadway_screen->height = msg->height;
if (width != gdk_screen_get_width (screen) ||
height != gdk_screen_get_height (screen))
g_signal_emit_by_name (screen, "size-changed");
}
2010-11-12 12:18:58 +00:00
static void
gdk_broadway_screen_dispose (GObject *object)
2010-11-12 12:18:58 +00:00
{
GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (object);
2010-11-12 12:18:58 +00:00
if (broadway_screen->root_window)
_gdk_window_destroy (broadway_screen->root_window, TRUE);
2010-11-12 12:18:58 +00:00
G_OBJECT_CLASS (gdk_broadway_screen_parent_class)->dispose (object);
2010-11-12 12:18:58 +00:00
}
static void
gdk_broadway_screen_finalize (GObject *object)
2010-11-12 12:18:58 +00:00
{
GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (object);
2010-11-12 12:18:58 +00:00
gint i;
if (broadway_screen->root_window)
g_object_unref (broadway_screen->root_window);
2010-11-12 12:18:58 +00:00
/* Visual Part */
for (i = 0; i < broadway_screen->nvisuals; i++)
g_object_unref (broadway_screen->visuals[i]);
g_free (broadway_screen->visuals);
2010-11-12 12:18:58 +00:00
G_OBJECT_CLASS (gdk_broadway_screen_parent_class)->finalize (object);
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_n_monitors (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
2010-11-15 19:08:18 +00:00
return 1;
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_primary_monitor (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), 0);
2010-11-15 19:08:18 +00:00
return 0;
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_monitor_width_mm (GdkScreen *screen,
gint monitor_num)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
2010-11-15 19:08:18 +00:00
g_return_val_if_fail (monitor_num == 0, -1);
2010-11-12 12:18:58 +00:00
2010-11-15 19:08:18 +00:00
return gdk_screen_get_width_mm (screen);
2010-11-12 12:18:58 +00:00
}
static gint
gdk_broadway_screen_get_monitor_height_mm (GdkScreen *screen,
gint monitor_num)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
2010-11-15 19:08:18 +00:00
g_return_val_if_fail (monitor_num == 0, -1);
2010-11-12 12:18:58 +00:00
2010-11-15 19:08:18 +00:00
return gdk_screen_get_height_mm (screen);
2010-11-12 12:18:58 +00:00
}
static gchar *
gdk_broadway_screen_get_monitor_plug_name (GdkScreen *screen,
gint monitor_num)
2010-11-12 12:18:58 +00:00
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
2010-11-15 19:08:18 +00:00
g_return_val_if_fail (monitor_num == 0, NULL);
2010-11-12 12:18:58 +00:00
2010-11-15 19:08:18 +00:00
return g_strdup ("browser");
2010-11-12 12:18:58 +00:00
}
static void
gdk_broadway_screen_get_monitor_geometry (GdkScreen *screen,
gint monitor_num,
GdkRectangle *dest)
2010-11-12 12:18:58 +00:00
{
GdkBroadwayScreen *broadway_screen = GDK_BROADWAY_SCREEN (screen);
2010-11-12 12:18:58 +00:00
g_return_if_fail (GDK_IS_SCREEN (screen));
2010-11-15 19:08:18 +00:00
g_return_if_fail (monitor_num == 0);
2010-11-12 12:18:58 +00:00
if (dest)
2010-11-15 19:08:18 +00:00
{
dest->x = 0;
dest->y = 0;
dest->width = broadway_screen->width;
dest->height = broadway_screen->height;
2010-11-15 19:08:18 +00:00
}
2010-11-12 12:18:58 +00:00
}
static GdkVisual *
gdk_broadway_screen_get_rgba_visual (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
GdkBroadwayScreen *broadway_screen;
2010-11-12 12:18:58 +00:00
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
broadway_screen = GDK_BROADWAY_SCREEN (screen);
2010-11-12 12:18:58 +00:00
return broadway_screen->rgba_visual;
2010-11-12 12:18:58 +00:00
}
2010-11-15 19:08:18 +00:00
GdkScreen *
_gdk_broadway_screen_new (GdkDisplay *display,
gint screen_number)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
GdkScreen *screen;
GdkBroadwayScreen *broadway_screen;
2010-11-15 19:08:18 +00:00
screen = g_object_new (GDK_TYPE_BROADWAY_SCREEN, NULL);
2010-11-15 19:08:18 +00:00
broadway_screen = GDK_BROADWAY_SCREEN (screen);
broadway_screen->display = display;
_gdk_broadway_screen_init_visuals (screen);
_gdk_broadway_screen_init_root_window (screen);
2010-11-15 19:08:18 +00:00
return screen;
2010-11-12 12:18:58 +00:00
}
2010-11-15 19:08:18 +00:00
/*
* It is important that we first request the selection
* notification, and then setup the initial state of
* is_composited to avoid a race condition here.
2010-11-12 12:18:58 +00:00
*/
2010-11-15 19:08:18 +00:00
void
_gdk_broadway_screen_setup (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
}
static gboolean
gdk_broadway_screen_is_composited (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
2010-11-12 12:18:58 +00:00
2010-11-15 19:08:18 +00:00
return FALSE;
2010-11-12 12:18:58 +00:00
}
2010-11-15 19:08:18 +00:00
static gchar *
gdk_broadway_screen_make_display_name (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
return g_strdup ("browser");
2010-11-12 12:18:58 +00:00
}
static GdkWindow *
gdk_broadway_screen_get_active_window (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
return NULL;
2010-11-12 12:18:58 +00:00
}
static GList *
gdk_broadway_screen_get_window_stack (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
2010-11-15 19:08:18 +00:00
return NULL;
2010-11-12 12:18:58 +00:00
}
static void
gdk_broadway_screen_broadcast_client_message (GdkScreen *screen,
GdkEvent *event)
2010-11-12 12:18:58 +00:00
{
}
static gboolean
gdk_broadway_screen_get_setting (GdkScreen *screen,
const gchar *name,
GValue *value)
2010-11-12 12:18:58 +00:00
{
return FALSE;
}
2010-11-15 19:08:18 +00:00
void
_gdk_broadway_screen_events_init (GdkScreen *screen)
2010-11-12 12:18:58 +00:00
{
}
static void
gdk_broadway_screen_class_init (GdkBroadwayScreenClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdkScreenClass *screen_class = GDK_SCREEN_CLASS (klass);
object_class->dispose = gdk_broadway_screen_dispose;
object_class->finalize = gdk_broadway_screen_finalize;
screen_class->get_display = gdk_broadway_screen_get_display;
screen_class->get_width = gdk_broadway_screen_get_width;
screen_class->get_height = gdk_broadway_screen_get_height;
screen_class->get_width_mm = gdk_broadway_screen_get_width_mm;
screen_class->get_height_mm = gdk_broadway_screen_get_height_mm;
screen_class->get_number = gdk_broadway_screen_get_number;
screen_class->get_root_window = gdk_broadway_screen_get_root_window;
screen_class->get_n_monitors = gdk_broadway_screen_get_n_monitors;
screen_class->get_primary_monitor = gdk_broadway_screen_get_primary_monitor;
screen_class->get_monitor_width_mm = gdk_broadway_screen_get_monitor_width_mm;
screen_class->get_monitor_height_mm = gdk_broadway_screen_get_monitor_height_mm;
screen_class->get_monitor_plug_name = gdk_broadway_screen_get_monitor_plug_name;
screen_class->get_monitor_geometry = gdk_broadway_screen_get_monitor_geometry;
screen_class->is_composited = gdk_broadway_screen_is_composited;
screen_class->make_display_name = gdk_broadway_screen_make_display_name;
screen_class->get_active_window = gdk_broadway_screen_get_active_window;
screen_class->get_window_stack = gdk_broadway_screen_get_window_stack;
screen_class->broadcast_client_message = gdk_broadway_screen_broadcast_client_message;
screen_class->get_setting = gdk_broadway_screen_get_setting;
screen_class->get_rgba_visual = gdk_broadway_screen_get_rgba_visual;
screen_class->get_system_visual = _gdk_broadway_screen_get_system_visual;
screen_class->visual_get_best_depth = _gdk_broadway_screen_visual_get_best_depth;
screen_class->visual_get_best_type = _gdk_broadway_screen_visual_get_best_type;
screen_class->visual_get_best = _gdk_broadway_screen_visual_get_best;
screen_class->visual_get_best_with_depth = _gdk_broadway_screen_visual_get_best_with_depth;
screen_class->visual_get_best_with_type = _gdk_broadway_screen_visual_get_best_with_type;
screen_class->visual_get_best_with_both = _gdk_broadway_screen_visual_get_best_with_both;
screen_class->query_depths = _gdk_broadway_screen_query_depths;
screen_class->query_visual_types = _gdk_broadway_screen_query_visual_types;
screen_class->list_visuals = _gdk_broadway_screen_list_visuals;
}