Added support to draw the background picture
This commit is contained in:
parent
1356c2131c
commit
30a5d93086
100
src/desktop.c
100
src/desktop.c
@ -28,6 +28,7 @@
|
|||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
#include <System.h>
|
||||||
#include "mime.h"
|
#include "mime.h"
|
||||||
#include "desktop.h"
|
#include "desktop.h"
|
||||||
#define PACKAGE "desktop"
|
#define PACKAGE "desktop"
|
||||||
@ -39,6 +40,7 @@
|
|||||||
|
|
||||||
/* constants */
|
/* constants */
|
||||||
#define DESKTOP ".desktop"
|
#define DESKTOP ".desktop"
|
||||||
|
#define DESKTOPRC ".desktoprc"
|
||||||
|
|
||||||
|
|
||||||
/* DesktopIcon */
|
/* DesktopIcon */
|
||||||
@ -55,10 +57,14 @@ struct _Desktop
|
|||||||
time_t refresh_mti;
|
time_t refresh_mti;
|
||||||
|
|
||||||
GdkWindow * root;
|
GdkWindow * root;
|
||||||
|
GdkPixbuf * background;
|
||||||
GtkIconTheme * theme;
|
GtkIconTheme * theme;
|
||||||
GdkPixbuf * file;
|
GdkPixbuf * file;
|
||||||
GdkPixbuf * folder;
|
GdkPixbuf * folder;
|
||||||
GtkWidget * menu;
|
GtkWidget * menu;
|
||||||
|
|
||||||
|
gint width;
|
||||||
|
gint height;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _DesktopIcon
|
struct _DesktopIcon
|
||||||
@ -569,18 +575,21 @@ void desktopicon_delete(DesktopIcon * desktopicon)
|
|||||||
|
|
||||||
|
|
||||||
/* accessors */
|
/* accessors */
|
||||||
|
/* desktopicon_get_path */
|
||||||
char const * desktopicon_get_path(DesktopIcon * desktopicon)
|
char const * desktopicon_get_path(DesktopIcon * desktopicon)
|
||||||
{
|
{
|
||||||
return desktopicon->path;
|
return desktopicon->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* desktopicon_get_selected */
|
||||||
gboolean desktopicon_get_selected(DesktopIcon * desktopicon)
|
gboolean desktopicon_get_selected(DesktopIcon * desktopicon)
|
||||||
{
|
{
|
||||||
return desktopicon->selected;
|
return desktopicon->selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* desktopicon_set_icon */
|
||||||
void desktopicon_set_icon(DesktopIcon * desktopicon, GdkPixbuf * icon)
|
void desktopicon_set_icon(DesktopIcon * desktopicon, GdkPixbuf * icon)
|
||||||
{
|
{
|
||||||
gtk_image_set_from_pixbuf(GTK_IMAGE(desktopicon->image), icon);
|
gtk_image_set_from_pixbuf(GTK_IMAGE(desktopicon->image), icon);
|
||||||
@ -588,6 +597,7 @@ void desktopicon_set_icon(DesktopIcon * desktopicon, GdkPixbuf * icon)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* desktopicon_set_selected */
|
||||||
void desktopicon_set_selected(DesktopIcon * desktopicon, gboolean selected)
|
void desktopicon_set_selected(DesktopIcon * desktopicon, gboolean selected)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -624,6 +634,7 @@ static void _new_add_home(Desktop * desktop);
|
|||||||
|
|
||||||
/* callbacks */
|
/* callbacks */
|
||||||
/* FIXME implement desktop resizing callback */
|
/* FIXME implement desktop resizing callback */
|
||||||
|
static gboolean _new_idle(gpointer data);
|
||||||
static GdkFilterReturn _new_on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
static GdkFilterReturn _new_on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
|
||||||
@ -641,6 +652,9 @@ Desktop * desktop_new(void)
|
|||||||
#endif
|
#endif
|
||||||
GTK_STOCK_MISSING_IMAGE, NULL };
|
GTK_STOCK_MISSING_IMAGE, NULL };
|
||||||
char ** p;
|
char ** p;
|
||||||
|
gint x;
|
||||||
|
gint y;
|
||||||
|
gint depth;
|
||||||
|
|
||||||
if((desktop = malloc(sizeof(*desktop))) == NULL)
|
if((desktop = malloc(sizeof(*desktop))) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -675,9 +689,14 @@ Desktop * desktop_new(void)
|
|||||||
desktop->root = gdk_screen_get_root_window(
|
desktop->root = gdk_screen_get_root_window(
|
||||||
gdk_display_get_default_screen(
|
gdk_display_get_default_screen(
|
||||||
gdk_display_get_default()));
|
gdk_display_get_default()));
|
||||||
|
gdk_window_get_geometry(desktop->root, &x, &y, &desktop->width,
|
||||||
|
&desktop->height, &depth);
|
||||||
gdk_window_set_events(desktop->root, gdk_window_get_events(
|
gdk_window_set_events(desktop->root, gdk_window_get_events(
|
||||||
desktop->root) | GDK_BUTTON_PRESS_MASK);
|
desktop->root) | GDK_BUTTON_PRESS_MASK
|
||||||
|
| GDK_EXPOSURE_MASK);
|
||||||
gdk_window_add_filter(desktop->root, _new_on_root_event, desktop);
|
gdk_window_add_filter(desktop->root, _new_on_root_event, desktop);
|
||||||
|
/* draw background when idle */
|
||||||
|
g_idle_add(_new_idle, desktop);
|
||||||
return desktop;
|
return desktop;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,8 +748,54 @@ static void _new_add_home(Desktop * desktop)
|
|||||||
desktopicon_set_icon(desktopicon, icon);
|
desktopicon_set_icon(desktopicon, icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean _new_idle(gpointer data)
|
||||||
|
{
|
||||||
|
Desktop * desktop = data;
|
||||||
|
Config * config;
|
||||||
|
char * pathname;
|
||||||
|
char const * p;
|
||||||
|
GError * error = NULL;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
||||||
|
#endif
|
||||||
|
if((config = config_new()) == NULL)
|
||||||
|
return desktop_error(desktop, error_get(), FALSE);
|
||||||
|
if((pathname = string_new_append(desktop->home, "/", DESKTOPRC, NULL))
|
||||||
|
== NULL)
|
||||||
|
{
|
||||||
|
config_delete(config);
|
||||||
|
return desktop_error(desktop, error_get(), FALSE);
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s() config=\"%s\"\n", __func__, pathname);
|
||||||
|
#endif
|
||||||
|
if(config_load(config, pathname) != 0)
|
||||||
|
desktop_error(desktop, error_get(), 0);
|
||||||
|
else if((p = config_get(config, "", "background")) != NULL)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s() background=\"%s\"\n", __func__, p);
|
||||||
|
#endif
|
||||||
|
/* FIXME may be resized (xrandr...) */
|
||||||
|
if((desktop->background = gdk_pixbuf_new_from_file_at_scale(p,
|
||||||
|
desktop->width, desktop->height,
|
||||||
|
FALSE, &error))
|
||||||
|
== NULL)
|
||||||
|
desktop_error(desktop, error->message, 0);
|
||||||
|
else
|
||||||
|
gdk_draw_pixbuf(desktop->root, NULL,
|
||||||
|
desktop->background, 0, 0, 0, 0,
|
||||||
|
-1, -1, GDK_RGB_DITHER_NORMAL, 0, 0);
|
||||||
|
}
|
||||||
|
object_delete(pathname);
|
||||||
|
config_delete(config);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static GdkFilterReturn _event_button_press(XButtonEvent * xbev,
|
static GdkFilterReturn _event_button_press(XButtonEvent * xbev,
|
||||||
Desktop * desktop);
|
Desktop * desktop);
|
||||||
|
static GdkFilterReturn _event_expose(XExposeEvent * xevent, Desktop * desktop);
|
||||||
static void _on_popup_new_folder(GtkWidget * widget, gpointer data);
|
static void _on_popup_new_folder(GtkWidget * widget, gpointer data);
|
||||||
static void _on_popup_new_text_file(GtkWidget * widget, gpointer data);
|
static void _on_popup_new_text_file(GtkWidget * widget, gpointer data);
|
||||||
static void _on_popup_paste(GtkWidget * widget, gpointer data);
|
static void _on_popup_paste(GtkWidget * widget, gpointer data);
|
||||||
@ -744,6 +809,11 @@ static GdkFilterReturn _new_on_root_event(GdkXEvent * xevent, GdkEvent * event,
|
|||||||
|
|
||||||
if(xev->type == ButtonPress)
|
if(xev->type == ButtonPress)
|
||||||
return _event_button_press(xevent, desktop);
|
return _event_button_press(xevent, desktop);
|
||||||
|
else if(xev->type == Expose)
|
||||||
|
return _event_expose(xevent, desktop);
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s() %d\n", __func__, xev->type);
|
||||||
|
#endif
|
||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -805,6 +875,19 @@ static GdkFilterReturn _event_button_press(XButtonEvent * xbev,
|
|||||||
return GDK_FILTER_CONTINUE;
|
return GDK_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GdkFilterReturn _event_expose(XExposeEvent * xevent, Desktop * desktop)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s() %d %d, %d %d\n", __func__,
|
||||||
|
xevent->x, xevent->y, xevent->width, xevent->height);
|
||||||
|
#endif
|
||||||
|
gdk_draw_pixbuf(desktop->root, NULL,
|
||||||
|
desktop->background, xevent->x, xevent->y,
|
||||||
|
xevent->x, xevent->y, xevent->width, xevent->height,
|
||||||
|
GDK_RGB_DITHER_NORMAL, 0, 0);
|
||||||
|
return GDK_FILTER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void _on_popup_new_folder(GtkWidget * widget, gpointer data)
|
static void _on_popup_new_folder(GtkWidget * widget, gpointer data)
|
||||||
{
|
{
|
||||||
static char const newfolder[] = "New folder";
|
static char const newfolder[] = "New folder";
|
||||||
@ -884,6 +967,7 @@ void desktop_delete(Desktop * desktop)
|
|||||||
/* useful */
|
/* useful */
|
||||||
/* desktop_error */
|
/* desktop_error */
|
||||||
static int _error_text(char const * message, int ret);
|
static int _error_text(char const * message, int ret);
|
||||||
|
|
||||||
int desktop_error(Desktop * desktop, char const * message, int ret)
|
int desktop_error(Desktop * desktop, char const * message, int ret)
|
||||||
{
|
{
|
||||||
GtkWidget * dialog;
|
GtkWidget * dialog;
|
||||||
@ -914,7 +998,16 @@ static int _error_text(char const * message, int ret)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* desktop_refresh */
|
||||||
static void _refresh_current(Desktop * desktop);
|
static void _refresh_current(Desktop * desktop);
|
||||||
|
static int _current_loop(Desktop * desktop);
|
||||||
|
static gboolean _current_idle(gpointer data);
|
||||||
|
static gboolean _current_done(Desktop * desktop);
|
||||||
|
|
||||||
|
static int _loop_lookup(Desktop * desktop, char const * name);
|
||||||
|
|
||||||
|
static gboolean _done_timeout(gpointer data);
|
||||||
|
|
||||||
void desktop_refresh(Desktop * desktop)
|
void desktop_refresh(Desktop * desktop)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
@ -948,9 +1041,6 @@ void desktop_refresh(Desktop * desktop)
|
|||||||
_refresh_current(desktop);
|
_refresh_current(desktop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _current_loop(Desktop * desktop);
|
|
||||||
static gboolean _current_idle(gpointer data);
|
|
||||||
static gboolean _current_done(Desktop * desktop);
|
|
||||||
static void _refresh_current(Desktop * desktop)
|
static void _refresh_current(Desktop * desktop)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -962,7 +1052,6 @@ static void _refresh_current(Desktop * desktop)
|
|||||||
_current_done(desktop);
|
_current_done(desktop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _loop_lookup(Desktop * desktop, char const * name);
|
|
||||||
static int _current_loop(Desktop * desktop)
|
static int _current_loop(Desktop * desktop)
|
||||||
{
|
{
|
||||||
struct dirent * de;
|
struct dirent * de;
|
||||||
@ -1024,7 +1113,6 @@ static gboolean _current_idle(gpointer data)
|
|||||||
return _current_done(desktop);
|
return _current_done(desktop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean _done_timeout(gpointer data);
|
|
||||||
static gboolean _current_done(Desktop * desktop)
|
static gboolean _current_done(Desktop * desktop)
|
||||||
{
|
{
|
||||||
size_t i = 1;
|
size_t i = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user