testsocket_common.c 8.02 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/* testsocket_common.c
 * Copyright (C) 2001 Red Hat, Inc
 * Author: Owen Taylor
 *
 * 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
Javier Jardón's avatar
Javier Jardón committed
16
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17 18
 */

19
#include "config.h"
20
#include <gtk/gtk.h>
21
#if defined (GDK_WINDOWING_X11)
22
#include <gtk/gtkx.h>
23 24 25
#elif defined (GDK_WINDOWING_WIN32)
#include "win32/gdkwin32.h"
#endif
26

27 28 29 30 31 32 33 34
enum
{
  ACTION_FILE_NEW,
  ACTION_FILE_OPEN,
  ACTION_OK,
  ACTION_HELP_ABOUT
};

35
static void
36 37
print_hello (GtkWidget *w,
	     guint      action)
38
{
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
  switch (action)
    {
    case ACTION_FILE_NEW:
      g_message ("File New activated");
      break;
    case ACTION_FILE_OPEN:
      g_message ("File Open activated");
      break;
    case ACTION_OK:
      g_message ("OK activated");
      break;
    case ACTION_HELP_ABOUT:
      g_message ("Help About activated ");
      break;
    default:
      g_assert_not_reached ();
      break;
    }
57 58
}

59 60 61 62 63 64 65 66 67 68 69 70 71
static void
remove_buttons (GtkWidget *widget, GtkWidget *other_button)
{
  gtk_widget_destroy (other_button);
  gtk_widget_destroy (widget);
}

static gboolean
blink_cb (gpointer data)
{
  GtkWidget *widget = data;

  gtk_widget_show (widget);
72
  g_object_set_data (G_OBJECT (widget), "blink", NULL);
73 74 75 76 77 78 79 80 81 82 83 84

  return FALSE;
}

static void
blink (GtkWidget *widget,
       GtkWidget *window)
{
  guint blink_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (window), "blink"));
  
  if (!blink_timeout)
    {
85
      blink_timeout = gdk_threads_add_timeout (1000, blink_cb, window);
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
      gtk_widget_hide (window);

      g_object_set_data (G_OBJECT (window), "blink", GUINT_TO_POINTER (blink_timeout));
    }
}

static void
local_destroy (GtkWidget *window)
{
  guint blink_timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (window), "blink"));
  if (blink_timeout)
    g_source_remove (blink_timeout);
}

static void
remote_destroy (GtkWidget *window)
{
  local_destroy (window);
  gtk_main_quit ();
}

static void
add_buttons (GtkWidget *widget, GtkWidget *box)
{
  GtkWidget *add_button;
  GtkWidget *remove_button;

  add_button = gtk_button_new_with_mnemonic ("_Add");
  gtk_box_pack_start (GTK_BOX (box), add_button, TRUE, TRUE, 0);
  gtk_widget_show (add_button);

Manish Singh's avatar
Manish Singh committed
117 118 119
  g_signal_connect (add_button, "clicked",
		    G_CALLBACK (add_buttons),
		    box);
120 121 122 123 124

  remove_button = gtk_button_new_with_mnemonic ("_Remove");
  gtk_box_pack_start (GTK_BOX (box), remove_button, TRUE, TRUE, 0);
  gtk_widget_show (remove_button);

Manish Singh's avatar
Manish Singh committed
125 126 127
  g_signal_connect (remove_button, "clicked",
		    G_CALLBACK (remove_buttons),
		    add_button);
128 129
}

130 131
static GtkWidget *
create_combo (void)
132
{
133
  GtkComboBoxText *combo;
134
  GtkWidget *entry;
135 136 137 138 139 140 141 142 143 144 145 146 147

  combo = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());

  gtk_combo_box_text_append_text (combo, "item0");
  gtk_combo_box_text_append_text (combo, "item1 item1");
  gtk_combo_box_text_append_text (combo, "item2 item2 item2");
  gtk_combo_box_text_append_text (combo, "item3 item3 item3 item3");
  gtk_combo_box_text_append_text (combo, "item4 item4 item4 item4 item4");
  gtk_combo_box_text_append_text (combo, "item5 item5 item5 item5 item5 item5");
  gtk_combo_box_text_append_text (combo, "item6 item6 item6 item6 item6");
  gtk_combo_box_text_append_text (combo, "item7 item7 item7 item7");
  gtk_combo_box_text_append_text (combo, "item8 item8 item8");
  gtk_combo_box_text_append_text (combo, "item9 item9");
148 149 150 151

  entry = gtk_bin_get_child (GTK_BIN (combo));
  gtk_entry_set_text (GTK_ENTRY (entry), "hello world");
  gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
152 153 154

  return GTK_WIDGET (combo);
}
155

156 157 158 159 160
static GtkWidget *
create_menubar (GtkWindow *window)
{
  GtkAccelGroup *accel_group=NULL;
  GtkWidget *menubar;
161 162 163
  GtkWidget *menuitem;
  GtkWidget *menu;

164 165
  accel_group = gtk_accel_group_new ();
  gtk_window_add_accel_group (window, accel_group);
166 167 168 169 170 171 172

  menubar = gtk_menu_bar_new ();

  menuitem = gtk_menu_item_new_with_mnemonic ("_File");
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  menu = gtk_menu_new ();
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
173
  menuitem = gtk_menu_item_new_with_mnemonic ("_New");
174
  g_signal_connect (menuitem, "activate", G_CALLBACK (print_hello), window);
175 176 177
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
  menuitem = gtk_separator_menu_item_new ();
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
178
  menuitem = gtk_menu_item_new_with_mnemonic ("_Quit");
179
  g_signal_connect (menuitem, "activate", G_CALLBACK (gtk_main_quit), window);
180 181 182 183 184 185 186 187 188
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);

  menuitem = gtk_menu_item_new_with_mnemonic ("O_K");
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);

  menuitem = gtk_menu_item_new_with_mnemonic ("_Help");
  gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
  menu = gtk_menu_new ();
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
189
  menuitem = gtk_menu_item_new_with_mnemonic ("_About");
190
  g_signal_connect (menuitem, "activate", G_CALLBACK (print_hello), window);
191
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
192

193 194
  return menubar;
}
195

196 197 198
static GtkWidget *
create_combo_box (void)
{
199
  GtkComboBoxText *combo_box = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new ());
200

201 202 203 204
  gtk_combo_box_text_append_text (combo_box, "This");
  gtk_combo_box_text_append_text (combo_box, "Is");
  gtk_combo_box_text_append_text (combo_box, "A");
  gtk_combo_box_text_append_text (combo_box, "ComboBox");
205
  
206 207
  return GTK_WIDGET (combo_box);
}
208

209 210 211 212 213 214
static GtkWidget *
create_content (GtkWindow *window, gboolean local)
{
  GtkWidget *vbox;
  GtkWidget *button;
  GtkWidget *frame;
215

216 217
  frame = gtk_frame_new (local? "Local" : "Remote");
  gtk_container_set_border_width (GTK_CONTAINER (frame), 3);
218 219
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
220 221 222 223 224 225 226 227 228 229 230 231 232
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);

  gtk_container_add (GTK_CONTAINER (frame), vbox);
  
  /* Combo */
  gtk_box_pack_start (GTK_BOX (vbox), create_combo(), TRUE, TRUE, 0);

  /* Entry */
  gtk_box_pack_start (GTK_BOX (vbox), gtk_entry_new(), TRUE, TRUE, 0);

  /* Close Button */
  button = gtk_button_new_with_mnemonic ("_Close");
  gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
Manish Singh's avatar
Manish Singh committed
233 234
  g_signal_connect_swapped (button, "clicked",
			    G_CALLBACK (gtk_widget_destroy), window);
235

236
  /* Blink Button */
237
  button = gtk_button_new_with_mnemonic ("_Blink");
238
  gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
Manish Singh's avatar
Manish Singh committed
239 240 241
  g_signal_connect (button, "clicked",
		    G_CALLBACK (blink),
		    window);
242

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
  /* Menubar */
  gtk_box_pack_start (GTK_BOX (vbox), create_menubar (GTK_WINDOW (window)),
		      TRUE, TRUE, 0);

  /* Combo Box */
  gtk_box_pack_start (GTK_BOX (vbox), create_combo_box (), TRUE, TRUE, 0);
  
  add_buttons (NULL, vbox);

  return frame;
}

guint32
create_child_plug (guint32  xid,
		   gboolean local)
{
  GtkWidget *window;
  GtkWidget *content;

  window = gtk_plug_new (xid);

  g_signal_connect (window, "destroy",
		    local ? G_CALLBACK (local_destroy)
			  : G_CALLBACK (remote_destroy),
		    NULL);
  gtk_container_set_border_width (GTK_CONTAINER (window), 0);

  content = create_content (GTK_WINDOW (window), local);
271
  
272 273
  gtk_container_add (GTK_CONTAINER (window), content);

274 275
  gtk_widget_show_all (window);

276
  if (gtk_widget_get_realized (window))
277
#if defined (GDK_WINDOWING_X11)
278
    return GDK_WINDOW_XID (gtk_widget_get_window (window));
279
#elif defined (GDK_WINDOWING_WIN32)
280
    return (guint32) GDK_WINDOW_HWND (gtk_widget_get_window (window));
281 282
#elif defined (GDK_WINDOWING_BROADWAY)
    return (guint32) 0; /* Child windows not supported */
283
#endif
284 285 286
  else
    return 0;
}