void gimp_text_tool_editor_start (GimpTextTool *text_tool) { GimpTool *tool = GIMP_TOOL (text_tool); GimpTextOptions *options = GIMP_TEXT_TOOL_GET_OPTIONS (text_tool); GimpDisplayShell *shell = gimp_display_get_shell (tool->display); gtk_im_context_set_client_window (text_tool->im_context, gtk_widget_get_window (shell->canvas)); text_tool->needs_im_reset = TRUE; gimp_text_tool_reset_im_context (text_tool); gtk_im_context_focus_in (text_tool->im_context); if (options->use_editor) gimp_text_tool_editor_dialog (text_tool); g_signal_connect (options, "notify::use-editor", G_CALLBACK (gimp_text_tool_options_notify), text_tool); if (! text_tool->style_overlay) { Gimp *gimp = GIMP_CONTEXT (options)->gimp; gdouble xres = 1.0; gdouble yres = 1.0; text_tool->style_overlay = gimp_overlay_frame_new (); gtk_container_set_border_width (GTK_CONTAINER (text_tool->style_overlay), 4); gimp_display_shell_add_overlay (shell, text_tool->style_overlay, 0, 0, GIMP_HANDLE_ANCHOR_CENTER, 0, 0); gimp_overlay_box_set_child_opacity (GIMP_OVERLAY_BOX (shell->canvas), text_tool->style_overlay, 0.7); if (text_tool->image) gimp_image_get_resolution (text_tool->image, &xres, &yres); text_tool->style_editor = gimp_text_style_editor_new (gimp, text_tool->proxy, text_tool->buffer, gimp->fonts, xres, yres); gtk_container_add (GTK_CONTAINER (text_tool->style_overlay), text_tool->style_editor); gtk_widget_show (text_tool->style_editor); } gimp_text_tool_editor_position (text_tool); gtk_widget_show (text_tool->style_overlay); }
void gimp_display_shell_scroll (GimpDisplayShell *shell, gint x_offset, gint y_offset) { gint old_x; gint old_y; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (x_offset == 0 && y_offset == 0) return; old_x = shell->offset_x; old_y = shell->offset_y; shell->offset_x += x_offset; shell->offset_y += y_offset; gimp_display_shell_scroll_clamp_offsets (shell); /* the actual changes in offset */ x_offset = (shell->offset_x - old_x); y_offset = (shell->offset_y - old_y); if (x_offset || y_offset) { /* reset the old values so that the tool can accurately redraw */ shell->offset_x = old_x; shell->offset_y = old_y; gimp_display_shell_pause (shell); /* set the offsets back to the new values */ shell->offset_x += x_offset; shell->offset_y += y_offset; gimp_display_shell_rotate_update_transform (shell); gimp_overlay_box_scroll (GIMP_OVERLAY_BOX (shell->canvas), -x_offset, -y_offset); /* Update scrollbars and rulers */ gimp_display_shell_scale_update_scrollbars (shell); gimp_display_shell_scale_update_rulers (shell); gimp_display_shell_resume (shell); gimp_display_shell_scrolled (shell); } }
static void gimp_text_tool_im_preedit_start (GtkIMContext *context, GimpTextTool *text_tool) { GimpTool *tool = GIMP_TOOL (text_tool); GimpDisplayShell *shell = gimp_display_get_shell (tool->display); GtkStyle *style = gtk_widget_get_style (shell->canvas); GtkWidget *frame; GtkWidget *ebox; PangoRectangle cursor_rect = { 0, }; gint off_x, off_y; if (text_tool->text) gimp_text_tool_editor_get_cursor_rect (text_tool, text_tool->overwrite_mode, &cursor_rect); g_object_get (text_tool, "x1", &off_x, "y1", &off_y, NULL); text_tool->preedit_overlay = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (text_tool->preedit_overlay), GTK_SHADOW_OUT); gimp_display_shell_add_overlay (shell, text_tool->preedit_overlay, cursor_rect.x + off_x, cursor_rect.y + off_y, GIMP_HANDLE_ANCHOR_NORTH_WEST, 0, 0); gimp_overlay_box_set_child_opacity (GIMP_OVERLAY_BOX (shell->canvas), text_tool->preedit_overlay, 0.7); gtk_widget_show (text_tool->preedit_overlay); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (text_tool->preedit_overlay), frame); gtk_widget_show (frame); ebox = gtk_event_box_new (); gtk_widget_modify_bg (ebox, GTK_STATE_NORMAL, &style->base[GTK_STATE_NORMAL]); gtk_container_add (GTK_CONTAINER (frame), ebox); gtk_widget_show (ebox); text_tool->preedit_label = gtk_label_new (NULL); gtk_widget_modify_bg (text_tool->preedit_label, GTK_STATE_NORMAL, &style->text[GTK_STATE_NORMAL]); gtk_misc_set_padding (GTK_MISC (text_tool->preedit_label), 2, 2); gtk_container_add (GTK_CONTAINER (ebox), text_tool->preedit_label); gtk_widget_show (text_tool->preedit_label); }
/** * gimp_display_shell_scroll: * @shell: * @x_offset: * @y_offset: * * This function scrolls the image in the shell's viewport. It does * actual scrolling of the pixels, so only the newly scrolled-in parts * are freshly redrawn. * * Use it for incremental actual panning. **/ void gimp_display_shell_scroll (GimpDisplayShell *shell, gint x_offset, gint y_offset) { gint old_x; gint old_y; g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (x_offset == 0 && y_offset == 0) return; old_x = shell->offset_x; old_y = shell->offset_y; /* freeze the active tool */ gimp_display_shell_pause (shell); shell->offset_x += x_offset; shell->offset_y += y_offset; gimp_display_shell_scroll_clamp_and_update (shell); /* the actual changes in offset */ x_offset = (shell->offset_x - old_x); y_offset = (shell->offset_y - old_y); if (x_offset || y_offset) { gimp_display_shell_scrolled (shell); gimp_overlay_box_scroll (GIMP_OVERLAY_BOX (shell->canvas), -x_offset, -y_offset); } /* re-enable the active tool */ gimp_display_shell_resume (shell); }