From 94e85d21b950cce1d17603359723d001b827ad82 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 6 Nov 2004 19:58:19 +0200 Subject: [PATCH] imported winuaesrc0992b5.zip --- cfgfile.c | 80 ++++++++++++++++ cia.c | 3 +- disk.c | 30 ++++-- drawing.c | 17 ++-- driveclick.c | 6 +- filesys.c | 14 +-- include/options.h | 1 + inputdevice.c | 23 +++-- keybuf.c | 24 +++-- od-win32/dinput.c | 2 +- od-win32/keyboard_win32.c | 2 +- od-win32/parser.c | 13 +-- od-win32/parser.h | 2 +- od-win32/resources/resource.h | 8 +- od-win32/resources/winuae.rc | 27 +++++- od-win32/resources/xarcade-winuae.bmp | Bin 0 -> 133158 bytes od-win32/win32.c | 43 +++++---- od-win32/win32.h | 2 +- od-win32/win32gfx.c | 2 + od-win32/win32gui.c | 119 +++++++++++++++++++++++- od-win32/winuae_msvc/winuae_msvc.vcproj | 3 + 21 files changed, 336 insertions(+), 85 deletions(-) create mode 100755 od-win32/resources/xarcade-winuae.bmp diff --git a/cfgfile.c b/cfgfile.c index 8366bc99..479e3f74 100755 --- a/cfgfile.c +++ b/cfgfile.c @@ -1774,6 +1774,82 @@ void cfgfile_addcfgparam (char *line) temp_lines = u; } +static int getconfigstoreline (struct zfile *z, char *option, char *value) +{ + char tmp[CONFIG_BLEN * 2]; + int idx = 0; + + for (;;) { + uae_u8 b = 0; + if (zfile_fread (&b, 1, 1, z) != 1) + return 0; + tmp[idx++] = b; + tmp[idx] = 0; + if (b == '\n') + break; + } + return separate_line (tmp, option, value); +} + + +int cfgfile_handle_custom_event (char *custom, int mode) +{ + char option[CONFIG_BLEN], value[CONFIG_BLEN]; + char option2[CONFIG_BLEN], value2[CONFIG_BLEN]; + char *tmp, *p, *nextp; + struct zfile *configstore = NULL; + int cnt = 0, cnt_ok = 0; + + if (!mode) { + uae_u8 zero = 0; + configstore = zfile_fopen_empty ("configstore", 50000); + save_options (configstore, &currprefs, 0); + zfile_fwrite (&zero, 1, 1, configstore); + } + + nextp = NULL; + tmp = p = xcalloc (strlen (custom) + 2, 1); + strcpy (tmp, custom); + while (p && *p) { + if (*p == '\"') { + char *p2; + p++; + p2 = p; + while (*p2 != '\"' && *p2 != 0) + p2++; + if (*p2 == '\"') { + *p2++ = 0; + nextp = p2 + 1; + if (*nextp == ' ') + nextp++; + } + } + if (separate_line (p, option, value)) { + cnt++; + if (mode) { + cfgfile_parse_option (&changed_prefs, option, value, 0); + } else { + zfile_fseek (configstore, 0, SEEK_SET); + for (;;) { + if (!getconfigstoreline (configstore, option2, value2)) + break; + if (!strcmpi (option, option2) && !strcmpi (value, value2)) { + cnt_ok++; + break; + } + } + } + } + p = nextp; + } + xfree (tmp); + zfile_fclose (configstore); + if (cnt > 0 && cnt == cnt_ok) + return 1; + return 0; +} + + int cmdlineparser (char *s, char *outp[], int max) { int j, cnt = 0; @@ -2094,6 +2170,10 @@ void default_prefs (struct uae_prefs *p, int type) p->serial_demand = 0; p->serial_hwctsrts = 1; p->parallel_demand = 0; + p->parallel_postscript_emulation = 0; + p->parallel_postscript_detection = 0; + p->parallel_autoflush_time = 5; + p->ghostscript_parameters[0] = 0; p->jport0 = JSEM_MICE; p->jport1 = JSEM_KBDLAYOUT; diff --git a/cia.c b/cia.c index fdce3d83..cf1cd574 100755 --- a/cia.c +++ b/cia.c @@ -678,11 +678,10 @@ static void WriteCIAA (uae_u16 addr,uae_u8 val) #ifdef PARALLEL_PORT if (isprinter() > 0) { doprinter (val); - ciaaicr |= 0x10; } else if (isprinter() < 0) { parallel_direct_write_data (val, ciaadrb); - ciaaicr |= 0x10; } + cia_parallelack (); #endif break; case 2: diff --git a/disk.c b/disk.c index 2624ebf7..ec079d74 100755 --- a/disk.c +++ b/disk.c @@ -75,7 +75,7 @@ * L track length in bits */ -static int side, direction, writing; +static int side, direction; static uae_u8 selected = 15, disabled; static uae_u8 writebuffer[544 * 11 * DDHDMULT]; @@ -572,22 +572,20 @@ static void reset_drive(int i) static void update_drive_gui (int num) { drive *drv = floppy + num; + int writ = dskdmaen == 3 && drv->state ? 1 : 0; if (drv->state == gui_data.drive_motor[num] && drv->cyl == gui_data.drive_track[num] && side == gui_data.drive_side && drv->crc32 == gui_data.crc32[num] - && ((writing && gui_data.drive_writing[num]) - || (!writing && !gui_data.drive_writing[num]))) { + && writ == gui_data.drive_writing[num]) return; - } strcpy (gui_data.df[num], currprefs.df[num]); gui_data.crc32[num] = drv->crc32; gui_data.drive_motor[num] = drv->state; gui_data.drive_track[num] = drv->cyl; gui_data.drive_side = side; - if (!gui_data.drive_writing[num]) - gui_data.drive_writing[num] = writing; + gui_data.drive_writing[num] = writ; gui_ledstate &= ~(2 << num); if (drv->state) gui_ledstate |= 2 << num; @@ -2010,7 +2008,13 @@ static void disk_dmafinished (void) INTREQ (0x8002); dskdmaen = 0; #ifdef DISK_DEBUG - write_dlog("disk dma finished %08.8X\n", dskpt); + { + int dr, mfmpos = -1; + write_dlog("disk dma finished %08.8X MFMpos=", dskpt); + for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) + write_log ("%d%s", floppy[dr].mfmpos, dr < MAX_FLOPPY_DRIVES - 1 ? "," : ""); + write_log ("\n"); + } #endif } @@ -2161,7 +2165,7 @@ static void disk_doupdate_predict (drive * drv, int startcycle) if (mfmpos == drv->indexoffset) { diskevent_flag |= DISK_INDEXSYNC; indexhack = 0; - } + } if (dskdmaen != 3 && mfmpos == drv->skipoffset) { int skipcnt = disk_jitter; while (skipcnt-- > 0) { @@ -2332,6 +2336,7 @@ static void DISK_start (void) if (dskdmaen == 3) { drv->tracklen = FLOPPY_WRITE_LEN * drv->ddhd * 8 * 2; drv->trackspeed = get_floppy_speed (); + drv->skipoffset = -1; updatemfmpos (drv); } /* Ugh. A nasty hack. Assume ADF_EXT1 tracks are always read @@ -2454,17 +2459,22 @@ void DSKLEN (uae_u16 v, int hpos) if ((selected & (1 << dr)) == 0) break; } - if (dr == 4) + if (dr == 4) { write_log ("disk %s DMA started but no drive selected!\n", dskdmaen == 3 ? "write" : "read"); - else + } else { write_log ("disk %s DMA started, drv=%x track %d mfmpos %d\n", dskdmaen == 3 ? "write" : "read", selected ^ 15, floppy[dr].cyl * 2 + side, floppy[dr].mfmpos); + update_drive_gui (dr); + } write_dlog ("LEN=%04.4X (%d) SYNC=%04.4X PT=%08.8X ADKCON=%04.4X PC=%08.8X\n", dsklength, dsklength, (adkcon & 0x400) ? dsksync : 0xffff, dskpt, adkcon, m68k_getpc()); #endif + for (dr = 0; dr < MAX_FLOPPY_DRIVES; dr++) + update_drive_gui (dr); + /* Try to make floppy access from Kickstart faster. */ if (dskdmaen != 2 && dskdmaen != 3) return; diff --git a/drawing.c b/drawing.c index 8272c96c..e11600a3 100755 --- a/drawing.c +++ b/drawing.c @@ -1749,17 +1749,20 @@ static void draw_status_line (int line) for (led = 0; led < NUM_LEDS; led++) { int side, pos, num1 = -1, num2 = -1, num3 = -1, num4 = -1, x, off_rgb, on_rgb, c, on = 0; if (led >= 1 && led <= 4) { - int track = gui_data.drive_track[led-1]; - pos = 5 + (led - 1); - if (!gui_data.drive_disabled[led - 1]) { + int pled = led - 1; + int track = gui_data.drive_track[pled]; + pos = 5 + pled; + on_rgb = 0x0c0; + off_rgb = 0x030; + if (!gui_data.drive_disabled[pled]) { num1 = -1; num2 = track / 10; num3 = track % 10; - on = gui_data.drive_motor[led-1]; + on = gui_data.drive_motor[pled]; + if (gui_data.drive_writing[pled]) + on_rgb = 0xc00; } side = gui_data.drive_side; - on_rgb = 0x0c0; - off_rgb = 0x030; } else if (led == 0) { pos = 2; on = gui_data.powerled; @@ -1776,7 +1779,7 @@ static void draw_status_line (int line) } else if (led == 6) { pos = 3; on = gui_data.hd; - on_rgb = 0x00c; + on_rgb = on == 2 ? 0xc00 : 0x00c; off_rgb = 0x003; num1 = -1; num2 = 11; diff --git a/driveclick.c b/driveclick.c index 9ac446a4..972987cf 100755 --- a/driveclick.c +++ b/driveclick.c @@ -149,10 +149,8 @@ void driveclick_init(void) v = 0; if (driveclick_loadresource (drvs[i], currprefs.dfxclick[i])) v = 3; - for (j = 0; j < CLICK_TRACKS; j++) { - drvs[i][DS_CLICK].indexes[j] = 0; - drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len >> DS_SHIFT; - } + for (j = 0; j < CLICK_TRACKS; j++) + drvs[i][DS_CLICK].lengths[j] = drvs[i][DS_CLICK].len; } else if (currprefs.dfxclick[i] == -1) { sprintf (tmp, "%suae_data%cdrive_click_%s", start_path, FSDB_DIR_SEPARATOR, currprefs.dfxclickexternal[i]); v = loadsample (tmp, &drvs[i][DS_CLICK]); diff --git a/filesys.c b/filesys.c index da73ebf2..7397cd1a 100755 --- a/filesys.c +++ b/filesys.c @@ -2470,7 +2470,7 @@ action_write (Unit *unit, dpacket packet) return; } - gui_hd_led (1); + gui_hd_led (2); TRACE(("ACTION_WRITE(%s,0x%lx,%ld)\n",k->aino->nname,addr,size)); if (unit->ui.readonly) { @@ -2583,7 +2583,7 @@ action_set_protect (Unit *unit, dpacket packet) PUT_PCK_RES1 (packet, DOS_TRUE); } notify_check (unit, a); - gui_hd_led (1); + gui_hd_led (2); } static void action_set_comment (Unit * unit, dpacket packet) @@ -2626,7 +2626,7 @@ static void action_set_comment (Unit * unit, dpacket packet) a->comment = commented; fsdb_set_file_attrs (a); notify_check (unit, a); - gui_hd_led (1); + gui_hd_led (2); } static void @@ -2812,7 +2812,7 @@ action_create_dir (Unit *unit, dpacket packet) notify_check (unit, aino); updatedirtime (aino, 0); PUT_PCK_RES1 (packet, make_lock (unit, aino->uniq, -2) >> 2); - gui_hd_led (1); + gui_hd_led (2); } static void @@ -2950,7 +2950,7 @@ action_delete_object (Unit *unit, dpacket packet) delete_aino (unit, a); } PUT_PCK_RES1 (packet, DOS_TRUE); - gui_hd_led (1); + gui_hd_led (2); } static void @@ -2982,7 +2982,7 @@ action_set_date (Unit *unit, dpacket packet) } else PUT_PCK_RES1 (packet, DOS_TRUE); notify_check (unit, a); - gui_hd_led (1); + gui_hd_led (2); } static void @@ -3115,7 +3115,7 @@ action_rename_object (Unit *unit, dpacket packet) if (a2->elock > 0 || a2->shlock > 0 || wehavekeys > 0) de_recycle_aino (unit, a2); PUT_PCK_RES1 (packet, DOS_TRUE); - gui_hd_led (1); + gui_hd_led (2); } static void diff --git a/include/options.h b/include/options.h index a26e7f91..93a86411 100755 --- a/include/options.h +++ b/include/options.h @@ -272,6 +272,7 @@ extern uae_u32 cfgfile_uaelib_modify (uae_u32 mode, uae_u32 parms, uae_u32 size, extern void cfgfile_addcfgparam (char *); extern int build_in_prefs (struct uae_prefs *p, int model, int config, int compa, int romcheck); extern int cmdlineparser (char *s, char *outp[], int max); +extern int cfgfile_handle_custom_event (char *custom, int mode); extern void fixup_prefs_dimensions (struct uae_prefs *prefs); extern void fixup_prefs (struct uae_prefs *prefs); diff --git a/inputdevice.c b/inputdevice.c index 90656855..bf68ab28 100755 --- a/inputdevice.c +++ b/inputdevice.c @@ -197,7 +197,7 @@ static void write_config2 (struct zfile *f, int idnum, int i, int offset, char * *p = 0; } if (custom) - sprintf (p, "\"%s\".%d", custom, id->flags[i + offset][j]); + sprintf (p, "'%s'.%d", custom, id->flags[i + offset][j]); else if (event <= 0) sprintf (p, "NULL"); else @@ -280,7 +280,7 @@ static void write_kbr_config (struct zfile *f, int idnum, int devnum, struct uae *p = 0; } if (custom) - sprintf (p, "\"%s\".%d", custom, kbr->flags[i][j]); + sprintf (p, "'%s'.%d", custom, kbr->flags[i][j]); else if (event > 0) sprintf (p, "%s.%d", events[event].confname, kbr->flags[i][j]); else @@ -329,7 +329,7 @@ static int getnum (char **pp) static char *getstring (char **pp) { int i; - static char str[100]; + static char str[1000]; char *p = *pp; if (*p == 0) @@ -467,7 +467,7 @@ void read_inputdevice_config (struct uae_prefs *pr, char *option, char *value) ie = &events[i]; if (!ie->name) { ie = &events[0]; - if (strlen (p2) > 2 && p2[0] == '"' && p2[strlen (p2) - 1] == '"') { + if (strlen (p2) > 2 && p2[0] == '\'' && p2[strlen (p2) - 1] == '\'') { custom = my_strdup (p2 + 1); custom[strlen (custom) - 1] = 0; } @@ -1118,6 +1118,8 @@ static void queue_input_event (int event, int state, int max, int framecnt, int struct input_queue_struct *iq; int i = check_input_queue (event); + if (event <= 0) + return; if (state < 0 && i >= 0) { iq = &input_queue[i]; iq->nextframecnt = -1; @@ -1305,13 +1307,14 @@ void handle_input_event (int nr, int state, int max, int autofire) struct inputevent *ie; int joy; - if (nr <= 0) return; + if (nr <= 0) + return; ie = &events[nr]; //write_log("'%s' %d %d\n", ie->name, state, max); if (autofire) { if (state) queue_input_event (nr, state, max, currprefs.input_autofire_framecnt, 1); - else + else queue_input_event (nr, -1, 0, 0, 1); } switch (ie->unit) @@ -1455,12 +1458,14 @@ static void setbuttonstateall (struct uae_input_device *id, struct uae_input_dev uae_u32 mask = 1 << button; uae_u32 omask = id2->buttonmask & mask; uae_u32 nmask = (state ? 1 : 0) << button; + char *custom; if (button >= ID_BUTTON_TOTAL) return; for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) { event = id->eventid[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]]; - if (event <= 0) + custom = id->custom[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]]; + if (event <= 0 && custom == NULL) continue; autofire = (id->flags[ID_BUTTON_OFFSET + button][sublevdir[state <= 0 ? 1 : 0][i]] & ID_FLAG_AUTOFIRE) ? 1 : 0; if (state < 0) { @@ -1838,6 +1843,7 @@ int inputdevice_translatekeycode (int keyboard, int scancode, int state) for (k = 0; k < MAX_INPUT_SUB_EVENT; k++) {/* send key release events in reverse order */ int autofire = (na->flags[j][sublevdir[state == 0 ? 1 : 0][k]] & ID_FLAG_AUTOFIRE) ? 1 : 0; int event = na->eventid[j][sublevdir[state == 0 ? 1 : 0][k]]; + char *custom = na->custom[j][sublevdir[state == 0 ? 1 : 0][k]]; handle_input_event (event, state, 1, autofire); //write_log ("'%s' %d ('%s') %d\n", na->name, event, events[event].name, state); } @@ -2345,7 +2351,8 @@ void setjoystickstate (int joy, int axis, int state, int max) if (v1 == v2) return; for (i = 0; i < MAX_INPUT_SUB_EVENT; i++) - handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], state, max, id->flags[ID_AXIS_OFFSET + axis][i]); + handle_input_event (id->eventid[ID_AXIS_OFFSET + axis][i], state, max, + id->flags[ID_AXIS_OFFSET + axis][i]); id2->states[axis] = state; } diff --git a/keybuf.c b/keybuf.c index b3483d1f..5388bcce 100755 --- a/keybuf.c +++ b/keybuf.c @@ -114,8 +114,8 @@ void record_key (int kc) case AK_NP4: fs = 1; fs_xa1[1] = b; break; case AK_NP6: fs = 1; fs_xa1[2] = b; break; case AK_NP2: fs = 1; fs_xa1[3] = b; break; - case AK_RCTRL: fs = 1; fs_xa1[4] = b; break; - case AK_RALT: fs = 1; fs_xa1[5] = b; break; + case AK_CTRL: fs = 1; fs_xa1[4] = b; break; + case AK_LALT: fs = 1; fs_xa1[5] = b; break; case AK_SPC: fs = 1; fs_xa1[6] = b; break; } } @@ -144,18 +144,28 @@ void record_key (int kc) } if (fs_xa1 || fs_xa2) { int k2 = k; + if (k == AK_1) + k2 = AK_F1; + if (k == AK_2) + k2 = AK_F2; if (k == AK_3) k2 = AK_LALT; if (k == AK_4) k2 = AK_RALT; if (k == AK_6) k2 = AK_DN; - if (k == AK_1) - k2 = AK_F1; - if (k == AK_2) - k2 = AK_F2; - if (k == AK_X || k == AK_LBRACKET) + if (k == AK_LBRACKET || k == AK_LSH) k2 = AK_SPC; + if (k == AK_RBRACKET) + k2 = AK_RET; + if (k == AK_C) + k2 = AK_1; + if (k == AK_5) + k2 = AK_2; + if (k == AK_Z) + k2 = AK_3; + if (k == AK_X) + k2 = AK_4; if (k != k2) kc = (k2 << 1) | (b ? 0 : 1); } diff --git a/od-win32/dinput.c b/od-win32/dinput.c index 0534d628..50ce2b06 100755 --- a/od-win32/dinput.c +++ b/od-win32/dinput.c @@ -535,7 +535,7 @@ static void sortobjects (struct didata *did, int *mappings, int *sort, char **na if (num > 0) { write_log ("%s (GUID=%s):\n", did->name, outGUID (&did->guid)); for (i = 0; i < num; i++) - write_log ("%d '%s' (%d,%d)\n", mappings[i], names[i], sort[i], types ? types[i] : -1); + write_log ("%02.2X %0.03d '%s' (%d,%d)\n", mappings[i], mappings[i], names[i], sort[i], types ? types[i] : -1); } #endif } diff --git a/od-win32/keyboard_win32.c b/od-win32/keyboard_win32.c index 2b62ff74..5683ef06 100755 --- a/od-win32/keyboard_win32.c +++ b/od-win32/keyboard_win32.c @@ -244,7 +244,7 @@ static int handlecd32 (int scancode, int state) } if (!e) return 0; - handle_input_event (e, state, 1, 0); + handle_input_event (e, state, 1, 0, NULL); return 1; } #endif diff --git a/od-win32/parser.c b/od-win32/parser.c index 4aaf06e9..db12f248 100755 --- a/od-win32/parser.c +++ b/od-win32/parser.c @@ -218,14 +218,14 @@ static void flushprtbuf (void) prtbufbytes = 0; return; } else if (hPrt != INVALID_HANDLE_VALUE) { - if( WritePrinter( hPrt, prtbuf, prtbufbytes, &written ) ) { - if( written != prtbufbytes ) - write_log( "PRINTER: Only wrote %d of %d bytes!\n", written, prtbufbytes ); + if (WritePrinter(hPrt, prtbuf, prtbufbytes, &written)) { + if (written != prtbufbytes) + write_log("PRINTER: Only wrote %d of %d bytes!\n", written, prtbufbytes); } else { - write_log( "PRINTER: Couldn't write data!\n" ); + write_log("PRINTER: Couldn't write data!\n"); } } else { - write_log( "PRINTER: Not open!\n" ); + write_log("PRINTER: Not open!\n"); } prtbufbytes = 0; } @@ -401,7 +401,8 @@ void openprinter( void ) prtopen = 1; return; } else if (hPrt == INVALID_HANDLE_VALUE) { - if( OpenPrinter(currprefs.prtname, &hPrt, NULL ) ) { + flushprtbuf (); + if (OpenPrinter(currprefs.prtname, &hPrt, NULL)) { // Fill in the structure with info about this "document." DocInfo.pDocName = "My Document"; DocInfo.pOutputFile = NULL; diff --git a/od-win32/parser.h b/od-win32/parser.h index cee1bf6b..867187fc 100755 --- a/od-win32/parser.h +++ b/od-win32/parser.h @@ -7,7 +7,7 @@ * Copyright 1998-1999 Brian King */ -#define PRTBUFSIZE 4096 +#define PRTBUFSIZE 65536 int setbaud (long baud ); void getserstat(int *status); diff --git a/od-win32/resources/resource.h b/od-win32/resources/resource.h index 4cefdb03..9873e303 100755 --- a/od-win32/resources/resource.h +++ b/od-win32/resources/resource.h @@ -213,6 +213,8 @@ #define IDS_SOUND_4CHANNEL 242 #define IDS_HF_FS_CUSTOM 243 #define IDS_SELECTFS 244 +#define IDB_BITMAP1 246 +#define IDB_XARCADE 246 #define IDS_NUMSG_NEEDEXT2 300 #define IDS_NUMSG_NOROMKEY 301 #define IDS_NUMSG_KSROMCRCERROR 302 @@ -398,8 +400,6 @@ #define IDC_PORT1_KBDC 1311 #define IDC_PORT1_KBDD 1312 #define IDC_PORT1_KBDE 1313 -#define IDC_PORT0 1342 -#define IDC_PORT1 1343 #define IDC_MIDIFRAME 1314 #define IDC_SERPARFRAME 1315 #define IDC_SERIALFRAME 1316 @@ -411,6 +411,8 @@ #define IDC_NEW_FS 1339 #define IDC_NEW_HF 1340 #define IDC_NEW_HD 1341 +#define IDC_PORT0 1342 +#define IDC_PORT1 1343 #define IDC_PATH_NAME 1362 #define IDC_SELECTOR 1363 #define IDC_VOLUME_NAME 1364 @@ -815,7 +817,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 245 +#define _APS_NEXT_RESOURCE_VALUE 247 #define _APS_NEXT_COMMAND_VALUE 40021 #define _APS_NEXT_CONTROL_VALUE 1699 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/od-win32/resources/winuae.rc b/od-win32/resources/winuae.rc index 3f4128ad..51259dd6 100755 --- a/od-win32/resources/winuae.rc +++ b/od-win32/resources/winuae.rc @@ -445,9 +445,9 @@ BEGIN CONTROL "Keyboard Layout ""C"" []T = up, B = down, F = left, H = right, left ALT = fire", IDC_PORT0_KBDC,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP, 10,198,90,10 - CONTROL "X-Arcade (left)",IDC_PORT0_KBDD,"Button", + CONTROL "X-Arcade (left) []#1",IDC_PORT0_KBDD,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,10,210,90,10 - CONTROL "X-Arcade (right)",IDC_PORT0_KBDE,"Button", + CONTROL "X-Arcade (right) []#1",IDC_PORT0_KBDE,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,10,222,90,10 COMBOBOX IDC_PORT0_JOYS,23,153,117,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -463,9 +463,9 @@ BEGIN CONTROL "Keyboard Layout ""C"" []T = up, B = down, F = left, H = right, left ALT = fire", IDC_PORT1_KBDC,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP, 155,198,90,10 - CONTROL "X-Arcade (left)",IDC_PORT1_KBDD,"Button", + CONTROL "X-Arcade (left) []#1",IDC_PORT1_KBDD,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,155,210,90,10 - CONTROL "X-Arcade (right)",IDC_PORT1_KBDE,"Button", + CONTROL "X-Arcade (right) []#1",IDC_PORT1_KBDE,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,155,222,90,10 COMBOBOX IDC_PORT1_JOYS,168,153,123,130,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP @@ -1445,6 +1445,25 @@ END ///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// Finnish resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FIN) +#ifdef _WIN32 +LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_XARCADE BITMAP "xarcade-winuae.bmp" +#endif // Finnish resources +///////////////////////////////////////////////////////////////////////////// + + #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// diff --git a/od-win32/resources/xarcade-winuae.bmp b/od-win32/resources/xarcade-winuae.bmp new file mode 100755 index 0000000000000000000000000000000000000000..acb6f913b3f2fa335ca16d469df7967cf669f53c GIT binary patch literal 133158 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 Oq48DPrxbE6dH)|QJBm*L literal 0 HcmV?d00001 diff --git a/od-win32/win32.c b/od-win32/win32.c index ac948839..86deb208 100755 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -781,8 +781,7 @@ static long FAR PASCAL AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam, break; case WM_CLOSE: - if (!currprefs.win32_ctrl_F11_is_quit) - uae_quit (); + uae_quit (); return 0; case WM_WINDOWPOSCHANGED: @@ -877,6 +876,11 @@ static long FAR PASCAL AmigaWindowProc (HWND hWnd, UINT message, WPARAM wParam, } break; + case WM_SYSKEYDOWN: + if(currprefs.win32_ctrl_F11_is_quit && wParam == VK_F4) + return 0; + break; + case 0xff: // WM_INPUT: handle_rawinput (lParam); break; @@ -1987,22 +1991,21 @@ static void WIN32_HandleRegistryStuff( void ) } RegQueryValueEx( hWinUAEKey, "DisplayInfo", 0, &dwType, (LPBYTE)&colortype, &dwDisplayInfoSize ); - if( colortype == 0 ) /* No color information stored in the registry yet */ + if (colortype == 0) /* No color information stored in the registry yet */ { - char szMessage[ 4096 ]; - char szTitle[ MAX_DPATH ]; - WIN32GUI_LoadUIString( IDS_GFXCARDCHECK, szMessage, 4096 ); - WIN32GUI_LoadUIString( IDS_GFXCARDTITLE, szTitle, MAX_DPATH ); + char szMessage[4096]; + char szTitle[MAX_DPATH]; + WIN32GUI_LoadUIString(IDS_GFXCARDCHECK, szMessage, 4096); + WIN32GUI_LoadUIString(IDS_GFXCARDTITLE, szTitle, MAX_DPATH); - if( MessageBox( NULL, szMessage, szTitle, MB_YESNO | MB_ICONWARNING | MB_TASKMODAL | MB_SETFOREGROUND ) == IDYES ) - { + if(MessageBox(NULL, szMessage, szTitle, MB_YESNO | MB_ICONWARNING | MB_TASKMODAL | MB_SETFOREGROUND ) == IDYES) { colortype = WIN32GFX_FigurePixelFormats(0); RegSetValueEx( hWinUAEKey, "DisplayInfo", 0, REG_DWORD, (CONST BYTE *)&colortype, sizeof( colortype ) ); } } - if( colortype ) { + if (colortype) { /* Set the 16-bit pixel format for the appropriate modes */ - WIN32GFX_FigurePixelFormats( colortype ); + WIN32GFX_FigurePixelFormats(colortype); } size = sizeof (quickstart); RegQueryValueEx( hWinUAEKey, "QuickStartMode", 0, &dwType, (LPBYTE)&quickstart, &size ); @@ -2282,18 +2285,23 @@ int execute_command (char *cmd) return 0; } +#include "driveclick.h" static int drvsampleres[] = { - IDR_DRIVE_CLICK_A500_1, IDR_DRIVE_SPIN_A500_1, IDR_DRIVE_SPINND_A500_1, - IDR_DRIVE_STARTUP_A500_1, IDR_DRIVE_SNATCH_A500_1 + IDR_DRIVE_CLICK_A500_1, DS_CLICK, + IDR_DRIVE_SPIN_A500_1, DS_SPIN, + IDR_DRIVE_SPINND_A500_1, DS_SPINND, + IDR_DRIVE_STARTUP_A500_1, DS_START, + IDR_DRIVE_SNATCH_A500_1, DS_SNATCH, + -1 }; -#include "driveclick.h" -int driveclick_loadresource (struct drvsample *s, int drivetype) +int driveclick_loadresource (struct drvsample *sp, int drivetype) { int i, ok; ok = 1; - for (i = 0; i < DS_END; i++) { - HRSRC res = FindResource(NULL, MAKEINTRESOURCE(drvsampleres[i]), "WAVE"); + for (i = 0; drvsampleres[i] >= 0; i += 2) { + struct drvsample *s = sp + drvsampleres[i + 1]; + HRSRC res = FindResource(NULL, MAKEINTRESOURCE(drvsampleres[i + 0]), "WAVE"); if (res != 0) { HANDLE h = LoadResource(NULL, res); int len = SizeofResource(NULL, res); @@ -2303,7 +2311,6 @@ int driveclick_loadresource (struct drvsample *s, int drivetype) } else { ok = 0; } - s++; } return ok; } diff --git a/od-win32/win32.h b/od-win32/win32.h index a851395d..6d25d480 100755 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -22,7 +22,7 @@ extern int manual_palette_refresh_needed; extern int mouseactive, focus; extern int ignore_messages_all; #define WINUAEBETA 1 -#define WINUAEBETASTR " Beta 4" +#define WINUAEBETASTR " Beta 5" extern void my_kbd_handler (int, int, int); extern void clearallkeys(void); diff --git a/od-win32/win32gfx.c b/od-win32/win32gfx.c index 51c4ebf6..852a3dbb 100755 --- a/od-win32/win32gfx.c +++ b/od-win32/win32gfx.c @@ -1076,10 +1076,12 @@ int check_prefs_changed_gfx (void) } if (strcmp (currprefs.prtname, changed_prefs.prtname) || + currprefs.parallel_autoflush_time != changed_prefs.parallel_autoflush_time || currprefs.parallel_postscript_emulation != changed_prefs.parallel_postscript_emulation || currprefs.parallel_postscript_detection != changed_prefs.parallel_postscript_detection || strcmp (currprefs.ghostscript_parameters, changed_prefs.ghostscript_parameters)) { strcpy (currprefs.prtname, changed_prefs.prtname); + currprefs.parallel_autoflush_time = changed_prefs.parallel_autoflush_time; currprefs.parallel_postscript_emulation = changed_prefs.parallel_postscript_emulation; currprefs.parallel_postscript_detection = changed_prefs.parallel_postscript_detection; strcpy (currprefs.ghostscript_parameters, changed_prefs.ghostscript_parameters); diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index 0f6b98a3..ff6229aa 100755 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -114,8 +114,15 @@ static int LOADSAVE_ID = -1, MEMORY_ID = -1, KICKSTART_ID = -1, CPU_ID = -1, HARDDISK_ID = -1, PORTS_ID = -1, INPUT_ID = -1, MISC1_ID = -1, MISC2_ID = -1, AVIOUTPUT_ID = -1, PATHS_ID = -1, QUICKSTART_ID = -1, ABOUT_ID = -1; static HWND pages[MAX_C_PAGES]; +#define MAX_IMAGETOOLTIPS 10 static HWND guiDlg, panelDlg, ToolTipHWND; static HACCEL hAccelTable; +struct ToolTipHWNDS { + WNDPROC proc; + HWND hwnd; + int imageid; +}; +static struct ToolTipHWNDS ToolTipHWNDS2[MAX_IMAGETOOLTIPS + 1]; void exit_gui (int ok) { @@ -989,6 +996,8 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs } } nextp = full_path2 + openFileName.nFileOffset; + if (nextp[strlen(nextp) + 1] == 0) + multi = 0; while (result && next >= 0) { next = -1; @@ -1088,6 +1097,8 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs RegSetValueEx(hWinUAEKey, "hdfPath", 0, REG_SZ, (CONST BYTE *)openFileName.lpstrFile, strlen(openFileName.lpstrFile) + 1); } } + if (!multi) + next = -1; if (next >= 0) wParam = next; } @@ -1110,8 +1121,16 @@ static int loopmulti (char *s, char *out) index = strlen (s) + 1; return 1; } - if (!s[index]) + if (index < 0) + return 0; + if (!s[index]) { + if (s[strlen (s) + 1] == 0) { + strcpy (out, s); + index = -1; + return 1; + } return 0; + } sprintf (out, "%s\\%s", s, s + index); index += strlen (s + index) + 1; return 1; @@ -6074,7 +6093,7 @@ static void addswapperfile (HWND hDlg, int entry) if (MultiDiskSelection (hDlg, -1, 0, &changed_prefs, path)) { char dpath[MAX_DPATH]; loopmulti (path, NULL); - while (loopmulti(path, dpath) && entry < MAX_SPARE_DRIVES - 1) { + while (loopmulti(path, dpath) && entry < MAX_SPARE_DRIVES) { strcpy (workprefs.dfxlist[entry], dpath); entry++; } @@ -7779,6 +7798,57 @@ static int GetPanelRect (HWND hDlg, RECT *r) return 1; } +static int ToolTipImageIDs[] = { 1, IDB_XARCADE, -1 }; + +static WNDPROC ToolTipWndProcOld; +static long FAR PASCAL ToolTipWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + RECT r1; + POINT p1; + PAINTSTRUCT ps; + HBITMAP bm; + BITMAP binfo; + HDC hdc, memdc; + int w, h, i; + + for (i = 0; ToolTipHWNDS2[i].hwnd; i++) { + if (hwnd == ToolTipHWNDS2[i].hwnd) + break; + } + if (!ToolTipHWNDS2[i].hwnd) + return CallWindowProc (ToolTipHWNDS2[i].proc, hwnd, message, wParam, lParam); + + switch (message) + { + case WM_PAINT: + bm = LoadBitmap (hInst, MAKEINTRESOURCE (ToolTipHWNDS2[i].imageid)); + GetObject (bm, sizeof (binfo), &binfo); + w = binfo.bmWidth; + h = binfo.bmHeight; + GetWindowRect (hwnd, &r1); + GetCursorPos (&p1); + r1.right = r1.left + w; + r1.bottom = r1.top + h; + ShowWindow (hwnd, SW_SHOWNA); + MoveWindow (hwnd, r1.left, r1.top, r1.right - r1.left, r1.bottom - r1.top, TRUE); + hdc = GetDC (hwnd); + memdc = CreateCompatibleDC (hdc); + SelectObject (memdc, bm); + BeginPaint (hwnd, &ps); + SetBkMode (ps.hdc, TRANSPARENT); + BitBlt (hdc, 0, 0, w, h, memdc, 0, 0, SRCCOPY); + DeleteObject (bm); + EndPaint (hwnd, &ps); + DeleteDC (memdc); + ReleaseDC (hwnd, hdc); + return FALSE; + case WM_PRINT: + PostMessage (hwnd, WM_PAINT, 0, 0); + return TRUE; + } + return CallWindowProc (ToolTipHWNDS2[i].proc, hwnd, message, wParam, lParam); +} + static BOOL CALLBACK childenumproc (HWND hwnd, LPARAM lParam) { TOOLINFO ti; @@ -7789,19 +7859,52 @@ static BOOL CALLBACK childenumproc (HWND hwnd, LPARAM lParam) SendMessage (hwnd, WM_GETTEXT, (WPARAM)sizeof (tmp), (LPARAM)tmp); p = strchr (tmp, '['); if (strlen (tmp) > 0 && p && strlen(p) > 2 && p[1] == ']') { + int imageid = 0; *p++ = 0; *p++ = 0; if (p[0] == ' ') *p++; + if (p[0] == '#') + imageid = atol (p + 1); tmp[strlen(tmp) - 1] = 0; - SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)tmp); ti.cbSize = sizeof (TOOLINFO); ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND; ti.hwnd = GetParent (hwnd); ti.hinst = hInst; ti.uId = (UINT)hwnd; ti.lpszText = p; - SendMessage(ToolTipHWND, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); + if (imageid > 0) { + int idx, i; + + idx = 0; + while (ToolTipHWNDS2[idx].hwnd) + idx++; + for (i = 0; ToolTipImageIDs[i] >= 0; i += 2) { + if (ToolTipImageIDs[i] == imageid) + break; + } + if (ToolTipImageIDs[i] >= 0 && idx < MAX_IMAGETOOLTIPS) { + HWND ToolTipHWND2 = CreateWindowEx (WS_EX_TOPMOST, + TOOLTIPS_CLASS, NULL, + WS_POPUP | TTS_NOPREFIX, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + panelDlg, NULL, hInst, NULL); + ToolTipHWNDS2[idx].hwnd = ToolTipHWND2; + ToolTipHWNDS2[idx+1].hwnd = NULL; + ToolTipHWNDS2[idx].proc = (WNDPROC)GetWindowLongPtr (ToolTipHWND2, GWL_WNDPROC); + ToolTipHWNDS2[idx].imageid = ToolTipImageIDs[i + 1]; + SetWindowLongPtr (ToolTipHWND2, GWL_WNDPROC, (LONG_PTR)ToolTipWndProc); + SetWindowPos (ToolTipHWND2, HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + SendMessage(ToolTipHWND2, TTM_SETDELAYTIME, (WPARAM)TTDT_AUTOPOP, (LPARAM)MAKELONG(20000, 0)); + SendMessage(ToolTipHWND2, TTM_SETMAXTIPWIDTH, 0, 400); + SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)tmp); + SendMessage(ToolTipHWND2, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); + } + } else { + SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)tmp); + SendMessage(ToolTipHWND, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); + } return 1; } p = strchr (tmp, ']'); @@ -7840,7 +7943,7 @@ static HWND updatePanel (HWND hDlg, int id) { static HWND hwndTT; RECT r1c, r1w, r2c, r2w, r3c, r3w; - int w, h, pw, ph, x , y; + int w, h, pw, ph, x , y, i; EnableWindow (GetDlgItem (guiDlg, IDC_RESETAMIGA), full_property_sheet ? FALSE : TRUE); EnableWindow (GetDlgItem (guiDlg, IDOK), TRUE); @@ -7853,6 +7956,10 @@ static HWND updatePanel (HWND hDlg, int id) DestroyWindow (ToolTipHWND); ToolTipHWND = NULL; } + for (i = 0; ToolTipHWNDS2[i].hwnd; i++) { + DestroyWindow (ToolTipHWNDS2[i].hwnd); + ToolTipHWNDS2[i].hwnd = NULL; + } hAccelTable = NULL; if (id < 0) { if (!isfullscreen ()) { @@ -7903,12 +8010,14 @@ static HWND updatePanel (HWND hDlg, int id) panelDlg, NULL, hInst, NULL); SetWindowPos (ToolTipHWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + #if 0 SendMessage(ToolTipHWND, TTM_SETDELAYTIME, (WPARAM)TTDT_INITIAL, (LPARAM)MAKELONG(100, 0)); SendMessage(ToolTipHWND, TTM_SETDELAYTIME, (WPARAM)TTDT_RESHOW, (LPARAM)MAKELONG(0, 0)); #endif SendMessage(ToolTipHWND, TTM_SETDELAYTIME, (WPARAM)TTDT_AUTOPOP, (LPARAM)MAKELONG(20000, 0)); SendMessage(ToolTipHWND, TTM_SETMAXTIPWIDTH, 0, 400); + EnumChildWindows (panelDlg, &childenumproc, (LPARAM)NULL); SendMessage (panelDlg, WM_NULL, 0, 0); diff --git a/od-win32/winuae_msvc/winuae_msvc.vcproj b/od-win32/winuae_msvc/winuae_msvc.vcproj index f02f240b..f93cba54 100755 --- a/od-win32/winuae_msvc/winuae_msvc.vcproj +++ b/od-win32/winuae_msvc/winuae_msvc.vcproj @@ -335,6 +335,9 @@ AdditionalIncludeDirectories="\projects\winuae\src\od-win32\resources;$(NoInherit)"/> + +