static int gtkListSetStandardFontAttrib(Ihandle* ih, const char* value) { iupdrvSetStandardFontAttrib(ih, value); if (ih->handle) { if (ih->data->is_dropdown) { GtkCellRenderer* renderer = (GtkCellRenderer*)iupAttribGet(ih, "_IUPGTK_RENDERER"); if (renderer) { g_object_set(G_OBJECT(renderer), "font-desc", (PangoFontDescription*)iupgtkGetPangoFontDescAttrib(ih), NULL); iupgtkFontUpdateObjectPangoLayout(ih, G_OBJECT(renderer)); } } if (ih->data->has_editbox) { GtkEntry* entry = (GtkEntry*)iupAttribGet(ih, "_IUPGTK_ENTRY"); gtk_widget_modify_font((GtkWidget*)entry, (PangoFontDescription*)iupgtkGetPangoFontDescAttrib(ih)); iupgtkFontUpdatePangoLayout(ih, gtk_entry_get_layout(entry)); } } return 1; }
static gboolean draw_text_cursor_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data) { GtkEditable *editable = GTK_EDITABLE(widget); GtkStyleContext *stylectxt = gtk_widget_get_style_context (GTK_WIDGET(widget)); gint height = gtk_widget_get_allocated_height (widget); const gchar *text; GdkRGBA *fg_color; GdkRGBA color; gint x_offset; gint cursor_x = 0; // Get the layout x offset gtk_entry_get_layout_offsets (GTK_ENTRY(widget), &x_offset, NULL); // Get the foreground color gdk_rgba_parse (&color, "black"); gtk_style_context_get_color (stylectxt, GTK_STATE_FLAG_NORMAL, &color); fg_color = &color; text = gtk_entry_get_text (GTK_ENTRY (widget)); if ((text != NULL) && (*text != '\0')) { PangoLayout *layout; PangoRectangle strong_pos; gint start_pos, end_pos, cursor_pos, cursor_byte_pos; cursor_pos = gtk_editable_get_position (editable); cursor_byte_pos = g_utf8_offset_to_pointer (text, cursor_pos) - text; gtk_editable_get_selection_bounds (editable, &start_pos, &end_pos); layout = gtk_entry_get_layout (GTK_ENTRY(widget)); pango_layout_get_cursor_pos (layout, cursor_byte_pos, &strong_pos, NULL); cursor_x = x_offset + PANGO_PIXELS (strong_pos.x); } else cursor_x = x_offset; // Now draw a vertical line cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue); cairo_set_line_width (cr, 1.0); cairo_move_to (cr, cursor_x + 0.5, 2); cairo_rel_line_to (cr, 0, height - 4); cairo_stroke (cr); return FALSE; }
static void tab_completion_popup_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data) { TabCompData *td = data; gint height; PangoLayout *layout; PangoRectangle strong_pos, weak_pos; gint length; gint xoffset, yoffset; GtkRequisition req; GdkScreen *screen; gint monitor_num; GdkRectangle monitor; GtkRequisition requisition; GtkAllocation allocation; gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(td->entry)), x, y); screen = gtk_widget_get_screen(GTK_WIDGET(menu)); monitor_num = gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(GTK_WIDGET(td->entry))); gdk_screen_get_monitor_geometry(screen, monitor_num, &monitor); gtk_widget_size_request(GTK_WIDGET(menu), &req); length = strlen(gtk_entry_get_text(GTK_ENTRY(td->entry))); gtk_entry_get_layout_offsets(GTK_ENTRY(td->entry), &xoffset, &yoffset); layout = gtk_entry_get_layout(GTK_ENTRY(td->entry)); pango_layout_get_cursor_pos(layout, length, &strong_pos, &weak_pos); *x += strong_pos.x / PANGO_SCALE + xoffset; gtk_widget_get_requisition(td->entry, &requisition); gtk_widget_get_allocation(td->entry, &allocation); height = MIN(requisition.height, allocation.height); if (req.height > monitor.y + monitor.height - *y - height && *y - monitor.y > monitor.y + monitor.height - *y) { height = MIN(*y - monitor.y, req.height); gtk_widget_set_size_request(GTK_WIDGET(menu), -1, height); *y -= height; } else { *y += height; } }
void hack_max_combo_width_cb (GtkWidget *widget, GtkStyle *previous_style, gpointer user_data) { PangoRectangle logical_rect, ink_rect; GtkWidget *tmp_entry; if (!GTK_IS_ENTRY(widget)) return; tmp_entry = gtk_entry_new(); gtk_widget_set_style(tmp_entry, gtk_style_copy(widget->style)); gtk_entry_set_text(GTK_ENTRY(tmp_entry), "00:00:00.0000."); pango_layout_get_extents (gtk_entry_get_layout (GTK_ENTRY(tmp_entry)), &ink_rect, &logical_rect); gtk_widget_destroy(tmp_entry); gtk_widget_set_usize(GTK_WIDGET(GTK_ENTRY(widget)), PANGO_PIXELS (ink_rect.width), -1); }
gint gw_spellcheck_get_layout_x_offset (GwSpellcheck *spellcheck) { g_return_val_if_fail (spellcheck != NULL, 0); //Declarations GwSpellcheckPrivate *priv; PangoRectangle rect; PangoLayout *layout; int layout_offset; //Initializations priv = spellcheck->priv; layout = gtk_entry_get_layout (priv->entry); pango_layout_get_pixel_extents (layout, &rect, NULL); gtk_entry_get_layout_offsets (priv->entry, &layout_offset, NULL); return (layout_offset); }
static int _get_string_index (GtkEntry *entry, gint x, gint y) { //Declarations int layout_index; int entry_index; int trailing; PangoLayout *layout; //Initalizations layout = gtk_entry_get_layout (GTK_ENTRY (entry)); if (pango_layout_xy_to_index (layout, x * PANGO_SCALE, y * PANGO_SCALE, &layout_index, &trailing)) entry_index = gtk_entry_layout_index_to_text_index (GTK_ENTRY (entry), layout_index); else entry_index = -1; return entry_index; }
static gboolean gw_spellcheck_get_line_coordinates (GwSpellcheck *spellcheck, int startindex, int endindex, int *x, int *y, int *x2, int *y2) { //Declarations GwSpellcheckPrivate *priv; int index; PangoLayout *layout; PangoRectangle rect; PangoLayoutIter *iter; int xoffset, yoffset; //Initializations priv = spellcheck->priv; layout = gtk_entry_get_layout (priv->entry); iter = pango_layout_get_iter (layout); xoffset = gw_spellcheck_get_layout_x_offset (spellcheck); yoffset = gw_spellcheck_get_layout_y_offset (spellcheck); *x = *y = *x2 = *y2 = 0; do { index = pango_layout_iter_get_index (iter); pango_layout_iter_get_char_extents (iter, &rect); if (index == startindex) { *x = PANGO_PIXELS (rect.x) + xoffset; *y = PANGO_PIXELS (rect.y + rect.height) + yoffset; } if (index == endindex - 1) { *x2 = PANGO_PIXELS (rect.width + rect.x) + xoffset + 1; *y2 = *y; } } while (pango_layout_iter_next_char (iter)); //Cleanup pango_layout_iter_free (iter); return (*x > 0 && *y > 0 && *x2 > 0 && *y2 > 0); }
static gboolean on_entry_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) { g_debug (G_STRLOC ": %s", G_STRFUNC); GtkStyleContext *style_context; PangoContext *pango_context; PangoLayout *layout; const char *text; gint cursor_index; gint x, y; style_context = gtk_widget_get_style_context (widget); pango_context = gtk_widget_get_pango_context (widget); layout = gtk_entry_get_layout (GTK_ENTRY (widget)); text = pango_layout_get_text (layout); gtk_entry_get_layout_offsets (GTK_ENTRY (widget), &x, &y); cursor_index = g_utf8_offset_to_pointer (text, gtk_editable_get_position (GTK_EDITABLE (widget))) - text; gtk_render_insertion_cursor (style_context, cr, x, y, layout, cursor_index, pango_context_get_base_dir (pango_context)); return FALSE; }
static VALUE rg_layout(VALUE self) { return GOBJ2RVAL(gtk_entry_get_layout(_SELF(self))); }
/** * thunar_dialogs_show_rename_file: * @parent : a #GtkWidget on which the error dialog should be shown, or a #GdkScreen * if no #GtkWidget is known. May also be %NULL, in which case the default * #GdkScreen will be used. * @file : the #ThunarFile we're going to rename. * * Displays the Thunar rename dialog for a single file rename. * * Return value: The #ThunarJob responsible for renaming the file or * %NULL if there was no renaming required. **/ ThunarJob * thunar_dialogs_show_rename_file (gpointer parent, ThunarFile *file) { ThunarIconFactory *icon_factory; GtkIconTheme *icon_theme; const gchar *filename; const gchar *text; ThunarJob *job = NULL; GtkWidget *dialog; GtkWidget *entry; GtkWidget *label; GtkWidget *image; GtkWidget *table; GtkWindow *window; GdkPixbuf *icon; GdkScreen *screen; glong offset; gchar *title; gint response; PangoLayout *layout; gint layout_width; gint layout_offset; gint parent_width = 500; _thunar_return_val_if_fail (parent == NULL || GDK_IS_SCREEN (parent) || GTK_IS_WINDOW (parent), FALSE); _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE); /* parse the parent window and screen */ screen = thunar_util_parse_parent (parent, &window); /* get the filename of the file */ filename = thunar_file_get_display_name (file); /* create a new dialog window */ title = g_strdup_printf (_("Rename \"%s\""), filename); dialog = gtk_dialog_new_with_buttons (title, window, GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, _("_Rename"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); g_free (title); /* move the dialog to the appropriate screen */ if (G_UNLIKELY (window == NULL && screen != NULL)) gtk_window_set_screen (GTK_WINDOW (dialog), screen); table = g_object_new (GTK_TYPE_TABLE, "border-width", 6, "column-spacing", 6, "row-spacing", 3, NULL); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table, TRUE, TRUE, 0); gtk_widget_show (table); icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (dialog)); icon_factory = thunar_icon_factory_get_for_icon_theme (icon_theme); icon = thunar_icon_factory_load_file_icon (icon_factory, file, THUNAR_FILE_ICON_STATE_DEFAULT, 48); g_object_unref (G_OBJECT (icon_factory)); image = gtk_image_new_from_pixbuf (icon); gtk_misc_set_padding (GTK_MISC (image), 6, 6); gtk_table_attach (GTK_TABLE (table), image, 0, 1, 0, 2, GTK_FILL, GTK_FILL, 0, 0); g_object_unref (G_OBJECT (icon)); gtk_widget_show (image); label = gtk_label_new (_("Enter the new name:")); gtk_misc_set_alignment (GTK_MISC (label), 0.0f, 0.5f); gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (label); entry = gtk_entry_new (); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show (entry); /* setup the old filename */ gtk_entry_set_text (GTK_ENTRY (entry), filename); /* check if we don't have a directory here */ if (!thunar_file_is_directory (file)) { /* check if the filename contains an extension */ text = thunar_util_str_get_extension (filename); if (G_LIKELY (text != NULL)) { /* grab focus to the entry first, else the selection will be altered later */ gtk_widget_grab_focus (entry); /* determine the UTF-8 char offset */ offset = g_utf8_pointer_to_offset (filename, text); /* select the text prior to the dot */ if (G_LIKELY (offset > 0)) gtk_editable_select_region (GTK_EDITABLE (entry), 0, offset); } } /* get the size the entry requires to render the full text */ layout = gtk_entry_get_layout (GTK_ENTRY (entry)); pango_layout_get_pixel_size (layout, &layout_width, NULL); gtk_entry_get_layout_offsets (GTK_ENTRY (entry), &layout_offset, NULL); layout_width += (layout_offset * 2) + (12 * 4) + 48; /* 12px free space in entry */ /* parent window width */ if (G_LIKELY (window != NULL)) { /* keep below 90% of the parent window width */ gtk_window_get_size (GTK_WINDOW (window), &parent_width, NULL); parent_width *= 0.90f; } /* resize the dialog to make long names fit as much as possible */ gtk_window_set_default_size (GTK_WINDOW (dialog), CLAMP (layout_width, 300, parent_width), -1); /* run the dialog */ response = gtk_dialog_run (GTK_DIALOG (dialog)); if (G_LIKELY (response == GTK_RESPONSE_OK)) { /* hide the dialog */ gtk_widget_hide (dialog); /* determine the new filename */ text = gtk_entry_get_text (GTK_ENTRY (entry)); /* check if we have a new name here */ if (G_LIKELY (!exo_str_is_equal (filename, text))) { /* try to rename the file */ job = thunar_io_jobs_rename_file (file, text); } } /* cleanup */ gtk_widget_destroy (dialog); return job; }