Implemented most of the code required for using a dedicated window for the desktop
This commit is contained in:
parent
c32bf5954d
commit
0cd6d4deae
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user