void gimp_font_select_destroy (const gchar *font_callback) { GimpFontData *font_data; g_return_if_fail (font_callback != NULL); g_return_if_fail (gimp_font_select_ht != NULL); font_data = g_hash_table_lookup (gimp_font_select_ht, font_callback); if (! font_data) { g_warning ("Can't find internal font data"); return; } if (font_data->idle_id) g_source_remove (font_data->idle_id); g_free (font_data->font_name); if (font_data->font_callback) gimp_fonts_close_popup (font_data->font_callback); gimp_uninstall_temp_proc (font_callback); g_hash_table_remove (gimp_font_select_ht, font_callback); }
/** * gimp_progress_uninstall: * @progress_callback: the name of the temporary procedure to uninstall * * Uninstalls a temporary progress procedure that was installed using * gimp_progress_install(). * * Return value: the @user_data that was passed to gimp_progress_install(). * * Since: GIMP 2.2 **/ gpointer gimp_progress_uninstall (const gchar *progress_callback) { GimpProgressData *progress_data; gpointer user_data; g_return_val_if_fail (progress_callback != NULL, NULL); g_return_val_if_fail (gimp_progress_ht != NULL, NULL); progress_data = g_hash_table_lookup (gimp_progress_ht, progress_callback); if (! progress_data) { g_warning ("Can't find internal progress data"); return NULL; } _gimp_progress_uninstall (progress_callback); gimp_uninstall_temp_proc (progress_callback); user_data = progress_data->data; g_hash_table_remove (gimp_progress_ht, progress_callback); return user_data; }
const gchar * gimp_font_select_new (const gchar *title, const gchar *font_name, GimpRunFontCallback callback, gpointer data) { static const GimpParamDef args[] = { { GIMP_PDB_STRING, "str", "String" }, { GIMP_PDB_INT32, "dialog status", "If the dialog was closing " "[0 = No, 1 = Yes]" } }; gchar *font_callback = gimp_procedural_db_temp_name (); gimp_install_temp_proc (font_callback, "Temporary font popup callback procedure", "", "", "", "", NULL, "", GIMP_TEMPORARY, G_N_ELEMENTS (args), 0, args, NULL, gimp_temp_font_run); if (gimp_fonts_popup (font_callback, title, font_name)) { GimpFontData *font_data; gimp_extension_enable (); /* Allow callbacks to be watched */ /* Now add to hash table so we can find it again */ if (! gimp_font_select_ht) { gimp_font_select_ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gimp_font_data_free); } font_data = g_slice_new0 (GimpFontData); font_data->font_callback = font_callback; font_data->callback = callback; font_data->data = data; g_hash_table_insert (gimp_font_select_ht, font_callback, font_data); return font_callback; } gimp_uninstall_temp_proc (font_callback); g_free (font_callback); return NULL; }
static void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals) { static GimpParam values[1]; GimpPDBStatusType status = GIMP_PDB_SUCCESS; INIT_I18N (); /* make sure all the arguments are there */ if (nparams == 4) { if (! gimp_help_init (param[0].data.d_int32, param[1].data.d_stringarray, param[2].data.d_int32, param[3].data.d_stringarray)) { status = GIMP_PDB_CALLING_ERROR; } } else { g_printerr ("help: wrong number of arguments in procedure call.\n"); status = GIMP_PDB_CALLING_ERROR; } if (status == GIMP_PDB_SUCCESS) { main_loop = g_main_loop_new (NULL, FALSE); temp_proc_install (); gimp_extension_ack (); gimp_extension_enable (); g_main_loop_run (main_loop); g_main_loop_unref (main_loop); main_loop = NULL; gimp_uninstall_temp_proc (GIMP_HELP_TEMP_EXT_PROC); } values[0].type = GIMP_PDB_STATUS; values[0].data.d_status = status; *nreturn_vals = 1; *return_vals = values; }
static GimpPDBStatusType print_image (gint32 image_ID, gboolean interactive, GError **error) { GtkPrintOperation *operation; GtkPrintOperationResult result; gchar *temp_proc; gint32 layer; PrintData data; /* create a print layer from the projection */ layer = gimp_layer_new_from_visible (image_ID, image_ID, PRINT_PROC_NAME); operation = gtk_print_operation_new (); gtk_print_operation_set_n_pages (operation, 1); print_operation_set_name (operation, image_ID); print_page_setup_load (operation, image_ID); /* fill in the PrintData struct */ data.image_id = image_ID; data.drawable_id = layer; data.unit = gimp_get_default_unit (); data.image_unit = gimp_image_get_unit (image_ID); data.offset_x = 0; data.offset_y = 0; data.center = CENTER_BOTH; data.use_full_page = FALSE; data.operation = operation; gimp_image_get_resolution (image_ID, &data.xres, &data.yres); print_settings_load (&data); gtk_print_operation_set_unit (operation, GTK_UNIT_PIXEL); g_signal_connect (operation, "begin-print", G_CALLBACK (begin_print), &data); g_signal_connect (operation, "draw-page", G_CALLBACK (draw_page), &data); g_signal_connect (operation, "end-print", G_CALLBACK (end_print), &image_ID); print_operation = operation; temp_proc = print_temp_proc_install (image_ID); gimp_extension_enable (); if (interactive) { gimp_ui_init (PLUG_IN_BINARY, FALSE); g_signal_connect_swapped (operation, "end-print", G_CALLBACK (print_settings_save), &data); g_signal_connect (operation, "create-custom-widget", G_CALLBACK (create_custom_widget), &data); gtk_print_operation_set_custom_tab_label (operation, _("Image Settings")); result = gtk_print_operation_run (operation, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, NULL, error); } else { result = gtk_print_operation_run (operation, GTK_PRINT_OPERATION_ACTION_PRINT, NULL, error); } gimp_uninstall_temp_proc (temp_proc); g_free (temp_proc); print_operation = NULL; g_object_unref (operation); if (gimp_drawable_is_valid (layer)) gimp_drawable_delete (layer); switch (result) { case GTK_PRINT_OPERATION_RESULT_APPLY: case GTK_PRINT_OPERATION_RESULT_IN_PROGRESS: return GIMP_PDB_SUCCESS; case GTK_PRINT_OPERATION_RESULT_CANCEL: return GIMP_PDB_CANCEL; case GTK_PRINT_OPERATION_RESULT_ERROR: return GIMP_PDB_EXECUTION_ERROR; } return GIMP_PDB_EXECUTION_ERROR; }
/** * gimp_progress_install_vtable: * @vtable: a pointer to a @GimpProgressVtable. * @user_data: a pointer that is passed as user_data to all vtable functions. * * Return value: the name of the temporary procedure that's been installed * * Since: GIMP 2.4 **/ const gchar * gimp_progress_install_vtable (const GimpProgressVtable *vtable, gpointer user_data) { static const GimpParamDef args[] = { { GIMP_PDB_INT32, "command", "" }, { GIMP_PDB_STRING, "text", "" }, { GIMP_PDB_FLOAT, "value", "" } }; static const GimpParamDef values[] = { { GIMP_PDB_FLOAT, "value", "" } }; gchar *progress_callback; g_return_val_if_fail (vtable != NULL, NULL); g_return_val_if_fail (vtable->start != NULL, NULL); g_return_val_if_fail (vtable->end != NULL, NULL); g_return_val_if_fail (vtable->set_text != NULL, NULL); g_return_val_if_fail (vtable->set_value != NULL, NULL); progress_callback = gimp_procedural_db_temp_name (); gimp_install_temp_proc (progress_callback, "Temporary progress callback procedure", "", "", "", "", NULL, "", GIMP_TEMPORARY, G_N_ELEMENTS (args), G_N_ELEMENTS (values), args, values, gimp_temp_progress_run); if (_gimp_progress_install (progress_callback)) { GimpProgressData *progress_data; gimp_extension_enable (); /* Allow callbacks to be watched */ /* Now add to hash table so we can find it again */ if (! gimp_progress_ht) { gimp_progress_ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) gimp_progress_data_free); } progress_data = g_slice_new0 (GimpProgressData); progress_data->progress_callback = progress_callback; progress_data->vtable.start = vtable->start; progress_data->vtable.end = vtable->end; progress_data->vtable.set_text = vtable->set_text; progress_data->vtable.set_value = vtable->set_value; progress_data->vtable.pulse = vtable->pulse; progress_data->vtable.get_window = vtable->get_window; progress_data->data = user_data; g_hash_table_insert (gimp_progress_ht, progress_callback, progress_data); return progress_callback; } gimp_uninstall_temp_proc (progress_callback); g_free (progress_callback); return NULL; }