diff --git a/GnomeScreensaver.cc b/GnomeScreensaver.cc new file mode 100644 index 0000000..db48fcd --- /dev/null +++ b/GnomeScreensaver.cc @@ -0,0 +1,158 @@ + +#include "GnomeScreensaver.h" + +static gboolean +expose (GtkWidget *da, GdkEventExpose *event, GnomeScreensaver *gs) +{ + return gs->exposeCB(da, event); +} + +static gboolean +configure (GtkWidget *da, GdkEventConfigure *event, GnomeScreensaver *gs) +{ + return gs->configureCB(da, event); +} + +static gboolean +update (void *gs) +{ + return ((GnomeScreensaver *)gs)->updateCB(); +} + +GnomeScreensaver::GnomeScreensaver(int *argc, char ***argv, + bool (*configure_callback)(GnomeScreensaver &, int, int), + bool (*expose_callback)(GnomeScreensaver &), + bool (*update_callback)(GnomeScreensaver &), + int32_t interval_msec) + : m_configure_callback(configure_callback), + m_expose_callback(expose_callback), + m_update_callback(update_callback) +{ + gchar *geometry = NULL; + GOptionEntry options[] = { + {"geometry", 0, 0, G_OPTION_ARG_STRING, &geometry, + N_("The initial size and position of window"), + N_("WIDTHxHEIGHT+X+Y")}, + {NULL} + }; + + GtkWidget *window; + GdkGLConfig *glconfig; + GtkStateType state; + GError *error = NULL; + + gtk_init_with_args (argc, argv, + _(""), + NULL, NULL, &error); + gtk_gl_init(argc, argv); + + if (error != NULL) + { + g_printerr (_("%s. See --help for usage information.\n"), + _(error->message)); + g_error_free (error); + } + + window = gs_theme_window_new (); + + g_signal_connect (G_OBJECT (window), "delete-event", + G_CALLBACK (gtk_main_quit), NULL); + + m_drawing_area = gtk_drawing_area_new (); + + glconfig = gdk_gl_config_new_by_mode( (GdkGLConfigMode) + ( GDK_GL_MODE_RGB | + GDK_GL_MODE_DEPTH | + GDK_GL_MODE_DOUBLE ) ); + + if (!glconfig) + { + g_assert_not_reached(); + } + if (!gtk_widget_set_gl_capability(m_drawing_area, glconfig, NULL, TRUE, + GDK_GL_RGBA_TYPE)) + { + g_assert_not_reached(); + } + + g_signal_connect(m_drawing_area, "configure-event", + G_CALLBACK(configure), this); + g_signal_connect(m_drawing_area, "expose-event", + G_CALLBACK(expose), this); + + gtk_widget_show (m_drawing_area); + gtk_container_add (GTK_CONTAINER (window), m_drawing_area); + + if ((geometry == NULL) + || !gtk_window_parse_geometry (GTK_WINDOW (window), geometry)) + { + gtk_window_set_default_size (GTK_WINDOW (window), 800, 600); + } + + gtk_widget_show (window); + + gtk_timeout_add(interval_msec, update, this); + + struct timeval tv; + gettimeofday(&tv, NULL); + m_start_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; +} + +uint32_t GnomeScreensaver::getTicks() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + uint64_t msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; + return msec - m_start_msec; +} + +gboolean GnomeScreensaver::exposeCB(GtkWidget *da, GdkEventExpose *event) +{ + GdkGLContext *glcontext = gtk_widget_get_gl_context(da); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da); + + if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) + { + g_assert_not_reached(); + } + + gboolean rc = m_expose_callback(*this); + + if (gdk_gl_drawable_is_double_buffered(gldrawable)) + gdk_gl_drawable_swap_buffers(gldrawable); + else + glFlush(); + + gdk_gl_drawable_gl_end(gldrawable); + + return rc; +} + +gboolean GnomeScreensaver::configureCB(GtkWidget *da, GdkEventConfigure *event) +{ + GdkGLContext *glcontext = gtk_widget_get_gl_context(da); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da); + + if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) + { + g_assert_not_reached(); + } + + gboolean rc = m_configure_callback(*this, + da->allocation.width, da->allocation.height); + + gdk_gl_drawable_gl_end(gldrawable); + + return rc; +} + +gboolean GnomeScreensaver::updateCB() +{ + gboolean rc = m_update_callback(*this); + if (rc) + { + gtk_widget_queue_draw(m_drawing_area); + } + return rc; +} + diff --git a/GnomeScreensaver.h b/GnomeScreensaver.h new file mode 100644 index 0000000..cecc5b0 --- /dev/null +++ b/GnomeScreensaver.h @@ -0,0 +1,46 @@ + +#ifndef GNOMESCREENSAVER_H +#define GNOMESCREENSAVER_H + +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#include "gs-theme-window.h" + +class GnomeScreensaver +{ + public: + GnomeScreensaver(int *argc, char ***argv, + bool (*configure_callback)(GnomeScreensaver &, int, int), + bool (*expose_callback)(GnomeScreensaver &), + bool (*update_callback)(GnomeScreensaver &), + int32_t interval_msec); + uint32_t getTicks(); + void mainloop() { gtk_main(); } + gboolean configureCB(GtkWidget *da, GdkEventConfigure *event); + gboolean exposeCB(GtkWidget *da, GdkEventExpose *event); + gboolean updateCB(); + + protected: + GtkWidget *m_drawing_area; + uint64_t m_start_msec; + bool (*m_configure_callback)(GnomeScreensaver &, int, int); + bool (*m_expose_callback)(GnomeScreensaver &); + bool (*m_update_callback)(GnomeScreensaver &); +}; + +#endif /* GNOMESCREENSAVER_H */ + diff --git a/dwss.cc b/dwss.cc index ef121c3..e1b6593 100644 --- a/dwss.cc +++ b/dwss.cc @@ -1,28 +1,3 @@ -/* - * Copyright (C) 2005 Ray Strode , - * Matthias Clasen , - * Søren Sandmann - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Originally written by: Ray Strode - * - * Later contributions by: Matthias Clasen - * Søren Sandmann - */ #include #include @@ -30,56 +5,17 @@ #include #include -#include -#include - -#include -#include -#include - -#include -#include - #include #include -#include "gs-theme-window.h" +#include "GnomeScreensaver.h" -static gchar *geometry = NULL; -static GtkWidget *drawing_area; - -static GOptionEntry options[] = { - {"geometry", 0, 0, G_OPTION_ARG_STRING, &geometry, - N_("The initial size and position of window"), - N_("WIDTHxHEIGHT+X+Y")}, - {NULL} -}; - -static uint64_t start_msec; - -static uint32_t getElapsedTime() +static bool expose (GnomeScreensaver & gs) { - struct timeval tv; - gettimeofday(&tv, NULL); - uint64_t msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; - return msec - start_msec; -} - -static gboolean -expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data) -{ - GdkGLContext *glcontext = gtk_widget_get_gl_context(da); - GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da); - - if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) - { - g_assert_not_reached(); - } - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); - glRotatef(getElapsedTime()/1000.0*360.0, 0, 0, 1); + glRotatef(gs.getTicks()/1000.0*360.0, 0, 0, 1); glBegin(GL_QUADS); glColor3f(1, 0.6, 0); glNormal3f(0, 0, 1); @@ -90,35 +26,16 @@ expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data) glEnd(); glPopMatrix(); - if (gdk_gl_drawable_is_double_buffered(gldrawable)) - gdk_gl_drawable_swap_buffers(gldrawable); - else - glFlush(); - - gdk_gl_drawable_gl_end(gldrawable); - - return TRUE; + return true; } -static gboolean -configure (GtkWidget *da, GdkEventConfigure *event, gpointer user_data) +static bool configure (GnomeScreensaver & gs, int width, int height) { - GdkGLContext *glcontext = gtk_widget_get_gl_context(da); - GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(da); - - if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) - { - g_assert_not_reached(); - } - - glViewport(0, 0, da->allocation.width, da->allocation.height); + glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(60.0, - (double)da->allocation.width / (double)da->allocation.height, - 0.001, - 1000.0); + gluPerspective(60.0, (double)width / (double)height, 0.001, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -126,91 +43,19 @@ configure (GtkWidget *da, GdkEventConfigure *event, gpointer user_data) glShadeModel(GL_SMOOTH); - gdk_gl_drawable_gl_end(gldrawable); - - return TRUE; + return true; } -static gboolean -update (void *user_data) +static bool update (GnomeScreensaver & gs) { - gtk_widget_queue_draw(drawing_area); - return TRUE; + return true; } -int -main (int argc, - char *argv[]) +int main (int argc, char *argv[]) { - GtkWidget *window; - GdkGLConfig *glconfig; + GnomeScreensaver gs(&argc, &argv, configure, expose, update, 12); - GtkStateType state; + gs.mainloop(); - GError *error; - - error = NULL; - - gtk_init_with_args (&argc, &argv, - _("DornerWorks ScreenSaver"), - NULL, NULL, &error); - gtk_gl_init(&argc, &argv); - - - if (error != NULL) - { - g_printerr (_("%s. See --help for usage information.\n"), - _(error->message)); - g_error_free (error); - return EX_SOFTWARE; - } - - - window = gs_theme_window_new (); - - g_signal_connect (G_OBJECT (window), "delete-event", - G_CALLBACK (gtk_main_quit), NULL); - - drawing_area = gtk_drawing_area_new (); - - glconfig = gdk_gl_config_new_by_mode( (GdkGLConfigMode) - ( GDK_GL_MODE_RGB | - GDK_GL_MODE_DEPTH | - GDK_GL_MODE_DOUBLE ) ); - - if (!glconfig) - { - g_assert_not_reached(); - } - if (!gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, TRUE, - GDK_GL_RGBA_TYPE)) - { - g_assert_not_reached(); - } - - g_signal_connect(drawing_area, "configure-event", - G_CALLBACK(configure), NULL); - g_signal_connect(drawing_area, "expose-event", - G_CALLBACK(expose), NULL); - - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - - if ((geometry == NULL) - || !gtk_window_parse_geometry (GTK_WINDOW (window), geometry)) - { - gtk_window_set_default_size (GTK_WINDOW (window), 640, 480); - } - - gtk_widget_show (window); - - gtk_timeout_add(12, update, NULL); - - struct timeval tv; - gettimeofday(&tv, NULL); - start_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000; - - gtk_main (); - - return EX_OK; + return 0; }