Changeset 52266 in webkit
- Timestamp:
- Dec 17, 2009 11:13:42 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r52252 r52266 1 2009-12-07 Philippe Normand <pnormand@igalia.com> 2 3 Reviewed by Xan Lopez. 4 5 [GTK] Add controls for playing html5 video. 6 https://bugs.webkit.org/show_bug.cgi?id=26304 7 8 Unskip some of the media tests related to the controls 9 UI. Generated results for the new ones, it will likely be needed 10 again when we add new features in the controls UI. 11 12 * platform/gtk/Skipped: 13 * platform/gtk/media/controls-after-reload-expected.txt: Added. 14 * platform/gtk/media/controls-drag-timebar-expected.txt: Added. 15 * platform/gtk/media/controls-strict-expected.txt: Added. 16 * platform/gtk/media/controls-styling-expected.txt: Added. 17 * platform/gtk/media/video-controls-rendering-expected.txt: Added. 18 * platform/gtk/media/video-controls-visible-audio-only-expected.txt: Copied from LayoutTests/platform/mac/media/video-controls-visible-audio-only-expected.txt. 19 1 20 2009-12-17 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> 2 21 -
trunk/LayoutTests/platform/gtk/Skipped
r52252 r52266 3614 3614 3615 3615 # Tests timing out 3616 media/controls-drag-timebar.html3617 3616 media/unsupported-rtsp.html 3618 3617 # Tests generating new results 3619 3618 media/audio-controls-rendering.html 3620 3619 media/video-aspect-ratio.html 3621 media/video-controls-rendering.html3622 media/video-controls-visible-audio-only.html3623 3620 media/video-display-toggle.html 3624 3621 media/video-empty-source.html … … 5438 5435 fast/text/text-letter-spacing.html 5439 5436 media/audio-no-installed-engines.html 5440 media/controls-after-reload.html5441 media/controls-strict.html5442 media/controls-styling.html5443 5437 svg/batik/filters/feTile.svg 5444 5438 svg/custom/createImageElement.svg -
trunk/WebCore/ChangeLog
r52261 r52266 1 2009-12-10 Philippe Normand <pnormand@igalia.com> 2 3 Reviewed by Xan Lopez. 4 5 [GTK] Add controls for playing html5 video. 6 https://bugs.webkit.org/show_bug.cgi?id=26304 7 8 Media controls UI, first step. This patch was written by Zan 9 Dobersek. In addition I fixed the compilation errors and 10 re-enabled some of the media tests involving the controls UI. 11 12 * GNUmakefile.am: 13 * css/mediaControlsGtk.css: Added. 14 * platform/graphics/Image.h: 15 * platform/graphics/gtk/ImageGtk.cpp: 16 (WebCore::getThemeIconFileName): 17 (WebCore::loadResourceSharedBuffer): 18 (WebCore::loadImageFromFile): 19 (WebCore::Image::loadPlatformResource): 20 (WebCore::Image::loadPlatformThemeIcon): 21 * platform/gtk/RenderThemeGtk.cpp: 22 (WebCore::getMediaElementFromRenderObject): 23 (WebCore::getIconNameForTextDirection): 24 (WebCore::RenderThemeGtk::initMediaStyling): 25 (WebCore::RenderThemeGtk::RenderThemeGtk): 26 (WebCore::RenderThemeGtk::~RenderThemeGtk): 27 (WebCore::supportsFocus): 28 (WebCore::RenderThemeGtk::baselinePosition): 29 (WebCore::paintMozWidget): 30 (WebCore::setToggleSize): 31 (WebCore::RenderThemeGtk::adjustSliderThumbSize): 32 (WebCore::RenderThemeGtk::gtkContainer): 33 (WebCore::RenderThemeGtk::platformColorsDidChange): 34 (WebCore::RenderThemeGtk::extraMediaControlsStyleSheet): 35 (WebCore::paintMediaButton): 36 (WebCore::RenderThemeGtk::paintMediaFullscreenButton): 37 (WebCore::RenderThemeGtk::paintMediaMuteButton): 38 (WebCore::RenderThemeGtk::paintMediaPlayButton): 39 (WebCore::RenderThemeGtk::paintMediaSeekBackButton): 40 (WebCore::RenderThemeGtk::paintMediaSeekForwardButton): 41 (WebCore::RenderThemeGtk::paintMediaSliderTrack): 42 (WebCore::RenderThemeGtk::paintMediaSliderThumb): 43 * platform/gtk/RenderThemeGtk.h: 44 1 45 2009-12-17 Yael Aharon <yael.aharon@nokia.com> 2 46 -
trunk/WebCore/GNUmakefile.am
r52258 r52266 3459 3459 $(WebCore)/css/svg.css \ 3460 3460 $(WebCore)/css/wml.css \ 3461 $(WebCore)/css/mediaControls.css 3461 $(WebCore)/css/mediaControls.css \ 3462 $(WebCore)/css/mediaControlsGtk.css 3462 3463 3463 3464 # new-style JavaScript bindings … … 3574 3575 WebCore/css/wml.css \ 3575 3576 WebCore/css/mediaControls.css \ 3577 WebCore/css/mediaControlsGtk.css \ 3576 3578 WebCore/css/CSSGrammar.y \ 3577 3579 WebCore/css/CSSValueKeywords.in \ -
trunk/WebCore/platform/graphics/Image.h
r52229 r52266 151 151 #if PLATFORM(GTK) 152 152 virtual GdkPixbuf* getGdkPixbuf() { return 0; } 153 static PassRefPtr<Image> loadPlatformThemeIcon(const char* name, int size); 153 154 #endif 154 155 -
trunk/WebCore/platform/graphics/gtk/ImageGtk.cpp
r48888 r52266 45 45 namespace WebCore { 46 46 47 static CString get IconFileNameOrFallback(const char* name, const char* fallback)47 static CString getThemeIconFileName(const char* name, int size) 48 48 { 49 GOwnPtr<GtkIconInfo> info(gtk_icon_theme_lookup_icon(gtk_icon_theme_get_default(), 50 name, 16, GTK_ICON_LOOKUP_NO_SVG)); 51 if (!info) 52 return String::format("%s/webkit-1.0/images/%s.png", DATA_DIR, fallback).utf8(); 49 GtkIconInfo* iconInfo = gtk_icon_theme_lookup_icon(gtk_icon_theme_get_default(), 50 name, size, GTK_ICON_LOOKUP_NO_SVG); 51 if (!iconInfo) 52 iconInfo = gtk_icon_theme_lookup_icon(gtk_icon_theme_get_default(), 53 GTK_STOCK_MISSING_IMAGE, size, 54 GTK_ICON_LOOKUP_NO_SVG); 53 55 56 GOwnPtr<GtkIconInfo> info(iconInfo); 54 57 return CString(gtk_icon_info_get_filename(info.get())); 55 58 } 56 59 57 static PassRefPtr<SharedBuffer> loadResourceSharedBuffer( const char*name)60 static PassRefPtr<SharedBuffer> loadResourceSharedBuffer(CString name) 58 61 { 59 CString fileName;60 61 // Find the path for the image62 if (strcmp("missingImage", name) == 0)63 fileName = getIconFileNameOrFallback(GTK_STOCK_MISSING_IMAGE, "missingImage");64 else65 fileName = String::format("%s/webkit-1.0/images/%s.png", DATA_DIR, name).utf8();66 67 62 GOwnPtr<gchar> content; 68 63 gsize length; 69 if (!g_file_get_contents( fileName.data(), &content.outPtr(), &length, 0))64 if (!g_file_get_contents(name.data(), &content.outPtr(), &length, 0)) 70 65 return SharedBuffer::create(); 71 66 … … 81 76 } 82 77 78 PassRefPtr<Image> loadImageFromFile(CString fileName) 79 { 80 RefPtr<BitmapImage> img = BitmapImage::create(); 81 RefPtr<SharedBuffer> buffer = loadResourceSharedBuffer(fileName); 82 img->setData(buffer.release(), true); 83 return img.release(); 84 } 85 83 86 PassRefPtr<Image> Image::loadPlatformResource(const char* name) 84 87 { 85 RefPtr<BitmapImage> img = BitmapImage::create(); 86 RefPtr<SharedBuffer> buffer = loadResourceSharedBuffer(name); 87 img->setData(buffer.release(), true); 88 return img.release(); 88 CString fileName; 89 if (!strcmp("missingImage", name)) 90 fileName = getThemeIconFileName(GTK_STOCK_MISSING_IMAGE, 16); 91 if (fileName.isNull()) 92 fileName = String::format("%s/webkit-1.0/images/%s.png", DATA_DIR, name).utf8(); 93 94 return loadImageFromFile(fileName); 95 } 96 97 PassRefPtr<Image> Image::loadPlatformThemeIcon(const char* name, int size) 98 { 99 return loadImageFromFile(getThemeIconFileName(name, size)); 89 100 } 90 101 -
trunk/WebCore/platform/gtk/RenderThemeGtk.cpp
r50527 r52266 25 25 #include "RenderThemeGtk.h" 26 26 27 #include "TransformationMatrix.h" 27 #include "CString.h" 28 #include "GOwnPtr.h" 28 29 #include "GraphicsContext.h" 30 #include "HTMLMediaElement.h" 31 #include "HTMLNames.h" 29 32 #include "NotImplemented.h" 30 33 #include "RenderBox.h" 31 34 #include "RenderObject.h" 35 #include "TransformationMatrix.h" 36 #include "UserAgentStyleSheets.h" 32 37 #include "gtkdrawing.h" 33 38 … … 35 40 36 41 namespace WebCore { 42 43 using namespace HTMLNames; 44 45 #if ENABLE(VIDEO) 46 static HTMLMediaElement* getMediaElementFromRenderObject(RenderObject* o) 47 { 48 Node* node = o->node(); 49 Node* mediaNode = node ? node->shadowAncestorNode() : 0; 50 if (!mediaNode || (!mediaNode->hasTagName(videoTag) && !mediaNode->hasTagName(audioTag))) 51 return 0; 52 53 return static_cast<HTMLMediaElement*>(mediaNode); 54 } 55 56 static gchar* getIconNameForTextDirection(const char* baseName) 57 { 58 GString* nameWithDirection = g_string_new(baseName); 59 GtkTextDirection textDirection = gtk_widget_get_default_direction(); 60 61 if (textDirection == GTK_TEXT_DIR_RTL) 62 g_string_append(nameWithDirection, "-rtl"); 63 else if (textDirection == GTK_TEXT_DIR_LTR) 64 g_string_append(nameWithDirection, "-ltr"); 65 66 return g_string_free(nameWithDirection, FALSE); 67 } 68 69 void RenderThemeGtk::initMediaStyling(GtkStyle* style, bool force) 70 { 71 static bool stylingInitialized = false; 72 73 if (!stylingInitialized || force) { 74 m_panelColor = style->bg[GTK_STATE_NORMAL]; 75 m_sliderColor = style->bg[GTK_STATE_ACTIVE]; 76 m_sliderThumbColor = style->bg[GTK_STATE_SELECTED]; 77 78 // Names of these icons can vary because of text direction. 79 gchar* playButtonIconName = getIconNameForTextDirection("gtk-media-play"); 80 gchar* seekBackButtonIconName = getIconNameForTextDirection("gtk-media-rewind"); 81 gchar* seekForwardButtonIconName = getIconNameForTextDirection("gtk-media-forward"); 82 83 m_fullscreenButton.clear(); 84 m_muteButton.clear(); 85 m_unmuteButton.clear(); 86 m_playButton.clear(); 87 m_pauseButton.clear(); 88 m_seekBackButton.clear(); 89 m_seekForwardButton.clear(); 90 91 m_fullscreenButton = Image::loadPlatformThemeIcon("gtk-fullscreen", m_mediaIconSize); 92 m_muteButton = Image::loadPlatformThemeIcon("audio-volume-muted", m_mediaIconSize); 93 m_unmuteButton = Image::loadPlatformThemeIcon("audio-volume-high", m_mediaIconSize); 94 m_playButton = Image::loadPlatformThemeIcon(reinterpret_cast<const char*>(playButtonIconName), m_mediaIconSize); 95 m_pauseButton = Image::loadPlatformThemeIcon("gtk-media-pause", m_mediaIconSize).releaseRef(); 96 m_seekBackButton = Image::loadPlatformThemeIcon(reinterpret_cast<const char*>(seekBackButtonIconName), m_mediaIconSize); 97 m_seekForwardButton = Image::loadPlatformThemeIcon(reinterpret_cast<const char*>(seekForwardButtonIconName), m_mediaIconSize); 98 99 g_free(playButtonIconName); 100 g_free(seekBackButtonIconName); 101 g_free(seekForwardButtonIconName); 102 stylingInitialized = true; 103 } 104 } 105 #endif 37 106 38 107 PassRefPtr<RenderTheme> RenderThemeGtk::create() … … 54 123 , m_gtkEntry(0) 55 124 , m_gtkTreeView(0) 125 , m_panelColor(Color::white) 126 , m_sliderColor(Color::white) 127 , m_sliderThumbColor(Color::white) 128 , m_mediaIconSize(16) 129 , m_mediaSliderHeight(14) 130 , m_mediaSliderThumbWidth(12) 131 , m_mediaSliderThumbHeight(12) 132 , m_fullscreenButton(0) 133 , m_muteButton(0) 134 , m_unmuteButton(0) 135 , m_playButton(0) 136 , m_pauseButton(0) 137 , m_seekBackButton(0) 138 , m_seekForwardButton(0) 56 139 { 57 140 if (!mozGtkRefCount) … … 59 142 60 143 ++mozGtkRefCount; 144 145 #if ENABLE(VIDEO) 146 initMediaStyling(gtk_rc_get_style(GTK_WIDGET(gtkContainer())), false); 147 #endif 61 148 } 62 149 … … 67 154 if (!mozGtkRefCount) 68 155 moz_gtk_shutdown(); 156 157 m_fullscreenButton.clear(); 158 m_muteButton.clear(); 159 m_unmuteButton.clear(); 160 m_playButton.clear(); 161 m_pauseButton.clear(); 162 m_seekBackButton.clear(); 163 m_seekForwardButton.clear(); 69 164 } 70 165 … … 72 167 { 73 168 switch (appearance) { 74 75 76 77 78 79 80 81 82 83 84 169 case PushButtonPart: 170 case ButtonPart: 171 case TextFieldPart: 172 case TextAreaPart: 173 case SearchFieldPart: 174 case MenulistPart: 175 case RadioPart: 176 case CheckboxPart: 177 return true; 178 default: 179 return false; 85 180 } 86 181 } … … 102 197 103 198 // FIXME: This strategy is possibly incorrect for the GTK+ port. 104 if (o->style()->appearance() == CheckboxPart ||105 o->style()->appearance() == RadioPart) {199 if (o->style()->appearance() == CheckboxPart 200 || o->style()->appearance() == RadioPart) { 106 201 const RenderBox* box = toRenderBox(o); 107 202 return box->marginTop() + box->height() - 2; … … 171 266 // We might want to make setting flags the caller's job at some point rather than doing it here. 172 267 switch (type) { 173 174 175 176 177 178 179 180 181 182 268 case MOZ_GTK_BUTTON: 269 flags = GTK_RELIEF_NORMAL; 270 break; 271 case MOZ_GTK_CHECKBUTTON: 272 case MOZ_GTK_RADIOBUTTON: 273 flags = theme->isChecked(o); 274 break; 275 default: 276 flags = 0; 277 break; 183 278 } 184 279 … … 190 285 191 286 // Find the clip rectangle 192 cairo_t *cr = i.context->platformContext();287 cairo_t* cr = i.context->platformContext(); 193 288 double clipX1, clipX2, clipY1, clipY2; 194 289 cairo_clip_extents(cr, &clipX1, &clipY1, &clipX2, &clipY2); … … 222 317 return; 223 318 224 // FIXME: This is probably not correct use of indicator _size and indicator_spacing.225 gint indicator _size, indicator_spacing;319 // FIXME: This is probably not correct use of indicatorSize and indicatorSpacing. 320 gint indicatorSize, indicatorSpacing; 226 321 227 322 switch (appearance) { 228 case CheckboxPart: 229 if (moz_gtk_checkbox_get_metrics(&indicator_size, &indicator_spacing) != MOZ_GTK_SUCCESS) 230 return; 231 break; 232 case RadioPart: 233 if (moz_gtk_radio_get_metrics(&indicator_size, &indicator_spacing) != MOZ_GTK_SUCCESS) 234 return; 235 break; 236 default: 323 case CheckboxPart: 324 if (moz_gtk_checkbox_get_metrics(&indicatorSize, &indicatorSpacing) != MOZ_GTK_SUCCESS) 237 325 return; 326 break; 327 case RadioPart: 328 if (moz_gtk_radio_get_metrics(&indicatorSize, &indicatorSpacing) != MOZ_GTK_SUCCESS) 329 return; 330 break; 331 default: 332 return; 238 333 } 239 334 240 335 // Other ports hard-code this to 13, but GTK+ users tend to demand the native look. 241 336 // It could be made a configuration option values other than 13 actually break site compatibility. 242 int length = indicator _size + indicator_spacing;337 int length = indicatorSize + indicatorSpacing; 243 338 if (style->width().isIntrinsicOrAuto()) 244 339 style->setWidth(Length(length, Fixed)); … … 374 469 } 375 470 471 void RenderThemeGtk::adjustSliderThumbSize(RenderObject* o) const 472 { 473 #if ENABLE(VIDEO) 474 if (o->style()->appearance() == MediaSliderThumbPart) { 475 o->style()->setWidth(Length(m_mediaSliderThumbWidth, Fixed)); 476 o->style()->setHeight(Length(m_mediaSliderThumbHeight, Fixed)); 477 } 478 #endif 479 } 480 376 481 Color RenderThemeGtk::platformActiveSelectionBackgroundColor() const 377 482 { … … 456 561 m_gtkWindow = gtk_window_new(GTK_WINDOW_POPUP); 457 562 m_gtkContainer = GTK_CONTAINER(gtk_fixed_new()); 563 g_signal_connect(m_gtkWindow, "style-set", G_CALLBACK(gtkStyleSetCallback), const_cast<RenderThemeGtk*>(this)); 458 564 gtk_container_add(GTK_CONTAINER(m_gtkWindow), GTK_WIDGET(m_gtkContainer)); 459 565 gtk_widget_realize(m_gtkWindow); … … 488 594 } 489 595 490 } 596 void RenderThemeGtk::platformColorsDidChange() 597 { 598 #if ENABLE(VIDEO) 599 initMediaStyling(gtk_rc_get_style(GTK_WIDGET(gtkContainer())), true); 600 #endif 601 RenderTheme::platformColorsDidChange(); 602 } 603 604 #if ENABLE(VIDEO) 605 String RenderThemeGtk::extraMediaControlsStyleSheet() 606 { 607 return String(mediaControlsGtkUserAgentStyleSheet, sizeof(mediaControlsGtkUserAgentStyleSheet)); 608 } 609 610 static inline bool paintMediaButton(GraphicsContext* context, const IntRect& r, Image* image, Color panelColor, int mediaIconSize) 611 { 612 context->fillRect(FloatRect(r), panelColor, DeviceColorSpace); 613 context->drawImage(image, DeviceColorSpace, 614 IntRect(r.x() + (r.width() - mediaIconSize) / 2, 615 r.y() + (r.height() - mediaIconSize) / 2, 616 mediaIconSize, mediaIconSize)); 617 618 return false; 619 } 620 621 bool RenderThemeGtk::paintMediaFullscreenButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 622 { 623 return paintMediaButton(paintInfo.context, r, m_fullscreenButton.get(), m_panelColor, m_mediaIconSize); 624 } 625 626 bool RenderThemeGtk::paintMediaMuteButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 627 { 628 HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o); 629 if (!mediaElement) 630 return false; 631 632 return paintMediaButton(paintInfo.context, r, mediaElement->muted() ? m_unmuteButton.get() : m_muteButton.get(), m_panelColor, m_mediaIconSize); 633 } 634 635 bool RenderThemeGtk::paintMediaPlayButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 636 { 637 HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o); 638 if (!mediaElement) 639 return false; 640 641 return paintMediaButton(paintInfo.context, r, mediaElement->canPlay() ? m_playButton.get() : m_pauseButton.get(), m_panelColor, m_mediaIconSize); 642 } 643 644 bool RenderThemeGtk::paintMediaSeekBackButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 645 { 646 return paintMediaButton(paintInfo.context, r, m_seekBackButton.get(), m_panelColor, m_mediaIconSize); 647 } 648 649 bool RenderThemeGtk::paintMediaSeekForwardButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 650 { 651 return paintMediaButton(paintInfo.context, r, m_seekForwardButton.get(), m_panelColor, m_mediaIconSize); 652 } 653 654 bool RenderThemeGtk::paintMediaSliderTrack(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 655 { 656 paintInfo.context->fillRect(FloatRect(r), m_panelColor, DeviceColorSpace); 657 paintInfo.context->fillRect(FloatRect(IntRect(r.x(), r.y() + (r.height() - m_mediaSliderHeight) / 2, 658 r.width(), m_mediaSliderHeight)), m_sliderColor, DeviceColorSpace); 659 return false; 660 } 661 662 bool RenderThemeGtk::paintMediaSliderThumb(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) 663 { 664 // Make the thumb nicer with rounded corners. 665 paintInfo.context->fillRoundedRect(r, IntSize(3, 3), IntSize(3, 3), IntSize(3, 3), IntSize(3, 3), m_sliderThumbColor, DeviceColorSpace); 666 return false; 667 } 668 #endif 669 670 } -
trunk/WebCore/platform/gtk/RenderThemeGtk.h
r45595 r52266 74 74 virtual double caretBlinkInterval() const; 75 75 76 virtual void platformColorsDidChange(); 77 76 78 // System fonts. 77 79 virtual void systemFont(int propId, FontDescription&) const; 80 81 #if ENABLE(VIDEO) 82 virtual String extraMediaControlsStyleSheet(); 83 #endif 78 84 79 85 protected: … … 107 113 virtual bool paintSearchFieldCancelButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 108 114 115 virtual void adjustSliderThumbSize(RenderObject*) const; 116 117 #if ENABLE(VIDEO) 118 virtual void initMediaStyling(GtkStyle* style, bool force); 119 virtual bool paintMediaFullscreenButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 120 virtual bool paintMediaPlayButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 121 virtual bool paintMediaMuteButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 122 virtual bool paintMediaSeekBackButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 123 virtual bool paintMediaSeekForwardButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 124 virtual bool paintMediaSliderTrack(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 125 virtual bool paintMediaSliderThumb(RenderObject*, const RenderObject::PaintInfo&, const IntRect&); 126 #endif 109 127 110 128 private: … … 126 144 mutable GtkWidget* m_gtkEntry; 127 145 mutable GtkWidget* m_gtkTreeView; 146 147 mutable Color m_panelColor; 148 mutable Color m_sliderColor; 149 mutable Color m_sliderThumbColor; 150 151 const int m_mediaIconSize; 152 const int m_mediaSliderHeight; 153 const int m_mediaSliderThumbWidth; 154 const int m_mediaSliderThumbHeight; 155 156 RefPtr<Image> m_fullscreenButton; 157 RefPtr<Image> m_muteButton; 158 RefPtr<Image> m_unmuteButton; 159 RefPtr<Image> m_playButton; 160 RefPtr<Image> m_pauseButton; 161 RefPtr<Image> m_seekBackButton; 162 RefPtr<Image> m_seekForwardButton; 163 128 164 }; 129 165
Note: See TracChangeset
for help on using the changeset viewer.