test the transparency

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

View File

@ -49,8 +49,8 @@ class Colorize {
Edn::String GetName(void); Edn::String GetName(void);
void SetFgColor(const char *myColor); void SetFgColor(const char *myColor);
void SetBgColor(const char *myColor); void SetBgColor(const char *myColor);
void ApplyFG(cairo_t * cr) { cairo_set_source_rgb(cr, m_colorFG.red, m_colorFG.green, m_colorFG.blue); }; void ApplyFG(cairo_t * cr) { cairo_set_source_rgba(cr, m_colorFG.red, m_colorFG.green, m_colorFG.blue, 1); };
void ApplyBG(cairo_t * cr) { cairo_set_source_rgb(cr, m_colorBG.red, m_colorBG.green, m_colorBG.blue); }; void ApplyBG(cairo_t * cr) { cairo_set_source_rgba(cr, m_colorBG.red, m_colorBG.green, m_colorBG.blue, 1); };
color_ts & GetFG(void) { return m_colorFG; }; color_ts & GetFG(void) { return m_colorFG; };
color_ts & GetBG(void) { return m_colorBG; }; color_ts & GetBG(void) { return m_colorBG; };

View File

@ -99,7 +99,8 @@ bool supports_alpha = false;
void MenuContext::CB_ScreenChange(GtkWidget *widget, GdkScreen *old_screen, gpointer userdata) 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; GdkScreen *screen = NULL;
GdkColormap *colormap = NULL; GdkColormap *colormap = NULL;
@ -117,8 +118,9 @@ void MenuContext::CB_ScreenChange(GtkWidget *widget, GdkScreen *old_screen, gpoi
supports_alpha = true; 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); gtk_widget_set_colormap (widget, colormap);
*/
} }
@ -129,7 +131,12 @@ static gboolean expose (GtkWidget *widget, GdkEventExpose *event, gpointer userd
gint height; gint height;
cairo_t *cr = NULL; 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) //if (supports_alpha)
{ {
// transparent // transparent
@ -148,13 +155,13 @@ static gboolean expose (GtkWidget *widget, GdkEventExpose *event, gpointer userd
cairo_paint (cr); cairo_paint (cr);
/* draw a circle */ /* 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_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_arc (cr, width / 2, height / 2, //cairo_arc (cr, width / 2, height / 2, (width < height ? width : height) / 2 - 8 , 0, 2 * 3.14);
(width < height ? width : height) / 2 - 8 , 0, 2 * 3.14); //cairo_fill (cr);
cairo_fill (cr); //cairo_stroke (cr);
cairo_stroke (cr); //cairo_paint (cr);
cairo_destroy (cr); cairo_destroy (cr);
return FALSE; return FALSE;
@ -170,13 +177,22 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
gtk_widget_destroy(m_dialog); gtk_widget_destroy(m_dialog);
m_dialog = NULL; m_dialog = NULL;
} }
//m_dialog = gtk_window_new(GTK_WINDOW_POPUP); m_dialog = gtk_window_new(GTK_WINDOW_POPUP);
m_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); //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); 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. /* 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 * 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 * applications between X servers, which might not support the
* same features, so we need to check each time. * same features, so we need to check each time.
*/ */
g_signal_connect (G_OBJECT (m_dialog), "expose-event", G_CALLBACK (expose), NULL); # ifdef USE_GTK_VERSION_3_0
g_signal_connect (G_OBJECT (m_dialog), "screen-changed", G_CALLBACK (CB_ScreenChange), NULL); 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 //#else
// Default size open windows
//gtk_window_set_default_size(GTK_WINDOW(m_dialog), 200, 300); //gtk_window_set_opacity(GTK_WINDOW(m_dialog), 0.25);
//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);
@ -235,7 +251,7 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
// Create the menu bar. // Create the menu bar.
//gtk_box_pack_start( GTK_BOX (vbox), m_MenuBar.GetWidget(), FALSE, FALSE, 0); //gtk_box_pack_start( GTK_BOX (vbox), m_MenuBar.GetWidget(), FALSE, FALSE, 0);
m_widget = gtk_drawing_area_new(); 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_set_size_request( m_widget, 250, 100);
gtk_widget_add_events( m_widget, gtk_widget_add_events( m_widget,
@ -263,16 +279,16 @@ void MenuContext::Show(int32_t x, int32_t y, bool top)
// Display Event // Display Event
g_signal_connect( G_OBJECT(m_widget), "realize", G_CALLBACK(CB_displayInit), this); g_signal_connect( G_OBJECT(m_widget), "realize", G_CALLBACK(CB_displayInit), this);
# ifdef USE_GTK_VERSION_3_0 # 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 ) # 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 # 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); gtk_container_add(GTK_CONTAINER(m_dialog), m_widget);
#endif //#endif
// recursive version of gtk_widget_show // recursive version of gtk_widget_show
gtk_widget_show_all(m_dialog); 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 : émis lors du premier affichage de la GtkDrawingArea // sur : émis lors du premier affichage de la GtkDrawingArea
gboolean MenuContext::CB_displayInit( GtkWidget *widget, gpointer data) 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); void OnMessage(int32_t id, int32_t dataID);
// sur : GTK+ callback : // sur : GTK+ callback :
static gboolean CB_displayDraw( GtkWidget *widget, GdkEventExpose *event, gpointer data); 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 gboolean CB_displayInit( GtkWidget *widget, gpointer data);
static gint CB_focusGet( GtkWidget *widget, GdkEventFocus *event, gpointer data); static gint CB_focusGet( GtkWidget *widget, GdkEventFocus *event, gpointer data);
static gint CB_focusLost( GtkWidget *widget, GdkEventFocus *event, gpointer data); static gint CB_focusLost( GtkWidget *widget, GdkEventFocus *event, gpointer data);

View File

@ -56,12 +56,18 @@ Search::~Search(void)
} }
} }
void Search::Display(void) void Search::Display(GtkWindow *parent)
{ {
if(NULL == m_localDialog) { if(NULL == m_localDialog) {
m_localDialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); m_localDialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// set dialog not resisable
gtk_window_set_resizable(GTK_WINDOW(m_localDialog), FALSE); gtk_window_set_resizable(GTK_WINDOW(m_localDialog), FALSE);
gtk_window_set_keep_above(GTK_WINDOW(m_localDialog), TRUE); // set the windows alwais on top of every all system windows
//gtk_window_set_keep_above(GTK_WINDOW(m_localDialog), TRUE);
// Set the dialog on top of the selected windows
gtk_window_set_transient_for(GTK_WINDOW(m_localDialog), parent);
// set the dialog on the top right
gtk_window_set_gravity(GTK_WINDOW(m_localDialog), GDK_GRAVITY_NORTH_EAST);
// select the program icone // select the program icone
//gtk_window_set_default_icon_name("Replace"); //gtk_window_set_default_icon_name("Replace");

View File

@ -43,7 +43,7 @@ class Search: public Singleton<Search>
public: public:
void Destroy(void); void Destroy(void);
void Display(void); void Display(GtkWindow *parent);
void Hide(void); void Hide(void);
private: private:

View File

@ -76,7 +76,7 @@ void WindowsManager::OnMessage(int32_t id, int32_t dataID)
EDN_INFO("Request opening SEARCH"); EDN_INFO("Request opening SEARCH");
{ {
Search *myInstance = Search::getInstance(); Search *myInstance = Search::getInstance();
myInstance->Display(); myInstance->Display(GTK_WINDOW(m_mainWindow->GetWidget()));
} }
break; break;
case EDN_MSG__GUI_SHOW_PREFERENCE: case EDN_MSG__GUI_SHOW_PREFERENCE:

View File

@ -168,7 +168,7 @@ DrawerManager::DrawerManager(GtkWidget * widget, int32_t x, int32_t y)
// http://cairographics.org/FAQ/#clear_a_surface // http://cairographics.org/FAQ/#clear_a_surface
// http://gtk.developpez.com/faq/?page=gtkwidget#GTK_WIDGET_transparent // http://gtk.developpez.com/faq/?page=gtkwidget#GTK_WIDGET_transparent
cairo_set_source_rgba(m_cairo, 0, 1, 1, 0.5); cairo_set_source_rgba(m_cairo, 0, 1, 1, 0);
cairo_set_operator(m_cairo, CAIRO_OPERATOR_SOURCE); cairo_set_operator(m_cairo, CAIRO_OPERATOR_SOURCE);
cairo_paint(m_cairo); cairo_paint(m_cairo);
//cairo_fill(m_cairo); //cairo_fill(m_cairo);

134
test_transparence.c Normal file
View File

@ -0,0 +1,134 @@
// gcc test_transparence.c -o out `pkg-config --cflags --libs gtk+-3.0`
// includes system, malloc, EXIT_SUCCESS
#include <stdlib.h>
// includes fopen, fwrite, fseek, ftell
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <cairo.h>
static void screen_changed(GtkWidget *widget, GdkScreen *old_screen, gpointer user_data);
static gboolean expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
static void clicked(GtkWindow *win, GdkEventButton *event, gpointer user_data);
const GdkRGBA color = { 1.0, 1.0, 0.0, 0.0};
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);
gtk_window_set_title(GTK_WINDOW(window), "Alpha Demo");
g_signal_connect(G_OBJECT(window), "delete-event", gtk_main_quit, NULL);
gtk_widget_set_app_paintable(window, TRUE);
//g_signal_connect(G_OBJECT(window), "expose-event", G_CALLBACK(expose), NULL);
g_signal_connect(G_OBJECT(window), "draw", G_CALLBACK(expose), NULL);
g_signal_connect(G_OBJECT(window), "screen-changed", G_CALLBACK(screen_changed), NULL);
GtkStyleContext *context;
GdkRGBA rgba;
context = gtk_widget_get_style_context(window);
gtk_style_context_get_background_color(context, GTK_STATE_FLAG_NORMAL,
&rgba);
gtk_widget_override_background_color(window,
GTK_STATE_FLAG_NORMAL, &rgba);
/*
gtk_widget_override_background_color(window,
GTK_STATE_FLAG_NORMAL,// | GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT | GTK_STATE_FLAG_FOCUSED,
&color);
gtk_widget_override_color(window,
GTK_STATE_FLAG_NORMAL,// | GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT | GTK_STATE_FLAG_FOCUSED,
&color);
*/
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
g_signal_connect(G_OBJECT(window), "button-press-event", G_CALLBACK(clicked), NULL);
GtkWidget* fixed_container = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed_container);
GtkWidget* button = gtk_button_new_with_label("button1");
gtk_widget_set_size_request(button, 100, 100);
gtk_container_add(GTK_CONTAINER(fixed_container), button);
screen_changed(window, NULL, NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
gboolean supports_alpha = TRUE;
static void screen_changed(GtkWidget *widget, GdkScreen *old_screen, gpointer userdata)
{
/* To check if the display supports alpha channels, get the colormap */
//GdkScreen *screen = gtk_widget_get_screen(widget);
/*
GdkColormap *colormap = gdk_screen_get_rgba_colormap(screen);
if (!colormap)
{
printf("Your screen does not support alpha channels!\n");
colormap = gdk_screen_get_rgb_colormap(screen);
supports_alpha = FALSE;
}
else
{
printf("Your screen supports alpha channels!\n");
supports_alpha = TRUE;
}
gtk_widget_set_colormap(widget, colormap);*/
/*
gtk_widget_override_background_color(widget,
GTK_STATE_FLAG_NORMAL,// | GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT | GTK_STATE_FLAG_FOCUSED,
&color);
gtk_widget_override_color(widget,
GTK_STATE_FLAG_NORMAL,// | GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT | GTK_STATE_FLAG_FOCUSED,
&color);
*/
}
static gboolean expose(GtkWidget *widget, GdkEventExpose *event, gpointer userdata)
{
return FALSE;
//# if USE_GTK_VERSION_3_0
cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(widget));
/*
# elif USE_GTK_VERSION_2_0
cairo_t *cr = gdk_cairo_create(widget->window);
# endif
*/
if (TRUE == supports_alpha)
cairo_set_source_rgba (cr, 0.0, 0.0, 1.0, 0.3); /* transparent */
else
cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); /* opaque white */
/* draw the background */
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_paint (cr);
cairo_destroy(cr);
return FALSE;
}
static void clicked(GtkWindow *win, GdkEventButton *event, gpointer user_data)
{
/* toggle window manager frames */
gtk_window_set_decorated(win, !gtk_window_get_decorated(win));
}