Implemented most of the code required for using a dedicated window for the desktop

This commit is contained in:
Pierre Pronchery 2013-11-24 05:14:53 +01:00
parent c32bf5954d
commit 0cd6d4deae

View File

@ -117,6 +117,8 @@ struct _Desktop
GdkScreen * screen; GdkScreen * screen;
GdkDisplay * display; GdkDisplay * display;
GdkWindow * root; GdkWindow * root;
GtkWidget * desktop;
GdkWindow * back;
GtkIconTheme * theme; GtkIconTheme * theme;
GtkWidget * menu; GtkWidget * menu;
}; };
@ -210,6 +212,7 @@ static void _desktop_show_preferences(Desktop * desktop);
/* functions */ /* functions */
/* desktop_new */ /* desktop_new */
/* callbacks */ /* callbacks */
static void _new_events(Desktop * desktop, GdkWindow * window);
static void _new_icons(Desktop * desktop); static void _new_icons(Desktop * desktop);
static gboolean _new_idle(gpointer data); static gboolean _new_idle(gpointer data);
static void _idle_background(Desktop * desktop, Config * config); static void _idle_background(Desktop * desktop, Config * config);
@ -225,7 +228,6 @@ Desktop * desktop_new(DesktopPrefs * prefs)
#if !GTK_CHECK_VERSION(2, 24, 0) #if !GTK_CHECK_VERSION(2, 24, 0)
int depth; int depth;
#endif #endif
GdkEventMask mask;
if((desktop = object_new(sizeof(*desktop))) == NULL) if((desktop = object_new(sizeof(*desktop))) == NULL)
return NULL; return NULL;
@ -249,7 +251,7 @@ Desktop * desktop_new(DesktopPrefs * prefs)
desktop->home = "/"; desktop->home = "/";
desktop_message_register(NULL, DESKTOP_CLIENT_MESSAGE, _on_message, desktop_message_register(NULL, DESKTOP_CLIENT_MESSAGE, _on_message,
desktop); desktop);
/* manage root window events */ /* query the root window */
#if GTK_CHECK_VERSION(2, 24, 0) #if GTK_CHECK_VERSION(2, 24, 0)
gdk_window_get_position(desktop->root, &desktop->window.x, gdk_window_get_position(desktop->root, &desktop->window.x,
&desktop->window.y); &desktop->window.y);
@ -260,17 +262,42 @@ Desktop * desktop_new(DesktopPrefs * prefs)
&desktop->window.y, &desktop->window.width, &desktop->window.y, &desktop->window.width,
&desktop->window.height, &depth); &desktop->window.height, &depth);
#endif #endif
mask = gdk_window_get_events(desktop->root) | GDK_PROPERTY_CHANGE_MASK; #if 0 /* FIXME fully implement (as a hidden option) */
if(prefs->popup != 0) /* create the desktop window */
mask |= GDK_BUTTON_PRESS_MASK; desktop->desktop = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gdk_window_set_events(desktop->root, mask); gtk_window_set_default_size(GTK_WINDOW(desktop->desktop),
gdk_window_add_filter(desktop->root, _on_root_event, desktop); desktop->window.width, desktop->window.height);
gtk_window_set_type_hint(GTK_WINDOW(desktop->desktop),
GDK_WINDOW_TYPE_HINT_DESKTOP);
gtk_widget_realize(desktop->desktop);
# if GTK_CHECK_VERSION(2, 14, 0)
desktop->back = gtk_widget_get_window(desktop->desktop);
# else
desktop->back = desktop->desktop->window;
# endif
#else
desktop->desktop = NULL;
desktop->back = desktop->root;
#endif
/* manage events on the root window */
_new_events(desktop, desktop->root);
/* draw the icons and background when idle */ /* draw the icons and background when idle */
_new_icons(desktop); _new_icons(desktop);
g_idle_add(_new_idle, desktop); g_idle_add(_new_idle, desktop);
return desktop; return desktop;
} }
static void _new_events(Desktop * desktop, GdkWindow * window)
{
GdkEventMask mask;
mask = gdk_window_get_events(window) | GDK_PROPERTY_CHANGE_MASK;
if(desktop->prefs.popup != 0)
mask |= GDK_BUTTON_PRESS_MASK;
gdk_window_set_events(window, mask);
gdk_window_add_filter(window, _on_root_event, desktop);
}
static void _new_icons(Desktop * desktop) static void _new_icons(Desktop * desktop)
{ {
const char * file[] = { "gnome-fs-regular", const char * file[] = { "gnome-fs-regular",
@ -304,6 +331,8 @@ static gboolean _new_idle(gpointer data)
if((config = _desktop_get_config(desktop)) == NULL) if((config = _desktop_get_config(desktop)) == NULL)
return FALSE; return FALSE;
_idle_background(desktop, config); _idle_background(desktop, config);
if(desktop->desktop != NULL)
gtk_widget_show(desktop->desktop);
_idle_icons(desktop, config); _idle_icons(desktop, config);
config_delete(config); config_delete(config);
_desktop_get_workarea(desktop); _desktop_get_workarea(desktop);
@ -1635,7 +1664,7 @@ static void _desktop_draw_background(Desktop * desktop, GdkColor * color,
if(how == DESKTOP_HOW_NONE) if(how == DESKTOP_HOW_NONE)
return; return;
/* draw default color */ /* draw default color */
pixmap = gdk_pixmap_new(desktop->root, window.width, window.height, -1); pixmap = gdk_pixmap_new(desktop->back, window.width, window.height, -1);
gc = gdk_gc_new(pixmap); gc = gdk_gc_new(pixmap);
gdk_gc_set_rgb_fg_color(gc, color); gdk_gc_set_rgb_fg_color(gc, color);
gdk_draw_rectangle(pixmap, gc, TRUE, 0, 0, window.width, window.height); gdk_draw_rectangle(pixmap, gc, TRUE, 0, 0, window.width, window.height);
@ -1674,8 +1703,8 @@ static void _desktop_draw_background(Desktop * desktop, GdkColor * color,
g_error_free(error); g_error_free(error);
} }
} }
gdk_window_set_back_pixmap(desktop->root, pixmap, FALSE); gdk_window_set_back_pixmap(desktop->back, pixmap, FALSE);
gdk_window_clear(desktop->root); gdk_window_clear(desktop->back);
gdk_pixmap_unref(pixmap); gdk_pixmap_unref(pixmap);
} }