st-dialog.c
来自「linux下网络收音机的源码」· C语言 代码 · 共 500 行
C
500 行
/* * Copyright (c) 2002, 2003, 2004 Jean-Yves Lefort * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Jean-Yves Lefort nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */#include <stdarg.h>#include <stdlib.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>#include <string.h>#include "sg-util.h"#include "sgtk-auth-dialog.h"#include "sgtk-dialog.h"#include "sgtk-message-dialog.h"#include "st-thread.h"#include "st-search-dialog.h"#include "st-dialog-api.h"#include "st-shell.h"#include "st-util.h"/*** function declarations ***************************************************/static void st_dialog_internal (const char *stock_id, const char *primary, const char *secondary);/*** API implementation ******************************************************//** * st_notice: * @format: the message format. See the printf() documentation. * @...: the parameters to insert into the format string. * * Outputs a formatted streamtuner notice to the standard error output. * * If you need to output a notice regarding a specific handler, use * st_handler_notice() instead of this function. **/voidst_notice (const char *format, ...){ va_list args; char *message; va_start(args, format); message = g_strdup_vprintf(format, args); va_end(args); g_printerr("streamtuner: %s\n", message); g_free(message);}/* * Deprecated. */voidst_warning (const char *format, ...){ va_list args; char *secondary; va_start(args, format); secondary = g_strdup_vprintf(format, args); va_end(args); st_error_dialog(NULL, "%s", secondary); g_free(secondary);}/* * Deprecated. */voidst_error (const char *format, ...){ va_list args; char *secondary; va_start(args, format); secondary = g_strdup_vprintf(format, args); va_end(args); st_error_dialog(NULL, "%s", secondary); g_free(secondary); exit(1);}/** * st_info_dialog: * @primary: the primary text, or %NULL. * @format: the secondary text format, or %NULL. See the printf() * documentation. * @...: the parameters to insert into the format string. * * Displays an informational dialog. **/voidst_info_dialog (const char *primary, const char *format, ...){ char *secondary = NULL; if (format) { va_list args; va_start(args, format); secondary = g_strdup_vprintf(format, args); va_end(args); } st_dialog_internal(GTK_STOCK_DIALOG_INFO, primary, secondary); g_free(secondary);}/** * st_error_dialog: * @primary: the primary text, or %NULL. * @format: the secondary text format, or %NULL. See the printf() * documentation. * @...: the parameters to insert into the format string. * * Displays an error dialog. **/voidst_error_dialog (const char *primary, const char *format, ...){ char *secondary = NULL; if (format) { va_list args; va_start(args, format); secondary = g_strdup_vprintf(format, args); va_end(args); } st_dialog_internal(GTK_STOCK_DIALOG_ERROR, primary, secondary); g_free(secondary);}/** * st_search_dialog: * * Prompts the user for a search string. * * Return value: a search string which should be freed after use, or * %NULL if the user pressed the cancel button. **/char *st_search_dialog (void){ GtkWidget *dialog; char *str = NULL; if (st_thread_get()) GDK_THREADS_ENTER(); dialog = st_search_dialog_new(st_shell ? st_shell_get_window(st_shell) : NULL); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) str = g_strdup(st_search_dialog_get_text(ST_SEARCH_DIALOG(dialog))); gtk_widget_destroy(dialog); if (st_thread_get()) { gdk_flush(); GDK_THREADS_LEAVE(); } return str;}/** * st_auth_dialog: * @default_name: a default name, or %NULL. * @default_password: a default password, or %NULL. * @name: a location to return the entered name, or %NULL. * @password: a location to return the entered password. * @primary: the primary text, or %NULL. * @format: the secondary text format, or %NULL. See the printf() * documentation. * @...: the parameters to insert into the format string. * * Prompts the user for a name and password. The name and password * entries will be initialized to @default_name and @default_password, * if provided. * * The entered name and password will be stored in @name and * @password, and should be freed when no longer needed. If @name is * %NULL, the name entry will not be made sensitive. * * Return value: %TRUE if the user pressed the "Authenticate" button, * %FALSE otherwise. If %FALSE is returned, @name and @password will * not be set. **/gbooleanst_auth_dialog (const char *default_name, const char *default_password, char **name, char **password, const char *primary, const char *format, ...){ GtkWidget *dialog; GtkWindow *parent = NULL; va_list args; char *secondary; gboolean status = FALSE; g_return_val_if_fail(password != NULL, FALSE); g_return_val_if_fail(format != NULL, FALSE); if (st_thread_get()) GDK_THREADS_ENTER(); if (st_shell) parent = st_shell_get_window(st_shell); va_start(args, format); secondary = g_strdup_vprintf(format, args); va_end(args); dialog = sgtk_auth_dialog_new(parent, default_name, default_password, primary, "%s", secondary); g_free(secondary); if (! parent) st_window_set_icon(GTK_WINDOW(dialog)); sgtk_auth_dialog_set_name_sensitive(SGTK_AUTH_DIALOG(dialog), name != NULL); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { if (name) *name = g_strdup(sgtk_auth_dialog_get_name(SGTK_AUTH_DIALOG(dialog))); *password = g_strdup(sgtk_auth_dialog_get_password(SGTK_AUTH_DIALOG(dialog))); status = TRUE; } gtk_widget_destroy(dialog); if (st_thread_get()) { gdk_flush(); GDK_THREADS_LEAVE(); } return status;}/** * st_dialog_normalize: * @str: a string to normalize. * * Normalizes a string so that it can be used stand-alone as the * secondary string of a dialog. * * Normalization will remove trailing newlines and convert the string * to a sentence. * * Return value: a normalized string, which should be freed after use. **/char *st_dialog_normalize (const char *str){ char *copy; int i; char *normalized; gboolean attn1 = FALSE; gboolean attn2 = FALSE; g_return_val_if_fail(str != NULL, NULL); copy = g_strdup(str); /* remove trailing newline(s) */ for (i = strlen(copy) - 1; i >= 0; i--) if (copy[i] == '\n') copy[i] = 0; else break; normalized = sg_str_sentencize(copy); g_free(copy); for (i = 0; normalized[i]; i++) { if (attn1 && attn2) { /* make sure we didn't find a capital word */ if (g_ascii_islower(normalized[i + 1])) normalized[i] = g_ascii_tolower(normalized[i]); attn1 = attn2 = FALSE; } else if (attn1) { if (normalized[i] == ' ') attn2 = TRUE; } else { if (normalized[i] == ':') attn1 = TRUE; else if (normalized[i] == '(') attn1 = attn2 = TRUE; } } return normalized;}/* * Deprecated. */intst_question (const char *format, ...){ va_list args; char *message; GtkWidget *dialog; int response; va_start(args, format); message = g_strdup_vprintf(format, args); va_end(args); if (st_thread_get()) GDK_THREADS_ENTER(); dialog = gtk_message_dialog_new(st_shell ? st_shell_get_window(st_shell) : NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", message); gtk_window_set_title(GTK_WINDOW(dialog), ""); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_YES, GTK_RESPONSE_YES, GTK_STOCK_NO, GTK_RESPONSE_NO, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (st_thread_get()) { gdk_flush(); GDK_THREADS_LEAVE(); } g_free(message); return response;}/* * Deprecated. */char*st_prompt (gboolean hidden, const char *init, const char *format, ...){ va_list args; char *message; GtkWidget *dialog; GtkWidget *ok; GtkWidget *entry; char *str = NULL; va_start(args, format); message = g_strdup_vprintf(format, args); va_end(args); /* kludge to make old plugins use the new search dialog */ if (! hidden && g_str_has_prefix(message, "Enter a search string")) { g_free(message); return st_search_dialog(); } if (st_thread_get()) GDK_THREADS_ENTER(); dialog = gtk_message_dialog_new(st_shell ? st_shell_get_window(st_shell) : NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", message); gtk_window_set_title(GTK_WINDOW(dialog), ""); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); ok = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_window_set_default(GTK_WINDOW(dialog), ok); entry = gtk_entry_new(); gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); if (hidden) gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); if (init) gtk_entry_set_text(GTK_ENTRY(entry), init); gtk_widget_show(entry); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, TRUE, TRUE, 0); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) str = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))); gtk_widget_destroy(dialog); if (st_thread_get()) { gdk_flush(); GDK_THREADS_LEAVE(); } g_free(message); return str;}/*** private implementation **************************************************/static voidst_dialog_internal (const char *stock_id, const char *primary, const char *secondary){ GtkWidget *dialog; GtkWindow *parent = NULL; if (st_thread_get()) GDK_THREADS_ENTER(); if (st_shell) parent = st_shell_get_window(st_shell); dialog = sgtk_message_dialog_new(parent, stock_id, primary, secondary); if (! parent) st_window_set_icon(GTK_WINDOW(dialog)); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (st_thread_get()) { gdk_flush(); GDK_THREADS_LEAVE(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?