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