2008-07-01 22:57:50 +00:00
/* GTK - The GIMP Toolkit
2008-02-27 10:31:24 +00:00
* Copyright ( C ) 1995 - 1997 Peter Mattis , Spencer Kimball and Josh MacDonald
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser 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
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
2012-02-27 13:01:10 +00:00
* License along with this library . If not , see < http : //www.gnu.org/licenses/>.
2008-02-27 10:31:24 +00:00
*/
2001-08-04 23:30:11 +00:00
2008-02-27 10:31:24 +00:00
/*
* Modified by the GTK + Team and others 1997 - 2000. See the AUTHORS
* file for a list of people on the GTK + Team . See the ChangeLog
* files for a list of changes . These files are distributed with
* GTK + at ftp : //ftp.gtk.org/pub/gtk/.
*/
2008-06-22 14:28:52 +00:00
# include "config.h"
2008-02-27 10:31:24 +00:00
# undef G_LOG_DOMAIN
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <sys/stat.h>
# include <math.h>
# include <time.h>
# ifdef HAVE_UNISTD_H
# include <unistd.h>
# endif
# include "gtk/gtk.h"
# include "gdk/gdk.h"
# include "gdk/gdkkeysyms.h"
# ifdef G_OS_WIN32
# define sleep(n) _sleep(n)
# endif
# include "test.xpm"
gboolean
file_exists ( const char * filename )
{
struct stat statbuf ;
return stat ( filename , & statbuf ) = = 0 ;
}
GtkWidget *
shape_create_icon ( GdkScreen * screen ,
char * xpm_file ,
gint x ,
gint y ,
gint px ,
gint py ,
gint window_type ) ;
static GtkWidget *
build_option_menu ( gchar * items [ ] ,
gint num_items ,
gint history ,
void ( * func ) ( GtkWidget * widget , gpointer data ) ,
gpointer data ) ;
/* macro, structure and variables used by tree window demos */
# define DEFAULT_NUMBER_OF_ITEM 3
# define DEFAULT_RECURSION_LEVEL 3
struct {
GSList * selection_mode_group ;
GtkWidget * single_button ;
GtkWidget * browse_button ;
GtkWidget * multiple_button ;
GtkWidget * draw_line_button ;
GtkWidget * view_line_button ;
GtkWidget * no_root_item_button ;
GtkWidget * nb_item_spinner ;
GtkWidget * recursion_spinner ;
} sTreeSampleSelection ;
typedef struct sTreeButtons {
guint nb_item_add ;
GtkWidget * add_button ;
GtkWidget * remove_button ;
GtkWidget * subtree_button ;
} sTreeButtons ;
/* end of tree section */
static GtkWidget *
build_option_menu ( gchar * items [ ] ,
gint num_items ,
gint history ,
void ( * func ) ( GtkWidget * widget , gpointer data ) ,
gpointer data )
{
GtkWidget * omenu ;
gint i ;
2010-10-02 16:19:46 +00:00
omenu = gtk_combo_box_text_new ( ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( omenu , " changed " ,
G_CALLBACK ( func ) , data ) ;
for ( i = 0 ; i < num_items ; i + + )
2010-10-02 16:19:46 +00:00
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( omenu ) , items [ i ] ) ;
2008-02-27 10:31:24 +00:00
2010-03-26 16:55:07 +00:00
gtk_combo_box_set_active ( GTK_COMBO_BOX ( omenu ) , history ) ;
2008-02-27 10:31:24 +00:00
return omenu ;
}
/*
* Windows with an alpha channel
*/
static gboolean
2010-09-08 20:25:50 +00:00
on_alpha_window_draw ( GtkWidget * widget ,
cairo_t * cr )
2008-02-27 10:31:24 +00:00
{
cairo_pattern_t * pattern ;
2010-09-08 20:25:50 +00:00
int radius , width , height ;
2008-02-27 10:31:24 +00:00
2015-10-20 20:45:52 +00:00
/* Get the child allocation to avoid painting over the borders */
GtkWidget * child = gtk_bin_get_child ( GTK_BIN ( widget ) ) ;
GtkAllocation child_allocation ;
int border_width = gtk_container_get_border_width ( GTK_CONTAINER ( child ) ) ;
gtk_widget_get_allocation ( child , & child_allocation ) ;
child_allocation . x - = border_width ;
child_allocation . y - = border_width ;
child_allocation . width + = 2 * border_width ;
child_allocation . height + = 2 * border_width ;
cairo_translate ( cr , child_allocation . x , child_allocation . y ) ;
cairo_rectangle ( cr , 0 , 0 , child_allocation . width , child_allocation . height ) ;
cairo_clip ( cr ) ;
2010-09-08 20:25:50 +00:00
width = gtk_widget_get_allocated_width ( widget ) ;
height = gtk_widget_get_allocated_height ( widget ) ;
radius = MIN ( width , height ) / 2 ;
pattern = cairo_pattern_create_radial ( width / 2 ,
height / 2 ,
2008-02-27 10:31:24 +00:00
0.0 ,
2010-09-08 20:25:50 +00:00
width / 2 ,
height / 2 ,
2008-02-27 10:31:24 +00:00
radius * 1.33 ) ;
2010-08-28 21:13:19 +00:00
if ( gdk_screen_get_rgba_visual ( gtk_widget_get_screen ( widget ) ) & &
2008-02-27 10:31:24 +00:00
gtk_widget_is_composited ( widget ) )
cairo_set_source_rgba ( cr , 1.0 , 1.0 , 1.0 , 0.0 ) ; /* transparent */
else
cairo_set_source_rgb ( cr , 1.0 , 1.0 , 1.0 ) ; /* opaque white */
cairo_set_operator ( cr , CAIRO_OPERATOR_SOURCE ) ;
cairo_paint ( cr ) ;
cairo_pattern_add_color_stop_rgba ( pattern , 0.0 ,
1.0 , 0.75 , 0.0 , 1.0 ) ; /* solid orange */
cairo_pattern_add_color_stop_rgba ( pattern , 1.0 ,
1.0 , 0.75 , 0.0 , 0.0 ) ; /* transparent orange */
cairo_set_source ( cr , pattern ) ;
cairo_pattern_destroy ( pattern ) ;
cairo_set_operator ( cr , CAIRO_OPERATOR_OVER ) ;
cairo_paint ( cr ) ;
return FALSE ;
}
static GtkWidget *
build_alpha_widgets ( void )
{
2011-09-28 00:25:07 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
GtkWidget * radio_button ;
2011-09-28 00:25:07 +00:00
GtkWidget * check_button ;
2008-02-27 10:31:24 +00:00
GtkWidget * hbox ;
GtkWidget * label ;
GtkWidget * entry ;
2011-09-28 00:25:07 +00:00
grid = gtk_grid_new ( ) ;
2008-02-27 10:31:24 +00:00
radio_button = gtk_radio_button_new_with_label ( NULL , " Red " ) ;
2011-09-28 00:25:07 +00:00
gtk_widget_set_hexpand ( radio_button , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , radio_button , 0 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
radio_button = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON ( radio_button ) , " Green " ) ;
2011-09-28 00:25:07 +00:00
gtk_widget_set_hexpand ( radio_button , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , radio_button , 0 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
radio_button = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON ( radio_button ) , " Blue " ) ,
2011-09-28 00:25:07 +00:00
gtk_widget_set_hexpand ( radio_button , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , radio_button , 0 , 2 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2011-09-28 00:25:07 +00:00
check_button = gtk_check_button_new_with_label ( " Sedentary " ) ,
gtk_widget_set_hexpand ( check_button , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 1 , 0 , 1 , 1 ) ;
check_button = gtk_check_button_new_with_label ( " Nocturnal " ) ,
gtk_widget_set_hexpand ( check_button , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 1 , 1 , 1 , 1 ) ;
check_button = gtk_check_button_new_with_label ( " Compulsive " ) ,
gtk_widget_set_hexpand ( check_button , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 1 , 2 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( NULL ) ;
gtk_label_set_markup ( GTK_LABEL ( label ) , " <i>Entry: </i> " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , FALSE , 0 ) ;
entry = gtk_entry_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , entry , TRUE , TRUE , 0 ) ;
2011-09-28 00:25:07 +00:00
gtk_widget_set_hexpand ( hbox , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , hbox , 0 , 3 , 2 , 1 ) ;
2008-02-27 10:31:24 +00:00
2011-09-28 00:25:07 +00:00
return grid ;
2008-02-27 10:31:24 +00:00
}
static void
2010-08-28 18:04:08 +00:00
on_alpha_screen_changed ( GtkWindow * window ,
2008-02-27 10:31:24 +00:00
GdkScreen * old_screen ,
GtkWidget * label )
{
2010-08-28 18:04:08 +00:00
GdkScreen * screen = gtk_widget_get_screen ( GTK_WIDGET ( window ) ) ;
GdkVisual * visual = gdk_screen_get_rgba_visual ( screen ) ;
2008-02-27 10:31:24 +00:00
2010-08-28 18:04:08 +00:00
if ( ! visual )
2008-02-27 10:31:24 +00:00
{
2010-08-28 18:04:08 +00:00
visual = gdk_screen_get_system_visual ( screen ) ;
2008-02-27 10:31:24 +00:00
gtk_label_set_markup ( GTK_LABEL ( label ) , " <b>Screen doesn't support alpha</b> " ) ;
}
else
{
gtk_label_set_markup ( GTK_LABEL ( label ) , " <b>Screen supports alpha</b> " ) ;
}
2010-09-28 17:11:46 +00:00
gtk_widget_set_visual ( GTK_WIDGET ( window ) , visual ) ;
2008-02-27 10:31:24 +00:00
}
static void
on_composited_changed ( GtkWidget * window ,
GtkLabel * label )
{
gboolean is_composited = gtk_widget_is_composited ( window ) ;
if ( is_composited )
gtk_label_set_text ( label , " Composited " ) ;
else
gtk_label_set_text ( label , " Not composited " ) ;
}
void
create_alpha_window ( GtkWidget * widget )
{
static GtkWidget * window ;
if ( ! window )
{
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * vbox ;
GtkWidget * label ;
window = gtk_dialog_new_with_buttons ( " Alpha Window " ,
GTK_WINDOW ( gtk_widget_get_toplevel ( widget ) ) , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " , 0 ,
2008-02-27 10:31:24 +00:00
NULL ) ;
gtk_widget_set_app_paintable ( window , TRUE ) ;
2010-09-08 20:25:50 +00:00
g_signal_connect ( window , " draw " ,
G_CALLBACK ( on_alpha_window_draw ) , NULL ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 8 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 12 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , vbox ,
2008-02-27 10:31:24 +00:00
TRUE , TRUE , 0 ) ;
label = gtk_label_new ( NULL ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , TRUE , TRUE , 0 ) ;
2010-08-28 18:04:08 +00:00
on_alpha_screen_changed ( GTK_WINDOW ( window ) , NULL , label ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " screen-changed " ,
G_CALLBACK ( on_alpha_screen_changed ) , label ) ;
label = gtk_label_new ( NULL ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , TRUE , TRUE , 0 ) ;
on_composited_changed ( window , GTK_LABEL ( label ) ) ;
g_signal_connect ( window , " composited_changed " , G_CALLBACK ( on_composited_changed ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , build_alpha_widgets ( ) , TRUE , TRUE , 0 ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Composited non - toplevel window
*/
2010-09-08 20:31:06 +00:00
/* The draw event handler for the event box.
2008-02-27 10:31:24 +00:00
*
* This function simply draws a transparency onto a widget on the area
* for which it receives expose events . This is intended to give the
* event box a " transparent " background .
*
* In order for this to work properly , the widget must have an RGBA
* colourmap . The widget should also be set as app - paintable since it
* doesn ' t make sense for GTK to draw a background if we are drawing it
* ( and because GTK might actually replace our transparency with its
* default background colour ) .
*/
static gboolean
2010-09-08 20:31:06 +00:00
transparent_draw ( GtkWidget * widget ,
cairo_t * cr )
2008-02-27 10:31:24 +00:00
{
cairo_set_operator ( cr , CAIRO_OPERATOR_CLEAR ) ;
2010-09-08 20:31:06 +00:00
cairo_paint ( cr ) ;
2008-02-27 10:31:24 +00:00
return FALSE ;
}
/* The expose event handler for the window.
*
* This function performs the actual compositing of the event box onto
* the already - existing background of the window at 50 % normal opacity .
*
* In this case we do not want app - paintable to be set on the widget
* since we want it to draw its own ( red ) background . Because of this ,
* however , we must ensure that we use g_signal_register_after so that
* this handler is called after the red has been drawn . If it was
* called before then GTK would just blindly paint over our work .
*/
static gboolean
2010-09-08 20:31:06 +00:00
window_draw ( GtkWidget * widget ,
cairo_t * cr )
2008-02-27 10:31:24 +00:00
{
2010-08-15 22:33:57 +00:00
GtkAllocation allocation ;
2008-02-27 10:31:24 +00:00
GtkWidget * child ;
2014-10-12 02:54:40 +00:00
/* put a red background on the window */
cairo_set_source_rgb ( cr , 1 , 0 , 0 ) ;
cairo_paint ( cr ) ;
2008-02-27 10:31:24 +00:00
/* get our child (in this case, the event box) */
child = gtk_bin_get_child ( GTK_BIN ( widget ) ) ;
2010-08-15 22:33:57 +00:00
gtk_widget_get_allocation ( child , & allocation ) ;
2008-02-27 10:31:24 +00:00
/* the source data is the (composited) event box */
2010-08-27 10:52:59 +00:00
gdk_cairo_set_source_window ( cr , gtk_widget_get_window ( child ) ,
2010-08-15 22:33:57 +00:00
allocation . x ,
allocation . y ) ;
2008-02-27 10:31:24 +00:00
/* composite, with a 50% opacity */
cairo_paint_with_alpha ( cr , 0.5 ) ;
return FALSE ;
}
void
create_composited_window ( GtkWidget * widget )
{
static GtkWidget * window ;
if ( ! window )
{
GtkWidget * event , * button ;
/* make the widgets */
button = gtk_button_new_with_label ( " A Button " ) ;
event = gtk_event_box_new ( ) ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
/* set our event box to have a fully-transparent background
* drawn on it . currently there is no way to simply tell gtk
* that " transparency " is the background colour for a widget .
*/
gtk_widget_set_app_paintable ( GTK_WIDGET ( event ) , TRUE ) ;
2010-09-08 20:31:06 +00:00
g_signal_connect ( event , " draw " ,
G_CALLBACK ( transparent_draw ) , NULL ) ;
2008-02-27 10:31:24 +00:00
/* put them inside one another */
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 10 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , event ) ;
gtk_container_add ( GTK_CONTAINER ( event ) , button ) ;
/* realise and show everything */
gtk_widget_realize ( button ) ;
/* set the event box GdkWindow to be composited.
* obviously must be performed after event box is realised .
*/
2014-10-12 02:54:40 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
2010-08-15 22:33:57 +00:00
gdk_window_set_composited ( gtk_widget_get_window ( event ) ,
TRUE ) ;
2014-10-12 02:54:40 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
/* set up the compositing handler.
* note that we do _after so that the normal ( red ) background is drawn
* by gtk before our compositing occurs .
*/
2010-09-08 20:31:06 +00:00
g_signal_connect_after ( window , " draw " ,
G_CALLBACK ( window_draw ) , NULL ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Big windows and guffaw scrolling
*/
static void
pattern_set_bg ( GtkWidget * widget ,
GdkWindow * child ,
gint level )
{
2012-01-03 02:35:02 +00:00
static GdkRGBA colors [ ] = {
2011-12-26 16:12:20 +00:00
{ 0.27 , 0.27 , 1.0 , 1.0 } ,
{ 0.53 , 0.53 , 1.0 , 1.0 } ,
{ 0.67 , 0.67 , 1.0 , 1.0 }
2008-02-27 10:31:24 +00:00
} ;
gdk_window_set_user_data ( child , widget ) ;
2011-12-26 16:12:20 +00:00
gdk_window_set_background_rgba ( child , & colors [ level ] ) ;
2008-02-27 10:31:24 +00:00
}
static void
create_pattern ( GtkWidget * widget ,
GdkWindow * parent ,
gint level ,
gint width ,
gint height )
{
gint h = 1 ;
gint i = 0 ;
GdkWindow * child ;
while ( 2 * h < = height )
{
gint w = 1 ;
gint j = 0 ;
while ( 2 * w < = width )
{
if ( ( i + j ) % 2 = = 0 )
{
gint x = w - 1 ;
gint y = h - 1 ;
GdkWindowAttr attributes ;
attributes . window_type = GDK_WINDOW_CHILD ;
attributes . x = x ;
attributes . y = y ;
attributes . width = w ;
attributes . height = h ;
attributes . wclass = GDK_INPUT_OUTPUT ;
attributes . event_mask = GDK_EXPOSURE_MASK ;
attributes . visual = gtk_widget_get_visual ( widget ) ;
child = gdk_window_new ( parent , & attributes ,
2010-08-28 16:05:30 +00:00
GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL ) ;
2008-02-27 10:31:24 +00:00
pattern_set_bg ( widget , child , level ) ;
if ( level < 2 )
create_pattern ( widget , child , level + 1 , w , h ) ;
gdk_window_show ( child ) ;
}
j + + ;
w * = 2 ;
}
i + + ;
h * = 2 ;
}
}
# define PATTERN_SIZE (1 << 18)
static void
2011-01-05 22:28:55 +00:00
pattern_hadj_changed ( GtkAdjustment * adjustment ,
2008-02-27 10:31:24 +00:00
GtkWidget * darea )
{
2011-01-05 22:28:55 +00:00
gint * old_value = g_object_get_data ( G_OBJECT ( adjustment ) , " old-value " ) ;
2011-01-05 22:33:50 +00:00
gint new_value = gtk_adjustment_get_value ( adjustment ) ;
2008-02-27 10:31:24 +00:00
2010-03-02 06:16:02 +00:00
if ( gtk_widget_get_realized ( darea ) )
2008-02-27 10:31:24 +00:00
{
2010-08-15 22:33:57 +00:00
gdk_window_scroll ( gtk_widget_get_window ( darea ) ,
* old_value - new_value , 0 ) ;
2008-02-27 10:31:24 +00:00
* old_value = new_value ;
}
}
static void
2011-01-05 22:28:55 +00:00
pattern_vadj_changed ( GtkAdjustment * adjustment ,
2008-02-27 10:31:24 +00:00
GtkWidget * darea )
{
2011-01-05 22:28:55 +00:00
gint * old_value = g_object_get_data ( G_OBJECT ( adjustment ) , " old-value " ) ;
2011-01-05 22:33:50 +00:00
gint new_value = gtk_adjustment_get_value ( adjustment ) ;
2008-02-27 10:31:24 +00:00
2010-03-02 06:16:02 +00:00
if ( gtk_widget_get_realized ( darea ) )
2008-02-27 10:31:24 +00:00
{
2010-08-15 22:33:57 +00:00
gdk_window_scroll ( gtk_widget_get_window ( darea ) ,
0 , * old_value - new_value ) ;
2008-02-27 10:31:24 +00:00
* old_value = new_value ;
}
}
static void
pattern_realize ( GtkWidget * widget ,
gpointer data )
{
2010-08-15 22:33:57 +00:00
GdkWindow * window ;
window = gtk_widget_get_window ( widget ) ;
pattern_set_bg ( widget , window , 0 ) ;
create_pattern ( widget , window , 1 , PATTERN_SIZE , PATTERN_SIZE ) ;
2008-02-27 10:31:24 +00:00
}
static void
create_big_windows ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2011-09-28 00:28:39 +00:00
GtkWidget * darea , * grid , * scrollbar ;
2008-02-27 10:31:24 +00:00
GtkWidget * eventbox ;
2011-01-05 22:28:55 +00:00
GtkAdjustment * hadjustment ;
GtkAdjustment * vadjustment ;
2008-02-27 10:31:24 +00:00
static gint current_x ;
static gint current_y ;
if ( ! window )
{
current_x = 0 ;
current_y = 0 ;
window = gtk_dialog_new_with_buttons ( " Big Windows " ,
NULL , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " ,
2008-02-27 10:31:24 +00:00
GTK_RESPONSE_NONE ,
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_default_size ( GTK_WINDOW ( window ) , 200 , 300 ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2011-09-28 00:28:39 +00:00
grid = gtk_grid_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( content_area ) , grid , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
darea = gtk_drawing_area_new ( ) ;
2011-01-05 22:28:55 +00:00
hadjustment = gtk_adjustment_new ( 0 , 0 , PATTERN_SIZE , 10 , 100 , 100 ) ;
g_signal_connect ( hadjustment , " value_changed " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( pattern_hadj_changed ) , darea ) ;
2011-01-05 22:28:55 +00:00
g_object_set_data ( G_OBJECT ( hadjustment ) , " old-value " , & current_x ) ;
2010-09-27 13:10:12 +00:00
2011-01-05 22:28:55 +00:00
vadjustment = gtk_adjustment_new ( 0 , 0 , PATTERN_SIZE , 10 , 100 , 100 ) ;
g_signal_connect ( vadjustment , " value_changed " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( pattern_vadj_changed ) , darea ) ;
2011-01-05 22:28:55 +00:00
g_object_set_data ( G_OBJECT ( vadjustment ) , " old-value " , & current_y ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( darea , " realize " ,
G_CALLBACK ( pattern_realize ) ,
NULL ) ;
eventbox = gtk_event_box_new ( ) ;
2011-09-28 00:28:39 +00:00
gtk_widget_set_hexpand ( eventbox , TRUE ) ;
gtk_widget_set_vexpand ( eventbox , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , eventbox , 0 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( eventbox ) , darea ) ;
2011-01-05 22:28:55 +00:00
scrollbar = gtk_scrollbar_new ( GTK_ORIENTATION_HORIZONTAL , hadjustment ) ;
2011-09-28 00:28:39 +00:00
gtk_widget_set_hexpand ( scrollbar , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , scrollbar , 0 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2011-01-05 22:28:55 +00:00
scrollbar = gtk_scrollbar_new ( GTK_ORIENTATION_VERTICAL , vadjustment ) ;
2011-09-28 00:28:39 +00:00
gtk_widget_set_vexpand ( scrollbar , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , scrollbar , 1 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_hide ( window ) ;
}
/*
* GtkButton
*/
static void
button_window ( GtkWidget * widget ,
GtkWidget * button )
{
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( button ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( button ) ;
else
gtk_widget_hide ( button ) ;
}
static void
create_buttons ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
2011-09-28 00:52:07 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
GtkWidget * separator ;
2011-09-28 00:45:43 +00:00
GtkWidget * button [ 10 ] ;
int button_x [ 9 ] = { 0 , 1 , 2 , 0 , 2 , 1 , 1 , 2 , 0 } ;
int button_y [ 9 ] = { 0 , 1 , 2 , 2 , 0 , 2 , 0 , 1 , 1 } ;
guint i ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " GtkButton " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2011-09-28 00:52:07 +00:00
grid = gtk_grid_new ( ) ;
gtk_grid_set_row_spacing ( GTK_GRID ( grid ) , 5 ) ;
gtk_grid_set_column_spacing ( GTK_GRID ( grid ) , 5 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( grid ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , grid , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
2013-06-26 13:50:32 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
button [ 0 ] = gtk_button_new_with_label ( " button1 " ) ;
button [ 1 ] = gtk_button_new_with_mnemonic ( " _button2 " ) ;
button [ 2 ] = gtk_button_new_with_mnemonic ( " _button3 " ) ;
button [ 3 ] = gtk_button_new_from_stock ( GTK_STOCK_OK ) ;
button [ 4 ] = gtk_button_new_with_label ( " button5 " ) ;
button [ 5 ] = gtk_button_new_with_label ( " button6 " ) ;
button [ 6 ] = gtk_button_new_with_label ( " button7 " ) ;
button [ 7 ] = gtk_button_new_from_stock ( GTK_STOCK_CLOSE ) ;
button [ 8 ] = gtk_button_new_with_label ( " button9 " ) ;
2013-06-26 13:50:32 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
2011-09-28 00:45:43 +00:00
for ( i = 0 ; i < 9 ; i + + )
{
g_signal_connect ( button [ i ] , " clicked " ,
G_CALLBACK ( button_window ) ,
button [ ( i + 1 ) % 9 ] ) ;
2011-09-28 00:52:07 +00:00
gtk_widget_set_hexpand ( button [ i ] , TRUE ) ;
gtk_widget_set_vexpand ( button [ i ] , TRUE ) ;
2011-09-28 00:45:43 +00:00
2011-09-28 00:52:07 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , button [ i ] ,
button_x [ i ] , button_y [ i ] + 1 , 1 , 1 ) ;
2011-09-28 00:45:43 +00:00
}
2008-02-27 10:31:24 +00:00
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button [ 9 ] = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button [ 9 ] , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button [ 9 ] , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button [ 9 ] , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button [ 9 ] ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkToggleButton
*/
static void
create_toggle_buttons ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * separator ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " GtkToggleButton " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
button = gtk_toggle_button_new_with_label ( " button1 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_toggle_button_new_with_label ( " button2 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_toggle_button_new_with_label ( " button3 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_toggle_button_new_with_label ( " inconsistent " ) ;
gtk_toggle_button_set_inconsistent ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
static GtkWidget *
create_widget_grid ( GType widget_type )
{
2011-09-28 01:25:47 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
GtkWidget * group_widget = NULL ;
gint i , j ;
2011-09-28 01:25:47 +00:00
grid = gtk_grid_new ( ) ;
2008-02-27 10:31:24 +00:00
for ( i = 0 ; i < 5 ; i + + )
{
for ( j = 0 ; j < 5 ; j + + )
{
GtkWidget * widget ;
char * tmp ;
if ( i = = 0 & & j = = 0 )
{
widget = NULL ;
}
else if ( i = = 0 )
{
tmp = g_strdup_printf ( " %d " , j ) ;
widget = gtk_label_new ( tmp ) ;
g_free ( tmp ) ;
}
else if ( j = = 0 )
{
tmp = g_strdup_printf ( " %c " , ' A ' + i - 1 ) ;
widget = gtk_label_new ( tmp ) ;
g_free ( tmp ) ;
}
else
{
widget = g_object_new ( widget_type , NULL ) ;
if ( g_type_is_a ( widget_type , GTK_TYPE_RADIO_BUTTON ) )
{
if ( ! group_widget )
group_widget = widget ;
else
g_object_set ( widget , " group " , group_widget , NULL ) ;
}
}
if ( widget )
2011-09-28 01:25:47 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , widget , i , j , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
}
}
2011-09-28 01:25:47 +00:00
return grid ;
2008-02-27 10:31:24 +00:00
}
/*
* GtkCheckButton
*/
static void
create_check_buttons ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * separator ;
GtkWidget * table ;
if ( ! window )
{
window = gtk_dialog_new_with_buttons ( " Check Buttons " ,
NULL , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " ,
2008-02-27 10:31:24 +00:00
GTK_RESPONSE_NONE ,
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2010-06-03 07:36:39 +00:00
box1 = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
button = gtk_check_button_new_with_mnemonic ( " _button1 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_check_button_new_with_label ( " button2 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_check_button_new_with_label ( " button3 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_check_button_new_with_label ( " inconsistent " ) ;
gtk_toggle_button_set_inconsistent ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
table = create_widget_grid ( GTK_TYPE_CHECK_BUTTON ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( table ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , table , TRUE , TRUE , 0 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkRadioButton
*/
static void
create_radio_buttons ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * separator ;
GtkWidget * table ;
if ( ! window )
{
window = gtk_dialog_new_with_buttons ( " Radio Buttons " ,
NULL , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " ,
2008-02-27 10:31:24 +00:00
GTK_RESPONSE_NONE ,
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2010-06-03 07:36:39 +00:00
box1 = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label ( NULL , " button1 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group ( GTK_RADIO_BUTTON ( button ) ) ,
" button2 " ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group ( GTK_RADIO_BUTTON ( button ) ) ,
" button3 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group ( GTK_RADIO_BUTTON ( button ) ) ,
" inconsistent " ) ;
gtk_toggle_button_set_inconsistent ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label ( NULL , " button4 " ) ;
gtk_toggle_button_set_mode ( GTK_TOGGLE_BUTTON ( button ) , FALSE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group ( GTK_RADIO_BUTTON ( button ) ) ,
" button5 " ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
gtk_toggle_button_set_mode ( GTK_TOGGLE_BUTTON ( button ) , FALSE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group ( GTK_RADIO_BUTTON ( button ) ) ,
" button6 " ) ;
gtk_toggle_button_set_mode ( GTK_TOGGLE_BUTTON ( button ) , FALSE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
table = create_widget_grid ( GTK_TYPE_RADIO_BUTTON ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( table ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , table , TRUE , TRUE , 0 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkButtonBox
*/
static GtkWidget *
create_bbox ( gint horizontal ,
char * title ,
gint spacing ,
gint child_w ,
gint child_h ,
gint layout )
{
GtkWidget * frame ;
GtkWidget * bbox ;
GtkWidget * button ;
frame = gtk_frame_new ( title ) ;
if ( horizontal )
2010-10-29 23:21:15 +00:00
bbox = gtk_button_box_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
else
2010-10-29 23:21:15 +00:00
bbox = gtk_button_box_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( bbox ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , bbox ) ;
gtk_button_box_set_layout ( GTK_BUTTON_BOX ( bbox ) , layout ) ;
gtk_box_set_spacing ( GTK_BOX ( bbox ) , spacing ) ;
button = gtk_button_new_with_label ( " OK " ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , button ) ;
button = gtk_button_new_with_label ( " Cancel " ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , button ) ;
button = gtk_button_new_with_label ( " Help " ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , button ) ;
return frame ;
}
static void
create_button_box ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * main_vbox ;
GtkWidget * vbox ;
GtkWidget * hbox ;
GtkWidget * frame_horz ;
GtkWidget * frame_vert ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) , gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Button Boxes " ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 10 ) ;
2010-10-31 17:07:20 +00:00
main_vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , main_vbox ) ;
frame_horz = gtk_frame_new ( " Horizontal Button Boxes " ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , frame_horz , TRUE , TRUE , 10 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 10 ) ;
gtk_container_add ( GTK_CONTAINER ( frame_horz ) , vbox ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_bbox ( TRUE , " Spread " , 40 , 85 , 20 , GTK_BUTTONBOX_SPREAD ) ,
TRUE , TRUE , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_bbox ( TRUE , " Edge " , 40 , 85 , 20 , GTK_BUTTONBOX_EDGE ) ,
TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_bbox ( TRUE , " Start " , 40 , 85 , 20 , GTK_BUTTONBOX_START ) ,
TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_bbox ( TRUE , " End " , 40 , 85 , 20 , GTK_BUTTONBOX_END ) ,
TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_bbox ( TRUE , " Center " , 40 , 85 , 20 , GTK_BUTTONBOX_CENTER ) ,
TRUE , TRUE , 5 ) ;
frame_vert = gtk_frame_new ( " Vertical Button Boxes " ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , frame_vert , TRUE , TRUE , 10 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 10 ) ;
gtk_container_add ( GTK_CONTAINER ( frame_vert ) , hbox ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) ,
create_bbox ( FALSE , " Spread " , 30 , 85 , 20 , GTK_BUTTONBOX_SPREAD ) ,
TRUE , TRUE , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) ,
create_bbox ( FALSE , " Edge " , 30 , 85 , 20 , GTK_BUTTONBOX_EDGE ) ,
TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) ,
create_bbox ( FALSE , " Start " , 30 , 85 , 20 , GTK_BUTTONBOX_START ) ,
TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) ,
create_bbox ( FALSE , " End " , 30 , 85 , 20 , GTK_BUTTONBOX_END ) ,
TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) ,
create_bbox ( FALSE , " Center " , 30 , 85 , 20 , GTK_BUTTONBOX_CENTER ) ,
TRUE , TRUE , 5 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkToolBar
*/
static GtkWidget *
2010-08-06 20:09:08 +00:00
new_pixbuf ( char * filename ,
2010-11-25 17:49:16 +00:00
GdkWindow * window )
2008-02-27 10:31:24 +00:00
{
2010-08-06 20:09:08 +00:00
GtkWidget * widget ;
GdkPixbuf * pixbuf ;
2008-02-27 10:31:24 +00:00
2010-08-06 20:09:08 +00:00
if ( strcmp ( filename , " test.xpm " ) = = 0 )
pixbuf = NULL ;
2008-02-27 10:31:24 +00:00
else
2010-08-06 20:09:08 +00:00
pixbuf = gdk_pixbuf_new_from_file ( filename , NULL ) ;
if ( pixbuf = = NULL )
pixbuf = gdk_pixbuf_new_from_xpm_data ( ( const char * * ) openfile ) ;
2008-02-27 10:31:24 +00:00
2010-08-06 20:09:08 +00:00
widget = gtk_image_new_from_pixbuf ( pixbuf ) ;
g_object_unref ( pixbuf ) ;
2008-02-27 10:31:24 +00:00
2010-08-06 20:09:08 +00:00
return widget ;
2008-02-27 10:31:24 +00:00
}
static void
set_toolbar_small_stock ( GtkWidget * widget ,
gpointer data )
{
gtk_toolbar_set_icon_size ( GTK_TOOLBAR ( data ) , GTK_ICON_SIZE_SMALL_TOOLBAR ) ;
}
static void
set_toolbar_large_stock ( GtkWidget * widget ,
gpointer data )
{
gtk_toolbar_set_icon_size ( GTK_TOOLBAR ( data ) , GTK_ICON_SIZE_LARGE_TOOLBAR ) ;
}
static void
set_toolbar_horizontal ( GtkWidget * widget ,
gpointer data )
{
2010-03-31 13:08:13 +00:00
gtk_orientable_set_orientation ( GTK_ORIENTABLE ( data ) , GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
}
static void
set_toolbar_vertical ( GtkWidget * widget ,
gpointer data )
{
2010-03-31 13:08:13 +00:00
gtk_orientable_set_orientation ( GTK_ORIENTABLE ( data ) , GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
}
static void
set_toolbar_icons ( GtkWidget * widget ,
gpointer data )
{
gtk_toolbar_set_style ( GTK_TOOLBAR ( data ) , GTK_TOOLBAR_ICONS ) ;
}
static void
set_toolbar_text ( GtkWidget * widget ,
gpointer data )
{
gtk_toolbar_set_style ( GTK_TOOLBAR ( data ) , GTK_TOOLBAR_TEXT ) ;
}
static void
set_toolbar_both ( GtkWidget * widget ,
gpointer data )
{
gtk_toolbar_set_style ( GTK_TOOLBAR ( data ) , GTK_TOOLBAR_BOTH ) ;
}
static void
set_toolbar_both_horiz ( GtkWidget * widget ,
gpointer data )
{
gtk_toolbar_set_style ( GTK_TOOLBAR ( data ) , GTK_TOOLBAR_BOTH_HORIZ ) ;
}
2013-06-30 17:14:18 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2010-03-31 13:08:13 +00:00
static GtkActionEntry create_toolbar_items [ ] = {
{ NULL , GTK_STOCK_NEW , NULL , NULL , " Stock icon: New " ,
G_CALLBACK ( set_toolbar_small_stock ) } ,
{ NULL , GTK_STOCK_OPEN , NULL , NULL , " Stock icon: Open " ,
G_CALLBACK ( set_toolbar_large_stock ) } ,
{ NULL , NULL , " Horizontal " , NULL , " Horizontal toolbar layout " ,
G_CALLBACK ( set_toolbar_horizontal ) } ,
{ NULL , NULL , " Vertical " , NULL , " Vertical toolbar layout " ,
G_CALLBACK ( set_toolbar_vertical ) } ,
{ NULL } ,
{ NULL , NULL , " Icons " , NULL , " Only show toolbar icons " ,
G_CALLBACK ( set_toolbar_icons ) } ,
{ NULL , NULL , " Text " , NULL , " Only show toolbar text " ,
G_CALLBACK ( set_toolbar_text ) } ,
{ NULL , NULL , " Both " , NULL , " Show toolbar icons and text " ,
G_CALLBACK ( set_toolbar_both ) } ,
{ NULL , NULL , " Both (horizontal) " , NULL , " Show toolbar icons and text in a horizontal fashion " ,
G_CALLBACK ( set_toolbar_both_horiz ) } ,
{ NULL } ,
{ " entry " , NULL , NULL , " This is an unusable GtkEntry ;) " ,
NULL } ,
{ NULL } ,
{ NULL } ,
{ NULL , NULL , " Frobate " , NULL , " Frobate tooltip " ,
NULL } ,
{ NULL , NULL , " Baz " , NULL , " Baz tooltip " ,
NULL } ,
{ NULL } ,
{ NULL , NULL , " Blah " , NULL , " Blash tooltip " ,
NULL } ,
{ NULL , NULL , " Bar " , NULL , " Bar tooltip " ,
NULL } ,
} ;
2013-06-30 17:14:18 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
static void
create_toolbar ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * toolbar ;
if ( ! window )
{
2010-03-31 13:08:13 +00:00
guint i ;
2008-02-27 10:31:24 +00:00
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Toolbar test " ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
gtk_widget_realize ( window ) ;
toolbar = gtk_toolbar_new ( ) ;
2010-03-31 13:08:13 +00:00
for ( i = 0 ; i < G_N_ELEMENTS ( create_toolbar_items ) ; i + + )
{
GtkToolItem * toolitem ;
if ( create_toolbar_items [ i ] . tooltip = = NULL )
toolitem = gtk_separator_tool_item_new ( ) ;
else if ( g_strcmp0 ( create_toolbar_items [ i ] . name , " entry " ) = = 0 )
{
GtkWidget * entry ;
toolitem = gtk_tool_item_new ( ) ;
entry = gtk_entry_new ( ) ;
gtk_container_add ( GTK_CONTAINER ( toolitem ) , entry ) ;
}
else if ( create_toolbar_items [ i ] . stock_id )
2013-06-26 13:50:32 +00:00
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
toolitem = gtk_tool_button_new_from_stock ( create_toolbar_items [ i ] . stock_id ) ;
G_GNUC_END_IGNORE_DEPRECATIONS ;
}
2010-03-31 13:08:13 +00:00
else
{
GtkWidget * icon ;
2010-11-25 17:49:16 +00:00
icon = new_pixbuf ( " test.xpm " , gtk_widget_get_window ( window ) ) ;
2010-03-31 13:08:13 +00:00
toolitem = gtk_tool_button_new ( icon , create_toolbar_items [ i ] . label ) ;
}
if ( create_toolbar_items [ i ] . callback )
g_signal_connect ( toolitem , " clicked " ,
create_toolbar_items [ i ] . callback , toolbar ) ;
gtk_tool_item_set_tooltip_text ( toolitem , create_toolbar_items [ i ] . tooltip ) ;
gtk_toolbar_insert ( GTK_TOOLBAR ( toolbar ) , toolitem , - 1 ) ;
}
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , toolbar ) ;
gtk_widget_set_size_request ( toolbar , 200 , - 1 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkStatusBar
*/
static guint statusbar_counter = 1 ;
static void
statusbar_push ( GtkWidget * button ,
GtkStatusbar * statusbar )
{
gchar text [ 1024 ] ;
sprintf ( text , " something %d " , statusbar_counter + + ) ;
gtk_statusbar_push ( statusbar , 1 , text ) ;
}
static void
statusbar_push_long ( GtkWidget * button ,
GtkStatusbar * statusbar )
{
gchar text [ 1024 ] ;
sprintf ( text , " Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \" repaginate \" ), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \" put away \" or \" eject \" ). " ) ;
gtk_statusbar_push ( statusbar , 1 , text ) ;
}
static void
statusbar_pop ( GtkWidget * button ,
GtkStatusbar * statusbar )
{
gtk_statusbar_pop ( statusbar , 1 ) ;
}
static void
statusbar_steal ( GtkWidget * button ,
GtkStatusbar * statusbar )
{
gtk_statusbar_remove ( statusbar , 1 , 4 ) ;
}
static void
statusbar_popped ( GtkStatusbar * statusbar ,
guint context_id ,
const gchar * text )
{
2010-07-13 01:05:58 +00:00
if ( ! text )
2008-02-27 10:31:24 +00:00
statusbar_counter = 1 ;
}
static void
statusbar_contexts ( GtkStatusbar * statusbar )
{
gchar * string ;
string = " any context " ;
g_print ( " GtkStatusBar: context= \" %s \" , context_id=%d \n " ,
string ,
gtk_statusbar_get_context_id ( statusbar , string ) ) ;
string = " idle messages " ;
g_print ( " GtkStatusBar: context= \" %s \" , context_id=%d \n " ,
string ,
gtk_statusbar_get_context_id ( statusbar , string ) ) ;
string = " some text " ;
g_print ( " GtkStatusBar: context= \" %s \" , context_id=%d \n " ,
string ,
gtk_statusbar_get_context_id ( statusbar , string ) ) ;
string = " hit the mouse " ;
g_print ( " GtkStatusBar: context= \" %s \" , context_id=%d \n " ,
string ,
gtk_statusbar_get_context_id ( statusbar , string ) ) ;
string = " hit the mouse2 " ;
g_print ( " GtkStatusBar: context= \" %s \" , context_id=%d \n " ,
string ,
gtk_statusbar_get_context_id ( statusbar , string ) ) ;
}
static void
create_statusbar ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * separator ;
GtkWidget * statusbar ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " statusbar " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
statusbar = gtk_statusbar_new ( ) ;
gtk_box_pack_end ( GTK_BOX ( box1 ) , statusbar , TRUE , TRUE , 0 ) ;
g_signal_connect ( statusbar ,
" text_popped " ,
G_CALLBACK ( statusbar_popped ) ,
NULL ) ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
button = g_object_new ( gtk_button_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " push something " ,
" visible " , TRUE ,
" parent " , box2 ,
NULL ) ;
g_object_connect ( button ,
" signal::clicked " , statusbar_push , statusbar ,
NULL ) ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
button = g_object_connect ( g_object_new ( gtk_button_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " pop " ,
" visible " , TRUE ,
" parent " , box2 ,
NULL ) ,
" signal_after::clicked " , statusbar_pop , statusbar ,
NULL ) ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
button = g_object_connect ( g_object_new ( gtk_button_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " steal #4 " ,
" visible " , TRUE ,
" parent " , box2 ,
NULL ) ,
" signal_after::clicked " , statusbar_steal , statusbar ,
NULL ) ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
button = g_object_connect ( g_object_new ( gtk_button_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " test contexts " ,
" visible " , TRUE ,
" parent " , box2 ,
NULL ) ,
" swapped_signal_after::clicked " , statusbar_contexts , statusbar ,
NULL ) ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
button = g_object_connect ( g_object_new ( gtk_button_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " push something long " ,
" visible " , TRUE ,
" parent " , box2 ,
NULL ) ,
" signal_after::clicked " , statusbar_push_long , statusbar ,
NULL ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2013-02-04 10:14:41 +00:00
/* Alpha demo */
static void
alpha_changed ( GtkRange * range , GtkWidget * widget )
{
gdouble alpha ;
alpha = gtk_range_get_value ( range ) ;
gtk_widget_set_opacity ( widget , alpha / 100.0 ) ;
}
void
create_alpha_widgets ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
GtkWidget * vbox2 , * vbox , * main_hbox ;
GtkWidget * button , * event_box , * label , * scale ;
GtkWidget * alpha1 , * alpha2 , * alpha3 ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_default_size ( GTK_WINDOW ( window ) ,
450 , 450 ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) , & window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Alpha " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
main_hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , main_hbox ) ;
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( main_hbox ) , vbox , FALSE , FALSE , 0 ) ;
/* Plain button (no gdkwindows */
label = gtk_label_new ( " non-window widget " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , FALSE , FALSE , 0 ) ;
alpha1 = button = gtk_button_new_with_label ( " A Button " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
/* windowed container with both windowed and normal button */
label = gtk_label_new ( " \n window widget " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , FALSE , FALSE , 0 ) ;
alpha2 = event_box = gtk_event_box_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , event_box , FALSE , FALSE , 0 ) ;
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( event_box ) , vbox2 ) ;
button = gtk_button_new_with_label ( " A Button " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , button , FALSE , FALSE , 0 ) ;
event_box = gtk_event_box_new ( ) ;
button = gtk_button_new_with_label ( " A Button (in window) " ) ;
gtk_container_add ( GTK_CONTAINER ( event_box ) , button ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , event_box , FALSE , FALSE , 0 ) ;
/* non-windowed container with both windowed and normal button */
label = gtk_label_new ( " \n non-window widget with widget child " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , FALSE , FALSE , 0 ) ;
alpha3 = vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , vbox2 , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " A Button " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , button , FALSE , FALSE , 0 ) ;
event_box = gtk_event_box_new ( ) ;
button = gtk_button_new_with_label ( " A Button (in window) " ) ;
gtk_container_add ( GTK_CONTAINER ( event_box ) , button ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , event_box , FALSE , FALSE , 0 ) ;
scale = gtk_scale_new_with_range ( GTK_ORIENTATION_VERTICAL ,
0 , 100 , 1 ) ;
gtk_box_pack_start ( GTK_BOX ( main_hbox ) , scale , FALSE , FALSE , 0 ) ;
g_signal_connect ( scale , " value_changed " , G_CALLBACK ( alpha_changed ) , alpha1 ) ;
gtk_range_set_value ( GTK_RANGE ( scale ) , 50 ) ;
scale = gtk_scale_new_with_range ( GTK_ORIENTATION_VERTICAL ,
0 , 100 , 1 ) ;
gtk_box_pack_start ( GTK_BOX ( main_hbox ) , scale , FALSE , FALSE , 0 ) ;
g_signal_connect ( scale , " value_changed " , G_CALLBACK ( alpha_changed ) , alpha2 ) ;
gtk_range_set_value ( GTK_RANGE ( scale ) , 50 ) ;
scale = gtk_scale_new_with_range ( GTK_ORIENTATION_VERTICAL ,
0 , 100 , 1 ) ;
gtk_box_pack_start ( GTK_BOX ( main_hbox ) , scale , FALSE , FALSE , 0 ) ;
g_signal_connect ( scale , " value_changed " , G_CALLBACK ( alpha_changed ) , alpha3 ) ;
gtk_range_set_value ( GTK_RANGE ( scale ) , 50 ) ;
gtk_widget_show_all ( main_hbox ) ;
}
if ( ! gtk_widget_get_visible ( window ) )
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2008-02-27 10:31:24 +00:00
/*
* Label Demo
*/
static void
sensitivity_toggled ( GtkWidget * toggle ,
GtkWidget * widget )
{
2010-10-19 16:46:40 +00:00
gtk_widget_set_sensitive ( widget ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( toggle ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static GtkWidget *
create_sensitivity_control ( GtkWidget * widget )
{
GtkWidget * button ;
button = gtk_toggle_button_new_with_label ( " Sensitive " ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) ,
2010-02-27 04:24:24 +00:00
gtk_widget_is_sensitive ( widget ) ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( button ,
" toggled " ,
G_CALLBACK ( sensitivity_toggled ) ,
widget ) ;
gtk_widget_show_all ( button ) ;
return button ;
}
static void
set_selectable_recursive ( GtkWidget * widget ,
gboolean setting )
{
if ( GTK_IS_CONTAINER ( widget ) )
{
GList * children ;
GList * tmp ;
children = gtk_container_get_children ( GTK_CONTAINER ( widget ) ) ;
tmp = children ;
while ( tmp )
{
set_selectable_recursive ( tmp - > data , setting ) ;
tmp = tmp - > next ;
}
g_list_free ( children ) ;
}
else if ( GTK_IS_LABEL ( widget ) )
{
gtk_label_set_selectable ( GTK_LABEL ( widget ) , setting ) ;
}
}
static void
selectable_toggled ( GtkWidget * toggle ,
GtkWidget * widget )
{
set_selectable_recursive ( widget ,
2010-10-19 16:46:40 +00:00
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( toggle ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static GtkWidget *
create_selectable_control ( GtkWidget * widget )
{
GtkWidget * button ;
button = gtk_toggle_button_new_with_label ( " Selectable " ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) ,
FALSE ) ;
g_signal_connect ( button ,
" toggled " ,
G_CALLBACK ( selectable_toggled ) ,
widget ) ;
gtk_widget_show_all ( button ) ;
return button ;
}
2009-05-11 05:23:13 +00:00
static void
dialog_response ( GtkWidget * dialog , gint response_id , GtkLabel * label )
{
const gchar * text ;
gtk_widget_destroy ( dialog ) ;
text = " Some <a href= \" http://en.wikipedia.org/wiki/Text \" title= \" plain text \" >text</a> may be marked up \n "
" as hyperlinks, which can be clicked \n "
" or activated via <a href= \" keynav \" >keynav</a>. \n "
" The links remain the same. " ;
gtk_label_set_markup ( label , text ) ;
}
static gboolean
2009-05-11 06:44:12 +00:00
activate_link ( GtkWidget * label , const gchar * uri , gpointer data )
2009-05-11 05:23:13 +00:00
{
if ( g_strcmp0 ( uri , " keynav " ) = = 0 )
{
GtkWidget * dialog ;
dialog = gtk_message_dialog_new_with_markup ( GTK_WINDOW ( gtk_widget_get_toplevel ( label ) ) ,
GTK_DIALOG_DESTROY_WITH_PARENT ,
GTK_MESSAGE_INFO ,
GTK_BUTTONS_OK ,
" The term <i>keynav</i> is a shorthand for "
" keyboard navigation and refers to the process of using a program "
" (exclusively) via keyboard input. " ) ;
gtk_window_present ( GTK_WINDOW ( dialog ) ) ;
g_signal_connect ( dialog , " response " , G_CALLBACK ( dialog_response ) , label ) ;
return TRUE ;
}
return FALSE ;
}
2008-02-27 10:31:24 +00:00
void create_labels ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * hbox ;
GtkWidget * vbox ;
GtkWidget * frame ;
GtkWidget * label ;
GtkWidget * button ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Label " ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , hbox , FALSE , FALSE , 0 ) ;
button = create_sensitivity_control ( hbox ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = create_selectable_control ( hbox ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox , FALSE , FALSE , 0 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 5 ) ;
frame = gtk_frame_new ( " Normal Label " ) ;
label = gtk_label_new ( " This is a Normal label " ) ;
gtk_label_set_ellipsize ( GTK_LABEL ( label ) , PANGO_ELLIPSIZE_START ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Multi-line Label " ) ;
label = gtk_label_new ( " This is a Multi-line label. \n Second line \n Third line " ) ;
gtk_label_set_ellipsize ( GTK_LABEL ( label ) , PANGO_ELLIPSIZE_END ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Left Justified Label " ) ;
label = gtk_label_new ( " This is a Left-Justified \n Multi-line label. \n Third line " ) ;
gtk_label_set_ellipsize ( GTK_LABEL ( label ) , PANGO_ELLIPSIZE_MIDDLE ) ;
gtk_label_set_justify ( GTK_LABEL ( label ) , GTK_JUSTIFY_LEFT ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Right Justified Label " ) ;
gtk_label_set_ellipsize ( GTK_LABEL ( label ) , PANGO_ELLIPSIZE_START ) ;
label = gtk_label_new ( " This is a Right-Justified \n Multi-line label. \n Fourth line, (j/k) " ) ;
gtk_label_set_justify ( GTK_LABEL ( label ) , GTK_JUSTIFY_RIGHT ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Internationalized Label " ) ;
label = gtk_label_new ( NULL ) ;
gtk_label_set_markup ( GTK_LABEL ( label ) ,
" French (Fran \303 \247 ais) Bonjour, Salut \n "
" Korean ( \355 \225 \234 \352 \270 \200 ) \354 \225 \210 \353 \205 \225 \355 \225 \230 \354 \204 \270 \354 \232 \224 , \354 \225 \210 \353 \205 \225 \355 \225 \230 \354 \213 \255 \353 \213 \210 \352 \271 \214 \n "
" Russian ( \320 \240 \321 \203 \321 \201 \321 \201 \320 \272 \320 \270 \320 \271 ) \320 \227 \320 \264 \321 \200 \320 \260 \320 \262 \321 \201 \321 \202 \320 \262 \321 \203 \320 \271 \321 \202 \320 \265 ! \n "
" Chinese (Simplified) <span lang= \" zh-cn \" > \345 \205 \203 \346 \260 \224 \345 \274 \200 \345 \217 \221 </span> \n "
" Chinese (Traditional) <span lang= \" zh-tw \" > \345 \205 \203 \346 \260 \243 \351 \226 \213 \347 \231 \274 </span> \n "
" Japanese <span lang= \" ja \" > \345 \205 \203 \346 \260 \227 \351 \226 \213 \347 \231 \272 </span> " ) ;
gtk_label_set_justify ( GTK_LABEL ( label ) , GTK_JUSTIFY_LEFT ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Bidirection Label " ) ;
label = gtk_label_new ( " \342 \200 \217 Arabic \330 \247 \331 \204 \330 \263 \331 \204 \330 \247 \331 \205 \330 \271 \331 \204 \331 \212 \331 \203 \331 \205 \n "
" \342 \200 \217 Hebrew \327 \251 \327 \234 \327 \225 \327 \235 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
2009-05-11 05:23:13 +00:00
frame = gtk_frame_new ( " Links in a label " ) ;
label = gtk_label_new ( " Some <a href= \" http://en.wikipedia.org/wiki/Text \" title= \" plain text \" >text</a> may be marked up \n "
" as hyperlinks, which can be clicked \n "
" or activated via <a href= \" keynav \" >keynav</a> " ) ;
gtk_label_set_use_markup ( GTK_LABEL ( label ) , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
g_signal_connect ( label , " activate-link " , G_CALLBACK ( activate_link ) , NULL ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Line wrapped label " ) ;
label = gtk_label_new ( " This is an example of a line-wrapped label. It should not be taking " \
" up the entire " /* big space to test spacing */ \
" width allocated to it, but automatically wraps the words to fit. " \
" The time has come, for all good men, to come to the aid of their party. " \
" The sixth sheik's six sheep's sick. \n " \
" It supports multiple paragraphs correctly, and correctly adds " \
" many extra spaces. " ) ;
gtk_label_set_line_wrap ( GTK_LABEL ( label ) , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Filled, wrapped label " ) ;
label = gtk_label_new ( " This is an example of a line-wrapped, filled label. It should be taking " \
" up the entire width allocated to it. Here is a seneance to prove " \
" my point. Here is another sentence. " \
" Here comes the sun, do de do de do. \n " \
" This is a new paragraph. \n " \
" This is another newer, longer, better paragraph. It is coming to an end, " \
" unfortunately. " ) ;
gtk_label_set_justify ( GTK_LABEL ( label ) , GTK_JUSTIFY_FILL ) ;
gtk_label_set_line_wrap ( GTK_LABEL ( label ) , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Underlined label " ) ;
label = gtk_label_new ( " This label is underlined! \n "
" This one is underlined ( \343 \201 \223 \343 \202 \223 \343 \201 \253 \343 \201 \241 \343 \201 \257 ) in quite a funky fashion " ) ;
gtk_label_set_justify ( GTK_LABEL ( label ) , GTK_JUSTIFY_LEFT ) ;
gtk_label_set_pattern ( GTK_LABEL ( label ) , " _________________________ _ _________ _ _____ _ __ __ ___ ____ _____ " ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
frame = gtk_frame_new ( " Markup label " ) ;
label = gtk_label_new ( NULL ) ;
/* There's also a gtk_label_set_markup() without accel if you
* don ' t have an accelerator key
*/
gtk_label_set_markup_with_mnemonic ( GTK_LABEL ( label ) ,
" This <span foreground= \" blue \" background= \" orange \" >label</span> has "
" <b>markup</b> _such as "
" <big><i>Big Italics</i></big> \n "
" <tt>Monospace font</tt> \n "
" <u>Underline!</u> \n "
" foo \n "
" <span foreground= \" green \" background= \" red \" >Ugly colors</span> \n "
" and nothing on this line, \n "
" or this. \n "
" or this either \n "
" or even on this one \n "
" la <big>la <big>la <big>la <big>la</big></big></big></big> \n "
" but this _word is <span foreground= \" purple \" ><big>purple</big></span> \n "
" <span underline= \" double \" >We like <sup>superscript</sup> and <sub>subscript</sub> too</span> " ) ;
2010-09-08 17:35:51 +00:00
g_assert ( gtk_label_get_mnemonic_keyval ( GTK_LABEL ( label ) ) = = GDK_KEY_s ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( frame ) , label ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , FALSE , 0 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
static void
on_angle_scale_changed ( GtkRange * range ,
GtkLabel * label )
{
gtk_label_set_angle ( GTK_LABEL ( label ) , gtk_range_get_value ( range ) ) ;
}
static void
create_rotated_label ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * vbox ;
GtkWidget * hscale ;
GtkWidget * label ;
GtkWidget * scale_label ;
GtkWidget * scale_hbox ;
if ( ! window )
{
window = gtk_dialog_new_with_buttons ( " Rotated Label " ,
GTK_WINDOW ( gtk_widget_get_toplevel ( widget ) ) , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " , GTK_RESPONSE_CLOSE ,
2008-02-27 10:31:24 +00:00
NULL ) ;
gtk_window_set_resizable ( GTK_WINDOW ( window ) , TRUE ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " response " ,
2010-09-18 23:57:32 +00:00
G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) , & window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , vbox , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 10 ) ;
label = gtk_label_new ( NULL ) ;
gtk_label_set_markup ( GTK_LABEL ( label ) , " Hello World \n <i>Rotate</i> <span underline='single' foreground='blue'>me</span> " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
scale_hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , scale_hbox , FALSE , FALSE , 0 ) ;
scale_label = gtk_label_new ( NULL ) ;
gtk_label_set_markup ( GTK_LABEL ( scale_label ) , " <i>Angle: </i> " ) ;
gtk_box_pack_start ( GTK_BOX ( scale_hbox ) , scale_label , FALSE , FALSE , 0 ) ;
2010-10-30 00:01:27 +00:00
hscale = gtk_scale_new_with_range ( GTK_ORIENTATION_HORIZONTAL ,
0 , 360 , 5 ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( hscale , " value-changed " ,
G_CALLBACK ( on_angle_scale_changed ) , label ) ;
gtk_range_set_value ( GTK_RANGE ( hscale ) , 45 ) ;
2010-04-13 16:32:10 +00:00
gtk_widget_set_size_request ( hscale , 200 , - 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( scale_hbox ) , hscale , TRUE , TRUE , 0 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
# define DEFAULT_TEXT_RADIUS 200
static void
on_rotated_text_unrealize ( GtkWidget * widget )
{
g_object_set_data ( G_OBJECT ( widget ) , " text-gc " , NULL ) ;
}
static gboolean
2010-09-08 20:34:28 +00:00
on_rotated_text_draw ( GtkWidget * widget ,
cairo_t * cr ,
GdkPixbuf * tile_pixbuf )
2008-02-27 10:31:24 +00:00
{
static const gchar * words [ ] = { " The " , " grand " , " old " , " Duke " , " of " , " York " ,
" had " , " 10,000 " , " men " } ;
int n_words ;
int i ;
2010-09-08 20:34:28 +00:00
int width , height ;
2008-02-27 10:31:24 +00:00
double radius ;
PangoLayout * layout ;
PangoContext * context ;
PangoFontDescription * desc ;
2014-10-12 02:54:40 +00:00
cairo_set_source_rgb ( cr , 1 , 1 , 1 ) ;
cairo_paint ( cr ) ;
2010-07-21 23:51:59 +00:00
if ( tile_pixbuf )
{
gdk_cairo_set_source_pixbuf ( cr , tile_pixbuf , 0 , 0 ) ;
cairo_pattern_set_extend ( cairo_get_source ( cr ) , CAIRO_EXTEND_REPEAT ) ;
2008-02-27 10:31:24 +00:00
}
2010-07-21 23:51:59 +00:00
else
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
2008-02-27 10:31:24 +00:00
2010-09-08 20:34:28 +00:00
width = gtk_widget_get_allocated_width ( widget ) ;
height = gtk_widget_get_allocated_height ( widget ) ;
radius = MIN ( width , height ) / 2. ;
2008-02-27 10:31:24 +00:00
2010-07-21 23:51:59 +00:00
cairo_translate ( cr ,
2010-09-08 20:34:28 +00:00
radius + ( width - 2 * radius ) / 2 ,
radius + ( height - 2 * radius ) / 2 ) ;
2010-07-21 23:51:59 +00:00
cairo_scale ( cr , radius / DEFAULT_TEXT_RADIUS , radius / DEFAULT_TEXT_RADIUS ) ;
2008-02-27 10:31:24 +00:00
context = gtk_widget_get_pango_context ( widget ) ;
layout = pango_layout_new ( context ) ;
desc = pango_font_description_from_string ( " Sans Bold 30 " ) ;
pango_layout_set_font_description ( layout , desc ) ;
pango_font_description_free ( desc ) ;
n_words = G_N_ELEMENTS ( words ) ;
for ( i = 0 ; i < n_words ; i + + )
{
int width , height ;
2010-07-21 23:51:59 +00:00
cairo_save ( cr ) ;
cairo_rotate ( cr , 2 * G_PI * i / n_words ) ;
pango_cairo_update_layout ( cr , layout ) ;
2008-02-27 10:31:24 +00:00
pango_layout_set_text ( layout , words [ i ] , - 1 ) ;
pango_layout_get_size ( layout , & width , & height ) ;
2010-07-21 23:51:59 +00:00
cairo_move_to ( cr , - width / 2 / PANGO_SCALE , - DEFAULT_TEXT_RADIUS ) ;
pango_cairo_show_layout ( cr , layout ) ;
2008-02-27 10:31:24 +00:00
2010-07-21 23:51:59 +00:00
cairo_restore ( cr ) ;
}
2008-02-27 10:31:24 +00:00
g_object_unref ( layout ) ;
return FALSE ;
}
static void
create_rotated_text ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
GtkRequisition requisition ;
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * drawing_area ;
GdkPixbuf * tile_pixbuf ;
window = gtk_dialog_new_with_buttons ( " Rotated Text " ,
GTK_WINDOW ( gtk_widget_get_toplevel ( widget ) ) , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " , GTK_RESPONSE_CLOSE ,
2008-02-27 10:31:24 +00:00
NULL ) ;
gtk_window_set_resizable ( GTK_WINDOW ( window ) , TRUE ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " response " ,
2010-09-18 23:57:32 +00:00
G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) , & window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
drawing_area = gtk_drawing_area_new ( ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , drawing_area , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
tile_pixbuf = gdk_pixbuf_new_from_file ( " marble.xpm " , NULL ) ;
2010-09-08 20:34:28 +00:00
g_signal_connect ( drawing_area , " draw " ,
G_CALLBACK ( on_rotated_text_draw ) , tile_pixbuf ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( drawing_area , " unrealize " ,
G_CALLBACK ( on_rotated_text_unrealize ) , NULL ) ;
2010-05-24 20:31:36 +00:00
gtk_widget_show_all ( gtk_bin_get_child ( GTK_BIN ( window ) ) ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_set_size_request ( drawing_area , DEFAULT_TEXT_RADIUS * 2 , DEFAULT_TEXT_RADIUS * 2 ) ;
2010-09-21 14:35:17 +00:00
gtk_widget_get_preferred_size ( ( window ) ,
2010-09-14 01:33:06 +00:00
& requisition , NULL ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_set_size_request ( drawing_area , - 1 , - 1 ) ;
gtk_window_resize ( GTK_WINDOW ( window ) , requisition . width , requisition . height ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Reparent demo
*/
static void
reparent_label ( GtkWidget * widget ,
GtkWidget * new_parent )
{
GtkWidget * label ;
label = g_object_get_data ( G_OBJECT ( widget ) , " user_data " ) ;
2014-05-22 12:50:18 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
gtk_widget_reparent ( label , new_parent ) ;
2014-05-22 12:50:18 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
}
static void
set_parent_signal ( GtkWidget * child ,
GtkWidget * old_parent ,
gpointer func_data )
{
2010-08-15 22:33:57 +00:00
GtkWidget * parent ;
parent = gtk_widget_get_parent ( child ) ;
2008-02-27 10:31:24 +00:00
g_message ( " set_parent for \" %s \" : new parent: \" %s \" , old parent: \" %s \" , data: %d \n " ,
g_type_name ( G_OBJECT_TYPE ( child ) ) ,
2010-08-15 22:33:57 +00:00
parent ? g_type_name ( G_OBJECT_TYPE ( parent ) ) : " NULL " ,
2008-02-27 10:31:24 +00:00
old_parent ? g_type_name ( G_OBJECT_TYPE ( old_parent ) ) : " NULL " ,
GPOINTER_TO_INT ( func_data ) ) ;
}
static void
create_reparent ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * box3 ;
GtkWidget * frame ;
GtkWidget * button ;
GtkWidget * label ;
GtkWidget * separator ;
GtkWidget * event_box ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " reparent " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
label = gtk_label_new ( " Hello World " ) ;
frame = gtk_frame_new ( " Frame 1 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , frame , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box3 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box3 ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , box3 ) ;
button = gtk_button_new_with_label ( " switch " ) ;
g_object_set_data ( G_OBJECT ( button ) , " user_data " , label ) ;
gtk_box_pack_start ( GTK_BOX ( box3 ) , button , FALSE , TRUE , 0 ) ;
event_box = gtk_event_box_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( box3 ) , event_box , FALSE , TRUE , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( event_box ) , label ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( reparent_label ) ,
event_box ) ;
g_signal_connect ( label , " parent_set " ,
G_CALLBACK ( set_parent_signal ) ,
GINT_TO_POINTER ( 42 ) ) ;
frame = gtk_frame_new ( " Frame 2 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , frame , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box3 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box3 ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , box3 ) ;
button = gtk_button_new_with_label ( " switch " ) ;
g_object_set_data ( G_OBJECT ( button ) , " user_data " , label ) ;
gtk_box_pack_start ( GTK_BOX ( box3 ) , button , FALSE , TRUE , 0 ) ;
event_box = gtk_event_box_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( box3 ) , event_box , FALSE , TRUE , 0 ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( reparent_label ) ,
event_box ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) , window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Resize Grips
*/
static gboolean
grippy_button_press ( GtkWidget * area , GdkEventButton * event , GdkWindowEdge edge )
{
if ( event - > type = = GDK_BUTTON_PRESS )
{
2012-03-12 14:47:02 +00:00
if ( event - > button = = GDK_BUTTON_PRIMARY )
2008-02-27 10:31:24 +00:00
gtk_window_begin_resize_drag ( GTK_WINDOW ( gtk_widget_get_toplevel ( area ) ) , edge ,
event - > button , event - > x_root , event - > y_root ,
event - > time ) ;
2012-03-12 14:47:02 +00:00
else if ( event - > button = = GDK_BUTTON_MIDDLE )
2008-02-27 10:31:24 +00:00
gtk_window_begin_move_drag ( GTK_WINDOW ( gtk_widget_get_toplevel ( area ) ) ,
event - > button , event - > x_root , event - > y_root ,
event - > time ) ;
}
return TRUE ;
}
static gboolean
2010-09-09 00:31:38 +00:00
grippy_draw ( GtkWidget * area , cairo_t * cr , GdkWindowEdge edge )
2008-02-27 10:31:24 +00:00
{
2010-11-25 17:49:16 +00:00
GtkStyleContext * context ;
GtkJunctionSides sides ;
switch ( edge )
{
case GDK_WINDOW_EDGE_NORTH_WEST :
sides = GTK_JUNCTION_CORNER_TOPLEFT ;
break ;
case GDK_WINDOW_EDGE_NORTH :
sides = GTK_JUNCTION_TOP ;
break ;
case GDK_WINDOW_EDGE_NORTH_EAST :
sides = GTK_JUNCTION_CORNER_TOPRIGHT ;
break ;
case GDK_WINDOW_EDGE_WEST :
sides = GTK_JUNCTION_LEFT ;
break ;
case GDK_WINDOW_EDGE_EAST :
sides = GTK_JUNCTION_RIGHT ;
break ;
case GDK_WINDOW_EDGE_SOUTH_WEST :
sides = GTK_JUNCTION_CORNER_BOTTOMLEFT ;
break ;
case GDK_WINDOW_EDGE_SOUTH :
sides = GTK_JUNCTION_BOTTOM ;
break ;
case GDK_WINDOW_EDGE_SOUTH_EAST :
sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT ;
break ;
2011-02-13 14:21:12 +00:00
default :
g_assert_not_reached ( ) ;
2010-11-25 17:49:16 +00:00
}
context = gtk_widget_get_style_context ( area ) ;
gtk_style_context_save ( context ) ;
gtk_style_context_add_class ( context , " grip " ) ;
gtk_style_context_set_junction_sides ( context , sides ) ;
gtk_render_handle ( context , cr ,
0 , 0 ,
gtk_widget_get_allocated_width ( area ) ,
gtk_widget_get_allocated_height ( area ) ) ;
gtk_style_context_restore ( context ) ;
2008-02-27 10:31:24 +00:00
return TRUE ;
}
static void
create_resize_grips ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * area ;
GtkWidget * hbox , * vbox ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " resize grips " ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , TRUE , TRUE , 0 ) ;
/* North west */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_NORTH_WEST ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_NORTH_WEST ) ) ;
/* North */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_NORTH ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_NORTH ) ) ;
/* North east */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_NORTH_EAST ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_NORTH_EAST ) ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , TRUE , TRUE , 0 ) ;
/* West */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_WEST ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_WEST ) ) ;
/* Middle */
area = gtk_drawing_area_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
/* East */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_EAST ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_EAST ) ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , TRUE , TRUE , 0 ) ;
/* South west */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_SOUTH_WEST ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_SOUTH_WEST ) ) ;
/* South */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_SOUTH ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_SOUTH ) ) ;
/* South east */
area = gtk_drawing_area_new ( ) ;
gtk_widget_add_events ( area , GDK_BUTTON_PRESS_MASK ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , area , TRUE , TRUE , 0 ) ;
2010-09-09 00:31:38 +00:00
g_signal_connect ( area , " draw " , G_CALLBACK ( grippy_draw ) ,
2008-02-27 10:31:24 +00:00
GINT_TO_POINTER ( GDK_WINDOW_EDGE_SOUTH_EAST ) ) ;
g_signal_connect ( area , " button_press_event " , G_CALLBACK ( grippy_button_press ) ,
GINT_TO_POINTER ( GDK_WINDOW_EDGE_SOUTH_EAST ) ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Saved Position
*/
gint upositionx = 0 ;
gint upositiony = 0 ;
static gint
uposition_configure ( GtkWidget * window )
{
GtkLabel * lx ;
GtkLabel * ly ;
gchar buffer [ 64 ] ;
lx = g_object_get_data ( G_OBJECT ( window ) , " x " ) ;
ly = g_object_get_data ( G_OBJECT ( window ) , " y " ) ;
2010-08-15 22:33:57 +00:00
gdk_window_get_root_origin ( gtk_widget_get_window ( window ) ,
& upositionx , & upositiony ) ;
2008-02-27 10:31:24 +00:00
sprintf ( buffer , " %d " , upositionx ) ;
gtk_label_set_text ( lx , buffer ) ;
sprintf ( buffer , " %d " , upositiony ) ;
gtk_label_set_text ( ly , buffer ) ;
return FALSE ;
}
static void
uposition_stop_configure ( GtkToggleButton * toggle ,
2010-09-27 06:10:23 +00:00
GObject * window )
2008-02-27 10:31:24 +00:00
{
2010-10-19 16:46:40 +00:00
if ( gtk_toggle_button_get_active ( toggle ) )
2008-02-27 10:31:24 +00:00
g_signal_handlers_block_by_func ( window , G_CALLBACK ( uposition_configure ) , NULL ) ;
else
g_signal_handlers_unblock_by_func ( window , G_CALLBACK ( uposition_configure ) , NULL ) ;
}
static void
create_saved_position ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
GtkWidget * hbox ;
GtkWidget * main_vbox ;
GtkWidget * vbox ;
GtkWidget * x_label ;
GtkWidget * y_label ;
GtkWidget * button ;
GtkWidget * label ;
GtkWidget * any ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
window = g_object_connect ( g_object_new ( GTK_TYPE_WINDOW ,
2008-02-27 10:31:24 +00:00
" type " , GTK_WINDOW_TOPLEVEL ,
" title " , " Saved Position " ,
NULL ) ,
" signal::configure_event " , uposition_configure , NULL ,
NULL ) ;
gtk_window_move ( GTK_WINDOW ( window ) , upositionx , upositiony ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-10-31 17:07:20 +00:00
main_vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( main_vbox ) , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , main_vbox ) ;
vbox =
2011-04-22 13:38:40 +00:00
g_object_new ( GTK_TYPE_BOX ,
2011-05-02 17:19:09 +00:00
" orientation " , GTK_ORIENTATION_VERTICAL ,
2008-02-27 10:31:24 +00:00
" GtkBox::homogeneous " , FALSE ,
" GtkBox::spacing " , 5 ,
" GtkContainer::border_width " , 10 ,
" GtkWidget::parent " , main_vbox ,
" GtkWidget::visible " , TRUE ,
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
" child " , g_object_connect ( g_object_new ( GTK_TYPE_TOGGLE_BUTTON ,
2008-02-27 10:31:24 +00:00
" label " , " Stop Events " ,
" active " , FALSE ,
" visible " , TRUE ,
NULL ) ,
" signal::clicked " , uposition_stop_configure , window ,
NULL ) ,
NULL ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 0 ) ;
label = gtk_label_new ( " X Origin : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , TRUE , 0 ) ;
x_label = gtk_label_new ( " " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , x_label , TRUE , TRUE , 0 ) ;
g_object_set_data ( G_OBJECT ( window ) , " x " , x_label ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 0 ) ;
label = gtk_label_new ( " Y Origin : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , TRUE , 0 ) ;
y_label = gtk_label_new ( " " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , y_label , TRUE , TRUE , 0 ) ;
g_object_set_data ( G_OBJECT ( window ) , " y " , y_label ) ;
any =
2011-06-08 01:29:01 +00:00
g_object_new ( gtk_separator_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" GtkWidget::visible " , TRUE ,
NULL ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , any , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , hbox , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " Close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
gtk_widget_show_all ( window ) ;
}
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkPixmap
*/
static void
2010-08-06 20:12:24 +00:00
create_pixbuf ( GtkWidget * widget )
2008-02-27 10:31:24 +00:00
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * box3 ;
GtkWidget * button ;
GtkWidget * label ;
GtkWidget * separator ;
2010-08-06 20:12:24 +00:00
GtkWidget * pixbufwid ;
2010-08-15 22:33:57 +00:00
GdkWindow * gdk_window ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " GtkPixmap " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
gtk_widget_realize ( window ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
button = gtk_button_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , FALSE , FALSE , 0 ) ;
2010-08-15 22:33:57 +00:00
gdk_window = gtk_widget_get_window ( window ) ;
2010-11-25 17:49:16 +00:00
pixbufwid = new_pixbuf ( " test.xpm " , gdk_window ) ;
2008-02-27 10:31:24 +00:00
2010-08-06 20:12:24 +00:00
label = gtk_label_new ( " Pixbuf \n test " ) ;
2010-10-31 17:07:20 +00:00
box3 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box3 ) , 2 ) ;
2010-08-06 20:12:24 +00:00
gtk_container_add ( GTK_CONTAINER ( box3 ) , pixbufwid ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( box3 ) , label ) ;
gtk_container_add ( GTK_CONTAINER ( button ) , box3 ) ;
button = gtk_button_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , FALSE , FALSE , 0 ) ;
2010-08-15 22:33:57 +00:00
2010-11-25 17:49:16 +00:00
pixbufwid = new_pixbuf ( " test.xpm " , gdk_window ) ;
2008-02-27 10:31:24 +00:00
2010-08-06 20:12:24 +00:00
label = gtk_label_new ( " Pixbuf \n test " ) ;
2010-10-31 17:07:20 +00:00
box3 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box3 ) , 2 ) ;
2010-08-06 20:12:24 +00:00
gtk_container_add ( GTK_CONTAINER ( box3 ) , pixbufwid ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( box3 ) , label ) ;
gtk_container_add ( GTK_CONTAINER ( button ) , box3 ) ;
gtk_widget_set_sensitive ( button , FALSE ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
static void
create_tooltips ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * box3 ;
GtkWidget * button ;
GtkWidget * toggle ;
GtkWidget * frame ;
GtkWidget * separator ;
if ( ! window )
{
window =
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
g_object_new ( gtk_window_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" GtkWindow::type " , GTK_WINDOW_TOPLEVEL ,
" GtkContainer::border_width " , 0 ,
" GtkWindow::title " , " Tooltips " ,
2010-08-07 15:07:17 +00:00
" GtkWindow::resizable " , FALSE ,
2008-02-27 10:31:24 +00:00
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
button = gtk_toggle_button_new_with_label ( " button1 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2009-12-10 11:28:38 +00:00
gtk_widget_set_tooltip_text ( button , " This is button 1 " ) ;
2008-02-27 10:31:24 +00:00
button = gtk_toggle_button_new_with_label ( " button2 " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2009-12-10 11:28:38 +00:00
gtk_widget_set_tooltip_text ( button ,
" This is button 2. This is also a really long tooltip which probably "
" won't fit on a single line and will therefore need to be wrapped. "
" Hopefully the wrapping will work correctly. " ) ;
2008-02-27 10:31:24 +00:00
toggle = gtk_toggle_button_new_with_label ( " Override TipsQuery Label " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , toggle , TRUE , TRUE , 0 ) ;
2009-12-10 11:28:38 +00:00
gtk_widget_set_tooltip_text ( toggle , " Toggle TipsQuery view. " ) ;
2008-02-27 10:31:24 +00:00
box3 =
2011-04-22 13:38:40 +00:00
g_object_new ( GTK_TYPE_BOX ,
2011-05-02 17:19:09 +00:00
" orientation " , GTK_ORIENTATION_VERTICAL ,
2008-02-27 10:31:24 +00:00
" homogeneous " , FALSE ,
" spacing " , 5 ,
" border_width " , 5 ,
" visible " , TRUE ,
NULL ) ;
button =
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
g_object_new ( gtk_button_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " [?] " ,
" visible " , TRUE ,
" parent " , box3 ,
NULL ) ;
gtk_box_set_child_packing ( GTK_BOX ( box3 ) , button , FALSE , FALSE , 0 , GTK_PACK_START ) ;
2010-04-13 16:43:16 +00:00
gtk_widget_set_tooltip_text ( button , " Start the Tooltips Inspector " ) ;
2008-02-27 10:31:24 +00:00
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
frame = g_object_new ( gtk_frame_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" label " , " ToolTips Inspector " ,
" label_xalign " , ( double ) 0.5 ,
" border_width " , 0 ,
" visible " , TRUE ,
" parent " , box2 ,
" child " , box3 ,
NULL ) ;
gtk_box_set_child_packing ( GTK_BOX ( box2 ) , frame , TRUE , TRUE , 10 , GTK_PACK_START ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
2009-12-10 11:28:38 +00:00
gtk_widget_set_tooltip_text ( button , " Push this button to close window " ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkImage
*/
static void
pack_image ( GtkWidget * box ,
const gchar * text ,
GtkWidget * image )
{
gtk_box_pack_start ( GTK_BOX ( box ) ,
gtk_label_new ( text ) ,
FALSE , FALSE , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( box ) ,
image ,
TRUE , TRUE , 0 ) ;
}
static void
create_image ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( window = = NULL )
{
GtkWidget * vbox ;
2010-08-06 19:54:16 +00:00
GdkPixbuf * pixbuf ;
2008-02-27 10:31:24 +00:00
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
/* this is bogus for testing drawing when allocation < request,
* don ' t copy into real code
*/
2010-08-07 15:07:17 +00:00
gtk_window_set_resizable ( GTK_WINDOW ( window ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
pack_image ( vbox , " Stock Warning Dialog " ,
2013-06-24 21:31:22 +00:00
gtk_image_new_from_icon_name ( " dialog-warning " ,
GTK_ICON_SIZE_DIALOG ) ) ;
2008-02-27 10:31:24 +00:00
2010-08-06 19:54:16 +00:00
pixbuf = gdk_pixbuf_new_from_xpm_data ( ( const char * * ) openfile ) ;
2008-02-27 10:31:24 +00:00
2010-08-06 19:54:16 +00:00
pack_image ( vbox , " Pixbuf " ,
gtk_image_new_from_pixbuf ( pixbuf ) ) ;
g_object_unref ( pixbuf ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2013-06-10 12:15:56 +00:00
/*
* ListBox demo
*/
static int
list_sort_cb ( GtkListBoxRow * a , GtkListBoxRow * b , gpointer data )
{
gint aa = GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( a ) , " value " ) ) ;
gint bb = GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( b ) , " value " ) ) ;
return aa - bb ;
}
static gboolean
2013-06-11 14:53:46 +00:00
list_filter_all_cb ( GtkListBoxRow * row , gpointer data )
{
return FALSE ;
}
static gboolean
list_filter_odd_cb ( GtkListBoxRow * row , gpointer data )
2013-06-10 12:15:56 +00:00
{
gint value = GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( row ) , " value " ) ) ;
return value % 2 = = 0 ;
}
static void
list_sort_clicked_cb ( GtkButton * button ,
gpointer data )
{
GtkListBox * list = data ;
gtk_list_box_set_sort_func ( list , list_sort_cb , NULL , NULL ) ;
}
static void
2013-06-11 14:53:46 +00:00
list_filter_odd_clicked_cb ( GtkButton * button ,
gpointer data )
2013-06-10 12:15:56 +00:00
{
GtkListBox * list = data ;
2013-06-11 14:53:46 +00:00
gtk_list_box_set_filter_func ( list , list_filter_odd_cb , NULL , NULL ) ;
}
static void
list_filter_all_clicked_cb ( GtkButton * button ,
gpointer data )
{
GtkListBox * list = data ;
gtk_list_box_set_filter_func ( list , list_filter_all_cb , NULL , NULL ) ;
2013-06-10 12:15:56 +00:00
}
static void
list_unfilter_clicked_cb ( GtkButton * button ,
gpointer data )
{
GtkListBox * list = data ;
gtk_list_box_set_filter_func ( list , NULL , NULL , NULL ) ;
}
2013-06-11 14:53:46 +00:00
static void
add_placeholder_clicked_cb ( GtkButton * button ,
gpointer data )
{
GtkListBox * list = data ;
GtkWidget * label ;
label = gtk_label_new ( " You filtered everything!!! " ) ;
gtk_widget_show ( label ) ;
gtk_list_box_set_placeholder ( GTK_LIST_BOX ( list ) , label ) ;
}
static void
remove_placeholder_clicked_cb ( GtkButton * button ,
gpointer data )
{
GtkListBox * list = data ;
gtk_list_box_set_placeholder ( GTK_LIST_BOX ( list ) , NULL ) ;
}
2013-06-10 12:15:56 +00:00
static void
create_listbox ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
GtkWidget * hbox , * vbox , * scrolled , * scrolled_box , * list , * label , * button ;
GdkScreen * screen = gtk_widget_get_screen ( widget ) ;
int i ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) , screen ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " delete-event " ,
G_CALLBACK ( gtk_true ) ,
NULL ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " listbox " ) ;
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , hbox ) ;
scrolled = gtk_scrolled_window_new ( NULL , NULL ) ;
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled ) , GTK_POLICY_NEVER , GTK_POLICY_AUTOMATIC ) ;
gtk_container_add ( GTK_CONTAINER ( hbox ) , scrolled ) ;
scrolled_box = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( scrolled ) , scrolled_box ) ;
label = gtk_label_new ( " This is \n a LABEL \n with rows " ) ;
gtk_container_add ( GTK_CONTAINER ( scrolled_box ) , label ) ;
list = gtk_list_box_new ( ) ;
gtk_list_box_set_adjustment ( GTK_LIST_BOX ( list ) , gtk_scrolled_window_get_vadjustment ( GTK_SCROLLED_WINDOW ( scrolled ) ) ) ;
gtk_container_add ( GTK_CONTAINER ( scrolled_box ) , list ) ;
for ( i = 0 ; i < 1000 ; i + + )
{
gint value = g_random_int_range ( 0 , 10000 ) ;
label = gtk_label_new ( g_strdup_printf ( " Value %u " , value ) ) ;
gtk_widget_show ( label ) ;
gtk_container_add ( GTK_CONTAINER ( list ) , label ) ;
g_object_set_data ( G_OBJECT ( gtk_widget_get_parent ( label ) ) , " value " , GINT_TO_POINTER ( value ) ) ;
}
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( hbox ) , vbox ) ;
button = gtk_button_new_with_label ( " sort " ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
g_signal_connect ( button , " clicked " , G_CALLBACK ( list_sort_clicked_cb ) , list ) ;
button = gtk_button_new_with_label ( " filter odd " ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
2013-06-11 14:53:46 +00:00
g_signal_connect ( button , " clicked " , G_CALLBACK ( list_filter_odd_clicked_cb ) , list ) ;
button = gtk_button_new_with_label ( " filter all " ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
g_signal_connect ( button , " clicked " , G_CALLBACK ( list_filter_all_clicked_cb ) , list ) ;
2013-06-10 12:15:56 +00:00
button = gtk_button_new_with_label ( " unfilter " ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
g_signal_connect ( button , " clicked " , G_CALLBACK ( list_unfilter_clicked_cb ) , list ) ;
2013-06-11 14:53:46 +00:00
button = gtk_button_new_with_label ( " add placeholder " ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
g_signal_connect ( button , " clicked " , G_CALLBACK ( add_placeholder_clicked_cb ) , list ) ;
button = gtk_button_new_with_label ( " remove placeholder " ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
g_signal_connect ( button , " clicked " , G_CALLBACK ( remove_placeholder_clicked_cb ) , list ) ;
2013-06-10 12:15:56 +00:00
}
if ( ! gtk_widget_get_visible ( window ) )
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2008-02-27 10:31:24 +00:00
/*
* Menu demo
*/
static GtkWidget *
2011-10-01 03:49:30 +00:00
create_menu ( GdkScreen * screen , gint depth , gint length )
2008-02-27 10:31:24 +00:00
{
GtkWidget * menu ;
GtkWidget * menuitem ;
GtkWidget * image ;
GSList * group ;
char buf [ 32 ] ;
int i , j ;
if ( depth < 1 )
return NULL ;
menu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( menu ) , screen ) ;
group = NULL ;
2013-06-24 21:31:22 +00:00
image = gtk_image_new_from_icon_name ( " document-open " ,
GTK_ICON_SIZE_MENU ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( image ) ;
2013-06-27 22:48:46 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_image_menu_item_new_with_label ( " Image item " ) ;
gtk_image_menu_item_set_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , image ) ;
2013-06-27 22:48:46 +00:00
gtk_image_menu_item_set_always_show_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , TRUE ) ;
G_GNUC_END_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
for ( i = 0 , j = 1 ; i < length ; i + + , j + + )
{
sprintf ( buf , " item %2d - %d " , depth , j ) ;
menuitem = gtk_radio_menu_item_new_with_label ( group , buf ) ;
group = gtk_radio_menu_item_get_group ( GTK_RADIO_MENU_ITEM ( menuitem ) ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
if ( i = = 3 )
gtk_widget_set_sensitive ( menuitem , FALSE ) ;
if ( i = = 5 )
gtk_check_menu_item_set_inconsistent ( GTK_CHECK_MENU_ITEM ( menuitem ) ,
TRUE ) ;
if ( i < 5 )
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) ,
2011-10-01 03:49:30 +00:00
create_menu ( screen , depth - 1 , 5 ) ) ;
2008-02-27 10:31:24 +00:00
}
return menu ;
}
static GtkWidget *
2011-10-01 03:49:30 +00:00
create_table_menu ( GdkScreen * screen , gint cols , gint rows )
2008-02-27 10:31:24 +00:00
{
GtkWidget * menu ;
GtkWidget * menuitem ;
GtkWidget * submenu ;
GtkWidget * image ;
char buf [ 32 ] ;
int i , j ;
menu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( menu ) , screen ) ;
j = 0 ;
menuitem = gtk_menu_item_new_with_label ( " items " ) ;
gtk_menu_attach ( GTK_MENU ( menu ) , menuitem , 0 , cols , j , j + 1 ) ;
submenu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( submenu ) , screen ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , submenu ) ;
gtk_widget_show ( menuitem ) ;
j + + ;
/* now fill the items submenu */
2013-06-24 21:31:22 +00:00
image = gtk_image_new_from_icon_name ( " help-broswer " ,
GTK_ICON_SIZE_MENU ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( image ) ;
2013-06-27 22:48:46 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_image_menu_item_new_with_label ( " Image " ) ;
gtk_image_menu_item_set_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , image ) ;
2013-06-27 22:48:46 +00:00
gtk_image_menu_item_set_always_show_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , TRUE ) ;
G_GNUC_END_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 0 , 1 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " x " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 0 , 1 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " x " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 1 , 2 ) ;
gtk_widget_show ( menuitem ) ;
2013-06-24 21:31:22 +00:00
image = gtk_image_new_from_icon_name ( " help-browser " ,
GTK_ICON_SIZE_MENU ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( image ) ;
2013-06-27 22:48:46 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_image_menu_item_new_with_label ( " Image " ) ;
gtk_image_menu_item_set_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , image ) ;
2013-06-27 22:48:46 +00:00
gtk_image_menu_item_set_always_show_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , TRUE ) ;
G_GNUC_END_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 1 , 2 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_radio_menu_item_new_with_label ( NULL , " Radio " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 2 , 3 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " x " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 2 , 3 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " x " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 3 , 4 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_radio_menu_item_new_with_label ( NULL , " Radio " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 3 , 4 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_check_menu_item_new_with_label ( " Check " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 4 , 5 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " x " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 4 , 5 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " x " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 5 , 6 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_check_menu_item_new_with_label ( " Check " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 5 , 6 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " 1. Inserted normally (8) " ) ;
gtk_widget_show ( menuitem ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( submenu ) , menuitem , 8 ) ;
menuitem = gtk_menu_item_new_with_label ( " 2. Inserted normally (2) " ) ;
gtk_widget_show ( menuitem ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( submenu ) , menuitem , 2 ) ;
menuitem = gtk_menu_item_new_with_label ( " 3. Inserted normally (0) " ) ;
gtk_widget_show ( menuitem ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( submenu ) , menuitem , 0 ) ;
menuitem = gtk_menu_item_new_with_label ( " 4. Inserted normally (-1) " ) ;
gtk_widget_show ( menuitem ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( submenu ) , menuitem , - 1 ) ;
/* end of items submenu */
menuitem = gtk_menu_item_new_with_label ( " spanning " ) ;
gtk_menu_attach ( GTK_MENU ( menu ) , menuitem , 0 , cols , j , j + 1 ) ;
submenu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( submenu ) , screen ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , submenu ) ;
gtk_widget_show ( menuitem ) ;
j + + ;
/* now fill the spanning submenu */
menuitem = gtk_menu_item_new_with_label ( " a " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 2 , 0 , 1 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " b " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 2 , 3 , 0 , 2 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " c " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 1 , 3 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " d " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 2 , 1 , 2 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " e " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 1 , 3 , 2 , 3 ) ;
gtk_widget_show ( menuitem ) ;
/* end of spanning submenu */
menuitem = gtk_menu_item_new_with_label ( " left " ) ;
gtk_menu_attach ( GTK_MENU ( menu ) , menuitem , 0 , 1 , j , j + 1 ) ;
submenu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( submenu ) , screen ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , submenu ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " Empty " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 0 , 1 ) ;
submenu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( submenu ) , screen ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , submenu ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " right " ) ;
gtk_menu_attach ( GTK_MENU ( menu ) , menuitem , 1 , 2 , j , j + 1 ) ;
submenu = gtk_menu_new ( ) ;
gtk_menu_set_screen ( GTK_MENU ( submenu ) , screen ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , submenu ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " Empty " ) ;
gtk_menu_attach ( GTK_MENU ( submenu ) , menuitem , 0 , 1 , 0 , 1 ) ;
gtk_widget_show ( menuitem ) ;
j + + ;
for ( ; j < rows ; j + + )
for ( i = 0 ; i < cols ; i + + )
{
sprintf ( buf , " (%d %d) " , i , j ) ;
menuitem = gtk_menu_item_new_with_label ( buf ) ;
gtk_menu_attach ( GTK_MENU ( menu ) , menuitem , i , i + 1 , j , j + 1 ) ;
gtk_widget_show ( menuitem ) ;
}
menuitem = gtk_menu_item_new_with_label ( " 1. Inserted normally (8) " ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( menu ) , menuitem , 8 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " 2. Inserted normally (2) " ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( menu ) , menuitem , 2 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " 3. Inserted normally (0) " ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( menu ) , menuitem , 0 ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " 4. Inserted normally (-1) " ) ;
gtk_menu_shell_insert ( GTK_MENU_SHELL ( menu ) , menuitem , - 1 ) ;
gtk_widget_show ( menuitem ) ;
return menu ;
}
static void
create_menus ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * optionmenu ;
GtkWidget * separator ;
if ( ! window )
{
GtkWidget * menubar ;
GtkWidget * menu ;
GtkWidget * menuitem ;
GtkAccelGroup * accel_group ;
GtkWidget * image ;
GdkScreen * screen = gtk_widget_get_screen ( widget ) ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) , screen ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " delete-event " ,
G_CALLBACK ( gtk_true ) ,
NULL ) ;
accel_group = gtk_accel_group_new ( ) ;
gtk_window_add_accel_group ( GTK_WINDOW ( window ) , accel_group ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " menus " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
gtk_widget_show ( box1 ) ;
menubar = gtk_menu_bar_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , menubar , FALSE , TRUE , 0 ) ;
gtk_widget_show ( menubar ) ;
2011-10-01 03:49:30 +00:00
menu = create_menu ( screen , 2 , 50 ) ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_menu_item_new_with_label ( " test \n line2 " ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , menu ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menubar ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
2011-10-01 03:49:30 +00:00
menu = create_table_menu ( screen , 2 , 50 ) ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_menu_item_new_with_label ( " table " ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , menu ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menubar ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
menuitem = gtk_menu_item_new_with_label ( " foo " ) ;
2011-10-01 03:49:30 +00:00
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , create_menu ( screen , 3 , 5 ) ) ;
2008-02-27 10:31:24 +00:00
gtk_menu_shell_append ( GTK_MENU_SHELL ( menubar ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
2013-06-24 21:31:22 +00:00
image = gtk_image_new_from_icon_name ( " help-browser " ,
GTK_ICON_SIZE_MENU ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( image ) ;
2013-06-27 22:48:46 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_image_menu_item_new_with_label ( " Help " ) ;
gtk_image_menu_item_set_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , image ) ;
2013-06-27 22:48:46 +00:00
gtk_image_menu_item_set_always_show_image ( GTK_IMAGE_MENU_ITEM ( menuitem ) , TRUE ) ;
G_GNUC_END_IGNORE_DEPRECATIONS ;
2011-10-01 03:49:30 +00:00
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , create_menu ( screen , 4 , 5 ) ) ;
2011-05-02 14:47:06 +00:00
gtk_widget_set_hexpand ( menuitem , TRUE ) ;
gtk_widget_set_halign ( menuitem , GTK_ALIGN_END ) ;
2008-02-27 10:31:24 +00:00
gtk_menu_shell_append ( GTK_MENU_SHELL ( menubar ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
menubar = gtk_menu_bar_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , menubar , FALSE , TRUE , 0 ) ;
gtk_widget_show ( menubar ) ;
2011-10-01 03:49:30 +00:00
menu = create_menu ( screen , 2 , 10 ) ;
2008-02-27 10:31:24 +00:00
menuitem = gtk_menu_item_new_with_label ( " Second menu bar " ) ;
gtk_menu_item_set_submenu ( GTK_MENU_ITEM ( menuitem ) , menu ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menubar ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
gtk_widget_show ( box2 ) ;
2011-10-01 03:49:30 +00:00
menu = create_menu ( screen , 1 , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_menu_set_accel_group ( GTK_MENU ( menu ) , accel_group ) ;
menuitem = gtk_check_menu_item_new_with_label ( " Accelerate Me " ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
gtk_widget_add_accelerator ( menuitem ,
" activate " ,
accel_group ,
2010-09-08 17:35:51 +00:00
GDK_KEY_F1 ,
2008-02-27 10:31:24 +00:00
0 ,
GTK_ACCEL_VISIBLE ) ;
menuitem = gtk_check_menu_item_new_with_label ( " Accelerator Locked " ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
gtk_widget_add_accelerator ( menuitem ,
" activate " ,
accel_group ,
2010-09-08 17:35:51 +00:00
GDK_KEY_F2 ,
2008-02-27 10:31:24 +00:00
0 ,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED ) ;
menuitem = gtk_check_menu_item_new_with_label ( " Accelerators Frozen " ) ;
gtk_menu_shell_append ( GTK_MENU_SHELL ( menu ) , menuitem ) ;
gtk_widget_show ( menuitem ) ;
gtk_widget_add_accelerator ( menuitem ,
" activate " ,
accel_group ,
2010-09-08 17:35:51 +00:00
GDK_KEY_F2 ,
2008-02-27 10:31:24 +00:00
0 ,
GTK_ACCEL_VISIBLE ) ;
gtk_widget_add_accelerator ( menuitem ,
" activate " ,
accel_group ,
2010-09-08 17:35:51 +00:00
GDK_KEY_F3 ,
2008-02-27 10:31:24 +00:00
0 ,
GTK_ACCEL_VISIBLE ) ;
2010-10-02 16:19:46 +00:00
optionmenu = gtk_combo_box_text_new ( ) ;
2010-03-26 16:55:07 +00:00
gtk_combo_box_set_active ( GTK_COMBO_BOX ( optionmenu ) , 3 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box2 ) , optionmenu , TRUE , TRUE , 0 ) ;
gtk_widget_show ( optionmenu ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
gtk_widget_show ( separator ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
gtk_widget_show ( box2 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
gtk_widget_show ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/* GdkPixbuf RGBA C-Source image dump */
static const guint8 apple [ ] =
{ " "
/* Pixbuf magic (0x47646b50) */
" GdkP "
/* length: header (24) + pixel_data (2304) */
" \0 \0 \11 \30 "
/* pixdata_type (0x1010002) */
" \1 \1 \0 \2 "
/* rowstride (96) */
" \0 \0 \0 ` "
/* width (24) */
" \0 \0 \0 \30 "
/* height (24) */
" \0 \0 \0 \30 "
/* pixel_data: */
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \26 \24 "
" \17 \11 \0 \0 \0 \2 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 `m "
" [pn{a \344 hv_ \345 _k[` \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 D>/ \305 \0 \0 \0 _ \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 `l[Blza \373 s \202 d \354 w \206 g \372 p~c "
" \374 `l[y \0 \0 \0 \0 [S \77 / \27 \25 \17 \335 \0 \0 \0 \20 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 `l \\ \20 iw_ \356 y \211 h \373 x \207 g \364 ~ \216 i \364 u \204 e \366 gt "
" _ \374 ^jX \241 A;-_ \0 \0 \0 ~ \0 \0 \0 \0 SM4)SM21B9& \22 \320 \270 \204 \1 \320 \270 \204 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 eq "
" ] \212 r \200 c \366 v \205 f \371 jx_ \323 _kY \232 _kZH^jY \26 ]iW \211 @G9 \272 :6%j \220 "
" \211 ] \320 \221 \211 ` \377 \212 \203 Z \377 ~xP \377 mkE \331 ]^;|/0 \37 \21 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 ly` \40 p~b \360 lz` \353 ^kY \246 [ "
" eT< \216 \200 Z \203 \227 \211 _ \354 \234 \217 c \377 \232 \217 b \362 \232 \220 c \337 "
" \243 \233 k \377 \252 \241 p \377 \250 \236 p \377 \241 \225 h \377 \231 \214 _ \377 \210 "
" \202 U \377 srI \377 []: \355 KO0U \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 i "
" v^ \200 `lY \211 ^jY \" \0 \0 \0 \0 \221 \204 \\ \273 \250 \233 r \377 \302 \267 \224 \377 "
" \311 \300 \237 \377 \272 \256 \204 \377 \271 \256 \177 \377 \271 \257 \200 \377 \267 "
" \260 \177 \377 \260 \251 x \377 \250 \236 l \377 \242 \225 e \377 \226 \213 ] \377 ~zP \377 "
" ff@ \377 QT5 \377 LR2d \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 ]iW( \0 \0 \0 \0 \0 \0 \0 "
" \0 \213 \203 [v \253 \240 t \377 \334 \326 \301 \377 \344 \340 \317 \377 \321 \312 \253 "
" \377 \303 \271 \217 \377 \300 \270 \213 \377 \277 \267 \210 \377 \272 \264 \203 \377 "
" \261 \255 z \377 \250 \242 n \377 \243 \232 h \377 \232 \220 ` \377 \210 \202 V \377 nnE "
" \377 SW6 \377 RX6 \364 Za< \34 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 b]@ \20 "
" \234 \222 e \362 \304 \274 \232 \377 \337 \333 \306 \377 \332 \325 \273 \377 \311 \302 "
" \232 \377 \312 \303 \236 \377 \301 \273 \216 \377 \300 \271 \212 \377 \270 \264 \200 "
" \377 \256 \253 v \377 \246 \243 n \377 \236 \232 h \377 \230 \220 ` \377 \213 \203 V \377 "
" wvL \377 X]: \377 KR0 \377 NU5v \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \212 "
" \203 Zl \242 \234 l \377 \321 \315 \260 \377 \331 \324 \271 \377 \320 \313 \251 \377 \307 "
" \301 \232 \377 \303 \276 \224 \377 \300 \272 \214 \377 \274 \267 \206 \377 \264 \260 "
" | \377 \253 \251 s \377 \244 \243 n \377 \232 \230 e \377 \223 \216 ^ \377 \207 \200 U \377 "
" ttJ \377 [_< \377 HO/ \377 GN0 \200 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \210 \204 Y \240 \245 \237 o \377 \316 \310 \253 \377 \310 \303 \237 \377 \304 \300 \230 "
" \377 \303 \277 \225 \377 \277 \272 \216 \377 \274 \270 \210 \377 \266 \263 \200 \377 "
" \256 \254 v \377 \247 \246 p \377 \237 \236 j \377 \227 \226 d \377 \215 \212 [ \377 \203 "
" \177 T \377 qsH \377 X]8 \377 FN. \377 DK- \200 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \207 \204 X \257 \244 \240 o \377 \300 \275 \231 \377 \301 \275 \226 \377 \274 "
" \270 \213 \377 \274 \270 \214 \377 \267 \264 \205 \377 \264 \262 \200 \377 \260 \256 "
" z \377 \251 \251 s \377 \243 \244 n \377 \231 \232 g \377 \220 \222 ` \377 \210 \211 Y \377 "
" |}Q \377 hlC \377 PU3 \377 CK, \377 DL/Y \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \205 \204 X \220 \232 \230 h \377 \261 \260 \204 \377 \266 \264 \212 \377 \261 \260 "
" \201 \377 \263 \260 \200 \377 \260 \257 } \377 \256 \256 x \377 \253 \254 t \377 \244 \246 "
" o \377 \233 \236 i \377 \221 \224 b \377 \211 \214 \\ \377 \202 \204 V \377 txM \377 ]b> "
" \377 HP0 \377 @H+ \373 CJ- \25 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 xxO> "
" \215 \215 _ \377 \237 \237 r \377 \247 \247 x \377 \247 \247 t \377 \252 \252 w \377 \252 "
" \252 u \377 \252 \253 t \377 \243 \246 o \377 \235 \240 j \377 \223 \230 c \377 \213 \217 "
" ] \377 \201 \206 V \377 x}P \377 gkD \377 RY5 \377 BI, \377 AI, \262 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \202 \205 W \312 \216 \220 ` \377 \230 "
" \232 g \377 \234 \236 i \377 \236 \241 l \377 \241 \244 n \377 \240 \244 m \377 \232 \237 "
" i \377 \223 \230 c \377 \212 \221 ] \377 \200 \210 W \377 v|P \377 jnG \377 Za> \377 HP2 "
" \377 =D) \377 HQ1: \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 wzQ6 \177 \201 U \371 \206 \211 Z \377 \216 \222 ` \377 \220 \225 a \377 \220 \225 b \377 "
" \220 \226 a \377 \213 \221 _ \377 \204 \213 Z \377 { \203 R \377 ryN \377 iqH \377 ^fA \377 "
" R[; \377 BJ- \377 8@' \317 \0 \0 \0 > \0 \0 \0 \36 \0 \0 \0 \7 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 ptJTw|Q \371 z \177 R \377 } \202 T \377 | \203 T \377 z \200 "
" R \377 v|O \377 pwL \377 jpF \377 dlB \377 `hB \377 Yb@ \377 LT6 \377 <C* \377 \11 \12 \6 "
" \376 \0 \0 \0 \347 \0 \0 \0 \262 \0 \0 \0 Y \0 \0 \0 \32 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \\ `=UgnE \370 hnG \377 gmE \377 djB \377 ]d> \377 [c< \377 Y "
" b< \377 Zc> \377 V_> \377 OW8 \377 BK/ \377 \16 \20 \12 \377 \0 \0 \0 \377 \0 \0 \0 \377 \0 "
" \0 \0 \374 \0 \0 \0 \320 \0 \0 \0 I \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \1 \0 \0 \0 \40 \22 \24 \15 \260 @D+ \377 W`; \377 OV5 \377 .3 \36 \377 .3 \37 \377 IP0 "
" \377 RZ7 \377 PZ8 \377 6=& \377 \14 \15 \10 \377 \0 \0 \0 \377 \0 \0 \0 \377 \0 \0 \0 \377 "
" \0 \0 \0 \347 \0 \0 \0 \217 \0 \0 \0 " " 4 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \20 \0 \0 \0 P \0 \0 \0 \252 \7 \10 \5 \346 \7 \7 \5 \375 \0 \0 \0 \377 \0 \0 "
" \0 \377 \0 \0 \0 \377 \0 \0 \0 \377 \0 \0 \0 \377 \0 \0 \0 \377 \0 \0 \0 \377 \0 \0 \0 \374 \0 "
" \0 \0 \336 \0 \0 \0 \254 \0 \0 \0 i \0 \0 \0 " " 2 \0 \0 \0 \10 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \11 \0 \0 \0 \40 \0 \0 \0 D \0 \0 \0 m \0 \0 \0 "
" \226 \0 \0 \0 \234 \0 \0 \0 \234 \0 \0 \0 \244 \0 \0 \0 \246 \0 \0 \0 \232 \0 \0 \0 \202 \0 \0 "
" \0 i \0 \0 \0 T \0 \0 \0 , \0 \0 \0 \15 \0 \0 \0 \2 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 "
" \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \2 \0 \0 \0 \6 \0 \0 \0 "
" \16 \0 \0 \0 \22 \0 \0 \0 \24 \0 \0 \0 \23 \0 \0 \0 \17 \0 \0 \0 \14 \0 \0 \0 \13 \0 \0 \0 \10 \0 "
" \0 \0 \5 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 " } ;
static GtkWidget *
accel_button_new ( GtkAccelGroup * accel_group ,
const gchar * text ,
const gchar * accel )
{
guint keyval ;
GdkModifierType modifiers ;
GtkWidget * button ;
GtkWidget * label ;
gtk_accelerator_parse ( accel , & keyval , & modifiers ) ;
g_assert ( keyval ) ;
button = gtk_button_new ( ) ;
gtk_widget_add_accelerator ( button , " activate " , accel_group ,
keyval , modifiers , GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED ) ;
label = gtk_accel_label_new ( text ) ;
gtk_accel_label_set_accel_widget ( GTK_ACCEL_LABEL ( label ) , button ) ;
gtk_widget_show ( label ) ;
gtk_container_add ( GTK_CONTAINER ( button ) , label ) ;
return button ;
}
static void
create_key_lookup ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2008-07-18 18:27:30 +00:00
gpointer window_ptr ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
GtkAccelGroup * accel_group = gtk_accel_group_new ( ) ;
GtkWidget * button ;
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
window = gtk_dialog_new_with_buttons ( " Key Lookup " , NULL , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " , GTK_RESPONSE_CLOSE ,
2008-02-27 10:31:24 +00:00
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
/* We have to expand it so the accel labels will draw their labels
*/
gtk_window_set_default_size ( GTK_WINDOW ( window ) , 300 , - 1 ) ;
gtk_window_add_accel_group ( GTK_WINDOW ( window ) , accel_group ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 1 (_a) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 2 (_A) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 3 (_ \321 \204 ) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 4 (_ \320 \244 ) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 6 (_b) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 7 " , " <Alt><Shift>b " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 8 " , " <Alt>d " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 9 " , " <Alt>Cyrillic_ve " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 10 (_1) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_mnemonic ( " Button 11 (_!) " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 12 " , " <Super>a " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 13 " , " <Hyper>a " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 14 " , " <Meta>a " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
button = accel_button_new ( accel_group , " Button 15 " , " <Shift><Mod4>b " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , FALSE , FALSE , 0 ) ;
2008-07-18 18:27:30 +00:00
window_ptr = & window ;
g_object_add_weak_pointer ( G_OBJECT ( window ) , window_ptr ) ;
2010-09-18 23:57:32 +00:00
g_signal_connect ( window , " response " , G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
}
else
gtk_widget_destroy ( window ) ;
}
/*
create_modal_window
*/
static gboolean
cmw_destroy_cb ( GtkWidget * widget )
{
/* This is needed to get out of gtk_main */
gtk_main_quit ( ) ;
return FALSE ;
}
static void
cmw_color ( GtkWidget * widget , GtkWidget * parent )
{
GtkWidget * csd ;
2012-02-09 21:23:30 +00:00
csd = gtk_color_chooser_dialog_new ( " This is a modal color selection dialog " , GTK_WINDOW ( parent ) ) ;
2008-02-27 10:31:24 +00:00
/* Set as modal */
gtk_window_set_modal ( GTK_WINDOW ( csd ) , TRUE ) ;
g_signal_connect ( csd , " destroy " ,
G_CALLBACK ( cmw_destroy_cb ) , NULL ) ;
2012-02-09 21:23:30 +00:00
g_signal_connect ( csd , " response " ,
G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2008-02-27 10:31:24 +00:00
/* wait until destroy calls gtk_main_quit */
gtk_widget_show ( csd ) ;
gtk_main ( ) ;
}
static void
cmw_file ( GtkWidget * widget , GtkWidget * parent )
{
GtkWidget * fs ;
2010-04-06 15:22:18 +00:00
fs = gtk_file_chooser_dialog_new ( " This is a modal file selection dialog " ,
2013-06-24 21:31:22 +00:00
GTK_WINDOW ( parent ) ,
GTK_FILE_CHOOSER_ACTION_OPEN ,
" _Open " , GTK_RESPONSE_ACCEPT ,
" _Cancel " , GTK_RESPONSE_CANCEL ,
NULL ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_screen ( GTK_WINDOW ( fs ) , gtk_widget_get_screen ( parent ) ) ;
2010-04-06 15:22:18 +00:00
gtk_window_set_modal ( GTK_WINDOW ( fs ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( fs , " destroy " ,
G_CALLBACK ( cmw_destroy_cb ) , NULL ) ;
2010-04-06 15:22:18 +00:00
g_signal_connect_swapped ( fs , " response " ,
G_CALLBACK ( gtk_widget_destroy ) , fs ) ;
2008-02-27 10:31:24 +00:00
/* wait until destroy calls gtk_main_quit */
gtk_widget_show ( fs ) ;
gtk_main ( ) ;
}
static void
create_modal_window ( GtkWidget * widget )
{
GtkWidget * window = NULL ;
GtkWidget * box1 , * box2 ;
GtkWidget * frame1 ;
GtkWidget * btnColor , * btnFile , * btnClose ;
/* Create modal window (Here you can use any window descendent )*/
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " This window is modal " ) ;
/* Set window as modal */
gtk_window_set_modal ( GTK_WINDOW ( window ) , TRUE ) ;
/* Create widgets */
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
frame1 = gtk_frame_new ( " Standard dialogs in modal form " ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
gtk_box_set_homogeneous ( GTK_BOX ( box2 ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
btnColor = gtk_button_new_with_label ( " Color " ) ;
btnFile = gtk_button_new_with_label ( " File Selection " ) ;
btnClose = gtk_button_new_with_label ( " Close " ) ;
/* Init widgets */
gtk_container_set_border_width ( GTK_CONTAINER ( box1 ) , 3 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 3 ) ;
/* Pack widgets */
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , frame1 , TRUE , TRUE , 4 ) ;
gtk_container_add ( GTK_CONTAINER ( frame1 ) , box2 ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , btnColor , FALSE , FALSE , 4 ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , btnFile , FALSE , FALSE , 4 ) ;
2010-10-29 23:32:34 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) , FALSE , FALSE , 4 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , btnClose , FALSE , FALSE , 4 ) ;
/* connect signals */
g_signal_connect_swapped ( btnClose , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) , window ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( cmw_destroy_cb ) , NULL ) ;
g_signal_connect ( btnColor , " clicked " ,
G_CALLBACK ( cmw_color ) , window ) ;
g_signal_connect ( btnFile , " clicked " ,
G_CALLBACK ( cmw_file ) , window ) ;
/* Show widgets */
gtk_widget_show_all ( window ) ;
/* wait until dialog get destroyed */
gtk_main ( ) ;
}
/*
* GtkMessageDialog
*/
static void
make_message_dialog ( GdkScreen * screen ,
GtkWidget * * dialog ,
GtkMessageType type ,
GtkButtonsType buttons ,
guint default_response )
{
if ( * dialog )
{
gtk_widget_destroy ( * dialog ) ;
return ;
}
* dialog = gtk_message_dialog_new ( NULL , 0 , type , buttons ,
" This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.) " ) ;
gtk_window_set_screen ( GTK_WINDOW ( * dialog ) , screen ) ;
g_signal_connect_swapped ( * dialog ,
" response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
* dialog ) ;
g_signal_connect ( * dialog ,
" destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
dialog ) ;
gtk_dialog_set_default_response ( GTK_DIALOG ( * dialog ) , default_response ) ;
gtk_widget_show ( * dialog ) ;
}
static void
create_message_dialog ( GtkWidget * widget )
{
static GtkWidget * info = NULL ;
static GtkWidget * warning = NULL ;
static GtkWidget * error = NULL ;
static GtkWidget * question = NULL ;
GdkScreen * screen = gtk_widget_get_screen ( widget ) ;
make_message_dialog ( screen , & info , GTK_MESSAGE_INFO , GTK_BUTTONS_OK , GTK_RESPONSE_OK ) ;
make_message_dialog ( screen , & warning , GTK_MESSAGE_WARNING , GTK_BUTTONS_CLOSE , GTK_RESPONSE_CLOSE ) ;
make_message_dialog ( screen , & error , GTK_MESSAGE_ERROR , GTK_BUTTONS_OK_CANCEL , GTK_RESPONSE_OK ) ;
make_message_dialog ( screen , & question , GTK_MESSAGE_QUESTION , GTK_BUTTONS_YES_NO , GTK_RESPONSE_NO ) ;
}
/*
* GtkScrolledWindow
*/
static GtkWidget * sw_parent = NULL ;
static GtkWidget * sw_float_parent ;
2010-10-08 00:37:23 +00:00
static gulong sw_destroyed_handler = 0 ;
2008-02-27 10:31:24 +00:00
static gboolean
scrolled_windows_delete_cb ( GtkWidget * widget , GdkEventAny * event , GtkWidget * scrollwin )
{
2014-05-22 12:50:18 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
gtk_widget_reparent ( scrollwin , sw_parent ) ;
2014-05-22 12:50:18 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
g_signal_handler_disconnect ( sw_parent , sw_destroyed_handler ) ;
sw_float_parent = NULL ;
sw_parent = NULL ;
sw_destroyed_handler = 0 ;
return FALSE ;
}
static void
scrolled_windows_destroy_cb ( GtkWidget * widget , GtkWidget * scrollwin )
{
gtk_widget_destroy ( sw_float_parent ) ;
sw_float_parent = NULL ;
sw_parent = NULL ;
sw_destroyed_handler = 0 ;
}
static void
2014-04-10 14:42:59 +00:00
scrolled_windows_remove ( GtkWidget * dialog , gint response , GtkWidget * scrollwin )
2008-02-27 10:31:24 +00:00
{
2014-04-10 14:42:59 +00:00
if ( response ! = GTK_RESPONSE_APPLY )
{
gtk_widget_destroy ( dialog ) ;
return ;
}
2008-02-27 10:31:24 +00:00
if ( sw_parent )
{
2014-05-22 12:50:18 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
gtk_widget_reparent ( scrollwin , sw_parent ) ;
2014-05-22 12:50:18 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
gtk_widget_destroy ( sw_float_parent ) ;
g_signal_handler_disconnect ( sw_parent , sw_destroyed_handler ) ;
sw_float_parent = NULL ;
sw_parent = NULL ;
sw_destroyed_handler = 0 ;
}
else
{
2010-08-15 22:33:57 +00:00
sw_parent = gtk_widget_get_parent ( scrollwin ) ;
2008-02-27 10:31:24 +00:00
sw_float_parent = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( sw_float_parent ) ,
2014-04-10 14:42:59 +00:00
gtk_widget_get_screen ( dialog ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_default_size ( GTK_WINDOW ( sw_float_parent ) , 200 , 200 ) ;
2014-05-22 12:50:18 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
gtk_widget_reparent ( scrollwin , sw_float_parent ) ;
2014-05-22 12:50:18 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS
2008-02-27 10:31:24 +00:00
gtk_widget_show ( sw_float_parent ) ;
sw_destroyed_handler =
g_signal_connect ( sw_parent , " destroy " ,
G_CALLBACK ( scrolled_windows_destroy_cb ) , scrollwin ) ;
g_signal_connect ( sw_float_parent , " delete_event " ,
G_CALLBACK ( scrolled_windows_delete_cb ) , scrollwin ) ;
}
}
static void
create_scrolled_windows ( GtkWidget * widget )
{
static GtkWidget * window ;
2014-04-10 14:42:59 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * scrolled_window ;
GtkWidget * button ;
2014-04-10 14:42:59 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
char buffer [ 32 ] ;
int i , j ;
if ( ! window )
{
window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " dialog " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
scrolled_window = gtk_scrolled_window_new ( NULL , NULL ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( scrolled_window ) , 10 ) ;
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ) ,
GTK_POLICY_AUTOMATIC ,
GTK_POLICY_AUTOMATIC ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , scrolled_window , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( scrolled_window ) ;
2011-09-28 01:33:47 +00:00
grid = gtk_grid_new ( ) ;
gtk_grid_set_row_spacing ( GTK_GRID ( grid ) , 10 ) ;
gtk_grid_set_column_spacing ( GTK_GRID ( grid ) , 10 ) ;
2013-02-01 16:22:13 +00:00
gtk_container_add ( GTK_CONTAINER ( scrolled_window ) , grid ) ;
2011-09-28 01:33:47 +00:00
gtk_container_set_focus_hadjustment ( GTK_CONTAINER ( grid ) ,
2008-02-27 10:31:24 +00:00
gtk_scrolled_window_get_hadjustment ( GTK_SCROLLED_WINDOW ( scrolled_window ) ) ) ;
2011-09-28 01:33:47 +00:00
gtk_container_set_focus_vadjustment ( GTK_CONTAINER ( grid ) ,
2008-02-27 10:31:24 +00:00
gtk_scrolled_window_get_vadjustment ( GTK_SCROLLED_WINDOW ( scrolled_window ) ) ) ;
2011-09-28 01:33:47 +00:00
gtk_widget_show ( grid ) ;
2008-02-27 10:31:24 +00:00
for ( i = 0 ; i < 20 ; i + + )
for ( j = 0 ; j < 20 ; j + + )
{
sprintf ( buffer , " button (%d,%d) \n " , i , j ) ;
button = gtk_toggle_button_new_with_label ( buffer ) ;
2011-09-28 01:33:47 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , button , i , j , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( button ) ;
}
2014-04-10 14:42:59 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) ,
" Close " ,
GTK_RESPONSE_CLOSE ) ;
2008-02-27 10:31:24 +00:00
2014-04-10 14:42:59 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) ,
" Reparent Out " ,
GTK_RESPONSE_APPLY ) ;
2008-02-27 10:31:24 +00:00
2014-04-10 14:42:59 +00:00
g_signal_connect ( window , " response " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( scrolled_windows_remove ) ,
scrolled_window ) ;
gtk_window_set_default_size ( GTK_WINDOW ( window ) , 300 , 300 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkEntry
*/
static void
entry_toggle_frame ( GtkWidget * checkbutton ,
GtkWidget * entry )
{
gtk_entry_set_has_frame ( GTK_ENTRY ( entry ) ,
2010-10-19 16:46:40 +00:00
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static void
entry_toggle_sensitive ( GtkWidget * checkbutton ,
GtkWidget * entry )
{
2010-10-19 16:46:40 +00:00
gtk_widget_set_sensitive ( entry ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
2008-02-27 10:31:24 +00:00
}
2008-12-05 11:31:30 +00:00
static gboolean
entry_progress_timeout ( gpointer data )
{
if ( GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( data ) , " progress-pulse " ) ) )
{
gtk_entry_progress_pulse ( GTK_ENTRY ( data ) ) ;
}
else
{
gdouble fraction ;
fraction = gtk_entry_get_progress_fraction ( GTK_ENTRY ( data ) ) ;
fraction + = 0.05 ;
if ( fraction > 1.0001 )
fraction = 0.0 ;
gtk_entry_set_progress_fraction ( GTK_ENTRY ( data ) , fraction ) ;
}
2012-01-31 00:12:27 +00:00
return G_SOURCE_CONTINUE ;
2008-12-05 11:31:30 +00:00
}
static void
entry_remove_timeout ( gpointer data )
{
g_source_remove ( GPOINTER_TO_UINT ( data ) ) ;
}
static void
entry_toggle_progress ( GtkWidget * checkbutton ,
GtkWidget * entry )
{
2010-10-19 16:46:40 +00:00
if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) )
2008-12-05 11:31:30 +00:00
{
guint timeout = gdk_threads_add_timeout ( 100 ,
entry_progress_timeout ,
entry ) ;
g_object_set_data_full ( G_OBJECT ( entry ) , " timeout-id " ,
GUINT_TO_POINTER ( timeout ) ,
entry_remove_timeout ) ;
}
else
{
g_object_set_data ( G_OBJECT ( entry ) , " timeout-id " ,
GUINT_TO_POINTER ( 0 ) ) ;
gtk_entry_set_progress_fraction ( GTK_ENTRY ( entry ) , 0.0 ) ;
}
}
static void
entry_toggle_pulse ( GtkWidget * checkbutton ,
GtkWidget * entry )
{
g_object_set_data ( G_OBJECT ( entry ) , " progress-pulse " ,
2010-10-19 16:46:40 +00:00
GUINT_TO_POINTER ( ( guint ) gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ) ;
2008-12-05 11:31:30 +00:00
}
2008-02-27 10:31:24 +00:00
static void
create_entry ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * hbox ;
GtkWidget * has_frame_check ;
GtkWidget * sensitive_check ;
2008-12-05 11:31:30 +00:00
GtkWidget * progress_check ;
2010-04-06 14:36:05 +00:00
GtkWidget * entry ;
2010-10-18 07:10:27 +00:00
GtkComboBoxText * cb ;
2010-04-06 14:36:05 +00:00
GtkWidget * cb_entry ;
2008-02-27 10:31:24 +00:00
GtkWidget * button ;
GtkWidget * separator ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " entry " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box2 ) , hbox , TRUE , TRUE , 0 ) ;
entry = gtk_entry_new ( ) ;
gtk_entry_set_text ( GTK_ENTRY ( entry ) , " hello world \330 \247 \331 \204 \330 \263 \331 \204 \330 \247 \331 \205 \330 \271 \331 \204 \331 \212 \331 \203 \331 \205 " ) ;
gtk_editable_select_region ( GTK_EDITABLE ( entry ) , 0 , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , entry , TRUE , TRUE , 0 ) ;
2010-10-18 07:10:27 +00:00
cb = GTK_COMBO_BOX_TEXT ( gtk_combo_box_text_new_with_entry ( ) ) ;
gtk_combo_box_text_append_text ( cb , " item0 " ) ;
gtk_combo_box_text_append_text ( cb , " item0 " ) ;
gtk_combo_box_text_append_text ( cb , " item1 item1 " ) ;
gtk_combo_box_text_append_text ( cb , " item2 item2 item2 " ) ;
gtk_combo_box_text_append_text ( cb , " item3 item3 item3 item3 " ) ;
gtk_combo_box_text_append_text ( cb , " item4 item4 item4 item4 item4 " ) ;
gtk_combo_box_text_append_text ( cb , " item5 item5 item5 item5 item5 item5 " ) ;
gtk_combo_box_text_append_text ( cb , " item6 item6 item6 item6 item6 " ) ;
gtk_combo_box_text_append_text ( cb , " item7 item7 item7 item7 " ) ;
gtk_combo_box_text_append_text ( cb , " item8 item8 item8 " ) ;
gtk_combo_box_text_append_text ( cb , " item9 item9 " ) ;
2010-04-06 14:36:05 +00:00
cb_entry = gtk_bin_get_child ( GTK_BIN ( cb ) ) ;
gtk_entry_set_text ( GTK_ENTRY ( cb_entry ) , " hello world \n \n \n foo " ) ;
gtk_editable_select_region ( GTK_EDITABLE ( cb_entry ) , 0 , - 1 ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , GTK_WIDGET ( cb ) , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
sensitive_check = gtk_check_button_new_with_label ( " Sensitive " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , sensitive_check , FALSE , TRUE , 0 ) ;
g_signal_connect ( sensitive_check , " toggled " ,
G_CALLBACK ( entry_toggle_sensitive ) , entry ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( sensitive_check ) , TRUE ) ;
has_frame_check = gtk_check_button_new_with_label ( " Has Frame " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , has_frame_check , FALSE , TRUE , 0 ) ;
g_signal_connect ( has_frame_check , " toggled " ,
G_CALLBACK ( entry_toggle_frame ) , entry ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( has_frame_check ) , TRUE ) ;
2008-12-05 11:31:30 +00:00
progress_check = gtk_check_button_new_with_label ( " Show Progress " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , progress_check , FALSE , TRUE , 0 ) ;
g_signal_connect ( progress_check , " toggled " ,
G_CALLBACK ( entry_toggle_progress ) , entry ) ;
progress_check = gtk_check_button_new_with_label ( " Pulse Progress " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , progress_check , FALSE , TRUE , 0 ) ;
g_signal_connect ( progress_check , " toggled " ,
G_CALLBACK ( entry_toggle_pulse ) , entry ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
static void
create_expander ( GtkWidget * widget )
{
GtkWidget * box1 ;
GtkWidget * expander ;
GtkWidget * hidden ;
static GtkWidget * window = NULL ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " expander " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
expander = gtk_expander_new ( " The Hidden " ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , expander , TRUE , TRUE , 0 ) ;
hidden = gtk_label_new ( " Revealed! " ) ;
gtk_container_add ( GTK_CONTAINER ( expander ) , hidden ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/* GtkEventBox */
2014-10-12 02:54:40 +00:00
static gboolean
event_box_draw ( GtkWidget * widget ,
cairo_t * cr ,
gpointer user_data )
{
if ( gtk_widget_get_window ( widget ) = =
gtk_widget_get_window ( gtk_widget_get_parent ( widget ) ) )
return FALSE ;
cairo_set_source_rgb ( cr , 0 , 1 , 0 ) ;
cairo_paint ( cr ) ;
return FALSE ;
}
2008-02-27 10:31:24 +00:00
static void
event_box_label_pressed ( GtkWidget * widget ,
GdkEventButton * event ,
gpointer user_data )
{
g_print ( " clicked on event box \n " ) ;
}
static void
event_box_button_clicked ( GtkWidget * widget ,
GtkWidget * button ,
gpointer user_data )
{
g_print ( " pushed button \n " ) ;
}
static void
event_box_toggle_visible_window ( GtkWidget * checkbutton ,
GtkEventBox * event_box )
{
gtk_event_box_set_visible_window ( event_box ,
2010-10-19 16:46:40 +00:00
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static void
event_box_toggle_above_child ( GtkWidget * checkbutton ,
GtkEventBox * event_box )
{
gtk_event_box_set_above_child ( event_box ,
2010-10-19 16:46:40 +00:00
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static void
create_event_box ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * hbox ;
GtkWidget * vbox ;
GtkWidget * button ;
GtkWidget * separator ;
GtkWidget * event_box ;
GtkWidget * label ;
GtkWidget * visible_window_check ;
GtkWidget * above_child_check ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " event box " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , hbox , TRUE , FALSE , 0 ) ;
event_box = gtk_event_box_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , event_box , TRUE , FALSE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( event_box ) , vbox ) ;
g_signal_connect ( event_box , " button_press_event " ,
G_CALLBACK ( event_box_label_pressed ) ,
NULL ) ;
2014-10-12 02:54:40 +00:00
g_signal_connect ( event_box , " draw " ,
G_CALLBACK ( event_box_draw ) ,
NULL ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( " Click on this label " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , TRUE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " button in eventbox " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , TRUE , FALSE , 0 ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( event_box_button_clicked ) ,
NULL ) ;
visible_window_check = gtk_check_button_new_with_label ( " Visible Window " ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , visible_window_check , FALSE , TRUE , 0 ) ;
g_signal_connect ( visible_window_check , " toggled " ,
G_CALLBACK ( event_box_toggle_visible_window ) , event_box ) ;
2014-10-12 02:54:40 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( visible_window_check ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
above_child_check = gtk_check_button_new_with_label ( " Above Child " ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , above_child_check , FALSE , TRUE , 0 ) ;
g_signal_connect ( above_child_check , " toggled " ,
G_CALLBACK ( event_box_toggle_above_child ) , event_box ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( above_child_check ) , FALSE ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkSizeGroup
*/
# define SIZE_GROUP_INITIAL_SIZE 50
static void
size_group_hsize_changed ( GtkSpinButton * spin_button ,
GtkWidget * button )
{
2010-05-24 20:31:36 +00:00
gtk_widget_set_size_request ( gtk_bin_get_child ( GTK_BIN ( button ) ) ,
2008-02-27 10:31:24 +00:00
gtk_spin_button_get_value_as_int ( spin_button ) ,
- 1 ) ;
}
static void
size_group_vsize_changed ( GtkSpinButton * spin_button ,
GtkWidget * button )
{
2010-05-24 20:31:36 +00:00
gtk_widget_set_size_request ( gtk_bin_get_child ( GTK_BIN ( button ) ) ,
2008-02-27 10:31:24 +00:00
- 1 ,
gtk_spin_button_get_value_as_int ( spin_button ) ) ;
}
static GtkWidget *
create_size_group_window ( GdkScreen * screen ,
GtkSizeGroup * master_size_group )
{
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * window ;
2011-09-28 22:35:35 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
GtkWidget * main_button ;
GtkWidget * button ;
GtkWidget * spin_button ;
GtkWidget * hbox ;
GtkSizeGroup * hgroup1 ;
GtkSizeGroup * hgroup2 ;
GtkSizeGroup * vgroup1 ;
GtkSizeGroup * vgroup2 ;
window = gtk_dialog_new_with_buttons ( " GtkSizeGroup " ,
NULL , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " ,
2008-02-27 10:31:24 +00:00
GTK_RESPONSE_NONE ,
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) , screen ) ;
gtk_window_set_resizable ( GTK_WINDOW ( window ) , TRUE ) ;
g_signal_connect ( window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2011-09-28 22:35:35 +00:00
grid = gtk_grid_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( content_area ) , grid , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
2011-09-28 22:35:35 +00:00
gtk_grid_set_row_spacing ( GTK_GRID ( grid ) , 5 ) ;
gtk_grid_set_column_spacing ( GTK_GRID ( grid ) , 5 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( grid ) , 5 ) ;
gtk_widget_set_size_request ( grid , 250 , 250 ) ;
2008-02-27 10:31:24 +00:00
hgroup1 = gtk_size_group_new ( GTK_SIZE_GROUP_HORIZONTAL ) ;
hgroup2 = gtk_size_group_new ( GTK_SIZE_GROUP_HORIZONTAL ) ;
vgroup1 = gtk_size_group_new ( GTK_SIZE_GROUP_VERTICAL ) ;
vgroup2 = gtk_size_group_new ( GTK_SIZE_GROUP_VERTICAL ) ;
main_button = gtk_button_new_with_label ( " X " ) ;
2011-09-28 22:35:35 +00:00
gtk_widget_set_hexpand ( main_button , TRUE ) ;
gtk_widget_set_vexpand ( main_button , TRUE ) ;
gtk_widget_set_halign ( main_button , GTK_ALIGN_CENTER ) ;
gtk_widget_set_valign ( main_button , GTK_ALIGN_CENTER ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , main_button , 0 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_size_group_add_widget ( master_size_group , main_button ) ;
gtk_size_group_add_widget ( hgroup1 , main_button ) ;
gtk_size_group_add_widget ( vgroup1 , main_button ) ;
2010-05-24 20:31:36 +00:00
gtk_widget_set_size_request ( gtk_bin_get_child ( GTK_BIN ( main_button ) ) ,
2008-02-27 10:31:24 +00:00
SIZE_GROUP_INITIAL_SIZE ,
SIZE_GROUP_INITIAL_SIZE ) ;
button = gtk_button_new ( ) ;
2011-09-28 22:35:35 +00:00
gtk_widget_set_hexpand ( button , TRUE ) ;
gtk_widget_set_vexpand ( button , TRUE ) ;
gtk_widget_set_halign ( button , GTK_ALIGN_CENTER ) ;
gtk_widget_set_valign ( button , GTK_ALIGN_CENTER ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , button , 1 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_size_group_add_widget ( vgroup1 , button ) ;
gtk_size_group_add_widget ( vgroup2 , button ) ;
button = gtk_button_new ( ) ;
2011-09-28 22:35:35 +00:00
gtk_widget_set_hexpand ( button , TRUE ) ;
gtk_widget_set_vexpand ( button , TRUE ) ;
gtk_widget_set_halign ( button , GTK_ALIGN_CENTER ) ;
gtk_widget_set_valign ( button , GTK_ALIGN_CENTER ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , button , 0 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_size_group_add_widget ( hgroup1 , button ) ;
gtk_size_group_add_widget ( hgroup2 , button ) ;
button = gtk_button_new ( ) ;
2011-09-28 22:35:35 +00:00
gtk_widget_set_hexpand ( button , TRUE ) ;
gtk_widget_set_vexpand ( button , TRUE ) ;
gtk_widget_set_halign ( button , GTK_ALIGN_CENTER ) ;
gtk_widget_set_valign ( button , GTK_ALIGN_CENTER ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , button , 1 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_size_group_add_widget ( hgroup2 , button ) ;
gtk_size_group_add_widget ( vgroup2 , button ) ;
g_object_unref ( hgroup1 ) ;
g_object_unref ( hgroup2 ) ;
g_object_unref ( vgroup1 ) ;
g_object_unref ( vgroup2 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , hbox , FALSE , FALSE , 0 ) ;
2008-02-27 10:31:24 +00:00
spin_button = gtk_spin_button_new_with_range ( 1 , 100 , 1 ) ;
gtk_spin_button_set_value ( GTK_SPIN_BUTTON ( spin_button ) , SIZE_GROUP_INITIAL_SIZE ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , spin_button , TRUE , TRUE , 0 ) ;
g_signal_connect ( spin_button , " value_changed " ,
G_CALLBACK ( size_group_hsize_changed ) , main_button ) ;
spin_button = gtk_spin_button_new_with_range ( 1 , 100 , 1 ) ;
gtk_spin_button_set_value ( GTK_SPIN_BUTTON ( spin_button ) , SIZE_GROUP_INITIAL_SIZE ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , spin_button , TRUE , TRUE , 0 ) ;
g_signal_connect ( spin_button , " value_changed " ,
G_CALLBACK ( size_group_vsize_changed ) , main_button ) ;
return window ;
}
static void
create_size_groups ( GtkWidget * widget )
{
static GtkWidget * window1 = NULL ;
static GtkWidget * window2 = NULL ;
static GtkSizeGroup * master_size_group ;
if ( ! master_size_group )
master_size_group = gtk_size_group_new ( GTK_SIZE_GROUP_BOTH ) ;
if ( ! window1 )
{
window1 = create_size_group_window ( gtk_widget_get_screen ( widget ) ,
master_size_group ) ;
g_signal_connect ( window1 , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window1 ) ;
}
if ( ! window2 )
{
window2 = create_size_group_window ( gtk_widget_get_screen ( widget ) ,
master_size_group ) ;
g_signal_connect ( window2 , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window2 ) ;
}
2010-03-01 06:47:38 +00:00
if ( gtk_widget_get_visible ( window1 ) & & gtk_widget_get_visible ( window2 ) )
2008-02-27 10:31:24 +00:00
{
gtk_widget_destroy ( window1 ) ;
gtk_widget_destroy ( window2 ) ;
}
else
{
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window1 ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window1 ) ;
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window2 ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window2 ) ;
}
}
/*
* GtkSpinButton
*/
static GtkWidget * spinner1 ;
static void
toggle_snap ( GtkWidget * widget , GtkSpinButton * spin )
{
2010-10-19 16:46:40 +00:00
gtk_spin_button_set_snap_to_ticks ( spin ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static void
toggle_numeric ( GtkWidget * widget , GtkSpinButton * spin )
{
2010-10-19 16:46:40 +00:00
gtk_spin_button_set_numeric ( spin ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ) ;
2008-02-27 10:31:24 +00:00
}
static void
change_digits ( GtkWidget * widget , GtkSpinButton * spin )
{
gtk_spin_button_set_digits ( GTK_SPIN_BUTTON ( spinner1 ) ,
gtk_spin_button_get_value_as_int ( spin ) ) ;
}
static void
get_value ( GtkWidget * widget , gpointer data )
{
gchar buf [ 32 ] ;
GtkLabel * label ;
GtkSpinButton * spin ;
spin = GTK_SPIN_BUTTON ( spinner1 ) ;
label = GTK_LABEL ( g_object_get_data ( G_OBJECT ( widget ) , " user_data " ) ) ;
if ( GPOINTER_TO_INT ( data ) = = 1 )
sprintf ( buf , " %d " , gtk_spin_button_get_value_as_int ( spin ) ) ;
else
2010-07-12 22:48:49 +00:00
sprintf ( buf , " %0.*f " ,
gtk_spin_button_get_digits ( spin ) ,
gtk_spin_button_get_value ( spin ) ) ;
2008-02-27 10:31:24 +00:00
gtk_label_set_text ( label , buf ) ;
}
static void
get_spin_value ( GtkWidget * widget , gpointer data )
{
gchar * buffer ;
GtkLabel * label ;
GtkSpinButton * spin ;
spin = GTK_SPIN_BUTTON ( widget ) ;
label = GTK_LABEL ( data ) ;
2010-07-12 22:48:49 +00:00
buffer = g_strdup_printf ( " %0.*f " ,
gtk_spin_button_get_digits ( spin ) ,
2008-02-27 10:31:24 +00:00
gtk_spin_button_get_value ( spin ) ) ;
gtk_label_set_text ( label , buffer ) ;
g_free ( buffer ) ;
}
static gint
spin_button_time_output_func ( GtkSpinButton * spin_button )
{
2010-07-12 22:48:49 +00:00
GtkAdjustment * adjustment ;
2008-02-27 10:31:24 +00:00
static gchar buf [ 6 ] ;
gdouble hours ;
gdouble minutes ;
2010-07-12 22:48:49 +00:00
adjustment = gtk_spin_button_get_adjustment ( spin_button ) ;
hours = gtk_adjustment_get_value ( adjustment ) / 60.0 ;
2008-02-27 10:31:24 +00:00
minutes = ( fabs ( floor ( hours ) - hours ) < 1e-5 ) ? 0.0 : 30 ;
sprintf ( buf , " %02.0f:%02.0f " , floor ( hours ) , minutes ) ;
if ( strcmp ( buf , gtk_entry_get_text ( GTK_ENTRY ( spin_button ) ) ) )
gtk_entry_set_text ( GTK_ENTRY ( spin_button ) , buf ) ;
return TRUE ;
}
static gint
spin_button_month_input_func ( GtkSpinButton * spin_button ,
gdouble * new_val )
{
gint i ;
static gchar * month [ 12 ] = { " January " , " February " , " March " , " April " ,
" May " , " June " , " July " , " August " ,
" September " , " October " , " November " , " December " } ;
gchar * tmp1 , * tmp2 ;
gboolean found = FALSE ;
for ( i = 1 ; i < = 12 ; i + + )
{
tmp1 = g_ascii_strup ( month [ i - 1 ] , - 1 ) ;
tmp2 = g_ascii_strup ( gtk_entry_get_text ( GTK_ENTRY ( spin_button ) ) , - 1 ) ;
if ( strstr ( tmp1 , tmp2 ) = = tmp1 )
found = TRUE ;
g_free ( tmp1 ) ;
g_free ( tmp2 ) ;
if ( found )
break ;
}
if ( ! found )
{
* new_val = 0.0 ;
return GTK_INPUT_ERROR ;
}
* new_val = ( gdouble ) i ;
return TRUE ;
}
static gint
spin_button_month_output_func ( GtkSpinButton * spin_button )
{
2010-07-12 22:48:49 +00:00
GtkAdjustment * adjustment ;
gdouble value ;
2008-02-27 10:31:24 +00:00
gint i ;
static gchar * month [ 12 ] = { " January " , " February " , " March " , " April " ,
" May " , " June " , " July " , " August " , " September " ,
" October " , " November " , " December " } ;
2010-07-12 22:48:49 +00:00
adjustment = gtk_spin_button_get_adjustment ( spin_button ) ;
value = gtk_adjustment_get_value ( adjustment ) ;
2008-02-27 10:31:24 +00:00
for ( i = 1 ; i < = 12 ; i + + )
2010-07-12 22:48:49 +00:00
if ( fabs ( value - ( double ) i ) < 1e-5 )
2008-02-27 10:31:24 +00:00
{
if ( strcmp ( month [ i - 1 ] , gtk_entry_get_text ( GTK_ENTRY ( spin_button ) ) ) )
gtk_entry_set_text ( GTK_ENTRY ( spin_button ) , month [ i - 1 ] ) ;
}
return TRUE ;
}
static gint
spin_button_hex_input_func ( GtkSpinButton * spin_button ,
gdouble * new_val )
{
const gchar * buf ;
gchar * err ;
gdouble res ;
buf = gtk_entry_get_text ( GTK_ENTRY ( spin_button ) ) ;
res = strtol ( buf , & err , 16 ) ;
* new_val = res ;
if ( * err )
return GTK_INPUT_ERROR ;
else
return TRUE ;
}
static gint
spin_button_hex_output_func ( GtkSpinButton * spin_button )
{
2010-07-12 22:48:49 +00:00
GtkAdjustment * adjustment ;
2008-02-27 10:31:24 +00:00
static gchar buf [ 7 ] ;
gint val ;
2010-07-12 22:48:49 +00:00
adjustment = gtk_spin_button_get_adjustment ( spin_button ) ;
val = ( gint ) gtk_adjustment_get_value ( adjustment ) ;
2008-02-27 10:31:24 +00:00
if ( fabs ( val ) < 1e-5 )
sprintf ( buf , " 0x00 " ) ;
else
sprintf ( buf , " 0x%.2X " , val ) ;
if ( strcmp ( buf , gtk_entry_get_text ( GTK_ENTRY ( spin_button ) ) ) )
gtk_entry_set_text ( GTK_ENTRY ( spin_button ) , buf ) ;
return TRUE ;
}
static void
create_spins ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * frame ;
GtkWidget * hbox ;
GtkWidget * main_vbox ;
GtkWidget * vbox ;
GtkWidget * vbox2 ;
GtkWidget * spinner2 ;
GtkWidget * spinner ;
GtkWidget * button ;
GtkWidget * label ;
GtkWidget * val_label ;
2011-01-05 22:28:55 +00:00
GtkAdjustment * adjustment ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " GtkSpinButton " ) ;
2010-10-31 17:07:20 +00:00
main_vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( main_vbox ) , 10 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , main_vbox ) ;
frame = gtk_frame_new ( " Not accelerated " ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , frame , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , vbox ) ;
/* Time, month, hex spinners */
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , TRUE , TRUE , 5 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox2 , TRUE , TRUE , 5 ) ;
label = gtk_label_new ( " Time : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , label , FALSE , TRUE , 0 ) ;
2010-09-27 13:10:12 +00:00
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 0 , 0 , 1410 , 30 , 60 , 0 ) ;
spinner = gtk_spin_button_new ( adjustment , 0 , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_editable_set_editable ( GTK_EDITABLE ( spinner ) , FALSE ) ;
g_signal_connect ( spinner ,
" output " ,
G_CALLBACK ( spin_button_time_output_func ) ,
NULL ) ;
gtk_spin_button_set_wrap ( GTK_SPIN_BUTTON ( spinner ) , TRUE ) ;
gtk_entry_set_width_chars ( GTK_ENTRY ( spinner ) , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , spinner , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox2 , TRUE , TRUE , 5 ) ;
label = gtk_label_new ( " Month : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , label , FALSE , TRUE , 0 ) ;
2010-09-27 13:10:12 +00:00
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 1.0 , 1.0 , 12.0 , 1.0 ,
2008-02-27 10:31:24 +00:00
5.0 , 0.0 ) ;
2011-01-05 22:28:55 +00:00
spinner = gtk_spin_button_new ( adjustment , 0 , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_spin_button_set_update_policy ( GTK_SPIN_BUTTON ( spinner ) ,
GTK_UPDATE_IF_VALID ) ;
g_signal_connect ( spinner ,
" input " ,
G_CALLBACK ( spin_button_month_input_func ) ,
NULL ) ;
g_signal_connect ( spinner ,
" output " ,
G_CALLBACK ( spin_button_month_output_func ) ,
NULL ) ;
gtk_spin_button_set_wrap ( GTK_SPIN_BUTTON ( spinner ) , TRUE ) ;
gtk_entry_set_width_chars ( GTK_ENTRY ( spinner ) , 9 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , spinner , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox2 , TRUE , TRUE , 5 ) ;
label = gtk_label_new ( " Hex : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , label , FALSE , TRUE , 0 ) ;
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 0 , 0 , 255 , 1 , 16 , 0 ) ;
spinner = gtk_spin_button_new ( adjustment , 0 , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_editable_set_editable ( GTK_EDITABLE ( spinner ) , TRUE ) ;
g_signal_connect ( spinner ,
" input " ,
G_CALLBACK ( spin_button_hex_input_func ) ,
NULL ) ;
g_signal_connect ( spinner ,
" output " ,
G_CALLBACK ( spin_button_hex_output_func ) ,
NULL ) ;
gtk_spin_button_set_wrap ( GTK_SPIN_BUTTON ( spinner ) , TRUE ) ;
gtk_entry_set_width_chars ( GTK_ENTRY ( spinner ) , 4 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , spinner , FALSE , TRUE , 0 ) ;
frame = gtk_frame_new ( " Accelerated " ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , frame , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , vbox ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 5 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox2 , FALSE , FALSE , 5 ) ;
label = gtk_label_new ( " Value : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , label , FALSE , TRUE , 0 ) ;
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 0.0 , - 10000.0 , 10000.0 ,
2008-02-27 10:31:24 +00:00
0.5 , 100.0 , 0.0 ) ;
2011-01-05 22:28:55 +00:00
spinner1 = gtk_spin_button_new ( adjustment , 1.0 , 2 ) ;
2008-02-27 10:31:24 +00:00
gtk_spin_button_set_wrap ( GTK_SPIN_BUTTON ( spinner1 ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , spinner1 , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , vbox2 , FALSE , FALSE , 5 ) ;
label = gtk_label_new ( " Digits : " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , label , FALSE , TRUE , 0 ) ;
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 2 , 1 , 15 , 1 , 1 , 0 ) ;
spinner2 = gtk_spin_button_new ( adjustment , 0.0 , 0 ) ;
g_signal_connect ( adjustment , " value_changed " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( change_digits ) ,
spinner2 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , spinner2 , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , FALSE , 5 ) ;
button = gtk_check_button_new_with_label ( " Snap to 0.5-ticks " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( toggle_snap ) ,
spinner1 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , TRUE , TRUE , 0 ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
button = gtk_check_button_new_with_label ( " Numeric only input mode " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( toggle_numeric ) ,
spinner1 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , TRUE , TRUE , 0 ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
val_label = gtk_label_new ( " " ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 5 ) ;
button = gtk_button_new_with_label ( " Value as Int " ) ;
g_object_set_data ( G_OBJECT ( button ) , " user_data " , val_label ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( get_value ) ,
GINT_TO_POINTER ( 1 ) ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
button = gtk_button_new_with_label ( " Value as Float " ) ;
g_object_set_data ( G_OBJECT ( button ) , " user_data " , val_label ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( get_value ) ,
GINT_TO_POINTER ( 2 ) ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , val_label , TRUE , TRUE , 0 ) ;
gtk_label_set_text ( GTK_LABEL ( val_label ) , " 0 " ) ;
frame = gtk_frame_new ( " Using Convenience Constructor " ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , frame , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , hbox ) ;
val_label = gtk_label_new ( " 0.0 " ) ;
spinner = gtk_spin_button_new_with_range ( 0.0 , 10.0 , 0.009 ) ;
gtk_spin_button_set_value ( GTK_SPIN_BUTTON ( spinner ) , 0.0 ) ;
g_signal_connect ( spinner , " value_changed " ,
G_CALLBACK ( get_spin_value ) , val_label ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , spinner , TRUE , TRUE , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , val_label , TRUE , TRUE , 5 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , hbox , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " Close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Cursors
*/
static gint
2010-09-09 01:12:51 +00:00
cursor_draw ( GtkWidget * widget ,
cairo_t * cr ,
gpointer user_data )
2008-02-27 10:31:24 +00:00
{
2010-09-09 01:12:51 +00:00
int width , height ;
2008-02-27 10:31:24 +00:00
2010-09-09 01:12:51 +00:00
width = gtk_widget_get_allocated_width ( widget ) ;
height = gtk_widget_get_allocated_height ( widget ) ;
2010-07-15 17:05:46 +00:00
2014-10-12 02:54:40 +00:00
cairo_set_fill_rule ( cr , CAIRO_FILL_RULE_EVEN_ODD ) ;
cairo_rectangle ( cr , 0 , 0 , width , height ) ;
cairo_rectangle ( cr , width / 3 , height / 3 , width / 3 , height / 3 ) ;
cairo_clip ( cr ) ;
2010-07-15 17:05:46 +00:00
cairo_set_source_rgb ( cr , 1 , 1 , 1 ) ;
2010-09-09 01:12:51 +00:00
cairo_rectangle ( cr , 0 , 0 , width , height / 2 ) ;
2010-07-15 17:05:46 +00:00
cairo_fill ( cr ) ;
cairo_set_source_rgb ( cr , 0 , 0 , 0 ) ;
2010-09-09 01:12:51 +00:00
cairo_rectangle ( cr , 0 , height / 2 , width , height / 2 ) ;
2010-07-15 17:05:46 +00:00
cairo_fill ( cr ) ;
2008-02-27 10:31:24 +00:00
return TRUE ;
}
2015-04-05 23:00:44 +00:00
static const gchar * cursor_names [ ] = {
2015-05-07 22:29:04 +00:00
" all-scroll " ,
2015-04-05 23:00:44 +00:00
" arrow " ,
" bd_double_arrow " ,
" boat " ,
" bottom_left_corner " ,
" bottom_right_corner " ,
" bottom_side " ,
" bottom_tee " ,
" box_spiral " ,
" center_ptr " ,
" circle " ,
" clock " ,
" coffee_mug " ,
" copy " ,
" cross " ,
" crossed_circle " ,
" cross_reverse " ,
" crosshair " ,
" diamond_cross " ,
" dnd-ask " ,
" dnd-copy " ,
" dnd-link " ,
" dnd-move " ,
" dnd-none " ,
" dot " ,
" dotbox " ,
" double_arrow " ,
" draft_large " ,
" draft_small " ,
" draped_box " ,
" exchange " ,
" fd_double_arrow " ,
" fleur " ,
" gobbler " ,
" gumby " ,
2015-05-07 22:29:04 +00:00
" grab " ,
2015-04-05 23:00:44 +00:00
" grabbing " ,
" hand " ,
" hand1 " ,
" hand2 " ,
" heart " ,
" h_double_arrow " ,
" help " ,
" icon " ,
" iron_cross " ,
" left_ptr " ,
" left_ptr_help " ,
" left_ptr_watch " ,
" left_side " ,
" left_tee " ,
" leftbutton " ,
" link " ,
" ll_angle " ,
" lr_angle " ,
" man " ,
" middlebutton " ,
" mouse " ,
" move " ,
" pencil " ,
" pirate " ,
" plus " ,
" question_arrow " ,
" right_ptr " ,
" right_side " ,
" right_tee " ,
" rightbutton " ,
" rtl_logo " ,
" sailboat " ,
" sb_down_arrow " ,
" sb_h_double_arrow " ,
" sb_left_arrow " ,
" sb_right_arrow " ,
" sb_up_arrow " ,
" sb_v_double_arrow " ,
" shuttle " ,
" sizing " ,
" spider " ,
" spraycan " ,
" star " ,
" target " ,
" tcross " ,
" top_left_arrow " ,
" top_left_corner " ,
" top_right_corner " ,
" top_side " ,
" top_tee " ,
" trek " ,
" ul_angle " ,
" umbrella " ,
" ur_angle " ,
" v_double_arrow " ,
2015-05-07 22:29:04 +00:00
" vertical-text " ,
2015-04-05 23:00:44 +00:00
" watch " ,
" X_cursor " ,
2015-05-07 22:29:04 +00:00
" xterm " ,
" zoom-in " ,
" zoom-out "
2015-04-05 23:00:44 +00:00
} ;
2008-02-27 10:31:24 +00:00
2015-04-05 23:00:44 +00:00
static GtkTreeModel *
cursor_model ( void )
{
GtkListStore * store ;
gint i ;
store = gtk_list_store_new ( 1 , G_TYPE_STRING ) ;
2008-02-27 10:31:24 +00:00
2015-04-05 23:00:44 +00:00
for ( i = 0 ; i < G_N_ELEMENTS ( cursor_names ) ; i + + )
gtk_list_store_insert_with_values ( store , NULL , - 1 , 0 , cursor_names [ i ] , - 1 ) ;
2008-06-18 07:00:46 +00:00
2015-04-05 23:00:44 +00:00
return ( GtkTreeModel * ) store ;
2008-02-27 10:31:24 +00:00
}
static gint
2015-04-05 23:00:44 +00:00
cursor_event ( GtkWidget * widget ,
GdkEvent * event ,
GtkWidget * entry )
2008-02-27 10:31:24 +00:00
{
2015-04-05 23:00:44 +00:00
const gchar * name ;
gint i ;
const gint n = G_N_ELEMENTS ( cursor_names ) ;
name = ( const gchar * ) g_object_get_data ( G_OBJECT ( widget ) , " name " ) ;
if ( name ! = NULL )
{
for ( i = 0 ; i < n ; i + + )
if ( strcmp ( name , cursor_names [ i ] ) = = 0 )
break ;
}
else
i = 0 ;
2008-02-27 10:31:24 +00:00
if ( ( event - > type = = GDK_BUTTON_PRESS ) & &
2012-01-25 18:12:18 +00:00
( ( event - > button . button = = GDK_BUTTON_PRIMARY ) | |
( event - > button . button = = GDK_BUTTON_SECONDARY ) ) )
2008-02-27 10:31:24 +00:00
{
2015-04-05 23:00:44 +00:00
if ( event - > button . button = = GDK_BUTTON_PRIMARY )
i = ( i + 1 ) % n ;
else
i = ( i + n - 1 ) % n ;
gtk_entry_set_text ( GTK_ENTRY ( entry ) , cursor_names [ i ] ) ;
2008-02-27 10:31:24 +00:00
return TRUE ;
}
return FALSE ;
}
2015-04-05 23:00:44 +00:00
static void
set_cursor_from_name ( GtkWidget * entry ,
GtkWidget * widget )
{
const gchar * name ;
GdkCursor * cursor ;
name = gtk_entry_get_text ( GTK_ENTRY ( entry ) ) ;
cursor = gdk_cursor_new_from_name ( gtk_widget_get_display ( widget ) , name ) ;
if ( cursor = = NULL )
{
name = NULL ;
cursor = gdk_cursor_new_for_display ( gtk_widget_get_display ( widget ) , GDK_BLANK_CURSOR ) ;
}
gdk_window_set_cursor ( gtk_widget_get_window ( widget ) , cursor ) ;
g_object_unref ( cursor ) ;
g_object_set_data_full ( G_OBJECT ( widget ) , " name " , g_strdup ( name ) , g_free ) ;
}
2008-02-27 10:31:24 +00:00
# ifdef GDK_WINDOWING_X11
# include "x11/gdkx.h"
2014-09-02 13:53:15 +00:00
# endif
# ifdef GDK_WINDOWING_WAYLAND
# include "wayland/gdkwayland.h"
# endif
2008-02-27 10:31:24 +00:00
static void
change_cursor_theme ( GtkWidget * widget ,
gpointer data )
{
const gchar * theme ;
gint size ;
GList * children ;
2014-09-02 13:53:15 +00:00
GdkDisplay * display ;
2008-02-27 10:31:24 +00:00
children = gtk_container_get_children ( GTK_CONTAINER ( data ) ) ;
theme = gtk_entry_get_text ( GTK_ENTRY ( children - > next - > data ) ) ;
size = ( gint ) gtk_spin_button_get_value ( GTK_SPIN_BUTTON ( children - > next - > next - > data ) ) ;
g_list_free ( children ) ;
2014-09-02 13:53:15 +00:00
display = gtk_widget_get_display ( widget ) ;
# ifdef GDK_WINDOWING_X11
if ( GDK_IS_X11_DISPLAY ( display ) )
gdk_x11_display_set_cursor_theme ( display , theme , size ) ;
2008-02-27 10:31:24 +00:00
# endif
2014-09-02 13:53:15 +00:00
# ifdef GDK_WINDOWING_WAYLAND
if ( GDK_IS_WAYLAND_DISPLAY ( display ) )
gdk_wayland_display_set_cursor_theme ( display , theme , size ) ;
# endif
}
2008-02-27 10:31:24 +00:00
static void
create_cursors ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * frame ;
GtkWidget * hbox ;
GtkWidget * main_vbox ;
GtkWidget * vbox ;
GtkWidget * darea ;
GtkWidget * button ;
GtkWidget * label ;
GtkWidget * any ;
GtkWidget * entry ;
2015-04-05 23:00:44 +00:00
GtkWidget * size ;
GtkEntryCompletion * completion ;
GtkTreeModel * model ;
2014-09-02 18:24:34 +00:00
gboolean cursor_demo = FALSE ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
2015-04-05 23:00:44 +00:00
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
2008-02-27 10:31:24 +00:00
gtk_widget_get_screen ( widget ) ) ;
2015-04-05 23:00:44 +00:00
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2015-04-05 23:00:44 +00:00
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " Cursors " ) ;
2015-04-05 23:00:44 +00:00
2010-10-31 17:07:20 +00:00
main_vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( main_vbox ) , 0 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , main_vbox ) ;
vbox =
2011-04-22 13:38:40 +00:00
g_object_new ( GTK_TYPE_BOX ,
2011-05-02 17:19:09 +00:00
" orientation " , GTK_ORIENTATION_VERTICAL ,
2008-02-27 10:31:24 +00:00
" GtkBox::homogeneous " , FALSE ,
" GtkBox::spacing " , 5 ,
" GtkContainer::border_width " , 10 ,
" GtkWidget::parent " , main_vbox ,
" GtkWidget::visible " , TRUE ,
NULL ) ;
2014-09-25 08:11:38 +00:00
# ifdef GDK_WINDOWING_X11
2014-09-02 18:24:34 +00:00
if ( GDK_IS_X11_DISPLAY ( gtk_widget_get_display ( vbox ) ) )
cursor_demo = TRUE ;
# endif
# ifdef GDK_WINDOWING_WAYLAND
if ( GDK_IS_WAYLAND_DISPLAY ( gtk_widget_get_display ( vbox ) ) )
cursor_demo = TRUE ;
# endif
if ( cursor_demo )
2013-03-13 10:01:57 +00:00
{
2015-04-07 22:39:10 +00:00
guint w , h ;
2015-04-05 23:00:44 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 6 ) ;
2013-03-13 10:01:57 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 0 ) ;
2015-04-05 23:00:44 +00:00
label = gtk_label_new ( " Cursor Theme: " ) ;
2013-03-13 10:01:57 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , TRUE , 0 ) ;
entry = gtk_entry_new ( ) ;
gtk_entry_set_text ( GTK_ENTRY ( entry ) , " default " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , entry , FALSE , TRUE , 0 ) ;
2015-04-07 22:39:10 +00:00
gdk_display_get_maximal_cursor_size ( gtk_widget_get_display ( vbox ) , & w , & h ) ;
size = gtk_spin_button_new_with_range ( 1.0 , MIN ( w , h ) , 1.0 ) ;
2013-03-13 10:01:57 +00:00
gtk_spin_button_set_value ( GTK_SPIN_BUTTON ( size ) , 24.0 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , size , TRUE , TRUE , 0 ) ;
2015-04-05 23:00:44 +00:00
g_signal_connect ( entry , " changed " ,
2013-03-13 10:01:57 +00:00
G_CALLBACK ( change_cursor_theme ) , hbox ) ;
2015-04-05 17:28:26 +00:00
g_signal_connect ( size , " value-changed " ,
2013-03-13 10:01:57 +00:00
G_CALLBACK ( change_cursor_theme ) , hbox ) ;
}
2008-02-27 10:31:24 +00:00
2015-04-05 23:00:44 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 6 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 5 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 0 ) ;
2015-04-05 23:00:44 +00:00
label = gtk_label_new ( " Cursor Name: " ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , TRUE , 0 ) ;
2010-09-27 13:10:12 +00:00
2015-04-05 23:00:44 +00:00
entry = gtk_entry_new ( ) ;
completion = gtk_entry_completion_new ( ) ;
model = cursor_model ( ) ;
gtk_entry_completion_set_model ( completion , model ) ;
gtk_entry_completion_set_text_column ( completion , 0 ) ;
gtk_entry_set_completion ( GTK_ENTRY ( entry ) , completion ) ;
g_object_unref ( model ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , entry , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
frame =
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
g_object_new ( gtk_frame_get_type ( ) ,
2008-02-27 10:31:24 +00:00
" GtkFrame::label_xalign " , 0.5 ,
" GtkFrame::label " , " Cursor Area " ,
" GtkContainer::border_width " , 10 ,
" GtkWidget::parent " , vbox ,
" GtkWidget::visible " , TRUE ,
NULL ) ;
darea = gtk_drawing_area_new ( ) ;
gtk_widget_set_size_request ( darea , 80 , 80 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , darea ) ;
g_signal_connect ( darea ,
2010-09-09 01:12:51 +00:00
" draw " ,
G_CALLBACK ( cursor_draw ) ,
2008-02-27 10:31:24 +00:00
NULL ) ;
gtk_widget_set_events ( darea , GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK ) ;
2015-04-05 23:00:44 +00:00
g_signal_connect ( darea , " button_press_event " ,
G_CALLBACK ( cursor_event ) , entry ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( darea ) ;
2015-04-05 23:00:44 +00:00
g_signal_connect ( entry , " changed " ,
G_CALLBACK ( set_cursor_from_name ) , darea ) ;
2008-02-27 10:31:24 +00:00
2011-06-09 04:20:42 +00:00
any = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , any , FALSE , TRUE , 0 ) ;
2015-04-05 23:00:44 +00:00
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( main_vbox ) , hbox , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " Close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
gtk_widget_show_all ( window ) ;
2015-04-05 23:10:39 +00:00
gtk_entry_set_text ( GTK_ENTRY ( entry ) , " arrow " ) ;
2008-02-27 10:31:24 +00:00
}
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkColorSelection
*/
void
create_color_selection ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
GtkWidget * picker ;
GtkWidget * hbox ;
GtkWidget * label ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " GtkColorButton " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 8 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 8 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , hbox ) ;
label = gtk_label_new ( " Pick a color " ) ;
gtk_container_add ( GTK_CONTAINER ( hbox ) , label ) ;
picker = gtk_color_button_new ( ) ;
2012-02-09 21:23:30 +00:00
gtk_color_chooser_set_use_alpha ( GTK_COLOR_CHOOSER ( picker ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( hbox ) , picker ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
void
flipping_toggled_cb ( GtkWidget * widget , gpointer data )
{
int state = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ;
int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR ;
gtk_widget_set_default_direction ( new_direction ) ;
}
2009-02-19 15:12:35 +00:00
static void
orientable_toggle_orientation ( GtkOrientable * orientable )
{
GtkOrientation orientation ;
orientation = gtk_orientable_get_orientation ( orientable ) ;
gtk_orientable_set_orientation ( orientable ,
orientation = = GTK_ORIENTATION_HORIZONTAL ?
GTK_ORIENTATION_VERTICAL :
GTK_ORIENTATION_HORIZONTAL ) ;
if ( GTK_IS_CONTAINER ( orientable ) )
{
GList * children ;
GList * child ;
children = gtk_container_get_children ( GTK_CONTAINER ( orientable ) ) ;
for ( child = children ; child ; child = child - > next )
{
if ( GTK_IS_ORIENTABLE ( child - > data ) )
orientable_toggle_orientation ( child - > data ) ;
}
g_list_free ( children ) ;
}
}
void
flipping_orientation_toggled_cb ( GtkWidget * widget , gpointer data )
{
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
GtkWidget * toplevel ;
toplevel = gtk_widget_get_toplevel ( widget ) ;
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( toplevel ) ) ;
orientable_toggle_orientation ( GTK_ORIENTABLE ( content_area ) ) ;
2009-02-19 15:12:35 +00:00
}
2008-02-27 10:31:24 +00:00
static void
set_direction_recurse ( GtkWidget * widget ,
gpointer data )
{
GtkTextDirection * dir = data ;
gtk_widget_set_direction ( widget , * dir ) ;
if ( GTK_IS_CONTAINER ( widget ) )
gtk_container_foreach ( GTK_CONTAINER ( widget ) ,
set_direction_recurse ,
data ) ;
}
static GtkWidget *
create_forward_back ( const char * title ,
GtkTextDirection text_dir )
{
GtkWidget * frame = gtk_frame_new ( title ) ;
2010-10-29 23:21:15 +00:00
GtkWidget * bbox = gtk_button_box_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2013-06-24 21:31:22 +00:00
GtkWidget * back_button = gtk_button_new_with_label ( " Back " ) ;
GtkWidget * forward_button = gtk_button_new_with_label ( " Forward " ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( bbox ) , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , bbox ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , back_button ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , forward_button ) ;
set_direction_recurse ( frame , & text_dir ) ;
return frame ;
}
void
create_flipping ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2014-04-10 12:28:44 +00:00
GtkWidget * check_button ;
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " Bidirectional Flipping " ) ;
check_button = gtk_check_button_new_with_label ( " Right-to-left global direction " ) ;
2009-02-19 15:12:35 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( check_button ) , 10 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , check_button , TRUE , TRUE , 0 ) ;
2009-02-19 15:12:35 +00:00
if ( gtk_widget_get_default_direction ( ) = = GTK_TEXT_DIR_RTL )
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check_button ) , TRUE ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( flipping_toggled_cb ) , NULL ) ;
check_button = gtk_check_button_new_with_label ( " Toggle orientation of all boxes " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( check_button ) , 10 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , check_button , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
2009-02-19 15:12:35 +00:00
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( flipping_orientation_toggled_cb ) , NULL ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) ,
2008-02-27 10:31:24 +00:00
create_forward_back ( " Default " , GTK_TEXT_DIR_NONE ) ,
TRUE , TRUE , 0 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) ,
2008-02-27 10:31:24 +00:00
create_forward_back ( " Left-to-Right " , GTK_TEXT_DIR_LTR ) ,
TRUE , TRUE , 0 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) ,
2008-02-27 10:31:24 +00:00
create_forward_back ( " Right-to-Left " , GTK_TEXT_DIR_RTL ) ,
TRUE , TRUE , 0 ) ;
2014-04-10 12:28:44 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) , " Close " , GTK_RESPONSE_CLOSE ) ;
g_signal_connect ( window , " response " , G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Focus test
*/
static GtkWidget *
make_focus_table ( GList * * list )
{
2011-09-28 03:03:20 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
gint i , j ;
2011-09-28 03:03:20 +00:00
grid = gtk_grid_new ( ) ;
gtk_grid_set_row_spacing ( GTK_GRID ( grid ) , 10 ) ;
gtk_grid_set_column_spacing ( GTK_GRID ( grid ) , 10 ) ;
2008-02-27 10:31:24 +00:00
2011-09-28 02:42:54 +00:00
for ( i = 0 ; i < 5 ; i + + )
2008-02-27 10:31:24 +00:00
{
2011-09-28 02:42:54 +00:00
for ( j = 0 ; j < 5 ; j + + )
2008-02-27 10:31:24 +00:00
{
GtkWidget * widget ;
if ( ( i + j ) % 2 )
widget = gtk_entry_new ( ) ;
else
widget = gtk_button_new_with_label ( " Foo " ) ;
* list = g_list_prepend ( * list , widget ) ;
2011-09-28 03:03:20 +00:00
gtk_widget_set_hexpand ( widget , TRUE ) ;
gtk_widget_set_vexpand ( widget , TRUE ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , widget , i , j , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
}
}
* list = g_list_reverse ( * list ) ;
2011-09-28 03:03:20 +00:00
return grid ;
2008-02-27 10:31:24 +00:00
}
static void
create_focus ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
2010-06-03 07:36:39 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * table ;
GtkWidget * frame ;
GList * list = NULL ;
window = gtk_dialog_new_with_buttons ( " Keyboard focus navigation " ,
NULL , 0 ,
2013-06-24 21:31:22 +00:00
" _Close " ,
2008-02-27 10:31:24 +00:00
GTK_RESPONSE_NONE ,
NULL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
g_signal_connect ( window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " Keyboard Focus Navigation " ) ;
frame = gtk_frame_new ( " Weird tab focus chain " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , frame , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
table = make_focus_table ( & list ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , table ) ;
gtk_container_set_focus_chain ( GTK_CONTAINER ( table ) ,
list ) ;
g_list_free ( list ) ;
frame = gtk_frame_new ( " Default tab focus chain " ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , frame , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
list = NULL ;
table = make_focus_table ( & list ) ;
g_list_free ( list ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , table ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkFontSelection
*/
void
create_font_selection ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
if ( ! window )
{
GtkWidget * picker ;
GtkWidget * hbox ;
GtkWidget * label ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " GtkFontButton " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 8 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( hbox ) , 8 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , hbox ) ;
label = gtk_label_new ( " Pick a font " ) ;
gtk_container_add ( GTK_CONTAINER ( hbox ) , label ) ;
picker = gtk_font_button_new ( ) ;
gtk_font_button_set_use_font ( GTK_FONT_BUTTON ( picker ) , TRUE ) ;
gtk_container_add ( GTK_CONTAINER ( hbox ) , picker ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkDialog
*/
static GtkWidget * dialog_window = NULL ;
static void
2014-04-10 14:35:51 +00:00
dialog_response_cb ( GtkWidget * widget , gint response , gpointer unused )
2008-02-27 10:31:24 +00:00
{
2014-04-10 14:16:41 +00:00
GtkWidget * content_area ;
GList * l , * children ;
2014-04-10 14:35:51 +00:00
if ( response = = GTK_RESPONSE_APPLY )
2014-04-10 14:16:41 +00:00
{
2014-04-10 14:35:51 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( dialog_window ) ) ;
children = gtk_container_get_children ( GTK_CONTAINER ( content_area ) ) ;
for ( l = children ; l ; l = l - > next )
2014-04-10 14:16:41 +00:00
{
2014-04-10 14:35:51 +00:00
if ( GTK_IS_LABEL ( l - > data ) )
{
gtk_container_remove ( GTK_CONTAINER ( content_area ) , l - > data ) ;
break ;
}
2014-04-10 14:16:41 +00:00
}
2014-04-10 14:07:05 +00:00
2014-04-10 14:35:51 +00:00
/* no label removed, so add one */
if ( l = = NULL )
{
GtkWidget * label ;
label = gtk_label_new ( " Dialog Test " ) ;
g_object_set ( label , " margin " , 10 , NULL ) ;
gtk_box_pack_start ( GTK_BOX ( content_area ) ,
label , TRUE , TRUE , 0 ) ;
gtk_widget_show ( label ) ;
}
2014-04-10 14:16:41 +00:00
2014-04-10 14:35:51 +00:00
g_list_free ( children ) ;
2008-02-27 10:31:24 +00:00
}
}
static void
create_dialog ( GtkWidget * widget )
{
if ( ! dialog_window )
{
/* This is a terrible example; it's much simpler to create
* dialogs than this . Don ' t use testgtk for example code ,
* use gtk - demo ; - )
*/
dialog_window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( dialog_window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( dialog_window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& dialog_window ) ;
2010-06-03 07:36:39 +00:00
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( dialog_window ) , " GtkDialog " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( dialog_window ) , 0 ) ;
2014-04-10 14:35:51 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( dialog_window ) ,
" OK " ,
GTK_RESPONSE_OK ) ;
2008-02-27 10:31:24 +00:00
2014-04-10 14:35:51 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( dialog_window ) ,
" Toggle " ,
GTK_RESPONSE_APPLY ) ;
g_signal_connect ( dialog_window , " response " ,
G_CALLBACK ( dialog_response_cb ) ,
2014-04-10 14:07:05 +00:00
NULL ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( dialog_window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( dialog_window ) ;
else
gtk_widget_destroy ( dialog_window ) ;
}
/* Display & Screen test
*/
2010-04-06 14:57:19 +00:00
typedef struct
{
GtkWidget * combo ;
GtkWidget * entry ;
GtkWidget * toplevel ;
2008-02-27 10:31:24 +00:00
GtkWidget * dialog_window ;
} ScreenDisplaySelection ;
static void
screen_display_check ( GtkWidget * widget , ScreenDisplaySelection * data )
{
2010-04-06 14:57:19 +00:00
const gchar * display_name ;
2015-07-17 23:54:09 +00:00
GdkDisplay * display ;
2008-02-27 10:31:24 +00:00
GtkWidget * dialog ;
GdkScreen * new_screen = NULL ;
GdkScreen * current_screen = gtk_widget_get_screen ( widget ) ;
2013-04-04 14:36:09 +00:00
display_name = gtk_entry_get_text ( GTK_ENTRY ( data - > entry ) ) ;
display = gdk_display_open ( display_name ) ;
2008-02-27 10:31:24 +00:00
2013-04-04 14:36:09 +00:00
if ( ! display )
2008-02-27 10:31:24 +00:00
{
2013-04-04 14:36:09 +00:00
dialog = gtk_message_dialog_new ( GTK_WINDOW ( gtk_widget_get_toplevel ( widget ) ) ,
GTK_DIALOG_DESTROY_WITH_PARENT ,
GTK_MESSAGE_ERROR ,
GTK_BUTTONS_OK ,
" The display : \n %s \n cannot be opened " ,
display_name ) ;
gtk_window_set_screen ( GTK_WINDOW ( dialog ) , current_screen ) ;
gtk_widget_show ( dialog ) ;
g_signal_connect ( dialog , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2008-02-27 10:31:24 +00:00
}
2013-04-04 14:36:09 +00:00
else
2008-02-27 10:31:24 +00:00
{
2013-04-04 14:36:09 +00:00
GtkTreeModel * model = gtk_combo_box_get_model ( GTK_COMBO_BOX ( data - > combo ) ) ;
gint i = 0 ;
GtkTreeIter iter ;
gboolean found = FALSE ;
while ( gtk_tree_model_iter_nth_child ( model , & iter , NULL , i + + ) )
{
gchar * name ;
gtk_tree_model_get ( model , & iter , 0 , & name , - 1 ) ;
found = ! g_ascii_strcasecmp ( display_name , name ) ;
g_free ( name ) ;
if ( found )
break ;
}
if ( ! found )
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( data - > combo ) , display_name ) ;
new_screen = gdk_display_get_default_screen ( display ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_screen ( GTK_WINDOW ( data - > toplevel ) , new_screen ) ;
gtk_widget_destroy ( data - > dialog_window ) ;
}
}
void
screen_display_destroy_diag ( GtkWidget * widget , GtkWidget * data )
{
gtk_widget_destroy ( data ) ;
}
void
create_display_screen ( GtkWidget * widget )
{
2011-09-28 03:13:00 +00:00
GtkWidget * grid , * frame , * window , * combo_dpy , * vbox ;
2013-04-04 14:36:09 +00:00
GtkWidget * label_dpy , * applyb , * cancelb ;
2008-02-27 10:31:24 +00:00
GtkWidget * bbox ;
ScreenDisplaySelection * scr_dpy_data ;
GdkScreen * screen = gtk_widget_get_screen ( widget ) ;
Use g_object_new instead of gtk_widget_new
2008-06-19 Johan Dahlin <jdahlin@async.com.br>
* demos/testpixbuf.c (new_testrgb_window):
* gtk/gtkctree.c (gtk_ctree_new_with_titles):
* gtk/gtkitemfactory.c (gtk_item_factory_construct),
(gtk_item_factory_create_item):
* gtk/gtkmenu.c (gtk_menu_set_tearoff_state):
* gtk/gtkprogressbar.c (gtk_progress_bar_new),
(gtk_progress_bar_new_with_adjustment):
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_new):
* gtk/gtktext.c (gtk_text_new):
* gtk/gtkviewport.c (gtk_viewport_new):
* tests/simple.c (main):
* tests/testgtk.c (create_statusbar), (create_get_image),
(create_saved_position), (create_tooltips), (create_cursors),
(create_display_screen), (create_progress_bar), (create_idle_test):
* tests/testmultidisplay.c (make_selection_dialog), (main):
* tests/testmultiscreen.c (main):
* tests/testrgb.c (new_testrgb_window):
Use g_object_new instead of gtk_widget_new
svn path=/trunk/; revision=20462
2008-06-19 12:25:19 +00:00
window = g_object_new ( gtk_window_get_type ( ) ,
2011-09-28 03:08:19 +00:00
" screen " , screen ,
" type " , GTK_WINDOW_TOPLEVEL ,
" title " , " Screen or Display selection " ,
" border_width " ,
10 , NULL ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 3 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
2013-04-04 14:36:09 +00:00
frame = gtk_frame_new ( " Select display " ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( vbox ) , frame ) ;
2011-09-28 03:13:00 +00:00
grid = gtk_grid_new ( ) ;
gtk_grid_set_row_spacing ( GTK_GRID ( grid ) , 3 ) ;
gtk_grid_set_column_spacing ( GTK_GRID ( grid ) , 3 ) ;
2008-02-27 10:31:24 +00:00
2011-09-28 03:13:00 +00:00
gtk_container_add ( GTK_CONTAINER ( frame ) , grid ) ;
2008-02-27 10:31:24 +00:00
2013-04-04 14:36:09 +00:00
label_dpy = gtk_label_new ( " move to another X display " ) ;
2010-10-18 07:10:27 +00:00
combo_dpy = gtk_combo_box_text_new_with_entry ( ) ;
2011-09-28 03:13:00 +00:00
gtk_widget_set_hexpand ( combo_dpy , TRUE ) ;
2010-10-02 16:19:46 +00:00
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo_dpy ) , " diabolo:0.0 " ) ;
2010-04-06 14:57:19 +00:00
gtk_entry_set_text ( GTK_ENTRY ( gtk_bin_get_child ( GTK_BIN ( combo_dpy ) ) ) ,
" <hostname>:<X Server Num>.<Screen Num> " ) ;
2008-02-27 10:31:24 +00:00
2013-04-04 14:36:09 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , label_dpy , 0 , 0 , 1 , 1 ) ;
gtk_grid_attach ( GTK_GRID ( grid ) , combo_dpy , 0 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2010-10-29 23:21:15 +00:00
bbox = gtk_button_box_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2013-06-24 21:31:22 +00:00
applyb = gtk_button_new_with_label ( " _Apply " ) ;
cancelb = gtk_button_new_with_label ( " _Cancel " ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( vbox ) , bbox ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , applyb ) ;
gtk_container_add ( GTK_CONTAINER ( bbox ) , cancelb ) ;
scr_dpy_data = g_new0 ( ScreenDisplaySelection , 1 ) ;
2010-04-06 14:57:19 +00:00
scr_dpy_data - > entry = gtk_bin_get_child ( GTK_BIN ( combo_dpy ) ) ;
2008-02-27 10:31:24 +00:00
scr_dpy_data - > toplevel = gtk_widget_get_toplevel ( widget ) ;
scr_dpy_data - > dialog_window = window ;
g_signal_connect ( cancelb , " clicked " ,
G_CALLBACK ( screen_display_destroy_diag ) , window ) ;
g_signal_connect ( applyb , " clicked " ,
G_CALLBACK ( screen_display_check ) , scr_dpy_data ) ;
gtk_widget_show_all ( window ) ;
}
/* Event Watcher
*/
2010-10-08 00:37:23 +00:00
static gulong event_watcher_enter_id = 0 ;
static gulong event_watcher_leave_id = 0 ;
2008-02-27 10:31:24 +00:00
static gboolean
event_watcher ( GSignalInvocationHint * ihint ,
guint n_param_values ,
const GValue * param_values ,
gpointer data )
{
g_print ( " Watch: \" %s \" emitted for %s \n " ,
g_signal_name ( ihint - > signal_id ) ,
G_OBJECT_TYPE_NAME ( g_value_get_object ( param_values + 0 ) ) ) ;
return TRUE ;
}
static void
event_watcher_down ( void )
{
if ( event_watcher_enter_id )
{
guint signal_id ;
signal_id = g_signal_lookup ( " enter_notify_event " , GTK_TYPE_WIDGET ) ;
g_signal_remove_emission_hook ( signal_id , event_watcher_enter_id ) ;
event_watcher_enter_id = 0 ;
signal_id = g_signal_lookup ( " leave_notify_event " , GTK_TYPE_WIDGET ) ;
g_signal_remove_emission_hook ( signal_id , event_watcher_leave_id ) ;
event_watcher_leave_id = 0 ;
}
}
static void
event_watcher_toggle ( void )
{
if ( event_watcher_enter_id )
event_watcher_down ( ) ;
else
{
guint signal_id ;
signal_id = g_signal_lookup ( " enter_notify_event " , GTK_TYPE_WIDGET ) ;
event_watcher_enter_id = g_signal_add_emission_hook ( signal_id , 0 , event_watcher , NULL , NULL ) ;
signal_id = g_signal_lookup ( " leave_notify_event " , GTK_TYPE_WIDGET ) ;
event_watcher_leave_id = g_signal_add_emission_hook ( signal_id , 0 , event_watcher , NULL , NULL ) ;
}
}
static void
create_event_watcher ( GtkWidget * widget )
{
2014-04-10 14:45:37 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * button ;
if ( ! dialog_window )
{
dialog_window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( dialog_window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( dialog_window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& dialog_window ) ;
g_signal_connect ( dialog_window , " destroy " ,
G_CALLBACK ( event_watcher_down ) ,
NULL ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( dialog_window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( dialog_window ) , " Event Watcher " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( dialog_window ) , 0 ) ;
gtk_widget_set_size_request ( dialog_window , 200 , 110 ) ;
button = gtk_toggle_button_new_with_label ( " Activate Watch " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( event_watcher_toggle ) ,
NULL ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( button ) , 10 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , button , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( button ) ;
2014-04-10 14:45:37 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( dialog_window ) , " Close " , GTK_RESPONSE_CLOSE ) ;
g_signal_connect ( dialog_window , " response " , G_CALLBACK ( gtk_widget_destroy ) , NULL ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( dialog_window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( dialog_window ) ;
else
gtk_widget_destroy ( dialog_window ) ;
}
/*
* GtkRange
*/
static gchar *
reformat_value ( GtkScale * scale ,
gdouble value )
{
return g_strdup_printf ( " -->%0.*g<-- " ,
gtk_scale_get_digits ( scale ) , value ) ;
}
static void
create_range_controls ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * scrollbar ;
GtkWidget * scale ;
GtkWidget * separator ;
2010-09-27 12:48:26 +00:00
GtkAdjustment * adjustment ;
2008-02-27 10:31:24 +00:00
GtkWidget * hbox ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " range controls " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
gtk_widget_show ( box1 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , TRUE , TRUE , 0 ) ;
gtk_widget_show ( box2 ) ;
adjustment = gtk_adjustment_new ( 0.0 , 0.0 , 101.0 , 0.1 , 1.0 , 1.0 ) ;
2010-10-30 00:07:28 +00:00
scale = gtk_scale_new ( GTK_ORIENTATION_HORIZONTAL , GTK_ADJUSTMENT ( adjustment ) ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_set_size_request ( GTK_WIDGET ( scale ) , 150 , - 1 ) ;
gtk_scale_set_digits ( GTK_SCALE ( scale ) , 1 ) ;
gtk_scale_set_draw_value ( GTK_SCALE ( scale ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , scale , TRUE , TRUE , 0 ) ;
gtk_widget_show ( scale ) ;
2010-10-30 00:11:05 +00:00
scrollbar = gtk_scrollbar_new ( GTK_ORIENTATION_HORIZONTAL , GTK_ADJUSTMENT ( adjustment ) ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box2 ) , scrollbar , TRUE , TRUE , 0 ) ;
gtk_widget_show ( scrollbar ) ;
2010-10-30 00:07:28 +00:00
scale = gtk_scale_new ( GTK_ORIENTATION_HORIZONTAL , GTK_ADJUSTMENT ( adjustment ) ) ;
2008-02-27 10:31:24 +00:00
gtk_scale_set_draw_value ( GTK_SCALE ( scale ) , TRUE ) ;
g_signal_connect ( scale ,
" format_value " ,
G_CALLBACK ( reformat_value ) ,
NULL ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , scale , TRUE , TRUE , 0 ) ;
gtk_widget_show ( scale ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
2010-10-30 00:07:28 +00:00
scale = gtk_scale_new ( GTK_ORIENTATION_VERTICAL , GTK_ADJUSTMENT ( adjustment ) ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_set_size_request ( scale , - 1 , 200 ) ;
gtk_scale_set_digits ( GTK_SCALE ( scale ) , 2 ) ;
gtk_scale_set_draw_value ( GTK_SCALE ( scale ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , scale , TRUE , TRUE , 0 ) ;
gtk_widget_show ( scale ) ;
2010-10-30 00:07:28 +00:00
scale = gtk_scale_new ( GTK_ORIENTATION_VERTICAL , GTK_ADJUSTMENT ( adjustment ) ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_set_size_request ( scale , - 1 , 200 ) ;
gtk_scale_set_digits ( GTK_SCALE ( scale ) , 2 ) ;
gtk_scale_set_draw_value ( GTK_SCALE ( scale ) , TRUE ) ;
gtk_range_set_inverted ( GTK_RANGE ( scale ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , scale , TRUE , TRUE , 0 ) ;
gtk_widget_show ( scale ) ;
2010-10-30 00:07:28 +00:00
scale = gtk_scale_new ( GTK_ORIENTATION_VERTICAL , GTK_ADJUSTMENT ( adjustment ) ) ;
2008-02-27 10:31:24 +00:00
gtk_scale_set_draw_value ( GTK_SCALE ( scale ) , TRUE ) ;
g_signal_connect ( scale ,
" format_value " ,
G_CALLBACK ( reformat_value ) ,
NULL ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , scale , TRUE , TRUE , 0 ) ;
gtk_widget_show ( scale ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , hbox , TRUE , TRUE , 0 ) ;
gtk_widget_show ( hbox ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
gtk_widget_show ( separator ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
gtk_widget_show ( box2 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
gtk_widget_show ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
struct {
GdkColor color ;
gchar * name ;
} text_colors [ ] = {
{ { 0 , 0x0000 , 0x0000 , 0x0000 } , " black " } ,
{ { 0 , 0xFFFF , 0xFFFF , 0xFFFF } , " white " } ,
{ { 0 , 0xFFFF , 0x0000 , 0x0000 } , " red " } ,
{ { 0 , 0x0000 , 0xFFFF , 0x0000 } , " green " } ,
{ { 0 , 0x0000 , 0x0000 , 0xFFFF } , " blue " } ,
{ { 0 , 0x0000 , 0xFFFF , 0xFFFF } , " cyan " } ,
{ { 0 , 0xFFFF , 0x0000 , 0xFFFF } , " magenta " } ,
{ { 0 , 0xFFFF , 0xFFFF , 0x0000 } , " yellow " }
} ;
int ntext_colors = sizeof ( text_colors ) / sizeof ( text_colors [ 0 ] ) ;
/*
* GtkNotebook
*/
2010-08-06 18:37:48 +00:00
static const char * book_open_xpm [ ] = {
2010-04-13 16:55:50 +00:00
" 16 16 4 1 " ,
" c None s None " ,
" . c black " ,
" X c #808080 " ,
" o c white " ,
" " ,
" .. " ,
" .Xo. ... " ,
" .Xoo. ..oo. " ,
" .Xooo.Xooo... " ,
" .Xooo.oooo.X. " ,
" .Xooo.Xooo.X. " ,
" .Xooo.oooo.X. " ,
" .Xooo.Xooo.X. " ,
" .Xooo.oooo.X. " ,
" .Xoo.Xoo..X. " ,
" .Xo.o..ooX. " ,
" .X..XXXXX. " ,
" ..X....... " ,
" .. " ,
" " } ;
2010-08-06 18:37:48 +00:00
static const char * book_closed_xpm [ ] = {
2010-04-13 16:55:50 +00:00
" 16 16 6 1 " ,
" c None s None " ,
" . c black " ,
" X c red " ,
" o c yellow " ,
" O c #808080 " ,
" # c white " ,
" " ,
" .. " ,
" ..XX. " ,
" ..XXXXX. " ,
" ..XXXXXXXX. " ,
" .ooXXXXXXXXX. " ,
" ..ooXXXXXXXXX. " ,
" .X.ooXXXXXXXXX. " ,
" .XX.ooXXXXXX.. " ,
" .XX.ooXXX..#O " ,
" .XX.oo..##OO. " ,
" .XX..##OO.. " ,
" .X.#OO.. " ,
" ..O.. " ,
" .. " ,
" " } ;
2008-02-27 10:31:24 +00:00
GdkPixbuf * book_open ;
GdkPixbuf * book_closed ;
GtkWidget * sample_notebook ;
static void
set_page_image ( GtkNotebook * notebook , gint page_num , GdkPixbuf * pixbuf )
{
GtkWidget * page_widget ;
GtkWidget * pixwid ;
page_widget = gtk_notebook_get_nth_page ( notebook , page_num ) ;
pixwid = g_object_get_data ( G_OBJECT ( page_widget ) , " tab_pixmap " ) ;
gtk_image_set_from_pixbuf ( GTK_IMAGE ( pixwid ) , pixbuf ) ;
pixwid = g_object_get_data ( G_OBJECT ( page_widget ) , " menu_pixmap " ) ;
gtk_image_set_from_pixbuf ( GTK_IMAGE ( pixwid ) , pixbuf ) ;
}
static void
2010-07-13 14:49:53 +00:00
page_switch ( GtkWidget * widget , gpointer * page , gint page_num )
2008-02-27 10:31:24 +00:00
{
GtkNotebook * notebook = GTK_NOTEBOOK ( widget ) ;
gint old_page_num = gtk_notebook_get_current_page ( notebook ) ;
if ( page_num = = old_page_num )
return ;
set_page_image ( notebook , page_num , book_open ) ;
if ( old_page_num ! = - 1 )
set_page_image ( notebook , old_page_num , book_closed ) ;
}
static void
tab_fill ( GtkToggleButton * button , GtkWidget * child )
{
2010-04-26 03:26:42 +00:00
gtk_container_child_set ( GTK_CONTAINER ( sample_notebook ) , child ,
" tab-fill " , gtk_toggle_button_get_active ( button ) ,
NULL ) ;
2008-02-27 10:31:24 +00:00
}
static void
tab_expand ( GtkToggleButton * button , GtkWidget * child )
{
2010-04-26 03:26:42 +00:00
gtk_container_child_set ( GTK_CONTAINER ( sample_notebook ) , child ,
" tab-expand " , gtk_toggle_button_get_active ( button ) ,
NULL ) ;
2008-02-27 10:31:24 +00:00
}
static void
create_pages ( GtkNotebook * notebook , gint start , gint end )
{
GtkWidget * child = NULL ;
GtkWidget * button ;
GtkWidget * label ;
GtkWidget * hbox ;
GtkWidget * vbox ;
GtkWidget * label_box ;
GtkWidget * menu_box ;
GtkWidget * pixwid ;
gint i ;
char buffer [ 32 ] ;
char accel_buffer [ 32 ] ;
for ( i = start ; i < = end ; i + + )
{
sprintf ( buffer , " Page %d " , i ) ;
sprintf ( accel_buffer , " Page _%d " , i ) ;
child = gtk_frame_new ( buffer ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( child ) , 10 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
gtk_box_set_homogeneous ( GTK_BOX ( vbox ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 10 ) ;
gtk_container_add ( GTK_CONTAINER ( child ) , vbox ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
gtk_box_set_homogeneous ( GTK_BOX ( hbox ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , hbox , FALSE , TRUE , 5 ) ;
button = gtk_check_button_new_with_label ( " Fill Tab " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
g_signal_connect ( button , " toggled " ,
G_CALLBACK ( tab_fill ) , child ) ;
button = gtk_check_button_new_with_label ( " Expand Tab " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , button , TRUE , TRUE , 5 ) ;
g_signal_connect ( button , " toggled " ,
G_CALLBACK ( tab_expand ) , child ) ;
button = gtk_button_new_with_label ( " Hide Page " ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 5 ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_hide ) ,
child ) ;
gtk_widget_show_all ( child ) ;
2010-10-31 17:07:20 +00:00
label_box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
pixwid = gtk_image_new_from_pixbuf ( book_closed ) ;
g_object_set_data ( G_OBJECT ( child ) , " tab_pixmap " , pixwid ) ;
gtk_box_pack_start ( GTK_BOX ( label_box ) , pixwid , FALSE , TRUE , 0 ) ;
2013-11-14 22:31:17 +00:00
gtk_widget_set_margin_start ( pixwid , 3 ) ;
gtk_widget_set_margin_end ( pixwid , 3 ) ;
2011-06-02 11:37:43 +00:00
gtk_widget_set_margin_bottom ( pixwid , 1 ) ;
gtk_widget_set_margin_top ( pixwid , 1 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new_with_mnemonic ( accel_buffer ) ;
gtk_box_pack_start ( GTK_BOX ( label_box ) , label , FALSE , TRUE , 0 ) ;
gtk_widget_show_all ( label_box ) ;
2010-10-31 17:07:20 +00:00
menu_box = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
pixwid = gtk_image_new_from_pixbuf ( book_closed ) ;
g_object_set_data ( G_OBJECT ( child ) , " menu_pixmap " , pixwid ) ;
gtk_box_pack_start ( GTK_BOX ( menu_box ) , pixwid , FALSE , TRUE , 0 ) ;
2013-11-14 22:31:17 +00:00
gtk_widget_set_margin_start ( pixwid , 3 ) ;
gtk_widget_set_margin_end ( pixwid , 3 ) ;
2011-06-02 11:37:43 +00:00
gtk_widget_set_margin_bottom ( pixwid , 1 ) ;
gtk_widget_set_margin_top ( pixwid , 1 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( buffer ) ;
gtk_box_pack_start ( GTK_BOX ( menu_box ) , label , FALSE , TRUE , 0 ) ;
gtk_widget_show_all ( menu_box ) ;
gtk_notebook_append_page_menu ( notebook , child , label_box , menu_box ) ;
}
}
static void
rotate_notebook ( GtkButton * button ,
GtkNotebook * notebook )
{
2010-07-02 20:39:02 +00:00
gtk_notebook_set_tab_pos ( notebook , ( gtk_notebook_get_tab_pos ( notebook ) + 1 ) % 4 ) ;
2008-02-27 10:31:24 +00:00
}
static void
show_all_pages ( GtkButton * button ,
GtkNotebook * notebook )
{
gtk_container_foreach ( GTK_CONTAINER ( notebook ) ,
( GtkCallback ) gtk_widget_show , NULL ) ;
}
static void
notebook_type_changed ( GtkWidget * optionmenu ,
gpointer data )
{
GtkNotebook * notebook ;
gint i , c ;
enum {
STANDARD ,
NOTABS ,
BORDERLESS ,
SCROLLABLE
} ;
notebook = GTK_NOTEBOOK ( data ) ;
2010-03-26 16:55:07 +00:00
c = gtk_combo_box_get_active ( GTK_COMBO_BOX ( optionmenu ) ) ;
2008-02-27 10:31:24 +00:00
switch ( c )
{
case STANDARD :
/* standard notebook */
gtk_notebook_set_show_tabs ( notebook , TRUE ) ;
gtk_notebook_set_show_border ( notebook , TRUE ) ;
gtk_notebook_set_scrollable ( notebook , FALSE ) ;
break ;
case NOTABS :
/* notabs notebook */
gtk_notebook_set_show_tabs ( notebook , FALSE ) ;
gtk_notebook_set_show_border ( notebook , TRUE ) ;
break ;
case BORDERLESS :
/* borderless */
gtk_notebook_set_show_tabs ( notebook , FALSE ) ;
gtk_notebook_set_show_border ( notebook , FALSE ) ;
break ;
case SCROLLABLE :
/* scrollable */
gtk_notebook_set_show_tabs ( notebook , TRUE ) ;
gtk_notebook_set_show_border ( notebook , TRUE ) ;
gtk_notebook_set_scrollable ( notebook , TRUE ) ;
2010-07-02 20:39:02 +00:00
if ( gtk_notebook_get_n_pages ( notebook ) = = 5 )
2008-02-27 10:31:24 +00:00
create_pages ( notebook , 6 , 15 ) ;
2010-07-02 20:39:02 +00:00
2008-02-27 10:31:24 +00:00
return ;
break ;
}
2010-07-02 20:39:02 +00:00
if ( gtk_notebook_get_n_pages ( notebook ) = = 15 )
2008-02-27 10:31:24 +00:00
for ( i = 0 ; i < 10 ; i + + )
gtk_notebook_remove_page ( notebook , 5 ) ;
}
static void
notebook_popup ( GtkToggleButton * button ,
GtkNotebook * notebook )
{
2010-10-19 16:46:40 +00:00
if ( gtk_toggle_button_get_active ( button ) )
2008-02-27 10:31:24 +00:00
gtk_notebook_popup_enable ( notebook ) ;
else
gtk_notebook_popup_disable ( notebook ) ;
}
static void
create_notebook ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * button ;
GtkWidget * separator ;
GtkWidget * omenu ;
GtkWidget * label ;
static gchar * items [ ] =
{
" Standard " ,
" No tabs " ,
" Borderless " ,
" Scrollable "
} ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " notebook " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
sample_notebook = gtk_notebook_new ( ) ;
g_signal_connect ( sample_notebook , " switch_page " ,
G_CALLBACK ( page_switch ) , NULL ) ;
gtk_notebook_set_tab_pos ( GTK_NOTEBOOK ( sample_notebook ) , GTK_POS_TOP ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , sample_notebook , TRUE , TRUE , 0 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( sample_notebook ) , 10 ) ;
gtk_widget_realize ( sample_notebook ) ;
if ( ! book_open )
2010-08-06 18:37:48 +00:00
book_open = gdk_pixbuf_new_from_xpm_data ( book_open_xpm ) ;
2008-02-27 10:31:24 +00:00
if ( ! book_closed )
2010-08-06 18:37:48 +00:00
book_closed = gdk_pixbuf_new_from_xpm_data ( book_closed_xpm ) ;
2008-02-27 10:31:24 +00:00
create_pages ( GTK_NOTEBOOK ( sample_notebook ) , 1 , 5 ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 10 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_check_button_new_with_label ( " popup menu " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , FALSE , 0 ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( notebook_popup ) ,
sample_notebook ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
label = gtk_label_new ( " Notebook Style : " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , label , FALSE , TRUE , 0 ) ;
omenu = build_option_menu ( items , G_N_ELEMENTS ( items ) , 0 ,
notebook_type_changed ,
sample_notebook ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , omenu , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " Show all Pages " ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , FALSE , TRUE , 0 ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( show_all_pages ) , sample_notebook ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 10 ) ;
gtk_box_set_homogeneous ( GTK_BOX ( box2 ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " prev " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_notebook_prev_page ) ,
sample_notebook ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " next " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_notebook_next_page ) ,
sample_notebook ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
button = gtk_button_new_with_label ( " rotate " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( rotate_notebook ) , sample_notebook ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 5 ) ;
button = gtk_button_new_with_label ( " close " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( button ) , 5 ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , button , FALSE , FALSE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkPanes
*/
void
toggle_resize ( GtkWidget * widget , GtkWidget * child )
{
GtkContainer * container = GTK_CONTAINER ( gtk_widget_get_parent ( child ) ) ;
2011-09-30 15:31:04 +00:00
GValue value = G_VALUE_INIT ;
2008-02-27 10:31:24 +00:00
g_value_init ( & value , G_TYPE_BOOLEAN ) ;
gtk_container_child_get_property ( container , child , " resize " , & value ) ;
g_value_set_boolean ( & value , ! g_value_get_boolean ( & value ) ) ;
gtk_container_child_set_property ( container , child , " resize " , & value ) ;
}
void
toggle_shrink ( GtkWidget * widget , GtkWidget * child )
{
GtkContainer * container = GTK_CONTAINER ( gtk_widget_get_parent ( child ) ) ;
2011-09-30 15:31:04 +00:00
GValue value = G_VALUE_INIT ;
2008-02-27 10:31:24 +00:00
g_value_init ( & value , G_TYPE_BOOLEAN ) ;
gtk_container_child_get_property ( container , child , " shrink " , & value ) ;
g_value_set_boolean ( & value , ! g_value_get_boolean ( & value ) ) ;
gtk_container_child_set_property ( container , child , " shrink " , & value ) ;
}
GtkWidget *
create_pane_options ( GtkPaned * paned ,
const gchar * frame_label ,
const gchar * label1 ,
const gchar * label2 )
{
2010-07-06 04:32:48 +00:00
GtkWidget * child1 , * child2 ;
2008-02-27 10:31:24 +00:00
GtkWidget * frame ;
2011-09-28 22:41:35 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
GtkWidget * label ;
GtkWidget * check_button ;
2010-07-06 04:32:48 +00:00
child1 = gtk_paned_get_child1 ( paned ) ;
child2 = gtk_paned_get_child2 ( paned ) ;
2008-02-27 10:31:24 +00:00
frame = gtk_frame_new ( frame_label ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( frame ) , 4 ) ;
2011-09-28 22:41:35 +00:00
grid = gtk_grid_new ( ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , grid ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( label1 ) ;
2011-09-28 22:41:35 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , label , 0 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
check_button = gtk_check_button_new_with_label ( " Resize " ) ;
2011-09-28 22:41:35 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 0 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( toggle_resize ) ,
2010-07-06 04:32:48 +00:00
child1 ) ;
2008-02-27 10:31:24 +00:00
check_button = gtk_check_button_new_with_label ( " Shrink " ) ;
2011-09-28 22:41:35 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 0 , 2 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check_button ) ,
TRUE ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( toggle_shrink ) ,
2010-07-06 04:32:48 +00:00
child1 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( label2 ) ;
2011-09-28 22:41:35 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , label , 1 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
check_button = gtk_check_button_new_with_label ( " Resize " ) ;
2011-09-28 22:41:35 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 1 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check_button ) ,
TRUE ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( toggle_resize ) ,
2010-07-06 04:32:48 +00:00
child2 ) ;
2008-02-27 10:31:24 +00:00
check_button = gtk_check_button_new_with_label ( " Shrink " ) ;
2011-09-28 22:41:35 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check_button , 1 , 2 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check_button ) ,
TRUE ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( toggle_shrink ) ,
2010-07-06 04:32:48 +00:00
child2 ) ;
2008-02-27 10:31:24 +00:00
return frame ;
}
void
create_panes ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * frame ;
GtkWidget * hpaned ;
GtkWidget * vpaned ;
GtkWidget * button ;
GtkWidget * vbox ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Panes " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
2010-10-29 23:47:13 +00:00
vpaned = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , vpaned , TRUE , TRUE , 0 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( vpaned ) , 5 ) ;
2010-10-29 23:47:13 +00:00
hpaned = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_add1 ( GTK_PANED ( vpaned ) , hpaned ) ;
frame = gtk_frame_new ( NULL ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame ) , GTK_SHADOW_IN ) ;
gtk_widget_set_size_request ( frame , 60 , 60 ) ;
gtk_paned_add1 ( GTK_PANED ( hpaned ) , frame ) ;
button = gtk_button_new_with_label ( " Hi there " ) ;
gtk_container_add ( GTK_CONTAINER ( frame ) , button ) ;
frame = gtk_frame_new ( NULL ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame ) , GTK_SHADOW_IN ) ;
gtk_widget_set_size_request ( frame , 80 , 60 ) ;
gtk_paned_add2 ( GTK_PANED ( hpaned ) , frame ) ;
frame = gtk_frame_new ( NULL ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame ) , GTK_SHADOW_IN ) ;
gtk_widget_set_size_request ( frame , 60 , 80 ) ;
gtk_paned_add2 ( GTK_PANED ( vpaned ) , frame ) ;
/* Now create toggle buttons to control sizing */
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_pane_options ( GTK_PANED ( hpaned ) ,
" Horizontal " ,
" Left " ,
" Right " ) ,
FALSE , FALSE , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) ,
create_pane_options ( GTK_PANED ( vpaned ) ,
" Vertical " ,
" Top " ,
" Bottom " ) ,
FALSE , FALSE , 0 ) ;
gtk_widget_show_all ( vbox ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Paned keyboard navigation
*/
static GtkWidget *
paned_keyboard_window1 ( GtkWidget * widget )
{
GtkWidget * window1 ;
GtkWidget * hpaned1 ;
GtkWidget * frame1 ;
GtkWidget * vbox1 ;
GtkWidget * button7 ;
GtkWidget * button8 ;
GtkWidget * button9 ;
GtkWidget * vpaned1 ;
GtkWidget * frame2 ;
GtkWidget * frame5 ;
GtkWidget * hbox1 ;
GtkWidget * button5 ;
GtkWidget * button6 ;
GtkWidget * frame3 ;
GtkWidget * frame4 ;
2011-09-28 03:21:29 +00:00
GtkWidget * grid1 ;
2008-02-27 10:31:24 +00:00
GtkWidget * button1 ;
GtkWidget * button2 ;
GtkWidget * button3 ;
GtkWidget * button4 ;
window1 = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_title ( GTK_WINDOW ( window1 ) , " Basic paned navigation " ) ;
gtk_window_set_screen ( GTK_WINDOW ( window1 ) ,
gtk_widget_get_screen ( widget ) ) ;
2010-10-29 23:47:13 +00:00
hpaned1 = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window1 ) , hpaned1 ) ;
frame1 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( hpaned1 ) , frame1 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame1 ) , GTK_SHADOW_IN ) ;
2010-10-31 17:07:20 +00:00
vbox1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( frame1 ) , vbox1 ) ;
button7 = gtk_button_new_with_label ( " button7 " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox1 ) , button7 , FALSE , FALSE , 0 ) ;
button8 = gtk_button_new_with_label ( " button8 " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox1 ) , button8 , FALSE , FALSE , 0 ) ;
button9 = gtk_button_new_with_label ( " button9 " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox1 ) , button9 , FALSE , FALSE , 0 ) ;
2010-10-29 23:47:13 +00:00
vpaned1 = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_pack2 ( GTK_PANED ( hpaned1 ) , vpaned1 , TRUE , TRUE ) ;
frame2 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( vpaned1 ) , frame2 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame2 ) , GTK_SHADOW_IN ) ;
frame5 = gtk_frame_new ( NULL ) ;
gtk_container_add ( GTK_CONTAINER ( frame2 ) , frame5 ) ;
2010-10-31 17:07:20 +00:00
hbox1 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( frame5 ) , hbox1 ) ;
button5 = gtk_button_new_with_label ( " button5 " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox1 ) , button5 , FALSE , FALSE , 0 ) ;
button6 = gtk_button_new_with_label ( " button6 " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox1 ) , button6 , FALSE , FALSE , 0 ) ;
frame3 = gtk_frame_new ( NULL ) ;
gtk_paned_pack2 ( GTK_PANED ( vpaned1 ) , frame3 , TRUE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame3 ) , GTK_SHADOW_IN ) ;
frame4 = gtk_frame_new ( " Buttons " ) ;
gtk_container_add ( GTK_CONTAINER ( frame3 ) , frame4 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( frame4 ) , 15 ) ;
2011-09-28 03:21:29 +00:00
grid1 = gtk_grid_new ( ) ;
gtk_container_add ( GTK_CONTAINER ( frame4 ) , grid1 ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( grid1 ) , 11 ) ;
2008-02-27 10:31:24 +00:00
button1 = gtk_button_new_with_label ( " button1 " ) ;
2011-09-28 03:21:29 +00:00
gtk_grid_attach ( GTK_GRID ( grid1 ) , button1 , 0 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
button2 = gtk_button_new_with_label ( " button2 " ) ;
2011-09-28 03:21:29 +00:00
gtk_grid_attach ( GTK_GRID ( grid1 ) , button2 , 1 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
button3 = gtk_button_new_with_label ( " button3 " ) ;
2011-09-28 03:21:29 +00:00
gtk_grid_attach ( GTK_GRID ( grid1 ) , button3 , 0 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
button4 = gtk_button_new_with_label ( " button4 " ) ;
2011-09-28 03:21:29 +00:00
gtk_grid_attach ( GTK_GRID ( grid1 ) , button4 , 1 , 1 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
return window1 ;
}
static GtkWidget *
paned_keyboard_window2 ( GtkWidget * widget )
{
GtkWidget * window2 ;
GtkWidget * hpaned2 ;
GtkWidget * frame6 ;
GtkWidget * button13 ;
GtkWidget * hbox2 ;
GtkWidget * vpaned2 ;
GtkWidget * frame7 ;
GtkWidget * button12 ;
GtkWidget * frame8 ;
GtkWidget * button11 ;
GtkWidget * button10 ;
window2 = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_title ( GTK_WINDOW ( window2 ) , " \" button 10 \" is not inside the horisontal pane " ) ;
gtk_window_set_screen ( GTK_WINDOW ( window2 ) ,
gtk_widget_get_screen ( widget ) ) ;
2010-10-29 23:47:13 +00:00
hpaned2 = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window2 ) , hpaned2 ) ;
frame6 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( hpaned2 ) , frame6 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame6 ) , GTK_SHADOW_IN ) ;
button13 = gtk_button_new_with_label ( " button13 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame6 ) , button13 ) ;
2010-10-31 17:07:20 +00:00
hbox2 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_pack2 ( GTK_PANED ( hpaned2 ) , hbox2 , TRUE , TRUE ) ;
2010-10-29 23:47:13 +00:00
vpaned2 = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox2 ) , vpaned2 , TRUE , TRUE , 0 ) ;
frame7 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( vpaned2 ) , frame7 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame7 ) , GTK_SHADOW_IN ) ;
button12 = gtk_button_new_with_label ( " button12 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame7 ) , button12 ) ;
frame8 = gtk_frame_new ( NULL ) ;
gtk_paned_pack2 ( GTK_PANED ( vpaned2 ) , frame8 , TRUE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame8 ) , GTK_SHADOW_IN ) ;
button11 = gtk_button_new_with_label ( " button11 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame8 ) , button11 ) ;
button10 = gtk_button_new_with_label ( " button10 " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox2 ) , button10 , FALSE , FALSE , 0 ) ;
return window2 ;
}
static GtkWidget *
paned_keyboard_window3 ( GtkWidget * widget )
{
GtkWidget * window3 ;
GtkWidget * vbox2 ;
GtkWidget * label1 ;
GtkWidget * hpaned3 ;
GtkWidget * frame9 ;
GtkWidget * button14 ;
GtkWidget * hpaned4 ;
GtkWidget * frame10 ;
GtkWidget * button15 ;
GtkWidget * hpaned5 ;
GtkWidget * frame11 ;
GtkWidget * button16 ;
GtkWidget * frame12 ;
GtkWidget * button17 ;
window3 = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
g_object_set_data ( G_OBJECT ( window3 ) , " window3 " , window3 ) ;
gtk_window_set_title ( GTK_WINDOW ( window3 ) , " Nested panes " ) ;
gtk_window_set_screen ( GTK_WINDOW ( window3 ) ,
gtk_widget_get_screen ( widget ) ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window3 ) , vbox2 ) ;
label1 = gtk_label_new ( " Three panes nested inside each other " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , label1 , FALSE , FALSE , 0 ) ;
2010-10-29 23:47:13 +00:00
hpaned3 = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , hpaned3 , TRUE , TRUE , 0 ) ;
frame9 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( hpaned3 ) , frame9 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame9 ) , GTK_SHADOW_IN ) ;
button14 = gtk_button_new_with_label ( " button14 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame9 ) , button14 ) ;
2010-10-29 23:47:13 +00:00
hpaned4 = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_pack2 ( GTK_PANED ( hpaned3 ) , hpaned4 , TRUE , TRUE ) ;
frame10 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( hpaned4 ) , frame10 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame10 ) , GTK_SHADOW_IN ) ;
button15 = gtk_button_new_with_label ( " button15 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame10 ) , button15 ) ;
2010-10-29 23:47:13 +00:00
hpaned5 = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_pack2 ( GTK_PANED ( hpaned4 ) , hpaned5 , TRUE , TRUE ) ;
frame11 = gtk_frame_new ( NULL ) ;
gtk_paned_pack1 ( GTK_PANED ( hpaned5 ) , frame11 , FALSE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame11 ) , GTK_SHADOW_IN ) ;
button16 = gtk_button_new_with_label ( " button16 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame11 ) , button16 ) ;
frame12 = gtk_frame_new ( NULL ) ;
gtk_paned_pack2 ( GTK_PANED ( hpaned5 ) , frame12 , TRUE , TRUE ) ;
gtk_frame_set_shadow_type ( GTK_FRAME ( frame12 ) , GTK_SHADOW_IN ) ;
button17 = gtk_button_new_with_label ( " button17 " ) ;
gtk_container_add ( GTK_CONTAINER ( frame12 ) , button17 ) ;
return window3 ;
}
static GtkWidget *
paned_keyboard_window4 ( GtkWidget * widget )
{
GtkWidget * window4 ;
GtkWidget * vbox3 ;
GtkWidget * label2 ;
GtkWidget * hpaned6 ;
GtkWidget * vpaned3 ;
GtkWidget * button19 ;
GtkWidget * button18 ;
GtkWidget * hbox3 ;
GtkWidget * vpaned4 ;
GtkWidget * button21 ;
GtkWidget * button20 ;
GtkWidget * vpaned5 ;
GtkWidget * button23 ;
GtkWidget * button22 ;
GtkWidget * vpaned6 ;
GtkWidget * button25 ;
GtkWidget * button24 ;
window4 = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
g_object_set_data ( G_OBJECT ( window4 ) , " window4 " , window4 ) ;
gtk_window_set_title ( GTK_WINDOW ( window4 ) , " window4 " ) ;
gtk_window_set_screen ( GTK_WINDOW ( window4 ) ,
gtk_widget_get_screen ( widget ) ) ;
2010-10-31 17:07:20 +00:00
vbox3 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window4 ) , vbox3 ) ;
label2 = gtk_label_new ( " Widget tree: \n \n hpaned \n - vpaned \n - hbox \n - vpaned \n - vpaned \n - vpaned \n " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox3 ) , label2 , FALSE , FALSE , 0 ) ;
gtk_label_set_justify ( GTK_LABEL ( label2 ) , GTK_JUSTIFY_LEFT ) ;
2010-10-29 23:47:13 +00:00
hpaned6 = gtk_paned_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox3 ) , hpaned6 , TRUE , TRUE , 0 ) ;
2010-10-29 23:47:13 +00:00
vpaned3 = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_pack1 ( GTK_PANED ( hpaned6 ) , vpaned3 , FALSE , TRUE ) ;
button19 = gtk_button_new_with_label ( " button19 " ) ;
gtk_paned_pack1 ( GTK_PANED ( vpaned3 ) , button19 , FALSE , TRUE ) ;
button18 = gtk_button_new_with_label ( " button18 " ) ;
gtk_paned_pack2 ( GTK_PANED ( vpaned3 ) , button18 , TRUE , TRUE ) ;
2010-10-31 17:07:20 +00:00
hbox3 = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_paned_pack2 ( GTK_PANED ( hpaned6 ) , hbox3 , TRUE , TRUE ) ;
2010-10-29 23:47:13 +00:00
vpaned4 = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox3 ) , vpaned4 , TRUE , TRUE , 0 ) ;
button21 = gtk_button_new_with_label ( " button21 " ) ;
gtk_paned_pack1 ( GTK_PANED ( vpaned4 ) , button21 , FALSE , TRUE ) ;
button20 = gtk_button_new_with_label ( " button20 " ) ;
gtk_paned_pack2 ( GTK_PANED ( vpaned4 ) , button20 , TRUE , TRUE ) ;
2010-10-29 23:47:13 +00:00
vpaned5 = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox3 ) , vpaned5 , TRUE , TRUE , 0 ) ;
button23 = gtk_button_new_with_label ( " button23 " ) ;
gtk_paned_pack1 ( GTK_PANED ( vpaned5 ) , button23 , FALSE , TRUE ) ;
button22 = gtk_button_new_with_label ( " button22 " ) ;
gtk_paned_pack2 ( GTK_PANED ( vpaned5 ) , button22 , TRUE , TRUE ) ;
2010-10-29 23:47:13 +00:00
vpaned6 = gtk_paned_new ( GTK_ORIENTATION_VERTICAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox3 ) , vpaned6 , TRUE , TRUE , 0 ) ;
button25 = gtk_button_new_with_label ( " button25 " ) ;
gtk_paned_pack1 ( GTK_PANED ( vpaned6 ) , button25 , FALSE , TRUE ) ;
button24 = gtk_button_new_with_label ( " button24 " ) ;
gtk_paned_pack2 ( GTK_PANED ( vpaned6 ) , button24 , TRUE , TRUE ) ;
return window4 ;
}
static void
create_paned_keyboard_navigation ( GtkWidget * widget )
{
static GtkWidget * window1 = NULL ;
static GtkWidget * window2 = NULL ;
static GtkWidget * window3 = NULL ;
static GtkWidget * window4 = NULL ;
if ( window1 & &
( gtk_widget_get_screen ( window1 ) ! = gtk_widget_get_screen ( widget ) ) )
{
gtk_widget_destroy ( window1 ) ;
gtk_widget_destroy ( window2 ) ;
gtk_widget_destroy ( window3 ) ;
gtk_widget_destroy ( window4 ) ;
}
if ( ! window1 )
{
window1 = paned_keyboard_window1 ( widget ) ;
g_signal_connect ( window1 , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window1 ) ;
}
if ( ! window2 )
{
window2 = paned_keyboard_window2 ( widget ) ;
g_signal_connect ( window2 , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window2 ) ;
}
if ( ! window3 )
{
window3 = paned_keyboard_window3 ( widget ) ;
g_signal_connect ( window3 , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window3 ) ;
}
if ( ! window4 )
{
window4 = paned_keyboard_window4 ( widget ) ;
g_signal_connect ( window4 , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window4 ) ;
}
2010-03-01 06:47:38 +00:00
if ( gtk_widget_get_visible ( window1 ) )
2008-02-27 10:31:24 +00:00
gtk_widget_destroy ( GTK_WIDGET ( window1 ) ) ;
else
gtk_widget_show_all ( GTK_WIDGET ( window1 ) ) ;
2010-03-01 06:47:38 +00:00
if ( gtk_widget_get_visible ( window2 ) )
2008-02-27 10:31:24 +00:00
gtk_widget_destroy ( GTK_WIDGET ( window2 ) ) ;
else
gtk_widget_show_all ( GTK_WIDGET ( window2 ) ) ;
2010-03-01 06:47:38 +00:00
if ( gtk_widget_get_visible ( window3 ) )
2008-02-27 10:31:24 +00:00
gtk_widget_destroy ( GTK_WIDGET ( window3 ) ) ;
else
gtk_widget_show_all ( GTK_WIDGET ( window3 ) ) ;
2010-03-01 06:47:38 +00:00
if ( gtk_widget_get_visible ( window4 ) )
2008-02-27 10:31:24 +00:00
gtk_widget_destroy ( GTK_WIDGET ( window4 ) ) ;
else
gtk_widget_show_all ( GTK_WIDGET ( window4 ) ) ;
}
/*
* Shaped Windows
*/
typedef struct _cursoroffset { gint x , y ; } CursorOffset ;
static void
shape_pressed ( GtkWidget * widget , GdkEventButton * event )
{
CursorOffset * p ;
/* ignore double and triple click */
if ( event - > type ! = GDK_BUTTON_PRESS )
return ;
p = g_object_get_data ( G_OBJECT ( widget ) , " cursor_offset " ) ;
p - > x = ( int ) event - > x ;
p - > y = ( int ) event - > y ;
gtk_grab_add ( widget ) ;
2010-12-25 01:00:19 +00:00
gdk_device_grab ( gdk_event_get_device ( ( GdkEvent * ) event ) ,
gtk_widget_get_window ( widget ) ,
GDK_OWNERSHIP_NONE ,
TRUE ,
GDK_BUTTON_RELEASE_MASK |
2013-11-16 00:26:29 +00:00
GDK_BUTTON_MOTION_MASK ,
2010-12-25 01:00:19 +00:00
NULL ,
event - > time ) ;
2008-02-27 10:31:24 +00:00
}
static void
2010-12-25 01:00:19 +00:00
shape_released ( GtkWidget * widget ,
GdkEventButton * event )
2008-02-27 10:31:24 +00:00
{
gtk_grab_remove ( widget ) ;
2010-12-25 01:00:19 +00:00
gdk_device_ungrab ( gdk_event_get_device ( ( GdkEvent * ) event ) , event - > time ) ;
2008-02-27 10:31:24 +00:00
}
static void
2010-12-25 01:00:19 +00:00
shape_motion ( GtkWidget * widget ,
2008-02-27 10:31:24 +00:00
GdkEventMotion * event )
{
gint xp , yp ;
CursorOffset * p ;
p = g_object_get_data ( G_OBJECT ( widget ) , " cursor_offset " ) ;
/*
* Can ' t use event - > x / event - > y here
* because I need absolute coordinates .
*/
2011-11-09 02:15:27 +00:00
gdk_window_get_device_position ( gdk_screen_get_root_window ( gtk_widget_get_screen ( widget ) ) ,
gdk_event_get_device ( ( GdkEvent * ) event ) ,
& xp , & yp , NULL ) ;
2010-04-13 16:32:10 +00:00
gtk_window_move ( GTK_WINDOW ( widget ) , xp - p - > x , yp - p - > y ) ;
2008-02-27 10:31:24 +00:00
}
GtkWidget *
shape_create_icon ( GdkScreen * screen ,
char * xpm_file ,
gint x ,
gint y ,
gint px ,
gint py ,
gint window_type )
{
GtkWidget * window ;
2010-08-06 20:28:09 +00:00
GtkWidget * image ;
2008-02-27 10:31:24 +00:00
GtkWidget * fixed ;
CursorOffset * icon_pos ;
2010-08-14 04:38:11 +00:00
cairo_surface_t * mask ;
cairo_region_t * mask_region ;
2010-08-06 20:28:09 +00:00
GdkPixbuf * pixbuf ;
2010-08-14 04:38:11 +00:00
cairo_t * cr ;
2008-02-27 10:31:24 +00:00
/*
* GDK_WINDOW_TOPLEVEL works also , giving you a title border
*/
window = gtk_window_new ( window_type ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) , screen ) ;
fixed = gtk_fixed_new ( ) ;
gtk_widget_set_size_request ( fixed , 100 , 100 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , fixed ) ;
gtk_widget_show ( fixed ) ;
gtk_widget_set_events ( window ,
gtk_widget_get_events ( window ) |
GDK_BUTTON_MOTION_MASK |
GDK_BUTTON_PRESS_MASK ) ;
gtk_widget_realize ( window ) ;
2010-08-06 20:28:09 +00:00
pixbuf = gdk_pixbuf_new_from_file ( xpm_file , NULL ) ;
g_assert ( pixbuf ) ; /* FIXME: error handling */
2010-08-14 04:38:11 +00:00
mask = cairo_image_surface_create ( CAIRO_FORMAT_A1 ,
gdk_pixbuf_get_width ( pixbuf ) ,
gdk_pixbuf_get_height ( pixbuf ) ) ;
cr = cairo_create ( mask ) ;
gdk_cairo_set_source_pixbuf ( cr , pixbuf , 0 , 0 ) ;
cairo_paint ( cr ) ;
cairo_destroy ( cr ) ;
mask_region = gdk_cairo_region_create_from_surface ( mask ) ;
2010-08-06 20:28:09 +00:00
2010-08-14 04:38:11 +00:00
cairo_region_translate ( mask_region , px , py ) ;
2010-08-06 20:28:09 +00:00
image = gtk_image_new_from_pixbuf ( pixbuf ) ;
gtk_fixed_put ( GTK_FIXED ( fixed ) , image , px , py ) ;
gtk_widget_show ( image ) ;
2008-02-27 10:31:24 +00:00
2010-08-14 04:38:11 +00:00
gtk_widget_shape_combine_region ( window , mask_region ) ;
2008-02-27 10:31:24 +00:00
2010-08-14 04:38:11 +00:00
cairo_region_destroy ( mask_region ) ;
cairo_surface_destroy ( mask ) ;
2010-08-06 20:28:09 +00:00
g_object_unref ( pixbuf ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( window , " button_press_event " ,
G_CALLBACK ( shape_pressed ) , NULL ) ;
g_signal_connect ( window , " button_release_event " ,
G_CALLBACK ( shape_released ) , NULL ) ;
g_signal_connect ( window , " motion_notify_event " ,
G_CALLBACK ( shape_motion ) , NULL ) ;
icon_pos = g_new ( CursorOffset , 1 ) ;
g_object_set_data ( G_OBJECT ( window ) , " cursor_offset " , icon_pos ) ;
2010-04-13 16:32:10 +00:00
gtk_window_move ( GTK_WINDOW ( window ) , x , y ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
return window ;
}
void
create_shapes ( GtkWidget * widget )
{
/* Variables used by the Drag/Drop and Shape Window demos */
static GtkWidget * modeller = NULL ;
static GtkWidget * sheets = NULL ;
static GtkWidget * rings = NULL ;
static GtkWidget * with_region = NULL ;
GdkScreen * screen = gtk_widget_get_screen ( widget ) ;
if ( ! ( file_exists ( " Modeller.xpm " ) & &
file_exists ( " FilesQueue.xpm " ) & &
file_exists ( " 3DRings.xpm " ) ) )
return ;
if ( ! modeller )
{
modeller = shape_create_icon ( screen , " Modeller.xpm " ,
440 , 140 , 0 , 0 , GTK_WINDOW_POPUP ) ;
g_signal_connect ( modeller , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& modeller ) ;
}
else
gtk_widget_destroy ( modeller ) ;
if ( ! sheets )
{
sheets = shape_create_icon ( screen , " FilesQueue.xpm " ,
580 , 170 , 0 , 0 , GTK_WINDOW_POPUP ) ;
g_signal_connect ( sheets , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& sheets ) ;
}
else
gtk_widget_destroy ( sheets ) ;
if ( ! rings )
{
rings = shape_create_icon ( screen , " 3DRings.xpm " ,
460 , 270 , 25 , 25 , GTK_WINDOW_TOPLEVEL ) ;
g_signal_connect ( rings , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& rings ) ;
}
else
gtk_widget_destroy ( rings ) ;
if ( ! with_region )
{
2010-06-28 12:54:37 +00:00
cairo_region_t * region ;
2008-02-27 10:31:24 +00:00
gint x , y ;
with_region = shape_create_icon ( screen , " 3DRings.xpm " ,
460 , 270 , 25 , 25 , GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_decorated ( GTK_WINDOW ( with_region ) , FALSE ) ;
g_signal_connect ( with_region , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& with_region ) ;
/* reset shape from mask to a region */
x = 0 ;
y = 0 ;
2010-06-28 12:44:12 +00:00
region = cairo_region_create ( ) ;
2008-02-27 10:31:24 +00:00
while ( x < 460 )
{
while ( y < 270 )
{
GdkRectangle rect ;
rect . x = x ;
rect . y = y ;
rect . width = 10 ;
rect . height = 10 ;
2010-06-28 12:44:12 +00:00
cairo_region_union_rectangle ( region , & rect ) ;
2008-02-27 10:31:24 +00:00
y + = 20 ;
}
y = 0 ;
x + = 20 ;
}
2010-08-15 22:33:57 +00:00
gdk_window_shape_combine_region ( gtk_widget_get_window ( with_region ) ,
2008-02-27 10:31:24 +00:00
region ,
0 , 0 ) ;
}
else
gtk_widget_destroy ( with_region ) ;
}
/*
* WM Hints demo
*/
void
create_wmhints ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * label ;
GtkWidget * separator ;
GtkWidget * button ;
GtkWidget * box1 ;
GtkWidget * box2 ;
2010-08-15 22:33:57 +00:00
GdkWindow * gdk_window ;
2010-08-12 02:39:28 +00:00
GdkPixbuf * pixbuf ;
GList * list ;
2008-02-27 10:31:24 +00:00
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " WM Hints " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
gtk_widget_realize ( window ) ;
2010-08-15 22:33:57 +00:00
gdk_window = gtk_widget_get_window ( window ) ;
2010-08-06 20:37:34 +00:00
2010-08-12 02:39:28 +00:00
pixbuf = gdk_pixbuf_new_from_xpm_data ( ( const char * * ) openfile ) ;
list = g_list_prepend ( NULL , pixbuf ) ;
2010-08-15 22:33:57 +00:00
2010-08-12 02:39:28 +00:00
gdk_window_set_icon_list ( gdk_window , list ) ;
g_list_free ( list ) ;
g_object_unref ( pixbuf ) ;
2010-08-15 22:33:57 +00:00
2010-08-12 02:39:28 +00:00
gdk_window_set_icon_name ( gdk_window , " WMHints Test Icon " ) ;
2010-08-15 22:33:57 +00:00
gdk_window_set_decorations ( gdk_window , GDK_DECOR_ALL | GDK_DECOR_MENU ) ;
gdk_window_set_functions ( gdk_window , GDK_FUNC_ALL | GDK_FUNC_RESIZE ) ;
2010-08-12 02:39:28 +00:00
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
gtk_widget_show ( box1 ) ;
label = gtk_label_new ( " Try iconizing me! " ) ;
gtk_widget_set_size_request ( label , 150 , 50 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , label , TRUE , TRUE , 0 ) ;
gtk_widget_show ( label ) ;
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
gtk_widget_show ( separator ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
gtk_widget_show ( box2 ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
gtk_widget_show ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Window state tracking
*/
static gint
window_state_callback ( GtkWidget * widget ,
GdkEventWindowState * event ,
gpointer data )
{
GtkWidget * label = data ;
gchar * msg ;
2010-08-17 12:59:37 +00:00
msg = g_strconcat ( gtk_window_get_title ( GTK_WINDOW ( widget ) ) , " : " ,
2008-02-27 10:31:24 +00:00
( event - > new_window_state & GDK_WINDOW_STATE_WITHDRAWN ) ?
" withdrawn " : " not withdrawn " , " , " ,
( event - > new_window_state & GDK_WINDOW_STATE_ICONIFIED ) ?
" iconified " : " not iconified " , " , " ,
( event - > new_window_state & GDK_WINDOW_STATE_STICKY ) ?
" sticky " : " not sticky " , " , " ,
( event - > new_window_state & GDK_WINDOW_STATE_MAXIMIZED ) ?
" maximized " : " not maximized " , " , " ,
( event - > new_window_state & GDK_WINDOW_STATE_FULLSCREEN ) ?
" fullscreen " : " not fullscreen " ,
( event - > new_window_state & GDK_WINDOW_STATE_ABOVE ) ?
" above " : " not above " , " , " ,
( event - > new_window_state & GDK_WINDOW_STATE_BELOW ) ?
" below " : " not below " , " , " ,
NULL ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , msg ) ;
g_free ( msg ) ;
return FALSE ;
}
static GtkWidget *
tracking_label ( GtkWidget * window )
{
GtkWidget * label ;
GtkWidget * hbox ;
GtkWidget * button ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect_object ( hbox ,
" destroy " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ,
G_CONNECT_SWAPPED ) ;
label = gtk_label_new ( " <no window state events received> " ) ;
gtk_label_set_line_wrap ( GTK_LABEL ( label ) , TRUE ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , FALSE , 0 ) ;
g_signal_connect ( window ,
" window_state_event " ,
G_CALLBACK ( window_state_callback ) ,
label ) ;
button = gtk_button_new_with_label ( " Deiconify " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_deiconify ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( hbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Iconify " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_iconify ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( hbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Fullscreen " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_fullscreen ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( hbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Unfullscreen " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_unfullscreen ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( hbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Present " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_present ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( hbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Show " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_widget_show ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( hbox ) , button , FALSE , FALSE , 0 ) ;
gtk_widget_show_all ( hbox ) ;
return hbox ;
}
void
keep_window_above ( GtkToggleButton * togglebutton , gpointer data )
{
GtkWidget * button = g_object_get_data ( G_OBJECT ( togglebutton ) , " radio " ) ;
gtk_window_set_keep_above ( GTK_WINDOW ( data ) ,
gtk_toggle_button_get_active ( togglebutton ) ) ;
if ( gtk_toggle_button_get_active ( togglebutton ) )
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , FALSE ) ;
}
void
keep_window_below ( GtkToggleButton * togglebutton , gpointer data )
{
GtkWidget * button = g_object_get_data ( G_OBJECT ( togglebutton ) , " radio " ) ;
gtk_window_set_keep_below ( GTK_WINDOW ( data ) ,
gtk_toggle_button_get_active ( togglebutton ) ) ;
if ( gtk_toggle_button_get_active ( togglebutton ) )
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , FALSE ) ;
}
static GtkWidget *
get_state_controls ( GtkWidget * window )
{
GtkWidget * vbox ;
GtkWidget * button ;
GtkWidget * button_above ;
GtkWidget * button_below ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_label ( " Stick " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_stick ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Unstick " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_unstick ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Maximize " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_maximize ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Unmaximize " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_unmaximize ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Iconify " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_iconify ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Fullscreen " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_fullscreen ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Unfullscreen " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_unfullscreen ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button_above = gtk_toggle_button_new_with_label ( " Keep above " ) ;
g_signal_connect ( button_above ,
" toggled " ,
G_CALLBACK ( keep_window_above ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button_above , FALSE , FALSE , 0 ) ;
button_below = gtk_toggle_button_new_with_label ( " Keep below " ) ;
g_signal_connect ( button_below ,
" toggled " ,
G_CALLBACK ( keep_window_below ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button_below , FALSE , FALSE , 0 ) ;
g_object_set_data ( G_OBJECT ( button_above ) , " radio " , button_below ) ;
g_object_set_data ( G_OBJECT ( button_below ) , " radio " , button_above ) ;
button = gtk_button_new_with_label ( " Hide (withdraw) " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_widget_hide ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
gtk_widget_show_all ( vbox ) ;
return vbox ;
}
void
create_window_states ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * label ;
GtkWidget * box1 ;
GtkWidget * iconified ;
GtkWidget * normal ;
GtkWidget * controls ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Window states " ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
iconified = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( iconified ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect_object ( iconified , " destroy " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_window_iconify ( GTK_WINDOW ( iconified ) ) ;
gtk_window_set_title ( GTK_WINDOW ( iconified ) , " Iconified initially " ) ;
controls = get_state_controls ( iconified ) ;
gtk_container_add ( GTK_CONTAINER ( iconified ) , controls ) ;
normal = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( normal ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect_object ( normal , " destroy " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_window_set_title ( GTK_WINDOW ( normal ) , " Deiconified initially " ) ;
controls = get_state_controls ( normal ) ;
gtk_container_add ( GTK_CONTAINER ( normal ) , controls ) ;
label = tracking_label ( iconified ) ;
gtk_container_add ( GTK_CONTAINER ( box1 ) , label ) ;
label = tracking_label ( normal ) ;
gtk_container_add ( GTK_CONTAINER ( box1 ) , label ) ;
gtk_widget_show_all ( iconified ) ;
gtk_widget_show_all ( normal ) ;
gtk_widget_show_all ( box1 ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Window sizing
*/
static gint
configure_event_callback ( GtkWidget * widget ,
GdkEventConfigure * event ,
gpointer data )
{
GtkWidget * label = data ;
gchar * msg ;
gint x , y ;
gtk_window_get_position ( GTK_WINDOW ( widget ) , & x , & y ) ;
msg = g_strdup_printf ( " event: %d,%d %d x %d \n "
" position: %d, %d " ,
event - > x , event - > y , event - > width , event - > height ,
x , y ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , msg ) ;
g_free ( msg ) ;
return FALSE ;
}
static void
get_ints ( GtkWidget * window ,
gint * a ,
gint * b )
{
GtkWidget * spin1 ;
GtkWidget * spin2 ;
spin1 = g_object_get_data ( G_OBJECT ( window ) , " spin1 " ) ;
spin2 = g_object_get_data ( G_OBJECT ( window ) , " spin2 " ) ;
* a = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON ( spin1 ) ) ;
* b = gtk_spin_button_get_value_as_int ( GTK_SPIN_BUTTON ( spin2 ) ) ;
}
static void
set_size_callback ( GtkWidget * widget ,
gpointer data )
{
gint w , h ;
get_ints ( data , & w , & h ) ;
gtk_window_resize ( GTK_WINDOW ( g_object_get_data ( data , " target " ) ) , w , h ) ;
}
static void
unset_default_size_callback ( GtkWidget * widget ,
gpointer data )
{
gtk_window_set_default_size ( g_object_get_data ( data , " target " ) ,
- 1 , - 1 ) ;
}
static void
set_default_size_callback ( GtkWidget * widget ,
gpointer data )
{
gint w , h ;
get_ints ( data , & w , & h ) ;
gtk_window_set_default_size ( g_object_get_data ( data , " target " ) ,
w , h ) ;
}
static void
unset_size_request_callback ( GtkWidget * widget ,
gpointer data )
{
gtk_widget_set_size_request ( g_object_get_data ( data , " target " ) ,
- 1 , - 1 ) ;
}
static void
set_size_request_callback ( GtkWidget * widget ,
gpointer data )
{
gint w , h ;
get_ints ( data , & w , & h ) ;
gtk_widget_set_size_request ( g_object_get_data ( data , " target " ) ,
w , h ) ;
}
static void
set_location_callback ( GtkWidget * widget ,
gpointer data )
{
gint x , y ;
get_ints ( data , & x , & y ) ;
gtk_window_move ( g_object_get_data ( data , " target " ) , x , y ) ;
}
static void
move_to_position_callback ( GtkWidget * widget ,
gpointer data )
{
gint x , y ;
GtkWindow * window ;
window = g_object_get_data ( data , " target " ) ;
gtk_window_get_position ( window , & x , & y ) ;
gtk_window_move ( window , x , y ) ;
}
static void
set_geometry_callback ( GtkWidget * entry ,
gpointer data )
{
gchar * text ;
GtkWindow * target ;
target = GTK_WINDOW ( g_object_get_data ( G_OBJECT ( data ) , " target " ) ) ;
text = gtk_editable_get_chars ( GTK_EDITABLE ( entry ) , 0 , - 1 ) ;
if ( ! gtk_window_parse_geometry ( target , text ) )
g_print ( " Bad geometry string '%s' \n " , text ) ;
g_free ( text ) ;
}
static void
2010-08-07 15:07:17 +00:00
resizable_callback ( GtkWidget * widget ,
2008-02-27 10:31:24 +00:00
gpointer data )
{
g_object_set ( g_object_get_data ( data , " target " ) ,
2010-10-19 16:46:40 +00:00
" resizable " , gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ,
2008-02-27 10:31:24 +00:00
NULL ) ;
}
static void
gravity_selected ( GtkWidget * widget ,
gpointer data )
{
gtk_window_set_gravity ( GTK_WINDOW ( g_object_get_data ( data , " target " ) ) ,
2010-03-26 16:55:07 +00:00
gtk_combo_box_get_active ( GTK_COMBO_BOX ( widget ) ) + GDK_GRAVITY_NORTH_WEST ) ;
2008-02-27 10:31:24 +00:00
}
static void
pos_selected ( GtkWidget * widget ,
gpointer data )
{
gtk_window_set_position ( GTK_WINDOW ( g_object_get_data ( data , " target " ) ) ,
2010-03-26 16:55:07 +00:00
gtk_combo_box_get_active ( GTK_COMBO_BOX ( widget ) ) + GTK_WIN_POS_NONE ) ;
2008-02-27 10:31:24 +00:00
}
static void
move_gravity_window_to_current_position ( GtkWidget * widget ,
gpointer data )
{
gint x , y ;
GtkWindow * window ;
window = GTK_WINDOW ( data ) ;
gtk_window_get_position ( window , & x , & y ) ;
gtk_window_move ( window , x , y ) ;
}
static void
get_screen_corner ( GtkWindow * window ,
gint * x ,
gint * y )
{
int w , h ;
GdkScreen * screen = gtk_window_get_screen ( window ) ;
gtk_window_get_size ( GTK_WINDOW ( window ) , & w , & h ) ;
switch ( gtk_window_get_gravity ( window ) )
{
case GDK_GRAVITY_SOUTH_EAST :
* x = gdk_screen_get_width ( screen ) - w ;
* y = gdk_screen_get_height ( screen ) - h ;
break ;
case GDK_GRAVITY_NORTH_EAST :
* x = gdk_screen_get_width ( screen ) - w ;
* y = 0 ;
break ;
case GDK_GRAVITY_SOUTH_WEST :
* x = 0 ;
* y = gdk_screen_get_height ( screen ) - h ;
break ;
case GDK_GRAVITY_NORTH_WEST :
* x = 0 ;
* y = 0 ;
break ;
case GDK_GRAVITY_SOUTH :
* x = ( gdk_screen_get_width ( screen ) - w ) / 2 ;
* y = gdk_screen_get_height ( screen ) - h ;
break ;
case GDK_GRAVITY_NORTH :
* x = ( gdk_screen_get_width ( screen ) - w ) / 2 ;
* y = 0 ;
break ;
case GDK_GRAVITY_WEST :
* x = 0 ;
* y = ( gdk_screen_get_height ( screen ) - h ) / 2 ;
break ;
case GDK_GRAVITY_EAST :
* x = gdk_screen_get_width ( screen ) - w ;
* y = ( gdk_screen_get_height ( screen ) - h ) / 2 ;
break ;
case GDK_GRAVITY_CENTER :
* x = ( gdk_screen_get_width ( screen ) - w ) / 2 ;
* y = ( gdk_screen_get_height ( screen ) - h ) / 2 ;
break ;
case GDK_GRAVITY_STATIC :
/* pick some random numbers */
* x = 350 ;
* y = 350 ;
break ;
default :
g_assert_not_reached ( ) ;
break ;
}
}
static void
move_gravity_window_to_starting_position ( GtkWidget * widget ,
gpointer data )
{
gint x , y ;
GtkWindow * window ;
window = GTK_WINDOW ( data ) ;
get_screen_corner ( window ,
& x , & y ) ;
gtk_window_move ( window , x , y ) ;
}
static GtkWidget *
make_gravity_window ( GtkWidget * destroy_with ,
GdkGravity gravity ,
const gchar * title )
{
GtkWidget * window ;
GtkWidget * button ;
GtkWidget * vbox ;
int x , y ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( destroy_with ) ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( vbox ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , title ) ;
gtk_window_set_gravity ( GTK_WINDOW ( window ) , gravity ) ;
g_signal_connect_object ( destroy_with ,
" destroy " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ,
G_CONNECT_SWAPPED ) ;
button = gtk_button_new_with_mnemonic ( " _Move to current position " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( move_gravity_window_to_current_position ) ,
window ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
gtk_widget_show ( button ) ;
button = gtk_button_new_with_mnemonic ( " Move to _starting position " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( move_gravity_window_to_starting_position ) ,
window ) ;
gtk_container_add ( GTK_CONTAINER ( vbox ) , button ) ;
gtk_widget_show ( button ) ;
/* Pretend this is the result of --geometry.
* DO NOT COPY THIS CODE unless you are setting - - geometry results ,
* and in that case you probably should just use gtk_window_parse_geometry ( ) .
* AGAIN , DO NOT SET GDK_HINT_USER_POS ! It violates the ICCCM unless
* you are parsing - - geometry or equivalent .
*/
gtk_window_set_geometry_hints ( GTK_WINDOW ( window ) ,
NULL , NULL ,
GDK_HINT_USER_POS ) ;
gtk_window_set_default_size ( GTK_WINDOW ( window ) ,
200 , 200 ) ;
get_screen_corner ( GTK_WINDOW ( window ) , & x , & y ) ;
gtk_window_move ( GTK_WINDOW ( window ) ,
x , y ) ;
return window ;
}
static void
do_gravity_test ( GtkWidget * widget ,
gpointer data )
{
GtkWidget * destroy_with = data ;
GtkWidget * window ;
/* We put a window at each gravity point on the screen. */
window = make_gravity_window ( destroy_with , GDK_GRAVITY_NORTH_WEST ,
" NorthWest " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_SOUTH_EAST ,
" SouthEast " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_NORTH_EAST ,
" NorthEast " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_SOUTH_WEST ,
" SouthWest " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_SOUTH ,
" South " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_NORTH ,
" North " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_WEST ,
" West " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_EAST ,
" East " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_CENTER ,
" Center " ) ;
gtk_widget_show ( window ) ;
window = make_gravity_window ( destroy_with , GDK_GRAVITY_STATIC ,
" Static " ) ;
gtk_widget_show ( window ) ;
}
static GtkWidget *
window_controls ( GtkWidget * window )
{
GtkWidget * control_window ;
GtkWidget * label ;
GtkWidget * vbox ;
GtkWidget * button ;
GtkWidget * spin ;
2011-01-05 22:28:55 +00:00
GtkAdjustment * adjustment ;
2008-02-27 10:31:24 +00:00
GtkWidget * entry ;
GtkWidget * om ;
gint i ;
control_window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( control_window ) ,
gtk_widget_get_screen ( window ) ) ;
gtk_window_set_title ( GTK_WINDOW ( control_window ) , " Size controls " ) ;
g_object_set_data ( G_OBJECT ( control_window ) ,
" target " ,
window ) ;
g_signal_connect_object ( control_window ,
" destroy " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ,
G_CONNECT_SWAPPED ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( control_window ) , vbox ) ;
label = gtk_label_new ( " <no configure events> " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , FALSE , FALSE , 0 ) ;
g_signal_connect ( window ,
" configure_event " ,
G_CALLBACK ( configure_event_callback ) ,
label ) ;
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 10.0 , - 2000.0 , 2000.0 , 1.0 , 5.0 , 0.0 ) ;
spin = gtk_spin_button_new ( adjustment , 0 , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , spin , FALSE , FALSE , 0 ) ;
g_object_set_data ( G_OBJECT ( control_window ) , " spin1 " , spin ) ;
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 10.0 , - 2000.0 , 2000.0 , 1.0 , 5.0 , 0.0 ) ;
spin = gtk_spin_button_new ( adjustment , 0 , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , spin , FALSE , FALSE , 0 ) ;
g_object_set_data ( G_OBJECT ( control_window ) , " spin2 " , spin ) ;
entry = gtk_entry_new ( ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , entry , FALSE , FALSE , 0 ) ;
g_signal_connect ( entry , " changed " ,
G_CALLBACK ( set_geometry_callback ) ,
control_window ) ;
button = gtk_button_new_with_label ( " Show gravity test windows " ) ;
g_signal_connect_swapped ( button ,
" clicked " ,
G_CALLBACK ( do_gravity_test ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
2013-05-30 18:01:33 +00:00
G_GNUC_BEGIN_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_label ( " Reshow with initial size " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_window_reshow_with_initial_size ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
2013-05-30 18:01:33 +00:00
G_GNUC_END_IGNORE_DEPRECATIONS ;
2008-02-27 10:31:24 +00:00
button = gtk_button_new_with_label ( " Queue resize " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_widget_queue_resize ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Resize " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( set_size_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Set default size " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( set_default_size_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Unset default size " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( unset_default_size_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Set size request " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( set_size_request_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Unset size request " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( unset_size_request_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Move " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( set_location_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_label ( " Move to current position " ) ;
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( move_to_position_callback ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
2010-08-07 15:07:17 +00:00
button = gtk_check_button_new_with_label ( " Allow resize " ) ;
2008-02-27 10:31:24 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( button ) , TRUE ) ;
g_signal_connect ( button ,
" toggled " ,
2010-08-07 15:07:17 +00:00
G_CALLBACK ( resizable_callback ) ,
2008-02-27 10:31:24 +00:00
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_mnemonic ( " _Show " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_widget_show ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
button = gtk_button_new_with_mnemonic ( " _Hide " ) ;
g_signal_connect_object ( button ,
" clicked " ,
G_CALLBACK ( gtk_widget_hide ) ,
window ,
G_CONNECT_SWAPPED ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , button , FALSE , FALSE , 0 ) ;
2010-10-02 16:19:46 +00:00
om = gtk_combo_box_text_new ( ) ;
2008-02-27 10:31:24 +00:00
i = 0 ;
while ( i < 10 )
{
static gchar * names [ ] = {
" GDK_GRAVITY_NORTH_WEST " ,
" GDK_GRAVITY_NORTH " ,
" GDK_GRAVITY_NORTH_EAST " ,
" GDK_GRAVITY_WEST " ,
" GDK_GRAVITY_CENTER " ,
" GDK_GRAVITY_EAST " ,
" GDK_GRAVITY_SOUTH_WEST " ,
" GDK_GRAVITY_SOUTH " ,
" GDK_GRAVITY_SOUTH_EAST " ,
" GDK_GRAVITY_STATIC " ,
NULL
} ;
g_assert ( names [ i ] ) ;
2010-10-02 16:19:46 +00:00
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( om ) , names [ i ] ) ;
2008-02-27 10:31:24 +00:00
+ + i ;
}
g_signal_connect ( om ,
" changed " ,
G_CALLBACK ( gravity_selected ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , om , FALSE , FALSE , 0 ) ;
2010-10-02 16:19:46 +00:00
om = gtk_combo_box_text_new ( ) ;
2008-02-27 10:31:24 +00:00
i = 0 ;
while ( i < 5 )
{
static gchar * names [ ] = {
" GTK_WIN_POS_NONE " ,
" GTK_WIN_POS_CENTER " ,
" GTK_WIN_POS_MOUSE " ,
" GTK_WIN_POS_CENTER_ALWAYS " ,
" GTK_WIN_POS_CENTER_ON_PARENT " ,
NULL
} ;
g_assert ( names [ i ] ) ;
2010-10-02 16:19:46 +00:00
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( om ) , names [ i ] ) ;
2008-02-27 10:31:24 +00:00
+ + i ;
}
g_signal_connect ( om ,
" changed " ,
G_CALLBACK ( pos_selected ) ,
control_window ) ;
gtk_box_pack_end ( GTK_BOX ( vbox ) , om , FALSE , FALSE , 0 ) ;
gtk_widget_show_all ( vbox ) ;
return control_window ;
}
void
create_window_sizing ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
static GtkWidget * target_window = NULL ;
if ( ! target_window )
{
GtkWidget * label ;
target_window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( target_window ) ,
gtk_widget_get_screen ( widget ) ) ;
label = gtk_label_new ( NULL ) ;
gtk_label_set_markup ( GTK_LABEL ( label ) , " <span foreground= \" purple \" ><big>Window being resized</big></span> \n Blah blah blah blah \n blah blah blah \n blah blah blah blah blah " ) ;
gtk_container_add ( GTK_CONTAINER ( target_window ) , label ) ;
gtk_widget_show ( label ) ;
g_signal_connect ( target_window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& target_window ) ;
window = window_controls ( target_window ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( target_window ) , " Window to size " ) ;
}
/* don't show target window by default, we want to allow testing
* of behavior on first show .
*/
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* GtkProgressBar
*/
typedef struct _ProgressData {
GtkWidget * window ;
GtkWidget * pbar ;
GtkWidget * block_spin ;
GtkWidget * x_align_spin ;
GtkWidget * y_align_spin ;
GtkWidget * step_spin ;
GtkWidget * act_blocks_spin ;
GtkWidget * label ;
GtkWidget * omenu1 ;
GtkWidget * elmenu ;
GtkWidget * omenu2 ;
GtkWidget * entry ;
int timer ;
2010-03-26 16:27:09 +00:00
gboolean activity ;
2008-02-27 10:31:24 +00:00
} ProgressData ;
2010-03-26 16:27:09 +00:00
gboolean
2008-02-27 10:31:24 +00:00
progress_timeout ( gpointer data )
{
2010-03-26 16:27:09 +00:00
ProgressData * pdata = data ;
2008-02-27 10:31:24 +00:00
gdouble new_val ;
2010-04-26 00:08:04 +00:00
gchar * text ;
2008-02-27 10:31:24 +00:00
2010-03-26 16:27:09 +00:00
if ( pdata - > activity )
{
gtk_progress_bar_pulse ( GTK_PROGRESS_BAR ( pdata - > pbar ) ) ;
2010-04-26 00:08:04 +00:00
text = g_strdup_printf ( " %s " , " ??? " ) ;
2010-03-26 16:27:09 +00:00
}
2010-04-26 00:08:04 +00:00
else
{
new_val = gtk_progress_bar_get_fraction ( GTK_PROGRESS_BAR ( pdata - > pbar ) ) + 0.01 ;
if ( new_val > 1.00 )
new_val = 0.00 ;
gtk_progress_bar_set_fraction ( GTK_PROGRESS_BAR ( pdata - > pbar ) , new_val ) ;
2008-02-27 10:31:24 +00:00
2010-04-26 00:08:04 +00:00
text = g_strdup_printf ( " %.0f%% " , 100 * new_val ) ;
}
2008-02-27 10:31:24 +00:00
2010-04-26 00:08:04 +00:00
gtk_label_set_text ( GTK_LABEL ( pdata - > label ) , text ) ;
g_free ( text ) ;
2008-02-27 10:31:24 +00:00
return TRUE ;
}
static void
destroy_progress ( GtkWidget * widget ,
ProgressData * * pdata )
{
2011-03-31 13:09:07 +00:00
if ( ( * pdata ) - > timer )
{
g_source_remove ( ( * pdata ) - > timer ) ;
( * pdata ) - > timer = 0 ;
}
2008-02-27 10:31:24 +00:00
( * pdata ) - > window = NULL ;
g_free ( * pdata ) ;
* pdata = NULL ;
}
static void
progressbar_toggle_orientation ( GtkWidget * widget , gpointer data )
{
ProgressData * pdata ;
gint i ;
pdata = ( ProgressData * ) data ;
2010-03-02 04:19:28 +00:00
if ( ! gtk_widget_get_mapped ( widget ) )
2008-02-27 10:31:24 +00:00
return ;
2010-03-26 16:55:07 +00:00
i = gtk_combo_box_get_active ( GTK_COMBO_BOX ( widget ) ) ;
2008-02-27 10:31:24 +00:00
2010-09-02 03:29:53 +00:00
if ( i = = 0 | | i = = 1 )
2010-09-02 03:26:19 +00:00
gtk_orientable_set_orientation ( GTK_ORIENTABLE ( pdata - > pbar ) , GTK_ORIENTATION_HORIZONTAL ) ;
else
gtk_orientable_set_orientation ( GTK_ORIENTABLE ( pdata - > pbar ) , GTK_ORIENTATION_VERTICAL ) ;
2010-09-02 03:29:53 +00:00
if ( i = = 1 | | i = = 2 )
2010-09-02 03:26:19 +00:00
gtk_progress_bar_set_inverted ( GTK_PROGRESS_BAR ( pdata - > pbar ) , TRUE ) ;
else
gtk_progress_bar_set_inverted ( GTK_PROGRESS_BAR ( pdata - > pbar ) , FALSE ) ;
2008-02-27 10:31:24 +00:00
}
static void
toggle_show_text ( GtkWidget * widget , ProgressData * pdata )
{
2010-04-26 00:08:04 +00:00
gboolean active ;
active = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ;
2010-06-09 04:29:55 +00:00
gtk_progress_bar_set_show_text ( GTK_PROGRESS_BAR ( pdata - > pbar ) , active ) ;
2008-02-27 10:31:24 +00:00
}
static void
progressbar_toggle_ellipsize ( GtkWidget * widget ,
gpointer data )
{
ProgressData * pdata = data ;
2010-01-07 15:47:35 +00:00
if ( gtk_widget_is_drawable ( widget ) )
2008-02-27 10:31:24 +00:00
{
2010-03-26 16:55:07 +00:00
gint i = gtk_combo_box_get_active ( GTK_COMBO_BOX ( widget ) ) ;
2008-02-27 10:31:24 +00:00
gtk_progress_bar_set_ellipsize ( GTK_PROGRESS_BAR ( pdata - > pbar ) , i ) ;
}
}
static void
toggle_activity_mode ( GtkWidget * widget , ProgressData * pdata )
{
2010-03-26 16:27:09 +00:00
pdata - > activity = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) ;
2008-02-27 10:31:24 +00:00
}
2011-03-31 13:09:07 +00:00
static void
toggle_running ( GtkWidget * widget , ProgressData * pdata )
{
if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( widget ) ) )
{
if ( pdata - > timer = = 0 )
pdata - > timer = g_timeout_add ( 100 , ( GSourceFunc ) progress_timeout , pdata ) ;
}
else
{
if ( pdata - > timer ! = 0 )
{
g_source_remove ( pdata - > timer ) ;
pdata - > timer = 0 ;
}
}
}
2008-02-27 10:31:24 +00:00
static void
entry_changed ( GtkWidget * widget , ProgressData * pdata )
{
2010-03-26 16:27:09 +00:00
gtk_progress_bar_set_text ( GTK_PROGRESS_BAR ( pdata - > pbar ) ,
2008-02-27 10:31:24 +00:00
gtk_entry_get_text ( GTK_ENTRY ( pdata - > entry ) ) ) ;
}
void
create_progress_bar ( GtkWidget * widget )
{
2014-04-10 14:48:13 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * vbox ;
GtkWidget * vbox2 ;
GtkWidget * hbox ;
GtkWidget * check ;
GtkWidget * frame ;
2011-09-28 17:40:11 +00:00
GtkWidget * grid ;
2008-02-27 10:31:24 +00:00
GtkWidget * label ;
static ProgressData * pdata = NULL ;
static gchar * items1 [ ] =
{
" Left-Right " ,
" Right-Left " ,
" Bottom-Top " ,
" Top-Bottom "
} ;
2010-03-26 16:27:09 +00:00
static char * ellipsize_items [ ] = {
2008-02-27 10:31:24 +00:00
" None " , // PANGO_ELLIPSIZE_NONE,
" Start " , // PANGO_ELLIPSIZE_START,
" Middle " , // PANGO_ELLIPSIZE_MIDDLE,
" End " , // PANGO_ELLIPSIZE_END
} ;
if ( ! pdata )
pdata = g_new0 ( ProgressData , 1 ) ;
if ( ! pdata - > window )
{
pdata - > window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( pdata - > window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_resizable ( GTK_WINDOW ( pdata - > window ) , TRUE ) ;
g_signal_connect ( pdata - > window , " destroy " ,
G_CALLBACK ( destroy_progress ) ,
& pdata ) ;
pdata - > timer = 0 ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( pdata - > window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( pdata - > window ) , " GtkProgressBar " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( pdata - > window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 10 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , vbox , FALSE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
frame = gtk_frame_new ( " Progress " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( frame ) , vbox2 ) ;
2010-04-26 00:08:04 +00:00
pdata - > pbar = gtk_progress_bar_new ( ) ;
gtk_progress_bar_set_ellipsize ( GTK_PROGRESS_BAR ( pdata - > pbar ) ,
PANGO_ELLIPSIZE_MIDDLE ) ;
2012-12-20 18:53:04 +00:00
gtk_widget_set_halign ( pdata - > pbar , GTK_ALIGN_CENTER ) ;
gtk_widget_set_valign ( pdata - > pbar , GTK_ALIGN_CENTER ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , pdata - > pbar , FALSE , FALSE , 5 ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 5 ) ;
2012-12-20 18:53:04 +00:00
gtk_widget_set_halign ( hbox , GTK_ALIGN_CENTER ) ;
gtk_widget_set_valign ( hbox , GTK_ALIGN_CENTER ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , hbox , FALSE , FALSE , 5 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( " Label updated by user : " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , TRUE , 0 ) ;
pdata - > label = gtk_label_new ( " " ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , pdata - > label , FALSE , TRUE , 0 ) ;
frame = gtk_frame_new ( " Options " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , frame , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
vbox2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( frame ) , vbox2 ) ;
2011-09-28 17:40:11 +00:00
grid = gtk_grid_new ( ) ;
gtk_grid_set_row_spacing ( GTK_GRID ( grid ) , 10 ) ;
gtk_grid_set_column_spacing ( GTK_GRID ( grid ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( vbox2 ) , grid , FALSE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( " Orientation : " ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , label , 0 , 0 , 1 , 1 ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
pdata - > omenu1 = build_option_menu ( items1 , 4 , 0 ,
progressbar_toggle_orientation ,
pdata ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , pdata - > omenu1 , 1 , 0 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2011-03-31 13:09:07 +00:00
check = gtk_check_button_new_with_label ( " Running " ) ;
g_signal_connect ( check , " toggled " ,
G_CALLBACK ( toggle_running ) ,
pdata ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check , 0 , 1 , 2 , 1 ) ;
2011-03-31 13:09:07 +00:00
gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( check ) , TRUE ) ;
2008-02-27 10:31:24 +00:00
check = gtk_check_button_new_with_label ( " Show text " ) ;
g_signal_connect ( check , " clicked " ,
G_CALLBACK ( toggle_show_text ) ,
pdata ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check , 0 , 2 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , hbox , 1 , 2 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2010-04-26 00:08:04 +00:00
label = gtk_label_new ( " Text: " ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , label , FALSE , TRUE , 0 ) ;
pdata - > entry = gtk_entry_new ( ) ;
2011-09-28 17:40:11 +00:00
gtk_widget_set_hexpand ( pdata - > entry , TRUE ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( pdata - > entry , " changed " ,
G_CALLBACK ( entry_changed ) ,
pdata ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , pdata - > entry , TRUE , TRUE , 0 ) ;
gtk_widget_set_size_request ( pdata - > entry , 100 , - 1 ) ;
label = gtk_label_new ( " Ellipsize text : " ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , label , 0 , 10 , 1 , 1 ) ;
2011-06-13 00:00:35 +00:00
gtk_widget_set_halign ( label , GTK_ALIGN_START ) ;
gtk_widget_set_valign ( label , GTK_ALIGN_CENTER ) ;
2008-02-27 10:31:24 +00:00
pdata - > elmenu = build_option_menu ( ellipsize_items ,
sizeof ( ellipsize_items ) / sizeof ( ellipsize_items [ 0 ] ) ,
2 , // PANGO_ELLIPSIZE_MIDDLE
progressbar_toggle_ellipsize ,
pdata ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , pdata - > elmenu , 1 , 10 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
check = gtk_check_button_new_with_label ( " Activity mode " ) ;
g_signal_connect ( check , " clicked " ,
G_CALLBACK ( toggle_activity_mode ) , pdata ) ;
2011-09-28 17:40:11 +00:00
gtk_grid_attach ( GTK_GRID ( grid ) , check , 0 , 15 , 1 , 1 ) ;
2008-02-27 10:31:24 +00:00
2014-04-10 14:48:13 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( pdata - > window ) , " Close " , GTK_RESPONSE_CLOSE ) ;
g_signal_connect ( pdata - > window , " response " ,
G_CALLBACK ( gtk_widget_destroy ) ,
NULL ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( pdata - > window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( pdata - > window ) ;
else
gtk_widget_destroy ( pdata - > window ) ;
}
/*
* Properties
*/
typedef struct {
int x ;
int y ;
gboolean found ;
gboolean first ;
GtkWidget * res_widget ;
} FindWidgetData ;
static void
find_widget ( GtkWidget * widget , FindWidgetData * data )
{
GtkAllocation new_allocation ;
gint x_offset = 0 ;
gint y_offset = 0 ;
2010-08-15 22:33:57 +00:00
gtk_widget_get_allocation ( widget , & new_allocation ) ;
2008-02-27 10:31:24 +00:00
2010-03-02 04:19:28 +00:00
if ( data - > found | | ! gtk_widget_get_mapped ( widget ) )
2008-02-27 10:31:24 +00:00
return ;
/* Note that in the following code, we only count the
* position as being inside a WINDOW widget if it is inside
* widget - > window ; points that are outside of widget - > window
* but within the allocation are not counted . This is consistent
* with the way we highlight drag targets .
*/
2010-01-04 06:49:26 +00:00
if ( gtk_widget_get_has_window ( widget ) )
2008-02-27 10:31:24 +00:00
{
new_allocation . x = 0 ;
new_allocation . y = 0 ;
}
2010-08-15 22:33:57 +00:00
if ( gtk_widget_get_parent ( widget ) & & ! data - > first )
2008-02-27 10:31:24 +00:00
{
2010-08-15 22:33:57 +00:00
GdkWindow * window = gtk_widget_get_window ( widget ) ;
while ( window ! = gtk_widget_get_window ( gtk_widget_get_parent ( widget ) ) )
2008-02-27 10:31:24 +00:00
{
gint tx , ty , twidth , theight ;
2010-09-20 14:47:06 +00:00
twidth = gdk_window_get_width ( window ) ;
theight = gdk_window_get_height ( window ) ;
2008-02-27 10:31:24 +00:00
if ( new_allocation . x < 0 )
{
new_allocation . width + = new_allocation . x ;
new_allocation . x = 0 ;
}
if ( new_allocation . y < 0 )
{
new_allocation . height + = new_allocation . y ;
new_allocation . y = 0 ;
}
if ( new_allocation . x + new_allocation . width > twidth )
new_allocation . width = twidth - new_allocation . x ;
if ( new_allocation . y + new_allocation . height > theight )
new_allocation . height = theight - new_allocation . y ;
gdk_window_get_position ( window , & tx , & ty ) ;
new_allocation . x + = tx ;
x_offset + = tx ;
new_allocation . y + = ty ;
y_offset + = ty ;
2010-08-15 22:33:57 +00:00
2008-02-27 10:31:24 +00:00
window = gdk_window_get_parent ( window ) ;
}
}
if ( ( data - > x > = new_allocation . x ) & & ( data - > y > = new_allocation . y ) & &
( data - > x < new_allocation . x + new_allocation . width ) & &
( data - > y < new_allocation . y + new_allocation . height ) )
{
/* First, check if the drag is in a valid drop site in
* one of our children
*/
if ( GTK_IS_CONTAINER ( widget ) )
{
FindWidgetData new_data = * data ;
new_data . x - = x_offset ;
new_data . y - = y_offset ;
new_data . found = FALSE ;
new_data . first = FALSE ;
gtk_container_forall ( GTK_CONTAINER ( widget ) ,
( GtkCallback ) find_widget ,
& new_data ) ;
data - > found = new_data . found ;
if ( data - > found )
data - > res_widget = new_data . res_widget ;
}
/* If not, and this widget is registered as a drop site, check to
* emit " drag_motion " to check if we are actually in
* a drop site .
*/
if ( ! data - > found )
{
data - > found = TRUE ;
data - > res_widget = widget ;
}
}
}
static GtkWidget *
2010-12-27 18:27:16 +00:00
find_widget_at_pointer ( GdkDevice * device )
2008-02-27 10:31:24 +00:00
{
GtkWidget * widget = NULL ;
GdkWindow * pointer_window ;
gint x , y ;
FindWidgetData data ;
2010-12-27 18:27:16 +00:00
pointer_window = gdk_device_get_window_at_position ( device , NULL , NULL ) ;
2008-02-27 10:31:24 +00:00
if ( pointer_window )
2008-07-18 18:27:30 +00:00
{
gpointer widget_ptr ;
gdk_window_get_user_data ( pointer_window , & widget_ptr ) ;
widget = widget_ptr ;
}
2008-02-27 10:31:24 +00:00
if ( widget )
{
2011-11-09 02:13:43 +00:00
gdk_window_get_device_position ( gtk_widget_get_window ( widget ) ,
device ,
& x , & y , NULL ) ;
2008-02-27 10:31:24 +00:00
data . x = x ;
data . y = y ;
data . found = FALSE ;
data . first = TRUE ;
find_widget ( widget , & data ) ;
if ( data . found )
return data . res_widget ;
return widget ;
}
return NULL ;
}
2010-10-05 20:36:35 +00:00
struct SnapshotData {
GtkWidget * toplevel_button ;
GtkWidget * * window ;
GdkCursor * cursor ;
gboolean in_query ;
gboolean is_toplevel ;
gint handler ;
} ;
static void
destroy_snapshot_data ( GtkWidget * widget ,
struct SnapshotData * data )
{
if ( * data - > window )
* data - > window = NULL ;
if ( data - > cursor )
{
2010-12-20 02:13:47 +00:00
g_object_unref ( data - > cursor ) ;
2010-10-05 20:36:35 +00:00
data - > cursor = NULL ;
}
if ( data - > handler )
{
g_signal_handler_disconnect ( widget , data - > handler ) ;
data - > handler = 0 ;
}
g_free ( data ) ;
}
static gint
snapshot_widget_event ( GtkWidget * widget ,
GdkEvent * event ,
struct SnapshotData * data )
{
GtkWidget * res_widget = NULL ;
if ( ! data - > in_query )
return FALSE ;
if ( event - > type = = GDK_BUTTON_RELEASE )
{
gtk_grab_remove ( widget ) ;
2010-12-27 18:43:24 +00:00
gdk_device_ungrab ( gdk_event_get_device ( event ) ,
GDK_CURRENT_TIME ) ;
2010-10-05 20:36:35 +00:00
2010-12-27 18:27:16 +00:00
res_widget = find_widget_at_pointer ( gdk_event_get_device ( event ) ) ;
2010-10-05 20:36:35 +00:00
if ( data - > is_toplevel & & res_widget )
res_widget = gtk_widget_get_toplevel ( res_widget ) ;
if ( res_widget )
{
cairo_surface_t * surface ;
GtkWidget * window , * image ;
GdkPixbuf * pixbuf ;
int width , height ;
cairo_t * cr ;
width = gtk_widget_get_allocated_width ( res_widget ) ;
height = gtk_widget_get_allocated_height ( res_widget ) ;
surface = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32 , width , height ) ;
cr = cairo_create ( surface ) ;
gtk_widget_draw ( res_widget , cr ) ;
cairo_destroy ( cr ) ;
pixbuf = gdk_pixbuf_get_from_surface ( surface ,
0 , 0 ,
width , height ) ;
cairo_surface_destroy ( surface ) ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
image = gtk_image_new_from_pixbuf ( pixbuf ) ;
g_object_unref ( pixbuf ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , image ) ;
gtk_widget_show_all ( window ) ;
}
data - > in_query = FALSE ;
}
return FALSE ;
}
static void
snapshot_widget ( GtkButton * button ,
struct SnapshotData * data )
{
GtkWidget * widget = GTK_WIDGET ( button ) ;
2010-12-27 18:43:24 +00:00
GdkDevice * device ;
2010-10-05 20:36:35 +00:00
2010-12-27 18:43:24 +00:00
device = gtk_get_current_event_device ( ) ;
if ( device = = NULL )
return ;
if ( gdk_device_get_source ( device ) = = GDK_SOURCE_KEYBOARD )
device = gdk_device_get_associated_device ( device ) ;
2010-10-05 20:36:35 +00:00
data - > is_toplevel = widget = = data - > toplevel_button ;
if ( ! data - > cursor )
data - > cursor = gdk_cursor_new_for_display ( gtk_widget_get_display ( widget ) ,
GDK_TARGET ) ;
2011-02-12 12:59:25 +00:00
gdk_device_grab ( device ,
gtk_widget_get_window ( widget ) ,
GDK_OWNERSHIP_APPLICATION ,
TRUE ,
GDK_BUTTON_RELEASE_MASK ,
data - > cursor ,
GDK_CURRENT_TIME ) ;
2010-12-27 18:43:24 +00:00
g_signal_connect ( button , " event " ,
G_CALLBACK ( snapshot_widget_event ) , data ) ;
2010-10-05 20:36:35 +00:00
gtk_grab_add ( widget ) ;
data - > in_query = TRUE ;
}
static void
create_snapshot ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * button ;
GtkWidget * vbox ;
struct SnapshotData * data ;
data = g_new ( struct SnapshotData , 1 ) ;
data - > window = & window ;
data - > in_query = FALSE ;
data - > cursor = NULL ;
data - > handler = 0 ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
data - > handler = g_signal_connect ( window , " destroy " ,
G_CALLBACK ( destroy_snapshot_data ) ,
data ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " test snapshot " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 10 ) ;
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 1 ) ;
2010-10-05 20:36:35 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , vbox ) ;
button = gtk_button_new_with_label ( " Snapshot widget " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , TRUE , TRUE , 0 ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( snapshot_widget ) ,
data ) ;
button = gtk_button_new_with_label ( " Snapshot toplevel " ) ;
data - > toplevel_button = button ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , button , TRUE , TRUE , 0 ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( snapshot_widget ) ,
data ) ;
}
if ( ! gtk_widget_get_visible ( window ) )
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2008-02-27 10:31:24 +00:00
/*
* Selection Test
*/
void
2010-03-26 15:49:48 +00:00
selection_test_received ( GtkWidget * tree_view ,
2010-12-15 23:47:45 +00:00
GtkSelectionData * selection_data )
2008-02-27 10:31:24 +00:00
{
2010-03-26 15:49:48 +00:00
GtkTreeModel * model ;
GtkListStore * store ;
2008-02-27 10:31:24 +00:00
GdkAtom * atoms ;
int i , l ;
2010-12-15 23:47:45 +00:00
if ( gtk_selection_data_get_length ( selection_data ) < 0 )
2008-02-27 10:31:24 +00:00
{
g_print ( " Selection retrieval failed \n " ) ;
return ;
}
2010-12-15 23:47:45 +00:00
if ( gtk_selection_data_get_data_type ( selection_data ) ! = GDK_SELECTION_TYPE_ATOM )
2008-02-27 10:31:24 +00:00
{
g_print ( " Selection \" TARGETS \" was not returned as atoms! \n " ) ;
return ;
}
/* Clear out any current list items */
2010-03-26 15:49:48 +00:00
model = gtk_tree_view_get_model ( GTK_TREE_VIEW ( tree_view ) ) ;
store = GTK_LIST_STORE ( model ) ;
gtk_list_store_clear ( store ) ;
2008-02-27 10:31:24 +00:00
/* Add new items to list */
2010-12-15 23:47:45 +00:00
gtk_selection_data_get_targets ( selection_data ,
& atoms , & l ) ;
2008-02-27 10:31:24 +00:00
for ( i = 0 ; i < l ; i + + )
{
char * name ;
2010-03-26 15:49:48 +00:00
GtkTreeIter iter ;
2008-02-27 10:31:24 +00:00
name = gdk_atom_name ( atoms [ i ] ) ;
if ( name ! = NULL )
2010-03-26 15:49:48 +00:00
{
gtk_list_store_insert_with_values ( store , & iter , i , 0 , name , - 1 ) ;
g_free ( name ) ;
}
2008-02-27 10:31:24 +00:00
else
2010-03-26 15:49:48 +00:00
gtk_list_store_insert_with_values ( store , & iter , i , 0 , " (bad atom) " , - 1 ) ;
2008-02-27 10:31:24 +00:00
}
return ;
}
void
2014-04-10 14:53:42 +00:00
selection_test_get_targets ( GtkWidget * dialog , gint response , GtkWidget * tree_view )
2008-02-27 10:31:24 +00:00
{
static GdkAtom targets_atom = GDK_NONE ;
2014-04-10 14:53:42 +00:00
if ( response ! = GTK_RESPONSE_APPLY )
{
gtk_widget_destroy ( dialog ) ;
return ;
}
2008-02-27 10:31:24 +00:00
if ( targets_atom = = GDK_NONE )
targets_atom = gdk_atom_intern ( " TARGETS " , FALSE ) ;
2010-03-26 15:49:48 +00:00
gtk_selection_convert ( tree_view , GDK_SELECTION_PRIMARY , targets_atom ,
2008-02-27 10:31:24 +00:00
GDK_CURRENT_TIME ) ;
}
void
create_selection_test ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2014-04-10 14:53:42 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * vbox ;
GtkWidget * scrolled_win ;
2010-03-26 15:49:48 +00:00
GtkListStore * store ;
GtkWidget * tree_view ;
GtkTreeViewColumn * column ;
GtkCellRenderer * renderer ;
2008-02-27 10:31:24 +00:00
GtkWidget * label ;
if ( ! window )
{
window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " Selection Test " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
/* Create the list */
2010-10-31 17:07:20 +00:00
vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( vbox ) , 10 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , vbox , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( " Gets available targets for current selection " ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , label , FALSE , FALSE , 0 ) ;
scrolled_win = gtk_scrolled_window_new ( NULL , NULL ) ;
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_win ) ,
GTK_POLICY_AUTOMATIC ,
GTK_POLICY_AUTOMATIC ) ;
gtk_box_pack_start ( GTK_BOX ( vbox ) , scrolled_win , TRUE , TRUE , 0 ) ;
gtk_widget_set_size_request ( scrolled_win , 100 , 200 ) ;
2010-03-26 15:49:48 +00:00
store = gtk_list_store_new ( 1 , G_TYPE_STRING ) ;
tree_view = gtk_tree_view_new_with_model ( GTK_TREE_MODEL ( store ) ) ;
2013-02-01 16:22:13 +00:00
gtk_container_add ( GTK_CONTAINER ( scrolled_win ) , tree_view ) ;
2010-03-26 15:49:48 +00:00
renderer = gtk_cell_renderer_text_new ( ) ;
column = gtk_tree_view_column_new_with_attributes ( " Target " , renderer ,
" text " , 0 , NULL ) ;
gtk_tree_view_append_column ( GTK_TREE_VIEW ( tree_view ) , column ) ;
2008-02-27 10:31:24 +00:00
2010-03-26 15:49:48 +00:00
g_signal_connect ( tree_view , " selection_received " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( selection_test_received ) , NULL ) ;
/* .. And create some buttons */
2014-04-10 14:53:42 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) ,
" Get Targets " ,
GTK_RESPONSE_APPLY ) ;
2008-02-27 10:31:24 +00:00
2014-04-10 14:53:42 +00:00
g_signal_connect ( window , " response " ,
2010-03-26 15:49:48 +00:00
G_CALLBACK ( selection_test_get_targets ) , tree_view ) ;
2008-02-27 10:31:24 +00:00
2014-04-10 14:53:42 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) ,
" Quit " ,
GTK_RESPONSE_CLOSE ) ;
2008-02-27 10:31:24 +00:00
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Test scrolling
*/
static int scroll_test_pos = 0.0 ;
static gint
2010-09-09 01:33:02 +00:00
scroll_test_draw ( GtkWidget * widget ,
cairo_t * cr ,
2011-01-05 22:28:55 +00:00
GtkAdjustment * adjustment )
1997-11-24 22:37:52 +00:00
{
2008-02-27 10:31:24 +00:00
gint i , j ;
gint imin , imax , jmin , jmax ;
2010-09-09 01:33:02 +00:00
GdkRectangle clip ;
2008-02-27 10:31:24 +00:00
2010-09-09 01:33:02 +00:00
gdk_cairo_get_clip_rectangle ( cr , & clip ) ;
1998-02-21 04:46:21 +00:00
2010-09-09 01:33:02 +00:00
imin = ( clip . x ) / 10 ;
imax = ( clip . x + clip . width + 9 ) / 10 ;
2010-08-15 22:33:57 +00:00
2011-01-05 22:33:50 +00:00
jmin = ( ( int ) gtk_adjustment_get_value ( adjustment ) + clip . y ) / 10 ;
jmax = ( ( int ) gtk_adjustment_get_value ( adjustment ) + clip . y + clip . height + 9 ) / 10 ;
2010-07-15 17:05:46 +00:00
2008-02-27 10:31:24 +00:00
for ( i = imin ; i < imax ; i + + )
for ( j = jmin ; j < jmax ; j + + )
if ( ( i + j ) % 2 )
2011-01-05 22:33:50 +00:00
cairo_rectangle ( cr , 10 * i , 10 * j - ( int ) gtk_adjustment_get_value ( adjustment ) , 1 + i % 10 , 1 + j % 10 ) ;
2010-07-15 17:05:46 +00:00
cairo_fill ( cr ) ;
2008-02-27 10:31:24 +00:00
return TRUE ;
}
static gint
scroll_test_scroll ( GtkWidget * widget , GdkEventScroll * event ,
2011-01-05 22:28:55 +00:00
GtkAdjustment * adjustment )
2008-02-27 10:31:24 +00:00
{
2011-01-05 22:33:50 +00:00
gdouble new_value = gtk_adjustment_get_value ( adjustment ) + ( ( event - > direction = = GDK_SCROLL_UP ) ?
- gtk_adjustment_get_page_increment ( adjustment ) / 2 :
gtk_adjustment_get_page_increment ( adjustment ) / 2 ) ;
new_value = CLAMP ( new_value , gtk_adjustment_get_lower ( adjustment ) , gtk_adjustment_get_upper ( adjustment ) - gtk_adjustment_get_page_size ( adjustment ) ) ;
2011-01-05 22:28:55 +00:00
gtk_adjustment_set_value ( adjustment , new_value ) ;
2008-02-27 10:31:24 +00:00
return TRUE ;
}
static void
scroll_test_configure ( GtkWidget * widget , GdkEventConfigure * event ,
2011-01-05 22:28:55 +00:00
GtkAdjustment * adjustment )
2008-02-27 10:31:24 +00:00
{
2010-08-15 22:33:57 +00:00
GtkAllocation allocation ;
gtk_widget_get_allocation ( widget , & allocation ) ;
2011-01-05 22:33:50 +00:00
gtk_adjustment_configure ( adjustment ,
gtk_adjustment_get_value ( adjustment ) ,
gtk_adjustment_get_lower ( adjustment ) ,
gtk_adjustment_get_upper ( adjustment ) ,
0.1 * allocation . height ,
0.9 * allocation . height ,
allocation . height ) ;
2008-02-27 10:31:24 +00:00
}
static void
2011-01-05 22:28:55 +00:00
scroll_test_adjustment_changed ( GtkAdjustment * adjustment , GtkWidget * widget )
2008-02-27 10:31:24 +00:00
{
2010-08-15 22:33:57 +00:00
GdkWindow * window ;
2008-02-27 10:31:24 +00:00
gint dy ;
2011-01-05 22:33:50 +00:00
dy = scroll_test_pos - ( int ) gtk_adjustment_get_value ( adjustment ) ;
scroll_test_pos = gtk_adjustment_get_value ( adjustment ) ;
2008-02-27 10:31:24 +00:00
2010-01-07 15:47:35 +00:00
if ( ! gtk_widget_is_drawable ( widget ) )
2008-02-27 10:31:24 +00:00
return ;
2010-08-15 22:33:57 +00:00
window = gtk_widget_get_window ( widget ) ;
gdk_window_scroll ( window , 0 , dy ) ;
gdk_window_process_updates ( window , FALSE ) ;
2008-02-27 10:31:24 +00:00
}
void
create_scroll_test ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2014-04-10 00:40:49 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * hbox ;
GtkWidget * drawing_area ;
GtkWidget * scrollbar ;
2011-01-05 22:28:55 +00:00
GtkAdjustment * adjustment ;
2008-02-27 10:31:24 +00:00
GdkGeometry geometry ;
GdkWindowHints geometry_mask ;
if ( ! window )
{
window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " Scroll Test " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
2010-10-31 17:07:20 +00:00
hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL , 0 ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , hbox , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( hbox ) ;
drawing_area = gtk_drawing_area_new ( ) ;
gtk_widget_set_size_request ( drawing_area , 200 , 200 ) ;
gtk_box_pack_start ( GTK_BOX ( hbox ) , drawing_area , TRUE , TRUE , 0 ) ;
gtk_widget_show ( drawing_area ) ;
gtk_widget_set_events ( drawing_area , GDK_EXPOSURE_MASK | GDK_SCROLL_MASK ) ;
2011-01-05 22:28:55 +00:00
adjustment = gtk_adjustment_new ( 0.0 , 0.0 , 1000.0 , 1.0 , 180.0 , 200.0 ) ;
2008-02-27 10:31:24 +00:00
scroll_test_pos = 0.0 ;
2011-01-05 22:28:55 +00:00
scrollbar = gtk_scrollbar_new ( GTK_ORIENTATION_VERTICAL , adjustment ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( hbox ) , scrollbar , FALSE , FALSE , 0 ) ;
gtk_widget_show ( scrollbar ) ;
2010-09-09 01:33:02 +00:00
g_signal_connect ( drawing_area , " draw " ,
2011-01-05 22:28:55 +00:00
G_CALLBACK ( scroll_test_draw ) , adjustment ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( drawing_area , " configure_event " ,
2011-01-05 22:28:55 +00:00
G_CALLBACK ( scroll_test_configure ) , adjustment ) ;
2008-02-27 10:31:24 +00:00
g_signal_connect ( drawing_area , " scroll_event " ,
2011-01-05 22:28:55 +00:00
G_CALLBACK ( scroll_test_scroll ) , adjustment ) ;
2008-02-27 10:31:24 +00:00
2011-01-05 22:28:55 +00:00
g_signal_connect ( adjustment , " value_changed " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( scroll_test_adjustment_changed ) ,
drawing_area ) ;
/* .. And create some buttons */
2014-04-10 00:40:49 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) ,
" Quit " ,
GTK_RESPONSE_CLOSE ) ;
g_signal_connect_swapped ( window , " response " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
/* Set up gridded geometry */
geometry_mask = GDK_HINT_MIN_SIZE |
GDK_HINT_BASE_SIZE |
GDK_HINT_RESIZE_INC ;
geometry . min_width = 20 ;
geometry . min_height = 20 ;
geometry . base_width = 0 ;
geometry . base_height = 0 ;
geometry . width_inc = 10 ;
geometry . height_inc = 10 ;
gtk_window_set_geometry_hints ( GTK_WINDOW ( window ) ,
drawing_area , & geometry , geometry_mask ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Timeout Test
*/
static int timer = 0 ;
gint
timeout_test ( GtkWidget * label )
{
static int count = 0 ;
static char buffer [ 32 ] ;
sprintf ( buffer , " count: %d " , + + count ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , buffer ) ;
return TRUE ;
}
void
start_timeout_test ( GtkWidget * widget ,
GtkWidget * label )
{
if ( ! timer )
{
2009-10-22 03:17:29 +00:00
timer = g_timeout_add ( 100 , ( GSourceFunc ) timeout_test , label ) ;
2008-02-27 10:31:24 +00:00
}
}
void
stop_timeout_test ( GtkWidget * widget ,
gpointer data )
{
if ( timer )
{
2009-10-22 03:17:29 +00:00
g_source_remove ( timer ) ;
2008-02-27 10:31:24 +00:00
timer = 0 ;
}
}
void
destroy_timeout_test ( GtkWidget * widget ,
GtkWidget * * window )
{
stop_timeout_test ( NULL , NULL ) ;
* window = NULL ;
}
void
create_timeout_test ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2010-06-03 07:36:39 +00:00
GtkWidget * action_area , * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * button ;
GtkWidget * label ;
if ( ! window )
{
window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( destroy_timeout_test ) ,
& window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
action_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_title ( GTK_WINDOW ( window ) , " Timeout Test " ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( window ) , 0 ) ;
label = gtk_label_new ( " count: 0 " ) ;
2011-06-02 11:37:43 +00:00
g_object_set ( label , " margin " , 10 , NULL ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , label , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( label ) ;
button = gtk_button_new_with_label ( " close " ) ;
g_signal_connect_swapped ( button , " clicked " ,
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( action_area ) , button , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
gtk_widget_show ( button ) ;
button = gtk_button_new_with_label ( " start " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( start_timeout_test ) ,
label ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( action_area ) , button , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( button ) ;
button = gtk_button_new_with_label ( " stop " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( stop_timeout_test ) ,
NULL ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( action_area ) , button , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( button ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
/*
* Test of recursive mainloop
*/
2001-08-04 23:30:11 +00:00
2008-02-27 10:31:24 +00:00
void
mainloop_destroyed ( GtkWidget * w , GtkWidget * * window )
{
* window = NULL ;
gtk_main_quit ( ) ;
}
void
create_mainloop ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
2014-04-10 00:36:38 +00:00
GtkWidget * content_area ;
2008-02-27 10:31:24 +00:00
GtkWidget * label ;
if ( ! window )
{
window = gtk_dialog_new ( ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Test Main Loop " ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( mainloop_destroyed ) ,
& window ) ;
2010-06-03 07:36:39 +00:00
content_area = gtk_dialog_get_content_area ( GTK_DIALOG ( window ) ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( " In recursive main loop... " ) ;
2011-06-02 11:37:43 +00:00
g_object_set ( label , " margin " , 20 , NULL ) ;
2008-02-27 10:31:24 +00:00
2010-06-03 07:36:39 +00:00
gtk_box_pack_start ( GTK_BOX ( content_area ) , label , TRUE , TRUE , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_show ( label ) ;
2014-04-10 00:36:38 +00:00
gtk_dialog_add_button ( GTK_DIALOG ( window ) ,
" Leave " ,
GTK_RESPONSE_OK ) ;
g_signal_connect_swapped ( window , " response " ,
2008-02-27 10:31:24 +00:00
G_CALLBACK ( gtk_widget_destroy ) ,
window ) ;
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
{
gtk_widget_show ( window ) ;
g_print ( " create_mainloop: start \n " ) ;
gtk_main ( ) ;
g_print ( " create_mainloop: done \n " ) ;
}
else
gtk_widget_destroy ( window ) ;
}
2010-09-09 01:39:43 +00:00
static gboolean
layout_draw_handler ( GtkWidget * widget , cairo_t * cr )
2008-02-27 10:31:24 +00:00
{
GtkLayout * layout ;
2010-06-28 02:51:34 +00:00
GdkWindow * bin_window ;
2010-09-09 01:39:43 +00:00
GdkRectangle clip ;
gint i , j , x , y ;
2008-02-27 10:31:24 +00:00
gint imin , imax , jmin , jmax ;
layout = GTK_LAYOUT ( widget ) ;
2010-06-28 02:51:34 +00:00
bin_window = gtk_layout_get_bin_window ( layout ) ;
2010-09-09 01:39:43 +00:00
if ( ! gtk_cairo_should_draw_window ( cr , bin_window ) )
2008-02-27 10:31:24 +00:00
return FALSE ;
2010-09-09 01:39:43 +00:00
gdk_window_get_position ( bin_window , & x , & y ) ;
cairo_translate ( cr , x , y ) ;
2008-02-27 10:31:24 +00:00
2010-09-09 01:39:43 +00:00
gdk_cairo_get_clip_rectangle ( cr , & clip ) ;
imin = ( clip . x ) / 10 ;
imax = ( clip . x + clip . width + 9 ) / 10 ;
2008-02-27 10:31:24 +00:00
2010-09-09 01:39:43 +00:00
jmin = ( clip . y ) / 10 ;
jmax = ( clip . y + clip . height + 9 ) / 10 ;
2010-07-15 17:05:46 +00:00
2008-02-27 10:31:24 +00:00
for ( i = imin ; i < imax ; i + + )
for ( j = jmin ; j < jmax ; j + + )
if ( ( i + j ) % 2 )
2010-07-15 17:05:46 +00:00
cairo_rectangle ( cr ,
10 * i , 10 * j ,
1 + i % 10 , 1 + j % 10 ) ;
2008-02-27 10:31:24 +00:00
2010-07-15 17:05:46 +00:00
cairo_fill ( cr ) ;
2008-02-27 10:31:24 +00:00
return FALSE ;
}
void create_layout ( GtkWidget * widget )
{
2010-06-28 02:51:34 +00:00
GtkAdjustment * hadjustment , * vadjustment ;
GtkLayout * layout ;
2008-02-27 10:31:24 +00:00
static GtkWidget * window = NULL ;
2010-06-28 02:51:34 +00:00
GtkWidget * layout_widget ;
2008-02-27 10:31:24 +00:00
GtkWidget * scrolledwindow ;
GtkWidget * button ;
if ( ! window )
{
gchar buf [ 16 ] ;
gint i , j ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Layout " ) ;
gtk_widget_set_size_request ( window , 200 , 200 ) ;
scrolledwindow = gtk_scrolled_window_new ( NULL , NULL ) ;
gtk_scrolled_window_set_shadow_type ( GTK_SCROLLED_WINDOW ( scrolledwindow ) ,
GTK_SHADOW_IN ) ;
gtk_scrolled_window_set_placement ( GTK_SCROLLED_WINDOW ( scrolledwindow ) ,
GTK_CORNER_TOP_RIGHT ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , scrolledwindow ) ;
2010-06-28 02:51:34 +00:00
layout_widget = gtk_layout_new ( NULL , NULL ) ;
layout = GTK_LAYOUT ( layout_widget ) ;
gtk_container_add ( GTK_CONTAINER ( scrolledwindow ) , layout_widget ) ;
2008-02-27 10:31:24 +00:00
/* We set step sizes here since GtkLayout does not set
* them itself .
*/
2010-10-28 16:16:55 +00:00
hadjustment = gtk_scrollable_get_hadjustment ( GTK_SCROLLABLE ( layout ) ) ;
vadjustment = gtk_scrollable_get_vadjustment ( GTK_SCROLLABLE ( layout ) ) ;
2010-06-28 02:51:34 +00:00
gtk_adjustment_set_step_increment ( hadjustment , 10.0 ) ;
gtk_adjustment_set_step_increment ( vadjustment , 10.0 ) ;
2010-10-28 16:16:55 +00:00
gtk_scrollable_set_hadjustment ( GTK_SCROLLABLE ( layout ) , hadjustment ) ;
gtk_scrollable_set_vadjustment ( GTK_SCROLLABLE ( layout ) , vadjustment ) ;
2010-06-28 02:51:34 +00:00
gtk_widget_set_events ( layout_widget , GDK_EXPOSURE_MASK ) ;
2010-09-09 01:39:43 +00:00
g_signal_connect ( layout , " draw " ,
G_CALLBACK ( layout_draw_handler ) , NULL ) ;
2010-06-28 02:51:34 +00:00
gtk_layout_set_size ( layout , 1600 , 128000 ) ;
2008-02-27 10:31:24 +00:00
for ( i = 0 ; i < 16 ; i + + )
for ( j = 0 ; j < 16 ; j + + )
{
sprintf ( buf , " Button %d, %d " , i , j ) ;
if ( ( i + j ) % 2 )
button = gtk_button_new_with_label ( buf ) ;
else
button = gtk_label_new ( buf ) ;
2010-06-28 02:51:34 +00:00
gtk_layout_put ( layout , button , j * 100 , i * 100 ) ;
2008-02-27 10:31:24 +00:00
}
for ( i = 16 ; i < 1280 ; i + + )
{
sprintf ( buf , " Button %d, %d " , i , 0 ) ;
if ( i % 2 )
button = gtk_button_new_with_label ( buf ) ;
else
button = gtk_label_new ( buf ) ;
2010-06-28 02:51:34 +00:00
gtk_layout_put ( layout , button , 0 , i * 100 ) ;
2008-02-27 10:31:24 +00:00
}
}
2010-03-01 06:47:38 +00:00
if ( ! gtk_widget_get_visible ( window ) )
2008-02-27 10:31:24 +00:00
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2015-11-02 15:19:02 +00:00
static void
show_native ( GtkWidget * button ,
GtkFileChooserNative * native )
{
gtk_native_dialog_show ( GTK_NATIVE_DIALOG ( native ) ) ;
}
static void
hide_native ( GtkWidget * button ,
GtkFileChooserNative * native )
{
gtk_native_dialog_hide ( GTK_NATIVE_DIALOG ( native ) ) ;
}
static void
native_response ( GtkNativeDialog * self ,
gint response_id ,
GtkWidget * label )
{
static int count = 0 ;
char * res ;
GSList * uris , * l ;
GString * s ;
char * response ;
uris = gtk_file_chooser_get_uris ( GTK_FILE_CHOOSER ( self ) ) ;
s = g_string_new ( " " ) ;
for ( l = uris ; l ! = NULL ; l = l - > next )
{
g_string_prepend ( s , l - > data ) ;
g_string_prepend ( s , " \n " ) ;
}
switch ( response_id )
{
case GTK_RESPONSE_NONE :
response = g_strdup ( " GTK_RESPONSE_NONE " ) ;
break ;
case GTK_RESPONSE_ACCEPT :
response = g_strdup ( " GTK_RESPONSE_ACCEPT " ) ;
break ;
case GTK_RESPONSE_CANCEL :
response = g_strdup ( " GTK_RESPONSE_CANCEL " ) ;
break ;
case GTK_RESPONSE_DELETE_EVENT :
response = g_strdup ( " GTK_RESPONSE_DELETE_EVENT " ) ;
break ;
default :
response = g_strdup_printf ( " %d " , response_id ) ;
break ;
}
res = g_strdup_printf ( " Response #%d: %s \n "
" Files: \n "
" %s " ,
+ + count ,
response ,
s - > str ) ;
gtk_label_set_text ( GTK_LABEL ( label ) , res ) ;
g_free ( response ) ;
g_string_free ( s , TRUE ) ;
}
static void
native_modal_toggle ( GtkWidget * checkbutton ,
GtkFileChooserNative * native )
{
gtk_native_dialog_set_modal ( GTK_NATIVE_DIALOG ( native ) ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
}
static void
native_multi_select_toggle ( GtkWidget * checkbutton ,
GtkFileChooserNative * native )
{
gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER ( native ) ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
}
static void
native_overwrite_confirmation_toggle ( GtkWidget * checkbutton ,
GtkFileChooserNative * native )
{
gtk_file_chooser_set_do_overwrite_confirmation ( GTK_FILE_CHOOSER ( native ) ,
gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ) ;
}
static void
native_extra_widget_toggle ( GtkWidget * checkbutton ,
GtkFileChooserNative * native )
{
gboolean extra_widget = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( checkbutton ) ) ;
if ( extra_widget )
{
GtkWidget * extra = gtk_check_button_new_with_label ( " Extra toggle " ) ;
gtk_widget_show ( extra ) ;
gtk_file_chooser_set_extra_widget ( GTK_FILE_CHOOSER ( native ) , extra ) ;
}
else
{
gtk_file_chooser_set_extra_widget ( GTK_FILE_CHOOSER ( native ) , NULL ) ;
}
}
static void
native_visible_notify_show ( GObject * object ,
GParamSpec * pspec ,
GtkWidget * show_button )
{
GtkFileChooserNative * native = GTK_FILE_CHOOSER_NATIVE ( object ) ;
gboolean visible ;
visible = gtk_native_dialog_get_visible ( GTK_NATIVE_DIALOG ( native ) ) ;
gtk_widget_set_sensitive ( show_button , ! visible ) ;
}
static void
native_visible_notify_hide ( GObject * object ,
GParamSpec * pspec ,
GtkWidget * hide_button )
{
GtkFileChooserNative * native = GTK_FILE_CHOOSER_NATIVE ( object ) ;
gboolean visible ;
visible = gtk_native_dialog_get_visible ( GTK_NATIVE_DIALOG ( native ) ) ;
gtk_widget_set_sensitive ( hide_button , visible ) ;
}
static char *
get_some_file ( void )
{
GFile * dir = g_file_new_for_path ( g_get_current_dir ( ) ) ;
GFileEnumerator * e ;
char * res = NULL ;
e = g_file_enumerate_children ( dir , " * " , 0 , NULL , NULL ) ;
if ( e )
{
GFileInfo * info ;
while ( res = = NULL )
{
info = g_file_enumerator_next_file ( e , NULL , NULL ) ;
if ( info )
{
if ( g_file_info_get_file_type ( info ) = = G_FILE_TYPE_REGULAR )
{
GFile * child = g_file_enumerator_get_child ( e , info ) ;
res = g_file_get_path ( child ) ;
g_object_unref ( child ) ;
}
g_object_unref ( info ) ;
}
else
break ;
}
}
return res ;
}
static void
native_action_changed ( GtkWidget * combo ,
GtkFileChooserNative * native )
{
int i ;
gboolean save_as = FALSE ;
i = gtk_combo_box_get_active ( GTK_COMBO_BOX ( combo ) ) ;
if ( i = = 4 ) /* Save as */
{
save_as = TRUE ;
i = GTK_FILE_CHOOSER_ACTION_SAVE ;
}
gtk_file_chooser_set_action ( GTK_FILE_CHOOSER ( native ) ,
( GtkFileChooserAction ) i ) ;
if ( i = = GTK_FILE_CHOOSER_ACTION_SAVE | |
i = = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER )
{
if ( save_as )
{
char * file = get_some_file ( ) ;
gtk_file_chooser_set_filename ( GTK_FILE_CHOOSER ( native ) , file ) ;
g_free ( file ) ;
}
else
gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER ( native ) , " newname.txt " ) ;
}
}
static void
native_filter_changed ( GtkWidget * combo ,
GtkFileChooserNative * native )
{
int i ;
GSList * filters , * l ;
GtkFileFilter * filter ;
i = gtk_combo_box_get_active ( GTK_COMBO_BOX ( combo ) ) ;
filters = gtk_file_chooser_list_filters ( GTK_FILE_CHOOSER ( native ) ) ;
for ( l = filters ; l ! = NULL ; l = l - > next )
gtk_file_chooser_remove_filter ( GTK_FILE_CHOOSER ( native ) , l - > data ) ;
g_slist_free ( filters ) ;
switch ( i )
{
case 0 :
break ;
case 1 : /* pattern */
filter = gtk_file_filter_new ( ) ;
gtk_file_filter_set_name ( filter , " Text " ) ;
gtk_file_filter_add_pattern ( filter , " *.doc " ) ;
gtk_file_filter_add_pattern ( filter , " *.txt " ) ;
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( native ) , filter ) ;
filter = gtk_file_filter_new ( ) ;
gtk_file_filter_set_name ( filter , " Images " ) ;
gtk_file_filter_add_pixbuf_formats ( filter ) ;
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( native ) , filter ) ;
filter = gtk_file_filter_new ( ) ;
gtk_file_filter_set_name ( filter , " All " ) ;
gtk_file_filter_add_pattern ( filter , " * " ) ;
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( native ) , filter ) ;
break ;
case 2 : /* mimetype */
filter = gtk_file_filter_new ( ) ;
gtk_file_filter_set_name ( filter , " Text " ) ;
gtk_file_filter_add_mime_type ( filter , " text/plain " ) ;
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( native ) , filter ) ;
filter = gtk_file_filter_new ( ) ;
gtk_file_filter_set_name ( filter , " All " ) ;
gtk_file_filter_add_pattern ( filter , " * " ) ;
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( native ) , filter ) ;
break ;
}
}
2015-11-11 15:06:44 +00:00
static void
destroy_native ( GtkFileChooserNative * native )
{
gtk_native_dialog_destroy ( GTK_NATIVE_DIALOG ( native ) ) ;
g_object_unref ( native ) ;
}
2015-11-02 15:19:02 +00:00
void
create_native_dialogs ( GtkWidget * widget )
{
static GtkWidget * window = NULL ;
GtkWidget * box , * label ;
GtkWidget * show_button , * hide_button , * check_button ;
GtkFileChooserNative * native ;
GtkWidget * combo ;
if ( ! window )
{
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
gtk_window_set_screen ( GTK_WINDOW ( window ) ,
gtk_widget_get_screen ( widget ) ) ;
native = gtk_file_chooser_native_new ( " Native title " ,
GTK_WINDOW ( window ) ,
GTK_FILE_CHOOSER_ACTION_OPEN ,
" _accept&native " ,
" _cancel__native " ) ;
2015-11-11 15:06:44 +00:00
g_signal_connect_swapped ( G_OBJECT ( window ) , " destroy " , G_CALLBACK ( destroy_native ) , native ) ;
2015-11-02 15:19:02 +00:00
gtk_file_chooser_add_shortcut_folder ( GTK_FILE_CHOOSER ( native ) ,
g_get_current_dir ( ) ,
NULL ) ;
gtk_window_set_title ( GTK_WINDOW ( window ) , " Native dialog parent " ) ;
box = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 5 ) ;
gtk_container_add ( GTK_CONTAINER ( window ) , box ) ;
label = gtk_label_new ( " " ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , label , FALSE , FALSE , 4 ) ;
combo = gtk_combo_box_text_new ( ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Open " ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Save " ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Select Folder " ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Create Folder " ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Save as " ) ;
g_signal_connect ( combo , " changed " ,
G_CALLBACK ( native_action_changed ) , native ) ;
gtk_combo_box_set_active ( GTK_COMBO_BOX ( combo ) , GTK_FILE_CHOOSER_ACTION_OPEN ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , combo , FALSE , FALSE , 4 ) ;
combo = gtk_combo_box_text_new ( ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " No filters " ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Pattern filter " ) ;
gtk_combo_box_text_append_text ( GTK_COMBO_BOX_TEXT ( combo ) , " Mimetype filter " ) ;
g_signal_connect ( combo , " changed " ,
G_CALLBACK ( native_filter_changed ) , native ) ;
gtk_combo_box_set_active ( GTK_COMBO_BOX ( combo ) , 0 ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , combo , FALSE , FALSE , 4 ) ;
check_button = gtk_check_button_new_with_label ( " Modal " ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( native_modal_toggle ) , native ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , check_button , FALSE , FALSE , 4 ) ;
check_button = gtk_check_button_new_with_label ( " Multiple select " ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( native_multi_select_toggle ) , native ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , check_button , FALSE , FALSE , 4 ) ;
check_button = gtk_check_button_new_with_label ( " Confirm overwrite " ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( native_overwrite_confirmation_toggle ) , native ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , check_button , FALSE , FALSE , 4 ) ;
check_button = gtk_check_button_new_with_label ( " Extra widget " ) ;
g_signal_connect ( check_button , " toggled " ,
G_CALLBACK ( native_extra_widget_toggle ) , native ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , check_button , FALSE , FALSE , 4 ) ;
show_button = gtk_button_new_with_label ( " Show " ) ;
hide_button = gtk_button_new_with_label ( " Hide " ) ;
gtk_widget_set_sensitive ( hide_button , FALSE ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , show_button , FALSE , FALSE , 4 ) ;
gtk_box_pack_start ( GTK_BOX ( box ) , hide_button , FALSE , FALSE , 4 ) ;
/* connect signals */
g_signal_connect ( native , " response " ,
G_CALLBACK ( native_response ) , label ) ;
g_signal_connect ( show_button , " clicked " ,
G_CALLBACK ( show_native ) , native ) ;
g_signal_connect ( hide_button , " clicked " ,
G_CALLBACK ( hide_native ) , native ) ;
g_signal_connect ( native , " notify::visible " ,
G_CALLBACK ( native_visible_notify_show ) , show_button ) ;
g_signal_connect ( native , " notify::visible " ,
G_CALLBACK ( native_visible_notify_hide ) , hide_button ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_widget_destroyed ) ,
& window ) ;
}
if ( ! gtk_widget_get_visible ( window ) )
gtk_widget_show_all ( window ) ;
else
gtk_widget_destroy ( window ) ;
}
2008-02-27 10:31:24 +00:00
/*
* Main Window and Exit
*/
2001-08-04 23:30:11 +00:00
2008-02-27 10:31:24 +00:00
void
do_exit ( GtkWidget * widget , GtkWidget * window )
{
gtk_widget_destroy ( window ) ;
gtk_main_quit ( ) ;
}
struct {
char * label ;
void ( * func ) ( GtkWidget * widget ) ;
gboolean do_not_benchmark ;
} buttons [ ] =
{
{ " alpha window " , create_alpha_window } ,
2013-02-04 10:14:41 +00:00
{ " alpha widget " , create_alpha_widgets } ,
2008-02-27 10:31:24 +00:00
{ " big windows " , create_big_windows } ,
{ " button box " , create_button_box } ,
{ " buttons " , create_buttons } ,
{ " check buttons " , create_check_buttons } ,
{ " color selection " , create_color_selection } ,
{ " composited window " , create_composited_window } ,
{ " cursors " , create_cursors } ,
2009-07-26 17:05:45 +00:00
{ " dialog " , create_dialog } ,
2013-04-04 14:36:09 +00:00
{ " display " , create_display_screen , TRUE } ,
2008-02-27 10:31:24 +00:00
{ " entry " , create_entry } ,
{ " event box " , create_event_box } ,
{ " event watcher " , create_event_watcher } ,
{ " expander " , create_expander } ,
{ " flipping " , create_flipping } ,
{ " focus " , create_focus } ,
{ " font selection " , create_font_selection } ,
{ " image " , create_image } ,
{ " key lookup " , create_key_lookup } ,
{ " labels " , create_labels } ,
{ " layout " , create_layout } ,
2013-06-10 12:15:56 +00:00
{ " listbox " , create_listbox } ,
2008-02-27 10:31:24 +00:00
{ " menus " , create_menus } ,
{ " message dialog " , create_message_dialog } ,
{ " modal window " , create_modal_window , TRUE } ,
2015-11-02 15:19:02 +00:00
{ " native dialogs " , create_native_dialogs } ,
2008-02-27 10:31:24 +00:00
{ " notebook " , create_notebook } ,
{ " panes " , create_panes } ,
{ " paned keyboard " , create_paned_keyboard_navigation } ,
2010-08-06 20:12:24 +00:00
{ " pixbuf " , create_pixbuf } ,
2008-02-27 10:31:24 +00:00
{ " progress bar " , create_progress_bar } ,
{ " radio buttons " , create_radio_buttons } ,
{ " range controls " , create_range_controls } ,
{ " reparent " , create_reparent } ,
{ " resize grips " , create_resize_grips } ,
{ " rotated label " , create_rotated_label } ,
{ " rotated text " , create_rotated_text } ,
{ " saved position " , create_saved_position } ,
{ " scrolled windows " , create_scrolled_windows } ,
{ " shapes " , create_shapes } ,
{ " size groups " , create_size_groups } ,
2010-10-05 20:36:35 +00:00
{ " snapshot " , create_snapshot } ,
2008-02-27 10:31:24 +00:00
{ " spinbutton " , create_spins } ,
{ " statusbar " , create_statusbar } ,
{ " test mainloop " , create_mainloop , TRUE } ,
{ " test scrolling " , create_scroll_test } ,
{ " test selection " , create_selection_test } ,
{ " test timeout " , create_timeout_test } ,
{ " toggle buttons " , create_toggle_buttons } ,
{ " toolbar " , create_toolbar } ,
{ " tooltips " , create_tooltips } ,
{ " WM hints " , create_wmhints } ,
{ " window sizing " , create_window_sizing } ,
{ " window states " , create_window_states }
} ;
int nbuttons = sizeof ( buttons ) / sizeof ( buttons [ 0 ] ) ;
void
create_main_window ( void )
{
GtkWidget * window ;
GtkWidget * box1 ;
GtkWidget * box2 ;
GtkWidget * scrolled_window ;
GtkWidget * button ;
GtkWidget * label ;
gchar buffer [ 64 ] ;
GtkWidget * separator ;
GdkGeometry geometry ;
int i ;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
2010-11-13 20:19:41 +00:00
gtk_widget_set_name ( window , " main_window " ) ;
2010-04-13 16:32:10 +00:00
gtk_window_move ( GTK_WINDOW ( window ) , 50 , 20 ) ;
2008-02-27 10:31:24 +00:00
gtk_window_set_default_size ( GTK_WINDOW ( window ) , - 1 , 400 ) ;
geometry . min_width = - 1 ;
geometry . min_height = - 1 ;
geometry . max_width = - 1 ;
geometry . max_height = G_MAXSHORT ;
gtk_window_set_geometry_hints ( GTK_WINDOW ( window ) , NULL ,
& geometry ,
GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE ) ;
g_signal_connect ( window , " destroy " ,
G_CALLBACK ( gtk_main_quit ) ,
NULL ) ;
g_signal_connect ( window , " delete-event " ,
G_CALLBACK ( gtk_false ) ,
NULL ) ;
2010-10-31 17:07:20 +00:00
box1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_add ( GTK_CONTAINER ( window ) , box1 ) ;
if ( gtk_micro_version > 0 )
sprintf ( buffer ,
" Gtk+ v%d.%d.%d " ,
2010-09-09 08:03:22 +00:00
gtk_get_major_version ( ) ,
gtk_get_minor_version ( ) ,
gtk_get_micro_version ( ) ) ;
2008-02-27 10:31:24 +00:00
else
sprintf ( buffer ,
" Gtk+ v%d.%d " ,
2010-09-09 08:03:22 +00:00
gtk_get_major_version ( ) ,
gtk_get_minor_version ( ) ) ;
2008-02-27 10:31:24 +00:00
label = gtk_label_new ( buffer ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , label , FALSE , FALSE , 0 ) ;
gtk_widget_set_name ( label , " testgtk-version-label " ) ;
scrolled_window = gtk_scrolled_window_new ( NULL , NULL ) ;
gtk_container_set_border_width ( GTK_CONTAINER ( scrolled_window ) , 10 ) ;
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ) ,
GTK_POLICY_NEVER ,
GTK_POLICY_AUTOMATIC ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , scrolled_window , TRUE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 0 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
2013-02-01 16:22:13 +00:00
gtk_container_add ( GTK_CONTAINER ( scrolled_window ) , box2 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_focus_vadjustment ( GTK_CONTAINER ( box2 ) ,
gtk_scrolled_window_get_vadjustment ( GTK_SCROLLED_WINDOW ( scrolled_window ) ) ) ;
gtk_widget_show ( box2 ) ;
for ( i = 0 ; i < nbuttons ; i + + )
{
button = gtk_button_new_with_label ( buttons [ i ] . label ) ;
if ( buttons [ i ] . func )
g_signal_connect ( button ,
" clicked " ,
G_CALLBACK ( buttons [ i ] . func ) ,
NULL ) ;
else
gtk_widget_set_sensitive ( button , FALSE ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
}
2010-10-29 23:32:34 +00:00
separator = gtk_separator_new ( GTK_ORIENTATION_HORIZONTAL ) ;
2008-02-27 10:31:24 +00:00
gtk_box_pack_start ( GTK_BOX ( box1 ) , separator , FALSE , TRUE , 0 ) ;
2010-10-31 17:07:20 +00:00
box2 = gtk_box_new ( GTK_ORIENTATION_VERTICAL , 10 ) ;
2008-02-27 10:31:24 +00:00
gtk_container_set_border_width ( GTK_CONTAINER ( box2 ) , 10 ) ;
gtk_box_pack_start ( GTK_BOX ( box1 ) , box2 , FALSE , TRUE , 0 ) ;
button = gtk_button_new_with_mnemonic ( " _Close " ) ;
g_signal_connect ( button , " clicked " ,
G_CALLBACK ( do_exit ) ,
window ) ;
gtk_box_pack_start ( GTK_BOX ( box2 ) , button , TRUE , TRUE , 0 ) ;
2010-03-02 06:58:05 +00:00
gtk_widget_set_can_default ( button , TRUE ) ;
2008-02-27 10:31:24 +00:00
gtk_widget_grab_default ( button ) ;
2000-06-21 16:19:59 +00:00
2008-02-21 18:03:04 +00:00
gtk_widget_show_all ( window ) ;
2008-02-27 10:31:24 +00:00
}
2000-06-21 16:19:59 +00:00
2008-02-27 10:31:24 +00:00
static void
test_init ( void )
{
2011-03-29 13:26:03 +00:00
if ( g_file_test ( " ../modules/input/immodules.cache " , G_FILE_TEST_EXISTS ) )
g_setenv ( " GTK_IM_MODULE_FILE " , " ../modules/input/immodules.cache " , TRUE ) ;
2008-02-27 10:31:24 +00:00
}
2001-02-04 07:05:29 +00:00
2008-02-27 10:31:24 +00:00
static char *
pad ( const char * str , int to )
{
static char buf [ 256 ] ;
int len = strlen ( str ) ;
int i ;
for ( i = 0 ; i < to ; i + + )
buf [ i ] = ' ' ;
buf [ to ] = ' \0 ' ;
memcpy ( buf , str , len ) ;
return buf ;
}
static void
bench_iteration ( GtkWidget * widget , void ( * fn ) ( GtkWidget * widget ) )
{
fn ( widget ) ; /* on */
while ( g_main_context_iteration ( NULL , FALSE ) ) ;
fn ( widget ) ; /* off */
while ( g_main_context_iteration ( NULL , FALSE ) ) ;
}
void
do_real_bench ( GtkWidget * widget , void ( * fn ) ( GtkWidget * widget ) , char * name , int num )
{
GTimeVal tv0 , tv1 ;
double dt_first ;
double dt ;
int n ;
static gboolean printed_headers = FALSE ;
if ( ! printed_headers ) {
g_print ( " Test Iters First Other \n " ) ;
g_print ( " -------------------- ----- ---------- ---------- \n " ) ;
printed_headers = TRUE ;
}
g_get_current_time ( & tv0 ) ;
bench_iteration ( widget , fn ) ;
g_get_current_time ( & tv1 ) ;
dt_first = ( ( double ) tv1 . tv_sec - tv0 . tv_sec ) * 1000.0
+ ( tv1 . tv_usec - tv0 . tv_usec ) / 1000.0 ;
g_get_current_time ( & tv0 ) ;
for ( n = 0 ; n < num - 1 ; n + + )
bench_iteration ( widget , fn ) ;
g_get_current_time ( & tv1 ) ;
dt = ( ( double ) tv1 . tv_sec - tv0 . tv_sec ) * 1000.0
+ ( tv1 . tv_usec - tv0 . tv_usec ) / 1000.0 ;
g_print ( " %s %5d " , pad ( name , 20 ) , num ) ;
if ( num > 1 )
g_print ( " %10.1f %10.1f \n " , dt_first , dt / ( num - 1 ) ) ;
else
g_print ( " %10.1f \n " , dt_first ) ;
}
void
do_bench ( char * what , int num )
{
int i ;
GtkWidget * widget ;
void ( * fn ) ( GtkWidget * widget ) ;
fn = NULL ;
widget = gtk_window_new ( GTK_WINDOW_TOPLEVEL ) ;
if ( g_ascii_strcasecmp ( what , " ALL " ) = = 0 )
{
for ( i = 0 ; i < nbuttons ; i + + )
{
if ( ! buttons [ i ] . do_not_benchmark )
do_real_bench ( widget , buttons [ i ] . func , buttons [ i ] . label , num ) ;
}
return ;
}
else
{
for ( i = 0 ; i < nbuttons ; i + + )
{
if ( strcmp ( buttons [ i ] . label , what ) = = 0 )
{
fn = buttons [ i ] . func ;
break ;
}
}
if ( ! fn )
g_print ( " Can't bench: \" %s \" not found. \n " , what ) ;
else
do_real_bench ( widget , fn , buttons [ i ] . label , num ) ;
}
1997-11-24 22:37:52 +00:00
}
2008-02-21 18:03:04 +00:00
2008-02-27 10:31:24 +00:00
void
usage ( void )
{
fprintf ( stderr , " Usage: testgtk [--bench ALL|<bench>[:<count>]] \n " ) ;
exit ( 1 ) ;
}
int
main ( int argc , char * argv [ ] )
{
2010-11-13 20:19:41 +00:00
GtkCssProvider * provider , * memory_provider ;
GdkDisplay * display ;
GdkScreen * screen ;
2008-02-27 10:31:24 +00:00
GtkBindingSet * binding_set ;
int i ;
gboolean done_benchmarks = FALSE ;
srand ( time ( NULL ) ) ;
test_init ( ) ;
2010-11-13 20:19:41 +00:00
g_set_application_name ( " GTK+ Test Program " ) ;
gtk_init ( & argc , & argv ) ;
provider = gtk_css_provider_new ( ) ;
2008-02-27 10:31:24 +00:00
/* Check to see if we are being run from the correct
* directory .
*/
2010-11-13 20:19:41 +00:00
if ( file_exists ( " testgtk.css " ) )
gtk_css_provider_load_from_path ( provider , " testgtk.css " , NULL ) ;
2010-11-13 22:18:44 +00:00
else if ( file_exists ( " tests/testgtk.css " ) )
2010-11-13 20:19:41 +00:00
gtk_css_provider_load_from_path ( provider , " tests/testgtk.css " , NULL ) ;
2008-11-26 08:36:10 +00:00
else
2010-11-13 20:19:41 +00:00
g_warning ( " Couldn't find file \" testgtk.css \" . " ) ;
2008-02-27 10:31:24 +00:00
2010-11-13 20:19:41 +00:00
display = gdk_display_get_default ( ) ;
screen = gdk_display_get_default_screen ( display ) ;
2008-02-27 10:31:24 +00:00
2010-11-13 20:19:41 +00:00
gtk_style_context_add_provider_for_screen ( screen , GTK_STYLE_PROVIDER ( provider ) ,
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION ) ;
g_object_unref ( provider ) ;
2008-02-27 10:31:24 +00:00
gtk_accelerator_set_default_mod_mask ( GDK_SHIFT_MASK |
GDK_CONTROL_MASK |
GDK_MOD1_MASK |
GDK_META_MASK |
GDK_SUPER_MASK |
GDK_HYPER_MASK |
GDK_MOD4_MASK ) ;
/* benchmarking
*/
for ( i = 1 ; i < argc ; i + + )
{
if ( strncmp ( argv [ i ] , " --bench " , strlen ( " --bench " ) ) = = 0 )
{
int num = 1 ;
char * nextarg ;
char * what ;
char * count ;
nextarg = strchr ( argv [ i ] , ' = ' ) ;
if ( nextarg )
nextarg + + ;
else
{
i + + ;
if ( i = = argc )
usage ( ) ;
nextarg = argv [ i ] ;
}
count = strchr ( nextarg , ' : ' ) ;
if ( count )
{
what = g_strndup ( nextarg , count - nextarg ) ;
count + + ;
num = atoi ( count ) ;
if ( num < = 0 )
usage ( ) ;
}
else
what = g_strdup ( nextarg ) ;
do_bench ( what , num ? num : 1 ) ;
done_benchmarks = TRUE ;
}
else
usage ( ) ;
}
if ( done_benchmarks )
return 0 ;
/* bindings test
*/
2008-06-18 07:00:46 +00:00
binding_set = gtk_binding_set_by_class ( g_type_class_ref ( GTK_TYPE_WIDGET ) ) ;
2008-02-27 10:31:24 +00:00
gtk_binding_entry_add_signal ( binding_set ,
' 9 ' , GDK_CONTROL_MASK | GDK_RELEASE_MASK ,
" debug_msg " ,
1 ,
G_TYPE_STRING , " GtkWidgetClass <ctrl><release>9 test " ) ;
2008-02-21 18:03:04 +00:00
2010-11-13 20:19:41 +00:00
memory_provider = gtk_css_provider_new ( ) ;
gtk_css_provider_load_from_data ( memory_provider ,
" #testgtk-version-label { \n "
" color: #f00; \n "
" font: Sans 18; \n "
" } " ,
- 1 , NULL ) ;
gtk_style_context_add_provider_for_screen ( screen , GTK_STYLE_PROVIDER ( memory_provider ) ,
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1 ) ;
2008-02-27 10:31:24 +00:00
create_main_window ( ) ;
2008-02-21 18:03:04 +00:00
2008-02-27 10:31:24 +00:00
gtk_main ( ) ;
if ( 1 )
{
while ( g_main_context_pending ( NULL ) )
g_main_context_iteration ( NULL , FALSE ) ;
#if 0
sleep ( 1 ) ;
while ( g_main_context_pending ( NULL ) )
g_main_context_iteration ( NULL , FALSE ) ;
# endif
}
return 0 ;
}