Home | History | Annotate | Download | only in shader_bench
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "media/tools/shader_bench/window.h"
      6 
      7 #include "media/tools/shader_bench/painter.h"
      8 
      9 #include <gdk/gdkx.h>
     10 #include <gtk/gtk.h>
     11 
     12 namespace media {
     13 
     14 static gboolean OnDelete(GtkWidget* widget, GdkEventExpose* event) {
     15   gtk_main_quit();
     16   return FALSE;
     17 }
     18 
     19 static gboolean OnExpose(GtkWidget* widget,
     20                          GdkEventExpose* event,
     21                          gpointer data) {
     22   Window* window = reinterpret_cast<Window*>(data);
     23   if (window)
     24     window->OnPaint();
     25   return FALSE;
     26 }
     27 
     28 gfx::NativeWindow Window::CreateNativeWindow(int width, int height) {
     29   GtkWidget* hwnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     30 
     31   gtk_window_set_default_size(GTK_WINDOW(hwnd), width, height);
     32   gtk_widget_set_double_buffered(hwnd, FALSE);
     33   gtk_widget_set_app_paintable(hwnd, TRUE);
     34   gtk_widget_show(hwnd);
     35 
     36   return GTK_WINDOW(hwnd);
     37 }
     38 
     39 gfx::PluginWindowHandle Window::PluginWindow() {
     40   return GDK_WINDOW_XWINDOW(GTK_WIDGET(window_handle_)->window);
     41 }
     42 
     43 void Window::Start(int limit, const base::Closure& callback,
     44                    Painter* painter) {
     45   running_ = true;
     46   count_ = 0;
     47   limit_ = limit;
     48   callback_ = callback;
     49   painter_ = painter;
     50 
     51   gtk_signal_connect(GTK_OBJECT(window_handle_),
     52                      "delete_event",
     53                      reinterpret_cast<GtkSignalFunc>(OnDelete),
     54                      NULL);
     55 
     56   gtk_signal_connect(GTK_OBJECT(window_handle_),
     57                      "expose_event",
     58                      reinterpret_cast<GtkSignalFunc>(OnExpose),
     59                      this);
     60 
     61   gtk_widget_queue_draw(GTK_WIDGET(window_handle_));
     62   MainLoop();
     63 }
     64 
     65 void Window::OnPaint() {
     66   if (!running_)
     67     return;
     68 
     69   if (count_ < limit_) {
     70     painter_->OnPaint();
     71     count_++;
     72     gtk_widget_queue_draw(GTK_WIDGET(window_handle_));
     73   } else {
     74     running_ = false;
     75     if (!callback_.is_null()) {
     76       callback_.Run();
     77       callback_.Reset();
     78     }
     79     gtk_main_quit();
     80   }
     81 }
     82 
     83 void Window::MainLoop() {
     84   gtk_main();
     85 }
     86 
     87 }  // namespace media
     88