test the transparency

This commit is contained in:
2011-07-24 20:25:34 +02:00
parent 088f89d421
commit dad2057818
8 changed files with 240 additions and 36 deletions

View File

@@ -99,7 +99,8 @@ bool supports_alpha = false;
void MenuContext::CB_ScreenChange(GtkWidget *widget, GdkScreen *old_screen, gpointer userdata)
{
/* To check if the display supports alpha channels, get the colormap */
/*
// To check if the display supports alpha channels, get the colormap
GdkScreen *screen = NULL;
GdkColormap *colormap = NULL;
@@ -117,8 +118,9 @@ void MenuContext::CB_ScreenChange(GtkWidget *widget, GdkScreen *old_screen, gpoi
supports_alpha = true;
}
/* Now we have a colormap appropriate for the screen, use it */
/* Now we have a colormap appropriate for the screen, use it
gtk_widget_set_colormap (widget, colormap);
*/
}
@@ -129,7 +131,12 @@ static gboolean expose (GtkWidget *widget, GdkEventExpose *event, gpointer userd
gint height;
cairo_t *cr = NULL;
cr = gdk_cairo_create(widget->window);
# if USE_GTK_VERSION_3_0
cr = gdk_cairo_create(gtk_widget_get_window(widget));
# elif USE_GTK_VERSION_2_0
cr = gdk_cairo_create(widget->window);
# endif
//if (supports_alpha)
{
// transparent
@@ -148,13 +155,13 @@ static gboolean expose (GtkWidget *widget, GdkEventExpose *event, gpointer userd
cairo_paint (cr);
/* draw a circle */
gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
//gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_arc (cr, width / 2, height / 2,
(width < height ? width : height) / 2 - 8 , 0, 2 * 3.14);
cairo_fill (cr);
cairo_stroke (cr);
//cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
//cairo_arc (cr, width / 2, height / 2, (width < height ? width : height) / 2 - 8 , 0, 2 * 3.14);
//cairo_fill (cr);
//cairo_stroke (cr);
//cairo_paint (cr);
cairo_destroy (cr);
return FALSE;
@@ -170,13 +177,22 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
gtk_widget_destroy(m_dialog);
m_dialog = NULL;
}
//m_dialog = gtk_window_new(GTK_WINDOW_POPUP);
m_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
m_dialog = gtk_window_new(GTK_WINDOW_POPUP);
//m_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// Set the dialog on top of the selected windows
//gtk_window_set_transient_for(GTK_WINDOW(m_dialog), parent);
// unset the border of the windows
//gtk_window_set_decorated(GTK_WINDOW(m_dialog), FALSE);
EDN_INFO("Set position X=" << x+2 << " Y=" << y+27);
gtk_widget_set_uposition(m_dialog, x+2, y+27);
# if USE_GTK_VERSION_3_0
gtk_window_move(GTK_WINDOW(m_dialog), x+2, y+27);
# elif USE_GTK_VERSION_2_0
gtk_widget_set_uposition(m_dialog, x+2, y+27);
# endif
//#if 1
/* Tell GTK+ that we want to draw the windows background ourself.
* If we don't do this then GTK+ will clear the window to the
@@ -196,22 +212,22 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
* applications between X servers, which might not support the
* same features, so we need to check each time.
*/
g_signal_connect (G_OBJECT (m_dialog), "expose-event", G_CALLBACK (expose), NULL);
g_signal_connect (G_OBJECT (m_dialog), "screen-changed", G_CALLBACK (CB_ScreenChange), NULL);
# ifdef USE_GTK_VERSION_3_0
g_signal_connect( G_OBJECT(m_dialog), "draw", G_CALLBACK(expose), this);
# elif defined( USE_GTK_VERSION_2_0 )
g_signal_connect( G_OBJECT(m_dialog), "expose_event", G_CALLBACK(expose), this);
# endif
//g_signal_connect (G_OBJECT (m_dialog), "screen-changed", G_CALLBACK (CB_ScreenChange), NULL);
//gtk_window_set_opacity(GTK_WINDOW(m_dialog), 0.25);
CB_ScreenChange(m_dialog, NULL, NULL);
//CB_ScreenChange(m_dialog, NULL, NULL);
#if 0
// Default size open windows
//gtk_window_set_default_size(GTK_WINDOW(m_dialog), 200, 300);
//gtk_window_set_position(GTK_WINDOW(m_dialog), GTK_WIN_POS_MOUSE);
EDN_INFO("Set position X=" << x+2 << " Y=" << y+27);
gtk_widget_set_uposition(m_dialog, x+2, y+27);
gtk_window_set_opacity(GTK_WINDOW(m_dialog), 0.5);
//#else
//gtk_window_set_opacity(GTK_WINDOW(m_dialog), 0.25);
@@ -235,7 +251,7 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
// Create the menu bar.
//gtk_box_pack_start( GTK_BOX (vbox), m_MenuBar.GetWidget(), FALSE, FALSE, 0);
m_widget = gtk_drawing_area_new();
gtk_window_set_opacity(GTK_WINDOW(m_widget), 0.5);
//gtk_window_set_opacity(GTK_WINDOW(m_widget), 0.8);
gtk_widget_set_size_request( m_widget, 250, 100);
gtk_widget_add_events( m_widget,
@@ -263,16 +279,16 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
// Display Event
g_signal_connect( G_OBJECT(m_widget), "realize", G_CALLBACK(CB_displayInit), this);
# ifdef USE_GTK_VERSION_3_0
g_signal_connect( G_OBJECT(m_widget), "draw", G_CALLBACK(CB_displayDraw), this);
g_signal_connect( G_OBJECT(m_widget), "draw", G_CALLBACK(CB_displayDraw2), this);
# elif defined( USE_GTK_VERSION_2_0 )
g_signal_connect( G_OBJECT(m_widget), "expose_event", G_CALLBACK(CB_displayDraw), this);
g_signal_connect( G_OBJECT(m_widget), "expose_event", G_CALLBACK(CB_displayDraw2), this);
# endif
g_signal_connect ( G_OBJECT(m_widget), "screen-changed", G_CALLBACK(CB_ScreenChange), NULL);
//g_signal_connect ( G_OBJECT(m_widget), "screen-changed", G_CALLBACK(CB_ScreenChange), NULL);
gtk_container_add(GTK_CONTAINER(m_dialog), m_widget);
#endif
//#endif
// recursive version of gtk_widget_show
gtk_widget_show_all(m_dialog);
@@ -355,6 +371,53 @@ gboolean MenuContext::CB_displayDraw( GtkWidget *widget, GdkEventExpose *event,
gboolean MenuContext::CB_displayDraw2( GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
MenuContext * self = reinterpret_cast<MenuContext*>(data);
gint width;
gint height;
cairo_t *cr = NULL;
# if USE_GTK_VERSION_3_0
cr = gdk_cairo_create(gtk_widget_get_window(widget));
# elif USE_GTK_VERSION_2_0
cr = gdk_cairo_create(widget->window);
# endif
//if (supports_alpha)
{
// transparent
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
}
/*
else
{
// opaque white
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
}
*/
/* draw the background */
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
/* draw a circle */
gtk_window_get_size (GTK_WINDOW (widget), &width, &height);
cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_arc (cr, width / 2, height / 2, (width < height ? width : height) / 2 - 8 , 0, 2 * 3.14);
cairo_fill (cr);
cairo_stroke (cr);
cairo_paint (cr);
cairo_destroy (cr);
return FALSE;
}
// sur : <20>mis lors du premier affichage de la GtkDrawingArea
gboolean MenuContext::CB_displayInit( GtkWidget *widget, gpointer data)
{

View File

@@ -45,6 +45,7 @@ class MenuContext: public Singleton<MenuContext>, public MsgBroadcast
void OnMessage(int32_t id, int32_t dataID);
// sur : GTK+ callback :
static gboolean CB_displayDraw( GtkWidget *widget, GdkEventExpose *event, gpointer data);
static gboolean CB_displayDraw2( GtkWidget *widget, GdkEventExpose *event, gpointer data);
static gboolean CB_displayInit( GtkWidget *widget, gpointer data);
static gint CB_focusGet( GtkWidget *widget, GdkEventFocus *event, gpointer data);
static gint CB_focusLost( GtkWidget *widget, GdkEventFocus *event, gpointer data);