diff --git a/Src/C64_SDL.h b/Src/C64_SDL.h index b6cda02..ed2aa73 100644 --- a/Src/C64_SDL.h +++ b/Src/C64_SDL.h @@ -211,9 +211,10 @@ void C64::network_vblank() } } - char *msg = TheDisplay->GetTextMessage(); + const char *msg = TheDisplay->GetTextMessage(); if (msg) remote->EncodeTextMessage(msg); + free((void *)msg); remote->EncodeJoystickUpdate(*js); diff --git a/Src/Display.cpp b/Src/Display.cpp index f3f38a7..d196465 100644 --- a/Src/Display.cpp +++ b/Src/Display.cpp @@ -29,8 +29,10 @@ #include "Prefs.h" #include "C64.h" #include "CIA.h" +#include "utils.hh" #include "gui/gui.hh" +#include "gui/status_bar.hh" #include "gui/virtual_keyboard.hh" // LED states @@ -202,9 +204,6 @@ C64Display::C64Display(C64 *the_c64) : TheC64(the_c64) quit_requested = false; speedometer_string[0] = 0; networktraffic_string[0] = 0; - memset(this->text_message, 0, sizeof(this->text_message)); - this->text_message_idx = 0; - this->entering_text_message = false; this->text_message_send = NULL; // Open window @@ -617,45 +616,48 @@ void C64Display::TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, shift_on = true; else if (c64_key == MATRIX(1,7) || c64_key == MATRIX(6,4)) shift_on = false; - else if (!key_up && this->entering_text_message) - { - char c = Gui::gui->kbd->keycodeToChar(c64_key | (shift_on ? 0x80 : 0) ); - - if ((size_t)this->text_message_idx >= sizeof(this->text_message) - 2 || - c == '\n') - { - this->text_message[this->text_message_idx] = '\0'; - this->text_message_send = this->text_message; - this->text_message_idx = 0; - this->entering_text_message = false; - return; - } - if (c == '\b') - { - this->text_message_idx--; - if (this->text_message_idx < 0) - this->text_message_idx = 0; - this->text_message[this->text_message_idx] = '\0'; - return; - } - - this->text_message[this->text_message_idx] = c; - this->text_message[this->text_message_idx + 1] = '\0'; - this->text_message_idx++; - return; - } this->UpdateKeyMatrix(c64_key, key_up, key_matrix, rev_matrix, joystick); } -char *C64Display::GetTextMessage() +const char *C64Display::GetTextMessage() { - char *out = this->text_message_send; + const char *out = this->text_message_send; + this->text_message_send = NULL; return out; } +class TypeNetworkMessageListener : public KeyboardListener +{ +public: + TypeNetworkMessageListener(const char **out) + { + this->out = out; + } + + virtual void stringCallback(const char *str) + { + *out = (const char *)xstrdup(str); + /* Remove thyself! */ + delete this; + } + +private: + const char **out; +}; + +void C64Display::TypeNetworkMessage() +{ + TypeNetworkMessageListener *nl = new TypeNetworkMessageListener(&this->text_message_send); + + Gui::gui->status_bar->queueMessage("Type message to send to peer"); + VirtualKeyboard::kbd->registerListener(nl); + VirtualKeyboard::kbd->activate(); +} + + void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick) { SDL_Event event; @@ -674,9 +676,9 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst case SDLK_F10: // F10/ScrLk: Enter text (for network taunts) case SDLK_SCROLLOCK: - this->entering_text_message = !this->entering_text_message; - if (this->entering_text_message) - this->text_message[0] = '\0'; + if (TheC64->network_connection_type == CLIENT || + TheC64->network_connection_type == MASTER) + this->TypeNetworkMessage(); break; case SDLK_F11: // F11: NMI (Restore) diff --git a/Src/Display.h b/Src/Display.h index 952cdfa..4ec3016 100644 --- a/Src/Display.h +++ b/Src/Display.h @@ -86,12 +86,9 @@ public: void NetworkTrafficMeter(float kb_per_s, bool has_throttled); uint8 *BitmapBase(void); int BitmapXMod(void); -#ifdef __riscos__ - void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick, uint8 *joystick2); -#else + void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); -#endif -#if defined(HAVE_SDL) + void FakeKeyPress(int kc, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix); void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, @@ -102,165 +99,25 @@ public: void Update_32(uint8 *src_pixels); void Update_stretched(uint8 *src_pixels); SDL_Surface *SurfaceFromC64Display(); - char *GetTextMessage(); -#endif + const char *GetTextMessage(); bool NumLock(void); void InitColors(uint8 *colors); void NewPrefs(Prefs *prefs); + void TypeNetworkMessage(); + C64 *TheC64; -#ifdef __BEOS__ - void Pause(void); - void Resume(void); -#endif - -#ifdef __riscos__ - void ModeChange(void); - unsigned int *GetColourTable(void); // returns pointer to mode_cols - bool CheckForUnpause(bool CheckLastState); - - ROScreen *screen; - Joy_Keys JoystickKeys[2]; // it's easier making the joystick keys public -#endif - -#if defined(__unix) || defined(GEKKO) bool quit_requested; -#endif + private: int led_state[4]; int old_led_state[4]; -#ifdef __BEOS__ - C64Window *the_window; // One of these is NULL - C64Screen *the_screen; - bool using_screen; // Flag: Using the_screen - key_info old_key_info; - int draw_bitmap; // Number of bitmap for the VIC to draw into -#endif - -#ifdef AMIGA - void draw_led_bar(void); // Draw LED bar at the bottom of the window - void draw_led(int num, int state); // Draw one LED - - struct Window *the_window; // Pointer to C64 display window - struct Screen *the_screen; // The window's screen - struct RastPort *the_rp; // The window's RastPort - struct VisualInfo *the_visual_info; - struct Menu *the_menus; - struct TextFont *led_font; - struct TextFont *speedo_font; - struct RastPort temp_rp; // For WritePixelArray8() - struct BitMap *temp_bm; - uint8 *chunky_buf; // Chunky buffer for drawing into - LONG pens[16]; // Pens for C64 colors - int xo, yo; // Window X/Y border size - struct FileRequester *open_req, *save_req; // File requesters for load/save snapshot -#endif - -#ifdef HAVE_SDL char speedometer_string[16]; // Speedometer text char networktraffic_string[80]; // Speedometer text - char text_message[80]; - char *text_message_send; - int text_message_idx; - bool entering_text_message; -#endif - -#ifdef __unix - void draw_led(int num, int state); // Draw one LED - static void pulse_handler(...); // LED error blinking -#endif - -#ifdef WIN32 -public: - long ShowRequester(const char *str, const char *button1, const char *button2 = NULL); - void WaitUntilActive(); - void NewPrefs(); - void Pause(); - void Resume(); - void Quit(); - - struct DisplayMode { - int x; - int y; - int depth; - BOOL modex; - }; - int GetNumDisplayModes() const; - const DisplayMode *GetDisplayModes() const; - -private: - // Window members. - void ResetKeyboardState(); - BOOL MakeWindow(); - static LRESULT CALLBACK StaticWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - long WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); - static int VirtKey2C64(int virtkey, DWORD keydata); - BOOL CalcViewPort(); - BOOL SetupWindow(); - BOOL SetupWindowMode(BOOL full_screen); - BOOL RestoreWindow(); - BOOL ResizeWindow(int side, RECT *pRect); - void WindowTitle(); - void CreateObjects(); - void DeleteObjects(); - - // DirectDraw management members. - BOOL StartDirectDraw(); - BOOL ResumeDirectDraw(); - BOOL ResetDirectDraw(); - BOOL StopDirectDraw(); - static HRESULT CALLBACK EnumModesCallback(LPDDSURFACEDESC pDDSD, LPVOID lpContext); - HRESULT EnumModesCallback(LPDDSURFACEDESC pDDSD); - static int CompareModes(const void *e1, const void *e2); - BOOL Fail(const char *message); - - // DirectDraw worker members. - BOOL SetPalettes(); - BOOL BuildColorTable(); - BOOL CopySurface(RECT &rcWork); - BOOL FlipSurfaces(); - BOOL EraseSurfaces(); - BOOL RestoreSurfaces(); - - void draw_led_bar(void); // Draw LED bar on the window - void draw_leds(BOOL force = false); // Draw LEDs if force or changed - void led_rect(int n, RECT &rc, RECT &led); // Compute LED rectangle - void InsertNextDisk(); // should be a common func - BOOL FileNameDialog(char *prefs_path, BOOL save = false); - void OfferSave(); // Offer chance to save changes - - UBYTE *chunky_buf; // Chunky buffer for drawing - BOOL active; // is application active? - BOOL paused; // is application paused? - BOOL waiting; // is application waiting? - DWORD windowed_style; // style of windowed window - DWORD fullscreen_style; // style of fullscreen window - char failure_message[128]; // what when wrong - int speed_index; // look ma, no hands - BOOL show_leds; // cached prefs option - BOOL full_screen; // cached prefs option - BOOL in_constructor; // if we are being contructed - BOOL in_destructor; // if we are being destroyed - - LPDIRECTDRAW pDD; // DirectDraw object - LPDIRECTDRAWSURFACE pPrimary; // DirectDraw primary surface - LPDIRECTDRAWSURFACE pBack; // DirectDraw back surface - LPDIRECTDRAWSURFACE pWork; // DirectDraw working surface - LPDIRECTDRAWCLIPPER pClipper; // DirectDraw clipper - LPDIRECTDRAWPALETTE pPalette; // DirectDraw palette - - DWORD colors[256]; // our palette colors - int colors_depth; // depth of the colors table -#endif - -#ifdef __riscos__ - unsigned int mode_cols[256]; // Colours in the current mode corresponding to C64's - uint8 *bitmap; - uint32 lastkeys[8]; // bitfield describing keys pressed last time. -#endif + const char *text_message_send; }; diff --git a/Src/Network.cpp b/Src/Network.cpp index 19ba24d..f9282d1 100644 --- a/Src/Network.cpp +++ b/Src/Network.cpp @@ -368,7 +368,7 @@ bool Network::DecodeDisplayUpdate(struct NetworkUpdate *src) return false; } -void Network::EncodeTextMessage(char *str) +void Network::EncodeTextMessage(const char *str) { NetworkUpdate *dst = (NetworkUpdate *)this->cur_ud; char *p = (char*)dst->data; @@ -914,6 +914,7 @@ bool Network::DecodeUpdate(C64Display *display, uint8 *js, MOS6581 *dst) } break; case TEXT_MESSAGE: + printf("Got message: %d, %s\n", p->size, (char*)p->data); Gui::gui->status_bar->queueMessage((const char*)p->data); break; case REGISTER_DATA: diff --git a/Src/Network.h b/Src/Network.h index 610e88e..1c0321e 100644 --- a/Src/Network.h +++ b/Src/Network.h @@ -173,7 +173,7 @@ public: void EncodeJoystickUpdate(Uint8 v); - void EncodeTextMessage(char *str); + void EncodeTextMessage(const char *str); void EnqueueSound(uint32 linecnt, uint8 addr, uint8 val);