int main(int argc, char *argv[]) { int i, n; Arg args[10]; XtAppContext app; Widget toplevel; Widget mymenu, optmenu; WidgetList entries; setlocale(LC_ALL, ""); //建立顶级窗口 toplevel = XtVaAppInitialize(&app, "Option", NULL, 0, &argc, argv, NULL, NULL); //建立选项菜单 mymenu = XmCreatePulldownMenu(toplevel, "文件", NULL, 0); make_menu_item(mymenu, "硬盘", "Hard Disk"); make_menu_item(mymenu, "鼠标", "Mouse"); make_menu_item(mymenu, "键盘", "Keyboard"); make_menu_item(mymenu, "显示器", "Monitor"); n = 0; XtSetArg(args[n], XmNsubMenuId, mymenu); n++; optmenu = XmCreateOptionMenu(toplevel, "计算机: ", args, n); XtManageChild(optmenu); //设置为第三项 XtVaGetValues(mymenu, XmNchildren, &entries, NULL); XtVaSetValues(mymenu, XmNmenuHistory, entries[2], NULL); //显示窗口 XtRealizeWidget(toplevel); //进入事件循环 XtAppMainLoop(app); }
static void refill_submenu_workspace (WnckActionMenu *menu) { GtkWidget *submenu; GList *children; GList *l; int num_workspaces, window_space, i; WnckWorkspace *workspace; submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu->priv->workspace_item)); /* Remove existing items */ children = gtk_container_get_children (GTK_CONTAINER (submenu)); for (l = children; l; l = l->next) gtk_container_remove (GTK_CONTAINER (submenu), l->data); g_list_free (children); workspace = wnck_window_get_workspace (menu->priv->window); num_workspaces = wnck_screen_get_workspace_count (wnck_window_get_screen (menu->priv->window)); if (workspace) window_space = wnck_workspace_get_number (workspace); else window_space = -1; for (i = 0; i < num_workspaces; i++) { char *name; GtkWidget *item; name = get_workspace_name_with_accel (menu->priv->window, i); item = make_menu_item (MOVE_TO_WORKSPACE); g_object_set_data (G_OBJECT (item), "workspace", GINT_TO_POINTER (i)); if (i == window_space) gtk_widget_set_sensitive (item, FALSE); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item); set_item_text (item, name); set_item_stock (item, NULL); g_free (name); } gtk_menu_reposition (GTK_MENU (submenu)); }
GtkWidget * util_net_type_option(util_option_changed_cb changed_cb, gpointer userdata) { GtkWidget * menu, * opt_menu; int i; menu = gtk_menu_new(); for (i = 0; i < NET_TYPE_NUM; i++) gtk_menu_shell_append( GTK_MENU_SHELL(menu), make_menu_item(net_name_of_type(i), NULL, TRUE)); opt_menu = gtk_option_menu_new(); g_object_set_data(G_OBJECT(opt_menu), "changed_userdata", userdata); gtk_option_menu_set_menu(GTK_OPTION_MENU(opt_menu), menu); if(changed_cb) g_signal_connect(G_OBJECT(opt_menu), "changed", G_CALLBACK(util_option_fwd_cb), changed_cb); return opt_menu; }
GtkWidget * util_user_mode_option(util_option_changed_cb changed_cb, gpointer userdata) { GtkWidget * menu, * opt_menu; int mode; menu = gtk_menu_new(); for (mode = UMODE_FIRST_VALID; mode < UMODE_NUM_VALID; mode++) gtk_menu_shell_append( GTK_MENU_SHELL(menu), make_menu_item(user_mode_name(mode), util_user_state_stock(mode, TRUE), TRUE) ); opt_menu = gtk_option_menu_new(); g_object_set_data(G_OBJECT(opt_menu), "changed_userdata", userdata); gtk_option_menu_set_menu(GTK_OPTION_MENU(opt_menu), (gpointer)menu); if(changed_cb) g_signal_connect(G_OBJECT(opt_menu), "changed", G_CALLBACK(util_option_fwd_cb), changed_cb); return opt_menu; }
void create_range_controls( void ) { GtkWidget *window; GtkWidget *box1, *box2, *box3; GtkWidget *button; GtkWidget *scrollbar; GtkWidget *separator; GtkWidget *opt, *menu, *item; GtkWidget *label; GtkWidget *scale; GtkObject *adj1, *adj2; /* Standard window-creating stuff */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); gtk_window_set_title (GTK_WINDOW (window), "range controls"); box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), box1); gtk_widget_show (box1); box2 = gtk_hbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ adj1 = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0); vscale = gtk_vscale_new (GTK_ADJUSTMENT (adj1)); scale_set_default_values (GTK_SCALE (vscale)); gtk_box_pack_start (GTK_BOX (box2), vscale, TRUE, TRUE, 0); gtk_widget_show (vscale); box3 = gtk_vbox_new (FALSE, 10); gtk_box_pack_start (GTK_BOX (box2), box3, TRUE, TRUE, 0); gtk_widget_show (box3); /* Reuse the same adjustment */ hscale = gtk_hscale_new (GTK_ADJUSTMENT (adj1)); gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 30); scale_set_default_values (GTK_SCALE (hscale)); gtk_box_pack_start (GTK_BOX (box3), hscale, TRUE, TRUE, 0); gtk_widget_show (hscale); /* Reuse the same adjustment again */ scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adj1)); /* Notice how this causes the scales to always be updated * continuously when the scrollbar is moved */ gtk_range_set_update_policy (GTK_RANGE (scrollbar), GTK_UPDATE_CONTINUOUS); gtk_box_pack_start (GTK_BOX (box3), scrollbar, TRUE, TRUE, 0); gtk_widget_show (scrollbar); box2 = gtk_hbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); /* A checkbutton to control whether the value is displayed or not */ button = gtk_check_button_new_with_label("Display value on scale widgets"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); gtk_signal_connect (GTK_OBJECT (button), "toggled", GTK_SIGNAL_FUNC(cb_draw_value), NULL); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); gtk_widget_show (button); box2 = gtk_hbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); /* An option menu to change the position of the value */ label = gtk_label_new ("Scale Value Position:"); gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0); gtk_widget_show (label); opt = gtk_option_menu_new(); menu = gtk_menu_new(); item = make_menu_item ("Top", GTK_SIGNAL_FUNC(cb_pos_menu_select), GINT_TO_POINTER (GTK_POS_TOP)); gtk_menu_append (GTK_MENU (menu), item); item = make_menu_item ("Bottom", GTK_SIGNAL_FUNC (cb_pos_menu_select), GINT_TO_POINTER (GTK_POS_BOTTOM)); gtk_menu_append (GTK_MENU (menu), item); item = make_menu_item ("Left", GTK_SIGNAL_FUNC (cb_pos_menu_select), GINT_TO_POINTER (GTK_POS_LEFT)); gtk_menu_append (GTK_MENU (menu), item); item = make_menu_item ("Right", GTK_SIGNAL_FUNC (cb_pos_menu_select), GINT_TO_POINTER (GTK_POS_RIGHT)); gtk_menu_append (GTK_MENU (menu), item); gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu); gtk_box_pack_start (GTK_BOX (box2), opt, TRUE, TRUE, 0); gtk_widget_show (opt); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); box2 = gtk_hbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); /* Yet another option menu, this time for the update policy of the * scale widgets */ label = gtk_label_new ("Scale Update Policy:"); gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0); gtk_widget_show (label); opt = gtk_option_menu_new(); menu = gtk_menu_new(); item = make_menu_item ("Continuous", GTK_SIGNAL_FUNC (cb_update_menu_select), GINT_TO_POINTER (GTK_UPDATE_CONTINUOUS)); gtk_menu_append (GTK_MENU (menu), item); item = make_menu_item ("Discontinuous", GTK_SIGNAL_FUNC (cb_update_menu_select), GINT_TO_POINTER (GTK_UPDATE_DISCONTINUOUS)); gtk_menu_append (GTK_MENU (menu), item); item = make_menu_item ("Delayed", GTK_SIGNAL_FUNC (cb_update_menu_select), GINT_TO_POINTER (GTK_UPDATE_DELAYED)); gtk_menu_append (GTK_MENU (menu), item); gtk_option_menu_set_menu (GTK_OPTION_MENU (opt), menu); gtk_box_pack_start (GTK_BOX (box2), opt, TRUE, TRUE, 0); gtk_widget_show (opt); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); box2 = gtk_hbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); /* An HScale widget for adjusting the number of digits on the * sample scales. */ label = gtk_label_new ("Scale Digits:"); gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0); gtk_widget_show (label); adj2 = gtk_adjustment_new (1.0, 0.0, 5.0, 1.0, 1.0, 0.0); gtk_signal_connect (GTK_OBJECT (adj2), "value_changed", GTK_SIGNAL_FUNC (cb_digits_scale), NULL); scale = gtk_hscale_new (GTK_ADJUSTMENT (adj2)); gtk_scale_set_digits (GTK_SCALE (scale), 0); gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0); gtk_widget_show (scale); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); box2 = gtk_hbox_new (FALSE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 10); /* And, one last HScale widget for adjusting the page size of the * scrollbar. */ label = gtk_label_new ("Scrollbar Page Size:"); gtk_box_pack_start (GTK_BOX (box2), label, FALSE, FALSE, 0); gtk_widget_show (label); adj2 = gtk_adjustment_new (1.0, 1.0, 101.0, 1.0, 1.0, 0.0); gtk_signal_connect (GTK_OBJECT (adj2), "value_changed", GTK_SIGNAL_FUNC (cb_page_size), adj1); scale = gtk_hscale_new (GTK_ADJUSTMENT (adj2)); gtk_scale_set_digits (GTK_SCALE (scale), 0); gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0); gtk_widget_show (scale); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_widget_show (box2); separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0); gtk_widget_show (separator); box2 = gtk_vbox_new (FALSE, 10); 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 ("Quit"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(gtk_main_quit), NULL); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (window); }
static void refill_submenu_viewport (WnckActionMenu *menu) { GtkWidget *submenu; GList *children; GList *l; WnckScreen *screen; WnckWorkspace *workspace; int window_x, window_y; int viewport_x, viewport_y; int viewport_width, viewport_height; int screen_width, screen_height; int x, y; int number; submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu->priv->workspace_item)); /* Remove existing items */ children = gtk_container_get_children (GTK_CONTAINER (submenu)); for (l = children; l; l = l->next) gtk_container_remove (GTK_CONTAINER (submenu), l->data); g_list_free (children); screen = wnck_window_get_screen (menu->priv->window); workspace = wnck_screen_get_workspace (screen, 0); wnck_window_get_geometry (menu->priv->window, &window_x, &window_y, NULL, NULL); viewport_x = wnck_workspace_get_viewport_x (workspace); viewport_y = wnck_workspace_get_viewport_y (workspace); window_x += viewport_x; window_y += viewport_y; viewport_width = wnck_workspace_get_width (workspace); viewport_height = wnck_workspace_get_height (workspace); screen_width = wnck_screen_get_width (screen); screen_height = wnck_screen_get_height (screen); number = 1; for (y = 0; y < viewport_height; y += screen_height) { char *label; GtkWidget *item; for (x = 0; x < viewport_width; x += screen_width) { /* Keep this in sync with what is in get_workspace_name_with_accel() */ if (number == 10) label = g_strdup_printf (_("Workspace 1_0")); else label = g_strdup_printf (_("Workspace %s%d"), number < 10 ? "_" : "", number); number++; item = make_menu_item (MOVE_TO_WORKSPACE); g_object_set_data (G_OBJECT (item), "viewport_x", GINT_TO_POINTER (x)); g_object_set_data (G_OBJECT (item), "viewport_y", GINT_TO_POINTER (y)); if (window_x >= x && window_x < x + screen_width && window_y >= y && window_y < y + screen_height) gtk_widget_set_sensitive (item, FALSE); gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item); set_item_text (item, label); set_item_stock (item, NULL); g_free (label); } } gtk_menu_reposition (GTK_MENU (submenu)); }
static GObject * wnck_action_menu_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) { GObject *obj; WnckActionMenu *menu; WnckActionMenuPrivate *priv; GtkWidget *submenu; GtkWidget *separator; GSList *pin_group; WnckScreen *screen; obj = G_OBJECT_CLASS (wnck_action_menu_parent_class)->constructor (type, n_construct_properties, construct_properties); menu = WNCK_ACTION_MENU (obj); priv = menu->priv; if (priv->window == NULL) { g_warning ("No window specified during creation of the action menu"); return obj; } g_object_weak_ref (G_OBJECT (priv->window), window_weak_notify, menu); g_object_weak_ref (G_OBJECT (menu), object_weak_notify, priv->window); priv->minimize_item = make_menu_item (MINIMIZE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->minimize_item); priv->maximize_item = make_menu_item (MAXIMIZE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->maximize_item); priv->move_item = make_menu_item (MOVE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->move_item); set_item_text (priv->move_item, _("_Move")); set_item_stock (priv->move_item, NULL); priv->resize_item = make_menu_item (RESIZE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->resize_item); set_item_text (priv->resize_item, _("_Resize")); set_item_stock (priv->move_item, NULL); priv->workspace_separator = separator = gtk_separator_menu_item_new (); gtk_widget_show (separator); gtk_menu_shell_append (GTK_MENU_SHELL (menu), separator); priv->above_item = make_check_menu_item (ABOVE, _("Always On _Top")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->above_item); pin_group = NULL; priv->pin_item = make_radio_menu_item (PIN, &pin_group, _("_Always on Visible Workspace")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->pin_item); priv->unpin_item = make_radio_menu_item (UNPIN, &pin_group, _("_Only on This Workspace")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->unpin_item); priv->left_item = make_menu_item (LEFT); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->left_item); set_item_text (priv->left_item, _("Move to Workspace _Left")); set_item_stock (priv->left_item, NULL); priv->right_item = make_menu_item (RIGHT); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->right_item); set_item_text (priv->right_item, _("Move to Workspace R_ight")); set_item_stock (priv->right_item, NULL); priv->up_item = make_menu_item (UP); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->up_item); set_item_text (priv->up_item, _("Move to Workspace _Up")); set_item_stock (priv->up_item, NULL); priv->down_item = make_menu_item (DOWN); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->down_item); set_item_text (priv->down_item, _("Move to Workspace _Down")); set_item_stock (priv->down_item, NULL); priv->workspace_item = gtk_menu_item_new_with_mnemonic (_("Move to Another _Workspace")); gtk_widget_show (priv->workspace_item); submenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (priv->workspace_item), submenu); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->workspace_item); separator = gtk_separator_menu_item_new (); gtk_widget_show (separator); gtk_menu_shell_append (GTK_MENU_SHELL (menu), separator); priv->close_item = make_menu_item (CLOSE); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->close_item); set_item_text (priv->close_item, _("_Close")); set_item_stock (priv->close_item, WNCK_STOCK_DELETE); g_signal_connect_object (G_OBJECT (priv->window), "state_changed", G_CALLBACK (state_changed_callback), G_OBJECT (menu), 0); g_signal_connect_object (G_OBJECT (priv->window), "actions_changed", G_CALLBACK (actions_changed_callback), G_OBJECT (menu), 0); g_signal_connect_object (G_OBJECT (priv->window), "workspace_changed", G_CALLBACK (workspace_changed_callback), G_OBJECT (menu), 0); screen = wnck_window_get_screen (priv->window); g_signal_connect_object (G_OBJECT (screen), "workspace_created", G_CALLBACK (screen_workspace_callback), G_OBJECT (menu), 0); g_signal_connect_object (G_OBJECT (screen), "workspace_destroyed", G_CALLBACK (screen_workspace_callback), G_OBJECT (menu), 0); g_signal_connect_object (G_OBJECT (screen), "viewports_changed", G_CALLBACK (viewports_changed_callback), G_OBJECT (menu), 0); update_menu_state (menu); return obj; }
GtkWidget * gxgraph_hardcopy_dialog_new (GtkWidget * parent, window_t * window) { GtkWidget *dialog; GtkWidget *dialog_vbox; GtkWidget *table, *button, *entry; int row; dialog = gtk_dialog_new_with_buttons ("Hardcopy", GTK_WINDOW (parent), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_signal_connect (GTK_OBJECT (dialog), "response", G_CALLBACK (cb_response), window); dialog_vbox = GTK_DIALOG (dialog)->vbox; /* Create an interface like in xgraph */ /* Output device: [PostScript] [SVG] Disposition: [Print] [File] File or device name: */ table = gtk_table_new (2, 2, 0); gtk_box_pack_start (GTK_BOX (dialog_vbox), table, FALSE, FALSE, 0); row = 0; gtk_table_attach (GTK_TABLE (table), gtk_label_new ("Output device:"), 0, 1, row, row + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) 0, 3, 0); button = gtk_option_menu_new (); // Populate widget { GtkWidget *menu = gtk_menu_new (); GtkWidget *item; g_object_set_data (G_OBJECT (menu), "varpointer", &output_device); item = make_menu_item ("Print", menu, GINT_TO_POINTER (OUTPUT_DEVICE_PRINT)); gtk_menu_append (GTK_MENU (menu), item); if (output_device == OUTPUT_DEVICE_PRINT) gtk_menu_item_select (GTK_MENU_ITEM (item)); item = make_menu_item ("Export PostScript", menu, GINT_TO_POINTER (OUTPUT_DEVICE_POSTSCRIPT)); gtk_menu_append (GTK_MENU (menu), item); if (output_device == OUTPUT_DEVICE_POSTSCRIPT) gtk_menu_item_select (GTK_MENU_ITEM (item)); item = make_menu_item ("Export SVG", menu, GINT_TO_POINTER (OUTPUT_DEVICE_SVG)); if (output_device == OUTPUT_DEVICE_SVG) gtk_menu_item_select (GTK_MENU_ITEM (item)); gtk_menu_append (GTK_MENU (menu), item); /* attach the menu to the button */ gtk_option_menu_set_menu (GTK_OPTION_MENU (button), menu); } gtk_table_attach (GTK_TABLE (table), button, 1, 2, row, row + 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); // Entry label for filename or device name... row++; gtk_table_attach (GTK_TABLE (table), gtk_label_new ("Device or filename:"), 0, 1, row, row + 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 3, 0); entry = gtk_entry_new (); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, row, row + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) 0, 0, 0); g_object_set_data (G_OBJECT (dialog), "filename_entry", entry); /* Show it all */ gtk_widget_show_all (dialog_vbox); return dialog; }