Make color selection and selection examples work.

* docs/tutorial/gtk-tut.sgml: Make color selection and selection
	examples work.

	* tests/testselection.c (selection_toggled, selection_clear):
	Use selection_widget as selection owner - otherwise clearing the
	selection doesn't work.
This commit is contained in:
Matthias Clasen 2002-03-04 22:19:47 +00:00
parent 5b374044c1
commit 0b46f4ab61
9 changed files with 114 additions and 52 deletions

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -1,3 +1,12 @@
2002-03-04 Matthias Clasen <maclas@gmx.de>
* docs/tutorial/gtk-tut.sgml: Make color selection and selection
examples work.
* tests/testselection.c (selection_toggled, selection_clear):
Use selection_widget as selection owner - otherwise clearing the
selection doesn't work.
Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com> Mon Mar 4 12:43:48 2002 Owen Taylor <otaylor@redhat.com>
Fixes for non XKB operation. (#73103) Fixes for non XKB operation. (#73103)

View File

@ -6062,34 +6062,17 @@ background color.</para>
GtkWidget *colorseldlg = NULL; GtkWidget *colorseldlg = NULL;
GtkWidget *drawingarea = NULL; GtkWidget *drawingarea = NULL;
GdkColor color;
/* Color changed handler */ /* Color changed handler */
void color_changed_cb( GtkWidget *widget, void color_changed_cb( GtkWidget *widget,
GtkColorSelection *colorsel ) GtkColorSelection *colorsel )
{ {
GdkColor gdk_color; GdkColor ncolor;
GdkColormap *colormap;
/* Get drawingarea colormap */ gtk_color_selection_get_current_color (colorsel, &amp;ncolor);
gtk_widget_modify_bg (drawingarea, GTK_STATE_NORMAL, &amp;ncolor);
colormap = gdk_window_get_colormap (drawingarea-&gt;window);
/* Get current color */
gtk_color_selection_get_current_color (colorsel, &amp;gdk_color);
/* Allocate color */
gdk_color_alloc (colormap, &amp;gdk_color);
/* Set window background color */
gdk_window_set_background (drawingarea-&gt;window, &amp;gdk_color);
/* Clear window */
gdk_window_clear (drawingarea-&gt;window);
} }
/* Drawingarea event handler */ /* Drawingarea event handler */
@ -6099,33 +6082,40 @@ gint area_event( GtkWidget *widget,
gpointer client_data ) gpointer client_data )
{ {
gint handled = FALSE; gint handled = FALSE;
GtkWidget *colorsel; gint response;
GtkColorSelection *colorsel;
/* Check if we've received a button pressed event */ /* Check if we've received a button pressed event */
if (event-&gt;type == GDK_BUTTON_PRESS &amp;&amp; colorseldlg == NULL) if (event-&gt;type == GDK_BUTTON_PRESS)
{ {
/* Yes, we have an event and there's no colorseldlg yet! */
handled = TRUE; handled = TRUE;
/* Create color selection dialog */ /* Create color selection dialog */
if (colorseldlg == NULL)
colorseldlg = gtk_color_selection_dialog_new ("Select background color"); colorseldlg = gtk_color_selection_dialog_new ("Select background color");
/* Get the ColorSelection widget */ /* Get the ColorSelection widget */
colorsel = GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (colorseldlg)-&gt;colorsel);
colorsel = GTK_COLOR_SELECTION_DIALOG (colorseldlg)-&gt;colorsel; gtk_color_selection_set_previous_color (colorsel, &amp;color);
gtk_color_selection_set_current_color (colorsel, &amp;color);
gtk_color_selection_set_has_palette (colorsel, TRUE);
/* Connect to the "color_changed" signal, set the client-data /* Connect to the "color_changed" signal, set the client-data
* to the colorsel widget */ * to the colorsel widget */
g_signal_connect (G_OBJECT (colorsel), "color_changed", g_signal_connect (G_OBJECT (colorsel), "color_changed",
G_CALLBACK (color_changed_cb), (gpointer)colorsel); G_CALLBACK (color_changed_cb), (gpointer)colorsel);
/* Show the dialog */ /* Show the dialog */
response = gtk_dialog_run (GTK_DIALOG (colorseldlg));
gtk_widget_show (colorseldlg); if (response == GTK_RESPONSE_OK)
gtk_color_selection_get_current_color (colorsel, &amp;color);
else
gtk_widget_modify_bg (drawingarea, GTK_STATE_NORMAL, &amp;color);
gtk_widget_hide (colorseldlg);
} }
return handled; return handled;
@ -6167,6 +6157,11 @@ gint main( gint argc,
drawingarea = gtk_drawing_area_new (); drawingarea = gtk_drawing_area_new ();
color.red = 0;
color.blue = 65535;
color.green = 0;
gtk_widget_modify_bg (drawingarea, GTK_STATE_NORMAL, &amp;color);
gtk_widget_set_size_request (GTK_WIDGET (drawingarea), 200, 200); gtk_widget_set_size_request (GTK_WIDGET (drawingarea), 200, 200);
gtk_widget_set_events (drawingarea, GDK_BUTTON_PRESS_MASK); gtk_widget_set_events (drawingarea, GDK_BUTTON_PRESS_MASK);
@ -9220,10 +9215,10 @@ selections and targets are identified by atoms.</para>
process, you call:</para> process, you call:</para>
<programlisting role="C"> <programlisting role="C">
gint gtk_selection_convert( GtkWidget *widget, gboolean gtk_selection_convert( GtkWidget *widget,
GdkAtom selection, GdkAtom selection,
GdkAtom target, GdkAtom target,
guint32 time ); guint32 time );
</programlisting> </programlisting>
<para>This <emphasis>converts</emphasis> the selection into the form specified by <para>This <emphasis>converts</emphasis> the selection into the form specified by
@ -9265,7 +9260,7 @@ could not be retrieved. This might happen if no application owned the
selection, or if you requested a target that the application didn't selection, or if you requested a target that the application didn't
support. The buffer is actually guaranteed to be one byte longer than support. The buffer is actually guaranteed to be one byte longer than
<literal>length</literal>; the extra byte will always be zero, so it isn't <literal>length</literal>; the extra byte will always be zero, so it isn't
necessary to make a copy of strings just to null terminate them.</para> necessary to make a copy of strings just to nul-terminate them.</para>
<para>In the following example, we retrieve the special target "TARGETS", <para>In the following example, we retrieve the special target "TARGETS",
which is a list of all targets into which the selection can be which is a list of all targets into which the selection can be
@ -9286,13 +9281,14 @@ void get_targets( GtkWidget *widget,
gpointer data ) gpointer data )
{ {
static GdkAtom targets_atom = GDK_NONE; static GdkAtom targets_atom = GDK_NONE;
GtkWidget *window = (GtkWidget *)data;
/* Get the atom corresponding to the string "TARGETS" */ /* Get the atom corresponding to the string "TARGETS" */
if (targets_atom == GDK_NONE) if (targets_atom == GDK_NONE)
targets_atom = gdk_atom_intern ("TARGETS", FALSE); targets_atom = gdk_atom_intern ("TARGETS", FALSE);
/* And request the "TARGETS" target for the primary selection */ /* And request the "TARGETS" target for the primary selection */
gtk_selection_convert (widget, GDK_SELECTION_PRIMARY, targets_atom, gtk_selection_convert (window, GDK_SELECTION_PRIMARY, targets_atom,
GDK_CURRENT_TIME); GDK_CURRENT_TIME);
} }
@ -9357,9 +9353,9 @@ int main( int argc,
button = gtk_button_new_with_label ("Get Targets"); button = gtk_button_new_with_label ("Get Targets");
gtk_container_add (GTK_CONTAINER (window), button); gtk_container_add (GTK_CONTAINER (window), button);
g_signal_connect (G_OBJECT(button), "clicked", g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (get_targets), NULL); G_CALLBACK (get_targets), window);
g_signal_connect (G_OBJECT(button), "selection_received", g_signal_connect (G_OBJECT (window), "selection_received",
G_CALLBACK (selection_received), NULL); G_CALLBACK (selection_received), NULL);
gtk_widget_show (button); gtk_widget_show (button);
@ -9407,7 +9403,7 @@ responsible for filling in the fields <literal>type</literal>, <literal>format</
<literal>data</literal>, and <literal>length</literal>. (The <literal>format</literal> field is actually <literal>data</literal>, and <literal>length</literal>. (The <literal>format</literal> field is actually
important here - the X server uses it to figure out whether the data important here - the X server uses it to figure out whether the data
needs to be byte-swapped or not. Usually it will be 8 - <emphasis>i.e.</emphasis> a needs to be byte-swapped or not. Usually it will be 8 - <emphasis>i.e.</emphasis> a
character - or 32 - <emphasis>i.e.</emphasis> a. integer.) This is done by calling the character - or 32 - <emphasis>i.e.</emphasis> an integer.) This is done by calling the
function:</para> function:</para>
<programlisting role="C"> <programlisting role="C">
@ -9426,9 +9422,9 @@ in the fields of the GtkSelectionData structure by hand.)</para>
calling:</para> calling:</para>
<programlisting role="C"> <programlisting role="C">
gint gtk_selection_owner_set( GtkWidget *widget, gboolean gtk_selection_owner_set( GtkWidget *widget,
GdkAtom selection, GdkAtom selection,
guint32 time ); guint32 time );
</programlisting> </programlisting>
<para>If another application claims ownership of the selection, you will <para>If another application claims ownership of the selection, you will
@ -9448,13 +9444,16 @@ string representation of the time is returned.</para>
#include &lt;gtk/gtk.h&gt; #include &lt;gtk/gtk.h&gt;
#include &lt;time.h&gt; #include &lt;time.h&gt;
GtkWidget *selection_button;
GtkWidget *selection_widget;
/* Callback when the user toggles the selection */ /* Callback when the user toggles the selection */
void selection_toggled( GtkWidget *widget, void selection_toggled( GtkWidget *widget,
gint *have_selection ) gint *have_selection )
{ {
if (GTK_TOGGLE_BUTTON (widget)-&gt;active) if (GTK_TOGGLE_BUTTON (widget)-&gt;active)
{ {
*have_selection = gtk_selection_owner_set (widget, *have_selection = gtk_selection_owner_set (selection_widget,
GDK_SELECTION_PRIMARY, GDK_SELECTION_PRIMARY,
GDK_CURRENT_TIME); GDK_CURRENT_TIME);
/* if claiming the selection failed, we return the button to /* if claiming the selection failed, we return the button to
@ -9482,7 +9481,7 @@ gint selection_clear( GtkWidget *widget,
gint *have_selection ) gint *have_selection )
{ {
*have_selection = FALSE; *have_selection = FALSE;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (selection_button), FALSE);
return TRUE; return TRUE;
} }
@ -9510,7 +9509,6 @@ int main( int argc,
char *argv[] ) char *argv[] )
{ {
GtkWidget *window; GtkWidget *window;
GtkWidget *selection_button;
static int have_selection = FALSE; static int have_selection = FALSE;
@ -9527,20 +9525,21 @@ int main( int argc,
/* Create a toggle button to act as the selection */ /* Create a toggle button to act as the selection */
selection_widget = gtk_invisible_new ();
selection_button = gtk_toggle_button_new_with_label ("Claim Selection"); selection_button = gtk_toggle_button_new_with_label ("Claim Selection");
gtk_container_add (GTK_CONTAINER (window), selection_button); gtk_container_add (GTK_CONTAINER (window), selection_button);
gtk_widget_show (selection_button); gtk_widget_show (selection_button);
g_signal_connect (G_OBJECT (selection_button), "toggled", g_signal_connect (G_OBJECT (selection_button), "toggled",
G_CALLBACK (selection_toggled), &amp;have_selection); G_CALLBACK (selection_toggled), &amp;have_selection);
g_signal_connect (G_OBJECT (selection_button), "selection_clear_event", g_signal_connect (G_OBJECT (selection_widget), "selection_clear_event",
G_CALLBACK (selection_clear), &amp;have_selection); G_CALLBACK (selection_clear), &amp;have_selection);
gtk_selection_add_target (selection_button, gtk_selection_add_target (selection_widget,
GDK_SELECTION_PRIMARY, GDK_SELECTION_PRIMARY,
GDK_SELECTION_TYPE_STRING, GDK_SELECTION_TYPE_STRING,
1); 1);
g_signal_connect (G_OBJECT (selection_button), "selection_get", g_signal_connect (G_OBJECT (selection_widget), "selection_get",
G_CALLBACK (selection_handle), &amp;have_selection); G_CALLBACK (selection_handle), &amp;have_selection);
gtk_widget_show (selection_button); gtk_widget_show (selection_button);

View File

@ -141,7 +141,7 @@ selection_toggled (GtkWidget *widget)
{ {
if (GTK_TOGGLE_BUTTON(widget)->active) if (GTK_TOGGLE_BUTTON(widget)->active)
{ {
have_selection = gtk_selection_owner_set (widget, have_selection = gtk_selection_owner_set (selection_widget,
GDK_SELECTION_PRIMARY, GDK_SELECTION_PRIMARY,
GDK_CURRENT_TIME); GDK_CURRENT_TIME);
if (!have_selection) if (!have_selection)
@ -197,7 +197,7 @@ gint
selection_clear (GtkWidget *widget, GdkEventSelection *event) selection_clear (GtkWidget *widget, GdkEventSelection *event)
{ {
have_selection = FALSE; have_selection = FALSE;
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), FALSE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(selection_button), FALSE);
return TRUE; return TRUE;
} }