187
184
g_slist_free (dialog->add_icon_paths);
188
185
dialog->add_icon_paths = NULL;
190
g_free (dialog->icon_path);
191
dialog->icon_path = NULL;
188
g_object_unref (dialog->gicon);
189
dialog->gicon = NULL;
192
191
g_free (dialog->desktop_path);
193
192
dialog->desktop_path = NULL;
194
193
g_free (dialog->item_name);
195
194
dialog->item_name = NULL;
197
if (dialog->add_icons_idle_id)
198
g_source_remove (dialog->add_icons_idle_id);
199
dialog->add_icons_idle_id = 0;
201
196
if (dialog->add_items_idle_id)
202
197
g_source_remove (dialog->add_items_idle_id);
203
198
dialog->add_items_idle_id = 0;
224
219
g_completion_free (dialog->completion);
225
220
dialog->completion = NULL;
227
panel_run_dialog_disconnect_pixmap (dialog);
229
222
if (dialog->run_settings)
230
223
g_object_unref (dialog->run_settings);
231
224
dialog->run_settings = NULL;
262
252
panel_run_dialog_set_icon (PanelRunDialog *dialog,
263
const char *icon_path,
266
GdkPixbuf *pixbuf = NULL;
268
if (!force && icon_path && dialog->icon_path &&
269
!strcmp (icon_path, dialog->icon_path))
256
if (!force && gicon && dialog->gicon &&
257
gicon == dialog->gicon)
272
g_free (dialog->icon_path);
273
dialog->icon_path = NULL;
277
GtkSettings *settings;
280
screen = gtk_widget_get_screen (GTK_WIDGET (dialog->pixmap));
281
settings = gtk_settings_get_for_screen (screen);
282
gtk_icon_size_lookup_for_settings (settings,
283
GTK_ICON_SIZE_DIALOG,
286
pixbuf = panel_load_icon (gtk_icon_theme_get_default (),
295
dialog->icon_path = g_strdup (icon_path);
297
/* Don't bother scaling the image if it's too small.
298
* Scaled looks worse than a smaller image.
300
gtk_image_set_from_pixbuf (GTK_IMAGE (dialog->pixmap), pixbuf);
302
//FIXME: it'd be better to set an icon of the correct size,
303
//(ditto for the drag icon?)
304
gtk_window_set_icon (GTK_WINDOW (dialog->run_dialog), pixbuf);
306
gtk_drag_source_set_icon_pixbuf (dialog->run_dialog, pixbuf);
307
g_object_unref (pixbuf);
261
g_object_unref (dialog->gicon);
262
dialog->gicon = NULL;
265
dialog->gicon = g_object_ref (gicon);
266
gtk_image_set_from_gicon (GTK_IMAGE (dialog->pixmap),
267
gicon, GTK_ICON_SIZE_DIALOG);
268
gtk_drag_source_set_icon_gicon (dialog->run_dialog, gicon);
309
270
panel_run_dialog_set_default_icon (dialog, TRUE);
675
636
char *exec = NULL;
677
637
char *name = NULL;
678
638
char *comment = NULL;
680
641
gtk_tree_model_get (model, &iter,
682
COLUMN_ICON_FILE, &icon,
684
COLUMN_COMMENT, &comment,
645
COLUMN_COMMENT, &comment,
687
648
if (!fuzzy && exec && icon &&
688
649
fuzzy_command_match (text, exec, &fuzzy)) {
651
g_object_unref (found_icon);
690
652
g_free (found_name);
692
found_icon = g_strdup (icon);
654
found_icon = g_object_ref (icon);
693
655
found_name = g_strdup (name);
695
657
gtk_list_store_set (dialog->program_list_store,
727
689
panel_run_dialog_set_icon (dialog, found_icon, FALSE);
728
690
//FIXME update dialog->program_label
693
g_object_unref (found_icon);
733
696
g_free (dialog->item_name);
741
panel_run_dialog_add_icon_idle (PanelRunDialog *dialog)
748
gboolean long_operation = FALSE;
751
if (!dialog->add_icon_paths) {
752
dialog->add_icons_idle_id = 0;
756
path = dialog->add_icon_paths->data;
757
dialog->add_icon_paths->data = NULL;
758
dialog->add_icon_paths = g_slist_delete_link (dialog->add_icon_paths,
759
dialog->add_icon_paths);
761
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (dialog->program_list_store),
764
gtk_tree_path_free (path);
768
gtk_tree_path_free (path);
770
gtk_tree_model_get (GTK_TREE_MODEL (dialog->program_list_store), &iter,
771
COLUMN_ICON_FILE, &file, -1);
773
if (!gtk_icon_size_lookup (panel_menu_icon_get_size (), NULL, &icon_height)) {
774
icon_height = PANEL_DEFAULT_MENU_ICON_SIZE;
777
pixbuf = panel_make_menu_icon (gtk_icon_theme_get_default (), file, NULL, icon_height, &long_operation);
779
gtk_list_store_set (dialog->program_list_store, &iter, COLUMN_ICON, pixbuf, -1);
780
g_object_unref (pixbuf);
784
/* don't go back into the main loop if this wasn't very hard to do */
785
} while (!long_operation);
791
704
compare_applications (GMenuTreeEntry *a,
792
705
GMenuTreeEntry *b)
794
return g_utf8_collate (gmenu_tree_entry_get_display_name (a),
795
gmenu_tree_entry_get_display_name (b));
707
return g_utf8_collate (g_app_info_get_display_name ((GAppInfo*)(gmenu_tree_entry_get_app_info (a))),
708
g_app_info_get_display_name ((GAppInfo*)(gmenu_tree_entry_get_app_info (b))));
798
711
static GSList *get_all_applications_from_dir (GMenuTreeDirectory *directory,
802
715
get_all_applications_from_alias (GMenuTreeAlias *alias,
805
GMenuTreeItem *aliased_item;
807
aliased_item = gmenu_tree_alias_get_item (alias);
809
switch (gmenu_tree_item_get_type (aliased_item)) {
718
switch (gmenu_tree_alias_get_aliased_item_type (alias)) {
810
719
case GMENU_TREE_ITEM_ENTRY:
811
list = g_slist_append (list, gmenu_tree_item_ref (aliased_item));
720
/* pass on the reference */
721
list = g_slist_append (list, gmenu_tree_alias_get_aliased_entry (alias));
814
case GMENU_TREE_ITEM_DIRECTORY:
815
list = get_all_applications_from_dir (GMENU_TREE_DIRECTORY (aliased_item),
724
case GMENU_TREE_ITEM_DIRECTORY: {
725
GMenuTreeDirectory *directory = gmenu_tree_alias_get_aliased_directory (alias);
726
list = get_all_applications_from_dir (directory, list);
727
gmenu_tree_item_unref (directory);
823
gmenu_tree_item_unref (aliased_item);
829
739
get_all_applications_from_dir (GMenuTreeDirectory *directory,
835
items = gmenu_tree_directory_get_contents (directory);
837
for (l = items; l; l = l->next) {
838
switch (gmenu_tree_item_get_type (l->data)) {
743
GMenuTreeItemType next_type;
745
iter = gmenu_tree_directory_iter (directory);
747
while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID) {
839
749
case GMENU_TREE_ITEM_ENTRY:
840
list = g_slist_append (list, gmenu_tree_item_ref (l->data));
843
case GMENU_TREE_ITEM_DIRECTORY:
844
list = get_all_applications_from_dir (l->data, list);
847
case GMENU_TREE_ITEM_ALIAS:
848
list = get_all_applications_from_alias (l->data, list);
750
list = g_slist_append (list, gmenu_tree_iter_get_entry (iter));
753
case GMENU_TREE_ITEM_DIRECTORY: {
754
GMenuTreeDirectory *dir = gmenu_tree_iter_get_directory (iter);
755
list = get_all_applications_from_dir (dir, list);
756
gmenu_tree_item_unref (dir);
760
case GMENU_TREE_ITEM_ALIAS: {
761
GMenuTreeAlias *alias = gmenu_tree_iter_get_alias (iter);
762
list = get_all_applications_from_alias (alias, list);
763
gmenu_tree_item_unref (alias);
855
gmenu_tree_item_unref (l->data);
858
g_slist_free (items);
772
gmenu_tree_iter_unref (iter);
867
781
GMenuTreeDirectory *root;
870
tree = gmenu_tree_lookup ("applications.menu", GMENU_TREE_FLAGS_NONE);
871
gmenu_tree_set_sort_key (tree, GMENU_TREE_SORT_DISPLAY_NAME);
784
tree = gmenu_tree_new ("applications.menu", GMENU_TREE_FLAGS_SORT_DISPLAY_NAME);
786
if (!gmenu_tree_load_sync (tree, NULL))
873
789
root = gmenu_tree_get_root_directory (tree);
875
791
retval = get_all_applications_from_dir (root, NULL);
877
793
gmenu_tree_item_unref (root);
878
gmenu_tree_unref (tree);
794
g_object_unref (tree);
880
796
retval = g_slist_sort (retval,
881
797
(GCompareFunc) compare_applications);
909
824
/* Strip duplicates */
910
825
prev_name = NULL;
911
826
for (l = all_applications; l; l = next) {
912
GMenuTreeEntry *entry = l->data;
913
const char *entry_name;
827
GMenuTreeEntry *entry = l->data;
828
const char *entry_name;
829
GDesktopAppInfo *app_info;
833
app_info = gmenu_tree_entry_get_app_info (entry);
917
entry_name = gmenu_tree_entry_get_display_name (entry);
835
entry_name = g_app_info_get_display_name (G_APP_INFO (app_info));
918
836
if (prev_name && entry_name && strcmp (entry_name, prev_name) == 0) {
919
837
gmenu_tree_item_unref (entry);
927
845
for (l = all_applications; l; l = l->next) {
928
846
GMenuTreeEntry *entry = l->data;
851
app_info = G_APP_INFO (gmenu_tree_entry_get_app_info (entry));
932
853
gtk_list_store_append (dialog->program_list_store, &iter);
933
854
gtk_list_store_set (dialog->program_list_store, &iter,
935
COLUMN_ICON_FILE, gmenu_tree_entry_get_icon (entry),
936
COLUMN_NAME, gmenu_tree_entry_get_display_name (entry),
937
COLUMN_COMMENT, gmenu_tree_entry_get_comment (entry),
938
COLUMN_EXEC, gmenu_tree_entry_get_exec (entry),
939
COLUMN_PATH, gmenu_tree_entry_get_desktop_file_path (entry),
940
COLUMN_VISIBLE, TRUE,
855
COLUMN_ICON, g_app_info_get_icon (app_info),
856
COLUMN_NAME, g_app_info_get_display_name (app_info),
857
COLUMN_COMMENT, g_app_info_get_description (app_info),
858
COLUMN_EXEC, g_app_info_get_executable (app_info),
859
COLUMN_PATH, gmenu_tree_entry_get_desktop_file_path (entry),
860
COLUMN_VISIBLE, TRUE,
943
863
path = gtk_tree_model_get_path (GTK_TREE_MODEL (dialog->program_list_store), &iter);
963
883
column = gtk_tree_view_column_new ();
964
884
gtk_tree_view_column_pack_start (column, renderer, FALSE);
965
885
gtk_tree_view_column_set_attributes (column, renderer,
966
"pixbuf", COLUMN_ICON,
886
"gicon", COLUMN_ICON,
969
889
renderer = gtk_cell_renderer_text_new ();
977
897
dialog->add_icon_paths = g_slist_reverse (dialog->add_icon_paths);
979
if (!dialog->add_icons_idle_id)
980
dialog->add_icons_idle_id =
981
g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc) panel_run_dialog_add_icon_idle,
984
899
dialog->add_items_idle_id = 0;
1090
1005
temp = panel_key_file_get_locale_string (key_file, "Icon");
1091
panel_run_dialog_set_icon (dialog, temp, FALSE);
1006
if (!PANEL_GLIB_STR_EMPTY (temp)) {
1009
stripped = panel_xdg_icon_remove_extension (temp);
1010
gicon = g_themed_icon_new (stripped);
1011
panel_run_dialog_set_icon (dialog, gicon, FALSE);
1012
g_object_unref (gicon);
1015
panel_run_dialog_set_icon (dialog, NULL, FALSE);
1094
1019
temp = panel_key_file_get_locale_string (key_file, "Comment");
1815
1741
panel_key_file_set_boolean (key_file, "Terminal",
1816
1742
gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->terminal_checkbox)));
1818
if (dialog->icon_path)
1746
icon = panel_util_get_icon_name_from_g_icon (dialog->gicon);
1819
1748
panel_key_file_set_locale_string (key_file, "Icon",
1822
1752
panel_key_file_set_locale_string (key_file, "Icon",
1823
1753
PANEL_ICON_LAUNCHER);
1865
panel_run_dialog_style_updated (GtkWidget *widget,
1866
PanelRunDialog *dialog)
1868
if (dialog->icon_path) {
1871
icon_path = g_strdup (dialog->icon_path);
1872
panel_run_dialog_set_icon (dialog, icon_path, TRUE);
1878
panel_run_dialog_screen_changed (GtkWidget *widget,
1879
GdkScreen *prev_screen,
1880
PanelRunDialog *dialog)
1882
if (dialog->icon_path) {
1885
icon_path = g_strdup (dialog->icon_path);
1886
panel_run_dialog_set_icon (dialog, icon_path, TRUE);
1892
1795
panel_run_dialog_setup_pixmap (PanelRunDialog *dialog,
1893
1796
GtkBuilder *gui)
1895
1798
dialog->pixmap = PANEL_GTK_BUILDER_GET (gui, "icon_pixmap");
1897
g_signal_connect (dialog->pixmap, "style-updated",
1898
G_CALLBACK (panel_run_dialog_style_updated),
1900
g_signal_connect (dialog->pixmap, "screen-changed",
1901
G_CALLBACK (panel_run_dialog_screen_changed),
1904
1800
g_signal_connect (dialog->run_dialog, "drag_data_get",
1905
1801
G_CALLBACK (pixmap_drag_data_get),
1934
1830
panel_run_dialog_setup_program_list (dialog, gui);
1935
1831
panel_run_dialog_setup_list_expander (dialog, gui);
1937
panel_run_dialog_set_default_icon (dialog, FALSE);
1833
gtk_window_set_icon_name (GTK_WINDOW (dialog->run_dialog),
1835
panel_run_dialog_set_default_icon (dialog, FALSE);
1939
1837
g_signal_connect (dialog->run_settings, "changed::"PANEL_RUN_ENABLE_LIST_KEY,
1940
1838
G_CALLBACK (panel_run_dialog_update_program_list), dialog);
1963
panel_run_dialog_disconnect_pixmap (PanelRunDialog *dialog)
1965
g_signal_handlers_disconnect_by_func (dialog->pixmap,
1966
G_CALLBACK (panel_run_dialog_style_updated),
1968
g_signal_handlers_disconnect_by_func (dialog->pixmap,
1969
G_CALLBACK (panel_run_dialog_screen_changed),
1974
1861
panel_run_dialog_static_dialog_destroyed (PanelRunDialog *dialog)
1976
1863
/* just reset the static dialog to NULL for next time */