diff src/iup.c @ 88:af4ed765c1ac

*: add IUP GUI a lot simpler than win32, but I assume there's more going on in the background that I don't know about :)
author Paper <paper@tflc.us>
date Mon, 14 Jul 2025 02:39:24 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/iup.c	Mon Jul 14 02:39:24 2025 -0400
@@ -0,0 +1,231 @@
+#include "common.h"
+
+#include <iup.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+struct msvpvf {
+	struct {
+		Ihandle *main; /* main window */
+		Ihandle *program; /* listbox, which program (Vegas Pro/Movie Studio) */
+		Ihandle *ver; /* which version */
+		Ihandle *vbox; /* main window vbox */
+		Ihandle *ofilebtn; /* open file button */
+		Ihandle *sfilebtn; /* save file button */
+		Ihandle *info; /* opened file info */
+		Ihandle *about_button; /* about button */
+		Ihandle *about; /* about dialog */
+		Ihandle *about_text; /* about text */
+	} dlg;
+
+	/* XXX this should be FILE *, so we can't randomly lose the file */
+	char *open_file;
+
+	uint8_t version;
+	enum types type;
+};
+
+static int msvpvf_info_update(struct msvpvf *m)
+{
+	uint8_t ver;
+	enum types type;
+	char *a;
+
+	if (!m) return -1;
+
+	{
+		FILE *i;
+
+		i = fopen(m->open_file, "rb");
+		if (!i) return 0;
+
+		get_file_information(i, &ver, &type);
+		fclose(i);
+	}
+
+	a = msvpvf_asprintf("File version: %s %d", type_names[type], (int)ver);
+	if (!a) return 0;
+	IupSetStrAttribute(m->dlg.info, "VALUE", a);
+	free(a);
+
+	return 1;
+}
+
+static int open_file(Ihandle *ih)
+{
+	/* why is IupGetAttribute not void * */
+	struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf");
+	const char *ofile;
+	Ihandle *dlg = IupFileDlg();
+
+	IupSetAttribute(dlg, "DIALOGTYPE", "OPEN");
+	IupSetAttribute(dlg, "TITLE", "Vegas Pro / Movie Studio version spoofer");
+	IupSetAttributes(dlg, "FILTER = \"*.veg;*.vf\", FILTERINFO = \"Project files\"");
+
+	IupPopup(dlg, IUP_CURRENT, IUP_CURRENT); 
+
+	if (IupGetInt(dlg, "STATUS") != -1) {
+		m->open_file = str_dup(IupGetAttribute(dlg, "VALUE"));
+		if (!msvpvf_info_update(m))
+			free(m->open_file);
+	}
+
+	IupDestroy(dlg); 
+	return 0;
+}
+
+static int save_file(Ihandle *ih)
+{
+	struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf");
+	Ihandle *dlg; 
+
+	if (!m->open_file)
+		return 0;
+
+	dlg = IupFileDlg();
+
+	IupSetAttribute(dlg, "DIALOGTYPE", "SAVE");
+	IupSetAttribute(dlg, "TITLE", "Vegas Pro / Movie Studio version spoofer");
+	/* FIXME add *.vf here */
+	IupSetAttributes(dlg, "FILTER = \"*.veg;*.vf\", FILTERINFO = \"Project files\"");
+	IupSetAttribute(dlg, "EXTDEFAULT", (m->type == TYPES_VF ? "vf" : "veg"));
+
+	IupPopup(dlg, IUP_CURRENT, IUP_CURRENT); 
+
+	if (IupGetInt(dlg, "STATUS") != -1) {
+		FILE *i, *o;
+		const char *sname;
+
+		sname = IupGetAttribute(dlg, "VALUE");
+
+		i = fopen(m->open_file, "rb");
+		o = fopen(sname, "wb");
+
+		if (i && o && (copy_file(i, o) >= 0))
+			set_file_information(o, m->version, m->type);
+
+		if (i) fclose(i);
+		if (o) fclose(o);
+	}
+
+	IupDestroy(dlg);
+	return 0;
+}
+
+static int type_cb(Ihandle *ih, char *text, int item, int state)
+{
+	struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf");
+
+	switch (item) {
+	case 1: m->type = TYPES_VEG; break;
+	case 2: m->type = TYPES_VF; break;
+	default: abort();
+	}
+
+	return 0;
+}
+
+static int ver_cb(Ihandle *ih)
+{
+	struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf");
+
+	/* epic */
+	m->version = IupGetIntId(ih, "SPINVALUE", 11);
+
+	return 0;
+}
+
+static int about_cb(Ihandle *ih)
+{
+	struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf");
+
+	IupPopup(m->dlg.about, IUP_CURRENT, IUP_CURRENT);
+
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	struct msvpvf msvpvf;
+	static const char about_text[] = {
+#embed "../LICENSE"
+		, 0 /* nul terminate */
+	};
+
+	IupOpen(&argc, &argv);
+	IupSetLanguage("ENGLISH");
+
+	// FIXME: use UTF-8 filenames on Windows
+
+	msvpvf.dlg.ofilebtn = IupButton("Open File", NULL);
+	IupSetAttribute(msvpvf.dlg.ofilebtn, "msvpvf", (char *)&msvpvf);
+	IupSetCallback(msvpvf.dlg.ofilebtn, "ACTION", open_file);
+
+	msvpvf.dlg.info = IupText(NULL);
+	IupSetAttribute(msvpvf.dlg.info, "READONLY", "YES");
+	IupSetAttribute(msvpvf.dlg.info, "VISIBLECOLUMNS", "15");
+	IupSetAttribute(msvpvf.dlg.info, "VALUE", "No file opened!");
+	IupSetAttribute(msvpvf.dlg.info, "ALIGNMENT", "ACENTER");
+	IupSetAttribute(msvpvf.dlg.info, "CANFOCUS", "NO");
+	IupSetAttribute(msvpvf.dlg.info, "BORDER", "NO");
+
+	msvpvf.dlg.program = IupList(NULL);
+	IupSetAttribute(msvpvf.dlg.program, "msvpvf", (char *)&msvpvf);
+	IupSetAttribute(msvpvf.dlg.program, "ALIGNMENT", "ACENTER");
+	IupSetAttribute(msvpvf.dlg.program, "1", "Vegas Pro");
+	IupSetAttribute(msvpvf.dlg.program, "2", "Movie Studio");
+	IupSetAttribute(msvpvf.dlg.program, "3", NULL);
+	IupSetAttribute(msvpvf.dlg.program, "VALUE", "1");
+	IupSetAttribute(msvpvf.dlg.program, "EXPAND", "YES");
+	IupSetCallback(msvpvf.dlg.program, "ACTION", (Icallback)type_cb);
+	msvpvf.type = TYPES_VEG;
+
+	msvpvf.dlg.ver = IupText(NULL);
+	IupSetAttribute(msvpvf.dlg.ver, "msvpvf", (char *)&msvpvf);
+	IupSetAttribute(msvpvf.dlg.ver, "SPIN", "YES");
+	IupSetAttribute(msvpvf.dlg.ver, "SPINMAX", "21");
+	IupSetAttribute(msvpvf.dlg.ver, "SPINMIN", "8");
+	IupSetAttribute(msvpvf.dlg.ver, "SPINVALUE", "11"); /* default */
+	IupSetCallback(msvpvf.dlg.ver, "ACTION", ver_cb);
+	msvpvf.version = 11;
+
+	msvpvf.dlg.sfilebtn = IupButton("Save File", NULL);
+	IupSetAttribute(msvpvf.dlg.sfilebtn, "msvpvf", (char *)&msvpvf);
+	IupSetCallback(msvpvf.dlg.sfilebtn, "ACTION", save_file);
+
+	msvpvf.dlg.about_button = IupButton("About msvpvf", NULL);
+	IupSetAttribute(msvpvf.dlg.about_button, "msvpvf", (char *)&msvpvf);
+	IupSetCallback(msvpvf.dlg.about_button, "ACTION", about_cb);
+
+	msvpvf.dlg.vbox = IupVbox(msvpvf.dlg.ofilebtn, msvpvf.dlg.info, msvpvf.dlg.program, msvpvf.dlg.ver, msvpvf.dlg.sfilebtn, msvpvf.dlg.about_button, NULL);
+	IupSetAttribute(msvpvf.dlg.vbox, "ALIGNMENT", "ACENTER");
+	IupSetAttribute(msvpvf.dlg.vbox, "GAP", "10");
+	IupSetAttribute(msvpvf.dlg.vbox, "MARGIN", "10x10");
+	IupSetAttribute(msvpvf.dlg.vbox, "EXPAND", "YES");
+
+	msvpvf.dlg.main = IupDialog(msvpvf.dlg.vbox);
+	IupSetAttribute(msvpvf.dlg.main, "TITLE", "Vegas Pro / Movie Studio version spoofer");
+	//IupSetAttribute(msvpvf.dlg.main, "MINSIZE", "225x200");
+
+	msvpvf.dlg.about_text = IupText(NULL);
+	IupSetAttribute(msvpvf.dlg.about_text, "READONLY", "YES");
+	IupSetAttribute(msvpvf.dlg.about_text, "VALUE", about_text);
+	IupSetAttribute(msvpvf.dlg.about_text, "CANFOCUS", "NO");
+	IupSetAttribute(msvpvf.dlg.about_text, "BORDER", "NO");
+	IupSetAttribute(msvpvf.dlg.about_text, "MULTILINE", "YES");
+	IupSetAttribute(msvpvf.dlg.about_text, "EXPAND", "YES");
+	IupSetAttribute(msvpvf.dlg.about_text, "PADDING", "10x10");
+
+	msvpvf.dlg.about = IupDialog(msvpvf.dlg.about_text);
+	IupSetAttribute(msvpvf.dlg.about, "TITLE", "About Vegas Pro / Movie Studio version spoofer");
+	IupSetAttribute(msvpvf.dlg.about, "MINSIZE", "500x300");
+
+	IupShowXY(msvpvf.dlg.main, IUP_CENTER, IUP_CENTER);
+
+	IupMainLoop();
+
+	IupClose();
+
+	return 0;
+}