Mercurial > audlegacy
diff src/audacious/ui_skinned_window.c @ 3221:9583cd62231f trunk
implement ui_skinned_window_expose
author | Tomasz Mon <desowin@gmail.com> |
---|---|
date | Thu, 02 Aug 2007 15:40:46 +0200 |
parents | 018b37cf0730 |
children | 963dfcfdc851 |
line wrap: on
line diff
--- a/src/audacious/ui_skinned_window.c Thu Aug 02 15:07:31 2007 +0200 +++ b/src/audacious/ui_skinned_window.c Thu Aug 02 15:40:46 2007 +0200 @@ -26,11 +26,14 @@ #include <glib/gmacros.h> #include <gtk/gtkmarshal.h> #include <gtk/gtkwindow.h> +#include <string.h> #include "main.h" #include "dock.h" #include "ui_skinned_window.h" #include "ui_skinned_cursor.h" +#include "util.h" +#include "ui_playlist.h" static void ui_skinned_window_class_init(SkinnedWindowClass *klass); static void ui_skinned_window_init(GtkWidget *widget); @@ -99,6 +102,79 @@ return FALSE; } +static gboolean ui_skinned_window_expose(GtkWidget *widget, GdkEventExpose *event) { + SkinnedWindow *window = SKINNED_WINDOW(widget); + + GdkPixmap *obj = NULL; + GdkGC *gc; + + gint width = 0, height = 0; + switch (window->type) { + case WINDOW_MAIN: + width = bmp_active_skin->properties.mainwin_width; + height = bmp_active_skin->properties.mainwin_height; + break; + case WINDOW_EQ: + width = 275; + height = 116; + break; + case WINDOW_PLAYLIST: + width = playlistwin_get_width(); + height = cfg.playlist_height; + break; + default: + return FALSE; + } + obj = gdk_pixmap_new(NULL, width, height, gdk_rgb_get_visual()->depth); + gc = gdk_gc_new(obj); + + gboolean focus = gtk_window_has_toplevel_focus(GTK_WINDOW(widget)); + + switch (window->type) { + case WINDOW_MAIN: + skin_draw_pixmap(bmp_active_skin, obj, gc, SKIN_MAIN, 0, 0, 0, 0, width, height); + skin_draw_mainwin_titlebar(bmp_active_skin, obj, gc, cfg.player_shaded, focus || !cfg.dim_titlebar); + break; + case WINDOW_EQ: + skin_draw_pixmap(bmp_active_skin, obj, gc, SKIN_EQMAIN, 0, 0, 0, 0, width, height); + if (focus || !cfg.dim_titlebar) { + if (!cfg.equalizer_shaded) + skin_draw_pixmap(bmp_active_skin, obj, gc, SKIN_EQMAIN, 0, 134, 0, 0, width, 14); + else + skin_draw_pixmap(bmp_active_skin, obj, gc, SKIN_EQ_EX, 0, 0, 0, 0, width, 14); + } else { + if (!cfg.equalizer_shaded) + skin_draw_pixmap(bmp_active_skin, obj, gc, SKIN_EQMAIN, 0, 149, 0, 0, width, 14); + else + skin_draw_pixmap(bmp_active_skin, obj, gc, SKIN_EQ_EX, 0, 15, 0, 0, width, 14); + } + break; + case WINDOW_PLAYLIST: + focus |= !cfg.dim_titlebar; + if (cfg.playlist_shaded) { + skin_draw_playlistwin_shaded(bmp_active_skin, obj, gc, playlistwin_get_width(), focus); + } else { + skin_draw_playlistwin_frame(bmp_active_skin, obj, gc, playlistwin_get_width(), cfg.playlist_height, focus); + } + break; + } + + GdkPixmap *image = NULL; + + if (window->type != WINDOW_PLAYLIST && cfg.doublesize) { + image = create_dblsize_pixmap(obj); + } else { + image = gdk_pixmap_new(NULL, width, height, gdk_rgb_get_visual()->depth); + gdk_draw_drawable (image, gc, obj, 0, 0, 0, 0, width, height); + } + g_object_unref(obj); + gdk_draw_drawable (widget->window, gc, image, 0, 0, 0, 0, width*(1+cfg.doublesize), height*(1+cfg.doublesize)); + g_object_unref(gc); + g_object_unref(image); + + return FALSE; +} + static void ui_skinned_window_class_init(SkinnedWindowClass *klass) { @@ -110,6 +186,7 @@ widget_class->configure_event = ui_skinned_window_configure; widget_class->motion_notify_event = ui_skinned_window_motion_notify_event; + widget_class->expose_event = ui_skinned_window_expose; } void @@ -154,7 +231,7 @@ GDK_FOCUS_CHANGE_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK | - GDK_VISIBILITY_NOTIFY_MASK); + GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK); gtk_widget_realize(GTK_WIDGET(widget)); dock_window_list = dock_window_set_decorated(dock_window_list, @@ -164,6 +241,12 @@ ui_skinned_cursor_set(GTK_WIDGET(widget)); SKINNED_WINDOW(widget)->gc = gdk_gc_new(widget->window); + if (!strcmp(wmclass_name, "player")) + SKINNED_WINDOW(widget)->type = WINDOW_MAIN; + if (!strcmp(wmclass_name, "equalizer")) + SKINNED_WINDOW(widget)->type = WINDOW_EQ; + if (!strcmp(wmclass_name, "playlist")) + SKINNED_WINDOW(widget)->type = WINDOW_PLAYLIST; /* GtkFixed hasn't got its GdkWindow, this means that it can be used to display widgets while the logo below will be displayed anyway; @@ -178,3 +261,16 @@ gtk_container_add(GTK_CONTAINER(widget), GTK_WIDGET(SKINNED_WINDOW(widget)->fixed)); return widget; } + +void ui_skinned_window_draw_all(GtkWidget *widget) { + if (SKINNED_WINDOW(widget)->type == WINDOW_MAIN) + mainwin_refresh_hints(); + + gtk_widget_queue_draw(widget); + GList *iter; + for (iter = GTK_FIXED (SKINNED_WINDOW(widget)->fixed)->children; iter; iter = g_list_next (iter)) { + GtkFixedChild *child_data = (GtkFixedChild *) iter->data; + GtkWidget *child = child_data->widget; + gtk_widget_queue_draw(child); + } +}