static Drawer * create_drawer_applet (PanelToplevel *toplevel, PanelToplevel *parent_toplevel, const char *tooltip, const char *custom_icon, gboolean use_custom_icon, PanelOrientation orientation) { Drawer *drawer; AtkObject *atk_obj; drawer = g_new0 (Drawer, 1); drawer->toplevel = toplevel; if (!use_custom_icon || !custom_icon || !custom_icon [0]) { drawer->button = button_widget_new (PANEL_ICON_DRAWER, TRUE, orientation); } else { drawer->button = button_widget_new (custom_icon, TRUE, orientation); } if (!drawer->button) { g_free (drawer); return NULL; } atk_obj = gtk_widget_get_accessible (drawer->button); atk_object_set_name (atk_obj, _("Drawer")); set_tooltip_and_name (drawer, tooltip); g_signal_connect (drawer->button, "clicked", G_CALLBACK (drawer_click), drawer); g_signal_connect (drawer->button, "key_press_event", G_CALLBACK (key_press_drawer), drawer); g_signal_connect (drawer->toplevel, "key_press_event", G_CALLBACK (key_press_drawer_widget), drawer); gtk_drag_dest_set (drawer->button, 0, NULL, 0, 0); g_signal_connect (drawer->button, "drag_data_get", G_CALLBACK (drag_data_get_cb), drawer); g_signal_connect (drawer->button, "drag_motion", G_CALLBACK (drag_motion_cb), drawer); g_signal_connect (drawer->button, "drag_drop", G_CALLBACK (drag_drop_cb), drawer); g_signal_connect (drawer->button, "drag_data_received", G_CALLBACK (drag_data_received_cb), drawer); g_signal_connect (drawer->button, "drag_leave", G_CALLBACK (drag_leave_cb), drawer); g_signal_connect (drawer->button, "destroy", G_CALLBACK (destroy_drawer), drawer); g_signal_connect (drawer->toplevel, "destroy", G_CALLBACK (toplevel_destroyed), drawer); gtk_widget_show (drawer->button); panel_toplevel_attach_to_widget (drawer->toplevel, parent_toplevel, GTK_WIDGET (drawer->button)); return drawer; }
static Launcher * create_launcher (const char *location) { GKeyFile *key_file; char *scheme; gboolean is_uri; gboolean loaded; Launcher *launcher; GError *error = NULL; char *new_location; if (!location) { g_printerr (_("No URI provided for panel launcher desktop file\n")); return NULL; } new_location = NULL; key_file = g_key_file_new (); scheme = g_uri_parse_scheme (location); is_uri = scheme != NULL; g_free (scheme); if (!is_uri && !g_path_is_absolute (location)) { /* try to first load a file in our config directory, and if it * doesn't exist there, try to find it in the xdg data dirs */ char *path; path = panel_make_full_path (NULL, location); if (!g_file_test (path, G_FILE_TEST_EXISTS)) { g_free (path); path = panel_g_lookup_in_applications_dirs (location); /* it's important to keep the full path if the desktop * file comes from a data dir: when the user will edit * it, we'll want to save it in PANEL_LAUNCHERS_PATH * with a random name (and not evolution.desktop, eg) * and having only a basename as location will make * this impossible */ if (path) new_location = g_strdup (path); } if (path) { loaded = g_key_file_load_from_file (key_file, path, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); g_free (path); } else { loaded = FALSE; } } else loaded = panel_key_file_load_from_uri (key_file, location, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); if (!loaded) { g_printerr (_("Unable to open desktop file %s for panel launcher%s%s\n"), location, error ? ": " : "", error ? error->message : ""); if (error) g_error_free (error); g_key_file_free (key_file); return NULL; /*button is null*/ } if (!new_location) new_location = g_strdup (location); launcher = g_new0 (Launcher, 1); launcher->info = NULL; launcher->button = NULL; launcher->location = new_location; launcher->key_file = key_file; launcher->prop_dialog = NULL; launcher->destroy_handler = 0; /* Icon will be setup later */ launcher->button = button_widget_new (NULL /* icon */, FALSE, PANEL_ORIENTATION_TOP); gtk_widget_show (launcher->button); /*gtk_drag_dest_set (GTK_WIDGET (launcher->button), GTK_DEST_DEFAULT_ALL, dnd_targets, 2, GDK_ACTION_COPY);*/ gtk_drag_dest_set (GTK_WIDGET (launcher->button), 0, NULL, 0, 0); g_signal_connect (launcher->button, "drag_data_get", G_CALLBACK (drag_data_get_cb), launcher); g_signal_connect (launcher->button, "drag_data_received", G_CALLBACK (drag_data_received_cb), launcher); g_signal_connect (launcher->button, "drag_motion", G_CALLBACK (drag_motion_cb), launcher); g_signal_connect (launcher->button, "drag_drop", G_CALLBACK (drag_drop_cb), launcher); g_signal_connect (launcher->button, "drag_leave", G_CALLBACK (drag_leave_cb), launcher); g_signal_connect_swapped (launcher->button, "clicked", G_CALLBACK (launcher_launch), launcher); launcher->destroy_handler = g_signal_connect (launcher->button, "destroy", G_CALLBACK (destroy_launcher), launcher); return launcher; }