159 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* stresstest-toolbar.c
 | |
|  *
 | |
|  * Copyright (C) 2003 Soeren Sandmann <sandmann@daimi.au.dk>
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Library General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Library General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Library General Public
 | |
|  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| #include "config.h"
 | |
| #include <gtk/gtk.h>
 | |
| 
 | |
| typedef struct _Info Info;
 | |
| struct _Info
 | |
| {
 | |
|   GtkWindow  *window;
 | |
|   GtkToolbar *toolbar;
 | |
|   gint	      counter;
 | |
| };
 | |
| 
 | |
| static void
 | |
| add_random (GtkToolbar *toolbar, gint n)
 | |
| {
 | |
|   gint n_items;
 | |
|   gint position;
 | |
|   gchar *label = g_strdup_printf ("Button %d", n);
 | |
| 
 | |
|   GtkToolItem *toolitem = gtk_tool_button_new (NULL, label);
 | |
|   gtk_tool_item_set_tooltip_text (toolitem, "Bar");
 | |
| 
 | |
|   g_free (label);
 | |
|   gtk_widget_show_all (GTK_WIDGET (toolitem));
 | |
| 
 | |
|   n_items = gtk_toolbar_get_n_items (toolbar);
 | |
|   if (n_items == 0)
 | |
|     position = 0;
 | |
|   else
 | |
|     position = g_random_int_range (0, n_items);
 | |
| 
 | |
|   gtk_toolbar_insert (toolbar, toolitem, position);
 | |
| }
 | |
| 
 | |
| static void
 | |
| remove_random (GtkToolbar *toolbar)
 | |
| {
 | |
|   GtkToolItem *tool_item;
 | |
|   gint n_items;
 | |
|   gint position;
 | |
| 
 | |
|   n_items = gtk_toolbar_get_n_items (toolbar);
 | |
| 
 | |
|   if (n_items == 0)
 | |
|     return;
 | |
| 
 | |
|   position = g_random_int_range (0, n_items);
 | |
| 
 | |
|   tool_item = gtk_toolbar_get_nth_item (toolbar, position);
 | |
| 
 | |
|   gtk_container_remove (GTK_CONTAINER (toolbar),
 | |
|                         GTK_WIDGET (tool_item));
 | |
| }
 | |
| 
 | |
| static gboolean
 | |
| stress_test_old_api (gpointer data)
 | |
| {
 | |
|   typedef enum {
 | |
|     ADD_RANDOM,
 | |
|     REMOVE_RANDOM,
 | |
|     LAST_ACTION
 | |
|   } Action;
 | |
|       
 | |
|   Info *info = data;
 | |
|   Action action;
 | |
|   gint n_items;
 | |
| 
 | |
|   if (info->counter++ == 200)
 | |
|     {
 | |
|       gtk_main_quit ();
 | |
|       return FALSE;
 | |
|     }
 | |
| 
 | |
|   if (!info->toolbar)
 | |
|     {
 | |
|       info->toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
 | |
|       gtk_container_add (GTK_CONTAINER (info->window),
 | |
| 			 GTK_WIDGET (info->toolbar));
 | |
|       gtk_widget_show (GTK_WIDGET (info->toolbar));
 | |
|     }
 | |
| 
 | |
|   n_items = gtk_toolbar_get_n_items (info->toolbar);
 | |
|   if (n_items == 0)
 | |
|     {
 | |
|       add_random (info->toolbar, info->counter);
 | |
|       return TRUE;
 | |
|     }
 | |
|   else if (n_items > 50)
 | |
|     {
 | |
|       int i;
 | |
|       for (i = 0; i < 25; i++)
 | |
| 	remove_random (info->toolbar);
 | |
|       return TRUE;
 | |
|     }
 | |
|   
 | |
|   action = g_random_int_range (0, LAST_ACTION);
 | |
| 
 | |
|   switch (action)
 | |
|     {
 | |
|     case ADD_RANDOM:
 | |
|       add_random (info->toolbar, info->counter);
 | |
|       break;
 | |
| 
 | |
|     case REMOVE_RANDOM:
 | |
|       remove_random (info->toolbar);
 | |
|       break;
 | |
|       
 | |
|     default:
 | |
|       g_assert_not_reached();
 | |
|       break;
 | |
|     }
 | |
|   
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| gint
 | |
| main (gint argc, gchar **argv)
 | |
| {
 | |
|   Info info;
 | |
|   
 | |
|   gtk_init (&argc, &argv);
 | |
| 
 | |
|   info.toolbar = NULL;
 | |
|   info.counter = 0;
 | |
|   info.window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
 | |
| 
 | |
|   gtk_widget_show (GTK_WIDGET (info.window));
 | |
|   
 | |
|   gdk_threads_add_idle (stress_test_old_api, &info);
 | |
| 
 | |
|   gtk_widget_show_all (GTK_WIDGET (info.window));
 | |
|   
 | |
|   gtk_main ();
 | |
| 
 | |
|   gtk_widget_destroy (GTK_WIDGET (info.window));
 | |
| 
 | |
|   info.toolbar = NULL;
 | |
|   info.window = NULL;
 | |
|   
 | |
|   return 0;
 | |
| }
 | 
