static void gucharmap_chartable_accessible_update_all_cells (AtkObject *obj) { GucharmapChartableAccessible *accessible; GucharmapChartableAccessiblePrivate *priv; GtkWidget *widget; GucharmapChartable *chartable; GPtrArray *cells; guint n_cells, n; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); if (!widget) /* Widget is being deleted */ return; accessible = GUCHARMAP_CHARTABLE_ACCESSIBLE (obj); priv = GET_PRIVATE (accessible); chartable = GUCHARMAP_CHARTABLE (widget); cells = priv->cells; n_cells = cells->len; for (n = 0; n < n_cells; ++n) { GucharmapChartableCellAccessible *cell = g_ptr_array_index (cells, n); set_cell_visibility (chartable, GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (cell), TRUE); } g_signal_emit_by_name (obj, "visible-data-changed"); }
static AtkObject* gucharmap_chartable_accessible_ref_at (AtkTable *table, gint row, gint column) { GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; GtkWidget *widget; AtkObject *child; gint index; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (table)); if (widget == NULL) /* State is defunct */ return NULL; chartable = GUCHARMAP_CHARTABLE (widget); chartable_priv = chartable->priv; index = row * chartable_priv->cols + column; child = gucharmap_chartable_accessible_ref_child (ATK_OBJECT (table), index); return child; }
static AtkObject* gucharmap_chartable_accessible_ref_child (AtkObject *obj, int index) { GucharmapChartableAccessible *table; GucharmapChartableAccessiblePrivate *priv; GtkWidget *widget; GucharmapChartable *chartable; AtkObject *child; gchar* name; GPtrArray *cells; guint n_cells, n; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)); if (widget == NULL) /* State is defunct */ return NULL; if (index > UNICHAR_MAX) return NULL; table = GUCHARMAP_CHARTABLE_ACCESSIBLE (obj); priv = GET_PRIVATE (table); /* Check whether the child is cached */ cells = priv->cells; n_cells = cells->len; for (n = 0; n < n_cells; ++n) { GucharmapChartableCellAccessible *cell = g_ptr_array_index (cells, n); if (index == cell->index) return g_object_ref (cell); } /* Not cached, create a new cell accessible */ chartable = GUCHARMAP_CHARTABLE (widget); child = gucharmap_chartable_cell_accessible_new (); gucharmap_chartable_cell_accessible_initialise (GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (child), GTK_WIDGET (chartable), obj, index); /* Set the name of the cell */ name = g_strdup_printf("U+%4.4X %s", index, gucharmap_get_unicode_name (index)); atk_object_set_name (child, name); g_free (name); set_cell_visibility (chartable, GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (child), FALSE); /* Store the cell in our cache */ g_ptr_array_add (priv->cells, child); g_object_weak_ref (G_OBJECT (child), (GWeakNotify) cell_destroyed, child); return child; }
static AtkObject* gucharmap_chartable_accessible_ref_accessible_at_point (AtkComponent *component, gint x, gint y, AtkCoordType coord_type) { GtkWidget *widget; GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; gint x_pos, y_pos; gint row, col; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (component)); if (widget == NULL) /* State is defunct */ return NULL; chartable = GUCHARMAP_CHARTABLE (widget); chartable_priv = chartable->priv; atk_component_get_extents (component, &x_pos, &y_pos, NULL, NULL, coord_type); /* Find cell at offset x - x_pos, y - y_pos */ x_pos = x - x_pos; y_pos = y - y_pos; for (col = 0; col < chartable_priv->cols; col++) { if (x_pos < _gucharmap_chartable_x_offset (chartable, col)) { col--; break; } } if (col == chartable_priv->cols || col < 0) return NULL; for (row = 0; row < chartable_priv->rows; row++) { if (y_pos < _gucharmap_chartable_y_offset (chartable, row)) { row--; break; } } if (row == chartable_priv->rows || row < 0) return NULL; row += chartable_priv->page_first_cell / chartable_priv->cols; return gucharmap_chartable_accessible_ref_at (ATK_TABLE (component), row, col); }
static gboolean gucharmap_chartable_cell_accessible_grab_focus (AtkComponent *component) { GucharmapChartableCellAccessible *cell = GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (component); GucharmapChartable *chartable; chartable = GUCHARMAP_CHARTABLE (cell->widget); /* FIXME: this looks wrong, index is the index in the codepoint list, not the character itself */ gucharmap_chartable_set_active_character (chartable, cell->index); return TRUE; }
static gboolean idle_do_action (gpointer data) { GucharmapChartableCellAccessible *cell; GucharmapChartable *chartable; cell = GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (data); chartable = GUCHARMAP_CHARTABLE (cell->widget); gucharmap_chartable_set_active_character (chartable, cell->index); g_signal_emit_by_name (chartable, "activate"); return FALSE; }
static gint gucharmap_chartable_accessible_get_n_columns (AtkTable *table) { GtkWidget *widget; GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (table)); if (widget == NULL) /* State is defunct */ return 0; chartable = GUCHARMAP_CHARTABLE (widget); chartable_priv = chartable->priv; return chartable_priv->cols; }
static void gucharmap_chartable_accessible_initialize (AtkObject *obj, gpointer data) { GtkWidget *widget; AtkObject *focus_obj, *old_focus_obj; GucharmapChartableAccessible *accessible; GucharmapChartableAccessiblePrivate *priv; GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; ATK_OBJECT_CLASS (gucharmap_chartable_accessible_parent_class)->initialize (obj, data); widget = GTK_WIDGET (data); accessible = GUCHARMAP_CHARTABLE_ACCESSIBLE (obj); priv = GET_PRIVATE (accessible); chartable = GUCHARMAP_CHARTABLE (widget); chartable_priv = chartable->priv; if (chartable_priv->vadjustment) { GtkAdjustment **adjustment_ptr = &priv->vadjustment; priv->vadjustment = chartable_priv->vadjustment; g_object_add_weak_pointer (G_OBJECT (priv->vadjustment), (gpointer *) adjustment_ptr); g_signal_connect (chartable_priv->vadjustment, "value-changed", G_CALLBACK (adjustment_changed), obj); } g_signal_connect_after (chartable, "notify::hadjustment", G_CALLBACK (sync_adjustment), obj); g_signal_connect_after (chartable, "notify::vadjustment", G_CALLBACK (sync_adjustment), obj); g_signal_connect (widget, "size-allocate", G_CALLBACK (size_allocated), obj); g_signal_connect (chartable, "notify::active-character", G_CALLBACK (sync_active_char), obj); focus_obj = find_object (chartable, chartable_priv->active_cell, obj); old_focus_obj = priv->focus_obj; priv->focus_obj = focus_obj; /* adopts the reference from find_object */ if (old_focus_obj) g_object_unref (old_focus_obj); }
static gint gucharmap_chartable_accessible_get_index_at (AtkTable *table, gint row, gint column) { GtkWidget *widget; GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (table)); if (widget == NULL) /* State is defunct */ return -1; chartable = GUCHARMAP_CHARTABLE (widget); chartable_priv = chartable->priv; return row * chartable_priv->cols + column; }
static void gucharmap_chartable_cell_accessible_get_extents (AtkComponent *component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type) { GucharmapChartableCellAccessible *cell; AtkObject *cell_parent; GucharmapChartable *chartable; GucharmapChartablePrivate *chartable_priv; gint real_x, real_y, real_width, real_height; gint row, column; cell = GUCHARMAP_CHARTABLE_CELL_ACCESSIBLE (component); cell_parent = atk_object_get_parent (ATK_OBJECT (cell)); /* * Is the cell visible on the screen */ chartable = GUCHARMAP_CHARTABLE (cell->widget); chartable_priv = chartable->priv; if (cell->index >= chartable_priv->page_first_cell && cell->index < chartable_priv->page_first_cell + chartable_priv->rows * chartable_priv->cols) { atk_component_get_extents (ATK_COMPONENT (cell_parent), &real_x, &real_y, &real_width, &real_height, coord_type); row = (cell->index - chartable_priv->page_first_cell)/ chartable_priv->cols; column = _gucharmap_chartable_cell_column (chartable, cell->index); *x = real_x + _gucharmap_chartable_x_offset (chartable, column); *y = real_y + _gucharmap_chartable_y_offset (chartable, row); *width = _gucharmap_chartable_column_width (chartable, column); *height = _gucharmap_chartable_row_height (chartable, row); } else { *x = G_MININT; *y = G_MININT; } }
static void gucharmap_charmap_init (GucharmapCharmap *charmap) { GucharmapCharmapPrivate *priv; GtkWidget *scrolled_window, *view, *chartable, *textview; GtkTreeSelection *selection; GtkTextBuffer *buffer; int page; priv = charmap->priv = G_TYPE_INSTANCE_GET_PRIVATE (charmap, GUCHARMAP_TYPE_CHARMAP, GucharmapCharmapPrivate); /* FIXME: move this to realize */ priv->hand_cursor = gdk_cursor_new (GDK_HAND2); priv->regular_cursor = gdk_cursor_new (GDK_XTERM); priv->hovering_over_link = FALSE; /* Left pane */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN); view = gucharmap_chapters_view_new (); priv->chapters_view = GUCHARMAP_CHAPTERS_VIEW (view); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); g_signal_connect (selection, "changed", G_CALLBACK (chapters_view_selection_changed_cb), charmap); gtk_container_add (GTK_CONTAINER (scrolled_window), view); gtk_widget_show (view); gtk_paned_pack1 (GTK_PANED (charmap), scrolled_window, FALSE, FALSE); gtk_widget_show (scrolled_window); /* Right pane */ priv->notebook = gtk_notebook_new (); /* Chartable page */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_NONE); #if GTK_CHECK_VERSION (3, 15, 9) gtk_scrolled_window_set_overlay_scrolling (GTK_SCROLLED_WINDOW (scrolled_window), FALSE); #endif chartable = gucharmap_chartable_new (); priv->chartable = GUCHARMAP_CHARTABLE (chartable); g_signal_connect_swapped (chartable, "status-message", G_CALLBACK (chartable_status_message), charmap); g_signal_connect (chartable, "notify::active-character", G_CALLBACK (chartable_sync_active_char), charmap); g_signal_connect (chartable, "notify::font-desc", G_CALLBACK (chartable_sync_font_desc), charmap); g_signal_connect (chartable, "notify::codepoint-list", G_CALLBACK (chartable_notify_cb), charmap); g_signal_connect (chartable, "notify::snap-pow2", G_CALLBACK (chartable_notify_cb), charmap); gtk_container_add (GTK_CONTAINER (scrolled_window), chartable); gtk_widget_show (chartable); page = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), scrolled_window, gtk_label_new_with_mnemonic (_("Characte_r Table"))); g_assert (page == GUCHARMAP_CHARMAP_PAGE_CHARTABLE); gtk_widget_show (scrolled_window); /* Details page */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_NONE); textview = gtk_text_view_new (); priv->details_view = GTK_TEXT_VIEW (textview); gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview), FALSE); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (textview), GTK_WRAP_WORD); g_signal_connect (textview, "style-set", G_CALLBACK (details_style_set), charmap); g_signal_connect (textview, "key-press-event", G_CALLBACK (details_key_press_event), charmap); g_signal_connect (textview, "event-after", G_CALLBACK (details_event_after), charmap); g_signal_connect (textview, "motion-notify-event", G_CALLBACK (details_motion_notify_event), charmap); g_signal_connect (textview, "visibility-notify-event", G_CALLBACK (details_visibility_notify_event), charmap); buffer = gtk_text_view_get_buffer (priv->details_view); priv->text_tag_gimongous = gtk_text_buffer_create_tag (buffer, "gimongous", NULL); priv->text_tag_big = gtk_text_buffer_create_tag (buffer, "big", NULL); gtk_text_buffer_create_tag (buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); gtk_text_buffer_create_tag (buffer, "detail-value", NULL); gtk_container_add (GTK_CONTAINER (scrolled_window), textview); gtk_widget_show (textview); page = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), scrolled_window, gtk_label_new_with_mnemonic (_("Character _Details"))); g_assert (page == GUCHARMAP_CHARMAP_PAGE_DETAILS); gtk_widget_show (scrolled_window); priv->active_page = 0; gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), 0); g_signal_connect (priv->notebook, "switch-page", G_CALLBACK (notebook_switch_page), charmap); gtk_paned_pack2 (GTK_PANED (charmap), priv->notebook, TRUE, FALSE); gtk_widget_show (priv->notebook); gtk_widget_set_hexpand (GTK_WIDGET (charmap), TRUE); gtk_widget_set_vexpand (GTK_WIDGET (charmap), TRUE); }