window_linux.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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 12namespace media { 13 14static gboolean OnDelete(GtkWidget* widget, GdkEventExpose* event) { 15 gtk_main_quit(); 16 return FALSE; 17} 18 19static 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 28gfx::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 39gfx::PluginWindowHandle Window::PluginWindow() { 40 return GDK_WINDOW_XWINDOW(GTK_WIDGET(window_handle_)->window); 41} 42 43void 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 65void 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 83void Window::MainLoop() { 84 gtk_main(); 85} 86 87} // namespace media 88