262 | 262 |
return TRUE;
|
263 | 263 |
}
|
264 | 264 |
|
265 | |
static gboolean
|
|
265 |
static DesktopEntryResultCode
|
266 | 266 |
desktop_entry_load (DesktopEntry *entry)
|
267 | 267 |
{
|
268 | 268 |
if (strstr (entry->path, "/menu-xdg/"))
|
269 | |
return FALSE;
|
|
269 |
return DESKTOP_ENTRY_LOAD_FAIL_OTHER;
|
270 | 270 |
if (entry->type == DESKTOP_ENTRY_DESKTOP)
|
271 | 271 |
{
|
272 | 272 |
GKeyFile *key_file = NULL;
|
|
279 | 279 |
!g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo)))
|
280 | 280 |
{
|
281 | 281 |
menu_verbose ("Failed to load \"%s\"\n", entry->path);
|
282 | |
return FALSE;
|
|
282 |
return DESKTOP_ENTRY_LOAD_FAIL_APPINFO;
|
283 | 283 |
}
|
284 | 284 |
|
285 | 285 |
categories_str = g_desktop_app_info_get_categories (entry_desktop->appinfo);
|
|
306 | 306 |
|
307 | 307 |
g_key_file_free (key_file);
|
308 | 308 |
|
309 | |
return TRUE;
|
|
309 |
return DESKTOP_ENTRY_LOAD_SUCCESS;
|
310 | 310 |
}
|
311 | 311 |
else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
|
312 | 312 |
{
|
313 | 313 |
GKeyFile *key_file = NULL;
|
314 | 314 |
GError *error = NULL;
|
315 | |
gboolean retval = FALSE;
|
|
315 |
DesktopEntryResultCode rescode = DESKTOP_ENTRY_LOAD_SUCCESS;
|
316 | 316 |
|
317 | 317 |
key_file = g_key_file_new ();
|
318 | 318 |
|
319 | 319 |
if (!g_key_file_load_from_file (key_file, entry->path, 0, &error))
|
320 | |
goto out;
|
|
320 |
{
|
|
321 |
rescode = DESKTOP_ENTRY_LOAD_FAIL_OTHER;
|
|
322 |
goto out;
|
|
323 |
}
|
321 | 324 |
|
322 | 325 |
if (!desktop_entry_load_directory (entry, key_file, &error))
|
323 | |
goto out;
|
324 | |
|
325 | |
retval = TRUE;
|
|
326 |
{
|
|
327 |
rescode = DESKTOP_ENTRY_LOAD_FAIL_OTHER;
|
|
328 |
goto out;
|
|
329 |
}
|
|
330 |
|
|
331 |
rescode = DESKTOP_ENTRY_LOAD_SUCCESS;
|
326 | 332 |
|
327 | 333 |
out:
|
328 | 334 |
g_key_file_free (key_file);
|
329 | 335 |
|
330 | |
if (!retval)
|
|
336 |
if (rescode == DESKTOP_ENTRY_LOAD_FAIL_OTHER)
|
331 | 337 |
{
|
332 | 338 |
if (error)
|
333 | 339 |
{
|
|
338 | 344 |
menu_verbose ("Failed to load \"%s\"\n", entry->path);
|
339 | 345 |
}
|
340 | 346 |
|
341 | |
return retval;
|
|
347 |
return rescode;
|
342 | 348 |
}
|
343 | 349 |
else
|
344 | 350 |
g_assert_not_reached ();
|
345 | 351 |
|
346 | |
return FALSE;
|
|
352 |
return DESKTOP_ENTRY_LOAD_FAIL_OTHER;
|
|
353 |
}
|
|
354 |
|
|
355 |
static gboolean
|
|
356 |
code_failed (DesktopEntryResultCode code)
|
|
357 |
{
|
|
358 |
return code == DESKTOP_ENTRY_LOAD_FAIL_OTHER ||
|
|
359 |
code == DESKTOP_ENTRY_LOAD_FAIL_APPINFO;
|
347 | 360 |
}
|
348 | 361 |
|
349 | 362 |
DesktopEntry *
|
350 | |
desktop_entry_new (const char *path)
|
|
363 |
desktop_entry_new (const char *path,
|
|
364 |
DesktopEntryResultCode *res_code)
|
351 | 365 |
{
|
352 | 366 |
DesktopEntryType type;
|
353 | 367 |
DesktopEntry *retval;
|
|
368 |
DesktopEntryResultCode code;
|
354 | 369 |
|
355 | 370 |
menu_verbose ("Loading desktop entry \"%s\"\n", path);
|
356 | 371 |
|
|
368 | 383 |
{
|
369 | 384 |
menu_verbose ("Unknown desktop entry suffix in \"%s\"\n",
|
370 | 385 |
path);
|
|
386 |
*res_code = DESKTOP_ENTRY_LOAD_FAIL_OTHER;
|
371 | 387 |
return NULL;
|
372 | 388 |
}
|
373 | 389 |
|
|
376 | 392 |
retval->path = g_strdup (path);
|
377 | 393 |
retval->basename = unix_basename_from_path (retval->path);
|
378 | 394 |
|
379 | |
if (!desktop_entry_load (retval))
|
|
395 |
code = desktop_entry_load (retval);
|
|
396 |
*res_code = code;
|
|
397 |
|
|
398 |
if (code_failed (code))
|
380 | 399 |
{
|
381 | 400 |
desktop_entry_unref (retval);
|
382 | 401 |
return NULL;
|
|
418 | 437 |
else
|
419 | 438 |
g_assert_not_reached ();
|
420 | 439 |
|
421 | |
if (!desktop_entry_load (entry))
|
|
440 |
if (code_failed (desktop_entry_load (entry)))
|
422 | 441 |
{
|
423 | 442 |
desktop_entry_unref (entry);
|
424 | 443 |
return NULL;
|