static VALUE rg_m_get_style(G_GNUC_UNUSED VALUE self, VALUE widget) { GtkStyle* style = gtk_rc_get_style(GTK_WIDGET(RVAL2GOBJ(widget))); GType gtype = G_OBJECT_TYPE(style); const gchar* name = G_OBJECT_TYPE_NAME(style); if (! rb_const_defined_at(mGtk, rb_intern(name))){ G_DEF_CLASS(gtype, (gchar*)name, mGtk); } return GOBJ2RVAL(gtk_rc_get_style(GTK_WIDGET(RVAL2GOBJ(widget)))); }
wxColor DrawingUtils::GetMenuBarBgColour() { #ifdef __WXGTK__ static bool intitialized(false); static wxColour textColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR)); if( !intitialized ) { // try to get the background colour from a menu GtkWidget *menuBar = gtk_menu_bar_new(); #ifdef __WXGTK3__ GdkRGBA col; GtkStyleContext* context = gtk_widget_get_style_context( menuBar ); gtk_style_context_get_background_color(context, GTK_STATE_FLAG_NORMAL, &col); textColour = wxColour(col); #else GtkStyle *def = gtk_rc_get_style( menuBar ); if(!def) def = gtk_widget_get_default_style(); if(def) { GdkColor col = def->bg[GTK_STATE_NORMAL]; textColour = wxColour(col); } #endif gtk_widget_destroy( menuBar ); intitialized = true; } return textColour; #else return wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR); #endif }
// static wxVisualAttributes wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* widget, bool useBase, int state) { GtkStyle* style; wxVisualAttributes attr; style = gtk_rc_get_style(widget); if (!style) style = gtk_widget_get_default_style(); if (!style) { return wxWindow::GetClassDefaultAttributes(wxWINDOW_VARIANT_NORMAL); } if (state == -1) state = GTK_STATE_NORMAL; // get the style's colours attr.colFg = wxColour(style->fg[state].red >> SHIFT, style->fg[state].green >> SHIFT, style->fg[state].blue >> SHIFT); if (useBase) attr.colBg = wxColour(style->base[state].red >> SHIFT, style->base[state].green >> SHIFT, style->base[state].blue >> SHIFT); else
wxColour Drawing::getPanelBGColour() { #ifdef __WXGTK__ static bool intitialized(false); static wxColour bgColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); if( !intitialized ) { // try to get the background colour from a menu GtkWidget* menu = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkStyle* def = gtk_rc_get_style( menu ); if(!def) def = gtk_widget_get_default_style(); if(def) { GdkColor col = def->bg[GTK_STATE_NORMAL]; bgColour = wxColour(col); } gtk_widget_destroy( menu ); intitialized = true; } return bgColour; #else return wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); #endif }
// this is also used from toolbar.cpp and tooltip.cpp, hence extern extern GdkFont *GtkGetDefaultGuiFont() { if (!g_systemDefaultGuiFont) { GtkWidget *widget = gtk_button_new(); GtkStyle *def = gtk_rc_get_style( widget ); if (def) { g_systemDefaultGuiFont = gdk_font_ref( def->font ); } else { def = gtk_widget_get_default_style(); if (def) g_systemDefaultGuiFont = gdk_font_ref( def->font ); } gtk_widget_destroy( widget ); } else { // already have it, but ref it once more before returning gdk_font_ref(g_systemDefaultGuiFont); } return g_systemDefaultGuiFont; }
wxColor DrawingUtils::GetTextCtrlTextColour() { #ifdef __WXGTK__ static bool intitialized(false); static wxColour textColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); if( !intitialized ) { // try to get the text colour from a textctrl GtkWidget *textCtrl = gtk_text_view_new(); #ifdef __WXGTK3__ GdkRGBA col; GtkStyleContext* context = gtk_widget_get_style_context( textCtrl ); gtk_style_context_get_color(context, GTK_STATE_FLAG_NORMAL, &col); textColour = wxColour(col); #else GtkStyle *def = gtk_rc_get_style( textCtrl ); if(!def) def = gtk_widget_get_default_style(); if(def) { GdkColor col = def->text[GTK_STATE_NORMAL]; textColour = wxColour(col); } #endif gtk_widget_destroy( textCtrl ); intitialized = true; } return textColour; #else return wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); #endif }
static gboolean _lib_ratings_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_ratings_t *d = (dt_lib_ratings_t *)self->data; if(!darktable.control->running) return TRUE; GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); int width = allocation.width, height = allocation.height; /* get current style */ GtkStyle *style = gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL, "GtkWidget", GTK_TYPE_WIDGET); if(!style) style = gtk_rc_get_style(widget); cairo_surface_t *cst = dt_cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); /* fill background */ cairo_set_source_rgb(cr, style->bg[0].red / 65535.0, style->bg[0].green / 65535.0, style->bg[0].blue / 65535.0); cairo_paint(cr); /* lets draw stars */ int x = 0; cairo_set_line_width(cr, 1.5); cairo_set_source_rgba(cr, style->fg[0].red / 65535.0, style->fg[0].green / 65535.0, style->fg[0].blue / 65535.0, 0.8); d->current = 0; for(int k = 0; k < 5; k++) { /* outline star */ dt_draw_star(cr, STAR_SIZE / 2.0 + x, STAR_SIZE / 2.0, STAR_SIZE / 2.0, STAR_SIZE / 4.0); if(x < d->pointerx) { cairo_fill_preserve(cr); cairo_set_source_rgba(cr, style->fg[0].red / 65535.0, style->fg[0].green / 65535.0, style->fg[0].blue / 65535.0, 0.5); cairo_stroke(cr); cairo_set_source_rgba(cr, style->fg[0].red / 65535.0, style->fg[0].green / 65535.0, style->fg[0].blue / 65535.0, 0.8); if((k + 1) > d->current) d->current = (k + 1); } else cairo_stroke(cr); x += STAR_SIZE + STAR_SPACING; } /* blit memsurface onto widget*/ cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface(cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }
// static wxVisualAttributes wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* widget, bool useBase, int state) { GtkStyle* style; wxVisualAttributes attr; style = gtk_rc_get_style(widget); if (!style) style = gtk_widget_get_default_style(); if (!style) { return wxWindow::GetClassDefaultAttributes(wxWINDOW_VARIANT_NORMAL); } if (state == -1) state = GTK_STATE_NORMAL; // get the style's colours attr.colFg = wxColour(style->fg[state]); if (useBase) attr.colBg = wxColour(style->base[state]); else attr.colBg = wxColour(style->bg[state]); // get the style's font if ( !style->font_desc ) style = gtk_widget_get_default_style(); if ( style && style->font_desc ) { wxNativeFontInfo info; info.description = pango_font_description_copy(style->font_desc); attr.font = wxFont(info); } else { GtkSettings *settings = gtk_settings_get_default(); gchar *font_name = NULL; g_object_get ( settings, "gtk-font-name", &font_name, NULL); if (!font_name) attr.font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); else attr.font = wxFont(wxString::FromAscii(font_name)); g_free (font_name); } return attr; }
wxFont wxSystemSettingsNative::GetFont( wxSystemFont index ) { wxFont font; switch (index) { case wxSYS_OEM_FIXED_FONT: case wxSYS_ANSI_FIXED_FONT: case wxSYS_SYSTEM_FIXED_FONT: font = *wxNORMAL_FONT; break; case wxSYS_ANSI_VAR_FONT: case wxSYS_SYSTEM_FONT: case wxSYS_DEVICE_DEFAULT_FONT: case wxSYS_DEFAULT_GUI_FONT: if (!gs_objects.m_fontSystem.Ok()) { GtkWidget *widget = gtk_button_new(); GtkStyle *def = gtk_rc_get_style( widget ); if ( !def || !def->font_desc ) def = gtk_widget_get_default_style(); if ( def && def->font_desc ) { wxNativeFontInfo info; info.description = pango_font_description_copy(def->font_desc); gs_objects.m_fontSystem = wxFont(info); } else { GtkSettings *settings = gtk_settings_get_default(); gchar *font_name = NULL; g_object_get ( settings, "gtk-font-name", &font_name, NULL); if (!font_name) gs_objects.m_fontSystem = wxFont( 12, wxSWISS, wxNORMAL, wxNORMAL ); else gs_objects.m_fontSystem = wxFont(wxString::FromAscii(font_name)); g_free (font_name); } gtk_object_sink((GtkObject*)widget); } font = gs_objects.m_fontSystem; break; default: break; } return font; }
static GtkStyle * get_ui_style (GtkWidget * win) { GtkStyle *style; TRACE ("entering get_ui_style"); style = gtk_rc_get_style (win); if (!style) { style = gtk_widget_get_style (win); } return (style); }
static gboolean _lib_darktable_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_darktable_t *d = (dt_lib_darktable_t *)self->data; /* get the current style */ GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkWidget", GTK_TYPE_WIDGET); if(!style) style = gtk_rc_get_style(widget); cairo_t *cr = gdk_cairo_create(widget->window); /* fill background */ cairo_set_source_rgb(cr, style->bg[0].red/65535.0, style->bg[0].green/65535.0, style->bg[0].blue/65535.0); cairo_paint(cr); /* paint icon image */ cairo_set_source_surface(cr, d->image, 0, 7); cairo_rectangle(cr,0,0,48,48); cairo_fill(cr); /* create a pango layout and print fancy name/version string */ PangoLayout *layout; layout = gtk_widget_create_pango_layout (widget,NULL); pango_font_description_set_weight (style->font_desc, PANGO_WEIGHT_BOLD); pango_font_description_set_absolute_size (style->font_desc, 25 * PANGO_SCALE); pango_layout_set_font_description (layout,style->font_desc); pango_layout_set_text (layout,PACKAGE_NAME,-1); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.5); cairo_move_to (cr, 42.0, 5.0); pango_cairo_show_layout (cr, layout); /* print version */ pango_font_description_set_absolute_size (style->font_desc, 10 * PANGO_SCALE); pango_layout_set_font_description (layout,style->font_desc); pango_layout_set_text (layout,PACKAGE_VERSION,-1); cairo_move_to (cr, 44.0, 30.0); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.3); pango_cairo_show_layout (cr, layout); /* cleanup */ g_object_unref (layout); cairo_destroy(cr); return TRUE; }
int main (int argc, char **argv) { GtkWidget *win; GtkStyle *style = 0; gtk_set_locale(); gtk_init (&argc, &argv); win = gtk_window_new (GTK_WINDOW_TOPLEVEL); style = gtk_rc_get_style (win); if (style == 0) style = gtk_widget_get_style (win); if (style != 0) { if (style->rc_style != 0) print_rc_style (style->rc_style, style); else print_style (style); } return 0; }
GdkGC * getUIStyle_gc (GtkWidget * win, const gchar * name, const gchar * state) { GtkStyle *style; TRACE ("entering getUIStyle_gc"); g_return_val_if_fail (win != NULL, NULL); g_return_val_if_fail (GTK_IS_WIDGET (win), NULL); g_return_val_if_fail (GTK_WIDGET_REALIZED (win), NULL); style = gtk_rc_get_style (win); if (!style) { style = gtk_widget_get_style (win); } if (!style) { style = gtk_widget_get_default_style (); } return (_getUIStyle_gc (name, state, style)); }
static gboolean _lib_navigation_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { const int inset = DT_NAVIGATION_INSET; int width = widget->allocation.width, height = widget->allocation.height; dt_develop_t *dev = darktable.develop; if (dev->preview_dirty) return FALSE; /* get the current style */ GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkWidget", GTK_TYPE_WIDGET); if(!style) style = gtk_rc_get_style(widget); cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); /* fill background */ cairo_set_source_rgb(cr, style->bg[0].red/65535.0, style->bg[0].green/65535.0, style->bg[0].blue/65535.0); cairo_paint(cr); width -= 2*inset; height -= 2*inset; cairo_translate(cr, inset, inset); /* draw navigation image if available */ if(dev->preview_pipe->backbuf && !dev->preview_dirty) { dt_pthread_mutex_t *mutex = &dev->preview_pipe->backbuf_mutex; dt_pthread_mutex_lock(mutex); const int wd = dev->preview_pipe->backbuf_width; const int ht = dev->preview_pipe->backbuf_height; const float scale = fminf(width/(float)wd, height/(float)ht); const int stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, wd); cairo_surface_t *surface = cairo_image_surface_create_for_data (dev->preview_pipe->backbuf, CAIRO_FORMAT_RGB24, wd, ht, stride); cairo_translate(cr, width/2.0, height/2.0f); cairo_scale(cr, scale, scale); cairo_translate(cr, -.5f*wd, -.5f*ht); // draw shadow around float alpha = 1.0f; for(int k=0; k<4; k++) { cairo_rectangle(cr, -k/scale, -k/scale, wd + 2*k/scale, ht + 2*k/scale); cairo_set_source_rgba(cr, 0, 0, 0, alpha); alpha *= 0.6f; cairo_fill(cr); } cairo_rectangle(cr, 0, 0, wd-2, ht-1); cairo_set_source_surface (cr, surface, 0, 0); cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_FAST); cairo_fill(cr); cairo_surface_destroy (surface); dt_pthread_mutex_unlock(mutex); // draw box where we are dt_dev_zoom_t zoom; int closeup; float zoom_x, zoom_y; DT_CTL_GET_GLOBAL(zoom, dev_zoom); DT_CTL_GET_GLOBAL(closeup, dev_closeup); DT_CTL_GET_GLOBAL(zoom_x, dev_zoom_x); DT_CTL_GET_GLOBAL(zoom_y, dev_zoom_y); const float min_scale = dt_dev_get_zoom_scale(dev, DT_ZOOM_FIT, closeup ? 2.0 : 1.0, 0); const float cur_scale = dt_dev_get_zoom_scale(dev, zoom, closeup ? 2.0 : 1.0, 0); // avoid numerical instability for small resolutions: if(cur_scale > min_scale+0.001) { float boxw = 1, boxh = 1; dt_dev_check_zoom_bounds(darktable.develop, &zoom_x, &zoom_y, zoom, closeup, &boxw, &boxh); cairo_translate(cr, wd*(.5f+zoom_x), ht*(.5f+zoom_y)); cairo_set_source_rgb(cr, 0., 0., 0.); cairo_set_line_width(cr, 1.f/scale); boxw *= wd; boxh *= ht; cairo_rectangle(cr, -boxw/2-1, -boxh/2-1, boxw+2, boxh+2); cairo_stroke(cr); cairo_set_source_rgb(cr, 1., 1., 1.); cairo_rectangle(cr, -boxw/2, -boxh/2, boxw, boxh); cairo_stroke(cr); } } /* blit memsurface into widget */ cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface (cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }
/** * gpm_applet_draw_cb: * @applet: Brightness applet instance * * draws applet content (background + icon) **/ static gboolean gpm_applet_draw_cb (GpmBrightnessApplet *applet) { gint w, h, bg_type; #if GTK_CHECK_VERSION (3, 0, 0) GdkRGBA color; cairo_t *cr; cairo_pattern_t *pattern; GtkStyleContext *context; #else GdkColor color; GdkGC *gc; GdkPixmap *background; #endif GtkAllocation allocation; if (gtk_widget_get_window (GTK_WIDGET(applet)) == NULL) { return FALSE; } /* retrieve applet size */ gpm_applet_get_icon (applet); gpm_applet_check_size (applet); if (applet->size <= 2) { return FALSE; } /* if no icon, then don't try to display */ if (applet->icon == NULL) { return FALSE; } gtk_widget_get_allocation (GTK_WIDGET (applet), &allocation); w = allocation.width; h = allocation.height; #if GTK_CHECK_VERSION (3, 0, 0) cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET(applet))); #else gc = gdk_gc_new (gtk_widget_get_window (GTK_WIDGET(applet))); #endif /* draw pixmap background */ #if GTK_CHECK_VERSION (3, 0, 0) bg_type = mate_panel_applet_get_background (MATE_PANEL_APPLET (applet), &color, &pattern); #else bg_type = mate_panel_applet_get_background (MATE_PANEL_APPLET (applet), &color, &background); #endif if (bg_type == PANEL_PIXMAP_BACKGROUND && !applet->popped) { /* fill with given background pixmap */ #if GTK_CHECK_VERSION (3, 0, 0) cairo_set_source (cr, pattern); cairo_rectangle (cr, 0, 0, w, h); cairo_fill (cr); #else gdk_draw_drawable (gtk_widget_get_window (GTK_WIDGET(applet)), gc, background, 0, 0, 0, 0, w, h); #endif } /* draw color background */ if (bg_type == PANEL_COLOR_BACKGROUND && !applet->popped) { #if GTK_CHECK_VERSION (3, 0, 0) gdk_cairo_set_source_rgba (cr, &color); cairo_rectangle (cr, 0, 0, w, h); cairo_fill (cr); #else gdk_gc_set_rgb_fg_color (gc,&color); gdk_gc_set_fill (gc,GDK_SOLID); gdk_draw_rectangle (gtk_widget_get_window (GTK_WIDGET(applet)), gc, TRUE, 0, 0, w, h); #endif } /* fill with selected color if popped */ if (applet->popped) { #if GTK_CHECK_VERSION (3, 0, 0) context = gtk_widget_get_style_context (GTK_WIDGET(applet)); gtk_style_context_get_color (context, GTK_STATE_FLAG_SELECTED, &color); gdk_cairo_set_source_rgba (cr, &color); cairo_rectangle (cr, 0, 0, w, h); cairo_fill (cr); #else color = gtk_rc_get_style (GTK_WIDGET(applet))->bg[GTK_STATE_SELECTED]; gdk_gc_set_rgb_fg_color (gc,&color); gdk_gc_set_fill (gc,GDK_SOLID); gdk_draw_rectangle (gtk_widget_get_window (GTK_WIDGET(applet)), gc, TRUE, 0, 0, w, h); #endif } /* draw icon at center */ #if GTK_CHECK_VERSION (3, 0, 0) gdk_cairo_set_source_pixbuf (cr, applet->icon, (w - applet->icon_width)/2, (h - applet->icon_height)/2); cairo_paint (cr); #else gdk_draw_pixbuf (gtk_widget_get_window (GTK_WIDGET(applet)), gc, applet->icon, 0, 0, (w - applet->icon_width)/2, (h - applet->icon_height)/2, applet->icon_width, applet->icon_height, GDK_RGB_DITHER_NONE, 0, 0); #endif #if GTK_CHECK_VERSION (3, 0, 0) cairo_destroy (cr); #else g_object_unref (gc); #endif return TRUE; }
// static wxVisualAttributes wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* widget, bool WXUNUSED_IN_GTK3(useBase), int state) { wxVisualAttributes attr; GtkWidget* tlw = NULL; if (gtk_widget_get_parent(widget) == NULL) { tlw = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(GTK_CONTAINER(tlw), widget); } #ifdef __WXGTK3__ GtkStateFlags stateFlag = GTK_STATE_FLAG_NORMAL; if (state) { wxASSERT(state == GTK_STATE_ACTIVE); stateFlag = GTK_STATE_FLAG_ACTIVE; } GtkStyleContext* sc = gtk_widget_get_style_context(widget); GdkRGBA c; gtk_style_context_get_color(sc, stateFlag, &c); attr.colFg = wxColour(c); gtk_style_context_get_background_color(sc, stateFlag, &c); attr.colBg = wxColour(c); wxNativeFontInfo info; gtk_style_context_get( sc, stateFlag, GTK_STYLE_PROPERTY_FONT, &info.description, NULL); attr.font = wxFont(info); #else GtkStyle* style; style = gtk_rc_get_style(widget); if (!style) style = gtk_widget_get_default_style(); if (style) { // get the style's colours attr.colFg = wxColour(style->fg[state]); if (useBase) attr.colBg = wxColour(style->base[state]); else attr.colBg = wxColour(style->bg[state]); // get the style's font if (!style->font_desc) style = gtk_widget_get_default_style(); if (style && style->font_desc) { wxNativeFontInfo info; info.description = style->font_desc; attr.font = wxFont(info); info.description = NULL; } } else attr = wxWindow::GetClassDefaultAttributes(wxWINDOW_VARIANT_NORMAL); #endif if (!attr.font.IsOk()) { GtkSettings *settings = gtk_settings_get_default(); gchar *font_name = NULL; g_object_get ( settings, "gtk-font-name", &font_name, NULL); if (!font_name) attr.font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); else { attr.font = wxFont(wxString::FromUTF8(font_name)); g_free(font_name); } } if (tlw) gtk_widget_destroy(tlw); return attr; }
// wxSystemSettings::GetColour() helper: get the colours from a GTK+ // widget style, return true if we did get them, false to use defaults static bool GetColourFromGTKWidget(int& red, int& green, int& blue, wxGtkWidgetType type = wxGTK_BUTTON, GtkStateType state = GTK_STATE_NORMAL, wxGtkColourType colour = wxGTK_BG) { GtkWidget *widget; switch ( type ) { default: wxFAIL_MSG( wxT("unexpected GTK widget type") ); // fall through case wxGTK_BUTTON: widget = gtk_button_new(); break; case wxGTK_LIST: widget = gtk_list_new(); break; case wxGTK_MENUITEM: widget = gtk_menu_item_new(); } GtkStyle *def = gtk_rc_get_style( widget ); if ( !def ) def = gtk_widget_get_default_style(); bool ok; if ( def ) { GdkColor *col; switch ( colour ) { default: wxFAIL_MSG( wxT("unexpected GTK colour type") ); // fall through case wxGTK_FG: col = def->fg; break; case wxGTK_BG: col = def->bg; break; case wxGTK_BASE: col = def->base; break; } red = col[state].red; green = col[state].green; blue = col[state].blue; ok = true; } else { ok = false; } gtk_widget_destroy( widget ); return ok; }
static gboolean _lib_histogram_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_histogram_t *d = (dt_lib_histogram_t *)self->data; dt_develop_t *dev = darktable.develop; float *hist = dev->histogram; float hist_max = dev->histogram_max; const int inset = DT_HIST_INSET; int width = widget->allocation.width, height = widget->allocation.height; cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkWidget", GTK_TYPE_WIDGET); if(!style) style = gtk_rc_get_style(widget); cairo_set_source_rgb(cr, style->bg[0].red/65535.0, style->bg[0].green/65535.0, style->bg[0].blue/65535.0); cairo_paint(cr); cairo_translate(cr, 4*inset, inset); width -= 2*4*inset; height -= 2*inset; #if 1 // draw shadow around float alpha = 1.0f; cairo_set_line_width(cr, 0.2); for(int k=0; k<inset; k++) { cairo_rectangle(cr, -k, -k, width + 2*k, height + 2*k); cairo_set_source_rgba(cr, 0, 0, 0, alpha); alpha *= 0.5f; cairo_fill(cr); } cairo_set_line_width(cr, 1.0); #else cairo_set_line_width(cr, 1.0); cairo_set_source_rgb (cr, .1, .1, .1); cairo_rectangle(cr, 0, 0, width, height); cairo_stroke(cr); #endif cairo_rectangle(cr, 0, 0, width, height); cairo_clip(cr); cairo_set_source_rgb (cr, .3, .3, .3); cairo_rectangle(cr, 0, 0, width, height); cairo_fill(cr); if(d->highlight == 1) { cairo_set_source_rgb (cr, .5, .5, .5); cairo_rectangle(cr, 0, 0, .2*width, height); cairo_fill(cr); } else if(d->highlight == 2) { cairo_set_source_rgb (cr, .5, .5, .5); cairo_rectangle(cr, 0.2*width, 0, width, height); cairo_fill(cr); } // draw grid cairo_set_line_width(cr, .4); cairo_set_source_rgb (cr, .1, .1, .1); dt_draw_grid(cr, 4, 0, 0, width, height); if(hist_max > 0) { cairo_save(cr); // cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); cairo_translate(cr, 0, height); cairo_scale(cr, width/63.0, -(height-10)/hist_max); cairo_set_operator(cr, CAIRO_OPERATOR_ADD); // cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_line_width(cr, 1.); cairo_set_source_rgba(cr, 1., 0., 0., 0.2); dt_draw_histogram_8(cr, hist, 0); cairo_set_source_rgba(cr, 0., 1., 0., 0.2); dt_draw_histogram_8(cr, hist, 1); cairo_set_source_rgba(cr, 0., 0., 1., 0.2); dt_draw_histogram_8(cr, hist, 2); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); cairo_restore(cr); } cairo_set_source_rgb(cr, .25, .25, .25); cairo_select_font_face (cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, .1*height); char exifline[50]; cairo_move_to (cr, .02*width, .98*height); dt_image_print_exif(&dev->image_storage, exifline, 50); cairo_show_text(cr, exifline); /*cairo_text_path(cr, exifline); cairo_fill_preserve(cr); cairo_set_line_width(cr, 1.0); cairo_set_source_rgb(cr, 0.3, 0.3, 0.3); cairo_stroke(cr);*/ cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface (cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }
static void gnc_html_webkit_init( GncHtmlWebkit* self ) { GncHtmlWebkitPrivate* priv; GncHtmlWebkitPrivate* new_priv; WebKitWebSettings* webkit_settings = NULL; const char* default_font_family = NULL; new_priv = g_realloc( GNC_HTML(self)->priv, sizeof(GncHtmlWebkitPrivate) ); priv = self->priv = new_priv; GNC_HTML(self)->priv = (GncHtmlPrivate*)priv; priv->html_string = NULL; priv->web_view = WEBKIT_WEB_VIEW(webkit_web_view_new()); /* Get the default font family from GtkStyle of a GtkWidget(priv-web_view). */ default_font_family = pango_font_description_get_family( gtk_rc_get_style(GTK_WIDGET(priv->web_view))->font_desc ); /* Set default webkit settings */ webkit_settings = webkit_web_view_get_settings (priv->web_view); g_object_set (G_OBJECT(webkit_settings), "default-encoding", "utf-8", NULL); if (default_font_family == NULL) { PWARN("webkit_settings: Cannot get default font family."); } else { g_object_set (G_OBJECT(webkit_settings), "default-font-family", default_font_family, NULL); PINFO("webkit_settings: Set default font to [%s]", default_font_family); } gtk_container_add( GTK_CONTAINER(priv->base.container), GTK_WIDGET(priv->web_view) ); g_object_ref_sink( priv->base.container ); /* signals */ g_signal_connect( priv->web_view, "navigation-requested", G_CALLBACK(webkit_navigation_requested_cb), self); g_signal_connect( priv->web_view, "hovering-over-link", G_CALLBACK(webkit_on_url_cb), self ); #if 0 g_signal_connect( priv->html, "set_base", G_CALLBACK(gnc_html_set_base_cb), self); g_signal_connect(priv->html, "link_clicked", G_CALLBACK(gnc_html_link_clicked_cb), self); g_signal_connect (priv->html, "object_requested", G_CALLBACK (gnc_html_object_requested_cb), self); g_signal_connect (priv->html, "button_press_event", G_CALLBACK (gnc_html_button_press_cb), self); g_signal_connect (priv->html, "submit", G_CALLBACK(gnc_html_submit_cb), self); #endif LEAVE("retval %p", self); }
static gboolean _gradient_slider_expose(GtkWidget *widget, GdkEventExpose *event) { GtkDarktableGradientSlider *gslider=DTGTK_GRADIENT_SLIDER(widget); assert(gslider->position > 0); g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(DTGTK_IS_GRADIENT_SLIDER(widget), FALSE); g_return_val_if_fail(event != NULL, FALSE); GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkButton", GTK_TYPE_BUTTON); if(!style) style = gtk_rc_get_style(widget); int state = gtk_widget_get_state(widget); /*int x = widget->allocation.x; int y = widget->allocation.y;*/ int width = widget->allocation.width; int height = widget->allocation.height; int margins = gslider->margins; // Begin cairo drawing cairo_t *cr; cr = gdk_cairo_create(widget->window); // First build the cairo gradient and then fill the gradient float gheight=height/2.0; float gwidth=width-2*margins; GList *current=NULL; cairo_pattern_t *gradient=NULL; if((current=g_list_first(gslider->colors)) != NULL) { gradient=cairo_pattern_create_linear(0,0,gwidth,gheight); do { _gradient_slider_stop_t *stop=(_gradient_slider_stop_t *)current->data; cairo_pattern_add_color_stop_rgb(gradient,stop->position,stop->color.red/65535.0,stop->color.green/65535.0,stop->color.blue/65535.0); } while((current=g_list_next(current))!=NULL); } if(gradient!=NULL) // Do we got a gradient, lets draw it { cairo_set_line_width(cr,0.1); cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); cairo_set_source(cr,gradient); cairo_rectangle(cr,margins,(height-gheight)/2.0,gwidth,gheight); cairo_fill(cr); cairo_stroke(cr); } // Lets draw position arrows cairo_set_source_rgba(cr, style->fg[state].red/65535.0, style->fg[state].green/65535.0, style->fg[state].blue/65535.0, 1.0 ); // do we have a picker value to draw? gdouble *picker = gslider->picker; if(picker[0] >= 0.0 && picker[0] <= 1.0) { int vx_min=_scale_to_screen(widget, picker[1]); int vx_max=_scale_to_screen(widget, picker[2]); int vx_avg=_scale_to_screen(widget, picker[0]); cairo_set_source_rgba(cr, style->fg[state].red/65535.0, style->fg[state].green/65535.0, style->fg[state].blue/65535.0, 0.33 ); cairo_rectangle(cr,vx_min,(height-gheight)/2.0,fmax((float)vx_max-vx_min, 0.0f),gheight); cairo_fill(cr); cairo_set_source_rgba(cr, style->fg[state].red/65535.0, style->fg[state].green/65535.0, style->fg[state].blue/65535.0, 1.0 ); cairo_move_to(cr,vx_avg,(height-gheight)/2.0); cairo_line_to(cr,vx_avg,(height+gheight)/2.0); cairo_set_antialias(cr,CAIRO_ANTIALIAS_NONE); cairo_set_line_width(cr,1.0); cairo_stroke(cr); } int indirect[GRADIENT_SLIDER_MAX_POSITIONS]; for(int k=0; k<gslider->positions; k++) indirect[k] = gslider->selected == -1 ? k : (gslider->selected + 1 + k) % gslider->positions; for(int k=0; k<gslider->positions; k++) { int l = indirect[k]; int vx=_scale_to_screen(widget, gslider->position[l]); int mk=gslider->marker[l]; int sz=(mk & (1<<3)) ? 13 : 10; // big or small marker? if(l == gslider->selected && (gslider->is_entered == TRUE || gslider->is_dragging == TRUE)) { cairo_set_source_rgba(cr, style->fg[state].red/65535.0, style->fg[state].green/65535.0, style->fg[state].blue/65535.0 * 0.5, 1.0 ); } else { cairo_set_source_rgba(cr, style->fg[state].red/65535.0*0.8, style->fg[state].green/65535.0*0.8, style->fg[state].blue/65535.0*0.8, 1.0 ); } #if 0 if(sz < 10) { // supporting line for small markers cairo_move_to(cr,vx,2); cairo_line_to(cr,vx,height-2); cairo_set_antialias(cr,CAIRO_ANTIALIAS_NONE); cairo_set_line_width(cr,1.0); cairo_stroke(cr); } #endif cairo_set_antialias(cr,CAIRO_ANTIALIAS_DEFAULT); if(mk & 0x04) /* upper arrow */ { if (mk & 0x01) /* filled */ dtgtk_cairo_paint_solid_triangle(cr, vx-sz/2, sz < 10 ? 1 : -2,sz,sz,CPF_DIRECTION_DOWN); else dtgtk_cairo_paint_triangle(cr, vx-sz/2, sz < 10 ? 1 : -2,sz,sz,CPF_DIRECTION_DOWN); } if(mk & 0x02) /* lower arrow */ { if (mk & 0x01) /* filled */ dtgtk_cairo_paint_solid_triangle(cr, vx-sz/2,sz < 10 ? height-6 : height-11,sz,sz,CPF_DIRECTION_UP); else dtgtk_cairo_paint_triangle(cr, vx-sz/2,sz < 10 ? height-6 : height-11,sz,sz,CPF_DIRECTION_UP); } } cairo_destroy(cr); return FALSE; }
static gboolean _slider_expose(GtkWidget *widget, GdkEventExpose *event) { g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(DTGTK_IS_SLIDER(widget), FALSE); g_return_val_if_fail(event != NULL, FALSE); GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); if (allocation.width<=1) return FALSE; GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkButton", GTK_TYPE_BUTTON); if(!style) style = gtk_rc_get_style(widget); GtkDarktableSlider *slider=DTGTK_SLIDER(widget); int state = gtk_widget_get_state(widget); int width = allocation.width; int height = allocation.height; /* get value fill rectangle constraints*/ GdkRectangle vr; _slider_get_value_area(widget,&vr); /* create cairo context */ cairo_t *cr; cr = gdk_cairo_create(gtk_widget_get_window(widget)); /* hardcode state for the rest of control */ state = GTK_STATE_NORMAL; /* fill value rect */ gfloat value = gtk_adjustment_get_value(slider->adjustment); /* convert scale value to range 0.0-1.0*/ gfloat vscale = (value - gtk_adjustment_get_lower(slider->adjustment)) / (gtk_adjustment_get_upper(slider->adjustment) - gtk_adjustment_get_lower(slider->adjustment) ); cairo_set_source_rgba(cr, (style->fg[state].red/65535.0)*1.7, (style->fg[state].green/65535.0)*1.7, (style->fg[state].blue/65535.0)*1.7, 0.2 ); _slider_draw_rounded_rect(cr,vr.x,vr.y,vr.width*vscale,vr.height,3,1); /* setup font using family from style */ const gchar *font_family = pango_font_description_get_family(style->font_desc); cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_text_extents_t ext; /* Draw label */ cairo_set_source_rgba(cr, (style->text[state].red/65535.0)*1.7, (style->text[state].green/65535.0)*1.7, (style->text[state].blue/65535.0)*1.7, 0.8); gchar *label = (gchar *)g_object_get_data(G_OBJECT(widget),DTGTK_SLIDER_LABEL_KEY); if (label) { cairo_set_font_size(cr,vr.height*0.5); cairo_text_extents(cr, "j`", &ext); cairo_move_to(cr, vr.x+(DTGTK_SLIDER_BORDER_WIDTH*2),vr.y+ext.height); cairo_show_text(cr, label); /* store the size of the label. doing it in dtgtk_slider_set_label doesn't work as the widget isn't created yet. */ if(slider->labelwidth == 0 && slider->labelheight == 0) { cairo_text_extents(cr, label, &ext); slider->labelwidth = vr.x+(DTGTK_SLIDER_BORDER_WIDTH*2)+ext.width+(DTGTK_SLIDER_BORDER_WIDTH*2); slider->labelheight = vr.y+ext.height+(DTGTK_SLIDER_BORDER_WIDTH*2); } } /* Draw value unit */ gchar *unit = (gchar *)g_object_get_data (G_OBJECT(slider),DTGTK_SLIDER_VALUE_UNIT_KEY); cairo_set_font_size(cr,vr.height*0.45); cairo_text_extents(cr, "%%", &ext); int unitwidth = ext.width; if(unit) { cairo_move_to(cr, vr.x+vr.width-ext.width - (DTGTK_SLIDER_BORDER_WIDTH) ,vr.y+vr.height-(DTGTK_SLIDER_BORDER_WIDTH*2)); cairo_show_text(cr, unit); } /* Draw text value */ cairo_select_font_face (cr, font_family, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); char sv[32]= {0}; if (slider->force_sign) sprintf(sv,"%+.*f",slider->digits,value); else sprintf(sv,"%.*f",slider->digits,value); cairo_set_font_size(cr,vr.height*0.5); cairo_text_extents(cr, sv, &ext); cairo_move_to(cr, vr.x+vr.width-ext.width - unitwidth -(DTGTK_SLIDER_BORDER_WIDTH*3) ,vr.y+vr.height-(DTGTK_SLIDER_BORDER_WIDTH*2)); cairo_show_text(cr, sv); /* draw up/down arrows */ dtgtk_cairo_paint_arrow(cr, width-DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-DTGTK_SLIDER_BORDER_WIDTH, DTGTK_SLIDER_BORDER_WIDTH*2, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-4, CPF_DIRECTION_UP); dtgtk_cairo_paint_arrow(cr, width-DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-DTGTK_SLIDER_BORDER_WIDTH, height-DTGTK_SLIDER_ADJUST_BUTTON_WIDTH+4-DTGTK_SLIDER_BORDER_WIDTH*2, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH, DTGTK_SLIDER_ADJUST_BUTTON_WIDTH-4, CPF_DIRECTION_DOWN); cairo_destroy(cr); return TRUE; }
static gboolean _lib_histogram_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_histogram_t *d = (dt_lib_histogram_t *)self->data; dt_develop_t *dev = darktable.develop; float *hist = dev->histogram; float hist_max = dev->histogram_type == DT_DEV_HISTOGRAM_LINEAR?dev->histogram_max:logf(1.0 + dev->histogram_max); const int inset = DT_HIST_INSET; int width = widget->allocation.width, height = widget->allocation.height; cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkWidget", GTK_TYPE_WIDGET); if(!style) style = gtk_rc_get_style(widget); cairo_set_source_rgb(cr, style->bg[0].red/65535.0, style->bg[0].green/65535.0, style->bg[0].blue/65535.0); cairo_paint(cr); cairo_translate(cr, 4*inset, inset); width -= 2*4*inset; height -= 2*inset; if(d->mode_x == 0) { d->color_w = 0.06*width; d->button_spacing = 0.01*width; d->button_h = 0.06*width; d->button_y = d->button_spacing; d->mode_w = d->color_w; d->mode_x = width - 3*(d->color_w+d->button_spacing) - (d->mode_w+d->button_spacing); d->red_x = width - 3*(d->color_w+d->button_spacing); d->green_x = width - 2*(d->color_w+d->button_spacing); d->blue_x = width - (d->color_w+d->button_spacing); } // TODO: probably this should move to the configure-event callback! That would be future proof if we ever (again) allow to resize the side panels. const gint stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); // this code assumes that the first expose comes before the first (preview) pipe is processed and that the size of the widget doesn't change! if(dev->histogram_waveform_width == 0) { dev->histogram_waveform = (uint32_t*)calloc(height * stride / 4, sizeof(uint32_t)); dev->histogram_waveform_stride = stride; dev->histogram_waveform_height = height; dev->histogram_waveform_width = width; // return TRUE; // there are enough expose events following ... } #if 1 // draw shadow around float alpha = 1.0f; cairo_set_line_width(cr, 0.2); for(int k=0; k<inset; k++) { cairo_rectangle(cr, -k, -k, width + 2*k, height + 2*k); cairo_set_source_rgba(cr, 0, 0, 0, alpha); alpha *= 0.5f; cairo_fill(cr); } cairo_set_line_width(cr, 1.0); #else cairo_set_line_width(cr, 1.0); cairo_set_source_rgb (cr, .1, .1, .1); cairo_rectangle(cr, 0, 0, width, height); cairo_stroke(cr); #endif cairo_rectangle(cr, 0, 0, width, height); cairo_clip(cr); cairo_set_source_rgb (cr, .3, .3, .3); cairo_rectangle(cr, 0, 0, width, height); cairo_fill(cr); if(d->highlight == 1) { cairo_set_source_rgb (cr, .5, .5, .5); cairo_rectangle(cr, 0, 0, .2*width, height); cairo_fill(cr); } else if(d->highlight == 2) { cairo_set_source_rgb (cr, .5, .5, .5); cairo_rectangle(cr, 0.2*width, 0, width, height); cairo_fill(cr); } // draw grid cairo_set_line_width(cr, .4); cairo_set_source_rgb (cr, .1, .1, .1); if(dev->histogram_type == DT_DEV_HISTOGRAM_WAVEFORM) dt_draw_waveform_lines(cr, 0, 0, width, height); else dt_draw_grid(cr, 4, 0, 0, width, height); if(hist_max > 0) { cairo_save(cr); if(dev->histogram_type == DT_DEV_HISTOGRAM_WAVEFORM) { // make the color channel selector work: uint8_t *buf = (uint8_t*)malloc(sizeof(uint8_t) * height * stride); uint8_t mask[3] = {d->blue, d->green, d->red}; memcpy(buf, dev->histogram_waveform, sizeof(uint8_t) * height * stride); for(int y = 0; y < height; y++) for(int x = 0; x < width; x++) for(int k = 0; k < 3; k++) { buf[y * stride + x * 4 + k] *= mask[k]; } cairo_surface_t *source = cairo_image_surface_create_for_data(buf, CAIRO_FORMAT_ARGB32, width, height, stride); cairo_set_source_surface(cr, source, 0.0, 0.0); cairo_set_operator(cr, CAIRO_OPERATOR_ADD); cairo_paint(cr); cairo_surface_destroy(source); free(buf); } else { // cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); cairo_translate(cr, 0, height); cairo_scale(cr, width/63.0, -(height-10)/hist_max); cairo_set_operator(cr, CAIRO_OPERATOR_ADD); // cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_line_width(cr, 1.); if(d->red) { cairo_set_source_rgba(cr, 1., 0., 0., 0.2); dt_draw_histogram_8(cr, hist, 0, dev->histogram_type); } if(d->green) { cairo_set_source_rgba(cr, 0., 1., 0., 0.2); dt_draw_histogram_8(cr, hist, 1, dev->histogram_type); } if(d->blue) { cairo_set_source_rgba(cr, 0., 0., 1., 0.2); dt_draw_histogram_8(cr, hist, 2, dev->histogram_type); } cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); // cairo_set_antialias(cr, CAIRO_ANTIALIAS_DEFAULT); } cairo_restore(cr); } cairo_set_source_rgb(cr, .25, .25, .25); cairo_select_font_face (cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, .1*height); char exifline[50]; cairo_move_to (cr, .02*width, .98*height); dt_image_print_exif(&dev->image_storage, exifline, 50); cairo_save(cr); // cairo_show_text(cr, exifline); cairo_set_line_width(cr, 2.0); cairo_set_source_rgba(cr, 1, 1, 1, 0.3); cairo_text_path(cr, exifline); cairo_stroke_preserve(cr); cairo_set_source_rgb(cr, .25, .25, .25); cairo_fill(cr); cairo_restore(cr); // buttons to control the display of the histogram: linear/log, r, g, b if(d->highlight != 0) { _draw_mode_toggle(cr, d->mode_x, d->button_y, d->mode_w, d->button_h, dev->histogram_type); cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.4); _draw_color_toggle(cr, d->red_x, d->button_y, d->color_w, d->button_h, d->red); cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 0.4); _draw_color_toggle(cr, d->green_x, d->button_y, d->color_w, d->button_h, d->green); cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 0.4); _draw_color_toggle(cr, d->blue_x, d->button_y, d->color_w, d->button_h, d->blue); } cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface (cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }
// static wxVisualAttributes wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* widget, bool WXUNUSED_IN_GTK3(useBase), int state) { wxVisualAttributes attr; #ifdef __WXGTK3__ GtkStateFlags stateFlag = GTK_STATE_FLAG_NORMAL; if (state) { wxASSERT(state == GTK_STATE_ACTIVE); stateFlag = GTK_STATE_FLAG_ACTIVE; } GtkStyleContext* sc = gtk_widget_get_style_context(widget); GdkRGBA c; gtk_style_context_get_color(sc, stateFlag, &c); attr.colFg = wxColour(c); gtk_style_context_get_background_color(sc, stateFlag, &c); attr.colBg = wxColour(c); wxNativeFontInfo info; info.description = const_cast<PangoFontDescription*>(gtk_style_context_get_font(sc, stateFlag)); attr.font = wxFont(info); info.description = NULL; #else GtkStyle* style; style = gtk_rc_get_style(widget); if (!style) style = gtk_widget_get_default_style(); if (!style) { return wxWindow::GetClassDefaultAttributes(wxWINDOW_VARIANT_NORMAL); } // get the style's colours attr.colFg = wxColour(style->fg[state]); if (useBase) attr.colBg = wxColour(style->base[state]); else attr.colBg = wxColour(style->bg[state]); // get the style's font if ( !style->font_desc ) style = gtk_widget_get_default_style(); if ( style && style->font_desc ) { wxNativeFontInfo info; info.description = style->font_desc; attr.font = wxFont(info); info.description = NULL; } #endif if (!attr.font.IsOk()) { GtkSettings *settings = gtk_settings_get_default(); gchar *font_name = NULL; g_object_get ( settings, "gtk-font-name", &font_name, NULL); if (!font_name) attr.font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); else attr.font = wxFont(wxString::FromAscii(font_name)); g_free (font_name); } return attr; }
static gboolean _label_expose(GtkWidget *widget, GdkEventExpose *event) { g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(DTGTK_IS_LABEL(widget), FALSE); g_return_val_if_fail(event != NULL, FALSE); GtkStyle *style=gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL,"GtkButton", GTK_TYPE_BUTTON); if(!style) style = gtk_rc_get_style(widget); // uninitialized? if(style->depth == -1) return FALSE; int state = gtk_widget_get_state(widget); GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); int x = allocation.x; int y = allocation.y; int width = allocation.width; int height = allocation.height; // Formating the display of text and draw it... PangoLayout *layout; layout = gtk_widget_create_pango_layout(widget,NULL); pango_layout_set_font_description(layout,style->font_desc); const gchar *text=gtk_label_get_text(GTK_LABEL(widget)); pango_layout_set_text(layout,text,-1); GdkRectangle t= {x,y,x+width,y+height}; int pw,ph; pango_layout_get_pixel_size(layout,&pw,&ph); // Begin cairo drawing cairo_t *cr; cr = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_rgba(cr, /* style->fg[state].red/65535.0, style->fg[state].green/65535.0, style->fg[state].blue/65535.0,*/ 1,1,1, 0.10 ); cairo_set_antialias(cr,CAIRO_ANTIALIAS_NONE); cairo_set_line_width(cr,1.0); cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND); if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_UNDERLINED ) { cairo_move_to(cr,x,y+height-2); cairo_line_to(cr,x+width,y+height-2); cairo_stroke(cr); } else if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_BACKFILLED ) { cairo_rectangle(cr,x,y,width,height); cairo_fill(cr); } else if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_TAB ) { int rx=x,rw=pw+2; if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_ALIGN_RIGHT ) rx=x+width-pw-8; cairo_rectangle(cr,rx,y,rw+4,height-1); cairo_fill(cr); if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_ALIGN_RIGHT ) { // /| cairo_move_to(cr,x+width-rw-6,y); cairo_line_to(cr,x+width-rw-6-15,y+height-2); cairo_line_to(cr,x+width-rw-6,y+height-2); cairo_fill(cr); // hline cairo_move_to(cr,x,y+height-1); cairo_line_to(cr,x+width-rw-6,y+height-1); cairo_stroke(cr); } else { // | cairo_move_to(cr,x+rw+4,y); cairo_line_to(cr,x+rw+4+15,y+height-2); cairo_line_to(cr,x+rw+4,y+height-2); cairo_fill(cr); // hline cairo_move_to(cr,x+rw+4,y+height-1); cairo_line_to(cr,x+width,y+height-1); cairo_stroke(cr); } } cairo_set_antialias(cr,CAIRO_ANTIALIAS_DEFAULT); cairo_destroy(cr); // draw text int lx=x+4, ly=y+((height/2.0)-(ph/2.0)); if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_ALIGN_RIGHT ) lx=x+width-pw-6; else if( DTGTK_LABEL(widget)->flags&DARKTABLE_LABEL_ALIGN_CENTER ) lx=(width/2.0)-(pw/2.0); gtk_paint_layout(style, gtk_widget_get_window(widget), state,TRUE,&t,widget,"label",lx,ly,layout); return FALSE; }
// wxSystemSettings::GetColour() helper: get the colours from a GTK+ // widget style, return true if we did get them static bool GetColourFromGTKWidget(GdkColor& gdkColor, wxGtkWidgetType type = wxGTK_BUTTON, GtkStateType state = GTK_STATE_NORMAL, wxGtkColourType colour = wxGTK_BG) { GtkWidget *widget; switch ( type ) { default: wxFAIL_MSG( _T("unexpected GTK widget type") ); // fall through case wxGTK_BUTTON: widget = gtk_button_new(); break; case wxGTK_TEXTCTRL: widget = gtk_text_view_new(); break; case wxGTK_LIST: widget = gtk_tree_view_new_with_model( (GtkTreeModel*)gtk_list_store_new(1, G_TYPE_INT)); break; case wxGTK_MENUITEM: widget = gtk_menu_item_new(); break; case wxGTK_MENUBAR: widget = gtk_menu_bar_new(); break; } GtkStyle *def = gtk_rc_get_style( widget ); if ( !def ) def = gtk_widget_get_default_style(); const bool ok = def != NULL; if (ok) { switch ( colour ) { default: wxFAIL_MSG( _T("unexpected GTK colour type") ); // fall through case wxGTK_FG: gdkColor = def->fg[state]; break; case wxGTK_BG: gdkColor = def->bg[state]; break; case wxGTK_BASE: gdkColor = def->base[state]; break; case wxGTK_TEXT: gdkColor = def->text[state]; break; } } gtk_object_sink((GtkObject*)widget); return ok; }
static gboolean _lib_navigation_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_navigation_t *d = (dt_lib_navigation_t *)self->data; const int inset = DT_NAVIGATION_INSET; GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); int width = allocation.width, height = allocation.height; dt_develop_t *dev = darktable.develop; if(dev->preview_status != DT_DEV_PIXELPIPE_VALID) return FALSE; /* get the current style */ GtkStyle *style = gtk_rc_get_style_by_paths(gtk_settings_get_default(), NULL, "GtkWidget", GTK_TYPE_WIDGET); if(!style) style = gtk_rc_get_style(widget); cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); /* fill background */ cairo_set_source_rgb(cr, style->bg[0].red / 65535.0, style->bg[0].green / 65535.0, style->bg[0].blue / 65535.0); cairo_paint(cr); width -= 2 * inset; height -= 2 * inset; cairo_translate(cr, inset, inset); /* draw navigation image if available */ if(dev->preview_pipe->backbuf && (dev->preview_status == DT_DEV_PIXELPIPE_VALID)) { dt_pthread_mutex_t *mutex = &dev->preview_pipe->backbuf_mutex; dt_pthread_mutex_lock(mutex); const int wd = dev->preview_pipe->backbuf_width; const int ht = dev->preview_pipe->backbuf_height; const float scale = fminf(width / (float)wd, height / (float)ht); const int stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, wd); cairo_surface_t *surface = cairo_image_surface_create_for_data(dev->preview_pipe->backbuf, CAIRO_FORMAT_RGB24, wd, ht, stride); cairo_translate(cr, width / 2.0, height / 2.0f); cairo_scale(cr, scale, scale); cairo_translate(cr, -.5f * wd, -.5f * ht); // draw shadow around float alpha = 1.0f; for(int k = 0; k < 4; k++) { cairo_rectangle(cr, -k / scale, -k / scale, wd + 2 * k / scale, ht + 2 * k / scale); cairo_set_source_rgba(cr, 0, 0, 0, alpha); alpha *= 0.6f; cairo_fill(cr); } cairo_rectangle(cr, 0, 0, wd - 2, ht - 1); cairo_set_source_surface(cr, surface, 0, 0); cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_FAST); cairo_fill(cr); cairo_surface_destroy(surface); dt_pthread_mutex_unlock(mutex); // draw box where we are dt_dev_zoom_t zoom = dt_control_get_dev_zoom(); int closeup = dt_control_get_dev_closeup(); float zoom_x = dt_control_get_dev_zoom_x(); float zoom_y = dt_control_get_dev_zoom_y(); const float min_scale = dt_dev_get_zoom_scale(dev, DT_ZOOM_FIT, closeup ? 2.0 : 1.0, 0); const float cur_scale = dt_dev_get_zoom_scale(dev, zoom, closeup ? 2.0 : 1.0, 0); // avoid numerical instability for small resolutions: double h, w; if(cur_scale > min_scale) { float boxw = 1, boxh = 1; dt_dev_check_zoom_bounds(darktable.develop, &zoom_x, &zoom_y, zoom, closeup, &boxw, &boxh); cairo_translate(cr, wd * (.5f + zoom_x), ht * (.5f + zoom_y)); cairo_set_source_rgb(cr, 0., 0., 0.); cairo_set_line_width(cr, 1.f / scale); boxw *= wd; boxh *= ht; cairo_rectangle(cr, -boxw / 2 - 1, -boxh / 2 - 1, boxw + 2, boxh + 2); cairo_stroke(cr); cairo_set_source_rgb(cr, 1., 1., 1.); cairo_rectangle(cr, -boxw / 2, -boxh / 2, boxw, boxh); cairo_stroke(cr); } if(fabsf(cur_scale - min_scale) > 0.001f) { /* Zoom % */ cairo_identity_matrix(cr); cairo_translate(cr, 0, height); cairo_set_source_rgba(cr, 1., 1., 1., 0.5); cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cr, DT_PIXEL_APPLY_DPI(11)); char zoomline[5]; snprintf(zoomline, sizeof(zoomline), "%.0f%%", cur_scale * 100); cairo_text_extents_t ext; cairo_text_extents(cr, zoomline, &ext); h = d->zoom_h = ext.height; w = d->zoom_w = ext.width; cairo_move_to(cr, width - w - h * 1.1, 0); cairo_save(cr); cairo_set_line_width(cr, 2.0); cairo_set_source_rgb(cr, style->bg[0].red / 65535.0, style->bg[0].green / 65535.0, style->bg[0].blue / 65535.0); cairo_text_path(cr, zoomline); cairo_stroke_preserve(cr); cairo_set_source_rgb(cr, 0.6, 0.6, 0.6); cairo_fill(cr); cairo_restore(cr); } else { // draw the zoom-to-fit icon cairo_identity_matrix(cr); cairo_translate(cr, 0, height); cairo_set_source_rgb(cr, 0.6, 0.6, 0.6); cairo_text_extents_t ext; cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size(cr, DT_PIXEL_APPLY_DPI(11)); cairo_text_extents(cr, "100%", &ext); // dummy text, just to get the height h = d->zoom_h = ext.height; w = h * 1.5; float sp = h * 0.6; d->zoom_w = w + sp; cairo_move_to(cr, width - w - h - sp, -1.0 * h); cairo_rectangle(cr, width - w - h - sp, -1.0 * h, w, h); cairo_set_source_rgb(cr, 0.2, 0.2, 0.2); cairo_fill(cr); cairo_set_source_rgb(cr, 0.6, 0.6, 0.6); cairo_move_to(cr, width - w * 0.8 - h - sp, -1.0 * h); cairo_line_to(cr, width - w - h - sp, -1.0 * h); cairo_line_to(cr, width - w - h - sp, -0.7 * h); cairo_stroke(cr); cairo_move_to(cr, width - w - h - sp, -0.3 * h); cairo_line_to(cr, width - w - h - sp, 0); cairo_line_to(cr, width - w * 0.8 - h - sp, 0); cairo_stroke(cr); cairo_move_to(cr, width - w * 0.2 - h - sp, 0); cairo_line_to(cr, width - h - sp, 0); cairo_line_to(cr, width - h - sp, -0.3 * h); cairo_stroke(cr); cairo_move_to(cr, width - h - sp, -0.7 * h); cairo_line_to(cr, width - h - sp, -1.0 * h); cairo_line_to(cr, width - w * 0.2 - h - sp, -1.0 * h); cairo_stroke(cr); } cairo_move_to(cr, width - 0.95 * h, -0.9 * h); cairo_line_to(cr, width - 0.05 * h, -0.9 * h); cairo_line_to(cr, width - 0.5 * h, -0.1 * h); cairo_fill(cr); } /* blit memsurface into widget */ cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface(cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }
GtkWidget *ISFSetupWin::create_isf_setup_widget (void) { GtkWidget *language_button = NULL, *hbox = NULL, *vbox = NULL, *scroll = NULL; GtkTreeIter iter, it; GtkCellRenderer *cell = NULL; vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); hbox = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (vbox), hbox, false, false, 0); gtk_widget_set_size_request (hbox, _screen_width, (int)(40*_height_rate)); gtk_container_set_border_width (GTK_CONTAINER (hbox),(int)( 5*_height_rate)); // Create application list combox _combo_app = gtk_combo_box_new (); cell = gtk_cell_renderer_text_new (); _app_list_store = gtk_list_store_new (1, G_TYPE_STRING); for (unsigned int i = 0; i < _isf_app_list.size (); i++) { gtk_list_store_prepend (_app_list_store, &iter); gtk_list_store_set (_app_list_store, &iter, 0, _isf_app_list[_isf_app_list.size () - i - 1].c_str (), -1); } _app_combo_default_path = gtk_tree_model_get_path (GTK_TREE_MODEL (_app_list_store), &iter); gtk_cell_layout_pack_start ((GtkCellLayout *) _combo_app, cell, TRUE); gtk_cell_layout_set_attributes ((GtkCellLayout *) _combo_app, cell, "text", 0, NULL); gtk_combo_box_set_model ((GtkComboBox *) _combo_app, (GtkTreeModel *) _app_list_store); gtk_tree_model_get_iter (GTK_TREE_MODEL (_app_list_store), &it, _app_combo_default_path); gtk_combo_box_set_active_iter ((GtkComboBox *) _combo_app, &it); // gtk_widget_show (_combo_app); //hide the app list combox temp g_signal_connect ((gpointer) _combo_app, "changed", G_CALLBACK (app_selection_changed_callback), (gpointer)this); // Create language button language_button = gtk_button_new_with_label ("Language"); GtkStyle *style1 = gtk_rc_get_style (language_button); GtkWidget *newlabel = gtk_label_new ("Language"); if (newlabel) { GtkWidget * old = gtk_bin_get_child (GTK_BIN (language_button)); if (old) gtk_container_remove (GTK_CONTAINER (language_button), old); gtk_container_add (GTK_CONTAINER (language_button), newlabel); } if(style1) { gtk_widget_modify_font (language_button, style1->font_desc); } gtk_widget_show (language_button); gtk_box_pack_start (GTK_BOX (hbox), language_button, true, true, 0); g_signal_connect ((gpointer) language_button, "clicked", G_CALLBACK (on_language_button_clicked_callback), (gpointer)this); // Create ISE list view scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (vbox), scroll); gtk_widget_show (scroll); GtkWidget *view = create_factory_list_view (); create_and_fill_factory_list_store (); gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (_factory_list_store)); gtk_container_add (GTK_CONTAINER (scroll), view); gtk_widget_show (view); return vbox; }