summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-10-31 21:12:23 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-10-31 21:12:23 +0000
commit550bf181d2e754425aa592f61108a0a0c9139256 (patch)
tree82047181585ec2c8cc9bf85b8d35a88e27fc93ee /gdk
parent089a38826365adbd8153318eb740c6b44cb9c49d (diff)
downloadgtk+-550bf181d2e754425aa592f61108a0a0c9139256.tar.gz
Add a --screen option for setting the default screen. (Based on a patch
Thu Oct 31 12:40:39 2002 Owen Taylor <otaylor@redhat.com> * gdk/gdk.[ch] gdk/gdkglobals.c gdk/gdkinternals.h gdk/{x11,win32,linux-fb}/gdkscreen-{x11,win32,linux-fb}.c: Add a --screen option for setting the default screen. (Based on a patch from Balamurali Viswanathan, #81145) * gdk/gdk.c gdkdisplay.h gtk/gtkmain.c: Add gdk_display_open_default_libgtk_only(), so gtk_init_check() and gdk_init_check() can share the same behavior w.r.t. --screen. * gdk/gdk.[ch]: Make gdk_get_display_arg_name() G_CONST_RETURN. * gdk/x11/gdkselection-x11.c (gdk_selection_property_get): Suppress a spurious warning. * tests/testgtkrc: Remove someleft-over commented out includes that could be confusing.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdk.c68
-rw-r--r--gdk/gdk.h4
-rw-r--r--gdk/gdkdisplay.h2
-rw-r--r--gdk/gdkglobals.c2
-rw-r--r--gdk/gdkinternals.h5
-rw-r--r--gdk/gdkscreen.h1
-rw-r--r--gdk/linux-fb/gdkscreen-fb.c7
-rw-r--r--gdk/win32/gdkscreen-win32.c7
-rw-r--r--gdk/x11/gdkscreen-x11.c55
-rw-r--r--gdk/x11/gdkselection-x11.c2
10 files changed, 122 insertions, 31 deletions
diff --git a/gdk/gdk.c b/gdk/gdk.c
index 1eee68bbb5..f1712e876a 100644
--- a/gdk/gdk.c
+++ b/gdk/gdk.c
@@ -239,6 +239,7 @@ static GdkArgDesc gdk_args[] = {
{ "class" , GDK_ARG_CALLBACK, NULL, gdk_arg_class_cb },
{ "name", GDK_ARG_CALLBACK, NULL, gdk_arg_name_cb },
{ "display", GDK_ARG_STRING, &_gdk_display_name, (GdkArgFunc)NULL },
+ { "screen", GDK_ARG_INT, &_gdk_screen_number, (GdkArgFunc)NULL },
#ifdef G_ENABLE_DEBUG
{ "gdk-debug", GDK_ARG_CALLBACK, NULL, gdk_arg_debug_cb },
@@ -355,11 +356,60 @@ gdk_parse_args (int *argc,
* to gdk_init() or gdk_parse_args(), if any.
*
* Returns: the display name, if specified explicitely, otherwise %NULL
+ * this string is owned by GTK+ and must not be modified or freed.
*/
-gchar *
+G_CONST_RETURN gchar *
gdk_get_display_arg_name (void)
{
- return _gdk_display_name;
+ if (!_gdk_display_arg_name)
+ {
+ if (_gdk_screen_number >= 0)
+ _gdk_display_arg_name = _gdk_windowing_substitute_screen_number (_gdk_display_name, _gdk_screen_number);
+ else
+ _gdk_display_arg_name = g_strdup (_gdk_display_name);
+ }
+
+ return _gdk_display_arg_name;
+}
+
+/**
+ * gdk_display_open_default_libgtk_only:
+ *
+ * Opens the default display specified by command line arguments or
+ * environment variables, sets it as the default display, and returns
+ * it. gdk_parse_args must have been called first. If the default
+ * display has previously been set, simply returns that. An internal
+ * function that should not be used by applications.
+ *
+ * Return value: the default display, if it could be opened,
+ * otherwise %NULL.
+ **/
+GdkDisplay *
+gdk_display_open_default_libgtk_only (void)
+{
+ GdkDisplay *display;
+
+ g_return_if_fail (gdk_initialized);
+
+ display = gdk_display_get_default ();
+ if (display)
+ return display;
+
+ display = gdk_display_open (gdk_get_display_arg_name ());
+
+ if (!display && _gdk_screen_number >= 0)
+ {
+ g_free (_gdk_display_arg_name);
+ _gdk_display_arg_name = g_strdup (_gdk_display_name);
+
+ display = gdk_display_open (_gdk_display_name);
+ }
+
+ if (display)
+ gdk_display_manager_set_default_display (gdk_display_manager_get (),
+ display);
+
+ return display;
}
/*
@@ -392,19 +442,7 @@ gdk_init_check (int *argc,
gdk_parse_args (argc, argv);
- if (gdk_display_get_default ())
- return TRUE;
-
- display = gdk_display_open (_gdk_display_name);
-
- if (display)
- {
- gdk_display_manager_set_default_display (gdk_display_manager_get (),
- display);
- return TRUE;
- }
- else
- return FALSE;
+ return gdk_display_open_default_libgtk_only () != NULL;
}
void
diff --git a/gdk/gdk.h b/gdk/gdk.h
index 44b7391e93..811c484935 100644
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -85,8 +85,8 @@ void gdk_set_use_xshm (gboolean use_xshm);
gboolean gdk_get_use_xshm (void);
#endif /* GDK_DISABLE_DEPRECATED */
-gchar* gdk_get_display (void);
-gchar* gdk_get_display_arg_name (void);
+gchar* gdk_get_display (void);
+G_CONST_RETURN gchar* gdk_get_display_arg_name (void);
#ifndef GDK_DISABLE_DEPRECATED
gint gdk_input_add_full (gint source,
diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h
index a7f7234924..5e2485f5fa 100644
--- a/gdk/gdkdisplay.h
+++ b/gdk/gdkdisplay.h
@@ -146,6 +146,8 @@ GdkWindow * gdk_display_get_window_at_pointer (GdkDisplay *disp
GdkDisplayPointerHooks *gdk_display_set_pointer_hooks (GdkDisplay *display,
const GdkDisplayPointerHooks *new_hooks);
+GdkDisplay *gdk_display_open_default_libgtk_only (void);
+
G_END_DECLS
#endif /* __GDK_DISPLAY_H__ */
diff --git a/gdk/gdkglobals.c b/gdk/gdkglobals.c
index 052938952a..a4ec657457 100644
--- a/gdk/gdkglobals.c
+++ b/gdk/gdkglobals.c
@@ -35,6 +35,8 @@ gint _gdk_error_code = 0;
gint _gdk_error_warnings = TRUE;
GList *_gdk_default_filters = NULL;
gchar *_gdk_display_name = NULL;
+gint _gdk_screen_number = -1;
+gchar *_gdk_display_arg_name = NULL;
GSList *_gdk_displays = NULL;
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index 3805c15504..d1e3e857e4 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -166,6 +166,8 @@ extern GDestroyNotify _gdk_event_notify;
extern GSList *_gdk_displays;
extern gchar *_gdk_display_name;
+extern gint _gdk_screen_number;
+extern gchar *_gdk_display_arg_name;
void _gdk_events_queue (GdkDisplay *display);
GdkEvent* _gdk_event_unqueue (GdkDisplay *display);
@@ -236,6 +238,9 @@ void _gdk_windowing_init (gint *argc,
gchar ***argv);
void _gdk_windowing_set_default_display (GdkDisplay *display);
+gchar *_gdk_windowing_substitute_screen_number (const gchar *display_name,
+ gint screen_number);
+
void _gdk_windowing_window_get_offsets (GdkWindow *window,
gint *x_offset,
gint *y_offset);
diff --git a/gdk/gdkscreen.h b/gdk/gdkscreen.h
index 2e2b199286..6e2241aa5b 100644
--- a/gdk/gdkscreen.h
+++ b/gdk/gdkscreen.h
@@ -73,7 +73,6 @@ GList * gdk_screen_list_visuals (GdkScreen *screen);
GList * gdk_screen_get_toplevel_windows (GdkScreen *screen);
gchar * gdk_screen_make_display_name (GdkScreen *screen);
-
gint gdk_screen_get_n_monitors (GdkScreen *screen);
void gdk_screen_get_monitor_geometry (GdkScreen *screen,
gint monitor_num,
diff --git a/gdk/linux-fb/gdkscreen-fb.c b/gdk/linux-fb/gdkscreen-fb.c
index cb8e8f4fd7..a5914734b3 100644
--- a/gdk/linux-fb/gdkscreen-fb.c
+++ b/gdk/linux-fb/gdkscreen-fb.c
@@ -79,6 +79,13 @@ gdk_screen_get_number (GdkScreen *screen)
return 0;
}
+gchar *
+_gdk_windowing_substitute_screen_number (gchar *display_name,
+ int screen_number)
+{
+ return g_strdup (display_name);
+}
+
gchar *
gdk_screen_make_display_name (GdkScreen *screen)
{
diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c
index 084b6c88e9..c5455bd3b9 100644
--- a/gdk/win32/gdkscreen-win32.c
+++ b/gdk/win32/gdkscreen-win32.c
@@ -81,6 +81,13 @@ gdk_screen_get_number (GdkScreen *screen)
return 0;
}
+gchar *
+_gdk_windowing_substitute_screen_number (gchar *display_name,
+ int screen_number)
+{
+ return g_strdup (display_name);
+}
+
gchar *
gdk_screen_make_display_name (GdkScreen *screen)
{
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index 98a60a7fd0..dd030103ff 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -552,6 +552,45 @@ _gdk_x11_screen_window_manager_changed (GdkScreen *screen)
}
/**
+ * _gdk_windowing_substitute_screen_number:
+ * @display_name : The name of a display, in the form used by
+ * gdk_display_open (). If %NULL a default value
+ * will be used. On X11, this is derived from the DISPLAY
+ * environment variable.
+ * @screen_number : The number of a screen within the display
+ * referred to by @display_name.
+ *
+ * Modifies a @display_name to make @screen_number the default
+ * screen when the display is opened.
+ *
+ * Return value: a newly allocated string holding the resulting
+ * display name. Free with g_free().
+ */
+gchar *
+_gdk_windowing_substitute_screen_number (const gchar *display_name,
+ gint screen_number)
+{
+ GString *str;
+ gchar *p;
+
+ if (!display_name)
+ display_name = getenv ("DISPLAY");
+
+ if (!display_name)
+ return NULL;
+
+ str = g_string_new (display_name);
+
+ p = strrchr (str->str, '.');
+ if (p && p > strchr (str->str, ':'))
+ g_string_truncate (str, p - str->str);
+
+ g_string_append_printf (str, ".%d", screen_number);
+
+ return g_string_free (str, FALSE);
+}
+
+/**
* gdk_screen_make_display_name:
* @screen: a #GdkScreen
*
@@ -563,20 +602,12 @@ _gdk_x11_screen_window_manager_changed (GdkScreen *screen)
gchar *
gdk_screen_make_display_name (GdkScreen *screen)
{
- GString *str;
const gchar *old_display;
- gchar *p;
-
- old_display = gdk_display_get_name (gdk_screen_get_display (screen));
- str = g_string_new (old_display);
-
- p = strrchr (str->str, '.');
- if (p && p > strchr (str->str, ':'))
- g_string_truncate (str, p - str->str);
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
- g_string_append_printf (str, ".%d", gdk_screen_get_number (screen));
+ old_display = gdk_display_get_name (gdk_screen_get_display (screen));
- return g_string_free (str, FALSE);
+ return _gdk_windowing_substitute_screen_number (old_display,
+ gdk_screen_get_number (screen));
}
-
diff --git a/gdk/x11/gdkselection-x11.c b/gdk/x11/gdkselection-x11.c
index 927dc61e49..7e87980b64 100644
--- a/gdk/x11/gdkselection-x11.c
+++ b/gdk/x11/gdkselection-x11.c
@@ -261,7 +261,7 @@ gdk_selection_property_get (GdkWindow *requestor,
{
gulong nitems;
gulong nbytes;
- gulong length;
+ gulong length = 0; /* Quiet GCC */
Atom prop_type;
gint prop_format;
guchar *t = NULL;