diff --git a/libmenu/desktop-entries.c b/libmenu/desktop-entries.c index 0513c52..bf59f8a 100644 --- a/libmenu/desktop-entries.c +++ b/libmenu/desktop-entries.c @@ -275,9 +275,7 @@ const char *categories_str; entry_desktop->appinfo = g_desktop_app_info_new_from_filename (entry->path); - if (!entry_desktop->appinfo || - !g_app_info_get_name (G_APP_INFO (entry_desktop->appinfo)) || - !g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo))) + if (!G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)) { menu_verbose ("Failed to load \"%s\"\n", entry->path); return DESKTOP_ENTRY_LOAD_FAIL_APPINFO; @@ -573,7 +571,11 @@ desktop_entry_get_name (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - return g_app_info_get_name (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)); + { + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo), NULL); + return g_app_info_get_name (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)); + } + return ((DesktopEntryDirectory*)entry)->name; } @@ -581,7 +583,11 @@ desktop_entry_get_generic_name (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - return g_desktop_app_info_get_generic_name (((DesktopEntryDesktop*)entry)->appinfo); + { + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo), NULL); + return g_desktop_app_info_get_generic_name (((DesktopEntryDesktop*)entry)->appinfo); + } + return ((DesktopEntryDirectory*)entry)->generic_name; } @@ -589,7 +595,11 @@ desktop_entry_get_comment (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - return g_app_info_get_description (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)); + { + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo), NULL); + return g_app_info_get_description (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)); + } + return ((DesktopEntryDirectory*)entry)->comment; } @@ -597,7 +607,11 @@ desktop_entry_get_icon (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - return g_app_info_get_icon (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)); + { + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo), NULL); + return g_app_info_get_icon (G_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo)); + } + return ((DesktopEntryDirectory*)entry)->icon; } @@ -605,7 +619,11 @@ desktop_entry_get_no_display (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - return g_desktop_app_info_get_nodisplay (((DesktopEntryDesktop*)entry)->appinfo); + { + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo), FALSE); + return g_desktop_app_info_get_nodisplay (((DesktopEntryDesktop*)entry)->appinfo); + } + return ((DesktopEntryDirectory*)entry)->nodisplay; } @@ -613,7 +631,11 @@ desktop_entry_get_hidden (DesktopEntry *entry) { if (entry->type == DESKTOP_ENTRY_DESKTOP) - return g_desktop_app_info_get_is_hidden (((DesktopEntryDesktop*)entry)->appinfo); + { + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (((DesktopEntryDesktop*)entry)->appinfo), FALSE); + return g_desktop_app_info_get_is_hidden (((DesktopEntryDesktop*)entry)->appinfo); + } + return ((DesktopEntryDirectory*)entry)->hidden; } diff --git a/libmenu/entry-directories.c b/libmenu/entry-directories.c index 9d83c86..6c18e03 100644 --- a/libmenu/entry-directories.c +++ b/libmenu/entry-directories.c @@ -353,9 +353,9 @@ if (strcmp (desktop_entry_get_basename (tmp->data), basename) == 0) { if (!desktop_entry_reload (tmp->data)) - { - dir->entries = g_slist_delete_link (dir->entries, tmp); - } + { + dir->entries = g_slist_delete_link (dir->entries, tmp); + } return TRUE; } @@ -363,7 +363,7 @@ tmp = tmp->next; } - return cached_dir_add_entry (dir, basename, path); + return FALSE; } static gboolean @@ -520,10 +520,12 @@ cached_dir_queue_monitor_event (dir->parent); } - if (monitors_idle_handler == 0) - { - monitors_idle_handler = g_idle_add ((GSourceFunc) emit_monitors_in_idle, NULL); - } + if (monitors_idle_handler > 0) + { + g_source_remove (monitors_idle_handler); + } + + monitors_idle_handler = g_timeout_add (100, (GSourceFunc) emit_monitors_in_idle, NULL); } static void @@ -550,6 +552,8 @@ switch (event) { case MENU_MONITOR_EVENT_CREATED: + handled = cached_dir_add_entry (dir, basename, path); + break; case MENU_MONITOR_EVENT_CHANGED: handled = cached_dir_update_entry (dir, basename, path); break; diff --git a/libmenu/menu-monitor.c b/libmenu/menu-monitor.c index 8895b49..30b605c 100644 --- a/libmenu/menu-monitor.c +++ b/libmenu/menu-monitor.c @@ -146,10 +146,12 @@ { pending_events = g_slist_append (pending_events, event_info); - if (events_idle_handler == 0) - { - events_idle_handler = g_idle_add ((GSourceFunc) emit_events_in_idle, NULL); - } + if (events_idle_handler > 0) + { + g_source_remove (events_idle_handler); + } + + events_idle_handler = g_timeout_add (100, (GSourceFunc) emit_events_in_idle, NULL); } static inline char *