- g_object_set_data( G_OBJECT( item ), "handler", gint_to_pointer( handler ) );
- return handler;
-}
-
-ui::MenuItem new_menu_item_with_mnemonic( const char *mnemonic, const Callback<void()>& callback ){
- auto item = ui::MenuItem( mnemonic, true );
- item.show();
- menu_item_connect_callback( item, callback );
- return item;
-}
-
-ui::MenuItem create_menu_item_with_mnemonic( ui::Menu menu, const char *mnemonic, const Callback<void()>& callback ){
- auto item = new_menu_item_with_mnemonic( mnemonic, callback );
- menu.add(item);
- return item;
-}
-
-ui::CheckMenuItem new_check_menu_item_with_mnemonic( const char* mnemonic, const Callback<void()>& callback ){
- auto item = ui::CheckMenuItem::from( gtk_check_menu_item_new_with_mnemonic( mnemonic ) );
- item.show();
- check_menu_item_connect_callback( item, callback );
- return item;
-}
-
-ui::CheckMenuItem create_check_menu_item_with_mnemonic( ui::Menu menu, const char* mnemonic, const Callback<void()>& callback ){
- auto item = new_check_menu_item_with_mnemonic( mnemonic, callback );
- menu.add(item);
- return item;
-}
-
-ui::RadioMenuItem new_radio_menu_item_with_mnemonic( GSList** group, const char* mnemonic, const Callback<void()>& callback ){
- auto item = ui::RadioMenuItem::from( gtk_radio_menu_item_new_with_mnemonic( *group, mnemonic ) );
- if ( *group == 0 ) {
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), TRUE );
- }
- *group = gtk_radio_menu_item_get_group( item );
- item.show();
- check_menu_item_connect_callback( item, callback );
- return item;
-}
-
-ui::RadioMenuItem create_radio_menu_item_with_mnemonic( ui::Menu menu, GSList** group, const char* mnemonic, const Callback<void()>& callback ){
- auto item = new_radio_menu_item_with_mnemonic( group, mnemonic, callback );
- menu.add(item);
- return item;
-}
-
-void check_menu_item_set_active_no_signal( ui::CheckMenuItem item, gboolean active ){
- guint handler_id = gpointer_to_int( g_object_get_data( G_OBJECT( item ), "handler" ) );
- g_signal_handler_block( G_OBJECT( item ), handler_id );
- gtk_check_menu_item_set_active( item, active );
- g_signal_handler_unblock( G_OBJECT( item ), handler_id );
-}
-
-
-
-void radio_menu_item_set_active_no_signal( ui::RadioMenuItem item, gboolean active ){
- {
- for ( GSList* l = gtk_radio_menu_item_get_group( item ); l != 0; l = g_slist_next( l ) )
- {
- g_signal_handler_block( G_OBJECT( l->data ), gpointer_to_int( g_object_get_data( G_OBJECT( l->data ), "handler" ) ) );
- }
- }
- gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), active );
- {
- for ( GSList* l = gtk_radio_menu_item_get_group( item ); l != 0; l = g_slist_next( l ) )
- {
- g_signal_handler_unblock( G_OBJECT( l->data ), gpointer_to_int( g_object_get_data( G_OBJECT( l->data ), "handler" ) ) );
- }
- }
-}
-
-
-void menu_item_set_accelerator( ui::MenuItem item, GClosure* closure ){
- GtkAccelLabel* accel_label = GTK_ACCEL_LABEL( gtk_bin_get_child( GTK_BIN( item ) ) );
- gtk_accel_label_set_accel_closure( accel_label, closure );
-}
-
-void accelerator_name( const Accelerator& accelerator, GString* gstring ){
- gboolean had_mod = FALSE;
- if ( accelerator.modifiers & GDK_SHIFT_MASK ) {
- g_string_append( gstring, "Shift" );
- had_mod = TRUE;
- }
- if ( accelerator.modifiers & GDK_CONTROL_MASK ) {
- if ( had_mod ) {
- g_string_append( gstring, "+" );
- }
- g_string_append( gstring, "Ctrl" );
- had_mod = TRUE;
- }
- if ( accelerator.modifiers & GDK_MOD1_MASK ) {
- if ( had_mod ) {
- g_string_append( gstring, "+" );
- }
- g_string_append( gstring, "Alt" );
- had_mod = TRUE;
- }
-
- if ( had_mod ) {
- g_string_append( gstring, "+" );
- }
- if ( accelerator.key < 0x80 || ( accelerator.key > 0x80 && accelerator.key <= 0xff ) ) {
- switch ( accelerator.key )
- {
- case ' ':
- g_string_append( gstring, "Space" );
- break;
- case '\\':
- g_string_append( gstring, "Backslash" );
- break;
- default:
- g_string_append_c( gstring, gchar( toupper( accelerator.key ) ) );
- break;
- }
- }
- else
- {
- gchar *tmp;
-
- tmp = gtk_accelerator_name( accelerator.key, (GdkModifierType)0 );
- if ( tmp[0] != 0 && tmp[1] == 0 ) {
- tmp[0] = gchar( toupper( tmp[0] ) );
- }
- g_string_append( gstring, tmp );
- g_free( tmp );
- }
-}
-
-void menu_item_add_accelerator( ui::MenuItem item, Accelerator accelerator ){
- if ( accelerator.key != 0 && gtk_accelerator_valid( accelerator.key, accelerator.modifiers )) {
- GClosure* closure = global_accel_group_find( accelerator );
- ASSERT_NOTNULL(closure);
- menu_item_set_accelerator( item, closure );
- }
-}
-
-ui::MenuItem create_menu_item_with_mnemonic( ui::Menu menu, const char* mnemonic, const Command& command ){
- auto item = create_menu_item_with_mnemonic( menu, mnemonic, command.m_callback );
- menu_item_add_accelerator( item, command.m_accelerator );
- return item;
-}
-
-void check_menu_item_set_active_callback(void *it, bool enabled ){
- auto item = ui::CheckMenuItem::from(it);
- check_menu_item_set_active_no_signal( item, enabled );
-}
-
-ui::CheckMenuItem create_check_menu_item_with_mnemonic( ui::Menu menu, const char* mnemonic, const Toggle& toggle ){
- auto item = create_check_menu_item_with_mnemonic( menu, mnemonic, toggle.m_command.m_callback );
- menu_item_add_accelerator( item, toggle.m_command.m_accelerator );
- toggle.m_exportCallback( PointerCaller<void, void(bool), check_menu_item_set_active_callback>( item._handle ) );
- return item;
+ g_object_set_data(G_OBJECT(item), "handler", gint_to_pointer(handler));
+ return handler;
+}
+
+ui::MenuItem new_menu_item_with_mnemonic(const char *mnemonic, const Callback<void()> &callback)
+{
+ auto item = ui::MenuItem(mnemonic, true);
+ item.show();
+ menu_item_connect_callback(item, callback);
+ return item;
+}
+
+ui::MenuItem create_menu_item_with_mnemonic(ui::Menu menu, const char *mnemonic, const Callback<void()> &callback)
+{
+ auto item = new_menu_item_with_mnemonic(mnemonic, callback);
+ menu.add(item);
+ return item;
+}
+
+ui::CheckMenuItem new_check_menu_item_with_mnemonic(const char *mnemonic, const Callback<void()> &callback)
+{
+ auto item = ui::CheckMenuItem::from(gtk_check_menu_item_new_with_mnemonic(mnemonic));
+ item.show();
+ check_menu_item_connect_callback(item, callback);
+ return item;
+}
+
+ui::CheckMenuItem
+create_check_menu_item_with_mnemonic(ui::Menu menu, const char *mnemonic, const Callback<void()> &callback)
+{
+ auto item = new_check_menu_item_with_mnemonic(mnemonic, callback);
+ menu.add(item);
+ return item;
+}
+
+ui::RadioMenuItem
+new_radio_menu_item_with_mnemonic(GSList **group, const char *mnemonic, const Callback<void()> &callback)
+{
+ auto item = ui::RadioMenuItem::from(gtk_radio_menu_item_new_with_mnemonic(*group, mnemonic));
+ if (*group == 0) {
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
+ }
+ *group = gtk_radio_menu_item_get_group(item);
+ item.show();
+ check_menu_item_connect_callback(item, callback);
+ return item;
+}
+
+ui::RadioMenuItem create_radio_menu_item_with_mnemonic(ui::Menu menu, GSList **group, const char *mnemonic,
+ const Callback<void()> &callback)
+{
+ auto item = new_radio_menu_item_with_mnemonic(group, mnemonic, callback);
+ menu.add(item);
+ return item;
+}
+
+void check_menu_item_set_active_no_signal(ui::CheckMenuItem item, gboolean active)
+{
+ guint handler_id = gpointer_to_int(g_object_get_data(G_OBJECT(item), "handler"));
+ g_signal_handler_block(G_OBJECT(item), handler_id);
+ gtk_check_menu_item_set_active(item, active);
+ g_signal_handler_unblock(G_OBJECT(item), handler_id);
+}
+
+
+void radio_menu_item_set_active_no_signal(ui::RadioMenuItem item, gboolean active)
+{
+ {
+ for (GSList *l = gtk_radio_menu_item_get_group(item); l != 0; l = g_slist_next(l)) {
+ g_signal_handler_block(G_OBJECT(l->data), gpointer_to_int(g_object_get_data(G_OBJECT(l->data), "handler")));
+ }
+ }
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
+ {
+ for (GSList *l = gtk_radio_menu_item_get_group(item); l != 0; l = g_slist_next(l)) {
+ g_signal_handler_unblock(G_OBJECT(l->data),
+ gpointer_to_int(g_object_get_data(G_OBJECT(l->data), "handler")));
+ }
+ }
+}
+
+
+void menu_item_set_accelerator(ui::MenuItem item, GClosure *closure)
+{
+ GtkAccelLabel *accel_label = GTK_ACCEL_LABEL(gtk_bin_get_child(GTK_BIN(item)));
+ gtk_accel_label_set_accel_closure(accel_label, closure);
+}
+
+void accelerator_name(const Accelerator &accelerator, GString *gstring)
+{
+ gboolean had_mod = FALSE;
+ if (accelerator.modifiers & GDK_SHIFT_MASK) {
+ g_string_append(gstring, "Shift");
+ had_mod = TRUE;
+ }
+ if (accelerator.modifiers & GDK_CONTROL_MASK) {
+ if (had_mod) {
+ g_string_append(gstring, "+");
+ }
+ g_string_append(gstring, "Ctrl");
+ had_mod = TRUE;
+ }
+ if (accelerator.modifiers & GDK_MOD1_MASK) {
+ if (had_mod) {
+ g_string_append(gstring, "+");
+ }
+ g_string_append(gstring, "Alt");
+ had_mod = TRUE;
+ }
+
+ if (had_mod) {
+ g_string_append(gstring, "+");
+ }
+ if (accelerator.key < 0x80 || (accelerator.key > 0x80 && accelerator.key <= 0xff)) {
+ switch (accelerator.key) {
+ case ' ':
+ g_string_append(gstring, "Space");
+ break;
+ case '\\':
+ g_string_append(gstring, "Backslash");
+ break;
+ default:
+ g_string_append_c(gstring, gchar(toupper(accelerator.key)));
+ break;
+ }
+ } else {
+ gchar *tmp;
+
+ tmp = gtk_accelerator_name(accelerator.key, (GdkModifierType) 0);
+ if (tmp[0] != 0 && tmp[1] == 0) {
+ tmp[0] = gchar(toupper(tmp[0]));
+ }
+ g_string_append(gstring, tmp);
+ g_free(tmp);
+ }
+}
+
+void menu_item_add_accelerator(ui::MenuItem item, Accelerator accelerator)
+{
+ if (accelerator.key != 0 && gtk_accelerator_valid(accelerator.key, accelerator.modifiers)) {
+ GClosure *closure = global_accel_group_find(accelerator);
+ ASSERT_NOTNULL(closure);
+ menu_item_set_accelerator(item, closure);
+ }
+}
+
+ui::MenuItem create_menu_item_with_mnemonic(ui::Menu menu, const char *mnemonic, const Command &command)
+{
+ auto item = create_menu_item_with_mnemonic(menu, mnemonic, command.m_callback);
+ menu_item_add_accelerator(item, command.m_accelerator);
+ return item;
+}
+
+void check_menu_item_set_active_callback(void *it, bool enabled)
+{
+ auto item = ui::CheckMenuItem::from(it);
+ check_menu_item_set_active_no_signal(item, enabled);
+}
+
+ui::CheckMenuItem create_check_menu_item_with_mnemonic(ui::Menu menu, const char *mnemonic, const Toggle &toggle)
+{
+ auto item = create_check_menu_item_with_mnemonic(menu, mnemonic, toggle.m_command.m_callback);
+ menu_item_add_accelerator(item, toggle.m_command.m_accelerator);
+ toggle.m_exportCallback(PointerCaller<void, void(bool), check_menu_item_set_active_callback>(item._handle));
+ return item;