pingus-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Pingus-CVS] r3505 - in trunk/pingus/src: . components display screen


From: grumbel at BerliOS
Subject: [Pingus-CVS] r3505 - in trunk/pingus/src: . components display screen
Date: Fri, 9 Nov 2007 11:57:47 +0100

Author: grumbel
Date: 2007-11-09 11:57:45 +0100 (Fri, 09 Nov 2007)
New Revision: 3505

Modified:
   trunk/pingus/src/components/check_box.cpp
   trunk/pingus/src/components/check_box.hpp
   trunk/pingus/src/components/choice_box.cpp
   trunk/pingus/src/components/choice_box.hpp
   trunk/pingus/src/config_manager.cpp
   trunk/pingus/src/config_manager.hpp
   trunk/pingus/src/console.cpp
   trunk/pingus/src/display/display.cpp
   trunk/pingus/src/display/display.hpp
   trunk/pingus/src/fps_counter.hpp
   trunk/pingus/src/global_event.cpp
   trunk/pingus/src/option_menu.cpp
   trunk/pingus/src/option_menu.hpp
   trunk/pingus/src/screen/screen_manager.cpp
   trunk/pingus/src/screen/screen_manager.hpp
Log:
- hooked up some pieces of the OptionMenu, so its partially working now

Modified: trunk/pingus/src/components/check_box.cpp
===================================================================
--- trunk/pingus/src/components/check_box.cpp   2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/components/check_box.cpp   2007-11-09 10:57:45 UTC (rev 
3505)
@@ -46,5 +46,14 @@
   gc.print_center(Fonts::chalk_normal, rect.left+rect.get_width()/2, rect.top, 
"[ ]");
 }
 
+void
+CheckBox::set_state(bool v, bool send_signal)
+{
+  state = v;
+
+  if (send_signal)
+    on_change(state);
+}
+
 /* EOF */
 

Modified: trunk/pingus/src/components/check_box.hpp
===================================================================
--- trunk/pingus/src/components/check_box.hpp   2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/components/check_box.hpp   2007-11-09 10:57:45 UTC (rev 
3505)
@@ -37,6 +37,8 @@
   void on_primary_button_press(int x, int y);
   void update_layout() {}
 
+  void set_state(bool v, bool send_signal);
+
   boost::signal<void (bool)> on_change;
 
 private:

Modified: trunk/pingus/src/components/choice_box.cpp
===================================================================
--- trunk/pingus/src/components/choice_box.cpp  2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/components/choice_box.cpp  2007-11-09 10:57:45 UTC (rev 
3505)
@@ -56,6 +56,7 @@
 {
   if (!choices.empty())
     {
+      int last_current_choice = current_choice;
       x -= rect.left;
   
       if (x > rect.get_width()/2)
@@ -72,6 +73,9 @@
             current_choice = choices.size()-1;
             //current_choice = 0;
         }
+      
+      if (last_current_choice != current_choice)
+        on_change(choices[current_choice]);
     }
 }
 

Modified: trunk/pingus/src/components/choice_box.hpp
===================================================================
--- trunk/pingus/src/components/choice_box.hpp  2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/components/choice_box.hpp  2007-11-09 10:57:45 UTC (rev 
3505)
@@ -22,6 +22,7 @@
 
 #include <string>
 #include <vector>
+#include <boost/signal.hpp>
 #include "gui/rect_component.hpp"
 
 /** */
@@ -39,6 +40,8 @@
   void update_layout() {}
   void add_choice(const std::string& str);
   
+  boost::signal<void (std::string)> on_change;
+  
 private:
   ChoiceBox (const ChoiceBox&);
   ChoiceBox& operator= (const ChoiceBox&);

Modified: trunk/pingus/src/config_manager.cpp
===================================================================
--- trunk/pingus/src/config_manager.cpp 2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/config_manager.cpp 2007-11-09 10:57:45 UTC (rev 3505)
@@ -24,7 +24,10 @@
 */
 
 #include <iostream>
+#include "SDL.h"
 #include "globals.hpp"
+#include "fps_counter.hpp"
+#include "screen/screen_manager.hpp"
 #include "config_manager.hpp"
 
 ConfigManager config_manager;
@@ -81,12 +84,21 @@
 {
   if (maintainer_mode)
     std::cout << "ConfigManager::set_resolution: " << size.width << "x" << 
size.height << std::endl;
+
+  if (size != get_resolution())
+    {
+      screen_width  = size.width;
+      screen_height = size.height;
+      Display::set_video_mode(screen_width, screen_height);  
+      on_resolution_change(size);
+    }
 }
 
 Size
 ConfigManager::get_resolution()
 {
-  return Size();
+  return Size(Display::get_width(),
+              Display::get_height());
 }
 
 void
@@ -94,12 +106,19 @@
 {
   if (maintainer_mode)
     std::cout << "ConfigManager::set_fullscreen: " << v << std::endl;
+
+  if (v != get_fullscreen())
+    {
+      fullscreen_enabled = v;
+      Display::set_video_mode(screen_width, screen_height);
+      on_fullscreen_change(v);
+    }
 }
 
 bool
 ConfigManager::get_fullscreen()
 {
-  return false;
+  return fullscreen_enabled;
 }
 
 void
@@ -133,12 +152,22 @@
 {
   if (maintainer_mode)
     std::cout << "ConfigManager::set_mouse_grab: " << v << std::endl;
+
+  if (v != get_mouse_grab())
+    {
+      if (v)
+        SDL_WM_GrabInput(SDL_GRAB_ON);
+      else
+        SDL_WM_GrabInput(SDL_GRAB_OFF);
+
+      on_mouse_grab_change(v);
+    }
 }
 
 bool
 ConfigManager::get_mouse_grab()
 {
-  return false;
+  return (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON);
 }
 
 void
@@ -146,12 +175,22 @@
 {
   if (maintainer_mode)
     std::cout << "ConfigManager::set_print_fps: " << v << std::endl;
+  
+  if (v != get_print_fps())
+    {
+      if (v)
+        fps_counter.show();
+      else
+        fps_counter.hide();
+
+      on_print_fps_change(v);
+    }
 }
 
 bool
 ConfigManager::get_print_fps()
 {
-  return false;
+  return fps_counter.is_visible();
 }
 
 void
@@ -172,12 +211,17 @@
 {
   if (maintainer_mode)
     std::cout << "ConfigManager::set_swcursor: " << v << std::endl;
+
+  if (v != get_swcursor())
+    {
+      ScreenManager::instance()->show_swcursor(v);
+    }
 }
 
 bool
 ConfigManager::get_swcursor()
 {
-  return false;
+  return ScreenManager::instance()->swcursor_visible();
 }
 
 void

Modified: trunk/pingus/src/config_manager.hpp
===================================================================
--- trunk/pingus/src/config_manager.hpp 2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/config_manager.hpp 2007-11-09 10:57:45 UTC (rev 3505)
@@ -37,51 +37,51 @@
 
   void set_master_volume(int);
   int  get_master_volume();
-  boost::signal<void(int)> on_master_volume_change();
+  boost::signal<void(int)> on_master_volume_change;
 
   void set_sound_volume(int);
   int  get_sound_volume();
-  boost::signal<void(int)> on_sound_volume_change();
+  boost::signal<void(int)> on_sound_volume_change;
 
   void set_music_volume(int);
   int  get_music_volume();
-  boost::signal<void(int)> on_music_volume_change();
+  boost::signal<void(int)> on_music_volume_change;
 
   void set_resolution(const Size& size);
   Size get_resolution();
-  boost::signal<void(Size)> on_resolution_change();
+  boost::signal<void(Size)> on_resolution_change;
 
   void set_fullscreen(bool);
   bool get_fullscreen();
-  boost::signal<void(bool)> on_fullscreen_change();
+  boost::signal<void(bool)> on_fullscreen_change;
 
   void set_allow_resize(bool);
   bool get_allow_resize();
-  boost::signal<void(bool)> on_allow_reszie_change();
+  boost::signal<void(bool)> on_allow_reszie_change;
 
   void set_fast_mode(bool);
   bool get_fast_mode();
-  boost::signal<void(bool)> on_fast_mode_change();
+  boost::signal<void(bool)> on_fast_mode_change;
 
   void set_mouse_grab(bool);
   bool get_mouse_grab();
-  boost::signal<void(bool)> on_mouse_grab_change();
+  boost::signal<void(bool)> on_mouse_grab_change;
 
   void set_print_fps(bool);
   bool get_print_fps();
-  boost::signal<void(bool)> on_print_fps_change();
+  boost::signal<void(bool)> on_print_fps_change;
 
   void set_language(const std::string&);
   std::string get_language();
-  boost::signal<void(const std::string&)> on_language_change();
+  boost::signal<void(const std::string&)> on_language_change;
 
   void set_swcursor(bool);
   bool get_swcursor();
-  boost::signal<void(bool)> on_swcursor_change();
+  boost::signal<void(bool)> on_swcursor_change;
 
   void set_autoscroll(bool);
   bool get_autoscroll();
-  boost::signal<void(bool)> on_autoscroll_change();
+  boost::signal<void(bool)> on_autoscroll_change;
 
 private:
   ConfigManager (const ConfigManager&);

Modified: trunk/pingus/src/console.cpp
===================================================================
--- trunk/pingus/src/console.cpp        2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/console.cpp        2007-11-09 10:57:45 UTC (rev 3505)
@@ -116,7 +116,7 @@
 Console::Console() : ostream (&streambuf) // std:: is missing here since Win32 
doesn't like it
 {
   is_init = false;
-  is_visible = false;
+  visible = false;
   current_pos = 0;
   number_of_lines = 12;
 

Modified: trunk/pingus/src/display/display.cpp
===================================================================
--- trunk/pingus/src/display/display.cpp        2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/display/display.cpp        2007-11-09 10:57:45 UTC (rev 
3505)
@@ -45,19 +45,39 @@
 }
 } // namespace
 
-DisplayHook::DisplayHook() : is_visible(false)
+DisplayHook::DisplayHook() : visible(false)
 {
 }
 
+DisplayHook::~DisplayHook() 
+{
+  hide();
+}
+
+bool
+DisplayHook::is_visible()
+{
+  return visible;
+}
+
 void
-DisplayHook::toggle_display()
+DisplayHook::show()
 {
-  if (is_visible)
-    Display::remove_flip_screen_hook(this);
-  else
-    Display::add_flip_screen_hook(this);
+  if (!visible)
+    {
+      Display::add_flip_screen_hook(this);
+      visible = true;
+    }
+}
 
-  is_visible = !is_visible;
+void
+DisplayHook::hide()
+{
+  if (visible)
+    {
+      Display::remove_flip_screen_hook(this);
+      visible = false;
+    }
 }
 
 void

Modified: trunk/pingus/src/display/display.hpp
===================================================================
--- trunk/pingus/src/display/display.hpp        2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/display/display.hpp        2007-11-09 10:57:45 UTC (rev 
3505)
@@ -36,14 +36,18 @@
 class DisplayHook
 {
 protected:
-  bool is_visible;
+  bool visible;
+  
 public:
   DisplayHook();
-  virtual ~DisplayHook() {}
+  virtual ~DisplayHook();
   /** Called sortly before a flip_display () */
   virtual void on_event() = 0;
-  virtual void toggle_display();
 
+  virtual bool is_visible();
+  virtual void show();
+  virtual void hide();
+
 private:
   DisplayHook (const DisplayHook&);
   DisplayHook& operator= (const DisplayHook&);

Modified: trunk/pingus/src/fps_counter.hpp
===================================================================
--- trunk/pingus/src/fps_counter.hpp    2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/fps_counter.hpp    2007-11-09 10:57:45 UTC (rev 3505)
@@ -20,9 +20,9 @@
 #ifndef HEADER_PINGUS_FPS_COUNTER_HXX
 #define HEADER_PINGUS_FPS_COUNTER_HXX
 
+#include "font.hpp"
 #include "display/display.hpp"
 
-
 ///
 class FPSCounter : public DisplayHook
 {

Modified: trunk/pingus/src/global_event.cpp
===================================================================
--- trunk/pingus/src/global_event.cpp   2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/global_event.cpp   2007-11-09 10:57:45 UTC (rev 3505)
@@ -28,6 +28,7 @@
 #include "level_menu.hpp"
 #include "addon_menu.hpp"
 #include "global_event.hpp"
+#include "config_manager.hpp"
 #include "globals.hpp"
 
 GlobalEvent global_event;
@@ -44,12 +45,14 @@
   switch (event.keysym.sym)
     {
       case SDLK_F1:
-        console.toggle_display();
+        if (console.is_visible())
+          console.hide();
+        else
+          console.show();
         break;
 
       case SDLK_F10:
-        fps_counter.toggle_display();
-        console << "Toggling fps counter display" << std::endl;
+        config_manager.set_print_fps(!config_manager.get_print_fps());
         break;
 
       case SDLK_RETURN:
@@ -57,12 +60,9 @@
           break;
         // FALL THROUGH
       case SDLK_F11:
-        fullscreen_enabled = !fullscreen_enabled;
-        // re-initialize the screen
-        Display::set_video_mode(screen_width, screen_height);
+        config_manager.set_fullscreen(!config_manager.get_fullscreen());
         break;
 
-
       case SDLK_F5:
         if 
(!dynamic_cast<OptionMenu*>(ScreenManager::instance()->get_screen()))
           ScreenManager::instance()->push_screen(new OptionMenu(), true);
@@ -105,16 +105,7 @@
       case SDLK_g:
         if (keystate[SDLK_LCTRL] || keystate[SDLK_RCTRL])
           {
-            if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON)
-              {
-                SDL_WM_GrabInput(SDL_GRAB_OFF);
-                console << "Grab input off" << std::endl;
-              }
-            else
-              {
-                SDL_WM_GrabInput(SDL_GRAB_ON);
-                console << "Grab input on" << std::endl;
-              }
+            config_manager.set_mouse_grab(!config_manager.get_mouse_grab());
           }
         break;
 

Modified: trunk/pingus/src/option_menu.cpp
===================================================================
--- trunk/pingus/src/option_menu.cpp    2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/option_menu.cpp    2007-11-09 10:57:45 UTC (rev 3505)
@@ -34,6 +34,8 @@
 #include "tinygettext/dictionary_manager.hpp"
 #include "option_menu.hpp"
 
+#define C(x) x
+
 extern TinyGetText::DictionaryManager dictionary_manager;
 
 OptionMenu::OptionMenu()
@@ -45,15 +47,23 @@
   y_pos = 0;
 
   ChoiceBox* resolution_box = new ChoiceBox(Rect());
-  resolution_box->add_choice("640x480");
-  resolution_box->add_choice("800x480");
-  resolution_box->add_choice("800x600");
-  resolution_box->add_choice("1024x768");
-  resolution_box->add_choice("1152x864");
-  resolution_box->add_choice("1280x960");
-  resolution_box->add_choice("1280x1024");
-  resolution_box->add_choice("1600x1200");
-  resolution_box->add_choice("1920x1080");
+  resolution_box->add_choice("640x480");   // 4:3, VGA
+  resolution_box->add_choice("768x576");   // 4:3, PAL
+  resolution_box->add_choice("800x480");   // Nokia N770, N800
+  resolution_box->add_choice("800x600");   // 4:3, SVGA
+  resolution_box->add_choice("1024x768");  // 4:3, XGA
+  resolution_box->add_choice("1152x864");  // 4:3
+  resolution_box->add_choice("1280x720");  // 16:9, HD-TV, 720p
+  resolution_box->add_choice("1280x960");  // 4:3
+  resolution_box->add_choice("1280x1024"); // 5:4
+  resolution_box->add_choice("1366x768");  // ~16:9, Wide XGA
+  resolution_box->add_choice("1440x900");  // 16:10
+  resolution_box->add_choice("1600x1200"); // 4:3, UXGA
+  resolution_box->add_choice("1680x1050"); // 16:10, WSXGA
+  resolution_box->add_choice("1920x1080"); // 16:9, HD-TV, 1080p
+  resolution_box->add_choice("1920x1200"); // 16:10
+  
+  resolution_box->add_choice("Custom");
 
   ChoiceBox* language_box = new ChoiceBox(Rect());
   std::set<std::string> lst = dictionary_manager.get_languages();
@@ -66,8 +76,8 @@
   
   swcursor_box      = new CheckBox(Rect());
   fullscreen_box    = new CheckBox(Rect());
-  autoscrolling_box = new CheckBox(Rect());
-  fastmode_box      = new CheckBox(Rect());
+  autoscroll_box    = new CheckBox(Rect());
+  fast_mode_box     = new CheckBox(Rect());
   mousegrab_box     = new CheckBox(Rect());
   printfps_box      = new CheckBox(Rect());
 
@@ -77,8 +87,8 @@
 
   swcursor_box->on_change.connect(boost::bind(&OptionMenu::on_swcursor_change, 
this, _1));
   
fullscreen_box->on_change.connect(boost::bind(&OptionMenu::on_fullscreen_change,
 this, _1));
-  
autoscrolling_box->on_change.connect(boost::bind(&OptionMenu::on_autoscrolling_change,
 this, _1));
-  fastmode_box->on_change.connect(boost::bind(&OptionMenu::on_fastmode_change, 
this, _1));
+  
autoscroll_box->on_change.connect(boost::bind(&OptionMenu::on_autoscroll_change,
 this, _1));
+  
fast_mode_box->on_change.connect(boost::bind(&OptionMenu::on_fastmode_change, 
this, _1));
   
mousegrab_box->on_change.connect(boost::bind(&OptionMenu::on_mousegrab_change, 
this, _1));
   printfps_box->on_change.connect(boost::bind(&OptionMenu::on_printfps_change, 
this, _1));
 
@@ -86,12 +96,14 @@
   
sound_volume_box->on_change.connect(boost::bind(&OptionMenu::on_sound_volume_change,
 this, _1));
   
music_volume_box->on_change.connect(boost::bind(&OptionMenu::on_music_volume_change,
 this, _1));
 
+  
resolution_box->on_change.connect(boost::bind(&OptionMenu::on_resolution_change,
 this, _1));
+
   add_item(_("Language:"),        language_box);
   add_item(_("Scroll Mode:"),     scroll_box);
   add_item(_("Resolution:"),      resolution_box);
   add_item(_("Fullscreen:"),      fullscreen_box);
-  add_item(_("Autoscrolling:"),   autoscrolling_box);
-  add_item(_("Low Detail:"),      fastmode_box);
+  add_item(_("Autoscrolling:"),   autoscroll_box);
+  add_item(_("Low Detail:"),      fast_mode_box);
 
   add_item(_("Master Volume:"),   master_volume_box);
   add_item(_("Sound Volume:"),    sound_volume_box);
@@ -99,6 +111,25 @@
   add_item(_("Print FPS:"),       printfps_box);
   add_item(_("Mouse Grab:"),      mousegrab_box);
   add_item(_("Software Cursor:"), swcursor_box);
+
+  // Connect with ConfigManager
+  mousegrab_box->set_state(config_manager.get_mouse_grab(), false);
+  
C(config_manager.on_mouse_grab_change.connect(boost::bind(&CheckBox::set_state, 
mousegrab_box, _1, false)));
+
+  printfps_box->set_state(config_manager.get_print_fps(), false);
+  
C(config_manager.on_print_fps_change.connect(boost::bind(&CheckBox::set_state, 
printfps_box, _1, false)));
+
+  fullscreen_box->set_state(config_manager.get_fullscreen(), false);
+  
C(config_manager.on_fullscreen_change.connect(boost::bind(&CheckBox::set_state, 
fullscreen_box, _1, false)));
+
+  swcursor_box->set_state(config_manager.get_swcursor(), false);
+  
C(config_manager.on_swcursor_change.connect(boost::bind(&CheckBox::set_state, 
swcursor_box, _1, false)));
+
+  autoscroll_box->set_state(config_manager.get_autoscroll(), false);
+  
C(config_manager.on_autoscroll_change.connect(boost::bind(&CheckBox::set_state, 
autoscroll_box, _1, false)));
+
+  fast_mode_box->set_state(config_manager.get_fast_mode(), false);
+  
C(config_manager.on_fast_mode_change.connect(boost::bind(&CheckBox::set_state, 
fast_mode_box, _1, false)));
 }
 
 void
@@ -139,14 +170,11 @@
 
 OptionMenu::~OptionMenu()
 {
+  for(Connections::iterator i = connections.begin(); i != connections.end(); 
++i)
+    {
+      (*i).disconnect();
+    }
 }
-
-void
-OptionMenu::update(const GameDelta& delta)
-{
-  GUIScreen::update(delta);
-  SDL_Delay(50);
-}
   
 struct OptionEntry {
   OptionEntry(const std::string& left_,
@@ -183,8 +211,9 @@
 }
 
 void
-OptionMenu::resize(const Size&)
+OptionMenu::resize(const Size& size)
 {
+  
 }
 
 void
@@ -200,7 +229,7 @@
 }
 
 void
-OptionMenu::on_autoscrolling_change(bool v)
+OptionMenu::on_autoscroll_change(bool v)
 {
   config_manager.set_autoscroll(v);
 }
@@ -241,4 +270,17 @@
   config_manager.set_music_volume(v);
 }
 
+void
+OptionMenu::on_resolution_change(const std::string& str)
+{
+  if (str != "Custom")
+    {
+      Size size;
+      if (sscanf(str.c_str(), "%dx%d", &size.width, &size.height) == 2)
+        {
+          config_manager.set_resolution(size); 
+        }
+    }
+}
+
 /* EOF */

Modified: trunk/pingus/src/option_menu.hpp
===================================================================
--- trunk/pingus/src/option_menu.hpp    2007-11-09 08:50:20 UTC (rev 3504)
+++ trunk/pingus/src/option_menu.hpp    2007-11-09 10:57:45 UTC (rev 3505)
@@ -20,6 +20,8 @@
 #ifndef HEADER_OPTION_MENU_HPP
 #define HEADER_OPTION_MENU_HPP
 
+#include <vector>
+#include <boost/signals.hpp>
 #include "sprite.hpp"
 #include "screen/gui_screen.hpp"
 #include "components/label.hpp"
@@ -51,21 +53,23 @@
 
   CheckBox* fullscreen_box;
   CheckBox* swcursor_box;
-  CheckBox* autoscrolling_box;
-  CheckBox* fastmode_box;
+  CheckBox* autoscroll_box;
+  CheckBox* fast_mode_box;
   CheckBox* mousegrab_box;
   CheckBox* printfps_box;
 
   SliderBox* master_volume_box;
   SliderBox* sound_volume_box;
   SliderBox* music_volume_box;
-  
+
+  typedef std::vector<boost::signals::connection> Connections;
+  Connections connections;
+
 public:
   OptionMenu();
   ~OptionMenu();
   
   void draw_background (DrawingContext& gc);
-  void update (const GameDelta& delta);
   void on_escape_press ();
 
   void add_item(const std::string& label, GUI::RectComponent* control);
@@ -74,7 +78,7 @@
 
   void on_swcursor_change(bool v);
   void on_fullscreen_change(bool v);
-  void on_autoscrolling_change(bool v);
+  void on_autoscroll_change(bool v);
   void on_fastmode_change(bool v);
   void on_mousegrab_change(bool v);
   void on_printfps_change(bool v);
@@ -82,6 +86,8 @@
   void on_master_volume_change(int v);
   void on_sound_volume_change(int v);
   void on_music_volume_change(int v);
+
+  void on_resolution_change(const std::string& str);
 private:
   OptionMenu (const OptionMenu&);
   OptionMenu& operator= (const OptionMenu&);

Modified: trunk/pingus/src/screen/screen_manager.cpp
===================================================================
--- trunk/pingus/src/screen/screen_manager.cpp  2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/screen/screen_manager.cpp  2007-11-09 10:57:45 UTC (rev 
3505)
@@ -34,6 +34,7 @@
 ScreenManager* ScreenManager::instance_ = 0;
 
 ScreenManager::ScreenManager()
+  : cursor(0)
 {
   display_gc = new DrawingContext();
 
@@ -43,6 +44,7 @@
 ScreenManager::~ScreenManager ()
 {
   delete display_gc;
+  delete cursor;
 }
 
 void
@@ -59,14 +61,8 @@
     input_controller = 
input_manager.create_controller(Pathname(controller_file,
                                                                 
Pathname::SYSTEM_PATH));
 
-  Cursor* cursor = 0;
-  if (swcursor_enabled)
-    {
-      cursor = new Cursor("core/cursors/animcross");
-      Display::add_flip_screen_hook(cursor);
-      SDL_ShowCursor(SDL_DISABLE);
-    }
 
+  show_swcursor(swcursor_enabled);
   DeltaManager delta_manager;
 
   // Main loop for the menu
@@ -136,7 +132,7 @@
             {
               display_gc->render(Display::get_screen(), Rect(Vector2i(0,0), 
Size(Display::get_width(),
                                                                                
      Display::get_height())));
-              Display::flip_display ();
+              Display::flip_display();
               display_gc->clear();
             }
         }
@@ -150,8 +146,6 @@
       SDL_Delay(1);
     }
 
-  Display::remove_flip_screen_hook(cursor);
-  delete cursor;
   delete input_controller;
 }
 
@@ -312,6 +306,35 @@
 }
 
 void
+ScreenManager::show_swcursor(bool v)
+{
+  if (v)
+    {
+      if (!cursor)
+        {
+          cursor = new Cursor("core/cursors/animcross");
+          cursor->show();
+          SDL_ShowCursor(SDL_DISABLE);
+        }
+    }
+  else
+    {
+      if (cursor)
+        {
+          delete cursor;
+          cursor = 0;
+          SDL_ShowCursor(SDL_ENABLE);
+        }
+    }
+}
+
+bool
+ScreenManager::swcursor_visible()
+{
+  return cursor;
+}
+
+void
 ScreenManager::init()
 {
   instance_ = 0;

Modified: trunk/pingus/src/screen/screen_manager.hpp
===================================================================
--- trunk/pingus/src/screen/screen_manager.hpp  2007-11-09 08:50:20 UTC (rev 
3504)
+++ trunk/pingus/src/screen/screen_manager.hpp  2007-11-09 10:57:45 UTC (rev 
3505)
@@ -25,6 +25,7 @@
 
 #include "screen_ptr.hpp"
 
+class Cursor;
 class Size;
 class DrawingContext;
 class Screen;
@@ -48,6 +49,7 @@
   enum { CA_NONE, CA_POP, CA_POP_ALL, CA_REPLACE, CA_CLEAR } cached_action;
   ScreenPtr replace_screen_arg;
 
+  Cursor* cursor;
 protected:
   ScreenManager ();
 public:
@@ -80,6 +82,9 @@
   /** @return a pointer to the current Screen */
   Screen* get_screen();
 
+  void show_swcursor(bool v);
+  bool swcursor_visible();
+  
 private:
   void real_clear();
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]