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