/* Attach `w' as the right menu of all the current open windows. */ void ui_set_right_menu(ui_menu_entry_t *menu) { int i; static GtkAccelGroup *accel; int num_app_shells = get_num_shells(); DBG(("ui_set_right_menu")); ui_block_shells(); if (accel) { g_object_unref(accel); } accel = gtk_accel_group_new(); for (i = 0; i < num_app_shells; i++) { gtk_window_add_accel_group (GTK_WINDOW (app_shells[i].shell), accel); } if (right_menu != NULL) { gtk_widget_destroy(right_menu); } right_menu = gtk_menu_new(); ui_menu_create(right_menu, accel, "RightMenu", menu); ui_unblock_shells(); }
void ui_set_tape_menu(ui_menu_entry_t *menu) { if (tape_menu) { gtk_widget_destroy(tape_menu); } tape_menu = gtk_menu_new(); ui_menu_create(tape_menu, NULL, "TapeMenu", menu); }
void ui_set_speedmenu(ui_menu_entry_t *menu) { if (speed_menu) { gtk_widget_destroy(speed_menu); } speed_menu = gtk_menu_new(); ui_menu_create(speed_menu, NULL, "SpeedMenu", menu); }
void ui_set_drive_menu(int drive, ui_menu_entry_t *flipmenu) { char *leftmenuname; int i; Widget w; int num_app_shells = get_num_shells(); if (drive < 0 || drive >= NUM_DRIVES) { return; } leftmenuname = lib_msprintf("leftDrive%iMenu", drive + 8); if (flipmenu != NULL) { w = ui_menu_create(leftmenuname, flipmenu, NULL); left_drive_menu[drive] = w; } if (!drive_menu_translations[drive]) { char *translation_table; char number[16]; char *rightmenuname; sprintf(number, "%d", drive); rightmenuname = lib_msprintf("rightDrive%iMenu", drive + 8); translation_table = util_concat( "<Btn1Down>: " "XawPositionSimpleMenu(", leftmenuname, ") " "XtMenuPopup(", leftmenuname, ")\n", "Meta Shift <KeyDown>z: " "FakeButton(1) " "XawPositionSimpleMenu(", leftmenuname, ") " "XtMenuPopup(", leftmenuname, ")\n", "<Btn3Down>: " "RebuildDiskMenu(", number, ",", rightmenuname, ") " "XawPositionSimpleMenu(", rightmenuname, ") " "XtMenuPopup(", rightmenuname, ")\n", "Meta Shift <KeyDown>x: " "RebuildDiskMenu(", number, ",", rightmenuname, ") " "FakeButton(3) " "XawPositionSimpleMenu(", rightmenuname, ") " "XtMenuPopup(", rightmenuname, ")\n", NULL); drive_menu_translations[drive] = XtParseTranslationTable(translation_table); lib_free(translation_table); lib_free(rightmenuname); } for (i = 0; i < num_app_shells; i++) { XtOverrideTranslations(app_shells[i]. drive_widgets[drive].track_label, drive_menu_translations[drive]); } lib_free(leftmenuname); }
void uifliplist_update_menus(int from_unit, int to_unit) { /* Yick, allocate dynamically */ static ui_menu_entry_t flipmenu[NUM_DRIVES][FLIPLIST_MENU_LIMIT]; static struct cb_data_t cb_data[NUM_DRIVES][sizeof(cbd_enum_t)]; char *image = NULL, *t0 = NULL, *t1 = NULL, *t2 = NULL, *t3 = NULL; char *t4 = NULL, *t5 = NULL, *dir; void *fl_iterator; int i, drive, true_emu, fliplist_start = 0; static int name_count = 0; char *menuname; resources_get_int("DriveTrueEmulation", &true_emu); for (drive = from_unit - 8; (drive <= to_unit - 8) && (drive < NUM_DRIVES); drive++) { i = 0; t0 = t1 = t2 = t3 = t4 = t5 = NULL; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); t0 = lib_msprintf(_("Attach #%d"), drive + 8); flipmenu[drive][i].string = t0; flipmenu[drive][i].callback = (ui_callback_t)attach_disk; flipmenu[drive][i].callback_data = (ui_callback_data_t)(drive + 8); i++; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); t5 = lib_msprintf(_("Detach #%d"), drive + 8); flipmenu[drive][i].string = t5; flipmenu[drive][i].callback = (ui_callback_t)detach_disk; flipmenu[drive][i].callback_data = (ui_callback_data_t)(drive + 8); i++; #ifdef USE_GNOMEUI /* drivesettings */ /* this won't work so far for Xaw, because the checkmarks aren't updated when a menu is destroyed, as the flipmenu is dynamically regenerated; The Gnome code is already fixed. */ memcpy(&flipmenu[drive][i], (const char *)ui_drive_options_submenu, sizeof(ui_menu_entry_t)); i++; /* Write protext UI controll */ memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); flipmenu[drive][i].string = _("*Write Protect"); if (drive == 0) flipmenu[drive][i].callback = G_CALLBACK(toggle_AttachDevice8Readonly); else flipmenu[drive][i].callback = G_CALLBACK(toggle_AttachDevice9Readonly); i++; #endif fliplist_start = i; /* if we take the goto don't free anythin */ /* don't update menu deeply when drive has not been enabled or nothing has been attached */ if (true_emu) { if (!((1 << drive) & enabled_drives)) goto update_menu; } else { if (strcmp(last_attached_images[drive], "") == 0) goto update_menu; } memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); flipmenu[drive][i].string = "--"; i++; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); util_fname_split(fliplist_get_next(drive + 8), &dir, &image); t1 = util_concat(_("Next: "), image ? image : _("<empty>"), NULL); flipmenu[drive][i].string = t1; flipmenu[drive][i].callback = (ui_callback_t)attach_from_fliplist; cb_data[drive][CBD_NEXT].unit = drive + 8; cb_data[drive][CBD_NEXT].data = 1; flipmenu[drive][i].callback_data = (ui_callback_data_t)&(cb_data[drive][CBD_NEXT]); if (dir) lib_free(dir); if (image) lib_free(image); i++; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); util_fname_split(fliplist_get_prev(drive + 8), &dir, &image); t2 = util_concat(_("Previous: "), image ? image : _("<empty>"), NULL); flipmenu[drive][i].string = t2; flipmenu[drive][i].callback = (ui_callback_t)attach_from_fliplist; cb_data[drive][CBD_PREV].unit = drive + 8; cb_data[drive][CBD_PREV].data = 0; flipmenu[drive][i].callback_data = (ui_callback_data_t)&(cb_data[drive][CBD_PREV]); if (dir) lib_free(dir); if (image) lib_free(image); i++; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); util_fname_split(last_attached_images[drive], &dir, &image); t3 = util_concat(_("Add: "), image, NULL); flipmenu[drive][i].string = t3; flipmenu[drive][i].callback = (ui_callback_t)add2fliplist2; cb_data[drive][CBD_ADD].unit = drive + 8; cb_data[drive][CBD_ADD].data = (long) last_attached_images[drive]; flipmenu[drive][i].callback_data = (ui_callback_data_t)&(cb_data[drive][CBD_ADD]); if (dir) lib_free(dir); if (image) lib_free(image); i++; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); util_fname_split(last_attached_images[drive], &dir, &image); t4 = util_concat(_("Remove: "), image, NULL); flipmenu[drive][i].string = t4; flipmenu[drive][i].callback = (ui_callback_t)remove_from_fliplist2; cb_data[drive][CBD_REMOVE].unit = drive + 8; cb_data[drive][CBD_REMOVE].data = (long) last_attached_images[drive]; flipmenu[drive][i].callback_data = (ui_callback_data_t)&(cb_data[drive][CBD_REMOVE]); if (dir) lib_free(dir); if (image) lib_free(image); i++; memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); flipmenu[drive][i].string = "--"; i++; /* Now collect current fliplist */ fl_iterator = fliplist_init_iterate(drive + 8); fliplist_start = i; while (fl_iterator) { memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); util_fname_split(fliplist_get_image(fl_iterator), &dir, &image); flipmenu[drive][i].string = util_concat(NO_TRANS, image, NULL); flipmenu[drive][i].callback = (ui_callback_t)attach_from_fliplist2; flipmenu[drive][i].callback_data = (ui_callback_data_t)fl_iterator; fl_iterator = fliplist_next_iterate(drive + 8); if (dir) lib_free(dir); if (image) lib_free(image); i++; if (i >= (FLIPLIST_MENU_LIMIT - 1)) { /* the end delimitor must fit */ log_warning(LOG_DEFAULT, "Number of fliplist menu entries exceeded." "Cutting after %d entries.", i); break; } } update_menu: /* make sure the menu is well terminated */ memset(&(flipmenu[drive][i]), 0, sizeof(ui_menu_entry_t)); menuname = lib_msprintf("LeftDrive%iMenu%i", drive + 8, name_count); #ifdef USE_GNOMEUI ui_destroy_drive_menu(drive); ui_set_drive_menu(drive, flipmenu[drive]); #else /* ugly ... */ if (drive == 0) { ui_destroy_drive8_menu(); /* FIXME: Make sure the widget is really destroyed! */ ui_set_drive8_menu(ui_menu_create(menuname /*"LeftDrive8Menu"*/, flipmenu[drive], NULL)); } else { ui_destroy_drive9_menu(); /* FIXME: Make sure the widget is really destroyed! */ ui_set_drive9_menu(ui_menu_create(menuname /*"LeftDrive9Menu"*/, flipmenu[drive], NULL)); } #endif lib_free(menuname); if (t0) lib_free(t0); if (t1) lib_free(t1); if (t2) lib_free(t2); if (t3) lib_free(t3); if (t4) lib_free(t4); if (t5) lib_free(t5); while (fliplist_start < i) { if (flipmenu[drive][fliplist_start].string) lib_free(flipmenu[drive][fliplist_start].string); fliplist_start++; } } }
void ui_set_drive_menu(int drvnr, ui_menu_entry_t *menu) { drive_menus[drvnr] = gtk_menu_new(); ui_menu_create(drive_menus[drvnr], NULL, "DriveMenu", menu); }
void ui_menu_create(GtkWidget *w, GtkAccelGroup *accel, const char *menu_name, ui_menu_entry_t *list) { static int level = 0; unsigned int i, j; ui_menu_cb_obj *obj = NULL; level++; #ifdef DEBUG_MENUS printf("allocate new: %s\t(%p)\t%s\n", gtk_type_name(GTK_WIDGET_TYPE(w)), w, menu_name); #endif for (i = j = 0; list[i].string; i++) { GtkWidget *new_item = NULL; int do_right_justify = 0; char name[256]; sprintf(name, "MenuItem%d", j); /* ugly... */ switch (*list[i].string) { case '-': /* line */ new_item = gtk_menu_item_new(); break; case '*': /* toggle */ { /* Add this item to the list of calls to perform to update the menu status. */ char *label = make_menu_label(&list[i]); if (list[i].callback) { checkmark_t *cmt; new_item = gtk_check_menu_item_new_with_label(label + 1); cmt = (checkmark_t *)lib_malloc(sizeof(checkmark_t)); cmt->name = lib_stralloc(list[i].string+1); cmt->w = new_item; cmt->cb = list[i].callback; cmt->obj.value = (void*) list[i].callback_data; cmt->obj.status = CB_NORMAL; cmt->handlerid = g_signal_connect(G_OBJECT(new_item),"activate", G_CALLBACK(list[i].callback), (gpointer) &(cmt->obj)); g_signal_connect(G_OBJECT(new_item), "destroy", G_CALLBACK(delete_checkmark_cb), (gpointer) cmt); checkmark_list = g_list_prepend(checkmark_list, cmt); obj = &cmt->obj; } else new_item = gtk_menu_item_new_with_label(label + 1); j++; lib_free(label); break; } case 0: break; default: { char *item, *itemp; item = itemp = make_menu_label(&list[i]); if (strncmp(item, "RJ", 2) == 0) { do_right_justify = 1; item += 2; } new_item = gtk_menu_item_new_with_label(item); if (list[i].callback) { obj = (ui_menu_cb_obj*)lib_malloc(sizeof(ui_menu_cb_obj)); obj->value = (void*) list[i].callback_data; g_signal_connect(G_OBJECT(new_item),"activate", G_CALLBACK(list[i].callback), (gpointer) obj); } lib_free(itemp); j++; } } if (new_item) { gtk_menu_shell_append(GTK_MENU_SHELL(w), new_item); gtk_widget_show(new_item); if (do_right_justify) gtk_menu_item_set_right_justified(GTK_MENU_ITEM(new_item), TRUE); #ifdef DEBUG_MENUS printf("allocate new: %s\t(%p)\t%s\n", gtk_type_name(GTK_WIDGET_TYPE(new_item)), new_item, list[i].string); #endif } if (list[i].sub_menu) { GtkWidget *sub; if (new_item && *list[i].string != '-') { sub = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(new_item),sub); } else { sub = w; } ui_menu_create(sub, accel, list[i].string, list[i].sub_menu); } else { /* no submenu */ if (accel && list[i].hotkey_keysym != KEYSYM_NONE && list[i].callback != NULL && new_item != NULL) add_accelerator(new_item, accel, list[i].hotkey_keysym, list[i].hotkey_modifier); } } level--; }