[Webkit-unassigned] [Bug 26304] [GTK] Add controls for playing html5 video.
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Mon Aug 24 23:58:02 PDT 2009
https://bugs.webkit.org/show_bug.cgi?id=26304
Xan Lopez <xan.lopez at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #38456|review? |review-
Flag| |
--- Comment #8 from Xan Lopez <xan.lopez at gmail.com> 2009-08-24 23:58:00 PDT ---
(From update of attachment 38456)
> +webstylesheetsdir = ${datadir}/webkit-1.0/css
> +dist_webstylesheetsdir = \
This should be dist_webstylesheets_DATA = \ AFAIK
> + $(WebCore)/css/gtk/mediaControls-extras.css
> +
> # Clean rules for WebCore
>
> CLEANFILES += \
> diff --git a/WebCore/css/gtk/mediaControls-extras.css b/WebCore/css/gtk/mediaControls-extras.css
> new file mode 100644
> index 0000000..35d0c5f
> --- /dev/null
> +++ b/WebCore/css/gtk/mediaControls-extras.css
> @@ -0,0 +1,68 @@
> +/*
> + * WebKitGTK+ specific overrides for HTML5 media elements.
> + *
> + * Copyright (C) 2009 Zan Dobersek <zandobersek at gmail.com>
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
> + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
> + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
> + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
> + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + */
Are you sure you are using the correct license header here? :)
> diff --git a/WebCore/platform/gtk/RenderThemeGtk.cpp b/WebCore/platform/gtk/RenderThemeGtk.cpp
> index fdef9c2..bf80e2a 100644
> --- a/WebCore/platform/gtk/RenderThemeGtk.cpp
(...)
> +using namespace HTMLNames;
> +
> PassRefPtr<RenderTheme> RenderThemeGtk::create()
> {
> return adoptRef(new RenderThemeGtk());
> @@ -446,6 +452,14 @@ void RenderThemeGtk::systemFont(int, FontDescription&) const
> notImplemented();
> }
>
> +void RenderThemeGtk::adjustSliderThumbSize(RenderObject* o) const
> +{
> + if (o->style()->appearance() == MediaSliderThumbPart) {
> + o->style()->setWidth(Length(12, Fixed));
> + o->style()->setHeight(Length(12, Fixed));
> + }
> +}
This could possibly go in a different patch...
> +
> static void gtkStyleSetCallback(GtkWidget* widget, GtkStyle* previous, RenderTheme* renderTheme)
> {
> // FIXME: Make sure this function doesn't get called many times for a single GTK+ style change signal.
> @@ -459,6 +473,7 @@ GtkContainer* RenderThemeGtk::gtkContainer() const
>
> m_gtkWindow = gtk_window_new(GTK_WINDOW_POPUP);
> m_gtkContainer = GTK_CONTAINER(gtk_fixed_new());
> + g_signal_connect(GTK_WIDGET(m_gtkWindow), "style-set", G_CALLBACK(gtkStyleSetCallback), const_cast<RenderThemeGtk*>(this));
No need to cast m_gtkWindow to GTK_WIDGET here.
> gtk_container_add(GTK_CONTAINER(m_gtkWindow), GTK_WIDGET(m_gtkContainer));
> gtk_widget_realize(m_gtkWindow);
>
> @@ -491,4 +506,216 @@ GtkWidget* RenderThemeGtk::gtkTreeView() const
> return m_gtkTreeView;
> }
>
> +void RenderThemeGtk::platformColorsDidChange()
> +{
> +#if ENABLE(VIDEO)
> + initMediaStyling(true);
> +#endif
> + RenderTheme::platformColorsDidChange();
> +}
> +
> +#if ENABLE(VIDEO)
> +String RenderThemeGtk::extraMediaControlsStyleSheet()
> +{
> + GString* fileName = g_string_new(0);
> + g_string_printf(fileName, "%s/webkit-1.0/css/mediaControls-extras.css", DATA_DIR);
You can simply use g_strdup_printf here.
> +
> + String returnString = String();
> +
> + GOwnPtr<gchar> content;
> + gsize length;
> + if (g_file_get_contents(fileName->str, &content.outPtr(), &length, 0))
> + returnString = String(content.get(), length);
> +
> + g_string_free(fileName, TRUE);
> +
> + return returnString;
> +}
> +
> +char* getIconNameForTextDirection(const char* name)
> +{
> + GString* directionName = g_string_new(name);
> + GtkTextDirection direction = gtk_widget_get_default_direction();
> +
> + if (direction == GTK_TEXT_DIR_RTL)
> + g_string_append(directionName, "-rtl");
> + else if (direction == GTK_TEXT_DIR_LTR)
> + g_string_append(directionName, "-ltr");
> +
> + gchar* returnString = g_strdup(directionName->str);
> + g_string_free(directionName, TRUE);
> +
> + return returnString;
You can do 'return g_string_free(directionName, FALSE)'
> +}
> +
> +static Color colorControlPanelBackground = 0;
> +static Color colorControlPanelForeground = 0;
> +static Color colorSliderBackground = 0;
> +static Color colorSliderThumb = 0;
> +
> +static char* playButtonIconName = 0;
> +static char* seekBackButtonIconName = 0;
> +static char* seekForwardButtonIconName = 0;
> +
> +static Image* fullscreenButton = 0;
> +static Image* muteButton = 0;
> +static Image* unmuteButton = 0;
> +static Image* playButton = 0;
> +static Image* pauseButton = 0;
> +static Image* seekBackButton = 0;
> +static Image* seekForwardButton = 0;
> +
> +void RenderThemeGtk::initMediaStyling(bool force)
> +{
> + static bool stylingInitialized = false;
> +
> + if (!stylingInitialized || force) {
> + GtkContainer* container = gtkContainer();
> + GtkStyle* style = gtk_rc_get_style(GTK_WIDGET(container));
> + colorControlPanelBackground = Color(style->bg[GTK_STATE_NORMAL], 140);
> + colorControlPanelForeground = style->bg[GTK_STATE_NORMAL];
> + colorSliderBackground = style->bg[GTK_STATE_ACTIVE];
> + colorSliderThumb = style->bg[GTK_STATE_SELECTED];
> +
> + if (playButtonIconName)
> + g_free(playButtonIconName);
> + if (seekBackButtonIconName)
> + g_free(seekBackButtonIconName);
> + if (seekForwardButtonIconName)
> + g_free(seekForwardButtonIconName);
g_free is NULL-safe, no nee to check.
> + playButtonIconName = getIconNameForTextDirection("gtk-media-play");
> + seekBackButtonIconName = getIconNameForTextDirection("gtk-media-rewind");
> + seekForwardButtonIconName = getIconNameForTextDirection("gtk-media-forward");
> +
> + fullscreenButton = Image::loadPlatformThemeIcon("gtk-fullscreen", 16).releaseRef();
> + muteButton = Image::loadPlatformThemeIcon("audio-volume-muted", 16).releaseRef();
> + unmuteButton = Image::loadPlatformThemeIcon("audio-volume-high", 16).releaseRef();
> + playButton = Image::loadPlatformThemeIcon(reinterpret_cast<const char*>(playButtonIconName), 32).releaseRef();
> + pauseButton = Image::loadPlatformThemeIcon("gtk-media-pause", 32).releaseRef();
> + seekBackButton = Image::loadPlatformThemeIcon(reinterpret_cast<const char*>(seekBackButtonIconName), 32).releaseRef();
> + seekForwardButton = Image::loadPlatformThemeIcon(reinterpret_cast<const char*>(seekForwardButtonIconName), 32).releaseRef();
Mmm, and what about the previous images, don't you need to unref them before?
> +
> + stylingInitialized = true;
> + }
> +}
> +
> +bool RenderThemeGtk::paintMediaFullscreenButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> +
> + paintInfo.context->fillRoundedRect(r, IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), colorControlPanelBackground);
> + paintInfo.context->fillRoundedRect(IntRect(r.x(), r.y() + 10, 20, 20),
> + IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), colorControlPanelForeground);
> + paintInfo.context->drawImage(fullscreenButton,
> + IntRect(r.x() + 2, r.y() + 12, 16, 16));
> + return false;
> +}
> +
> +bool RenderThemeGtk::paintMediaMuteButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> + HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o);
> + if (!mediaElement)
> + return false;
> +
> + paintInfo.context->fillRoundedRect(r, IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), colorControlPanelBackground);
> + paintInfo.context->fillRoundedRect(IntRect(r.x() + 2, r.y() + 10, 20, 20),
> + IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), colorControlPanelForeground);
> + paintInfo.context->drawImage(mediaElement->muted() ? unmuteButton : muteButton,
> + IntRect(r.x() + 4, r.y() + 12, 16, 16));
> + return false;
> +}
> +
> +bool RenderThemeGtk::paintMediaPlayButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> + HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o);
> + if (!mediaElement)
> + return false;
> +
> + // If media has audio, the mute button will be painted. If not,
> + // play/pause button will be the most left-positioned in the control panel,
> + // so the background rect should be rounded appropriately.
> + int xOffset = 0;
> + if (mediaElement->hasAudio())
> + paintInfo.context->fillRect(FloatRect(r), colorControlPanelBackground);
> + else {
> + paintInfo.context->fillRoundedRect(r, IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), colorControlPanelBackground);
> + xOffset = 2;
> + }
> + paintInfo.context->fillRoundedRect(IntRect(r.x() + xOffset, r.y() + 2, 36 - xOffset, 36),
> + IntSize(5, 5), IntSize(5, 5), IntSize(5, 5), IntSize(5, 5), colorControlPanelForeground);
> + paintInfo.context->drawImage(mediaElement->canPlay() ? playButton : pauseButton,
> + IntRect(r.x() + xOffset / 2 + 2, r.y() + 4, 32, 32));
> + return false;
> +}
> +
> +bool RenderThemeGtk::paintMediaSeekBackButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> +
> + paintInfo.context->fillRect(FloatRect(r), colorControlPanelBackground);
> + paintInfo.context->fillRoundedRect(IntRect(r.x(), r.y() + 2, 36, 36),
> + IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), colorControlPanelForeground);
> + paintInfo.context->drawImage(seekBackButton,
> + IntRect(r.x() + 2, r.y() + 4, 32, 32));
> + return false;
> +}
> +
> +bool RenderThemeGtk::paintMediaSeekForwardButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> + HTMLMediaElement* mediaElement = getMediaElementFromRenderObject(o);
> + if (!mediaElement)
> + return false;
> +
> + // If media supports fullscreen, a fullscreen button will be painted to the right
> + // of this button. If fullscreen is not supported, this button is the most
> + // right-positioned in the control panel, therefor the background rect
> + // should be properly rounded.
> + int xOffset = 0;
> + if (mediaElement->supportsFullscreen()) {
> + paintInfo.context->fillRect(FloatRect(r), colorControlPanelBackground);
> + xOffset = 2;
> + } else
> + paintInfo.context->fillRoundedRect(r, IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), colorControlPanelBackground);
> + paintInfo.context->fillRoundedRect(IntRect(r.x(), r.y() + 2, 36 + xOffset, 36),
> + IntSize(0, 0), IntSize(5, 5), IntSize(0, 0), IntSize(5, 5), colorControlPanelForeground);
> + paintInfo.context->drawImage(seekForwardButton,
> + IntRect(r.x() + 2, r.y() + 4, 32, 32));
> + return false;
> +}
> +
> +bool RenderThemeGtk::paintMediaSliderTrack(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> +
> + paintInfo.context->fillRect(FloatRect(r), colorControlPanelBackground);
> + paintInfo.context->fillRect(FloatRect(IntRect(r.x(), r.y() + 8, r.width(), 24)), colorControlPanelForeground);
> +
> + paintInfo.context->fillRoundedRect(IntRect(r.x() + 2, r.y() + 13, r.width() - 4, 14),
> + IntSize(3, 3), IntSize(3, 3), IntSize(3, 3), IntSize(3, 3),
> + colorSliderBackground);
> + return false;
> +}
> +
> +bool RenderThemeGtk::paintMediaSliderThumb(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
> +{
> + initMediaStyling();
> +
> + paintInfo.context->fillRoundedRect(r, IntSize(3, 3), IntSize(3, 3), IntSize(3, 3), IntSize(3, 3), colorSliderThumb);
> + return false;
> +}
> +#endif
There's lots and lots of hardcoded numbers here, I don't like that :/
At the very least I think you should make them constants with names so it's
easier to see what's going on. On top of that I see there's quite a few of
completely hardcoded sizes, is it really meant to be like that?
I'm marking this r- while we work on the raised issues.
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list