static void search_text_changed (GtkEntry *entry) { ExampleAppWindow *win; ExampleAppWindowPrivate *priv; const gchar *text; GtkWidget *tab; GtkWidget *view; GtkTextBuffer *buffer; GtkTextIter start, match_start, match_end; text = gtk_entry_get_text (entry); if (text[0] == '\0') return; win = EXAMPLE_APP_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (entry))); priv = example_app_window_get_instance_private (win); tab = gtk_stack_get_visible_child (GTK_STACK (priv->stack)); view = gtk_bin_get_child (GTK_BIN (tab)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); /* Very simple-minded search implementation */ gtk_text_buffer_get_start_iter (buffer, &start); if (gtk_text_iter_forward_search (&start, text, GTK_TEXT_SEARCH_CASE_INSENSITIVE, &match_start, &match_end, NULL)) { gtk_text_buffer_select_range (buffer, &match_start, &match_end); gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (view), &match_start, 0.0, FALSE, 0.0, 0.0); } }
static void update_lines (ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; GtkWidget *tab, *view; GtkTextBuffer *buffer; GtkTextIter iter; int count; gchar *lines; priv = example_app_window_get_instance_private (win); tab = gtk_stack_get_visible_child (GTK_STACK (priv->stack)); if (tab == NULL) return; view = gtk_bin_get_child (GTK_BIN (tab)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); count = 0; gtk_text_buffer_get_start_iter (buffer, &iter); while (!gtk_text_iter_is_end (&iter)) { count++; if (!gtk_text_iter_forward_line (&iter)) break; } lines = g_strdup_printf ("%d", count); gtk_label_set_text (GTK_LABEL (priv->lines), lines); g_free (lines); }
static void update_words (ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; GHashTable *strings; GHashTableIter iter; GtkWidget *tab, *view, *row; GtkTextBuffer *buffer; GtkTextIter start, end; GList *children, *l; gchar *word, *key; priv = example_app_window_get_instance_private (win); tab = gtk_stack_get_visible_child (GTK_STACK (priv->stack)); if (tab == NULL) return; view = gtk_bin_get_child (GTK_BIN (tab)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); strings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); gtk_text_buffer_get_start_iter (buffer, &start); while (!gtk_text_iter_is_end (&start)) { while (!gtk_text_iter_starts_word (&start)) { if (!gtk_text_iter_forward_char (&start)) goto done; } end = start; if (!gtk_text_iter_forward_word_end (&end)) goto done; word = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); g_hash_table_add (strings, g_utf8_strdown (word, -1)); g_free (word); start = end; } done: children = gtk_container_get_children (GTK_CONTAINER (priv->words)); for (l = children; l; l = l->next) gtk_container_remove (GTK_CONTAINER (priv->words), GTK_WIDGET (l->data)); g_list_free (children); g_hash_table_iter_init (&iter, strings); while (g_hash_table_iter_next (&iter, (gpointer *)&key, NULL)) { row = gtk_button_new_with_label (key); g_signal_connect (row, "clicked", G_CALLBACK (find_word), win); gtk_widget_show (row); gtk_container_add (GTK_CONTAINER (priv->words), row); } g_hash_table_unref (strings); }
static void find_word (GtkButton *button, ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; const gchar *word; priv = example_app_window_get_instance_private (win); word = gtk_button_get_label (button); gtk_entry_set_text (GTK_ENTRY (priv->searchentry), word); }
static void example_app_window_init (ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; GtkBuilder *builder; GMenuModel *menu; GAction *action; priv = example_app_window_get_instance_private (win); gtk_widget_init_template (GTK_WIDGET (win)); priv->settings = g_settings_new ("com.lonelycactus.exampleapp"); g_settings_bind (priv->settings, "transition", priv->stack, "transition-type", G_SETTINGS_BIND_DEFAULT); g_settings_bind (priv->settings, "show-words", priv->sidebar, "reveal-child", G_SETTINGS_BIND_DEFAULT); g_object_bind_property (priv->search, "active", priv->searchbar, "search-mode-enabled", G_BINDING_BIDIRECTIONAL); g_signal_connect (priv->connect, "toggled", G_CALLBACK (toggle_server), win); g_signal_connect (priv->sidebar, "notify::reveal-child", G_CALLBACK (words_changed), win); builder = gtk_builder_new_from_resource ("/com/lonelycactus/exampleapp/gears-menu.ui"); menu = G_MENU_MODEL (gtk_builder_get_object (builder, "menu")); gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (priv->gears), menu); g_object_unref (builder); action = g_settings_create_action (priv->settings, "show-words"); g_action_map_add_action (G_ACTION_MAP (win), action); g_object_unref (action); action = (GAction*) g_property_action_new ("show-lines", priv->lines, "visible"); g_action_map_add_action (G_ACTION_MAP (win), action); g_object_unref (action); g_object_bind_property (priv->lines, "visible", priv->lines_label, "visible", G_BINDING_DEFAULT); service_init(); service_start_accepting_new_connections(); g_object_set (gtk_settings_get_default (), "gtk-shell-shows-app-menu", FALSE, NULL); gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (win), TRUE); }
static void example_app_window_dispose (GObject *object) { ExampleAppWindow *win; ExampleAppWindowPrivate *priv; win = EXAMPLE_APP_WINDOW (object); priv = example_app_window_get_instance_private (win); g_clear_object (&priv->settings); G_OBJECT_CLASS (example_app_window_parent_class)->dispose (object); }
static void example_app_window_init (ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; priv = example_app_window_get_instance_private (win); gtk_widget_init_template (GTK_WIDGET (win)); priv->settings = g_settings_new ("org.gtk.exampleapp"); g_settings_bind (priv->settings, "transition", priv->stack, "transition-type", G_SETTINGS_BIND_DEFAULT); }
static void visible_child_changed (GObject *stack, GParamSpec *pspec) { ExampleAppWindow *win; ExampleAppWindowPrivate *priv; if (gtk_widget_in_destruction (GTK_WIDGET (stack))) return; win = EXAMPLE_APP_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (stack))); priv = example_app_window_get_instance_private (win); gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (priv->searchbar), FALSE); update_words (win); update_lines (win); }
static void toggle_server (GObject *button, GParamSpec *pspec, ExampleAppWindow *win) { gboolean active; ExampleAppWindowPrivate *priv; active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); priv = example_app_window_get_instance_private (win); g_message ("toggle server, %d", active); if (active) { } }
static void example_app_window_init (ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; GtkBuilder *builder; GMenuModel *menu; GAction *action; priv = example_app_window_get_instance_private (win); gtk_widget_init_template (GTK_WIDGET (win)); priv->settings = g_settings_new ("org.gtk.exampleapp"); g_settings_bind (priv->settings, "transition", priv->stack, "transition-type", G_SETTINGS_BIND_DEFAULT); g_settings_bind (priv->settings, "show-words", priv->sidebar, "reveal-child", G_SETTINGS_BIND_DEFAULT); g_object_bind_property (priv->search, "active", priv->searchbar, "search-mode-enabled", G_BINDING_BIDIRECTIONAL); g_signal_connect (priv->sidebar, "notify::reveal-child", G_CALLBACK (words_changed), win); builder = gtk_builder_new_from_resource ("/org/gtk/exampleapp/gears-menu.ui"); menu = G_MENU_MODEL (gtk_builder_get_object (builder, "menu")); gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (priv->gears), menu); g_object_unref (builder); action = g_settings_create_action (priv->settings, "show-words"); g_action_map_add_action (G_ACTION_MAP (win), action); g_object_unref (action); action = (GAction*) g_property_action_new ("show-lines", priv->lines, "visible"); g_action_map_add_action (G_ACTION_MAP (win), action); g_object_unref (action); g_object_bind_property (priv->lines, "visible", priv->lines_label, "visible", G_BINDING_DEFAULT); }
static void example_app_window_init (ExampleAppWindow *win) { gtk_widget_init_template (GTK_WIDGET (win)); ExampleAppWindowPrivate *priv = example_app_window_get_instance_private (win); gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR (priv->header), ":"); priv->open_button = gtk_button_new_from_icon_name ("document-open-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_valign (priv->open_button, GTK_ALIGN_CENTER); gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->header), priv->open_button); gtk_widget_show (priv->open_button); g_signal_connect (priv->open_button, "clicked", (GCallback) on_open_clicked, win); priv->save_button = gtk_button_new_from_icon_name ("document-save-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_valign (priv->save_button, GTK_ALIGN_CENTER); gtk_header_bar_pack_start (GTK_HEADER_BAR (priv->header), priv->save_button); gtk_widget_show (priv->save_button); g_signal_connect (priv->save_button, "clicked", (GCallback) on_save_clicked, win); priv->cancel_button = gtk_button_new_from_icon_name ("process-error-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_valign (priv->cancel_button, GTK_ALIGN_CENTER); gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->header), priv->cancel_button); gtk_widget_show (priv->cancel_button); g_signal_connect (priv->cancel_button, "clicked", (GCallback) on_cancel_clicked, win); priv->destroy_button = gtk_button_new_from_icon_name ("edit-delete-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_valign (priv->destroy_button, GTK_ALIGN_CENTER); gtk_header_bar_pack_end (GTK_HEADER_BAR (priv->header), priv->destroy_button); gtk_widget_show (priv->destroy_button); g_signal_connect (priv->destroy_button, "clicked", (GCallback) on_destroy_clicked, win); }