Example #1
0
/* 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();
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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++;
        }
    }
}
Example #6
0
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);
}
Example #7
0
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--;
}