test the transparency
This commit is contained in:
parent
088f89d421
commit
dad2057818
@ -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; };
|
||||
|
@ -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 : émis lors du premier affichage de la GtkDrawingArea
|
||||
gboolean MenuContext::CB_displayInit( GtkWidget *widget, gpointer data)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
@ -43,7 +43,7 @@ class Search: public Singleton<Search>
|
||||
|
||||
public:
|
||||
void Destroy(void);
|
||||
void Display(void);
|
||||
void Display(GtkWindow *parent);
|
||||
void Hide(void);
|
||||
|
||||
private:
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
134
test_transparence.c
Normal file
134
test_transparence.c
Normal 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));
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user