summaryrefslogtreecommitdiff
path: root/gtk/gtkwidget.c
diff options
context:
space:
mode:
authorAlex Larsson <alexl@redhat.com>2002-04-29 22:53:45 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-04-29 22:53:45 +0000
commit4632fb81c77ba63341e49ea6e323772df1a19a9b (patch)
tree0898e7ad59470320c70fc360ddfd4780c6c49dec /gtk/gtkwidget.c
parentbc25b9b250976f90331b8488745e3abd2a23ae07 (diff)
downloadgdk-pixbuf-4632fb81c77ba63341e49ea6e323772df1a19a9b.tar.gz
Integrate Erwann Chenede's multihead changes for the gtk/ directory.
Mon Apr 29 18:28:00 2002 Owen Taylor <otaylor@redhat.com> Integrate Erwann Chenede's multihead changes for the gtk/ directory. * gtk/gtkclipboard.[ch]: Add gtk_clipboard_get_for_display(), make internals multihead aware. * gtk/gtkcolorsel.[ch]: Add gtk_color_selection_set_change_palette_with_screen_hook () [ugh!] make up for non-multihead safety of gtk_color_selection_set_change_palette_hook() * gtk/gtkinvisible.[ch] gtk/gtkmenu.[ch] gtkwindow.[ch]: Add gtk_{invisible,menu,window}_set_screen(); add "screen" properties for GtkWindow and GtkMenu. * gtk/gtkplug.[ch]: Add gtk_plug_construct_for_display(), gtk_plug_new_for_display(). Multihead fixes. * gtk/gtkselection.[ch]: Add gtk_selection_owner_set_for_display(), make internals multihead aware. * gtk/gtksettings.[ch]: Add gtk_settings_get_for_screen(), get rid of now-useless gtk_settings_constructor(). * gtk/gtkstyle.[ch]: Add gtk_style_get_font_for_display(), fix check/radio button indicators bitmap handling to be multihead safe. * gtk/gtkwidget.[ch]: Add gtk_widget_get_screen(), gtk_widget_has_screen(), gtk_widget_get_display(), gtk_widget_get_clipboard(), gtk_widget_get_root_window(). * gtk/gtkbindings.c gtk/gtkbutton.c gtk/gtkclist.c gtk/gtkcombo.c gtk/gtkctree.c gtk/gtkdnd.c gtk/gtkfilesel.c gtk/gtkgamma.c gtk/gtkhandlebox.c gtk/gtkhsv.c gtk/gtkimcontext.c gtk/gtklabel.c gtk/gtklist.c gtk/gtkmain.c gtk/gtkmenuitem.c gtk/gtkmenushell.c gtk/gtknotebook.c gtk/gtkoldeditable.c gtk/gtkoptionmenu.c gtk/gtkpaned.c gtk/gtkpreview.c gtk/gtksocket.c gtk/gtktext.c gtk/gtktextbuffer.c gtk/gtktextview.c gtk/gtktipsquery.c gtk/gtktooltips.c gtk/gtktreeview.c gtk/gtktreeviewcolumn.c: misc mechanical multihead-safety fixes. * gtk/gtkclipboard.c: Use a GtkImage rather than a pixmap for the dropper, look up the color palette only at realization time, other multihead fixes. * gtk/gtkcombo.c (gtk_combo_unrealize): Popdown the list when unrealizing. * gtk/gtkentry.c: Only claim ownership of the primary selection when realized, misc multihead fixes. * gtk/gtkfontsel.c: Only fill in fonts when attached to a screen, fix gtk_font_selection_get_font() for multihead. * gtk/gtkgc.c: make the depth => drawable hash per-screen. * gtk/gtkinvisible.c: Add a constructor that realizes the widget, so we get a realized widget with g_object_new() as well gtk_invisible_new() as before. * gtk/gtkmain.c: Get rid of unused gtk_visual/gtk_colormap variables. * gtk/gtktextdisplay.c: Add warnings if stipple bitmaps are used on the wrong screen. * gtk/gtktoolbar.c: Make handling of GtkSettings-based layout read properties and connect to settings when the screen is changed, rather than on init/finalize. * gtk/gtkwindow.c: Fix icon handing to be multihead safe ... default icon pixmaps/mask are only shared between windows on the same screen. Misc multihead fixes. Sat Apr 27 13:49:53 2002 Owen Taylor <otaylor@redhat.com> * gtk/gtkclipboard.c (gtk_clipboard_get_for_display): Update docs to reference GDK_SELECTION_CLIPBOARD rather GDK_NONE. 2002-04-29 Alex Larsson <alexl@redhat.com> * gdk/linux-fb/gdkproperty-fb.c (gdk_property_get): Fix silly bug, noticed by Sven Neumann. Sun Apr 28 22:43:55 2002 Jonathan Blandford <jrb@gnome.org> * gtk/gtktreemodelsort.c (gtk_tree_model_sort_set_sort_func): Fix so that you can set a new sort func.
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r--gtk/gtkwidget.c205
1 files changed, 182 insertions, 23 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index ecc4a77a8..7e994a8b5 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -29,6 +29,7 @@
#include <locale.h>
#include "gtkcontainer.h"
#include "gtkaccelmap.h"
+#include "gtkclipboard.h"
#include "gtkiconfactory.h"
#include "gtkintl.h"
#include "gtkmain.h"
@@ -50,6 +51,7 @@
#include "gtkintl.h"
#include "gtkaccessible.h"
#include "gtktooltips.h"
+#include "gtkinvisible.h"
#define WIDGET_CLASS(w) GTK_WIDGET_GET_CLASS (w)
#define INIT_PATH_SIZE (512)
@@ -218,7 +220,6 @@ static void gtk_widget_invalidate_widget_windows (GtkWidget
static gpointer parent_class = NULL;
static guint widget_signals[LAST_SIGNAL] = { 0 };
static GMemChunk *aux_info_mem_chunk = NULL;
-static GdkColormap *default_colormap = NULL;
static GtkStyle *gtk_default_style = NULL;
static GSList *colormap_stack = NULL;
static guint composite_child_stack = 0;
@@ -2872,7 +2873,7 @@ gtk_widget_real_mnemonic_activate (GtkWidget *widget,
{
g_warning ("widget `%s' isn't suitable for mnemonic activation",
G_OBJECT_TYPE_NAME (widget));
- gdk_beep ();
+ gdk_display_beep (gtk_widget_get_display (widget));
}
return TRUE;
}
@@ -3884,7 +3885,7 @@ gtk_widget_ensure_style (GtkWidget *widget)
static void
gtk_widget_reset_rc_style (GtkWidget *widget)
{
- GtkStyle *new_style;
+ GtkStyle *new_style = NULL;
gboolean initial_emission;
g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -3893,8 +3894,9 @@ gtk_widget_reset_rc_style (GtkWidget *widget)
GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
-
- new_style = gtk_rc_get_style (widget);
+
+ if (gtk_widget_has_screen (widget))
+ new_style = gtk_rc_get_style (widget);
if (!new_style)
new_style = gtk_widget_get_default_style ();
@@ -4360,10 +4362,18 @@ PangoContext *
gtk_widget_get_pango_context (GtkWidget *widget)
{
PangoContext *context;
+ GdkScreen *screen;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
context = gtk_object_get_data_by_id (GTK_OBJECT (widget), quark_pango_context);
+ if (context)
+ {
+ screen = g_object_get_data (G_OBJECT (context), "gdk-pango-screen");
+ if (screen && (screen != gtk_widget_get_screen (widget)))
+ context = NULL;
+ }
+
if (!context)
{
context = gtk_widget_create_pango_context (GTK_WIDGET (widget));
@@ -4391,7 +4401,7 @@ gtk_widget_create_pango_context (GtkWidget *widget)
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
- context = gdk_pango_context_get ();
+ context = gdk_pango_context_get_for_screen (gtk_widget_get_screen (widget));
gdk_pango_context_set_colormap (context, gtk_widget_get_colormap (widget));
pango_context_set_base_dir (context,
@@ -4581,6 +4591,128 @@ gtk_widget_get_child_visible (GtkWidget *widget)
return GTK_WIDGET_CHILD_VISIBLE (widget);
}
+static GdkScreen *
+gtk_widget_get_screen_unchecked (GtkWidget *widget)
+{
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_toplevel (widget);
+
+ if (GTK_WIDGET_TOPLEVEL (toplevel))
+ {
+ if (GTK_IS_WINDOW (toplevel))
+ return GTK_WINDOW (toplevel)->screen;
+ else if (GTK_IS_INVISIBLE (toplevel))
+ return GTK_INVISIBLE (widget)->screen;
+ }
+
+ return NULL;
+}
+
+/**
+ * gtk_widget_get_screen:
+ * @widget: a #GtkWidget
+ *
+ * Get the #GdkScreen from the toplevel window associated with
+ * this widget. This function can only be called after the widget
+ * has been added to a widget heirarchy with a #GtkWindow
+ * at the top.
+ *
+ * In general, you should only create screen specific
+ * resources when a widget has been realized, and you should
+ * free those resources when the widget is unrealized.
+ *
+ * Return value: the #GdkScreen for the toplevel for this widget.
+ **/
+GdkScreen*
+gtk_widget_get_screen (GtkWidget *widget)
+{
+ GdkScreen *screen;
+
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+ screen = gtk_widget_get_screen_unchecked (widget);
+
+ if (screen)
+ return screen;
+ else
+ {
+#if 0
+ g_warning (G_STRLOC ": Can't get associated screen"
+ " for a widget unless it is inside a toplevel GtkWindow\n"
+ " widget type is %s associated top level type is %s",
+ g_type_name (G_OBJECT_TYPE(G_OBJECT (widget))),
+ g_type_name (G_OBJECT_TYPE(G_OBJECT (toplevel))));
+#endif
+ return gdk_get_default_screen ();
+ }
+}
+
+/**
+ * gtk_widget_has_screen:
+ * @widget: a #GtkWidget
+ *
+ * Checks whether there is a #GdkScreen is associated with
+ * this widget. All toplevel widgets have an associated
+ * screen, and all widgets added into a heirarchy with a toplevel
+ * window at the top.
+ *
+ * Return value: %TRUE if there is a #GdkScreen assoicated
+ * with the widget.
+ **/
+gboolean
+gtk_widget_has_screen (GtkWidget *widget)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+
+ return (gtk_widget_get_screen_unchecked (widget) != NULL);
+}
+
+/**
+ * gtk_widget_get_display:
+ * @widget: a #GtkWidget
+ *
+ * Get the #GdkDisplay for the toplevel window associated with
+ * this widget. This function can only be called after the widget
+ * has been added to a widget hierarchy with a #GtkWindow at the top.
+ *
+ * In general, you should only create display specific
+ * resources when a widget has been realized, and you should
+ * free those resources when the widget is unrealized.
+ *
+ * Return value: the #GdkDisplay for the toplevel for this widget.
+ **/
+GdkDisplay*
+gtk_widget_get_display (GtkWidget *widget)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+ return gdk_screen_get_display (gtk_widget_get_screen (widget));
+}
+
+/**
+ * gtk_widget_get_root_window:
+ * @widget: a #GtkWidget
+ *
+ * Get the root window where this widget is located. This function can
+ * only be called after the widget has been added to a widget
+ * heirarchy with #GtkWindow at the top.
+ *
+ * The root window is useful for such purposes as creating a popup
+ * #GdkWindow associated with the window. In general, you should only
+ * create display specific resources when a widget has been realized,
+ * and you should free those resources when the widget is unrealized.
+ *
+ * Return value: the #GdkWindow root window for the toplevel for this widget.
+ **/
+GdkWindow*
+gtk_widget_get_root_window (GtkWidget *widget)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+ return gdk_screen_get_root_window (gtk_widget_get_screen (widget));
+}
+
/**
* gtk_widget_get_parent_window:
* @widget: a #GtkWidget.
@@ -5097,6 +5229,7 @@ GdkColormap*
gtk_widget_get_colormap (GtkWidget *widget)
{
GdkColormap *colormap;
+ GtkWidget *tmp_widget;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
@@ -5108,16 +5241,17 @@ gtk_widget_get_colormap (GtkWidget *widget)
return colormap;
}
- while (widget)
+ tmp_widget = widget;
+ while (tmp_widget)
{
- colormap = gtk_object_get_data_by_id (GTK_OBJECT (widget), quark_colormap);
+ colormap = gtk_object_get_data_by_id (GTK_OBJECT (tmp_widget), quark_colormap);
if (colormap)
return colormap;
- widget = widget->parent;
+ tmp_widget= tmp_widget->parent;
}
- return gtk_widget_get_default_colormap ();
+ return gdk_screen_get_default_colormap (gtk_widget_get_screen (widget));
}
/**
@@ -5142,13 +5276,19 @@ gtk_widget_get_visual (GtkWidget *widget)
*
* Gets the settings object holding the settings (global property
* settings, RC file information, etc) used for this widget.
+ *
+ * Note that this function can only be called when the #GtkWidget
+ * is attached to a toplevel, since the settings object is specific
+ * to a particular #GdkScreen.
*
* Return value: the relevant #GtkSettings object
**/
GtkSettings*
gtk_widget_get_settings (GtkWidget *widget)
{
- return gtk_settings_get_default ();
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+ return gtk_settings_get_for_screen (gtk_widget_get_screen (widget));
}
/**
@@ -5425,14 +5565,7 @@ gtk_widget_set_default_colormap (GdkColormap *colormap)
{
g_return_if_fail (GDK_IS_COLORMAP (colormap));
- if (default_colormap != colormap)
- {
- if (default_colormap)
- gdk_colormap_unref (default_colormap);
- default_colormap = colormap;
- if (default_colormap)
- gdk_colormap_ref (default_colormap);
- }
+ gdk_screen_set_default_colormap (colormap->screen, colormap);
}
/**
@@ -5445,10 +5578,7 @@ gtk_widget_set_default_colormap (GdkColormap *colormap)
GdkColormap*
gtk_widget_get_default_colormap (void)
{
- if (!default_colormap)
- gtk_widget_set_default_colormap (gdk_rgb_get_colormap ());
-
- return default_colormap;
+ return gdk_screen_get_default_colormap (gdk_get_default_screen ());
}
/**
@@ -6487,3 +6617,32 @@ gtk_widget_ref_accessible (AtkImplementor *implementor)
g_object_ref (G_OBJECT (accessible));
return accessible;
}
+
+/**
+ * gtk_widget_get_clipboard:
+ * @widget: a #GtkWidget
+ * @selection: a #GdkAtom which identifies the clipboard
+ * to use. %GDK_SELECTION_CLIPBOARD gives the
+ * default clipboard. Another common value
+ * is %GDK_SELECTION_PRIMARY, which gives
+ * the primary X selection.
+ *
+ * Returns the clipboard object for the given selection to
+ * be used with @widget. @widget must have a #GdkDisplay
+ * associated with it, so must be attached to a toplevel
+ * window.
+ *
+ * Return value: the appropriate clipboard object. If no
+ * clipboard already exists, a new one will
+ * be created. Once a clipboard object has
+ * been created, it is persistent for all time.
+ **/
+GtkClipboard *
+gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+ g_return_val_if_fail (gtk_widget_has_screen (widget), NULL);
+
+ return gtk_clipboard_get_for_display (gtk_widget_get_display (widget),
+ selection);
+}