15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/tools/shader_bench/window.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/tools/shader_bench/painter.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gdk/gdkx.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static gboolean OnDelete(GtkWidget* widget, GdkEventExpose* event) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_main_quit();
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FALSE;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static gboolean OnExpose(GtkWidget* widget,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         GdkEventExpose* event,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         gpointer data) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Window* window = reinterpret_cast<Window*>(data);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window->OnPaint();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FALSE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow Window::CreateNativeWindow(int width, int height) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GtkWidget* hwnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_window_set_default_size(GTK_WINDOW(hwnd), width, height);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_set_double_buffered(hwnd, FALSE);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_set_app_paintable(hwnd, TRUE);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_show(hwnd);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GTK_WINDOW(hwnd);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::PluginWindowHandle Window::PluginWindow() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GDK_WINDOW_XWINDOW(GTK_WIDGET(window_handle_)->window);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Window::Start(int limit, const base::Closure& callback,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Painter* painter) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  running_ = true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count_ = 0;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  limit_ = limit;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_ = callback;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  painter_ = painter;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_signal_connect(GTK_OBJECT(window_handle_),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "delete_event",
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     reinterpret_cast<GtkSignalFunc>(OnDelete),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     NULL);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_signal_connect(GTK_OBJECT(window_handle_),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "expose_event",
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     reinterpret_cast<GtkSignalFunc>(OnExpose),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     this);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_widget_queue_draw(GTK_WIDGET(window_handle_));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MainLoop();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Window::OnPaint() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!running_)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (count_ < limit_) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    painter_->OnPaint();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count_++;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_widget_queue_draw(GTK_WIDGET(window_handle_));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    running_ = false;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!callback_.is_null()) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_.Run();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback_.Reset();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gtk_main_quit();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Window::MainLoop() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gtk_main();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
88