From dad205781887f92d3b659772c8fb80b4f11fa527 Mon Sep 17 00:00:00 2001 From: Edouard Dupin Date: Sun, 24 Jul 2011 20:25:34 +0200 Subject: [PATCH] test the transparency --- Sources/Colorize/Colorize.h | 4 +- Sources/GuiTools/MenuContext/MenuContext.cpp | 121 ++++++++++++---- Sources/GuiTools/MenuContext/MenuContext.h | 1 + Sources/GuiTools/Search/Search.cpp | 10 +- Sources/GuiTools/Search/Search.h | 2 +- .../WindowsManager/WindowsManager.cpp | 2 +- Sources/tools/Display/Display.cpp | 2 +- test_transparence.c | 134 ++++++++++++++++++ 8 files changed, 240 insertions(+), 36 deletions(-) create mode 100644 test_transparence.c diff --git a/Sources/Colorize/Colorize.h b/Sources/Colorize/Colorize.h index d8b1a94..386d12a 100644 --- a/Sources/Colorize/Colorize.h +++ b/Sources/Colorize/Colorize.h @@ -49,8 +49,8 @@ class Colorize { Edn::String GetName(void); void SetFgColor(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 ApplyBG(cairo_t * cr) { cairo_set_source_rgb(cr, m_colorBG.red, m_colorBG.green, m_colorBG.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_rgba(cr, m_colorBG.red, m_colorBG.green, m_colorBG.blue, 1); }; color_ts & GetFG(void) { return m_colorFG; }; color_ts & GetBG(void) { return m_colorBG; }; diff --git a/Sources/GuiTools/MenuContext/MenuContext.cpp b/Sources/GuiTools/MenuContext/MenuContext.cpp index d92f516..c7ee2b8 100644 --- a/Sources/GuiTools/MenuContext/MenuContext.cpp +++ b/Sources/GuiTools/MenuContext/MenuContext.cpp @@ -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(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 gboolean MenuContext::CB_displayInit( GtkWidget *widget, gpointer data) { diff --git a/Sources/GuiTools/MenuContext/MenuContext.h b/Sources/GuiTools/MenuContext/MenuContext.h index 07210ad..ab5d152 100644 --- a/Sources/GuiTools/MenuContext/MenuContext.h +++ b/Sources/GuiTools/MenuContext/MenuContext.h @@ -45,6 +45,7 @@ class MenuContext: public Singleton, 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); diff --git a/Sources/GuiTools/Search/Search.cpp b/Sources/GuiTools/Search/Search.cpp index 94b59ee..712b6d8 100644 --- a/Sources/GuiTools/Search/Search.cpp +++ b/Sources/GuiTools/Search/Search.cpp @@ -56,12 +56,18 @@ Search::~Search(void) } } -void Search::Display(void) +void Search::Display(GtkWindow *parent) { if(NULL == m_localDialog) { m_localDialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + // set dialog not resisable 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 //gtk_window_set_default_icon_name("Replace"); diff --git a/Sources/GuiTools/Search/Search.h b/Sources/GuiTools/Search/Search.h index 3cafdc7..7982285 100644 --- a/Sources/GuiTools/Search/Search.h +++ b/Sources/GuiTools/Search/Search.h @@ -43,7 +43,7 @@ class Search: public Singleton public: void Destroy(void); - void Display(void); + void Display(GtkWindow *parent); void Hide(void); private: diff --git a/Sources/GuiTools/WindowsManager/WindowsManager.cpp b/Sources/GuiTools/WindowsManager/WindowsManager.cpp index a5db6fd..b6f6251 100644 --- a/Sources/GuiTools/WindowsManager/WindowsManager.cpp +++ b/Sources/GuiTools/WindowsManager/WindowsManager.cpp @@ -76,7 +76,7 @@ void WindowsManager::OnMessage(int32_t id, int32_t dataID) EDN_INFO("Request opening SEARCH"); { Search *myInstance = Search::getInstance(); - myInstance->Display(); + myInstance->Display(GTK_WINDOW(m_mainWindow->GetWidget())); } break; case EDN_MSG__GUI_SHOW_PREFERENCE: diff --git a/Sources/tools/Display/Display.cpp b/Sources/tools/Display/Display.cpp index 35e7b35..343390b 100644 --- a/Sources/tools/Display/Display.cpp +++ b/Sources/tools/Display/Display.cpp @@ -168,7 +168,7 @@ DrawerManager::DrawerManager(GtkWidget * widget, int32_t x, int32_t y) // http://cairographics.org/FAQ/#clear_a_surface // 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_paint(m_cairo); //cairo_fill(m_cairo); diff --git a/test_transparence.c b/test_transparence.c new file mode 100644 index 0000000..1c601cf --- /dev/null +++ b/test_transparence.c @@ -0,0 +1,134 @@ + +// gcc test_transparence.c -o out `pkg-config --cflags --libs gtk+-3.0` + +// includes system, malloc, EXIT_SUCCESS +#include +// includes fopen, fwrite, fseek, ftell +#include +#include +#include +#include + + +#include +#include +#include + +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)); +} \ No newline at end of file