Bring the separate handlers on par with the original code

At least from my understanding at the moment.
This commit is contained in:
Pierre Pronchery 2020-09-26 22:20:39 +02:00
parent fd233fa9e2
commit 7979661917
6 changed files with 245 additions and 216 deletions

View File

@ -78,6 +78,7 @@ struct _Desktop
GdkRectangle workarea; GdkRectangle workarea;
/* icons */ /* icons */
DesktopAlignment alignment;
GtkIconTheme * theme; GtkIconTheme * theme;
unsigned int icons_size; unsigned int icons_size;
DesktopIconWindow ** icons; DesktopIconWindow ** icons;
@ -184,9 +185,6 @@ static void _desktop_draw_background(Desktop * desktop, GdkColor * color,
char const * filename, DesktopHows how, gboolean extend); char const * filename, DesktopHows how, gboolean extend);
#endif #endif
static int _desktop_icon_add(Desktop * desktop, DesktopIcon * icon);
static int _desktop_icon_remove(Desktop * desktop, DesktopIcon * icon);
/* callbacks */ /* callbacks */
static gboolean _desktop_on_preferences_closex(gpointer data); static gboolean _desktop_on_preferences_closex(gpointer data);
static void _desktop_on_preferences_monitors_changed(gpointer data); static void _desktop_on_preferences_monitors_changed(gpointer data);
@ -405,6 +403,7 @@ static int _on_message(void * data, uint32_t value1, uint32_t value2,
case DESKTOP_MESSAGE_SET_ALIGNMENT: case DESKTOP_MESSAGE_SET_ALIGNMENT:
alignment = value2; alignment = value2;
desktop_set_alignment(desktop, alignment); desktop_set_alignment(desktop, alignment);
desktop_icons_align(desktop);
break; break;
case DESKTOP_MESSAGE_SET_ICONS: case DESKTOP_MESSAGE_SET_ICONS:
icons = value2; icons = value2;
@ -590,8 +589,9 @@ static GdkFilterReturn _event_property(XPropertyEvent * xevent,
/* desktop_delete */ /* desktop_delete */
void desktop_delete(Desktop * desktop) void desktop_delete(Desktop * desktop)
{ {
size_t i; if(desktop->refresh_source != 0)
g_source_remove(desktop->refresh_source);
desktop_icons_remove_all(desktop);
if(desktop->handler != NULL) if(desktop->handler != NULL)
desktophandler_delete(desktop->handler); desktophandler_delete(desktop->handler);
if(desktop->folder != NULL) if(desktop->folder != NULL)
@ -602,11 +602,6 @@ void desktop_delete(Desktop * desktop)
mime_delete(desktop->mime); mime_delete(desktop->mime);
if(desktop->desktop != NULL) if(desktop->desktop != NULL)
gtk_widget_destroy(desktop->desktop); gtk_widget_destroy(desktop->desktop);
if(desktop->refresh_source != 0)
g_source_remove(desktop->refresh_source);
for(i = 0; i < desktop->icons_cnt; i++)
desktopiconwindow_delete(desktop->icons[i]);
free(desktop->icons);
if(desktop->font != NULL) if(desktop->font != NULL)
pango_font_description_free(desktop->font); pango_font_description_free(desktop->font);
object_delete(desktop); object_delete(desktop);
@ -669,6 +664,13 @@ GdkPixbuf * desktop_get_folder(Desktop * desktop)
} }
/* desktop_get_handler */
DesktopHandler * desktop_get_handler(Desktop * desktop)
{
return desktop->handler;
}
/* desktop_get_home */ /* desktop_get_home */
String const * desktop_get_home(Desktop * desktop) String const * desktop_get_home(Desktop * desktop)
{ {
@ -749,64 +751,9 @@ GtkWidget * desktop_get_window(Desktop * desktop)
/* desktop_set_alignment */ /* desktop_set_alignment */
static void _alignment_horizontal(Desktop * desktop);
static void _alignment_vertical(Desktop * desktop);
void desktop_set_alignment(Desktop * desktop, DesktopAlignment alignment) void desktop_set_alignment(Desktop * desktop, DesktopAlignment alignment)
{ {
switch(alignment) desktop->alignment = alignment;
{
case DESKTOP_ALIGNMENT_VERTICAL:
_alignment_vertical(desktop);
break;
case DESKTOP_ALIGNMENT_HORIZONTAL:
_alignment_horizontal(desktop);
break;
}
}
static void _alignment_horizontal(Desktop * desktop)
{
size_t i;
unsigned int x = desktop->workarea.x;
unsigned int y = desktop->workarea.y;
unsigned int width = x + desktop->workarea.width;
unsigned int iwidth;
unsigned int iheight;
desktop_get_icon_size(desktop, &iwidth, &iheight, NULL);
for(i = 0; i < desktop->icons_cnt; i++)
{
if(x + iwidth > width)
{
y += iheight;
x = desktop->workarea.x;
}
desktopiconwindow_move(desktop->icons[i], x, y);
x += iwidth;
}
}
static void _alignment_vertical(Desktop * desktop)
{
size_t i;
unsigned int x = desktop->workarea.x;
unsigned int y = desktop->workarea.y;
unsigned int height = desktop->workarea.y + desktop->workarea.height;
unsigned int iwidth;
unsigned int iheight;
desktop_get_icon_size(desktop, &iwidth, &iheight, NULL);
for(i = 0; i < desktop->icons_cnt; i++)
{
if(y + iheight > height)
{
x += iwidth;
y = desktop->workarea.y;
}
desktopiconwindow_move(desktop->icons[i], x, y);
y += iheight;
}
} }
@ -854,28 +801,6 @@ int desktop_set_layout(Desktop * desktop, DesktopLayout layout)
/* useful */ /* useful */
/* desktop_cleanup */
void desktop_cleanup(Desktop * desktop)
{
size_t i;
DesktopIcon * icon;
for(i = 0; i < desktop->icons_cnt;)
{
icon = desktopiconwindow_get_icon(desktop->icons[i]);
if(desktopicon_get_immutable(icon) == TRUE)
i++;
else if(desktopicon_get_updated(icon) != TRUE)
_desktop_icon_remove(desktop, icon);
else
{
desktopicon_set_updated(icon, FALSE);
i++;
}
}
}
/* desktop_error */ /* desktop_error */
int desktop_error(Desktop * desktop, char const * message, char const * error, int desktop_error(Desktop * desktop, char const * message, char const * error,
int ret) int ret)
@ -899,8 +824,6 @@ int desktop_serror(Desktop * desktop, char const * message, int ret)
/* desktop_refresh */ /* desktop_refresh */
static void _refresh_reset(Desktop * desktop);
/* callbacks */
static gboolean _refresh_on_idle(gpointer data); static gboolean _refresh_on_idle(gpointer data);
void desktop_refresh(Desktop * desktop) void desktop_refresh(Desktop * desktop)
@ -913,26 +836,18 @@ void desktop_refresh(Desktop * desktop)
desktop->refresh_source = g_idle_add(_refresh_on_idle, desktop); desktop->refresh_source = g_idle_add(_refresh_on_idle, desktop);
} }
static void _refresh_reset(Desktop * desktop)
{
size_t i;
DesktopIcon * icon;
for(i = 0; i < desktop->icons_cnt; i++)
{
icon = desktopiconwindow_get_icon(desktop->icons[i]);
desktopicon_set_immutable(icon, FALSE);
desktopicon_set_updated(icon, FALSE);
}
}
/* callbacks */
static gboolean _refresh_on_idle(gpointer data) static gboolean _refresh_on_idle(gpointer data)
{ {
Desktop * desktop = data; Desktop * desktop = data;
size_t i;
DesktopIcon * icon;
desktop->refresh_source = 0; desktop->refresh_source = 0;
_refresh_reset(desktop); for(i = 0; i < desktop->icons_cnt; i++)
{
icon = desktopiconwindow_get_icon(desktop->icons[i]);
desktopicon_set_updated(icon, FALSE);
}
desktophandler_refresh(desktop->handler); desktophandler_refresh(desktop->handler);
return FALSE; return FALSE;
} }
@ -1124,27 +1039,83 @@ static gboolean _reset_on_idle(gpointer data)
/* desktop_icon_add */ /* desktop_icon_add */
void desktop_icon_add(Desktop * desktop, DesktopIcon * icon, gboolean align) void desktop_icon_add(Desktop * desktop, DesktopIcon * icon, gboolean align)
{ {
if(_desktop_icon_add(desktop, icon) == 0 && align) DesktopIconWindow * window;
DesktopIconWindow ** p;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\", %s)\n", __func__,
desktopicon_get_name(icon),
align ? "TRUE" : "FALSE");
#endif
if((p = realloc(desktop->icons, sizeof(*p) * (desktop->icons_cnt + 1)))
== NULL)
{
desktop_perror(desktop, desktopicon_get_name(icon), 1);
return;
}
desktop->icons = p;
if((window = desktopiconwindow_new(icon)) == NULL)
{
desktop_serror(desktop, desktopicon_get_name(icon), 1);
return;
}
desktop->icons[desktop->icons_cnt++] = window;
desktopicon_set_background(icon, &desktop->background);
desktopicon_set_font(icon, desktop->font);
desktopicon_set_foreground(icon, &desktop->foreground);
if(align)
desktop_icons_align(desktop); desktop_icons_align(desktop);
desktopiconwindow_show(window);
} }
/* desktop_icon_remove */ /* desktop_icon_remove */
void desktop_icon_remove(Desktop * desktop, DesktopIcon * icon) int desktop_icon_remove(Desktop * desktop, DesktopIcon * icon, gboolean align)
{ {
if(_desktop_icon_remove(desktop, icon) == 0) size_t i;
desktop_icons_align(desktop); DesktopIcon * j;
DesktopIconWindow ** p;
for(i = 0; i < desktop->icons_cnt; i++)
{
j = desktopiconwindow_get_icon(desktop->icons[i]);
if(j != icon)
continue;
desktopiconwindow_delete(desktop->icons[i]);
for(desktop->icons_cnt--; i < desktop->icons_cnt; i++)
desktop->icons[i] = desktop->icons[i + 1];
if((p = realloc(desktop->icons, sizeof(*p)
* (desktop->icons_cnt)))
!= NULL)
desktop->icons = p; /* we can ignore errors... */
else if(desktop->icons_cnt == 0)
desktop->icons = NULL; /* ...except when it's not one */
if(align)
desktop_icons_align(desktop);
return 0;
}
return 1;
} }
/* desktop_icons_align */ /* desktop_icons_align */
static int _align_compare(const void * a, const void * b); static int _align_compare(const void * a, const void * b);
static void _align_horizontal(Desktop * desktop);
static void _align_vertical(Desktop * desktop);
void desktop_icons_align(Desktop * desktop) void desktop_icons_align(Desktop * desktop)
{ {
qsort(desktop->icons, desktop->icons_cnt, sizeof(void *), qsort(desktop->icons, desktop->icons_cnt, sizeof(void *),
_align_compare); _align_compare);
desktop_set_alignment(desktop, desktop->prefs.alignment); switch(desktop->alignment)
{
case DESKTOP_ALIGNMENT_VERTICAL:
_align_vertical(desktop);
break;
case DESKTOP_ALIGNMENT_HORIZONTAL:
_align_horizontal(desktop);
break;
}
} }
static int _align_compare(const void * a, const void * b) static int _align_compare(const void * a, const void * b)
@ -1175,6 +1146,74 @@ static int _align_compare(const void * a, const void * b)
return strcmp(desktopicon_get_name(icona), desktopicon_get_name(iconb)); return strcmp(desktopicon_get_name(icona), desktopicon_get_name(iconb));
} }
static void _align_horizontal(Desktop * desktop)
{
size_t i;
unsigned int x = desktop->workarea.x;
unsigned int y = desktop->workarea.y;
unsigned int width = x + desktop->workarea.width;
unsigned int iwidth;
unsigned int iheight;
desktop_get_icon_size(desktop, &iwidth, &iheight, NULL);
for(i = 0; i < desktop->icons_cnt; i++)
{
if(x + iwidth > width)
{
y += iheight;
x = desktop->workarea.x;
}
desktopiconwindow_move(desktop->icons[i], x, y);
x += iwidth;
}
}
static void _align_vertical(Desktop * desktop)
{
size_t i;
unsigned int x = desktop->workarea.x;
unsigned int y = desktop->workarea.y;
unsigned int height = desktop->workarea.y + desktop->workarea.height;
unsigned int iwidth;
unsigned int iheight;
desktop_get_icon_size(desktop, &iwidth, &iheight, NULL);
for(i = 0; i < desktop->icons_cnt; i++)
{
if(y + iheight > height)
{
x += iwidth;
y = desktop->workarea.y;
}
desktopiconwindow_move(desktop->icons[i], x, y);
y += iheight;
}
}
/* desktop_icons_cleanup */
void desktop_icons_cleanup(Desktop * desktop, gboolean align)
{
size_t i;
DesktopIcon * icon;
for(i = 0; i < desktop->icons_cnt;)
{
icon = desktopiconwindow_get_icon(desktop->icons[i]);
if(desktopicon_get_immutable(icon) == TRUE)
i++;
else if(desktopicon_get_updated(icon) != TRUE)
desktop_icon_remove(desktop, icon, FALSE);
else
{
desktopicon_set_updated(icon, FALSE);
i++;
}
}
if(align)
desktop_icons_align(desktop);
}
/* desktop_icons_lookup */ /* desktop_icons_lookup */
DesktopIcon * desktop_icons_lookup(Desktop * desktop, String const * name) DesktopIcon * desktop_icons_lookup(Desktop * desktop, String const * name)
@ -1199,6 +1238,19 @@ DesktopIcon * desktop_icons_lookup(Desktop * desktop, String const * name)
} }
/* desktop_icons_remove_all */
void desktop_icons_remove_all(Desktop * desktop)
{
size_t i;
for(i = 0; i < desktop->icons_cnt; i++)
desktopiconwindow_delete(desktop->icons[i]);
desktop->icons_cnt = 0;
free(desktop->icons);
desktop->icons = NULL;
}
/* desktop_select_all */ /* desktop_select_all */
void desktop_select_all(Desktop * desktop) void desktop_select_all(Desktop * desktop)
{ {
@ -2214,54 +2266,6 @@ static void _background_monitors(Desktop * desktop, char const * filename,
} }
/* desktop_icon_add */
static int _desktop_icon_add(Desktop * desktop, DesktopIcon * icon)
{
DesktopIconWindow * window;
DesktopIconWindow ** p;
if((p = realloc(desktop->icons, sizeof(*p) * (desktop->icons_cnt + 1)))
== NULL)
return -desktop_perror(desktop, desktopicon_get_name(icon), 1);
desktop->icons = p;
if((window = desktopiconwindow_new(icon)) == NULL)
return -desktop_serror(desktop, desktopicon_get_name(icon), 1);
desktop->icons[desktop->icons_cnt++] = window;
desktopicon_set_background(icon, &desktop->background);
desktopicon_set_font(icon, desktop->font);
desktopicon_set_foreground(icon, &desktop->foreground);
desktopiconwindow_show(window);
return 0;
}
/* desktop_icon_remove */
static int _desktop_icon_remove(Desktop * desktop, DesktopIcon * icon)
{
size_t i;
DesktopIcon * j;
DesktopIconWindow ** p;
for(i = 0; i < desktop->icons_cnt; i++)
{
j = desktopiconwindow_get_icon(desktop->icons[i]);
if(j != icon)
continue;
desktopiconwindow_delete(desktop->icons[i]);
for(desktop->icons_cnt--; i < desktop->icons_cnt; i++)
desktop->icons[i] = desktop->icons[i + 1];
if((p = realloc(desktop->icons, sizeof(*p)
* (desktop->icons_cnt)))
!= NULL)
desktop->icons = p; /* we can ignore errors... */
else if(desktop->icons_cnt == 0)
desktop->icons = NULL; /* ...except when it's not one */
return 0;
}
return 1;
}
/* callbacks */ /* callbacks */
/* desktop_on_preferences_closex */ /* desktop_on_preferences_closex */
static gboolean _desktop_on_preferences_closex(gpointer data) static gboolean _desktop_on_preferences_closex(gpointer data)

View File

@ -55,6 +55,7 @@ void desktop_delete(Desktop * desktop);
int desktop_get_drag_data(Desktop * desktop, GtkSelectionData * seldata); int desktop_get_drag_data(Desktop * desktop, GtkSelectionData * seldata);
GdkPixbuf * desktop_get_file(Desktop * desktop); GdkPixbuf * desktop_get_file(Desktop * desktop);
GdkPixbuf * desktop_get_folder(Desktop * desktop); GdkPixbuf * desktop_get_folder(Desktop * desktop);
DesktopHandler * desktop_get_handler(Desktop * desktop);
String const * desktop_get_home(Desktop * desktop); String const * desktop_get_home(Desktop * desktop);
void desktop_get_icon_size(Desktop * desktop, unsigned int * width, void desktop_get_icon_size(Desktop * desktop, unsigned int * width,
unsigned int * height, unsigned int * size); unsigned int * height, unsigned int * size);
@ -77,11 +78,12 @@ void desktop_refresh(Desktop * desktop);
void desktop_reset(Desktop * desktop); void desktop_reset(Desktop * desktop);
void desktop_icon_add(Desktop * desktop, DesktopIcon * icon, gboolean align); void desktop_icon_add(Desktop * desktop, DesktopIcon * icon, gboolean align);
void desktop_icon_remove(Desktop * desktop, DesktopIcon * icon); int desktop_icon_remove(Desktop * desktop, DesktopIcon * icon, gboolean align);
void desktop_cleanup(Desktop * desktop);
void desktop_icons_align(Desktop * desktop); void desktop_icons_align(Desktop * desktop);
void desktop_icons_cleanup(Desktop * desktop, gboolean align);
DesktopIcon * desktop_icons_lookup(Desktop * desktop, String const * name); DesktopIcon * desktop_icons_lookup(Desktop * desktop, String const * name);
void desktop_icons_remove_all(Desktop * desktop);
void desktop_icons_sort(Desktop * desktop); void desktop_icons_sort(Desktop * desktop);
void desktop_select_all(Desktop * desktop); void desktop_select_all(Desktop * desktop);

View File

@ -58,36 +58,42 @@ typedef struct _DesktopCategory
char const * icon; char const * icon;
} DesktopCategory; } DesktopCategory;
typedef struct _DesktopHandlerApplications
{
DIR * refresh_dir;
time_t refresh_mtime;
guint refresh_source;
GSList * apps;
DesktopCategory * category;
} DesktopHandlerApplications;
typedef struct _DesktopHandlerCategories
{
DIR * refresh_dir;
time_t refresh_mtime;
guint refresh_source;
GSList * apps;
} DesktopHandlerCategories;
typedef struct _DesktopHandlerFiles
{
char * path;
DIR * refresh_dir;
time_t refresh_mtime;
guint refresh_source;
gboolean show_hidden;
GtkWidget * menu;
} DesktopHandlerFiles;
struct _DesktopHandler struct _DesktopHandler
{ {
Desktop * desktop; Desktop * desktop;
DesktopIcons icons; DesktopIcons icons;
union union
{ {
struct DesktopHandlerApplications applications;
{ DesktopHandlerCategories categories;
char * path; DesktopHandlerFiles files;
DIR * refresh_dir;
time_t refresh_mtime;
guint refresh_source;
gboolean show_hidden;
GtkWidget * menu;
} files;
struct
{
DIR * refresh_dir;
time_t refresh_mtime;
guint refresh_source;
DesktopCategory * category;
GSList * apps;
} applications;
struct
{
DIR * refresh_dir;
time_t refresh_mtime;
guint refresh_source;
GSList * apps;
} categories;
} u; } u;
}; };
@ -104,24 +110,6 @@ struct _DesktopHandler
#define IDLE_LOOP_ICON_CNT 16 /* number of icons added in a loop */ #define IDLE_LOOP_ICON_CNT 16 /* number of icons added in a loop */
static DesktopCategory _desktop_categories[] =
{
{ FALSE, "Audio", N_("Audio"), "gnome-mime-audio", },
{ FALSE, "Development", N_("Development"),"applications-development"},
{ FALSE, "Education", N_("Education"),"applications-science" },
{ FALSE, "Game", N_("Games"), "applications-games" },
{ FALSE, "Graphics", N_("Graphics"), "applications-graphics" },
{ FALSE, "AudioVideo", N_("Multimedia"),"applications-multimedia"},
{ FALSE, "Network", N_("Network"), "applications-internet" },
{ FALSE, "Office", N_("Office"), "applications-office" },
{ FALSE, "Settings", N_("Settings"), "gnome-settings" },
{ FALSE, "System", N_("System"), "applications-system" },
{ FALSE, "Utility", N_("Utilities"),"applications-utilities"},
{ FALSE, "Video", N_("Video"), "video" }
};
static const size_t _desktop_categories_cnt = sizeof(_desktop_categories)
/ sizeof(*_desktop_categories);
#include "handler/applications.c" #include "handler/applications.c"
#include "handler/categories.c" #include "handler/categories.c"
@ -161,7 +149,7 @@ void desktophandler_set_icons(DesktopHandler * handler, DesktopIcons icons)
{ {
if(handler->icons != icons) if(handler->icons != icons)
{ {
desktop_cleanup(handler->desktop); desktop_icons_remove_all(handler->desktop);
_set_icons_destroy(handler); _set_icons_destroy(handler);
handler->icons = icons; handler->icons = icons;
_set_icons_init(handler); _set_icons_init(handler);

View File

@ -48,15 +48,17 @@ static void _desktophandler_applications_init(DesktopHandler * handler)
handler->u.applications.refresh_dir = NULL; handler->u.applications.refresh_dir = NULL;
handler->u.applications.refresh_mtime = 0; handler->u.applications.refresh_mtime = 0;
handler->u.applications.refresh_source = 0; handler->u.applications.refresh_source = 0;
handler->u.applications.category = NULL;
handler->u.applications.apps = NULL; handler->u.applications.apps = NULL;
handler->u.applications.category = NULL;
desktop_set_alignment(handler->desktop, DESKTOP_ALIGNMENT_HORIZONTAL);
if((desktopicon = desktopicon_new(handler->desktop, _("Back"), NULL)) if((desktopicon = desktopicon_new(handler->desktop, _("Back"), NULL))
== NULL) == NULL)
{ {
desktop_serror(handler->desktop, _("Back"), 1); desktop_serror(handler->desktop, _("Back"), 1);
return; return;
} }
desktopicon_set_callback(desktopicon, _applications_init_on_back, NULL); desktopicon_set_callback(desktopicon, _applications_init_on_back,
handler);
desktopicon_set_first(desktopicon, TRUE); desktopicon_set_first(desktopicon, TRUE);
desktopicon_set_immutable(desktopicon, TRUE); desktopicon_set_immutable(desktopicon, TRUE);
desktop_get_icon_size(handler->desktop, NULL, NULL, &size); desktop_get_icon_size(handler->desktop, NULL, NULL, &size);
@ -69,12 +71,13 @@ static void _desktophandler_applications_init(DesktopHandler * handler)
static void _applications_init_on_back(Desktop * desktop, gpointer data) static void _applications_init_on_back(Desktop * desktop, gpointer data)
{ {
(void) data; DesktopHandler * handler = data;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
desktop_set_icons(desktop, DESKTOP_ICONS_HOMESCREEN); desktop_set_icons(desktop, (handler->u.applications.category != NULL)
? DESKTOP_ICONS_CATEGORIES : DESKTOP_ICONS_HOMESCREEN);
} }
@ -88,6 +91,7 @@ static void _desktophandler_applications_destroy(DesktopHandler * handler)
g_slist_foreach(handler->u.applications.apps, (GFunc)mimehandler_delete, g_slist_foreach(handler->u.applications.apps, (GFunc)mimehandler_delete,
NULL); NULL);
g_slist_free(handler->u.applications.apps); g_slist_free(handler->u.applications.apps);
handler->u.applications.apps = NULL;
} }
@ -149,8 +153,7 @@ static gboolean _applications_on_refresh_done(DesktopHandler * handler)
{ {
handler->u.applications.refresh_source = 0; handler->u.applications.refresh_source = 0;
_applications_on_refresh_done_applications(handler); _applications_on_refresh_done_applications(handler);
desktop_cleanup(handler->desktop); desktop_icons_cleanup(handler->desktop, TRUE);
desktop_icons_align(handler->desktop);
return FALSE; return FALSE;
} }

View File

@ -27,6 +27,26 @@
/* DesktopHandlerCategories */ /* DesktopHandlerCategories */
/* private */ /* private */
/* variables */
static DesktopCategory _desktop_categories[] =
{
{ FALSE, "Audio", N_("Audio"), "gnome-mime-audio", },
{ FALSE, "Development", N_("Development"),"applications-development"},
{ FALSE, "Education", N_("Education"),"applications-science" },
{ FALSE, "Game", N_("Games"), "applications-games" },
{ FALSE, "Graphics", N_("Graphics"), "applications-graphics" },
{ FALSE, "AudioVideo", N_("Multimedia"),"applications-multimedia"},
{ FALSE, "Network", N_("Network"), "applications-internet" },
{ FALSE, "Office", N_("Office"), "applications-office" },
{ FALSE, "Settings", N_("Settings"), "gnome-settings" },
{ FALSE, "System", N_("System"), "applications-system" },
{ FALSE, "Utility", N_("Utilities"),"applications-utilities"},
{ FALSE, "Video", N_("Video"), "video" }
};
static const size_t _desktop_categories_cnt = sizeof(_desktop_categories)
/ sizeof(*_desktop_categories);
/* prototypes */ /* prototypes */
static void _desktophandler_categories_init(DesktopHandler * handler); static void _desktophandler_categories_init(DesktopHandler * handler);
static void _desktophandler_categories_destroy(DesktopHandler * handler); static void _desktophandler_categories_destroy(DesktopHandler * handler);
@ -49,6 +69,7 @@ static void _desktophandler_categories_init(DesktopHandler * handler)
handler->u.categories.refresh_mtime = 0; handler->u.categories.refresh_mtime = 0;
handler->u.categories.refresh_source = 0; handler->u.categories.refresh_source = 0;
handler->u.categories.apps = NULL; handler->u.categories.apps = NULL;
desktop_set_alignment(handler->desktop, DESKTOP_ALIGNMENT_HORIZONTAL);
if((desktopicon = desktopicon_new(handler->desktop, _("Back"), NULL)) if((desktopicon = desktopicon_new(handler->desktop, _("Back"), NULL))
== NULL) == NULL)
{ {
@ -153,8 +174,7 @@ static gboolean _categories_on_refresh_done(DesktopHandler * handler)
{ {
handler->u.categories.refresh_source = 0; handler->u.categories.refresh_source = 0;
_categories_on_refresh_done_categories(handler); _categories_on_refresh_done_categories(handler);
desktop_cleanup(handler->desktop); desktop_icons_cleanup(handler->desktop, TRUE);
desktop_icons_align(handler->desktop);
return FALSE; return FALSE;
} }
@ -219,12 +239,16 @@ static void _categories_on_refresh_done_categories_open(Desktop * desktop,
gpointer data) gpointer data)
{ {
DesktopCategory * dc = data; DesktopCategory * dc = data;
DesktopHandler * handler;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, _(dc->name)); fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, _(dc->name));
#endif #endif
/* FIXME need an extra argument for applications (category) */ handler = desktop_get_handler(desktop);
desktop_set_icons(desktop, DESKTOP_ICONS_APPLICATIONS); desktophandler_set_icons(handler, DESKTOP_ICONS_APPLICATIONS);
/* FIXME really need an extra argument for applications (category) */
handler->u.applications.category = dc;
desktop_refresh(desktop);
} }
static int _categories_on_refresh_loop(DesktopHandler * handler) static int _categories_on_refresh_loop(DesktopHandler * handler)

View File

@ -54,6 +54,7 @@ static void _desktophandler_files_init(DesktopHandler * handler)
handler->u.files.refresh_mtime = 0; handler->u.files.refresh_mtime = 0;
handler->u.files.refresh_source = 0; handler->u.files.refresh_source = 0;
handler->u.files.menu = NULL; handler->u.files.menu = NULL;
desktop_set_alignment(handler->desktop, DESKTOP_ALIGNMENT_VERTICAL);
/* FIXME let it be configured again */ /* FIXME let it be configured again */
handler->u.files.show_hidden = FALSE; handler->u.files.show_hidden = FALSE;
/* check for errors */ /* check for errors */
@ -266,6 +267,8 @@ static int _files_on_refresh_loop_opendir(DesktopHandler * handler);
static void _desktophandler_files_refresh(DesktopHandler * handler) static void _desktophandler_files_refresh(DesktopHandler * handler)
{ {
if(handler->u.files.refresh_source != 0)
g_source_remove(handler->u.files.refresh_source);
if(handler->u.files.refresh_dir != NULL) if(handler->u.files.refresh_dir != NULL)
browser_vfs_closedir(handler->u.files.refresh_dir); browser_vfs_closedir(handler->u.files.refresh_dir);
handler->u.files.refresh_dir = NULL; handler->u.files.refresh_dir = NULL;
@ -293,11 +296,10 @@ static gboolean _desktophandler_files_on_refresh(gpointer data)
static gboolean _files_on_refresh_done(DesktopHandler * handler) static gboolean _files_on_refresh_done(DesktopHandler * handler)
{ {
desktop_cleanup(handler->desktop);
if(handler->u.files.refresh_dir != NULL) if(handler->u.files.refresh_dir != NULL)
browser_vfs_closedir(handler->u.files.refresh_dir); browser_vfs_closedir(handler->u.files.refresh_dir);
handler->u.files.refresh_dir = NULL; handler->u.files.refresh_dir = NULL;
desktop_icons_align(handler->desktop); desktop_icons_cleanup(handler->desktop, TRUE);
handler->u.files.refresh_source = g_timeout_add(1000, handler->u.files.refresh_source = g_timeout_add(1000,
_files_on_refresh_done_timeout, handler); _files_on_refresh_done_timeout, handler);
return FALSE; return FALSE;
@ -308,13 +310,19 @@ static gboolean _files_on_refresh_done_timeout(gpointer data)
DesktopHandler * handler = data; DesktopHandler * handler = data;
struct stat st; struct stat st;
handler->u.files.refresh_source = 0;
if(handler->u.files.path == NULL) if(handler->u.files.path == NULL)
{
handler->u.files.refresh_source = 0;
return FALSE; return FALSE;
}
if(browser_vfs_stat(handler->u.files.path, &st) != 0) if(browser_vfs_stat(handler->u.files.path, &st) != 0)
{
handler->u.files.refresh_source = 0;
return desktop_perror(NULL, handler->u.files.path, FALSE); return desktop_perror(NULL, handler->u.files.path, FALSE);
}
if(st.st_mtime == handler->u.files.refresh_mtime) if(st.st_mtime == handler->u.files.refresh_mtime)
return TRUE; return TRUE;
handler->u.files.refresh_source = 0;
desktop_refresh(handler->desktop); desktop_refresh(handler->desktop);
return FALSE; return FALSE;
} }