From d87a116957b1fbd2015baed4d0db2d7df045bb7f Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 26 Nov 2010 01:27:25 -0500 Subject: [PATCH] remove width and height arguments from configure callback; call configure callback after instantiating a new mode --- GnomeScreensaver.cc | 18 +++++++++++++++--- GnomeScreensaver.h | 10 ++++++++-- dwss.cc | 20 ++++++++------------ modes/Mode.h | 3 +-- modes/Spin.cc | 21 ++++----------------- modes/Spin.h | 3 +-- 6 files changed, 37 insertions(+), 38 deletions(-) diff --git a/GnomeScreensaver.cc b/GnomeScreensaver.cc index db48fcd..6aa7b79 100644 --- a/GnomeScreensaver.cc +++ b/GnomeScreensaver.cc @@ -1,6 +1,8 @@ #include "GnomeScreensaver.h" +#define MAX_ASPECT (16.0/9.0*1.02) + static gboolean expose (GtkWidget *da, GdkEventExpose *event, GnomeScreensaver *gs) { @@ -20,7 +22,7 @@ update (void *gs) } GnomeScreensaver::GnomeScreensaver(int *argc, char ***argv, - bool (*configure_callback)(GnomeScreensaver &, int, int), + bool (*configure_callback)(GnomeScreensaver &), bool (*expose_callback)(GnomeScreensaver &), bool (*update_callback)(GnomeScreensaver &), int32_t interval_msec) @@ -96,6 +98,8 @@ GnomeScreensaver::GnomeScreensaver(int *argc, char ***argv, struct timeval tv; gettimeofday(&tv, NULL); m_start_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; + + m_n_monitors = 1; } uint32_t GnomeScreensaver::getTicks() @@ -138,8 +142,16 @@ gboolean GnomeScreensaver::configureCB(GtkWidget *da, GdkEventConfigure *event) g_assert_not_reached(); } - gboolean rc = m_configure_callback(*this, - da->allocation.width, da->allocation.height); + m_width = da->allocation.width; + m_height = da->allocation.height; + m_aspect_ratio = (float)m_width / (float)m_height; + + for (m_n_monitors = 1; + (double)m_width/(double)m_n_monitors/(double)m_height > MAX_ASPECT; + m_n_monitors++) + ; + + gboolean rc = m_configure_callback(*this); gdk_gl_drawable_gl_end(gldrawable); diff --git a/GnomeScreensaver.h b/GnomeScreensaver.h index cecc5b0..2ea192f 100644 --- a/GnomeScreensaver.h +++ b/GnomeScreensaver.h @@ -24,7 +24,7 @@ class GnomeScreensaver { public: GnomeScreensaver(int *argc, char ***argv, - bool (*configure_callback)(GnomeScreensaver &, int, int), + bool (*configure_callback)(GnomeScreensaver &), bool (*expose_callback)(GnomeScreensaver &), bool (*update_callback)(GnomeScreensaver &), int32_t interval_msec); @@ -33,13 +33,19 @@ class GnomeScreensaver gboolean configureCB(GtkWidget *da, GdkEventConfigure *event); gboolean exposeCB(GtkWidget *da, GdkEventExpose *event); gboolean updateCB(); + int getWidth() { return m_width; } + int getHeight() { return m_height; } + float getAspectRatio() { return m_aspect_ratio; } protected: GtkWidget *m_drawing_area; uint64_t m_start_msec; - bool (*m_configure_callback)(GnomeScreensaver &, int, int); + bool (*m_configure_callback)(GnomeScreensaver &); bool (*m_expose_callback)(GnomeScreensaver &); bool (*m_update_callback)(GnomeScreensaver &); + int m_width, m_height; + float m_aspect_ratio; + int m_n_monitors; }; #endif /* GNOMESCREENSAVER_H */ diff --git a/dwss.cc b/dwss.cc index 2f05126..0512b33 100644 --- a/dwss.cc +++ b/dwss.cc @@ -13,9 +13,6 @@ using namespace std; -#define MAX_ASPECT (16.0/9.0*1.02) - -static int n_monitors = 1; static Mode *current_mode = NULL; static bool expose (GnomeScreensaver & gs) @@ -23,16 +20,9 @@ static bool expose (GnomeScreensaver & gs) return current_mode != NULL ? current_mode->expose(gs) : true; } -static bool configure (GnomeScreensaver & gs, int width, int height) +static bool configure (GnomeScreensaver & gs) { - for (n_monitors = 1; - (double)width/(double)n_monitors/(double)height > MAX_ASPECT; - n_monitors++) - ; - - return current_mode != NULL - ? current_mode->configure(gs, width, height) - : true; + return current_mode != NULL ? current_mode->configure(gs) : true; } static bool update (GnomeScreensaver & gs) @@ -48,7 +38,13 @@ int main (int argc, char *argv[]) new Spin() }; + glShadeModel(GL_SMOOTH); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + current_mode = modes[0]; + current_mode->configure(gs); gs.mainloop(); diff --git a/modes/Mode.h b/modes/Mode.h index 4cfc95a..df3f73c 100644 --- a/modes/Mode.h +++ b/modes/Mode.h @@ -8,8 +8,7 @@ class Mode { public: virtual bool expose (GnomeScreensaver & gs) = 0; - virtual bool configure (GnomeScreensaver & gs, int width, - int height) = 0; + virtual bool configure (GnomeScreensaver & gs) = 0; virtual bool update (GnomeScreensaver & gs) = 0; }; diff --git a/modes/Spin.cc b/modes/Spin.cc index bc3c960..def37f1 100644 --- a/modes/Spin.cc +++ b/modes/Spin.cc @@ -9,39 +9,26 @@ bool Spin::expose (GnomeScreensaver & gs) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); - glTranslatef(0, 0, -3.0); glRotatef(gs.getTicks() / 1000.0 * 360.0 / 4.0, 0, 1, 0); m_logobox.draw(); - glBegin(GL_QUADS); - glColor3f(1, 0.6, 0); - glNormal3f(0, 0, 1); - glVertex2f(1, 1); - glVertex2f(-1, 1); - glVertex2f(-1, -1); - glVertex2f(1, 0); - glEnd(); glPopMatrix(); return true; } -bool Spin::configure (GnomeScreensaver & gs, int width, int height) +bool Spin::configure (GnomeScreensaver & gs) { - glViewport(0, 0, width, height); + glViewport(0, 0, gs.getWidth(), gs.getHeight()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(60.0, (double)width/(double)height, 0.01, 1000.0); + gluPerspective(60.0, gs.getAspectRatio(), 0.01, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); -// gluLookAt(0, 0, 0, 0, 0, 4, 0, 1, 0); - - glShadeModel(GL_SMOOTH); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); + gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0); return true; } diff --git a/modes/Spin.h b/modes/Spin.h index 513a32d..5246af8 100644 --- a/modes/Spin.h +++ b/modes/Spin.h @@ -10,8 +10,7 @@ class Spin : public Mode { public: bool expose (GnomeScreensaver & gs); - bool configure (GnomeScreensaver & gs, int width, - int height); + bool configure (GnomeScreensaver & gs); bool update (GnomeScreensaver & gs); protected: LogoBox m_logobox;