diff options
author | Matthias Clasen <mclasen@redhat.com> | 2010-05-06 22:55:02 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2010-05-06 22:55:02 -0400 |
commit | 77d4d3cdae0739c0a5643fb23891f8790f05c074 (patch) | |
tree | ebd134deb99ffd0ef47aea63e3dfcea73bd625f5 /gtk | |
parent | b3e0e25d65db6b7be3385663ceeaecdc5c3115df (diff) | |
parent | 0de8601327d541f644dc1882c99f44551870a7ab (diff) | |
download | gtk+-77d4d3cdae0739c0a5643fb23891f8790f05c074.tar.gz |
Merge branch 'gtk-2-90'
Conflicts:
gtk/gtkentry.h
Diffstat (limited to 'gtk')
282 files changed, 565 insertions, 49299 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am index ce39a1c6b4..5670626aad 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -166,6 +166,7 @@ gtk_public_h_sources = \ gtkaccessible.h \ gtkaction.h \ gtkactiongroup.h \ + gtkaccelgroupprivate.h \ gtkactivatable.h \ gtkadjustment.h \ gtkalignment.h \ @@ -506,7 +507,6 @@ gtk_base_c_sources = \ gtkimmodule.c \ gtkimmulticontext.c \ gtkinfobar.c \ - gtkinputdialog.c \ gtkinvisible.c \ gtkitem.c \ gtkkeyhash.c \ @@ -515,7 +515,6 @@ gtk_base_c_sources = \ gtklinkbutton.c \ gtkliststore.c \ gtkmain.c \ - gtkmarshal.c \ gtkmarshalers.c \ gtkmenu.c \ gtkmenubar.c \ @@ -633,54 +632,11 @@ gtk_base_c_sources = \ gtkwindow.c \ $(gtk_clipboard_dnd_c_sources) -# Broken -gtk_public_h_sources += \ - gtktext.h \ - gtktree.h \ - gtktreeitem.h -gtk_base_c_sources += \ - gtktext.c \ - gtktree.c \ - gtktreeitem.c - # Deprecated gtk_public_h_sources += \ - gtkclist.h \ - gtkcombo.h \ - gtkctree.h \ - gtkcurve.h \ - gtkfilesel.h \ - gtkgamma.h \ - gtkinputdialog.h \ - gtkitemfactory.h \ - gtklist.h \ - gtklistitem.h \ - gtkoldeditable.h \ - gtkoptionmenu.h \ - gtkpixmap.h \ - gtkpreview.h \ - gtkprogress.h \ - gtksignal.h \ - gtktipsquery.h \ - gtktooltips.h + gtkprogress.h gtk_base_c_sources += \ - gtkclist.c \ - gtkcombo.c \ - gtkctree.c \ - gtkcurve.c \ - gtkfilesel.c \ - gtkgamma.c \ - gtkitemfactory.c \ - gtklist.c \ - gtklistitem.c \ - gtkoldeditable.c \ - gtkoptionmenu.c \ - gtkpixmap.c \ - gtkpreview.c \ - gtkprogress.c \ - gtksignal.c \ - gtktipsquery.c \ - gtktooltips.c + gtkprogress.c gtk_c_sources = $(gtk_base_c_sources) gtk_all_c_sources = $(gtk_base_c_sources) @@ -779,7 +735,6 @@ EXTRA_DIST += gtkquartz.h # built sources that get installed with the header files gtk_built_public_sources = \ - gtkmarshal.h \ gtktypebuiltins.h # built headers that don't get installed @@ -794,13 +749,11 @@ gtk_built_sources = \ gtktypebuiltins.c \ gtktypefuncs.c \ gtkmarshalers.c \ - gtkmarshal.c \ ${gtk_built_private_headers} \ ${gtk_built_public_sources} stamp_files = \ stamp-gtkmarshalers.h \ - stamp-gtkmarshal.h \ stamp-gtktypebuiltins.h \ stamp-icons @@ -814,8 +767,7 @@ gtk_extra_sources = \ gtkstatusicon-quartz.c \ gtk.symbols \ gtkversion.h.in \ - gtkmarshalers.list \ - gtkmarshal.list + gtkmarshalers.list # # setup GTK+ sources and their dependencies @@ -854,24 +806,6 @@ gtkmarshalers.c: @REBUILD@ gtkmarshalers.list && cp xgen-gmlc gtkmarshalers.c \ && rm -f xgen-gmlc -gtkmarshal.h: stamp-gtkmarshal.h - @true -stamp-gtkmarshal.h: @REBUILD@ gtkmarshal.list - echo "#ifndef GTK_DISABLE_DEPRECATED" > xgen-gmh \ - && $(GLIB_GENMARSHAL) --prefix=gtk_marshal $(srcdir)/gtkmarshal.list --header >> xgen-gmh \ - && echo "#endif /* GTK_DISABLE_DEPRECATED */" >> xgen-gmh \ - && (cmp -s xgen-gmh gtkmarshal.h || cp xgen-gmh gtkmarshal.h) \ - && rm -f xgen-gmh \ - && echo timestamp > $(@F) -gtkmarshal.c: @REBUILD@ gtkmarshal.list - (echo "#include \"gtkmarshal.h\""; \ - echo "#include \"gtkalias.h\""; \ - $(GLIB_GENMARSHAL) --prefix=gtk_marshal $(srcdir)/gtkmarshal.list --body; \ - echo "#define __gtk_marshal_MARSHAL_C__"; \ - echo "#include \"gtkaliasdef.c\"") >> xgen-gmc \ - && cp xgen-gmc gtkmarshal.c \ - && rm -f xgen-gmc - gtktypebuiltins.h: stamp-gtktypebuiltins.h @true stamp-gtktypebuiltins.h: @REBUILD@ $(gtk_public_h_sources) gtktypebuiltins.h.template @@ -218,31 +218,6 @@ #include <gtk/gtkwidget.h> #include <gtk/gtkwindow.h> -/* Broken */ -#include <gtk/gtktext.h> -#include <gtk/gtktree.h> -#include <gtk/gtktreeitem.h> - -/* Deprecated */ -#include <gtk/gtkclist.h> -#include <gtk/gtkcombo.h> -#include <gtk/gtkctree.h> -#include <gtk/gtkcurve.h> -#include <gtk/gtkfilesel.h> -#include <gtk/gtkgamma.h> -#include <gtk/gtkinputdialog.h> -#include <gtk/gtkitemfactory.h> -#include <gtk/gtklist.h> -#include <gtk/gtklistitem.h> -#include <gtk/gtkoldeditable.h> -#include <gtk/gtkoptionmenu.h> -#include <gtk/gtkpixmap.h> -#include <gtk/gtkpreview.h> -#include <gtk/gtkprogress.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktipsquery.h> -#include <gtk/gtktooltips.h> - #undef __GTK_H_INSIDE__ #endif /* __GTK_H__ */ diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 2e1b8f7da5..924663b827 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -33,10 +33,6 @@ gtk_about_dialog_get_documenters gtk_about_dialog_get_license gtk_about_dialog_get_logo gtk_about_dialog_get_logo_icon_name -#ifndef GTK_DISABLE_DEPRECATED -gtk_about_dialog_get_name -gtk_about_dialog_set_name -#endif gtk_about_dialog_get_program_name gtk_about_dialog_set_program_name gtk_about_dialog_get_translator_credits @@ -146,21 +142,12 @@ gtk_accessible_get_widget #if IN_FILE(__GTK_ACTION_C__) gtk_action_activate gtk_action_block_activate -#ifndef GTK_DISABLE_DEPRECATED -gtk_action_block_activate_from -#endif gtk_action_connect_accelerator -#ifndef GTK_DISABLE_DEPRECATED -gtk_action_connect_proxy -#endif gtk_action_create_icon gtk_action_create_menu_item gtk_action_create_tool_item gtk_action_create_menu gtk_action_disconnect_accelerator -#ifndef GTK_DISABLE_DEPRECATED -gtk_action_disconnect_proxy -#endif gtk_action_get_always_show_image gtk_action_get_accel_closure gtk_action_get_accel_path @@ -168,9 +155,6 @@ gtk_action_get_gicon gtk_action_get_label gtk_action_get_name gtk_action_get_proxies -#ifndef GTK_DISABLE_DEPRECATED -gtk_widget_get_action -#endif gtk_action_get_icon_name gtk_action_get_is_important gtk_action_get_sensitive @@ -199,9 +183,6 @@ gtk_action_set_visible gtk_action_set_visible_horizontal gtk_action_set_visible_vertical gtk_action_unblock_activate -#ifndef GTK_DISABLE_DEPRECATED -gtk_action_unblock_activate_from -#endif #endif #endif @@ -313,13 +294,11 @@ gtk_spin_button_update_policy_get_type G_GNUC_CONST gtk_notebook_tab_get_type G_GNUC_CONST gtk_number_up_layout_get_type G_GNUC_CONST gtk_anchor_type_get_type G_GNUC_CONST -gtk_arg_flags_get_type G_GNUC_CONST gtk_arrow_type_get_type G_GNUC_CONST gtk_arrow_placement_get_type G_GNUC_CONST gtk_assistant_page_type_get_type G_GNUC_CONST gtk_attach_options_get_type G_GNUC_CONST gtk_builder_error_get_type G_GNUC_CONST -gtk_button_action_get_type G_GNUC_CONST gtk_buttons_type_get_type G_GNUC_CONST gtk_calendar_display_options_get_type G_GNUC_CONST gtk_cell_renderer_mode_get_type G_GNUC_CONST @@ -330,7 +309,6 @@ gtk_debug_flag_get_type G_GNUC_CONST gtk_delete_type_get_type G_GNUC_CONST gtk_dest_defaults_get_type G_GNUC_CONST gtk_drag_result_get_type G_GNUC_CONST -gtk_clist_drag_pos_get_type G_GNUC_CONST gtk_dialog_flags_get_type G_GNUC_CONST gtk_direction_type_get_type G_GNUC_CONST gtk_entry_icon_position_get_type G_GNUC_CONST @@ -348,18 +326,11 @@ gtk_window_position_get_type G_GNUC_CONST gtk_tree_view_column_sizing_get_type G_GNUC_CONST gtk_tree_view_drop_position_get_type G_GNUC_CONST gtk_button_box_style_get_type G_GNUC_CONST -gtk_cell_type_get_type G_GNUC_CONST -gtk_ctree_expander_style_get_type G_GNUC_CONST -gtk_ctree_expansion_type_get_type G_GNUC_CONST -gtk_ctree_line_style_get_type G_GNUC_CONST -gtk_ctree_pos_get_type G_GNUC_CONST -gtk_curve_type_get_type G_GNUC_CONST gtk_icon_lookup_flags_get_type G_GNUC_CONST gtk_image_type_get_type G_GNUC_CONST gtk_im_preedit_style_get_type G_GNUC_CONST gtk_im_status_style_get_type G_GNUC_CONST gtk_justification_get_type G_GNUC_CONST -gtk_match_type_get_type G_GNUC_CONST gtk_menu_direction_type_get_type G_GNUC_CONST gtk_message_type_get_type G_GNUC_CONST gtk_metric_type_get_type G_GNUC_CONST @@ -376,7 +347,6 @@ gtk_path_priority_type_get_type G_GNUC_CONST gtk_path_type_get_type G_GNUC_CONST gtk_policy_type_get_type G_GNUC_CONST gtk_position_type_get_type G_GNUC_CONST -gtk_preview_type_get_type G_GNUC_CONST gtk_print_duplex_get_type G_GNUC_CONST gtk_print_error_get_type G_GNUC_CONST gtk_recent_filter_flags_get_type G_GNUC_CONST @@ -397,8 +367,6 @@ gtk_scroll_step_get_type G_GNUC_CONST gtk_scroll_type_get_type G_GNUC_CONST gtk_selection_mode_get_type G_GNUC_CONST gtk_shadow_type_get_type G_GNUC_CONST -gtk_side_type_get_type G_GNUC_CONST -gtk_signal_run_type_get_type G_GNUC_CONST gtk_size_group_mode_get_type G_GNUC_CONST gtk_sort_type_get_type G_GNUC_CONST gtk_spin_type_get_type G_GNUC_CONST @@ -412,7 +380,6 @@ gtk_text_search_flags_get_type G_GNUC_CONST gtk_text_window_type_get_type G_GNUC_CONST gtk_tool_palette_drag_targets_get_type G_GNUC_CONST gtk_tree_model_flags_get_type G_GNUC_CONST -gtk_tree_view_mode_get_type G_GNUC_CONST gtk_tree_view_grid_lines_get_type G_GNUC_CONST gtk_update_type_get_type G_GNUC_CONST gtk_visibility_get_type G_GNUC_CONST @@ -445,10 +412,6 @@ gtk_aspect_frame_set #if IN_HEADER(__GTK_BINDINGS_H__) #if IN_FILE(__GTK_BINDINGS_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_binding_entry_clear -gtk_binding_parse_binding -#endif gtk_binding_entry_skip gtk_binding_entry_add_signal gtk_binding_entry_add_signall @@ -477,10 +440,6 @@ gtk_box_get_spacing gtk_box_get_type G_GNUC_CONST gtk_box_pack_end gtk_box_pack_start -#ifndef GTK_DISABLE_DEPRECATED -gtk_box_pack_end_defaults -gtk_box_pack_start_defaults -#endif gtk_box_query_child_packing gtk_box_reorder_child gtk_box_set_child_packing @@ -528,12 +487,6 @@ gtk_builder_value_from_string_type #if IN_HEADER(__GTK_BUTTON_BOX_H__) #if IN_FILE(__GTK_BUTTON_BOX_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_button_box_set_child_size -gtk_button_box_set_child_ipadding -gtk_button_box_get_child_ipadding -gtk_button_box_get_child_size -#endif gtk_button_box_get_child_secondary gtk_button_box_get_layout gtk_button_box_get_type G_GNUC_CONST @@ -581,11 +534,6 @@ gtk_button_set_use_underline #if IN_HEADER(__GTK_CALENDAR_H__) #if IN_FILE(__GTK_CALENDAR_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_calendar_display_options -gtk_calendar_freeze -gtk_calendar_thaw -#endif gtk_calendar_clear_marks gtk_calendar_get_date gtk_calendar_get_detail_height_rows @@ -631,9 +579,6 @@ gtk_cell_layout_set_cell_data_func #if IN_HEADER(__GTK_CELL_RENDERER_H__) #if IN_FILE(__GTK_CELL_RENDERER_C__) gtk_cell_renderer_activate -#ifndef GTK_DISABLE_DEPRECATED -gtk_cell_renderer_editing_canceled -#endif gtk_cell_renderer_get_alignment gtk_cell_renderer_get_fixed_size gtk_cell_renderer_get_padding @@ -717,9 +662,6 @@ gtk_cell_renderer_toggle_set_radio #if IN_HEADER(__GTK_CELL_VIEW_H__) #if IN_FILE(__GTK_CELL_VIEW_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_cell_view_get_cell_renderers -#endif gtk_cell_view_get_displayed_row gtk_cell_view_get_model gtk_cell_view_get_size_of_row @@ -755,9 +697,6 @@ gtk_check_menu_item_new_with_mnemonic gtk_check_menu_item_set_active gtk_check_menu_item_set_draw_as_radio gtk_check_menu_item_set_inconsistent -#ifndef GTK_DISABLE_DEPRECATED -gtk_check_menu_item_set_show_toggle -#endif gtk_check_menu_item_toggled #endif #endif @@ -796,87 +735,6 @@ gtk_clipboard_wait_is_target_available #endif #endif -#if IN_HEADER(__GTK_CLIST_H__) -#if IN_FILE(__GTK_CLIST_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_clist_append -gtk_clist_clear -gtk_clist_columns_autosize -gtk_clist_column_title_active -gtk_clist_column_title_passive -gtk_clist_column_titles_active -gtk_clist_column_titles_hide -gtk_clist_column_titles_passive -gtk_clist_column_titles_show -gtk_clist_find_row_from_data -gtk_clist_freeze -gtk_clist_get_cell_style -gtk_clist_get_cell_type -gtk_clist_get_column_title -gtk_clist_get_column_widget -gtk_clist_get_hadjustment -gtk_clist_get_pixmap -gtk_clist_get_pixtext -gtk_clist_get_row_data -gtk_clist_get_row_style -gtk_clist_get_selectable -gtk_clist_get_selection_info -gtk_clist_get_text -gtk_clist_get_type G_GNUC_CONST -gtk_clist_get_vadjustment -gtk_clist_insert -gtk_clist_moveto -gtk_clist_new -gtk_clist_new_with_titles -gtk_clist_optimal_column_width -gtk_clist_prepend -gtk_clist_remove -gtk_clist_row_is_visible -gtk_clist_row_move -gtk_clist_select_all -gtk_clist_select_row -gtk_clist_set_auto_sort -gtk_clist_set_background -gtk_clist_set_button_actions -gtk_clist_set_cell_style -gtk_clist_set_column_auto_resize -gtk_clist_set_column_justification -gtk_clist_set_column_max_width -gtk_clist_set_column_min_width -gtk_clist_set_column_resizeable -gtk_clist_set_column_title -gtk_clist_set_column_visibility -gtk_clist_set_column_widget -gtk_clist_set_column_width -gtk_clist_set_compare_func -gtk_clist_set_foreground -gtk_clist_set_hadjustment -gtk_clist_set_pixmap -gtk_clist_set_pixtext -gtk_clist_set_reorderable -gtk_clist_set_row_data -gtk_clist_set_row_data_full -gtk_clist_set_row_height -gtk_clist_set_row_style -gtk_clist_set_selectable -gtk_clist_set_selection_mode -gtk_clist_set_shadow_type -gtk_clist_set_shift -gtk_clist_set_sort_column -gtk_clist_set_sort_type -gtk_clist_set_text -gtk_clist_set_use_drag_icons -gtk_clist_set_vadjustment -gtk_clist_sort -gtk_clist_swap_rows -gtk_clist_thaw -gtk_clist_undo_selection -gtk_clist_unselect_all -gtk_clist_unselect_row -#endif -#endif -#endif - #if IN_HEADER(__GTK_COLOR_BUTTON_H__) #if IN_FILE(__GTK_COLOR_BUTTON_C__) gtk_color_button_get_alpha @@ -906,12 +764,6 @@ gtk_color_selection_is_adjusting gtk_color_selection_new gtk_color_selection_palette_from_string gtk_color_selection_palette_to_string -#ifndef GTK_DISABLE_DEPRECATED -gtk_color_selection_set_change_palette_hook -gtk_color_selection_set_color -gtk_color_selection_get_color -gtk_color_selection_set_update_policy -#endif gtk_color_selection_set_change_palette_with_screen_hook gtk_color_selection_set_current_alpha gtk_color_selection_set_current_color @@ -980,22 +832,6 @@ gtk_combo_box_entry_set_text_column #endif #endif -#if IN_HEADER(__GTK_SMART_COMBO_H__) -#if IN_FILE(__GTK_SMART_COMBO_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_combo_disable_activate -gtk_combo_get_type G_GNUC_CONST -gtk_combo_new -gtk_combo_set_case_sensitive -gtk_combo_set_item_string -gtk_combo_set_popdown_strings -gtk_combo_set_use_arrows -gtk_combo_set_use_arrows_always -gtk_combo_set_value_in_list -#endif -#endif -#endif - #if IN_HEADER(__GTK_CONTAINER_H__) #if IN_FILE(__GTK_CONTAINER_C__) gtk_container_add @@ -1013,9 +849,6 @@ gtk_container_class_install_child_property gtk_container_class_list_child_properties gtk_container_forall gtk_container_foreach -#ifndef GTK_DISABLE_DEPRECATED -gtk_container_foreach_full -#endif gtk_container_get_border_width gtk_container_get_children gtk_container_get_focus_chain @@ -1038,96 +871,6 @@ gtk_container_unset_focus_chain #endif #endif -#if IN_HEADER(__GTK_CTREE_H__) -#if IN_FILE(__GTK_CTREE_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_ctree_collapse -gtk_ctree_collapse_recursive -gtk_ctree_collapse_to_depth -gtk_ctree_expand -gtk_ctree_expand_recursive -gtk_ctree_expand_to_depth -gtk_ctree_export_to_gnode -gtk_ctree_find -gtk_ctree_find_all_by_row_data -gtk_ctree_find_all_by_row_data_custom -gtk_ctree_find_by_row_data -gtk_ctree_find_by_row_data_custom -gtk_ctree_find_node_ptr -gtk_ctree_get_node_info -gtk_ctree_get_type G_GNUC_CONST -gtk_ctree_insert_gnode -gtk_ctree_insert_node -gtk_ctree_is_ancestor -gtk_ctree_is_hot_spot -gtk_ctree_is_viewable -gtk_ctree_last -gtk_ctree_move -gtk_ctree_new -gtk_ctree_new_with_titles -gtk_ctree_node_get_cell_style -gtk_ctree_node_get_cell_type -gtk_ctree_node_get_pixmap -gtk_ctree_node_get_pixtext -gtk_ctree_node_get_row_data -gtk_ctree_node_get_row_style -gtk_ctree_node_get_selectable -gtk_ctree_node_get_text -gtk_ctree_node_get_type G_GNUC_CONST -gtk_ctree_node_is_visible -gtk_ctree_node_moveto -gtk_ctree_node_nth -gtk_ctree_node_set_background -gtk_ctree_node_set_cell_style -gtk_ctree_node_set_foreground -gtk_ctree_node_set_pixmap -gtk_ctree_node_set_pixtext -gtk_ctree_node_set_row_data -gtk_ctree_node_set_row_data_full -gtk_ctree_node_set_row_style -gtk_ctree_node_set_selectable -gtk_ctree_node_set_shift -gtk_ctree_node_set_text -gtk_ctree_post_recursive -gtk_ctree_post_recursive_to_depth -gtk_ctree_pre_recursive -gtk_ctree_pre_recursive_to_depth -gtk_ctree_real_select_recursive -gtk_ctree_remove_node -gtk_ctree_select -gtk_ctree_select_recursive -gtk_ctree_set_drag_compare_func -gtk_ctree_set_expander_style -gtk_ctree_set_indent -gtk_ctree_set_line_style -gtk_ctree_set_node_info -gtk_ctree_set_show_stub -gtk_ctree_set_spacing -gtk_ctree_sort_node -gtk_ctree_sort_recursive -gtk_ctree_toggle_expansion -gtk_ctree_toggle_expansion_recursive -gtk_ctree_unselect -gtk_ctree_unselect_recursive -#endif -#endif -#endif - -#if IN_HEADER(__GTK_CURVE_H__) -#if IN_FILE(__GTK_CURVE_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_curve_get_type G_GNUC_CONST -gtk_curve_get_vector -gtk_curve_new -gtk_curve_reset -gtk_curve_set_curve_type -gtk_curve_set_gamma -gtk_curve_set_range -gtk_curve_set_vector -#endif -#endif -#endif - #if IN_HEADER(__GTK_WINDOW_DECORATE_H__) #if IN_FILE(__GTK_WINDOW_DECORATE_C__) gtk_decorated_window_calculate_frame_size @@ -1180,9 +923,6 @@ gtk_drag_finish gtk_drag_get_data gtk_drag_get_source_widget gtk_drag_highlight -#ifndef GTK_DISABLE_DEPRECATED -gtk_drag_set_default_icon -#endif gtk_drag_set_icon_default gtk_drag_set_icon_name gtk_drag_set_icon_pixbuf @@ -1226,9 +966,6 @@ gtk_status_icon_get_icon_name gtk_status_icon_get_gicon gtk_status_icon_get_size gtk_status_icon_set_screen -#ifndef GTK_DISABLE_DEPRECATED -gtk_status_icon_set_tooltip -#endif gtk_status_icon_set_tooltip_text gtk_status_icon_get_tooltip_text gtk_status_icon_set_tooltip_markup @@ -1251,34 +988,6 @@ gtk_status_icon_set_name #if IN_HEADER(__GTK_STYLE_H__) #if IN_FILE(__GTK_STYLE_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_draw_arrow -gtk_draw_box -gtk_draw_box_gap -gtk_draw_check -gtk_draw_diamond -gtk_draw_expander -gtk_draw_extension -gtk_draw_flat_box -gtk_draw_focus -gtk_draw_handle -gtk_draw_hline -gtk_draw_layout -gtk_draw_option -gtk_draw_polygon -gtk_draw_resize_grip -gtk_draw_shadow -gtk_draw_shadow_gap -gtk_draw_slider -gtk_draw_string -gtk_draw_tab -gtk_draw_vline -gtk_style_set_font -gtk_style_get_font -gtk_style_ref -gtk_style_unref -gtk_paint_string -#endif gtk_paint_arrow gtk_paint_box gtk_paint_box_gap @@ -1325,9 +1034,6 @@ gtk_style_get #if IN_FILE(__GTK_DRAWING_AREA_C__) gtk_drawing_area_get_type G_GNUC_CONST gtk_drawing_area_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_drawing_area_size -#endif #endif #endif @@ -1416,14 +1122,6 @@ gtk_entry_set_visibility gtk_entry_set_width_chars gtk_entry_text_index_to_layout_index gtk_entry_unset_invisible_char -#ifndef GTK_DISABLE_DEPRECATED -gtk_entry_append_text -gtk_entry_new_with_max_length -gtk_entry_prepend_text -gtk_entry_select_region -gtk_entry_set_editable -gtk_entry_set_position -#endif #endif #endif @@ -1642,9 +1340,6 @@ gtk_file_chooser_unselect_uri #if IN_FILE(__GTK_FILE_CHOOSER_DIALOG_C__) gtk_file_chooser_dialog_get_type G_GNUC_CONST gtk_file_chooser_dialog_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_file_chooser_dialog_new_with_backend -#endif #endif #endif @@ -1652,9 +1347,6 @@ gtk_file_chooser_dialog_new_with_backend #if IN_FILE(__GTK_FILE_CHOOSER_WIDGET_C__) gtk_file_chooser_widget_get_type G_GNUC_CONST gtk_file_chooser_widget_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_file_chooser_widget_new_with_backend -#endif #endif #endif @@ -1664,9 +1356,6 @@ gtk_file_chooser_button_get_title gtk_file_chooser_button_get_type G_GNUC_CONST gtk_file_chooser_button_get_width_chars gtk_file_chooser_button_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_file_chooser_button_new_with_backend -#endif gtk_file_chooser_button_new_with_dialog gtk_file_chooser_button_set_title gtk_file_chooser_button_set_width_chars @@ -1690,48 +1379,12 @@ gtk_file_filter_set_name #endif #endif -#if IN_HEADER(__GTK_FILESEL_H__) -#if IN_FILE(__GTK_FILESEL_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_file_selection_complete -#ifndef _WIN64 -gtk_file_selection_get_filename PRIVATE -#endif -#ifdef G_OS_WIN32 -gtk_file_selection_get_filename_utf8 -#endif -#ifndef _WIN64 -gtk_file_selection_get_selections PRIVATE -#endif -#ifdef G_OS_WIN32 -gtk_file_selection_get_selections_utf8 -#endif -gtk_file_selection_get_select_multiple -gtk_file_selection_get_type G_GNUC_CONST -gtk_file_selection_hide_fileop_buttons -gtk_file_selection_new -#ifndef _WIN64 -gtk_file_selection_set_filename PRIVATE -#endif -#ifdef G_OS_WIN32 -gtk_file_selection_set_filename_utf8 -#endif -gtk_file_selection_set_select_multiple -gtk_file_selection_show_fileop_buttons -#endif -#endif -#endif - #if IN_HEADER(__GTK_FIXED_H__) #if IN_FILE(__GTK_FIXED_C__) gtk_fixed_get_type G_GNUC_CONST gtk_fixed_move gtk_fixed_new gtk_fixed_put -#ifndef GTK_DISABLE_DEPRECATED -gtk_fixed_set_has_window -gtk_fixed_get_has_window -#endif #endif #endif @@ -1765,11 +1418,6 @@ gtk_font_selection_dialog_get_type G_GNUC_CONST gtk_font_selection_dialog_new gtk_font_selection_dialog_set_font_name gtk_font_selection_dialog_set_preview_text -#ifndef GTK_DISABLE_DEPRECATED -gtk_font_selection_dialog_get_apply_button -gtk_font_selection_get_font -gtk_font_selection_dialog_get_font -#endif gtk_font_selection_get_face gtk_font_selection_get_face_list gtk_font_selection_get_family @@ -1802,15 +1450,6 @@ gtk_frame_set_shadow_type #endif #endif -#if IN_HEADER(__GTK_GAMMA_CURVE_H__) -#if IN_FILE(__GTK_GAMMA_CURVE_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_gamma_curve_get_type G_GNUC_CONST -gtk_gamma_curve_new -#endif -#endif -#endif - #if IN_HEADER(__GTK_GC_H__) #if IN_FILE(__GTK_GC_C__) gtk_gc_get @@ -1843,12 +1482,6 @@ gtk_hbox_new #if IN_FILE(__GTK_HBUTTON_BOX_C__) gtk_hbutton_box_new gtk_hbutton_box_get_type G_GNUC_CONST -#ifndef GTK_DISABLE_DEPRECATED -gtk_hbutton_box_get_layout_default -gtk_hbutton_box_get_spacing_default -gtk_hbutton_box_set_layout_default -gtk_hbutton_box_set_spacing_default -#endif #endif #endif @@ -2092,10 +1725,6 @@ gtk_icon_view_get_tooltip_column #if IN_HEADER(__GTK_IMAGE_H__) #if IN_FILE(__GTK_IMAGE_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_image_get -gtk_image_set -#endif gtk_image_clear gtk_image_get_animation gtk_image_get_icon_name @@ -2212,43 +1841,8 @@ gtk_item_toggle #endif #endif -#if IN_HEADER(__GTK_ITEM_FACTORY_H__) -#if IN_FILE(__GTK_ITEM_FACTORY_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_item_factories_path_delete -gtk_item_factory_add_foreign -gtk_item_factory_construct -gtk_item_factory_create_item -gtk_item_factory_create_items -gtk_item_factory_create_items_ac -gtk_item_factory_create_menu_entries -gtk_item_factory_delete_entries -gtk_item_factory_delete_entry -gtk_item_factory_delete_item -gtk_item_factory_from_path -gtk_item_factory_from_widget -gtk_item_factory_get_item -gtk_item_factory_get_item_by_action -gtk_item_factory_get_type G_GNUC_CONST -gtk_item_factory_get_widget -gtk_item_factory_get_widget_by_action -gtk_item_factory_new -gtk_item_factory_path_from_widget -gtk_item_factory_popup -gtk_item_factory_popup_data -gtk_item_factory_popup_data_from_widget -gtk_item_factory_popup_with_data -gtk_item_factory_set_translate_func -#endif -#endif -#endif - #if IN_HEADER(__GTK_LABEL_H__) #if IN_FILE(__GTK_LABEL_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_label_get -gtk_label_parse_uline -#endif gtk_label_get_angle gtk_label_get_attributes gtk_label_get_ellipsize @@ -2310,10 +1904,6 @@ gtk_layout_put gtk_layout_set_hadjustment gtk_layout_set_size gtk_layout_set_vadjustment -#ifndef GTK_DISABLE_DEPRECATED -gtk_layout_freeze -gtk_layout_thaw -#endif #endif #endif @@ -2330,51 +1920,6 @@ gtk_link_button_set_visited #endif #endif -#if IN_HEADER(__GTK_LIST_H__) -#if IN_FILE(__GTK_LIST_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_list_append_items -gtk_list_child_position -gtk_list_clear_items -gtk_list_end_drag_selection -gtk_list_end_selection -gtk_list_extend_selection -gtk_list_get_type G_GNUC_CONST -gtk_list_insert_items -gtk_list_new -gtk_list_prepend_items -gtk_list_remove_items -gtk_list_remove_items_no_unref -gtk_list_scroll_horizontal -gtk_list_scroll_vertical -gtk_list_select_all -gtk_list_select_child -gtk_list_select_item -gtk_list_set_selection_mode -gtk_list_start_selection -gtk_list_toggle_add_mode -gtk_list_toggle_focus_row -gtk_list_toggle_row -gtk_list_undo_selection -gtk_list_unselect_all -gtk_list_unselect_child -gtk_list_unselect_item -#endif -#endif -#endif - -#if IN_HEADER(__GTK_LIST_ITEM_H__) -#if IN_FILE(__GTK_LIST_ITEM_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_list_item_deselect -gtk_list_item_get_type G_GNUC_CONST -gtk_list_item_new -gtk_list_item_new_with_label -gtk_list_item_select -#endif -#endif -#endif - #if IN_HEADER(__GTK_LIST_STORE_H__) #if IN_FILE(__GTK_LIST_STORE_C__) gtk_list_store_append @@ -2408,19 +1953,6 @@ gtk_get_option_group gtk_get_current_event gtk_get_current_event_state gtk_get_current_event_time -#ifndef GTK_DISABLE_DEPRECATED -gtk_exit -gtk_idle_add -gtk_idle_add_full -gtk_idle_add_priority -gtk_idle_remove -gtk_idle_remove_by_data -gtk_timeout_add -gtk_timeout_add_full -gtk_timeout_remove -gtk_input_add_full -gtk_input_remove -#endif gtk_false G_GNUC_CONST gtk_true G_GNUC_CONST gtk_events_pending @@ -2460,48 +1992,6 @@ gtk_main_quit #endif #endif -#if IN_HEADER(__GTK_INPUTDIALOG_H__) -#if IN_FILE(__GTK_INPUTDIALOG_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_input_dialog_get_type G_GNUC_CONST -gtk_input_dialog_new -#endif -#endif -#endif - -#if IN_HEADER(__gtk_marshal_MARSHAL_H__) -#if IN_FILE(__gtk_marshal_MARSHAL_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_marshal_BOOLEAN__POINTER -gtk_marshal_BOOLEAN__POINTER_INT_INT -gtk_marshal_BOOLEAN__POINTER_INT_INT_UINT -gtk_marshal_BOOLEAN__POINTER_POINTER_INT_INT -gtk_marshal_BOOLEAN__POINTER_STRING_STRING_POINTER -gtk_marshal_BOOLEAN__VOID -gtk_marshal_ENUM__ENUM -gtk_marshal_INT__POINTER -gtk_marshal_INT__POINTER_CHAR_CHAR -gtk_marshal_VOID__ENUM_FLOAT -gtk_marshal_VOID__ENUM_FLOAT_BOOLEAN -gtk_marshal_VOID__INT_INT -gtk_marshal_VOID__INT_INT_POINTER -gtk_marshal_VOID__POINTER_INT -gtk_marshal_VOID__POINTER_INT_INT_POINTER_UINT_UINT -gtk_marshal_VOID__POINTER_POINTER -gtk_marshal_VOID__POINTER_POINTER_POINTER -gtk_marshal_VOID__POINTER_POINTER_UINT_UINT -gtk_marshal_VOID__POINTER_STRING_STRING -gtk_marshal_VOID__POINTER_UINT -gtk_marshal_VOID__POINTER_UINT_ENUM -gtk_marshal_VOID__POINTER_UINT_UINT -gtk_marshal_VOID__STRING_INT_POINTER -gtk_marshal_VOID__UINT_POINTER_UINT_ENUM_ENUM_POINTER -gtk_marshal_VOID__UINT_POINTER_UINT_UINT_ENUM -gtk_marshal_VOID__UINT_STRING -#endif -#endif -#endif - #if IN_HEADER(__GTK_MENU_BAR_H__) #if IN_FILE(__GTK_MENU_BAR_C__) gtk_menu_bar_get_type G_GNUC_CONST @@ -2565,9 +2055,6 @@ gtk_menu_item_set_submenu gtk_menu_item_set_use_underline gtk_menu_item_toggle_size_allocate gtk_menu_item_toggle_size_request -#ifndef GTK_DISABLE_DEPRECATED -gtk_menu_item_remove_submenu -#endif #endif #endif @@ -2594,9 +2081,6 @@ gtk_menu_tool_button_get_menu gtk_menu_tool_button_get_type G_GNUC_CONST gtk_menu_tool_button_new gtk_menu_tool_button_new_from_stock -#ifndef GTK_DISABLE_DEPRECATED -gtk_menu_tool_button_set_arrow_tooltip -#endif gtk_menu_tool_button_set_arrow_tooltip_markup gtk_menu_tool_button_set_arrow_tooltip_text gtk_menu_tool_button_set_menu @@ -2670,12 +2154,6 @@ gtk_notebook_query_tab_label_packing gtk_notebook_remove_page gtk_notebook_reorder_child gtk_notebook_set_current_page -#ifndef GTK_DISABLE_DEPRECATED -gtk_notebook_set_homogeneous_tabs -gtk_notebook_set_tab_border -gtk_notebook_set_tab_hborder -gtk_notebook_set_tab_vborder -#endif gtk_notebook_set_menu_label gtk_notebook_set_menu_label_text gtk_notebook_set_scrollable @@ -2688,10 +2166,6 @@ gtk_notebook_set_tab_label_packing gtk_notebook_set_tab_label_text gtk_notebook_set_tab_pos gtk_notebook_set_window_creation_hook -#ifndef GTK_DISABLE_DEPRECATED -gtk_notebook_get_group_id -gtk_notebook_set_group_id -#endif gtk_notebook_get_group gtk_notebook_set_group gtk_notebook_get_tab_reorderable @@ -2705,29 +2179,6 @@ gtk_notebook_set_action_widget #if IN_HEADER(__GTK_OBJECT_H__) #if IN_FILE(__GTK_OBJECT_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_object_add_arg_type -gtk_object_get G_GNUC_NULL_TERMINATED -gtk_object_set G_GNUC_NULL_TERMINATED -gtk_object_get_data -gtk_object_get_data_by_id -gtk_object_get_user_data -gtk_object_new -gtk_object_remove_data -gtk_object_remove_data_by_id -gtk_object_remove_no_notify -gtk_object_remove_no_notify_by_id -gtk_object_ref -gtk_object_unref -gtk_object_weakref -gtk_object_weakunref -gtk_object_set_data -gtk_object_set_data_by_id -gtk_object_set_data_by_id_full -gtk_object_set_data_full -gtk_object_set_user_data -gtk_object_sink -#endif gtk_object_destroy gtk_object_get_type G_GNUC_CONST #endif @@ -2750,26 +2201,6 @@ gtk_orientable_set_orientation #endif #endif -#if IN_HEADER(__GTK_OLD_EDITABLE_H__) -#if IN_FILE(__GTK_OLD_EDITABLE_C__) -gtk_old_editable_changed -gtk_old_editable_claim_selection -gtk_old_editable_get_type G_GNUC_CONST -#endif -#endif - -#if IN_HEADER(__GTK_OPTION_MENU_H__) -#if IN_FILE(__GTK_OPTION_MENU_C__) -gtk_option_menu_get_history -gtk_option_menu_get_menu -gtk_option_menu_get_type G_GNUC_CONST -gtk_option_menu_new -gtk_option_menu_remove_menu -gtk_option_menu_set_history -gtk_option_menu_set_menu -#endif -#endif - #if IN_HEADER(__GTK_PANED_H__) #if IN_FILE(__GTK_PANED_C__) gtk_paned_add1 @@ -2782,9 +2213,6 @@ gtk_paned_get_type G_GNUC_CONST gtk_paned_pack1 gtk_paned_pack2 gtk_paned_set_position -#ifndef GTK_DISABLE_DEPRECATED -gtk_paned_compute_position -#endif #endif #endif @@ -2794,18 +2222,6 @@ gtk_path_bar_get_type G_GNUC_CONST #endif #endif -#if IN_HEADER(__GTK_PIXMAP_H__) -#if IN_FILE(__GTK_PIXMAP_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_pixmap_get -gtk_pixmap_get_type G_GNUC_CONST -gtk_pixmap_new -gtk_pixmap_set -gtk_pixmap_set_build_insensitive -#endif -#endif -#endif - #if IN_HEADER(__GTK_PLUG_H__) #if IN_FILE(__GTK_PLUG_C__) gtk_plug_construct @@ -2819,29 +2235,6 @@ gtk_plug_new_for_display #endif #endif -#if IN_HEADER(__GTK_PREVIEW_H__) -#if IN_FILE(__GTK_PREVIEW_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_preview_draw_row -gtk_preview_get_cmap -gtk_preview_get_info -gtk_preview_get_type G_GNUC_CONST -gtk_preview_get_visual -gtk_preview_new -gtk_preview_put -gtk_preview_reset -gtk_preview_set_color_cube -gtk_preview_set_dither -gtk_preview_set_expand -gtk_preview_set_gamma -gtk_preview_set_install_cmap -gtk_preview_set_reserved -gtk_preview_size -gtk_preview_uninit -#endif -#endif -#endif - #if IN_HEADER(__GTK_PAGE_SETUP_H__) #if IN_FILE(__GTK_PAGE_SETUP_C__) gtk_page_setup_get_type G_GNUC_CONST @@ -3271,14 +2664,6 @@ gtk_progress_bar_get_text gtk_progress_bar_get_ellipsize gtk_progress_bar_get_type G_GNUC_CONST gtk_progress_bar_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_progress_bar_new_with_adjustment -gtk_progress_bar_set_bar_style -gtk_progress_bar_set_discrete_blocks -gtk_progress_bar_set_activity_blocks -gtk_progress_bar_set_activity_step -gtk_progress_bar_update -#endif gtk_progress_bar_pulse gtk_progress_bar_set_fraction gtk_progress_bar_set_orientation @@ -3288,27 +2673,6 @@ gtk_progress_bar_set_ellipsize #endif #endif -#if IN_HEADER(__GTK_PROGRESS_H__) -#if IN_FILE(__GTK_PROGRESS_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_progress_configure -gtk_progress_get_current_percentage -gtk_progress_get_current_text -gtk_progress_get_percentage_from_value -gtk_progress_get_text_from_value -gtk_progress_get_type G_GNUC_CONST -gtk_progress_get_value -gtk_progress_set_activity_mode -gtk_progress_set_adjustment -gtk_progress_set_format_string -gtk_progress_set_percentage -gtk_progress_set_show_text -gtk_progress_set_text_alignment -gtk_progress_set_value -#endif -#endif -#endif - #if IN_HEADER(__GTK_RADIO_ACTION_H__) #if IN_FILE(__GTK_RADIO_ACTION_C__) gtk_radio_action_get_current_value @@ -3396,11 +2760,6 @@ gtk_range_set_value #if IN_HEADER(__GTK_RC_H__) #if IN_FILE(__GTK_RC_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_rc_add_class_style -gtk_rc_add_widget_class_style -gtk_rc_add_widget_name_style -#endif #ifndef _WIN64 gtk_rc_add_default_file PRIVATE #endif @@ -3440,10 +2799,6 @@ gtk_rc_set_default_files_utf8 gtk_rc_style_copy gtk_rc_style_get_type G_GNUC_CONST gtk_rc_style_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_rc_style_ref -gtk_rc_style_unref -#endif #endif #endif @@ -3473,10 +2828,6 @@ gtk_recent_chooser_set_limit gtk_recent_chooser_get_limit gtk_recent_chooser_set_show_tips gtk_recent_chooser_get_show_tips -#ifndef GTK_DISABLE_DEPRECATED -gtk_recent_chooser_set_show_numbers -gtk_recent_chooser_get_show_numbers -#endif gtk_recent_chooser_set_sort_type gtk_recent_chooser_get_sort_type gtk_recent_chooser_set_sort_func @@ -3550,10 +2901,6 @@ gtk_recent_manager_get_type G_GNUC_CONST gtk_recent_manager_new gtk_recent_manager_get_items gtk_recent_manager_get_default -#ifndef GTK_DISABLE_DEPRECATED -gtk_recent_manager_get_for_screen -gtk_recent_manager_set_screen -#endif gtk_recent_manager_add_item gtk_recent_manager_add_full gtk_recent_manager_remove_item @@ -3665,10 +3012,6 @@ gtk_scale_button_set_icons gtk_scale_button_set_value gtk_scale_button_get_adjustment gtk_scale_button_set_adjustment -#ifndef GTK_DISABLE_DEPRECATED -gtk_scale_button_get_orientation -gtk_scale_button_set_orientation -#endif gtk_scale_button_get_plus_button gtk_scale_button_get_minus_button gtk_scale_button_get_popup @@ -3706,7 +3049,6 @@ gtk_scrolled_window_unset_placement #if IN_FILE(__GTK_SELECTION_C__) gtk_selection_add_target gtk_selection_add_targets -gtk_selection_clear gtk_selection_clear_targets gtk_selection_convert gtk_selection_data_copy @@ -3796,24 +3138,6 @@ gtk_rc_property_parse_requisition #endif #endif -#if IN_HEADER(__GTK_SIGNAL_H__) -#if IN_FILE(__GTK_SIGNAL_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_signal_compat_matched -gtk_signal_connect_full -gtk_signal_connect_object_while_alive -gtk_signal_connect_while_alive -gtk_signal_emit -gtk_signal_emit_by_name -gtk_signal_emit_stop_by_name -gtk_signal_emitv -gtk_signal_emitv_by_name -gtk_signal_new -gtk_signal_newv -#endif -#endif -#endif - #if IN_HEADER(__GTK_SIZE_GROUP_H__) #if IN_FILE(__GTK_SIZE_GROUP_C__) gtk_size_group_add_widget @@ -3841,9 +3165,6 @@ gtk_socket_get_id gtk_socket_get_plug_window gtk_socket_get_type G_GNUC_CONST gtk_socket_new -#ifndef GTK_DISABLE_DEPRECATED -gtk_socket_steal -#endif #endif #endif @@ -3967,25 +3288,6 @@ gtk_text_tag_table_remove #endif #endif -#if IN_HEADER(__GTK_TEXT_H__) -#if IN_FILE(__GTK_TEXT_C__) -gtk_text_backward_delete -gtk_text_forward_delete -gtk_text_freeze -gtk_text_get_length -gtk_text_get_point -gtk_text_get_type G_GNUC_CONST -gtk_text_insert -gtk_text_new -gtk_text_set_adjustments -gtk_text_set_editable -gtk_text_set_line_wrap -gtk_text_set_point -gtk_text_set_word_wrap -gtk_text_thaw -#endif -#endif - #if IN_HEADER(__GTK_TEXT_BUFFER_H__) #if IN_FILE(__GTK_TEXT_BUFFER_C__) gtk_text_buffer_add_selection_clipboard @@ -4327,17 +3629,6 @@ gtk_theme_engine_get_type G_GNUC_CONST #endif #endif -#if IN_HEADER(__GTK_TIPS_QUERY_H__) -#if IN_FILE(__GTK_TIPS_QUERY_C__) -gtk_tips_query_get_type G_GNUC_CONST -gtk_tips_query_new -gtk_tips_query_set_caller -gtk_tips_query_set_labels -gtk_tips_query_start_query -gtk_tips_query_stop_query -#endif -#endif - #if IN_HEADER(__GTK_TOGGLE_ACTION_H__) #if IN_FILE(__GTK_TOGGLE_ACTION_C__) gtk_toggle_action_get_active @@ -4378,50 +3669,22 @@ gtk_toggle_tool_button_set_active #if IN_HEADER(__GTK_TOOLBAR_H__) #if IN_FILE(__GTK_TOOLBAR_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_toolbar_append_element -gtk_toolbar_set_icon_size -gtk_toolbar_unset_icon_size -gtk_toolbar_append_item -gtk_toolbar_prepend_element -gtk_toolbar_prepend_item -gtk_toolbar_insert_element -gtk_toolbar_insert_item -gtk_toolbar_insert_space -gtk_toolbar_insert_stock -gtk_toolbar_append_space -gtk_toolbar_prepend_space -gtk_toolbar_remove_space -gtk_toolbar_append_widget -gtk_toolbar_insert_widget -gtk_toolbar_prepend_widget -#endif gtk_toolbar_get_drop_index gtk_toolbar_get_icon_size gtk_toolbar_get_item_index gtk_toolbar_get_n_items gtk_toolbar_get_nth_item -#ifndef GTK_DISABLE_DEPRECATED -gtk_toolbar_get_orientation -#endif gtk_toolbar_get_relief_style gtk_toolbar_get_show_arrow gtk_toolbar_get_style -#ifndef GTK_DISABLE_DEPRECATED -gtk_toolbar_get_tooltips -#endif gtk_toolbar_get_type G_GNUC_CONST gtk_toolbar_insert gtk_toolbar_new gtk_toolbar_set_drop_highlight_item -#ifndef GTK_DISABLE_DEPRECATED -gtk_toolbar_set_orientation -#endif +gtk_toolbar_set_icon_size gtk_toolbar_set_show_arrow gtk_toolbar_set_style -#ifndef GTK_DISABLE_DEPRECATED -gtk_toolbar_set_tooltips -#endif +gtk_toolbar_unset_icon_size gtk_toolbar_unset_style #endif #endif @@ -4486,9 +3749,6 @@ gtk_tool_item_set_expand gtk_tool_item_set_homogeneous gtk_tool_item_set_is_important gtk_tool_item_set_proxy_menu_item -#ifndef GTK_DISABLE_DEPRECATED -gtk_tool_item_set_tooltip -#endif gtk_tool_item_set_tooltip_markup gtk_tool_item_set_tooltip_text gtk_tool_item_set_use_drag_window @@ -4564,22 +3824,6 @@ gtk_tooltip_trigger_tooltip_query #endif #endif -#if IN_HEADER(__GTK_TOOLTIPS_H__) -#if IN_FILE(__GTK_TOOLTIPS_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_tooltips_data_get -gtk_tooltips_disable -gtk_tooltips_enable -gtk_tooltips_force_window -gtk_tooltips_get_info_from_tip_window -gtk_tooltips_get_type G_GNUC_CONST -gtk_tooltips_new -gtk_tooltips_set_delay -gtk_tooltips_set_tip -#endif -#endif -#endif - #if IN_HEADER(__GTK_TRAY_ICON_H__) #if IN_FILE(__GTK_TRAY_ICON_X11_C__) #ifndef G_OS_WIN32 @@ -4588,27 +3832,6 @@ gtk_tray_icon_get_type G_GNUC_CONST #endif #endif -#if IN_HEADER(__GTK_TREE_H__) -#if IN_FILE(__GTK_TREE_C__) -gtk_tree_append -gtk_tree_child_position -gtk_tree_clear_items -gtk_tree_get_type G_GNUC_CONST -gtk_tree_insert -gtk_tree_prepend -gtk_tree_remove_item -gtk_tree_remove_items -gtk_tree_select_child -gtk_tree_select_item -gtk_tree_set_selection_mode -gtk_tree_set_view_lines -gtk_tree_set_view_mode -gtk_tree_unselect_child -gtk_tree_unselect_item -gtk_tree_new -#endif -#endif - #if IN_HEADER(__GTK_TREE_DND_H__) #if IN_FILE(__GTK_TREE_DND_C__) gtk_tree_drag_dest_drag_data_received @@ -4623,20 +3846,6 @@ gtk_tree_set_row_drag_data #endif #endif -#if IN_HEADER(__GTK_TREE_ITEM_H__) -#if IN_FILE(__GTK_TREE_ITEM_C__) -gtk_tree_item_collapse -gtk_tree_item_deselect -gtk_tree_item_expand -gtk_tree_item_get_type G_GNUC_CONST -gtk_tree_item_new -gtk_tree_item_new_with_label -gtk_tree_item_remove_subtree -gtk_tree_item_select -gtk_tree_item_set_subtree -#endif -#endif - #if IN_HEADER(__GTK_TREE_MODEL_H__) #if IN_FILE(__GTK_TREE_MODEL_C__) gtk_tree_iter_copy @@ -4813,9 +4022,6 @@ gtk_tree_view_column_clear_attributes gtk_tree_view_column_clicked gtk_tree_view_column_focus_cell gtk_tree_view_column_get_alignment -#ifndef GTK_DISABLE_DEPRECATED -gtk_tree_view_column_get_cell_renderers -#endif gtk_tree_view_column_get_clickable gtk_tree_view_column_get_expand gtk_tree_view_column_get_fixed_width @@ -4957,14 +4163,8 @@ gtk_tree_view_set_tooltip_row gtk_tree_view_set_tooltip_cell gtk_tree_view_set_tooltip_column gtk_tree_view_set_vadjustment -#ifndef GTK_DISABLE_DEPRECATED -gtk_tree_view_tree_to_widget_coords -#endif gtk_tree_view_unset_rows_drag_dest gtk_tree_view_unset_rows_drag_source -#ifndef GTK_DISABLE_DEPRECATED -gtk_tree_view_widget_to_tree_coords -#endif gtk_tree_view_columns_autosize #endif #endif @@ -4972,16 +4172,6 @@ gtk_tree_view_columns_autosize #if IN_HEADER(__GTK_TYPE_UTILS_H__) #if IN_FILE(__GTK_TYPE_UTILS_C__) gtk_identifier_get_type G_GNUC_CONST -#ifndef GTK_DISABLE_DEPRECATED -gtk_type_enum_find_value -gtk_type_enum_get_values -gtk_type_flags_find_value -gtk_type_flags_get_values -gtk_type_init -gtk_type_new -gtk_type_unique -gtk_type_class -#endif #endif #endif @@ -5022,12 +4212,6 @@ gtk_vbox_new #if IN_HEADER(__GTK_VBBOX_H__) #if IN_FILE(__GTK_VBBOX_C__) -#ifndef GTK_DISABLE_DEPRECATED -gtk_vbutton_box_get_layout_default -gtk_vbutton_box_get_spacing_default -gtk_vbutton_box_set_layout_default -gtk_vbutton_box_set_spacing_default -#endif gtk_vbutton_box_get_type G_GNUC_CONST gtk_vbutton_box_new #endif @@ -5194,16 +4378,6 @@ gtk_widget_pop_colormap gtk_widget_pop_composite_child gtk_widget_push_colormap gtk_widget_push_composite_child -#ifndef GTK_DISABLE_DEPRECATED -gtk_widget_draw -gtk_widget_queue_clear -gtk_widget_queue_clear_area -gtk_widget_set -gtk_widget_set_uposition -gtk_widget_set_usize -gtk_widget_ref -gtk_widget_unref -#endif gtk_widget_queue_draw gtk_widget_queue_draw_area gtk_widget_queue_resize @@ -5384,9 +4558,6 @@ gtk_window_set_mnemonics_visible gtk_window_set_modal gtk_window_set_opacity gtk_window_get_opacity -#ifndef GTK_DISABLE_DEPRECATED -gtk_window_set_policy -#endif gtk_window_set_position gtk_window_set_resizable gtk_window_set_role diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c index affb9466ee..54e70d603c 100644 --- a/gtk/gtkaboutdialog.c +++ b/gtk/gtkaboutdialog.c @@ -121,8 +121,7 @@ static GdkColor default_link_color = { 0, 0, 0, 0xeeee }; static GdkColor default_visited_link_color = { 0, 0x5555, 0x1a1a, 0x8b8b }; -typedef struct _GtkAboutDialogPrivate GtkAboutDialogPrivate; -struct _GtkAboutDialogPrivate +struct _GtkAboutDialogPrivate { gchar *name; gchar *version; @@ -548,10 +547,11 @@ gtk_about_dialog_init (GtkAboutDialog *about) GtkDialog *dialog = GTK_DIALOG (about); GtkAboutDialogPrivate *priv; GtkWidget *vbox, *hbox, *button, *close_button, *image; + GtkWidget *content_area, *action_area; /* Data */ priv = GTK_ABOUT_DIALOG_GET_PRIVATE (about); - about->private_data = priv; + about->priv = priv; priv->name = NULL; priv->version = NULL; @@ -570,17 +570,20 @@ gtk_about_dialog_init (GtkAboutDialog *about) priv->hovering_over_link = FALSE; priv->wrap_license = FALSE; + content_area = gtk_dialog_get_content_area (dialog); + action_area = gtk_dialog_get_action_area (dialog); + gtk_dialog_set_has_separator (dialog, FALSE); gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); - gtk_box_set_spacing (GTK_BOX (dialog->vbox), 2); /* 2 * 5 + 2 = 12 */ - gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 5); + gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */ + gtk_container_set_border_width (GTK_CONTAINER (action_area), 5); /* Widgets */ gtk_widget_push_composite_child (); vbox = gtk_vbox_new (FALSE, 8); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); - gtk_box_pack_start (GTK_BOX (dialog->vbox), vbox, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0); priv->logo_image = gtk_image_new (); gtk_box_pack_start (GTK_BOX (vbox), priv->logo_image, FALSE, FALSE, 0); @@ -627,9 +630,9 @@ gtk_about_dialog_init (GtkAboutDialog *about) image = gtk_image_new_from_stock (GTK_STOCK_ABOUT, GTK_ICON_SIZE_BUTTON); gtk_button_set_image (GTK_BUTTON (button), image); gtk_widget_set_no_show_all (button, TRUE); - gtk_box_pack_end (GTK_BOX (GTK_DIALOG (about)->action_area), - button, FALSE, TRUE, 0); - gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (about)->action_area), button, TRUE); + gtk_box_pack_end (GTK_BOX (action_area), + button, FALSE, TRUE, 0); + gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (action_area), button, TRUE); g_signal_connect (button, "clicked", G_CALLBACK (display_credits_dialog), about); priv->credits_button = button; @@ -639,9 +642,9 @@ gtk_about_dialog_init (GtkAboutDialog *about) button = gtk_button_new_from_stock (_("_License")); gtk_widget_set_can_default (button, TRUE); gtk_widget_set_no_show_all (button, TRUE); - gtk_box_pack_end (GTK_BOX (GTK_DIALOG (about)->action_area), - button, FALSE, TRUE, 0); - gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (GTK_DIALOG (about)->action_area), button, TRUE); + gtk_box_pack_end (GTK_BOX (action_area), + button, FALSE, TRUE, 0); + gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (action_area), button, TRUE); g_signal_connect (button, "clicked", G_CALLBACK (display_license_dialog), about); priv->license_button = button; @@ -663,7 +666,7 @@ static void gtk_about_dialog_finalize (GObject *object) { GtkAboutDialog *about = GTK_ABOUT_DIALOG (object); - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; g_free (priv->name); g_free (priv->version); @@ -694,7 +697,7 @@ gtk_about_dialog_set_property (GObject *object, GParamSpec *pspec) { GtkAboutDialog *about = GTK_ABOUT_DIALOG (object); - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; switch (prop_id) { @@ -753,9 +756,9 @@ gtk_about_dialog_get_property (GObject *object, GParamSpec *pspec) { GtkAboutDialog *about = GTK_ABOUT_DIALOG (object); - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; - - switch (prop_id) + GtkAboutDialogPrivate *priv = about->priv; + + switch (prop_id) { case PROP_NAME: g_value_set_string (value, priv->name); @@ -819,7 +822,7 @@ gtk_about_dialog_get_property (GObject *object, static void update_website (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; gtk_widget_show (priv->website_label); @@ -865,25 +868,6 @@ gtk_about_dialog_show (GtkWidget *widget) } /** - * gtk_about_dialog_get_name: - * @about: a #GtkAboutDialog - * - * Returns the program name displayed in the about dialog. - * - * Return value: The program name. The string is owned by the about - * dialog and must not be modified. - * - * Since: 2.6 - * - * Deprecated: 2.12: Use gtk_about_dialog_get_program_name() instead. - */ -G_CONST_RETURN gchar * -gtk_about_dialog_get_name (GtkAboutDialog *about) -{ - return gtk_about_dialog_get_program_name (about); -} - -/** * gtk_about_dialog_get_program_name: * @about: a #GtkAboutDialog * @@ -901,7 +885,7 @@ gtk_about_dialog_get_program_name (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; return priv->name; } @@ -912,7 +896,7 @@ update_name_version (GtkAboutDialog *about) GtkAboutDialogPrivate *priv; gchar *title_string, *name_string; - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; title_string = g_strdup_printf (_("About %s"), priv->name); gtk_window_set_title (GTK_WINDOW (about), title_string); @@ -931,25 +915,6 @@ update_name_version (GtkAboutDialog *about) } /** - * gtk_about_dialog_set_name: - * @about: a #GtkAboutDialog - * @name: (allow-none): the program name - * - * Sets the name to display in the about dialog. - * If this is not set, it defaults to g_get_application_name(). - * - * Since: 2.6 - * - * Deprecated: 2.12: Use gtk_about_dialog_set_program_name() instead. - */ -void -gtk_about_dialog_set_name (GtkAboutDialog *about, - const gchar *name) -{ - gtk_about_dialog_set_program_name (about, name); -} - -/** * gtk_about_dialog_set_program_name: * @about: a #GtkAboutDialog * @name: the program name @@ -968,7 +933,8 @@ gtk_about_dialog_set_program_name (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; + tmp = priv->name; priv->name = g_strdup (name ? name : g_get_application_name ()); g_free (tmp); @@ -993,13 +959,9 @@ gtk_about_dialog_set_program_name (GtkAboutDialog *about, G_CONST_RETURN gchar * gtk_about_dialog_get_version (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv; - g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; - - return priv->version; + return about->priv->version; } /** @@ -1020,7 +982,7 @@ gtk_about_dialog_set_version (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->version; priv->version = g_strdup (version); @@ -1045,13 +1007,9 @@ gtk_about_dialog_set_version (GtkAboutDialog *about, G_CONST_RETURN gchar * gtk_about_dialog_get_copyright (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv; - g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; - - return priv->copyright; + return about->priv->copyright; } /** @@ -1073,7 +1031,7 @@ gtk_about_dialog_set_copyright (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->copyright; priv->copyright = g_strdup (copyright); @@ -1108,13 +1066,9 @@ gtk_about_dialog_set_copyright (GtkAboutDialog *about, G_CONST_RETURN gchar * gtk_about_dialog_get_comments (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv; - g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; - - return priv->comments; + return about->priv->comments; } /** @@ -1136,7 +1090,7 @@ gtk_about_dialog_set_comments (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->comments; if (comments) @@ -1169,13 +1123,9 @@ gtk_about_dialog_set_comments (GtkAboutDialog *about, G_CONST_RETURN gchar * gtk_about_dialog_get_license (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv; - g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; - - return priv->license; + return about->priv->license; } /** @@ -1198,7 +1148,7 @@ gtk_about_dialog_set_license (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->license; if (license) @@ -1230,13 +1180,9 @@ gtk_about_dialog_set_license (GtkAboutDialog *about, gboolean gtk_about_dialog_get_wrap_license (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv; - g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), FALSE); - priv = (GtkAboutDialogPrivate *)about->private_data; - - return priv->wrap_license; + return about->priv->wrap_license; } /** @@ -1257,7 +1203,7 @@ gtk_about_dialog_set_wrap_license (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; wrap_license = wrap_license != FALSE; @@ -1287,7 +1233,7 @@ gtk_about_dialog_get_website (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; return priv->website_url; } @@ -1313,7 +1259,7 @@ gtk_about_dialog_set_website (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->website_url; priv->website_url = g_strdup (website); @@ -1342,7 +1288,7 @@ gtk_about_dialog_get_website_label (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; return priv->website_text; } @@ -1366,7 +1312,7 @@ gtk_about_dialog_set_website_label (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->website_text; priv->website_text = g_strdup (website_label); @@ -1397,7 +1343,7 @@ gtk_about_dialog_get_authors (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; return (const gchar * const *) priv->authors; } @@ -1405,7 +1351,7 @@ gtk_about_dialog_get_authors (GtkAboutDialog *about) static void update_credits_button_visibility (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv = about->private_data; + GtkAboutDialogPrivate *priv = about->priv; gboolean show; show = priv->authors != NULL || @@ -1439,7 +1385,7 @@ gtk_about_dialog_set_authors (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->authors; priv->authors = g_strdupv ((gchar **)authors); @@ -1470,7 +1416,7 @@ gtk_about_dialog_get_documenters (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; return (const gchar * const *)priv->documenters; } @@ -1494,7 +1440,7 @@ gtk_about_dialog_set_documenters (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->documenters; priv->documenters = g_strdupv ((gchar **)documenters); @@ -1525,7 +1471,7 @@ gtk_about_dialog_get_artists (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; return (const gchar * const *)priv->artists; } @@ -1549,7 +1495,7 @@ gtk_about_dialog_set_artists (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->artists; priv->artists = g_strdupv ((gchar **)artists); @@ -1575,13 +1521,9 @@ gtk_about_dialog_set_artists (GtkAboutDialog *about, G_CONST_RETURN gchar * gtk_about_dialog_get_translator_credits (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv; - g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; - - return priv->translator_credits; + return about->priv->translator_credits; } /** @@ -1615,7 +1557,7 @@ gtk_about_dialog_set_translator_credits (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; tmp = priv->translator_credits; priv->translator_credits = g_strdup (translator_credits); @@ -1645,7 +1587,7 @@ gtk_about_dialog_get_logo (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; if (gtk_image_get_storage_type (GTK_IMAGE (priv->logo_image)) == GTK_IMAGE_PIXBUF) return gtk_image_get_pixbuf (GTK_IMAGE (priv->logo_image)); @@ -1690,7 +1632,7 @@ gtk_about_dialog_set_logo (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; g_object_freeze_notify (G_OBJECT (about)); @@ -1740,7 +1682,7 @@ gtk_about_dialog_get_logo_icon_name (GtkAboutDialog *about) g_return_val_if_fail (GTK_IS_ABOUT_DIALOG (about), NULL); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; if (gtk_image_get_storage_type (GTK_IMAGE (priv->logo_image)) == GTK_IMAGE_ICON_NAME) gtk_image_get_icon_name (GTK_IMAGE (priv->logo_image), &icon_name, NULL); @@ -1767,7 +1709,7 @@ gtk_about_dialog_set_logo_icon_name (GtkAboutDialog *about, g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); - priv = (GtkAboutDialogPrivate *)about->private_data; + priv = about->priv; g_object_freeze_notify (G_OBJECT (about)); @@ -1787,7 +1729,7 @@ follow_if_link (GtkAboutDialog *about, GtkTextIter *iter) { GSList *tags = NULL, *tagp = NULL; - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; gchar *url = NULL; GtkAboutDialogActivateLinkFunc email_hook, url_hook; gpointer email_hook_data, url_hook_data; @@ -1928,7 +1870,7 @@ set_cursor_if_appropriate (GtkAboutDialog *about, gint x, gint y) { - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; GSList *tags = NULL, *tagp = NULL; GtkTextIter iter; gboolean hovering_over_link = FALSE; @@ -1989,7 +1931,7 @@ text_view_visibility_notify_event (GtkWidget *text_view, { gint wx, wy, bx, by; - gdk_window_get_pointer (text_view->window, &wx, &wy, NULL); + gdk_window_get_pointer (gtk_widget_get_window (text_view), &wx, &wy, NULL); gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (text_view), GTK_TEXT_WINDOW_WIDGET, @@ -2017,7 +1959,8 @@ text_view_new (GtkAboutDialog *about, GdkColor color; GdkColor link_color; GdkColor visited_link_color; - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + + GtkAboutDialogPrivate *priv = about->priv; linkify_email = (!activate_email_hook_set || activate_email_hook != NULL); linkify_urls = (!activate_url_hook_set || activate_url_hook != NULL); @@ -2173,9 +2116,11 @@ display_credits_dialog (GtkWidget *button, gpointer data) { GtkAboutDialog *about = (GtkAboutDialog *)data; - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; GtkWidget *dialog, *notebook; GtkDialog *credits_dialog; + GtkWidget *content_area; + GtkWidget *action_area; if (priv->credits_dialog != NULL) { @@ -2189,10 +2134,14 @@ display_credits_dialog (GtkWidget *button, GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, NULL); credits_dialog = GTK_DIALOG (dialog); + + content_area = gtk_dialog_get_content_area (credits_dialog); + action_area = gtk_dialog_get_action_area (credits_dialog); + gtk_dialog_set_has_separator (credits_dialog, FALSE); gtk_container_set_border_width (GTK_CONTAINER (credits_dialog), 5); - gtk_box_set_spacing (GTK_BOX (credits_dialog->vbox), 2); /* 2 * 5 + 2 = 12 */ - gtk_container_set_border_width (GTK_CONTAINER (credits_dialog->action_area), 5); + gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */ + gtk_container_set_border_width (GTK_CONTAINER (action_area), 5); priv->credits_dialog = dialog; gtk_window_set_default_size (GTK_WINDOW (dialog), 360, 260); @@ -2209,7 +2158,7 @@ display_credits_dialog (GtkWidget *button, notebook = gtk_notebook_new (); gtk_container_set_border_width (GTK_CONTAINER (notebook), 5); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (content_area), notebook, TRUE, TRUE, 0); if (priv->authors != NULL) add_credits_page (about, dialog, notebook, _("Written by"), priv->authors); @@ -2249,9 +2198,11 @@ display_license_dialog (GtkWidget *button, gpointer data) { GtkAboutDialog *about = (GtkAboutDialog *)data; - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; GtkWidget *dialog, *view, *sw; - GtkDialog *licence_dialog; + GtkDialog *license_dialog; + GtkWidget *content_area; + GtkWidget *action_area; gchar *strings[2]; if (priv->license_dialog != NULL) @@ -2261,19 +2212,23 @@ display_license_dialog (GtkWidget *button, } dialog = gtk_dialog_new_with_buttons (_("License"), - GTK_WINDOW (about), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, - NULL); - licence_dialog = GTK_DIALOG (dialog); - gtk_dialog_set_has_separator (licence_dialog, FALSE); - gtk_container_set_border_width (GTK_CONTAINER (licence_dialog), 5); - gtk_box_set_spacing (GTK_BOX (licence_dialog->vbox), 2); /* 2 * 5 + 2 = 12 */ - gtk_container_set_border_width (GTK_CONTAINER (licence_dialog->action_area), 5); + GTK_WINDOW (about), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, GTK_RESPONSE_CANCEL, + NULL); + license_dialog = GTK_DIALOG (dialog); + + content_area = gtk_dialog_get_content_area (license_dialog); + action_area = gtk_dialog_get_action_area (license_dialog); + + gtk_dialog_set_has_separator (license_dialog, FALSE); + gtk_container_set_border_width (GTK_CONTAINER (license_dialog), 5); + gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */ + gtk_container_set_border_width (GTK_CONTAINER (action_area), 5); priv->license_dialog = dialog; gtk_window_set_default_size (GTK_WINDOW (dialog), 420, 320); - gtk_dialog_set_default_response (licence_dialog, GTK_RESPONSE_CANCEL); + gtk_dialog_set_default_response (license_dialog, GTK_RESPONSE_CANCEL); gtk_window_set_modal (GTK_WINDOW (dialog), gtk_window_get_modal (GTK_WINDOW (about))); @@ -2292,7 +2247,7 @@ display_license_dialog (GtkWidget *button, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); g_signal_connect (sw, "map", G_CALLBACK (set_policy), NULL); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), sw, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (content_area), sw, TRUE, TRUE, 0); strings[0] = priv->license; strings[1] = NULL; @@ -2396,7 +2351,7 @@ gtk_about_dialog_set_url_hook (GtkAboutDialogActivateLinkFunc func, static void close_cb (GtkAboutDialog *about) { - GtkAboutDialogPrivate *priv = (GtkAboutDialogPrivate *)about->private_data; + GtkAboutDialogPrivate *priv = about->priv; if (priv->license_dialog != NULL) { diff --git a/gtk/gtkaboutdialog.h b/gtk/gtkaboutdialog.h index efb50b1cf0..5bcd67c662 100644 --- a/gtk/gtkaboutdialog.h +++ b/gtk/gtkaboutdialog.h @@ -22,7 +22,7 @@ Author: Anders Carlsson <andersca@codefactory.se> */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -42,6 +42,7 @@ G_BEGIN_DECLS typedef struct _GtkAboutDialog GtkAboutDialog; typedef struct _GtkAboutDialogClass GtkAboutDialogClass; +typedef struct _GtkAboutDialogPrivate GtkAboutDialogPrivate; /** * GtkAboutDialog: @@ -54,7 +55,7 @@ struct _GtkAboutDialog GtkDialog parent_instance; /*< private >*/ - gpointer GSEAL (private_data); + GtkAboutDialogPrivate *priv; }; struct _GtkAboutDialogClass @@ -73,12 +74,6 @@ GtkWidget *gtk_about_dialog_new (void); void gtk_show_about_dialog (GtkWindow *parent, const gchar *first_property_name, ...) G_GNUC_NULL_TERMINATED; - -#ifndef GTK_DISABLE_DEPRECATED -G_CONST_RETURN gchar *gtk_about_dialog_get_name (GtkAboutDialog *about); -void gtk_about_dialog_set_name (GtkAboutDialog *about, - const gchar *name); -#endif /* GTK_DISABLE_DEPRECATED */ G_CONST_RETURN gchar *gtk_about_dialog_get_program_name (GtkAboutDialog *about); void gtk_about_dialog_set_program_name (GtkAboutDialog *about, const gchar *name); diff --git a/gtk/gtkaccelgroup.c b/gtk/gtkaccelgroup.c index 9dbab6f586..b920f8ea73 100644 --- a/gtk/gtkaccelgroup.c +++ b/gtk/gtkaccelgroup.c @@ -29,6 +29,7 @@ #include <stdlib.h> #include "gtkaccelgroup.h" +#include "gtkaccelgroupprivate.h" #include "gtkaccellabel.h" /* For _gtk_accel_label_class_get_accelerator_label */ #include "gtkaccelmap.h" #include "gtkintl.h" @@ -62,6 +63,7 @@ * and mnemonics, of course. */ +#define GTK_ACCEL_GROUP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupPrivate)) /* --- prototypes --- */ static void gtk_accel_group_finalize (GObject *object); @@ -171,6 +173,8 @@ gtk_accel_group_class_init (GtkAccelGroupClass *class) G_TYPE_UINT, GDK_TYPE_MODIFIER_TYPE, G_TYPE_CLOSURE); + + g_type_class_add_private (object_class, sizeof (GtkAccelGroupPrivate)); } static void @@ -179,9 +183,9 @@ gtk_accel_group_finalize (GObject *object) GtkAccelGroup *accel_group = GTK_ACCEL_GROUP (object); guint i; - for (i = 0; i < accel_group->n_accels; i++) + for (i = 0; i < accel_group->priv->n_accels; i++) { - GtkAccelGroupEntry *entry = &accel_group->priv_accels[i]; + GtkAccelGroupEntry *entry = &accel_group->priv->priv_accels[i]; if (entry->accel_path_quark) { @@ -195,7 +199,7 @@ gtk_accel_group_finalize (GObject *object) g_closure_unref (entry->closure); } - g_free (accel_group->priv_accels); + g_free (accel_group->priv->priv_accels); G_OBJECT_CLASS (gtk_accel_group_parent_class)->finalize (object); } @@ -211,10 +215,10 @@ gtk_accel_group_get_property (GObject *object, switch (param_id) { case PROP_IS_LOCKED: - g_value_set_boolean (value, accel_group->lock_count > 0); + g_value_set_boolean (value, accel_group->priv->lock_count > 0); break; case PROP_MODIFIER_MASK: - g_value_set_flags (value, accel_group->modifier_mask); + g_value_set_flags (value, accel_group->priv->modifier_mask); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -225,11 +229,15 @@ gtk_accel_group_get_property (GObject *object, static void gtk_accel_group_init (GtkAccelGroup *accel_group) { - accel_group->lock_count = 0; - accel_group->modifier_mask = gtk_accelerator_get_default_mod_mask (); - accel_group->acceleratables = NULL; - accel_group->n_accels = 0; - accel_group->priv_accels = NULL; + GtkAccelGroupPrivate *priv = GTK_ACCEL_GROUP_GET_PRIVATE (accel_group); + + priv->lock_count = 0; + priv->modifier_mask = gtk_accelerator_get_default_mod_mask (); + priv->acceleratables = NULL; + priv->n_accels = 0; + priv->priv_accels = NULL; + + accel_group->priv = priv; } /** @@ -261,7 +269,7 @@ gtk_accel_group_get_is_locked (GtkAccelGroup *accel_group) { g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE); - return accel_group->lock_count > 0; + return accel_group->priv->lock_count > 0; } /** @@ -280,7 +288,7 @@ gtk_accel_group_get_modifier_mask (GtkAccelGroup *accel_group) { g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), 0); - return accel_group->modifier_mask; + return accel_group->priv->modifier_mask; } static void @@ -294,7 +302,7 @@ accel_group_weak_ref_detach (GSList *free_list, GtkAccelGroup *accel_group; accel_group = slist->data; - accel_group->acceleratables = g_slist_remove (accel_group->acceleratables, stale_object); + accel_group->priv->acceleratables = g_slist_remove (accel_group->priv->acceleratables, stale_object); g_object_unref (accel_group); } g_slist_free (free_list); @@ -309,10 +317,10 @@ _gtk_accel_group_attach (GtkAccelGroup *accel_group, g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (g_slist_find (accel_group->acceleratables, object) == NULL); + g_return_if_fail (g_slist_find (accel_group->priv->acceleratables, object) == NULL); g_object_ref (accel_group); - accel_group->acceleratables = g_slist_prepend (accel_group->acceleratables, object); + accel_group->priv->acceleratables = g_slist_prepend (accel_group->priv->acceleratables, object); slist = g_object_get_qdata (object, quark_acceleratable_groups); if (slist) g_object_weak_unref (object, @@ -333,9 +341,9 @@ _gtk_accel_group_detach (GtkAccelGroup *accel_group, g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (g_slist_find (accel_group->acceleratables, object) != NULL); + g_return_if_fail (g_slist_find (accel_group->priv->acceleratables, object) != NULL); - accel_group->acceleratables = g_slist_remove (accel_group->acceleratables, object); + accel_group->priv->acceleratables = g_slist_remove (accel_group->priv->acceleratables, object); slist = g_object_get_qdata (object, quark_acceleratable_groups); g_object_weak_unref (object, (GWeakNotify) accel_group_weak_ref_detach, @@ -389,12 +397,12 @@ gtk_accel_group_find (GtkAccelGroup *accel_group, g_return_val_if_fail (find_func != NULL, NULL); g_object_ref (accel_group); - for (i = 0; i < accel_group->n_accels; i++) - if (find_func (&accel_group->priv_accels[i].key, - accel_group->priv_accels[i].closure, + for (i = 0; i < accel_group->priv->n_accels; i++) + if (find_func (&accel_group->priv->priv_accels[i].key, + accel_group->priv->priv_accels[i].closure, data)) { - key = &accel_group->priv_accels[i].key; + key = &accel_group->priv->priv_accels[i].key; break; } g_object_unref (accel_group); @@ -421,9 +429,9 @@ gtk_accel_group_lock (GtkAccelGroup *accel_group) { g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); - accel_group->lock_count += 1; + accel_group->priv->lock_count += 1; - if (accel_group->lock_count == 1) { + if (accel_group->priv->lock_count == 1) { /* State change from unlocked to locked */ g_object_notify (G_OBJECT (accel_group), "is-locked"); } @@ -439,11 +447,11 @@ void gtk_accel_group_unlock (GtkAccelGroup *accel_group) { g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); - g_return_if_fail (accel_group->lock_count > 0); + g_return_if_fail (accel_group->priv->lock_count > 0); - accel_group->lock_count -= 1; + accel_group->priv->lock_count -= 1; - if (accel_group->lock_count < 1) { + if (accel_group->priv->lock_count < 1) { /* State change from locked to unlocked */ g_object_notify (G_OBJECT (accel_group), "is-locked"); } @@ -479,25 +487,25 @@ quick_accel_add (GtkAccelGroup *accel_group, GClosure *closure, GQuark path_quark) { - guint pos, i = accel_group->n_accels++; + guint pos, i = accel_group->priv->n_accels++; GtkAccelGroupEntry key; /* find position */ key.key.accel_key = accel_key; key.key.accel_mods = accel_mods; for (pos = 0; pos < i; pos++) - if (bsearch_compare_accels (&key, accel_group->priv_accels + pos) < 0) + if (bsearch_compare_accels (&key, accel_group->priv->priv_accels + pos) < 0) break; /* insert at position, ref closure */ - accel_group->priv_accels = g_renew (GtkAccelGroupEntry, accel_group->priv_accels, accel_group->n_accels); - g_memmove (accel_group->priv_accels + pos + 1, accel_group->priv_accels + pos, - (i - pos) * sizeof (accel_group->priv_accels[0])); - accel_group->priv_accels[pos].key.accel_key = accel_key; - accel_group->priv_accels[pos].key.accel_mods = accel_mods; - accel_group->priv_accels[pos].key.accel_flags = accel_flags; - accel_group->priv_accels[pos].closure = g_closure_ref (closure); - accel_group->priv_accels[pos].accel_path_quark = path_quark; + accel_group->priv->priv_accels = g_renew (GtkAccelGroupEntry, accel_group->priv->priv_accels, accel_group->priv->n_accels); + g_memmove (accel_group->priv->priv_accels + pos + 1, accel_group->priv->priv_accels + pos, + (i - pos) * sizeof (accel_group->priv->priv_accels[0])); + accel_group->priv->priv_accels[pos].key.accel_key = accel_key; + accel_group->priv->priv_accels[pos].key.accel_mods = accel_mods; + accel_group->priv->priv_accels[pos].key.accel_flags = accel_flags; + accel_group->priv->priv_accels[pos].closure = g_closure_ref (closure); + accel_group->priv->priv_accels[pos].accel_path_quark = path_quark; g_closure_sink (closure); /* handle closure invalidation and reverse lookups */ @@ -528,7 +536,7 @@ quick_accel_remove (GtkAccelGroup *accel_group, guint pos) { GQuark accel_quark = 0; - GtkAccelGroupEntry *entry = accel_group->priv_accels + pos; + GtkAccelGroupEntry *entry = accel_group->priv->priv_accels + pos; guint accel_key = entry->key.accel_key; GdkModifierType accel_mods = entry->key.accel_mods; GClosure *closure = entry->closure; @@ -554,9 +562,9 @@ quick_accel_remove (GtkAccelGroup *accel_group, _gtk_accel_map_remove_group (g_quark_to_string (entry->accel_path_quark), accel_group); /* physically remove */ - accel_group->n_accels -= 1; + accel_group->priv->n_accels -= 1; g_memmove (entry, entry + 1, - (accel_group->n_accels - pos) * sizeof (accel_group->priv_accels[0])); + (accel_group->priv->n_accels - pos) * sizeof (accel_group->priv->priv_accels[0])); /* and notify */ if (accel_quark) @@ -577,24 +585,24 @@ quick_accel_find (GtkAccelGroup *accel_group, *count_p = 0; - if (!accel_group->n_accels) + if (!accel_group->priv->n_accels) return NULL; key.key.accel_key = accel_key; key.key.accel_mods = accel_mods; - entry = bsearch (&key, accel_group->priv_accels, accel_group->n_accels, - sizeof (accel_group->priv_accels[0]), bsearch_compare_accels); + entry = bsearch (&key, accel_group->priv->priv_accels, accel_group->priv->n_accels, + sizeof (accel_group->priv->priv_accels[0]), bsearch_compare_accels); if (!entry) return NULL; /* step back to the first member */ - for (; entry > accel_group->priv_accels; entry--) + for (; entry > accel_group->priv->priv_accels; entry--) if (entry[-1].key.accel_key != accel_key || entry[-1].key.accel_mods != accel_mods) break; /* count equal members */ - for (; entry + *count_p < accel_group->priv_accels + accel_group->n_accels; (*count_p)++) + for (; entry + *count_p < accel_group->priv->priv_accels + accel_group->priv->n_accels; (*count_p)++) if (entry[*count_p].key.accel_key != accel_key || entry[*count_p].key.accel_mods != accel_mods) break; @@ -708,8 +716,8 @@ gtk_accel_group_disconnect (GtkAccelGroup *accel_group, g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE); - for (i = 0; i < accel_group->n_accels; i++) - if (accel_group->priv_accels[i].closure == closure || !closure) + for (i = 0; i < accel_group->priv->n_accels; i++) + if (accel_group->priv->priv_accels[i].closure == closure) { g_object_ref (accel_group); quick_accel_remove (accel_group, i); @@ -778,10 +786,10 @@ _gtk_accel_group_reconnect (GtkAccelGroup *accel_group, g_object_ref (accel_group); - for (i = 0; i < accel_group->n_accels; i++) - if (accel_group->priv_accels[i].accel_path_quark == accel_path_quark) + for (i = 0; i < accel_group->priv->n_accels; i++) + if (accel_group->priv->priv_accels[i].accel_path_quark == accel_path_quark) { - GClosure *closure = g_closure_ref (accel_group->priv_accels[i].closure); + GClosure *closure = g_closure_ref (accel_group->priv->priv_accels[i].closure); clist = g_slist_prepend (clist, closure); } @@ -799,6 +807,14 @@ _gtk_accel_group_reconnect (GtkAccelGroup *accel_group, g_object_unref (accel_group); } +GSList* +_gtk_accel_group_get_accelerables (GtkAccelGroup *accel_group) +{ + g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), NULL); + + return accel_group->priv->acceleratables; +} + /** * gtk_accel_group_query: * @accel_group: the accelerator group to query diff --git a/gtk/gtkaccelgroup.h b/gtk/gtkaccelgroup.h index b1e874491e..b00b039202 100644 --- a/gtk/gtkaccelgroup.h +++ b/gtk/gtkaccelgroup.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -57,10 +57,11 @@ typedef enum /* --- typedefs & structures --- */ -typedef struct _GtkAccelGroup GtkAccelGroup; -typedef struct _GtkAccelGroupClass GtkAccelGroupClass; -typedef struct _GtkAccelKey GtkAccelKey; -typedef struct _GtkAccelGroupEntry GtkAccelGroupEntry; +typedef struct _GtkAccelGroup GtkAccelGroup; +typedef struct _GtkAccelGroupClass GtkAccelGroupClass; +typedef struct _GtkAccelGroupPrivate GtkAccelGroupPrivate; +typedef struct _GtkAccelKey GtkAccelKey; +typedef struct _GtkAccelGroupEntry GtkAccelGroupEntry; typedef gboolean (*GtkAccelGroupActivate) (GtkAccelGroup *accel_group, GObject *acceleratable, guint keyval, @@ -85,13 +86,8 @@ typedef gboolean (*GtkAccelGroupFindFunc) (GtkAccelKey *key, */ struct _GtkAccelGroup { - GObject parent; - - guint GSEAL (lock_count); - GdkModifierType GSEAL (modifier_mask); - GSList *GSEAL (acceleratables); - guint GSEAL (n_accels); - GtkAccelGroupEntry *GSEAL (priv_accels); + GObject parent; + GtkAccelGroupPrivate *priv; }; struct _GtkAccelGroupClass @@ -183,6 +179,7 @@ GtkAccelGroupEntry* gtk_accel_group_query (GtkAccelGroup *accel_group, void _gtk_accel_group_reconnect (GtkAccelGroup *accel_group, GQuark accel_path_quark); +GSList* _gtk_accel_group_get_accelerables (GtkAccelGroup *accel_group); struct _GtkAccelGroupEntry { @@ -192,24 +189,6 @@ struct _GtkAccelGroupEntry }; -#ifndef GTK_DISABLE_DEPRECATED -/** - * gtk_accel_group_ref: - * - * Deprecated equivalent of g_object_ref(). - * - * Returns: the accel group that was passed in - */ -#define gtk_accel_group_ref g_object_ref - -/** - * gtk_accel_group_unref: - * - * Deprecated equivalent of g_object_unref(). - */ -#define gtk_accel_group_unref g_object_unref -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS diff --git a/gtk/gtkaccelgroupprivate.h b/gtk/gtkaccelgroupprivate.h new file mode 100644 index 0000000000..af42d13b3f --- /dev/null +++ b/gtk/gtkaccelgroupprivate.h @@ -0,0 +1,36 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* GTK - The GIMP Toolkit + * Copyright (C) Javier Jardón <jjardon@gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_ACCEL_GROUP_PRIVATE_H__ +#define __GTK_ACCEL_GROUP_PRIVATE_H__ + + +#define GTK_ACCEL_GROUP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupPrivate)) + +struct _GtkAccelGroupPrivate +{ + guint lock_count; + GdkModifierType modifier_mask; + GSList *acceleratables; + guint n_accels; + GtkAccelGroupEntry *priv_accels; +}; + +#endif /* __GTK_ACCEL_GROUP_PRIVATE_H__ */ diff --git a/gtk/gtkaccellabel.c b/gtk/gtkaccellabel.c index da982bddf0..c02be06cc5 100644 --- a/gtk/gtkaccellabel.c +++ b/gtk/gtkaccellabel.c @@ -99,6 +99,16 @@ enum { PROP_ACCEL_WIDGET }; +struct _GtkAccelLabelPrivate +{ + guint accel_padding; /* should be style property? */ + GtkWidget *accel_widget; /* done*/ + GClosure *accel_closure; /* has set function */ + GtkAccelGroup *accel_group; /* set by set_accel_closure() */ + gchar *accel_string; /* has set function */ + guint16 accel_string_width; /* seems to be private */ +}; + static void gtk_accel_label_set_property (GObject *object, guint prop_id, const GValue *value, @@ -115,6 +125,7 @@ static gboolean gtk_accel_label_expose_event (GtkWidget *widget, GdkEventExpose *event); static const gchar *gtk_accel_label_get_string (GtkAccelLabel *accel_label); +#define GTK_ACCEL_LABEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_ACCEL_LABEL, GtkAccelLabelPrivate)) G_DEFINE_TYPE (GtkAccelLabel, gtk_accel_label, GTK_TYPE_LABEL) @@ -186,6 +197,8 @@ gtk_accel_label_class_init (GtkAccelLabelClass *class) P_("The widget to be monitored for accelerator changes"), GTK_TYPE_WIDGET, GTK_PARAM_READWRITE)); + + g_type_class_add_private (gobject_class, sizeof (GtkAccelLabelPrivate)); } static void @@ -225,10 +238,10 @@ gtk_accel_label_get_property (GObject *object, switch (prop_id) { case PROP_ACCEL_CLOSURE: - g_value_set_boxed (value, accel_label->accel_closure); + g_value_set_boxed (value, accel_label->priv->accel_closure); break; case PROP_ACCEL_WIDGET: - g_value_set_object (value, accel_label->accel_widget); + g_value_set_object (value, accel_label->priv->accel_widget); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -239,11 +252,15 @@ gtk_accel_label_get_property (GObject *object, static void gtk_accel_label_init (GtkAccelLabel *accel_label) { - accel_label->accel_padding = 3; - accel_label->accel_widget = NULL; - accel_label->accel_closure = NULL; - accel_label->accel_group = NULL; - accel_label->accel_string = NULL; + GtkAccelLabelPrivate *priv = GTK_ACCEL_LABEL_GET_PRIVATE (accel_label); + + priv->accel_padding = 3; + priv->accel_widget = NULL; + priv->accel_closure = NULL; + priv->accel_group = NULL; + priv->accel_string = NULL; + + accel_label->priv = priv; } /** @@ -284,8 +301,8 @@ gtk_accel_label_finalize (GObject *object) { GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (object); - g_free (accel_label->accel_string); - + g_free (accel_label->priv->accel_string); + G_OBJECT_CLASS (gtk_accel_label_parent_class)->finalize (object); } @@ -303,7 +320,7 @@ gtk_accel_label_get_accel_widget (GtkAccelLabel *accel_label) { g_return_val_if_fail (GTK_IS_ACCEL_LABEL (accel_label), NULL); - return accel_label->accel_widget; + return accel_label->priv->accel_widget; } /** @@ -320,9 +337,9 @@ guint gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label) { g_return_val_if_fail (GTK_IS_ACCEL_LABEL (accel_label), 0); - - return (accel_label->accel_string_width + - (accel_label->accel_string_width ? accel_label->accel_padding : 0)); + + return (accel_label->priv->accel_string_width + + (accel_label->priv->accel_string_width ? accel_label->priv->accel_padding : 0)); } static void @@ -337,8 +354,8 @@ gtk_accel_label_size_request (GtkWidget *widget, layout = gtk_widget_create_pango_layout (widget, gtk_accel_label_get_string (accel_label)); pango_layout_get_pixel_size (layout, &width, NULL); - accel_label->accel_string_width = width; - + accel_label->priv->accel_string_width = width; + g_object_unref (layout); } @@ -365,13 +382,17 @@ gtk_accel_label_expose_event (GtkWidget *widget, direction = gtk_widget_get_direction (widget); - if (gtk_widget_is_drawable (widget)) + if (gtk_widget_is_drawable (widget)) { guint ac_width; - + GtkAllocation allocation; + GtkRequisition requisition; + ac_width = gtk_accel_label_get_accel_width (accel_label); - - if (widget->allocation.width >= widget->requisition.width + ac_width) + gtk_widget_get_allocation (widget, &allocation); + gtk_widget_size_request (widget, &requisition); + + if (allocation.width >= requisition.width + ac_width) { PangoLayout *label_layout; PangoLayout *accel_layout; @@ -379,12 +400,13 @@ gtk_accel_label_expose_event (GtkWidget *widget, gint x; gint y; - + gint xpad; + label_layout = gtk_label_get_layout (GTK_LABEL (accel_label)); if (direction == GTK_TEXT_DIR_RTL) - widget->allocation.x += ac_width; - widget->allocation.width -= ac_width; + allocation.x += ac_width; + allocation.width -= ac_width; if (gtk_label_get_ellipsize (label)) pango_layout_set_width (label_layout, pango_layout_get_width (label_layout) @@ -393,17 +415,19 @@ gtk_accel_label_expose_event (GtkWidget *widget, if (GTK_WIDGET_CLASS (gtk_accel_label_parent_class)->expose_event) GTK_WIDGET_CLASS (gtk_accel_label_parent_class)->expose_event (widget, event); if (direction == GTK_TEXT_DIR_RTL) - widget->allocation.x -= ac_width; - widget->allocation.width += ac_width; + allocation.x -= ac_width; + allocation.width += ac_width; if (gtk_label_get_ellipsize (label)) pango_layout_set_width (label_layout, pango_layout_get_width (label_layout) + ac_width * PANGO_SCALE); - + + gtk_misc_get_padding (misc, &xpad, NULL); + if (direction == GTK_TEXT_DIR_RTL) - x = widget->allocation.x + misc->xpad; + x = allocation.x + xpad; else - x = widget->allocation.x + widget->allocation.width - misc->xpad - ac_width; + x = allocation.x + allocation.width - xpad - ac_width; gtk_label_get_layout_offsets (GTK_LABEL (accel_label), NULL, &y); @@ -411,8 +435,8 @@ gtk_accel_label_expose_event (GtkWidget *widget, y += get_first_baseline (label_layout) - get_first_baseline (accel_layout); - gtk_paint_layout (widget->style, - widget->window, + gtk_paint_layout (gtk_widget_get_style (widget), + gtk_widget_get_window (widget), gtk_widget_get_state (widget), FALSE, &event->area, @@ -440,9 +464,9 @@ refetch_widget_accel_closure (GtkAccelLabel *accel_label) GList *clist, *list; g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label)); - g_return_if_fail (GTK_IS_WIDGET (accel_label->accel_widget)); + g_return_if_fail (GTK_IS_WIDGET (accel_label->priv->accel_widget)); - clist = gtk_widget_list_accel_closures (accel_label->accel_widget); + clist = gtk_widget_list_accel_closures (accel_label->priv->accel_widget); for (list = clist; list; list = list->next) { /* we just take the first closure used */ @@ -468,21 +492,21 @@ gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label, if (accel_widget) g_return_if_fail (GTK_IS_WIDGET (accel_widget)); - if (accel_widget != accel_label->accel_widget) + if (accel_widget != accel_label->priv->accel_widget) { - if (accel_label->accel_widget) + if (accel_label->priv->accel_widget) { gtk_accel_label_set_accel_closure (accel_label, NULL); - g_signal_handlers_disconnect_by_func (accel_label->accel_widget, + g_signal_handlers_disconnect_by_func (accel_label->priv->accel_widget, refetch_widget_accel_closure, accel_label); - g_object_unref (accel_label->accel_widget); + g_object_unref (accel_label->priv->accel_widget); } - accel_label->accel_widget = accel_widget; - if (accel_label->accel_widget) + accel_label->priv->accel_widget = accel_widget; + if (accel_label->priv->accel_widget) { - g_object_ref (accel_label->accel_widget); - g_signal_connect_object (accel_label->accel_widget, "accel-closures-changed", + g_object_ref (accel_label->priv->accel_widget); + g_signal_connect_object (accel_label->priv->accel_widget, "accel-closures-changed", G_CALLBACK (refetch_widget_accel_closure), accel_label, G_CONNECT_SWAPPED); refetch_widget_accel_closure (accel_label); @@ -494,10 +518,10 @@ gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label, static void gtk_accel_label_reset (GtkAccelLabel *accel_label) { - if (accel_label->accel_string) + if (accel_label->priv->accel_string) { - g_free (accel_label->accel_string); - accel_label->accel_string = NULL; + g_free (accel_label->priv->accel_string); + accel_label->priv->accel_string = NULL; } gtk_widget_queue_resize (GTK_WIDGET (accel_label)); @@ -510,7 +534,7 @@ check_accel_changed (GtkAccelGroup *accel_group, GClosure *accel_closure, GtkAccelLabel *accel_label) { - if (accel_closure == accel_label->accel_closure) + if (accel_closure == accel_label->priv->accel_closure) gtk_accel_label_reset (accel_label); } @@ -530,22 +554,22 @@ gtk_accel_label_set_accel_closure (GtkAccelLabel *accel_label, if (accel_closure) g_return_if_fail (gtk_accel_group_from_accel_closure (accel_closure) != NULL); - if (accel_closure != accel_label->accel_closure) + if (accel_closure != accel_label->priv->accel_closure) { - if (accel_label->accel_closure) + if (accel_label->priv->accel_closure) { - g_signal_handlers_disconnect_by_func (accel_label->accel_group, + g_signal_handlers_disconnect_by_func (accel_label->priv->accel_group, check_accel_changed, accel_label); - accel_label->accel_group = NULL; - g_closure_unref (accel_label->accel_closure); + accel_label->priv->accel_group = NULL; + g_closure_unref (accel_label->priv->accel_closure); } - accel_label->accel_closure = accel_closure; - if (accel_label->accel_closure) + accel_label->priv->accel_closure = accel_closure; + if (accel_label->priv->accel_closure) { - g_closure_ref (accel_label->accel_closure); - accel_label->accel_group = gtk_accel_group_from_accel_closure (accel_closure); - g_signal_connect_object (accel_label->accel_group, "accel-changed", + g_closure_ref (accel_label->priv->accel_closure); + accel_label->priv->accel_group = gtk_accel_group_from_accel_closure (accel_closure); + g_signal_connect_object (accel_label->priv->accel_group, "accel-changed", G_CALLBACK (check_accel_changed), accel_label, 0); } @@ -565,10 +589,10 @@ find_accel (GtkAccelKey *key, static const gchar * gtk_accel_label_get_string (GtkAccelLabel *accel_label) { - if (!accel_label->accel_string) + if (!accel_label->priv->accel_string) gtk_accel_label_refetch (accel_label); - return accel_label->accel_string; + return accel_label->priv->accel_string; } /* Underscores in key names are better displayed as spaces @@ -838,19 +862,19 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label) g_return_val_if_fail (GTK_IS_ACCEL_LABEL (accel_label), FALSE); - if (accel_label->accel_string) + if (accel_label->priv->accel_string) { - g_free (accel_label->accel_string); - accel_label->accel_string = NULL; + g_free (accel_label->priv->accel_string); + accel_label->priv->accel_string = NULL; } g_object_get (gtk_widget_get_settings (GTK_WIDGET (accel_label)), "gtk-enable-accels", &enable_accels, NULL); - if (enable_accels && accel_label->accel_closure) + if (enable_accels && accel_label->priv->accel_closure) { - GtkAccelKey *key = gtk_accel_group_find (accel_label->accel_group, find_accel, accel_label->accel_closure); + GtkAccelKey *key = gtk_accel_group_find (accel_label->priv->accel_group, find_accel, accel_label->priv->accel_closure); if (key && key->accel_flags & GTK_ACCEL_VISIBLE) { @@ -861,15 +885,15 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label) tmp = _gtk_accel_label_class_get_accelerator_label (klass, key->accel_key, key->accel_mods); - accel_label->accel_string = g_strconcat (" ", tmp, NULL); + accel_label->priv->accel_string = g_strconcat (" ", tmp, NULL); g_free (tmp); } - if (!accel_label->accel_string) - accel_label->accel_string = g_strdup ("-/-"); + if (!accel_label->priv->accel_string) + accel_label->priv->accel_string = g_strdup ("-/-"); } - if (!accel_label->accel_string) - accel_label->accel_string = g_strdup (""); + if (!accel_label->priv->accel_string) + accel_label->priv->accel_string = g_strdup (""); gtk_widget_queue_resize (GTK_WIDGET (accel_label)); diff --git a/gtk/gtkaccellabel.h b/gtk/gtkaccellabel.h index 9ae54b2f8f..3ad0a37c7a 100644 --- a/gtk/gtkaccellabel.h +++ b/gtk/gtkaccellabel.h @@ -27,7 +27,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -48,8 +48,9 @@ G_BEGIN_DECLS #define GTK_ACCEL_LABEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_LABEL, GtkAccelLabelClass)) -typedef struct _GtkAccelLabel GtkAccelLabel; -typedef struct _GtkAccelLabelClass GtkAccelLabelClass; +typedef struct _GtkAccelLabel GtkAccelLabel; +typedef struct _GtkAccelLabelClass GtkAccelLabelClass; +typedef struct _GtkAccelLabelPrivate GtkAccelLabelPrivate; /** * GtkAccelLabel: @@ -60,14 +61,7 @@ typedef struct _GtkAccelLabelClass GtkAccelLabelClass; struct _GtkAccelLabel { GtkLabel label; - - guint GSEAL (gtk_reserved); - guint GSEAL (accel_padding); /* should be style property? */ - GtkWidget *GSEAL (accel_widget); /* done*/ - GClosure *GSEAL (accel_closure); /* has set function */ - GtkAccelGroup *GSEAL (accel_group); /* set by set_accel_closure() */ - gchar *GSEAL (accel_string); /* has set function */ - guint16 GSEAL (accel_string_width); /* seems to be private */ + GtkAccelLabelPrivate *priv; }; struct _GtkAccelLabelClass @@ -90,9 +84,6 @@ struct _GtkAccelLabelClass void (*_gtk_reserved4) (void); }; -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_accel_label_accelerator_width gtk_accel_label_get_accel_width -#endif /* GTK_DISABLE_DEPRECATED */ GType gtk_accel_label_get_type (void) G_GNUC_CONST; GtkWidget* gtk_accel_label_new (const gchar *string); diff --git a/gtk/gtkaccelmap.c b/gtk/gtkaccelmap.c index b9f41ff61e..31028688f4 100644 --- a/gtk/gtkaccelmap.c +++ b/gtk/gtkaccelmap.c @@ -319,7 +319,7 @@ internal_change_entry (const gchar *accel_path, { GtkAccelGroup *group = slist->data; - for (node = group->acceleratables; node; node = node->next) + for (node = _gtk_accel_group_get_accelerables (group); node; node = node->next) g_hash_table_insert (window_hm, node->data, node->data); } g_slist_free (group_list); @@ -367,7 +367,7 @@ internal_change_entry (const gchar *accel_path, for (i = 0; i < n; i++) { seen_accel = TRUE; - removable = !group->lock_count && !(ag_entry[i].key.accel_flags & GTK_ACCEL_LOCKED); + removable = !gtk_accel_group_get_is_locked (group) && !(ag_entry[i].key.accel_flags & GTK_ACCEL_LOCKED); if (!removable) goto break_loop_step5; if (ag_entry[i].accel_path_quark) diff --git a/gtk/gtkaccelmap.h b/gtk/gtkaccelmap.h index 208704920b..0a3937ac1b 100644 --- a/gtk/gtkaccelmap.h +++ b/gtk/gtkaccelmap.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkaccessible.h b/gtk/gtkaccessible.h index a9d21bcdd6..e7703c5abe 100644 --- a/gtk/gtkaccessible.h +++ b/gtk/gtkaccessible.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkaction.c b/gtk/gtkaction.c index 1cb1cecaae..4425696e19 100644 --- a/gtk/gtkaction.c +++ b/gtk/gtkaction.c @@ -960,63 +960,11 @@ _gtk_action_remove_from_proxy_list (GtkAction *action, } /** - * gtk_action_connect_proxy: - * @action: the action object - * @proxy: the proxy widget - * - * Connects a widget to an action object as a proxy. Synchronises - * various properties of the action with the widget (such as label - * text, icon, tooltip, etc), and attaches a callback so that the - * action gets activated when the proxy widget does. - * - * If the widget is already connected to an action, it is disconnected - * first. - * - * Since: 2.4 - * - * Deprecated: 2.16: Use gtk_activatable_set_related_action() instead. - */ -void -gtk_action_connect_proxy (GtkAction *action, - GtkWidget *proxy) -{ - g_return_if_fail (GTK_IS_ACTION (action)); - g_return_if_fail (GTK_IS_WIDGET (proxy)); - g_return_if_fail (GTK_IS_ACTIVATABLE (proxy)); - - gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (proxy), TRUE); - - gtk_activatable_set_related_action (GTK_ACTIVATABLE (proxy), action); -} - -/** - * gtk_action_disconnect_proxy: - * @action: the action object - * @proxy: the proxy widget - * - * Disconnects a proxy widget from an action. - * Does <emphasis>not</emphasis> destroy the widget, however. - * - * Since: 2.4 - * - * Deprecated: 2.16: Use gtk_activatable_set_related_action() instead. - */ -void -gtk_action_disconnect_proxy (GtkAction *action, - GtkWidget *proxy) -{ - g_return_if_fail (GTK_IS_ACTION (action)); - g_return_if_fail (GTK_IS_WIDGET (proxy)); - - gtk_activatable_set_related_action (GTK_ACTIVATABLE (proxy), NULL); -} - -/** * gtk_action_get_proxies: * @action: the action object * * Returns the proxy widgets for an action. - * See also gtk_widget_get_action(). + * See also gtk_activatable_get_related_action(). * * Return value: (element-type GtkWidget) (transfer none): a #GSList of proxy widgets. The list is owned by GTK+ * and must not be modified. @@ -1031,32 +979,6 @@ gtk_action_get_proxies (GtkAction *action) return action->private_data->proxies; } - -/** - * gtk_widget_get_action: - * @widget: a #GtkWidget - * - * Returns the #GtkAction that @widget is a proxy for. - * See also gtk_action_get_proxies(). - * - * Returns: the action that a widget is a proxy for, or - * %NULL, if it is not attached to an action. - * - * Since: 2.10 - * - * Deprecated: 2.16: Use gtk_activatable_get_related_action() instead. - */ -GtkAction* -gtk_widget_get_action (GtkWidget *widget) -{ - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - - if (GTK_IS_ACTIVATABLE (widget)) - return gtk_activatable_get_related_action (GTK_ACTIVATABLE (widget)); - - return NULL; -} - /** * gtk_action_get_name: * @action: the action object @@ -1695,62 +1617,6 @@ gtk_action_get_gicon (GtkAction *action) return action->private_data->gicon; } -/** - * gtk_action_block_activate_from: - * @action: the action object - * @proxy: a proxy widget - * - * Disables calls to the gtk_action_activate() - * function by signals on the given proxy widget. This is used to - * break notification loops for things like check or radio actions. - * - * This function is intended for use by action implementations. - * - * Since: 2.4 - * - * Deprecated: 2.16: activatables are now responsible for activating the - * action directly so this doesnt apply anymore. - */ -void -gtk_action_block_activate_from (GtkAction *action, - GtkWidget *proxy) -{ - g_return_if_fail (GTK_IS_ACTION (action)); - - g_signal_handlers_block_by_func (proxy, G_CALLBACK (gtk_action_activate), - action); - - gtk_action_block_activate (action); -} - -/** - * gtk_action_unblock_activate_from: - * @action: the action object - * @proxy: a proxy widget - * - * Re-enables calls to the gtk_action_activate() - * function by signals on the given proxy widget. This undoes the - * blocking done by gtk_action_block_activate_from(). - * - * This function is intended for use by action implementations. - * - * Since: 2.4 - * - * Deprecated: 2.16: activatables are now responsible for activating the - * action directly so this doesnt apply anymore. - */ -void -gtk_action_unblock_activate_from (GtkAction *action, - GtkWidget *proxy) -{ - g_return_if_fail (GTK_IS_ACTION (action)); - - g_signal_handlers_unblock_by_func (proxy, G_CALLBACK (gtk_action_activate), - action); - - gtk_action_unblock_activate (action); -} - static void closure_accel_activate (GClosure *closure, GValue *return_value, diff --git a/gtk/gtkaction.h b/gtk/gtkaction.h index 08e051af93..999c38f6e8 100644 --- a/gtk/gtkaction.h +++ b/gtk/gtkaction.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -110,18 +110,6 @@ void gtk_action_connect_accelerator (GtkAction *action); void gtk_action_disconnect_accelerator (GtkAction *action); G_CONST_RETURN gchar *gtk_action_get_accel_path (GtkAction *action); GClosure *gtk_action_get_accel_closure (GtkAction *action); - -#ifndef GTK_DISABLE_DEPRECATED -GtkAction *gtk_widget_get_action (GtkWidget *widget); -void gtk_action_connect_proxy (GtkAction *action, - GtkWidget *proxy); -void gtk_action_disconnect_proxy (GtkAction *action, - GtkWidget *proxy); -void gtk_action_block_activate_from (GtkAction *action, - GtkWidget *proxy); -void gtk_action_unblock_activate_from (GtkAction *action, - GtkWidget *proxy); -#endif /* GTK_DISABLE_DEPRECATED */ void gtk_action_block_activate (GtkAction *action); void gtk_action_unblock_activate (GtkAction *action); diff --git a/gtk/gtkactiongroup.h b/gtk/gtkactiongroup.h index 1d8b388b1f..30d7542741 100644 --- a/gtk/gtkactiongroup.h +++ b/gtk/gtkactiongroup.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkactivatable.h b/gtk/gtkactivatable.h index 45d1decd46..705bfa4e80 100644 --- a/gtk/gtkactivatable.h +++ b/gtk/gtkactivatable.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkadjustment.h b/gtk/gtkadjustment.h index f5ead22509..39a6f86293 100644 --- a/gtk/gtkadjustment.h +++ b/gtk/gtkadjustment.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkalignment.h b/gtk/gtkalignment.h index 4fad3027e3..9a37191d93 100644 --- a/gtk/gtkalignment.h +++ b/gtk/gtkalignment.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkarrow.h b/gtk/gtkarrow.h index 010e3ef227..3140d588e6 100644 --- a/gtk/gtkarrow.h +++ b/gtk/gtkarrow.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkaspectframe.h b/gtk/gtkaspectframe.h index d78ee87e3c..bb98f62ba4 100644 --- a/gtk/gtkaspectframe.h +++ b/gtk/gtkaspectframe.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkassistant.h b/gtk/gtkassistant.h index 5f26325bfa..47fd16ba86 100644 --- a/gtk/gtkassistant.h +++ b/gtk/gtkassistant.h @@ -23,7 +23,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkbbox.c b/gtk/gtkbbox.c index 6272e0e942..5417be777b 100644 --- a/gtk/gtkbbox.c +++ b/gtk/gtkbbox.c @@ -262,55 +262,6 @@ gtk_button_box_get_child_property (GtkContainer *container, } } -/* set per widget values for spacing, child size and child internal padding */ - -/** - * gtk_button_box_set_child_size: - * @widget: a #GtkButtonBox - * @min_width: a default width for buttons in @widget - * @min_height: a default height for buttons in @widget - * - * Sets a new default size for the children of a given button box. - * - * Deprecated: This is not supported anymore and can only be set through the - * theme changing the style properties: - * "<link linkend="GtkButtonBox--s-child-min-width">child-min-width</link>" - * and - * "<link linkend="GtkButtonBox--s-child-min-height">child-min-height</link>" - * instead. - */ -void -gtk_button_box_set_child_size (GtkButtonBox *widget, - gint width, gint height) -{ - g_return_if_fail (GTK_IS_BUTTON_BOX (widget)); - - widget->child_min_width = width; - widget->child_min_height = height; -} - -/** - * gtk_button_box_set_child_ipadding: - * @widget: a #GtkButtonBox - * @ipad_x: the horizontal padding that should be used by each button in @widget - * @ipad_y: the vertical padding that should be used by each button in @widget - * - * Changes the amount of internal padding used by all buttons in a given button - * box. - * - * Deprecated: Use the style properties - * <literal>"child-internal-pad-x/-y"</literal> instead. - */ -void -gtk_button_box_set_child_ipadding (GtkButtonBox *widget, - gint ipad_x, gint ipad_y) -{ - g_return_if_fail (GTK_IS_BUTTON_BOX (widget)); - - widget->child_ipad_x = ipad_x; - widget->child_ipad_y = ipad_y; -} - /** * gtk_button_box_set_layout: * @widget: a #GtkButtonBox @@ -334,59 +285,6 @@ gtk_button_box_set_layout (GtkButtonBox *widget, } } - -/* get per widget values for spacing, child size and child internal padding */ - -/** - * gtk_button_box_get_child_size: - * @widget: a #GtkButtonBox - * @min_width: the width of the buttons contained by @widget - * @min_height: the height of the buttons contained by @widget - * - * Retrieves the current width and height of all child widgets in a button box. - * @min_width and @min_height are filled with those values, respectively. - * - * Deprecated: Use the style properties - * <literal>"child-min-width/-height"</literal> instead. - */ -void -gtk_button_box_get_child_size (GtkButtonBox *widget, - gint *width, gint *height) -{ - g_return_if_fail (GTK_IS_BUTTON_BOX (widget)); - g_return_if_fail (width != NULL); - g_return_if_fail (height != NULL); - - *width = widget->child_min_width; - *height = widget->child_min_height; -} - -/** - * gtk_button_box_get_child_ipadding: - * @widget: a #GtkButtonBox - * @ipad_x: the horizontal padding used by buttons in @widget - * @ipad_y: the vertical padding used by buttons in @widget - * - * Gets the default number of pixels that pad the buttons in a given button box. - * - * Deprecated: Use the style properties - * "<link linkend="GtkButtonBox--s-child-internal-pad-x">child-internal-pad-x</link>" - * and - * "<link linkend="GtkButtonBox--s-child-internal-pad-y">child-internal-pad-y</link>" - * instead. - */ -void -gtk_button_box_get_child_ipadding (GtkButtonBox *widget, - gint* ipad_x, gint *ipad_y) -{ - g_return_if_fail (GTK_IS_BUTTON_BOX (widget)); - g_return_if_fail (ipad_x != NULL); - g_return_if_fail (ipad_y != NULL); - - *ipad_x = widget->child_ipad_x; - *ipad_y = widget->child_ipad_y; -} - /** * gtk_button_box_get_layout: * @widget: a #GtkButtonBox diff --git a/gtk/gtkbbox.h b/gtk/gtkbbox.h index 7a2d823e23..76ac7ba702 100644 --- a/gtk/gtkbbox.h +++ b/gtk/gtkbbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -76,43 +76,6 @@ void gtk_button_box_set_child_secondary (GtkButtonBox *widget, GtkWidget *child, gboolean is_secondary); -#ifndef GTK_DISABLE_DEPRECATED -/** - * gtk_button_box_set_spacing: - * @b: a #GtkButtonBox - * @s: the number of pixels of spacing - * - * Sets the amount of spacing between buttons in a given button box. - * - * Deprecated: Use gtk_box_set_spacing() instead. - */ -#define gtk_button_box_set_spacing(b,s) gtk_box_set_spacing (GTK_BOX (b), s) - -/** - * gtk_button_box_get_spacing: - * @b: a #GtkButtonBox - * - * Retrieves how much space a button box is placing between each child button. - * - * Deprecated: Use gtk_box_get_spacing() instead. - * Returns: the current spacing applied to the buttons in @widget - */ -#define gtk_button_box_get_spacing(b) gtk_box_get_spacing (GTK_BOX (b)) - -void gtk_button_box_set_child_size (GtkButtonBox *widget, - gint min_width, - gint min_height); -void gtk_button_box_set_child_ipadding (GtkButtonBox *widget, - gint ipad_x, - gint ipad_y); -void gtk_button_box_get_child_size (GtkButtonBox *widget, - gint *min_width, - gint *min_height); -void gtk_button_box_get_child_ipadding (GtkButtonBox *widget, - gint *ipad_x, - gint *ipad_y); -#endif - /* Internal method - do not use. */ void _gtk_button_box_child_requisition (GtkWidget *widget, int *nvis_children, diff --git a/gtk/gtkbin.h b/gtk/gtkbin.h index b80e111833..7db2a5ae4a 100644 --- a/gtk/gtkbin.h +++ b/gtk/gtkbin.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c index db5d83a722..c75e220587 100644 --- a/gtk/gtkbindings.c +++ b/gtk/gtkbindings.c @@ -707,37 +707,6 @@ gtk_binding_entry_clear_internal (GtkBindingSet *binding_set, } /** - * gtk_binding_entry_add: - * @binding_set: #a GtkBindingSet to clear an entry of - * @keyval: key value of binding to clear - * @modifiers: key modifier of binding to clear - * - * Adds a binding entry. - * - * Deprecated: 2.12: Use gtk_binding_entry_add_signal() instead. - */ - -/** - * gtk_binding_entry_clear: - * @binding_set: binding set to clear an entry of - * @keyval: key value of binding to clear - * @modifiers: key modifier of binding to clear - * - * Clears a binding entry. - * - * Deprecated: 2.12: Use gtk_binding_entry_remove() instead. - */ -void -gtk_binding_entry_clear (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - g_return_if_fail (binding_set != NULL); - - gtk_binding_entry_clear_internal (binding_set, keyval, modifiers); -} - -/** * gtk_binding_entry_skip: * @binding_set: a #GtkBindingSet to skip an entry of * @keyval: key value of binding to skip @@ -1588,22 +1557,6 @@ gtk_binding_parse_bind (GScanner *scanner, return G_TOKEN_NONE; } -/** - * gtk_binding_parse_binding: - * @scanner: GtkRC scanner - * - * Parse a binding entry from a gtkrc file. - * - * Return value: expected token upon errors, %G_TOKEN_NONE on success. - * - * Deprecated: 2.12: There should be no need to call this function outside GTK+. - */ -guint -gtk_binding_parse_binding (GScanner *scanner) -{ - return _gtk_binding_parse_binding (scanner); -} - guint _gtk_binding_parse_binding (GScanner *scanner) { diff --git a/gtk/gtkbindings.h b/gtk/gtkbindings.h index 0ff74230c4..904eb3e8c1 100644 --- a/gtk/gtkbindings.h +++ b/gtk/gtkbindings.h @@ -27,7 +27,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -111,14 +111,6 @@ gboolean gtk_binding_set_activate (GtkBindingSet *binding_set, GdkModifierType modifiers, GtkObject *object); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_binding_entry_add gtk_binding_entry_clear -void gtk_binding_entry_clear (GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers); -guint gtk_binding_parse_binding (GScanner *scanner); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_binding_entry_skip (GtkBindingSet *binding_set, guint keyval, GdkModifierType modifiers); diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c index 4e69b44ca8..b9f5321c48 100644 --- a/gtk/gtkbox.c +++ b/gtk/gtkbox.c @@ -1331,50 +1331,6 @@ gtk_box_pack_end (GtkBox *box, } /** - * gtk_box_pack_start_defaults: - * @box: a #GtkBox - * @widget: the #GtkWidget to be added to @box - * - * Adds @widget to @box, packed with reference to the start of @box. - * The child is packed after any other child packed with reference - * to the start of @box. - * - * Parameters for how to pack the child @widget, #GtkBox:expand, - * #GtkBox:fill and #GtkBox:padding, are given their default - * values, %TRUE, %TRUE, and 0, respectively. - * - * Deprecated: 2.14: Use gtk_box_pack_start() - */ -void -gtk_box_pack_start_defaults (GtkBox *box, - GtkWidget *child) -{ - gtk_box_pack_start (box, child, TRUE, TRUE, 0); -} - -/** - * gtk_box_pack_end_defaults: - * @box: a #GtkBox - * @widget: the #GtkWidget to be added to @box - * - * Adds @widget to @box, packed with reference to the end of @box. - * The child is packed after any other child packed with reference - * to the start of @box. - * - * Parameters for how to pack the child @widget, #GtkBox:expand, - * #GtkBox:fill and #GtkBox:padding, are given their default - * values, %TRUE, %TRUE, and 0, respectively. - * - * Deprecated: 2.14: Use gtk_box_pack_end() - */ -void -gtk_box_pack_end_defaults (GtkBox *box, - GtkWidget *child) -{ - gtk_box_pack_end (box, child, TRUE, TRUE, 0); -} - -/** * gtk_box_set_homogeneous: * @box: a #GtkBox * @homogeneous: a boolean value, %TRUE to create equal allotments, diff --git a/gtk/gtkbox.h b/gtk/gtkbox.h index 038c3b1c3a..ee6595699c 100644 --- a/gtk/gtkbox.h +++ b/gtk/gtkbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -114,13 +114,6 @@ void gtk_box_pack_end (GtkBox *box, gboolean fill, guint padding); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_box_pack_start_defaults (GtkBox *box, - GtkWidget *widget); -void gtk_box_pack_end_defaults (GtkBox *box, - GtkWidget *widget); -#endif - void gtk_box_set_homogeneous (GtkBox *box, gboolean homogeneous); gboolean gtk_box_get_homogeneous (GtkBox *box); diff --git a/gtk/gtkbuildable.h b/gtk/gtkbuildable.h index ebd7ac2c41..50ed14cd1d 100644 --- a/gtk/gtkbuildable.h +++ b/gtk/gtkbuildable.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkbuilder.h b/gtk/gtkbuilder.h index 8a2a8290a3..bb711e27ab 100644 --- a/gtk/gtkbuilder.h +++ b/gtk/gtkbuilder.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkbutton.h b/gtk/gtkbutton.h index 7a67ddcf91..4ed4d301fc 100644 --- a/gtk/gtkbutton.h +++ b/gtk/gtkbutton.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c index 80f67d3266..355327ff17 100644 --- a/gtk/gtkcalendar.c +++ b/gtk/gtkcalendar.c @@ -3500,22 +3500,6 @@ gtk_calendar_new (void) } /** - * gtk_calendar_display_options: - * @calendar: a #GtkCalendar. - * @flags: the display options to set. - * - * Sets display options (whether to display the heading and the month headings). - * - * Deprecated: 2.4: Use gtk_calendar_set_display_options() instead - **/ -void -gtk_calendar_display_options (GtkCalendar *calendar, - GtkCalendarDisplayOptions flags) -{ - gtk_calendar_set_display_options (calendar, flags); -} - -/** * gtk_calendar_get_display_options: * @calendar: a #GtkCalendar * @@ -3983,35 +3967,5 @@ gtk_calendar_get_detail_height_rows (GtkCalendar *calendar) return GTK_CALENDAR_GET_PRIVATE (calendar)->detail_height_rows; } -/** - * gtk_calendar_freeze: - * @calendar: a #GtkCalendar - * - * Does nothing. Previously locked the display of the calendar until - * it was thawed with gtk_calendar_thaw(). - * - * Deprecated: 2.8: - **/ -void -gtk_calendar_freeze (GtkCalendar *calendar) -{ - g_return_if_fail (GTK_IS_CALENDAR (calendar)); -} - -/** - * gtk_calendar_thaw: - * @calendar: a #GtkCalendar - * - * Does nothing. Previously defrosted a calendar; all the changes made - * since the last gtk_calendar_freeze() were displayed. - * - * Deprecated: 2.8: - **/ -void -gtk_calendar_thaw (GtkCalendar *calendar) -{ - g_return_if_fail (GTK_IS_CALENDAR (calendar)); -} - #define __GTK_CALENDAR_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkcalendar.h b/gtk/gtkcalendar.h index 9648d25be1..a18745bd0d 100644 --- a/gtk/gtkcalendar.h +++ b/gtk/gtkcalendar.h @@ -26,7 +26,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -36,9 +36,6 @@ #include <gtk/gtkwidget.h> -/* Not needed, retained for compatibility -Yosh */ -#include <gtk/gtksignal.h> - G_BEGIN_DECLS @@ -176,11 +173,6 @@ void gtk_calendar_set_display_options (GtkCalendar *calendar, GtkCalendarDisplayOptions flags); GtkCalendarDisplayOptions gtk_calendar_get_display_options (GtkCalendar *calendar); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_calendar_display_options (GtkCalendar *calendar, - GtkCalendarDisplayOptions flags); -#endif - void gtk_calendar_get_date (GtkCalendar *calendar, guint *year, guint *month, @@ -199,11 +191,6 @@ void gtk_calendar_set_detail_height_rows (GtkCalendar *calendar, gint gtk_calendar_get_detail_width_chars (GtkCalendar *calendar); gint gtk_calendar_get_detail_height_rows (GtkCalendar *calendar); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_calendar_freeze (GtkCalendar *calendar); -void gtk_calendar_thaw (GtkCalendar *calendar); -#endif - G_END_DECLS #endif /* __GTK_CALENDAR_H__ */ diff --git a/gtk/gtkcelleditable.h b/gtk/gtkcelleditable.h index 74d6949ae0..603e120ada 100644 --- a/gtk/gtkcelleditable.h +++ b/gtk/gtkcelleditable.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcelllayout.h b/gtk/gtkcelllayout.h index b3d8d06090..04e4745ee9 100644 --- a/gtk/gtkcelllayout.h +++ b/gtk/gtkcelllayout.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrenderer.c b/gtk/gtkcellrenderer.c index b55b0985ae..6093719044 100644 --- a/gtk/gtkcellrenderer.c +++ b/gtk/gtkcellrenderer.c @@ -940,28 +940,6 @@ gtk_cell_renderer_get_sensitive (GtkCellRenderer *cell) } /** - * gtk_cell_renderer_editing_canceled: - * @cell: A #GtkCellRenderer - * - * Causes the cell renderer to emit the #GtkCellRenderer::editing-canceled - * signal. - * - * This function is for use only by implementations of cell renderers that - * need to notify the client program that an editing process was canceled - * and the changes were not committed. - * - * Since: 2.4 - * Deprecated: 2.6: Use gtk_cell_renderer_stop_editing() instead - **/ -void -gtk_cell_renderer_editing_canceled (GtkCellRenderer *cell) -{ - g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); - - gtk_cell_renderer_stop_editing (cell, TRUE); -} - -/** * gtk_cell_renderer_stop_editing: * @cell: A #GtkCellRenderer * @canceled: %TRUE if the editing has been canceled diff --git a/gtk/gtkcellrenderer.h b/gtk/gtkcellrenderer.h index aece202ae9..d16f3d4160 100644 --- a/gtk/gtkcellrenderer.h +++ b/gtk/gtkcellrenderer.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -183,11 +183,8 @@ void gtk_cell_renderer_set_sensitive (GtkCellRenderer *cell, gboolean gtk_cell_renderer_get_sensitive (GtkCellRenderer *cell); /* For use by cell renderer implementations only */ -#ifndef GTK_DISABLE_DEPRECATED -void gtk_cell_renderer_editing_canceled (GtkCellRenderer *cell); -#endif -void gtk_cell_renderer_stop_editing (GtkCellRenderer *cell, - gboolean canceled); +void gtk_cell_renderer_stop_editing (GtkCellRenderer *cell, + gboolean canceled); G_END_DECLS diff --git a/gtk/gtkcellrendereraccel.h b/gtk/gtkcellrendereraccel.h index 7ca2c60a7e..562f7f3634 100644 --- a/gtk/gtkcellrendereraccel.h +++ b/gtk/gtkcellrendereraccel.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrenderercombo.h b/gtk/gtkcellrenderercombo.h index 379c6e649e..49b63206e1 100644 --- a/gtk/gtkcellrenderercombo.h +++ b/gtk/gtkcellrenderercombo.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrendererpixbuf.h b/gtk/gtkcellrendererpixbuf.h index 33b92d03e9..8043c2d63e 100644 --- a/gtk/gtkcellrendererpixbuf.h +++ b/gtk/gtkcellrendererpixbuf.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrendererprogress.h b/gtk/gtkcellrendererprogress.h index fa5569f95a..1a1eec6421 100644 --- a/gtk/gtkcellrendererprogress.h +++ b/gtk/gtkcellrendererprogress.h @@ -25,7 +25,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrendererspin.h b/gtk/gtkcellrendererspin.h index b9f0bb1a6a..5daccdac2c 100644 --- a/gtk/gtkcellrendererspin.h +++ b/gtk/gtkcellrendererspin.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrenderertext.h b/gtk/gtkcellrenderertext.h index fb96219e54..5397927e1a 100644 --- a/gtk/gtkcellrenderertext.h +++ b/gtk/gtkcellrenderertext.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellrenderertoggle.h b/gtk/gtkcellrenderertoggle.h index cf6a3c2f3d..59a2ec571b 100644 --- a/gtk/gtkcellrenderertoggle.h +++ b/gtk/gtkcellrenderertoggle.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcellview.c b/gtk/gtkcellview.c index 0dd98b0a76..a2692114f4 100644 --- a/gtk/gtkcellview.c +++ b/gtk/gtkcellview.c @@ -1064,26 +1064,6 @@ gtk_cell_view_cell_layout_get_cells (GtkCellLayout *layout) return g_list_reverse (retval); } -/** - * gtk_cell_view_get_cell_renderers: - * @cell_view: a #GtkCellView - * - * Returns the cell renderers which have been added to @cell_view. - * - * Return value: a list of cell renderers. The list, but not the - * renderers has been newly allocated and should be freed with - * g_list_free() when no longer needed. - * - * Since: 2.6 - * - * Deprecated: 2.18: use gtk_cell_layout_get_cells() instead. - **/ -GList * -gtk_cell_view_get_cell_renderers (GtkCellView *cell_view) -{ - return gtk_cell_view_cell_layout_get_cells (GTK_CELL_LAYOUT (cell_view)); -} - static gboolean gtk_cell_view_buildable_custom_tag_start (GtkBuildable *buildable, GtkBuilder *builder, diff --git a/gtk/gtkcellview.h b/gtk/gtkcellview.h index 73de84e191..06305f9a29 100644 --- a/gtk/gtkcellview.h +++ b/gtk/gtkcellview.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -72,9 +72,6 @@ gboolean gtk_cell_view_get_size_of_row (GtkCellView *cell_v void gtk_cell_view_set_background_color (GtkCellView *cell_view, const GdkColor *color); -#ifndef GTK_DISABLE_DEPRECATED -GList *gtk_cell_view_get_cell_renderers (GtkCellView *cell_view); -#endif G_END_DECLS diff --git a/gtk/gtkcheckbutton.h b/gtk/gtkcheckbutton.h index 54c6dcfa39..90e65c2ec8 100644 --- a/gtk/gtkcheckbutton.h +++ b/gtk/gtkcheckbutton.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcheckmenuitem.c b/gtk/gtkcheckmenuitem.c index 8c77d618e4..754382f00e 100644 --- a/gtk/gtkcheckmenuitem.c +++ b/gtk/gtkcheckmenuitem.c @@ -283,17 +283,6 @@ gtk_check_menu_item_toggle_size_request (GtkMenuItem *menu_item, } void -gtk_check_menu_item_set_show_toggle (GtkCheckMenuItem *menu_item, - gboolean always) -{ - g_return_if_fail (GTK_IS_CHECK_MENU_ITEM (menu_item)); - -#if 0 - menu_item->always_show_toggle = always != FALSE; -#endif -} - -void gtk_check_menu_item_toggled (GtkCheckMenuItem *check_menu_item) { g_signal_emit (check_menu_item, check_menu_item_signals[TOGGLED], 0); diff --git a/gtk/gtkcheckmenuitem.h b/gtk/gtkcheckmenuitem.h index b6f2e9adfe..bf5230cf89 100644 --- a/gtk/gtkcheckmenuitem.h +++ b/gtk/gtkcheckmenuitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -91,12 +91,6 @@ void gtk_check_menu_item_set_draw_as_radio (GtkCheckMenuItem *check_menu_i gboolean gtk_check_menu_item_get_draw_as_radio (GtkCheckMenuItem *check_menu_item); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_check_menu_item_set_show_toggle (GtkCheckMenuItem *menu_item, - gboolean always); -#define gtk_check_menu_item_set_state gtk_check_menu_item_set_active -#endif - G_END_DECLS #endif /* __GTK_CHECK_MENU_ITEM_H__ */ diff --git a/gtk/gtkclipboard.h b/gtk/gtkclipboard.h index 742c9b359b..f0e5514a09 100644 --- a/gtk/gtkclipboard.h +++ b/gtk/gtkclipboard.h @@ -19,7 +19,7 @@ * Global clipboard abstraction. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkclist.c b/gtk/gtkclist.c deleted file mode 100644 index eb37434f72..0000000000 --- a/gtk/gtkclist.c +++ /dev/null @@ -1,7806 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald, - * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <stdlib.h> -#include <string.h> - -#undef GTK_DISABLE_DEPRECATED -#define __GTK_CLIST_C__ - -#include <gdk/gdkkeysyms.h> - -#include "gtkmain.h" -#include "gtkobject.h" -#include "gtkctree.h" -#include "gtkclist.h" -#include "gtkbindings.h" -#include "gtkdnd.h" -#include "gtkmarshalers.h" -#include "gtkintl.h" - -#include "gtkalias.h" - -/* length of button_actions array */ -#define MAX_BUTTON 5 - -/* the width of the column resize windows */ -#define DRAG_WIDTH 6 - -/* minimum allowed width of a column */ -#define COLUMN_MIN_WIDTH 5 - -/* this defigns the base grid spacing */ -#define CELL_SPACING 1 - -/* added the horizontal space at the beginning and end of a row*/ -#define COLUMN_INSET 3 - -/* used for auto-scrolling */ -#define SCROLL_TIME 100 - -/* gives the top pixel of the given row in context of - * the clist's voffset */ -#define ROW_TOP_YPIXEL(clist, row) (((clist)->row_height * (row)) + \ - (((row) + 1) * CELL_SPACING) + \ - (clist)->voffset) - -/* returns the row index from a y pixel location in the - * context of the clist's voffset */ -#define ROW_FROM_YPIXEL(clist, y) (((y) - (clist)->voffset) / \ - ((clist)->row_height + CELL_SPACING)) - -/* gives the left pixel of the given column in context of - * the clist's hoffset */ -#define COLUMN_LEFT_XPIXEL(clist, colnum) ((clist)->column[(colnum)].area.x + \ - (clist)->hoffset) - -/* returns the column index from a x pixel location in the - * context of the clist's hoffset */ -static inline gint -COLUMN_FROM_XPIXEL (GtkCList * clist, - gint x) -{ - gint i, cx; - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].visible) - { - cx = clist->column[i].area.x + clist->hoffset; - - if (x >= (cx - (COLUMN_INSET + CELL_SPACING)) && - x <= (cx + clist->column[i].area.width + COLUMN_INSET)) - return i; - } - - /* no match */ - return -1; -} - -/* returns the top pixel of the given row in the context of - * the list height */ -#define ROW_TOP(clist, row) (((clist)->row_height + CELL_SPACING) * (row)) - -/* returns the left pixel of the given column in the context of - * the list width */ -#define COLUMN_LEFT(clist, colnum) ((clist)->column[(colnum)].area.x) - -/* returns the total height of the list */ -#define LIST_HEIGHT(clist) (((clist)->row_height * ((clist)->rows)) + \ - (CELL_SPACING * ((clist)->rows + 1))) - - -/* returns the total width of the list */ -static inline gint -LIST_WIDTH (GtkCList * clist) -{ - gint last_column; - - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--); - - if (last_column >= 0) - return (clist->column[last_column].area.x + - clist->column[last_column].area.width + - COLUMN_INSET + CELL_SPACING); - return 0; -} - -/* returns the GList item for the nth row */ -#define ROW_ELEMENT(clist, row) (((row) == (clist)->rows - 1) ? \ - (clist)->row_list_end : \ - g_list_nth ((clist)->row_list, (row))) - - -/* redraw the list if it's not frozen */ -#define CLIST_UNFROZEN(clist) (((GtkCList*) (clist))->freeze_count == 0) -#define CLIST_REFRESH(clist) G_STMT_START { \ - if (CLIST_UNFROZEN (clist)) \ - GTK_CLIST_GET_CLASS (clist)->refresh ((GtkCList*) (clist)); \ -} G_STMT_END - - -/* Signals */ -enum { - SELECT_ROW, - UNSELECT_ROW, - ROW_MOVE, - CLICK_COLUMN, - RESIZE_COLUMN, - TOGGLE_FOCUS_ROW, - SELECT_ALL, - UNSELECT_ALL, - UNDO_SELECTION, - START_SELECTION, - END_SELECTION, - TOGGLE_ADD_MODE, - EXTEND_SELECTION, - SCROLL_VERTICAL, - SCROLL_HORIZONTAL, - ABORT_COLUMN_RESIZE, - LAST_SIGNAL -}; - -enum { - SYNC_REMOVE, - SYNC_INSERT -}; - -enum { - ARG_0, - ARG_N_COLUMNS, - ARG_SHADOW_TYPE, - ARG_SELECTION_MODE, - ARG_ROW_HEIGHT, - ARG_TITLES_ACTIVE, - ARG_REORDERABLE, - ARG_USE_DRAG_ICONS, - ARG_SORT_TYPE -}; - -/* GtkCList Methods */ -static void gtk_clist_class_init (GtkCListClass *klass); -static void gtk_clist_init (GtkCList *clist); -static GObject* gtk_clist_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params); - -/* GtkObject Methods */ -static void gtk_clist_destroy (GtkObject *object); -static void gtk_clist_finalize (GObject *object); -static void gtk_clist_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_clist_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); - -/* GtkWidget Methods */ -static void gtk_clist_set_scroll_adjustments (GtkCList *clist, - GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment); -static void gtk_clist_realize (GtkWidget *widget); -static void gtk_clist_unrealize (GtkWidget *widget); -static void gtk_clist_map (GtkWidget *widget); -static void gtk_clist_unmap (GtkWidget *widget); -static gint gtk_clist_expose (GtkWidget *widget, - GdkEventExpose *event); -static gint gtk_clist_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_clist_button_release (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_clist_motion (GtkWidget *widget, - GdkEventMotion *event); -static void gtk_clist_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_clist_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_clist_draw_focus (GtkWidget *widget); -static gint gtk_clist_focus_in (GtkWidget *widget, - GdkEventFocus *event); -static gint gtk_clist_focus_out (GtkWidget *widget, - GdkEventFocus *event); -static gint gtk_clist_focus (GtkWidget *widget, - GtkDirectionType direction); -static void gtk_clist_set_focus_child (GtkContainer *container, - GtkWidget *child); -static void gtk_clist_style_set (GtkWidget *widget, - GtkStyle *previous_style); -static void gtk_clist_drag_begin (GtkWidget *widget, - GdkDragContext *context); -static gint gtk_clist_drag_motion (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time); -static void gtk_clist_drag_leave (GtkWidget *widget, - GdkDragContext *context, - guint time); -static void gtk_clist_drag_end (GtkWidget *widget, - GdkDragContext *context); -static gboolean gtk_clist_drag_drop (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time); -static void gtk_clist_drag_data_get (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time); -static void gtk_clist_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time); - -/* GtkContainer Methods */ -static void gtk_clist_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -/* Selection */ -static void toggle_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); -static void real_select_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); -static void real_unselect_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); -static void update_extended_selection (GtkCList *clist, - gint row); -static GList *selection_find (GtkCList *clist, - gint row_number, - GList *row_list_element); -static void real_select_all (GtkCList *clist); -static void real_unselect_all (GtkCList *clist); -static void move_vertical (GtkCList *clist, - gint row, - gfloat align); -static void move_horizontal (GtkCList *clist, - gint diff); -static void real_undo_selection (GtkCList *clist); -static void fake_unselect_all (GtkCList *clist, - gint row); -static void fake_toggle_row (GtkCList *clist, - gint row); -static void resync_selection (GtkCList *clist, - GdkEvent *event); -static void sync_selection (GtkCList *clist, - gint row, - gint mode); -static void set_anchor (GtkCList *clist, - gboolean add_mode, - gint anchor, - gint undo_anchor); -static void start_selection (GtkCList *clist); -static void end_selection (GtkCList *clist); -static void toggle_add_mode (GtkCList *clist); -static void toggle_focus_row (GtkCList *clist); -static void extend_selection (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection); -static gint get_selection_info (GtkCList *clist, - gint x, - gint y, - gint *row, - gint *column); - -/* Scrolling */ -static void move_focus_row (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position); -static void scroll_horizontal (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position); -static void scroll_vertical (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position); -static void move_horizontal (GtkCList *clist, - gint diff); -static void move_vertical (GtkCList *clist, - gint row, - gfloat align); -static gint horizontal_timeout (GtkCList *clist); -static gint vertical_timeout (GtkCList *clist); -static void remove_grab (GtkCList *clist); - - -/* Resize Columns */ -static void draw_xor_line (GtkCList *clist); -static gint new_column_width (GtkCList *clist, - gint column, - gint *x); -static void column_auto_resize (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - gint old_width); -static void real_resize_column (GtkCList *clist, - gint column, - gint width); -static void abort_column_resize (GtkCList *clist); -static void cell_size_request (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkRequisition *requisition); - -/* Buttons */ -static void column_button_create (GtkCList *clist, - gint column); -static void column_button_clicked (GtkWidget *widget, - gpointer data); - -/* Adjustments */ -static void adjust_adjustments (GtkCList *clist, - gboolean block_resize); -static void vadjustment_changed (GtkAdjustment *adjustment, - gpointer data); -static void vadjustment_value_changed (GtkAdjustment *adjustment, - gpointer data); -static void hadjustment_changed (GtkAdjustment *adjustment, - gpointer data); -static void hadjustment_value_changed (GtkAdjustment *adjustment, - gpointer data); - -/* Drawing */ -static void get_cell_style (GtkCList *clist, - GtkCListRow *clist_row, - gint state, - gint column, - GtkStyle **style, - GdkGC **fg_gc, - GdkGC **bg_gc); -static gint draw_cell_pixmap (GdkWindow *window, - GdkRectangle *clip_rectangle, - GdkGC *fg_gc, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint x, - gint y, - gint width, - gint height); -static void draw_row (GtkCList *clist, - GdkRectangle *area, - gint row, - GtkCListRow *clist_row); -static void draw_rows (GtkCList *clist, - GdkRectangle *area); -static void clist_refresh (GtkCList *clist); -static void draw_drag_highlight (GtkCList *clist, - GtkCListRow *dest_row, - gint dest_row_number, - GtkCListDragPos drag_pos); - -/* Size Allocation / Requisition */ -static void size_allocate_title_buttons (GtkCList *clist); -static void size_allocate_columns (GtkCList *clist, - gboolean block_resize); -static gint list_requisition_width (GtkCList *clist); - -/* Memory Allocation/Distruction Routines */ -static GtkCListColumn *columns_new (GtkCList *clist); -static void column_title_new (GtkCList *clist, - gint column, - const gchar *title); -static void columns_delete (GtkCList *clist); -static GtkCListRow *row_new (GtkCList *clist); -static void row_delete (GtkCList *clist, - GtkCListRow *clist_row); -static void set_cell_contents (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkCellType type, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask); -static gint real_insert_row (GtkCList *clist, - gint row, - gchar *text[]); -static void real_remove_row (GtkCList *clist, - gint row); -static void real_clear (GtkCList *clist); - -/* Sorting */ -static gint default_compare (GtkCList *clist, - gconstpointer row1, - gconstpointer row2); -static void real_sort_list (GtkCList *clist); -static GList *gtk_clist_merge (GtkCList *clist, - GList *a, - GList *b); -static GList *gtk_clist_mergesort (GtkCList *clist, - GList *list, - gint num); -/* Misc */ -static gboolean title_focus_in (GtkCList *clist, - gint dir); -static gboolean title_focus_move (GtkCList *clist, - gint dir); - -static void real_row_move (GtkCList *clist, - gint source_row, - gint dest_row); -static gint column_title_passive_func (GtkWidget *widget, - GdkEvent *event, - gpointer data); -static void drag_dest_cell (GtkCList *clist, - gint x, - gint y, - GtkCListDestInfo *dest_info); - - - -static GtkContainerClass *parent_class = NULL; -static guint clist_signals[LAST_SIGNAL] = {0}; - -static const GtkTargetEntry clist_target_table = { "gtk-clist-drag-reorder", 0, 0}; - -GtkType -gtk_clist_get_type (void) -{ - static GtkType clist_type = 0; - - if (!clist_type) - { - static const GtkTypeInfo clist_info = - { - "GtkCList", - sizeof (GtkCList), - sizeof (GtkCListClass), - (GtkClassInitFunc) gtk_clist_class_init, - (GtkObjectInitFunc) gtk_clist_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkCList"); - clist_type = gtk_type_unique (GTK_TYPE_CONTAINER, &clist_info); - } - - return clist_type; -} - -static void -gtk_clist_class_init (GtkCListClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GtkBindingSet *binding_set; - - gobject_class->constructor = gtk_clist_constructor; - - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - container_class = (GtkContainerClass *) klass; - - parent_class = gtk_type_class (GTK_TYPE_CONTAINER); - - gobject_class->finalize = gtk_clist_finalize; - - object_class->set_arg = gtk_clist_set_arg; - object_class->get_arg = gtk_clist_get_arg; - object_class->destroy = gtk_clist_destroy; - - - widget_class->realize = gtk_clist_realize; - widget_class->unrealize = gtk_clist_unrealize; - widget_class->map = gtk_clist_map; - widget_class->unmap = gtk_clist_unmap; - widget_class->button_press_event = gtk_clist_button_press; - widget_class->button_release_event = gtk_clist_button_release; - widget_class->motion_notify_event = gtk_clist_motion; - widget_class->expose_event = gtk_clist_expose; - widget_class->size_request = gtk_clist_size_request; - widget_class->size_allocate = gtk_clist_size_allocate; - widget_class->focus_in_event = gtk_clist_focus_in; - widget_class->focus_out_event = gtk_clist_focus_out; - widget_class->style_set = gtk_clist_style_set; - widget_class->drag_begin = gtk_clist_drag_begin; - widget_class->drag_end = gtk_clist_drag_end; - widget_class->drag_motion = gtk_clist_drag_motion; - widget_class->drag_leave = gtk_clist_drag_leave; - widget_class->drag_drop = gtk_clist_drag_drop; - widget_class->drag_data_get = gtk_clist_drag_data_get; - widget_class->drag_data_received = gtk_clist_drag_data_received; - widget_class->focus = gtk_clist_focus; - - /* container_class->add = NULL; use the default GtkContainerClass warning */ - /* container_class->remove=NULL; use the default GtkContainerClass warning */ - - container_class->forall = gtk_clist_forall; - container_class->set_focus_child = gtk_clist_set_focus_child; - - klass->set_scroll_adjustments = gtk_clist_set_scroll_adjustments; - klass->refresh = clist_refresh; - klass->select_row = real_select_row; - klass->unselect_row = real_unselect_row; - klass->row_move = real_row_move; - klass->undo_selection = real_undo_selection; - klass->resync_selection = resync_selection; - klass->selection_find = selection_find; - klass->click_column = NULL; - klass->resize_column = real_resize_column; - klass->draw_row = draw_row; - klass->draw_drag_highlight = draw_drag_highlight; - klass->insert_row = real_insert_row; - klass->remove_row = real_remove_row; - klass->clear = real_clear; - klass->sort_list = real_sort_list; - klass->select_all = real_select_all; - klass->unselect_all = real_unselect_all; - klass->fake_unselect_all = fake_unselect_all; - klass->scroll_horizontal = scroll_horizontal; - klass->scroll_vertical = scroll_vertical; - klass->extend_selection = extend_selection; - klass->toggle_focus_row = toggle_focus_row; - klass->toggle_add_mode = toggle_add_mode; - klass->start_selection = start_selection; - klass->end_selection = end_selection; - klass->abort_column_resize = abort_column_resize; - klass->set_cell_contents = set_cell_contents; - klass->cell_size_request = cell_size_request; - - gtk_object_add_arg_type ("GtkCList::n-columns", - GTK_TYPE_UINT, - GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME, - ARG_N_COLUMNS); - gtk_object_add_arg_type ("GtkCList::shadow-type", - GTK_TYPE_SHADOW_TYPE, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_SHADOW_TYPE); - gtk_object_add_arg_type ("GtkCList::selection-mode", - GTK_TYPE_SELECTION_MODE, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_SELECTION_MODE); - gtk_object_add_arg_type ("GtkCList::row-height", - GTK_TYPE_UINT, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_ROW_HEIGHT); - gtk_object_add_arg_type ("GtkCList::reorderable", - GTK_TYPE_BOOL, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_REORDERABLE); - gtk_object_add_arg_type ("GtkCList::titles-active", - GTK_TYPE_BOOL, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_TITLES_ACTIVE); - gtk_object_add_arg_type ("GtkCList::use-drag-icons", - GTK_TYPE_BOOL, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_USE_DRAG_ICONS); - gtk_object_add_arg_type ("GtkCList::sort-type", - GTK_TYPE_SORT_TYPE, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_SORT_TYPE); - - widget_class->set_scroll_adjustments_signal = - gtk_signal_new (I_("set-scroll-adjustments"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, set_scroll_adjustments), - _gtk_marshal_VOID__OBJECT_OBJECT, - GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); - - clist_signals[SELECT_ROW] = - gtk_signal_new (I_("select-row"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, select_row), - _gtk_marshal_VOID__INT_INT_BOXED, - GTK_TYPE_NONE, 3, - GTK_TYPE_INT, - GTK_TYPE_INT, - GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); - clist_signals[UNSELECT_ROW] = - gtk_signal_new (I_("unselect-row"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, unselect_row), - _gtk_marshal_VOID__INT_INT_BOXED, - GTK_TYPE_NONE, 3, GTK_TYPE_INT, - GTK_TYPE_INT, GDK_TYPE_EVENT); - clist_signals[ROW_MOVE] = - gtk_signal_new (I_("row-move"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, row_move), - _gtk_marshal_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); - clist_signals[CLICK_COLUMN] = - gtk_signal_new (I_("click-column"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, click_column), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, GTK_TYPE_INT); - clist_signals[RESIZE_COLUMN] = - gtk_signal_new (I_("resize-column"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, resize_column), - _gtk_marshal_VOID__INT_INT, - GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT); - - clist_signals[TOGGLE_FOCUS_ROW] = - gtk_signal_new (I_("toggle-focus-row"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, toggle_focus_row), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[SELECT_ALL] = - gtk_signal_new (I_("select-all"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, select_all), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[UNSELECT_ALL] = - gtk_signal_new (I_("unselect-all"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, unselect_all), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[UNDO_SELECTION] = - gtk_signal_new (I_("undo-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, undo_selection), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[START_SELECTION] = - gtk_signal_new (I_("start-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, start_selection), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[END_SELECTION] = - gtk_signal_new (I_("end-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, end_selection), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[TOGGLE_ADD_MODE] = - gtk_signal_new (I_("toggle-add-mode"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, toggle_add_mode), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - clist_signals[EXTEND_SELECTION] = - gtk_signal_new (I_("extend-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, extend_selection), - _gtk_marshal_VOID__ENUM_FLOAT_BOOLEAN, - GTK_TYPE_NONE, 3, - GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT, GTK_TYPE_BOOL); - clist_signals[SCROLL_VERTICAL] = - gtk_signal_new (I_("scroll-vertical"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, scroll_vertical), - _gtk_marshal_VOID__ENUM_FLOAT, - GTK_TYPE_NONE, 2, GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT); - clist_signals[SCROLL_HORIZONTAL] = - gtk_signal_new (I_("scroll-horizontal"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, scroll_horizontal), - _gtk_marshal_VOID__ENUM_FLOAT, - GTK_TYPE_NONE, 2, GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT); - clist_signals[ABORT_COLUMN_RESIZE] = - gtk_signal_new (I_("abort-column-resize"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCListClass, abort_column_resize), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - - binding_set = gtk_binding_set_by_class (klass); - gtk_binding_entry_add_signal (binding_set, GDK_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Home, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_End, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_End, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - - gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Home, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_End, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_End, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE); - - - gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - - gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - - gtk_binding_entry_add_signal (binding_set, GDK_Home, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - - gtk_binding_entry_add_signal (binding_set, GDK_End, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - - gtk_binding_entry_add_signal (binding_set, GDK_KP_End, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - - gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, - "undo-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, - "abort-column-resize", 0); - gtk_binding_entry_add_signal (binding_set, GDK_space, 0, - "toggle-focus-row", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0, - "toggle-focus-row", 0); - gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, - "toggle-add-mode", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK, - "toggle-add-mode", 0); - gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK, - "select-all", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, GDK_CONTROL_MASK, - "select-all", 0); - gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK, - "unselect-all", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_L, - GDK_RELEASE_MASK | GDK_SHIFT_MASK, - "end-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_R, - GDK_RELEASE_MASK | GDK_SHIFT_MASK, - "end-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_L, - GDK_RELEASE_MASK | GDK_SHIFT_MASK | - GDK_CONTROL_MASK, - "end-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_R, - GDK_RELEASE_MASK | GDK_SHIFT_MASK | - GDK_CONTROL_MASK, - "end-selection", 0); -} - -static void -gtk_clist_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkCList *clist; - - clist = GTK_CLIST (object); - - switch (arg_id) - { - case ARG_N_COLUMNS: /* only set at construction time */ - clist->columns = MAX (1, GTK_VALUE_UINT (*arg)); - break; - case ARG_SHADOW_TYPE: - gtk_clist_set_shadow_type (clist, GTK_VALUE_ENUM (*arg)); - break; - case ARG_SELECTION_MODE: - gtk_clist_set_selection_mode (clist, GTK_VALUE_ENUM (*arg)); - break; - case ARG_ROW_HEIGHT: - gtk_clist_set_row_height (clist, GTK_VALUE_UINT (*arg)); - break; - case ARG_REORDERABLE: - gtk_clist_set_reorderable (clist, GTK_VALUE_BOOL (*arg)); - break; - case ARG_TITLES_ACTIVE: - if (GTK_VALUE_BOOL (*arg)) - gtk_clist_column_titles_active (clist); - else - gtk_clist_column_titles_passive (clist); - break; - case ARG_USE_DRAG_ICONS: - gtk_clist_set_use_drag_icons (clist, GTK_VALUE_BOOL (*arg)); - break; - case ARG_SORT_TYPE: - gtk_clist_set_sort_type (clist, GTK_VALUE_ENUM (*arg)); - break; - } -} - -static void -gtk_clist_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkCList *clist; - - clist = GTK_CLIST (object); - - switch (arg_id) - { - guint i; - - case ARG_N_COLUMNS: - GTK_VALUE_UINT (*arg) = clist->columns; - break; - case ARG_SHADOW_TYPE: - GTK_VALUE_ENUM (*arg) = clist->shadow_type; - break; - case ARG_SELECTION_MODE: - GTK_VALUE_ENUM (*arg) = clist->selection_mode; - break; - case ARG_ROW_HEIGHT: - GTK_VALUE_UINT (*arg) = GTK_CLIST_ROW_HEIGHT_SET(clist) ? clist->row_height : 0; - break; - case ARG_REORDERABLE: - GTK_VALUE_BOOL (*arg) = GTK_CLIST_REORDERABLE (clist); - break; - case ARG_TITLES_ACTIVE: - GTK_VALUE_BOOL (*arg) = TRUE; - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button && - !gtk_widget_get_sensitive (clist->column[i].button)) - { - GTK_VALUE_BOOL (*arg) = FALSE; - break; - } - break; - case ARG_USE_DRAG_ICONS: - GTK_VALUE_BOOL (*arg) = GTK_CLIST_USE_DRAG_ICONS (clist); - break; - case ARG_SORT_TYPE: - GTK_VALUE_ENUM (*arg) = clist->sort_type; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -gtk_clist_init (GtkCList *clist) -{ - clist->flags = 0; - - gtk_widget_set_has_window (GTK_WIDGET (clist), TRUE); - gtk_widget_set_can_focus (GTK_WIDGET (clist), TRUE); - GTK_CLIST_SET_FLAG (clist, CLIST_DRAW_DRAG_LINE); - GTK_CLIST_SET_FLAG (clist, CLIST_USE_DRAG_ICONS); - - clist->freeze_count = 0; - - clist->rows = 0; - clist->row_height = 0; - clist->row_list = NULL; - clist->row_list_end = NULL; - - clist->columns = 0; - - clist->title_window = NULL; - clist->column_title_area.x = 0; - clist->column_title_area.y = 0; - clist->column_title_area.width = 1; - clist->column_title_area.height = 1; - - clist->clist_window = NULL; - clist->clist_window_width = 1; - clist->clist_window_height = 1; - - clist->hoffset = 0; - clist->voffset = 0; - - clist->shadow_type = GTK_SHADOW_IN; - clist->vadjustment = NULL; - clist->hadjustment = NULL; - - clist->button_actions[0] = GTK_BUTTON_SELECTS | GTK_BUTTON_DRAGS; - clist->button_actions[1] = GTK_BUTTON_IGNORED; - clist->button_actions[2] = GTK_BUTTON_IGNORED; - clist->button_actions[3] = GTK_BUTTON_IGNORED; - clist->button_actions[4] = GTK_BUTTON_IGNORED; - - clist->cursor_drag = NULL; - clist->xor_gc = NULL; - clist->fg_gc = NULL; - clist->bg_gc = NULL; - clist->x_drag = 0; - - clist->selection_mode = GTK_SELECTION_SINGLE; - clist->selection = NULL; - clist->selection_end = NULL; - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - clist->focus_row = -1; - clist->focus_header_column = -1; - clist->undo_anchor = -1; - - clist->anchor = -1; - clist->anchor_state = GTK_STATE_SELECTED; - clist->drag_pos = -1; - clist->htimer = 0; - clist->vtimer = 0; - - clist->click_cell.row = -1; - clist->click_cell.column = -1; - - clist->compare = default_compare; - clist->sort_type = GTK_SORT_ASCENDING; - clist->sort_column = 0; - - clist->drag_highlight_row = -1; -} - -/* Constructor */ -static GObject* -gtk_clist_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GObject *object = G_OBJECT_CLASS (parent_class)->constructor (type, - n_construct_properties, - construct_properties); - GtkCList *clist = GTK_CLIST (object); - - /* allocate memory for columns */ - clist->column = columns_new (clist); - - /* there needs to be at least one column button - * because there is alot of code that will break if it - * isn't there - */ - column_button_create (clist, 0); - - return object; -} - -/* GTKCLIST PUBLIC INTERFACE - * gtk_clist_new - * gtk_clist_new_with_titles - * gtk_clist_set_hadjustment - * gtk_clist_set_vadjustment - * gtk_clist_get_hadjustment - * gtk_clist_get_vadjustment - * gtk_clist_set_shadow_type - * gtk_clist_set_selection_mode - * gtk_clist_freeze - * gtk_clist_thaw - */ -GtkWidget* -gtk_clist_new (gint columns) -{ - return gtk_clist_new_with_titles (columns, NULL); -} - -GtkWidget* -gtk_clist_new_with_titles (gint columns, - gchar *titles[]) -{ - GtkCList *clist; - - clist = g_object_new (GTK_TYPE_CLIST, - "n_columns", columns, - NULL); - if (titles) - { - guint i; - - for (i = 0; i < clist->columns; i++) - gtk_clist_set_column_title (clist, i, titles[i]); - gtk_clist_column_titles_show (clist); - } - else - gtk_clist_column_titles_hide (clist); - - return GTK_WIDGET (clist); -} - -void -gtk_clist_set_hadjustment (GtkCList *clist, - GtkAdjustment *adjustment) -{ - GtkAdjustment *old_adjustment; - - g_return_if_fail (GTK_IS_CLIST (clist)); - if (adjustment) - g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - - if (clist->hadjustment == adjustment) - return; - - old_adjustment = clist->hadjustment; - - if (clist->hadjustment) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (clist->hadjustment), clist); - g_object_unref (clist->hadjustment); - } - - clist->hadjustment = adjustment; - - if (clist->hadjustment) - { - g_object_ref_sink (clist->hadjustment); - - gtk_signal_connect (GTK_OBJECT (clist->hadjustment), "changed", - G_CALLBACK (hadjustment_changed), - (gpointer) clist); - gtk_signal_connect (GTK_OBJECT (clist->hadjustment), "value-changed", - G_CALLBACK (hadjustment_value_changed), - (gpointer) clist); - } - - if (!clist->hadjustment || !old_adjustment) - gtk_widget_queue_resize (GTK_WIDGET (clist)); -} - -GtkAdjustment * -gtk_clist_get_hadjustment (GtkCList *clist) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - return clist->hadjustment; -} - -void -gtk_clist_set_vadjustment (GtkCList *clist, - GtkAdjustment *adjustment) -{ - GtkAdjustment *old_adjustment; - - g_return_if_fail (GTK_IS_CLIST (clist)); - if (adjustment) - g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - - if (clist->vadjustment == adjustment) - return; - - old_adjustment = clist->vadjustment; - - if (clist->vadjustment) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (clist->vadjustment), clist); - g_object_unref (clist->vadjustment); - } - - clist->vadjustment = adjustment; - - if (clist->vadjustment) - { - g_object_ref_sink (clist->vadjustment); - - gtk_signal_connect (GTK_OBJECT (clist->vadjustment), "changed", - G_CALLBACK (vadjustment_changed), - (gpointer) clist); - gtk_signal_connect (GTK_OBJECT (clist->vadjustment), "value-changed", - G_CALLBACK (vadjustment_value_changed), - (gpointer) clist); - } - - if (!clist->vadjustment || !old_adjustment) - gtk_widget_queue_resize (GTK_WIDGET (clist)); -} - -GtkAdjustment * -gtk_clist_get_vadjustment (GtkCList *clist) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - return clist->vadjustment; -} - -static void -gtk_clist_set_scroll_adjustments (GtkCList *clist, - GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment) -{ - if (clist->hadjustment != hadjustment) - gtk_clist_set_hadjustment (clist, hadjustment); - if (clist->vadjustment != vadjustment) - gtk_clist_set_vadjustment (clist, vadjustment); -} - -void -gtk_clist_set_shadow_type (GtkCList *clist, - GtkShadowType type) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - clist->shadow_type = type; - - if (gtk_widget_get_visible (GTK_WIDGET (clist))) - gtk_widget_queue_resize (GTK_WIDGET (clist)); -} - -void -gtk_clist_set_selection_mode (GtkCList *clist, - GtkSelectionMode mode) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - g_return_if_fail (mode != GTK_SELECTION_NONE); - - if (mode == clist->selection_mode) - return; - - clist->selection_mode = mode; - clist->anchor = -1; - clist->anchor_state = GTK_STATE_SELECTED; - clist->drag_pos = -1; - clist->undo_anchor = clist->focus_row; - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - switch (mode) - { - case GTK_SELECTION_MULTIPLE: - return; - case GTK_SELECTION_BROWSE: - case GTK_SELECTION_SINGLE: - gtk_clist_unselect_all (clist); - break; - default: - /* Someone set it by hand */ - g_assert_not_reached (); - } -} - -void -gtk_clist_freeze (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - clist->freeze_count++; -} - -void -gtk_clist_thaw (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist->freeze_count) - { - clist->freeze_count--; - CLIST_REFRESH (clist); - } -} - -/* PUBLIC COLUMN FUNCTIONS - * gtk_clist_column_titles_show - * gtk_clist_column_titles_hide - * gtk_clist_column_title_active - * gtk_clist_column_title_passive - * gtk_clist_column_titles_active - * gtk_clist_column_titles_passive - * gtk_clist_set_column_title - * gtk_clist_get_column_title - * gtk_clist_set_column_widget - * gtk_clist_set_column_justification - * gtk_clist_set_column_visibility - * gtk_clist_set_column_resizeable - * gtk_clist_set_column_auto_resize - * gtk_clist_optimal_column_width - * gtk_clist_set_column_width - * gtk_clist_set_column_min_width - * gtk_clist_set_column_max_width - */ -void -gtk_clist_column_titles_show (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (!GTK_CLIST_SHOW_TITLES(clist)) - { - GTK_CLIST_SET_FLAG (clist, CLIST_SHOW_TITLES); - if (clist->title_window) - gdk_window_show (clist->title_window); - gtk_widget_queue_resize (GTK_WIDGET (clist)); - } -} - -void -gtk_clist_column_titles_hide (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (GTK_CLIST_SHOW_TITLES(clist)) - { - GTK_CLIST_UNSET_FLAG (clist, CLIST_SHOW_TITLES); - if (clist->title_window) - gdk_window_hide (clist->title_window); - gtk_widget_queue_resize (GTK_WIDGET (clist)); - } -} - -void -gtk_clist_column_title_active (GtkCList *clist, - gint column) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (!clist->column[column].button || !clist->column[column].button_passive) - return; - - clist->column[column].button_passive = FALSE; - - gtk_signal_disconnect_by_func (GTK_OBJECT (clist->column[column].button), - G_CALLBACK (column_title_passive_func), - NULL); - - gtk_widget_set_can_focus (clist->column[column].button, TRUE); - if (gtk_widget_get_visible (GTK_WIDGET (clist))) - gtk_widget_queue_draw (clist->column[column].button); -} - -void -gtk_clist_column_title_passive (GtkCList *clist, - gint column) -{ - GtkButton *button; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (!clist->column[column].button || clist->column[column].button_passive) - return; - - button = GTK_BUTTON (clist->column[column].button); - - clist->column[column].button_passive = TRUE; - - if (button->button_down) - g_signal_emit_by_name (button, "released"); - if (button->in_button) - g_signal_emit_by_name (button, "leave"); - - gtk_signal_connect (GTK_OBJECT (clist->column[column].button), "event", - G_CALLBACK (column_title_passive_func), - NULL); - - gtk_widget_set_can_focus (clist->column[column].button, FALSE); - if (gtk_widget_get_visible (GTK_WIDGET (clist))) - gtk_widget_queue_draw (clist->column[column].button); -} - -void -gtk_clist_column_titles_active (GtkCList *clist) -{ - gint i; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - for (i = 0; i < clist->columns; i++) - gtk_clist_column_title_active (clist, i); -} - -void -gtk_clist_column_titles_passive (GtkCList *clist) -{ - gint i; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - for (i = 0; i < clist->columns; i++) - gtk_clist_column_title_passive (clist, i); -} - -void -gtk_clist_set_column_title (GtkCList *clist, - gint column, - const gchar *title) -{ - gint new_button = 0; - GtkWidget *old_widget; - GtkWidget *alignment = NULL; - GtkWidget *label; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - - /* if the column button doesn't currently exist, - * it has to be created first */ - if (!clist->column[column].button) - { - column_button_create (clist, column); - new_button = 1; - } - - column_title_new (clist, column, title); - - /* remove and destroy the old widget */ - old_widget = GTK_BIN (clist->column[column].button)->child; - if (old_widget) - gtk_container_remove (GTK_CONTAINER (clist->column[column].button), old_widget); - - /* create new alignment based no column justification */ - switch (clist->column[column].justification) - { - case GTK_JUSTIFY_LEFT: - alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); - break; - - case GTK_JUSTIFY_RIGHT: - alignment = gtk_alignment_new (1.0, 0.5, 0.0, 0.0); - break; - - case GTK_JUSTIFY_CENTER: - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - break; - - case GTK_JUSTIFY_FILL: - alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - break; - } - - gtk_widget_push_composite_child (); - label = gtk_label_new (clist->column[column].title); - gtk_widget_pop_composite_child (); - gtk_container_add (GTK_CONTAINER (alignment), label); - gtk_container_add (GTK_CONTAINER (clist->column[column].button), alignment); - gtk_widget_show (label); - gtk_widget_show (alignment); - - /* if this button didn't previously exist, then the - * column button positions have to be re-computed */ - if (gtk_widget_get_visible (GTK_WIDGET (clist)) && new_button) - size_allocate_title_buttons (clist); -} - -gchar * -gtk_clist_get_column_title (GtkCList *clist, - gint column) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - if (column < 0 || column >= clist->columns) - return NULL; - - return clist->column[column].title; -} - -void -gtk_clist_set_column_widget (GtkCList *clist, - gint column, - GtkWidget *widget) -{ - gint new_button = 0; - GtkWidget *old_widget; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - - /* if the column button doesn't currently exist, - * it has to be created first */ - if (!clist->column[column].button) - { - column_button_create (clist, column); - new_button = 1; - } - - column_title_new (clist, column, NULL); - - /* remove and destroy the old widget */ - old_widget = GTK_BIN (clist->column[column].button)->child; - if (old_widget) - gtk_container_remove (GTK_CONTAINER (clist->column[column].button), - old_widget); - - /* add and show the widget */ - if (widget) - { - gtk_container_add (GTK_CONTAINER (clist->column[column].button), widget); - gtk_widget_show (widget); - } - - /* if this button didn't previously exist, then the - * column button positions have to be re-computed */ - if (gtk_widget_get_visible (GTK_WIDGET (clist)) && new_button) - size_allocate_title_buttons (clist); -} - -GtkWidget * -gtk_clist_get_column_widget (GtkCList *clist, - gint column) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - if (column < 0 || column >= clist->columns) - return NULL; - - if (clist->column[column].button) - return GTK_BIN (clist->column[column].button)->child; - - return NULL; -} - -void -gtk_clist_set_column_justification (GtkCList *clist, - gint column, - GtkJustification justification) -{ - GtkWidget *alignment; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - - clist->column[column].justification = justification; - - /* change the alinment of the button title if it's not a - * custom widget */ - if (clist->column[column].title) - { - alignment = GTK_BIN (clist->column[column].button)->child; - - switch (clist->column[column].justification) - { - case GTK_JUSTIFY_LEFT: - gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.0, 0.5, 0.0, 0.0); - break; - - case GTK_JUSTIFY_RIGHT: - gtk_alignment_set (GTK_ALIGNMENT (alignment), 1.0, 0.5, 0.0, 0.0); - break; - - case GTK_JUSTIFY_CENTER: - gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.5, 0.5, 0.0, 0.0); - break; - - case GTK_JUSTIFY_FILL: - gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.5, 0.5, 0.0, 0.0); - break; - - default: - break; - } - } - - if (CLIST_UNFROZEN (clist)) - draw_rows (clist, NULL); -} - -void -gtk_clist_set_column_visibility (GtkCList *clist, - gint column, - gboolean visible) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (clist->column[column].visible == visible) - return; - - /* don't hide last visible column */ - if (!visible) - { - gint i; - gint vis_columns = 0; - - for (i = 0, vis_columns = 0; i < clist->columns && vis_columns < 2; i++) - if (clist->column[i].visible) - vis_columns++; - - if (vis_columns < 2) - return; - } - - clist->column[column].visible = visible; - - if (clist->column[column].button) - { - if (visible) - gtk_widget_show (clist->column[column].button); - else - gtk_widget_hide (clist->column[column].button); - } - - gtk_widget_queue_resize (GTK_WIDGET(clist)); -} - -void -gtk_clist_set_column_resizeable (GtkCList *clist, - gint column, - gboolean resizeable) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (clist->column[column].resizeable == resizeable) - return; - - clist->column[column].resizeable = resizeable; - if (resizeable) - clist->column[column].auto_resize = FALSE; - - if (gtk_widget_get_visible (GTK_WIDGET (clist))) - size_allocate_title_buttons (clist); -} - -void -gtk_clist_set_column_auto_resize (GtkCList *clist, - gint column, - gboolean auto_resize) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (clist->column[column].auto_resize == auto_resize) - return; - - clist->column[column].auto_resize = auto_resize; - if (auto_resize) - { - clist->column[column].resizeable = FALSE; - if (!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - gint width; - - width = gtk_clist_optimal_column_width (clist, column); - gtk_clist_set_column_width (clist, column, width); - } - } - - if (gtk_widget_get_visible (GTK_WIDGET (clist))) - size_allocate_title_buttons (clist); -} - -gint -gtk_clist_columns_autosize (GtkCList *clist) -{ - gint i; - gint width; - - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - - gtk_clist_freeze (clist); - width = 0; - for (i = 0; i < clist->columns; i++) - { - gtk_clist_set_column_width (clist, i, - gtk_clist_optimal_column_width (clist, i)); - - width += clist->column[i].width; - } - - gtk_clist_thaw (clist); - return width; -} - -gint -gtk_clist_optimal_column_width (GtkCList *clist, - gint column) -{ - GtkRequisition requisition; - GList *list; - gint width; - - g_return_val_if_fail (GTK_CLIST (clist), 0); - - if (column < 0 || column >= clist->columns) - return 0; - - if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[column].button) - width = (clist->column[column].button->requisition.width) -#if 0 - (CELL_SPACING + (2 * COLUMN_INSET))) -#endif - ; - else - width = 0; - - for (list = clist->row_list; list; list = list->next) - { - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, GTK_CLIST_ROW (list), column, &requisition); - width = MAX (width, requisition.width); - } - - return width; -} - -void -gtk_clist_set_column_width (GtkCList *clist, - gint column, - gint width) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[RESIZE_COLUMN], - column, width); -} - -void -gtk_clist_set_column_min_width (GtkCList *clist, - gint column, - gint min_width) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (clist->column[column].min_width == min_width) - return; - - if (clist->column[column].max_width >= 0 && - clist->column[column].max_width < min_width) - clist->column[column].min_width = clist->column[column].max_width; - else - clist->column[column].min_width = min_width; - - if (clist->column[column].area.width < clist->column[column].min_width) - gtk_clist_set_column_width (clist, column,clist->column[column].min_width); -} - -void -gtk_clist_set_column_max_width (GtkCList *clist, - gint column, - gint max_width) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - if (clist->column[column].max_width == max_width) - return; - - if (clist->column[column].min_width >= 0 && max_width >= 0 && - clist->column[column].min_width > max_width) - clist->column[column].max_width = clist->column[column].min_width; - else - clist->column[column].max_width = max_width; - - if (clist->column[column].area.width > clist->column[column].max_width) - gtk_clist_set_column_width (clist, column,clist->column[column].max_width); -} - -/* PRIVATE COLUMN FUNCTIONS - * column_auto_resize - * real_resize_column - * abort_column_resize - * size_allocate_title_buttons - * size_allocate_columns - * list_requisition_width - * new_column_width - * column_button_create - * column_button_clicked - * column_title_passive_func - */ -static void -column_auto_resize (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - gint old_width) -{ - /* resize column if needed for auto_resize */ - GtkRequisition requisition; - - if (!clist->column[column].auto_resize || - GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - return; - - if (clist_row) - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - else - requisition.width = 0; - - if (requisition.width > clist->column[column].width) - gtk_clist_set_column_width (clist, column, requisition.width); - else if (requisition.width < old_width && - old_width == clist->column[column].width) - { - GList *list; - gint new_width = 0; - - /* run a "gtk_clist_optimal_column_width" but break, if - * the column doesn't shrink */ - if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[column].button) - new_width = (clist->column[column].button->requisition.width - - (CELL_SPACING + (2 * COLUMN_INSET))); - else - new_width = 0; - - for (list = clist->row_list; list; list = list->next) - { - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, GTK_CLIST_ROW (list), column, &requisition); - new_width = MAX (new_width, requisition.width); - if (new_width == clist->column[column].width) - break; - } - if (new_width < clist->column[column].width) - gtk_clist_set_column_width - (clist, column, MAX (new_width, clist->column[column].min_width)); - } -} - -static void -real_resize_column (GtkCList *clist, - gint column, - gint width) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - - if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width)) - width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width); - if (clist->column[column].max_width >= 0 && - width > clist->column[column].max_width) - width = clist->column[column].max_width; - - clist->column[column].width = width; - clist->column[column].width_set = TRUE; - - /* FIXME: this is quite expensive to do if the widget hasn't - * been size_allocated yet, and pointless. Should - * a flag be kept - */ - size_allocate_columns (clist, TRUE); - size_allocate_title_buttons (clist); - - CLIST_REFRESH (clist); -} - -static void -abort_column_resize (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (!GTK_CLIST_IN_DRAG(clist)) - return; - - GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG); - gtk_grab_remove (GTK_WIDGET (clist)); - gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (clist)), - GDK_CURRENT_TIME); - clist->drag_pos = -1; - - if (clist->x_drag >= 0 && clist->x_drag <= clist->clist_window_width - 1) - draw_xor_line (clist); - - if (GTK_CLIST_ADD_MODE(clist)) - { - gint8 dashes[] = { 4, 4 }; - - gdk_gc_set_line_attributes (clist->xor_gc, 1, GDK_LINE_ON_OFF_DASH, 0,0); - gdk_gc_set_dashes (clist->xor_gc, 0, dashes, G_N_ELEMENTS (dashes)); - } -} - -static void -size_allocate_title_buttons (GtkCList *clist) -{ - GtkAllocation button_allocation; - gint last_column; - gint last_button = 0; - gint i; - - if (!gtk_widget_get_realized (GTK_WIDGET (clist))) - return; - - button_allocation.x = clist->hoffset; - button_allocation.y = 0; - button_allocation.width = 0; - button_allocation.height = clist->column_title_area.height; - - /* find last visible column */ - for (last_column = clist->columns - 1; last_column >= 0; last_column--) - if (clist->column[last_column].visible) - break; - - for (i = 0; i < last_column; i++) - { - if (!clist->column[i].visible) - { - last_button = i + 1; - gdk_window_hide (clist->column[i].window); - continue; - } - - button_allocation.width += (clist->column[i].area.width + - CELL_SPACING + 2 * COLUMN_INSET); - - if (!clist->column[i + 1].button) - { - gdk_window_hide (clist->column[i].window); - continue; - } - - gtk_widget_size_allocate (clist->column[last_button].button, - &button_allocation); - button_allocation.x += button_allocation.width; - button_allocation.width = 0; - - if (clist->column[last_button].resizeable) - { - gdk_window_show (clist->column[last_button].window); - gdk_window_move_resize (clist->column[last_button].window, - button_allocation.x - (DRAG_WIDTH / 2), - 0, DRAG_WIDTH, - clist->column_title_area.height); - } - else - gdk_window_hide (clist->column[last_button].window); - - last_button = i + 1; - } - - button_allocation.width += (clist->column[last_column].area.width + - 2 * (CELL_SPACING + COLUMN_INSET)); - gtk_widget_size_allocate (clist->column[last_button].button, - &button_allocation); - - if (clist->column[last_button].resizeable) - { - button_allocation.x += button_allocation.width; - - gdk_window_show (clist->column[last_button].window); - gdk_window_move_resize (clist->column[last_button].window, - button_allocation.x - (DRAG_WIDTH / 2), - 0, DRAG_WIDTH, clist->column_title_area.height); - } - else - gdk_window_hide (clist->column[last_button].window); -} - -static void -size_allocate_columns (GtkCList *clist, - gboolean block_resize) -{ - gint xoffset = CELL_SPACING + COLUMN_INSET; - gint last_column; - gint i; - - /* find last visible column and calculate correct column width */ - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--); - - if (last_column < 0) - return; - - for (i = 0; i <= last_column; i++) - { - if (!clist->column[i].visible) - continue; - clist->column[i].area.x = xoffset; - if (clist->column[i].width_set) - { - if (!block_resize && GTK_CLIST_SHOW_TITLES(clist) && - clist->column[i].auto_resize && clist->column[i].button) - { - gint width; - - width = (clist->column[i].button->requisition.width - - (CELL_SPACING + (2 * COLUMN_INSET))); - - if (width > clist->column[i].width) - gtk_clist_set_column_width (clist, i, width); - } - - clist->column[i].area.width = clist->column[i].width; - xoffset += clist->column[i].width + CELL_SPACING + (2* COLUMN_INSET); - } - else if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[i].button) - { - clist->column[i].area.width = - clist->column[i].button->requisition.width - - (CELL_SPACING + (2 * COLUMN_INSET)); - xoffset += clist->column[i].button->requisition.width; - } - } - - clist->column[last_column].area.width = clist->column[last_column].area.width - + MAX (0, clist->clist_window_width + COLUMN_INSET - xoffset); -} - -static gint -list_requisition_width (GtkCList *clist) -{ - gint width = CELL_SPACING; - gint i; - - for (i = clist->columns - 1; i >= 0; i--) - { - if (!clist->column[i].visible) - continue; - - if (clist->column[i].width_set) - width += clist->column[i].width + CELL_SPACING + (2 * COLUMN_INSET); - else if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[i].button) - width += clist->column[i].button->requisition.width; - } - - return width; -} - -/* this function returns the new width of the column being resized given - * the column and x position of the cursor; the x cursor position is passed - * in as a pointer and automagicly corrected if it's beyond min/max limits */ -static gint -new_column_width (GtkCList *clist, - gint column, - gint *x) -{ - gint xthickness = GTK_WIDGET (clist)->style->xthickness; - gint width; - gint cx; - gint dx; - gint last_column; - - /* first translate the x position from widget->window - * to clist->clist_window */ - cx = *x - xthickness; - - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--); - - /* calculate new column width making sure it doesn't end up - * less than the minimum width */ - dx = (COLUMN_LEFT_XPIXEL (clist, column) + COLUMN_INSET + - (column < last_column) * CELL_SPACING); - width = cx - dx; - - if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width)) - { - width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width); - cx = dx + width; - *x = cx + xthickness; - } - else if (clist->column[column].max_width >= COLUMN_MIN_WIDTH && - width > clist->column[column].max_width) - { - width = clist->column[column].max_width; - cx = dx + clist->column[column].max_width; - *x = cx + xthickness; - } - - if (cx < 0 || cx > clist->clist_window_width) - *x = -1; - - return width; -} - -static void -column_button_create (GtkCList *clist, - gint column) -{ - GtkWidget *button; - - gtk_widget_push_composite_child (); - button = clist->column[column].button = gtk_button_new (); - gtk_widget_pop_composite_child (); - - if (gtk_widget_get_realized (GTK_WIDGET (clist)) && clist->title_window) - gtk_widget_set_parent_window (clist->column[column].button, - clist->title_window); - gtk_widget_set_parent (button, GTK_WIDGET (clist)); - - gtk_signal_connect (GTK_OBJECT (button), "clicked", - G_CALLBACK (column_button_clicked), - (gpointer) clist); - gtk_widget_show (button); -} - -static void -column_button_clicked (GtkWidget *widget, - gpointer data) -{ - gint i; - GtkCList *clist; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_CLIST (data)); - - clist = GTK_CLIST (data); - - /* find the column who's button was pressed */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button == widget) - break; - - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[CLICK_COLUMN], i); -} - -static gint -column_title_passive_func (GtkWidget *widget, - GdkEvent *event, - gpointer data) -{ - g_return_val_if_fail (event != NULL, FALSE); - - switch (event->type) - { - case GDK_MOTION_NOTIFY: - case GDK_BUTTON_PRESS: - case GDK_2BUTTON_PRESS: - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - return TRUE; - default: - break; - } - return FALSE; -} - - -/* PUBLIC CELL FUNCTIONS - * gtk_clist_get_cell_type - * gtk_clist_set_text - * gtk_clist_get_text - * gtk_clist_set_pixmap - * gtk_clist_get_pixmap - * gtk_clist_set_pixtext - * gtk_clist_get_pixtext - * gtk_clist_set_shift - */ -GtkCellType -gtk_clist_get_cell_type (GtkCList *clist, - gint row, - gint column) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), -1); - - if (row < 0 || row >= clist->rows) - return -1; - if (column < 0 || column >= clist->columns) - return -1; - - clist_row = ROW_ELEMENT (clist, row)->data; - - return clist_row->cell[column].type; -} - -void -gtk_clist_set_text (GtkCList *clist, - gint row, - gint column, - const gchar *text) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < 0 || column >= clist->columns) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - /* if text is null, then the cell is empty */ - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, clist_row, column, GTK_CELL_TEXT, text, 0, NULL, NULL); - - /* redraw the list if it's not frozen */ - if (CLIST_UNFROZEN (clist)) - { - if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); - } -} - -gint -gtk_clist_get_text (GtkCList *clist, - gint row, - gint column, - gchar **text) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - - if (row < 0 || row >= clist->rows) - return 0; - if (column < 0 || column >= clist->columns) - return 0; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->cell[column].type != GTK_CELL_TEXT) - return 0; - - if (text) - *text = GTK_CELL_TEXT (clist_row->cell[column])->text; - - return 1; -} - -/** - * gtk_clist_set_pixmap: - * @mask: (allow-none): - */ -void -gtk_clist_set_pixmap (GtkCList *clist, - gint row, - gint column, - GdkPixmap *pixmap, - GdkBitmap *mask) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < 0 || column >= clist->columns) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - g_object_ref (pixmap); - - if (mask) g_object_ref (mask); - - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, clist_row, column, GTK_CELL_PIXMAP, NULL, 0, pixmap, mask); - - /* redraw the list if it's not frozen */ - if (CLIST_UNFROZEN (clist)) - { - if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); - } -} - -gint -gtk_clist_get_pixmap (GtkCList *clist, - gint row, - gint column, - GdkPixmap **pixmap, - GdkBitmap **mask) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - - if (row < 0 || row >= clist->rows) - return 0; - if (column < 0 || column >= clist->columns) - return 0; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->cell[column].type != GTK_CELL_PIXMAP) - return 0; - - if (pixmap) - { - *pixmap = GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap; - /* mask can be NULL */ - *mask = GTK_CELL_PIXMAP (clist_row->cell[column])->mask; - } - - return 1; -} - -void -gtk_clist_set_pixtext (GtkCList *clist, - gint row, - gint column, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < 0 || column >= clist->columns) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - g_object_ref (pixmap); - if (mask) g_object_ref (mask); - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, clist_row, column, GTK_CELL_PIXTEXT, text, spacing, pixmap, mask); - - /* redraw the list if it's not frozen */ - if (CLIST_UNFROZEN (clist)) - { - if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); - } -} - -gint -gtk_clist_get_pixtext (GtkCList *clist, - gint row, - gint column, - gchar **text, - guint8 *spacing, - GdkPixmap **pixmap, - GdkBitmap **mask) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - - if (row < 0 || row >= clist->rows) - return 0; - if (column < 0 || column >= clist->columns) - return 0; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->cell[column].type != GTK_CELL_PIXTEXT) - return 0; - - if (text) - *text = GTK_CELL_PIXTEXT (clist_row->cell[column])->text; - if (spacing) - *spacing = GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing; - if (pixmap) - *pixmap = GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap; - - /* mask can be NULL */ - if (mask) - *mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask; - - return 1; -} - -void -gtk_clist_set_shift (GtkCList *clist, - gint row, - gint column, - gint vertical, - gint horizontal) -{ - GtkRequisition requisition = { 0 }; - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < 0 || column >= clist->columns) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - - clist_row->cell[column].vertical = vertical; - clist_row->cell[column].horizontal = horizontal; - - column_auto_resize (clist, clist_row, column, requisition.width); - - if (CLIST_UNFROZEN (clist) && gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); -} - -/* PRIVATE CELL FUNCTIONS - * set_cell_contents - * cell_size_request - */ -static void -set_cell_contents (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkCellType type, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask) -{ - GtkRequisition requisition; - gchar *old_text = NULL; - GdkPixmap *old_pixmap = NULL; - GdkBitmap *old_mask = NULL; - - g_return_if_fail (GTK_IS_CLIST (clist)); - g_return_if_fail (clist_row != NULL); - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - - switch (clist_row->cell[column].type) - { - case GTK_CELL_EMPTY: - break; - case GTK_CELL_TEXT: - old_text = GTK_CELL_TEXT (clist_row->cell[column])->text; - break; - case GTK_CELL_PIXMAP: - old_pixmap = GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap; - old_mask = GTK_CELL_PIXMAP (clist_row->cell[column])->mask; - break; - case GTK_CELL_PIXTEXT: - old_text = GTK_CELL_PIXTEXT (clist_row->cell[column])->text; - old_pixmap = GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap; - old_mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask; - break; - case GTK_CELL_WIDGET: - /* unimplemented */ - break; - default: - break; - } - - clist_row->cell[column].type = GTK_CELL_EMPTY; - - /* Note that pixmap and mask were already ref'ed by the caller - */ - switch (type) - { - case GTK_CELL_TEXT: - if (text) - { - clist_row->cell[column].type = GTK_CELL_TEXT; - GTK_CELL_TEXT (clist_row->cell[column])->text = g_strdup (text); - } - break; - case GTK_CELL_PIXMAP: - if (pixmap) - { - clist_row->cell[column].type = GTK_CELL_PIXMAP; - GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap = pixmap; - /* We set the mask even if it is NULL */ - GTK_CELL_PIXMAP (clist_row->cell[column])->mask = mask; - } - break; - case GTK_CELL_PIXTEXT: - if (text && pixmap) - { - clist_row->cell[column].type = GTK_CELL_PIXTEXT; - GTK_CELL_PIXTEXT (clist_row->cell[column])->text = g_strdup (text); - GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing = spacing; - GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap = pixmap; - GTK_CELL_PIXTEXT (clist_row->cell[column])->mask = mask; - } - break; - default: - break; - } - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - column_auto_resize (clist, clist_row, column, requisition.width); - - g_free (old_text); - if (old_pixmap) - g_object_unref (old_pixmap); - if (old_mask) - g_object_unref (old_mask); -} - -PangoLayout * -_gtk_clist_create_cell_layout (GtkCList *clist, - GtkCListRow *clist_row, - gint column) -{ - PangoLayout *layout; - GtkStyle *style; - GtkCell *cell; - gchar *text; - - get_cell_style (clist, clist_row, GTK_STATE_NORMAL, column, &style, - NULL, NULL); - - - cell = &clist_row->cell[column]; - switch (cell->type) - { - case GTK_CELL_TEXT: - case GTK_CELL_PIXTEXT: - text = ((cell->type == GTK_CELL_PIXTEXT) ? - GTK_CELL_PIXTEXT (*cell)->text : - GTK_CELL_TEXT (*cell)->text); - - if (!text) - return NULL; - - layout = gtk_widget_create_pango_layout (GTK_WIDGET (clist), - ((cell->type == GTK_CELL_PIXTEXT) ? - GTK_CELL_PIXTEXT (*cell)->text : - GTK_CELL_TEXT (*cell)->text)); - pango_layout_set_font_description (layout, style->font_desc); - - return layout; - - default: - return NULL; - } -} - -static void -cell_size_request (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkRequisition *requisition) -{ - gint width; - gint height; - PangoLayout *layout; - PangoRectangle logical_rect; - - g_return_if_fail (GTK_IS_CLIST (clist)); - g_return_if_fail (requisition != NULL); - - layout = _gtk_clist_create_cell_layout (clist, clist_row, column); - if (layout) - { - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - - requisition->width = logical_rect.width; - requisition->height = logical_rect.height; - - g_object_unref (layout); - } - else - { - requisition->width = 0; - requisition->height = 0; - } - - if (layout && clist_row->cell[column].type == GTK_CELL_PIXTEXT) - requisition->width += GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing; - - switch (clist_row->cell[column].type) - { - case GTK_CELL_PIXTEXT: - gdk_drawable_get_size (GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap, - &width, &height); - requisition->width += width; - requisition->height = MAX (requisition->height, height); - break; - case GTK_CELL_PIXMAP: - gdk_drawable_get_size (GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap, - &width, &height); - requisition->width += width; - requisition->height = MAX (requisition->height, height); - break; - - default: - break; - } - - requisition->width += clist_row->cell[column].horizontal; - requisition->height += clist_row->cell[column].vertical; -} - -/* PUBLIC INSERT/REMOVE ROW FUNCTIONS - * gtk_clist_prepend - * gtk_clist_append - * gtk_clist_insert - * gtk_clist_remove - * gtk_clist_clear - */ -gint -gtk_clist_prepend (GtkCList *clist, - gchar *text[]) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), -1); - g_return_val_if_fail (text != NULL, -1); - - return GTK_CLIST_GET_CLASS (clist)->insert_row (clist, 0, text); -} - -gint -gtk_clist_append (GtkCList *clist, - gchar *text[]) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), -1); - g_return_val_if_fail (text != NULL, -1); - - return GTK_CLIST_GET_CLASS (clist)->insert_row (clist, clist->rows, text); -} - -gint -gtk_clist_insert (GtkCList *clist, - gint row, - gchar *text[]) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), -1); - g_return_val_if_fail (text != NULL, -1); - - if (row < 0 || row > clist->rows) - row = clist->rows; - - return GTK_CLIST_GET_CLASS (clist)->insert_row (clist, row, text); -} - -void -gtk_clist_remove (GtkCList *clist, - gint row) -{ - GTK_CLIST_GET_CLASS (clist)->remove_row (clist, row); -} - -void -gtk_clist_clear (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - GTK_CLIST_GET_CLASS (clist)->clear (clist); -} - -/* PRIVATE INSERT/REMOVE ROW FUNCTIONS - * real_insert_row - * real_remove_row - * real_clear - * real_row_move - */ -static gint -real_insert_row (GtkCList *clist, - gint row, - gchar *text[]) -{ - gint i; - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), -1); - g_return_val_if_fail (text != NULL, -1); - - /* return if out of bounds */ - if (row < 0 || row > clist->rows) - return -1; - - /* create the row */ - clist_row = row_new (clist); - - /* set the text in the row's columns */ - for (i = 0; i < clist->columns; i++) - if (text[i]) - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, clist_row, i, GTK_CELL_TEXT, text[i], 0, NULL ,NULL); - - if (!clist->rows) - { - clist->row_list = g_list_append (clist->row_list, clist_row); - clist->row_list_end = clist->row_list; - } - else - { - if (GTK_CLIST_AUTO_SORT(clist)) /* override insertion pos */ - { - GList *work; - - row = 0; - work = clist->row_list; - - if (clist->sort_type == GTK_SORT_ASCENDING) - { - while (row < clist->rows && - clist->compare (clist, clist_row, - GTK_CLIST_ROW (work)) > 0) - { - row++; - work = work->next; - } - } - else - { - while (row < clist->rows && - clist->compare (clist, clist_row, - GTK_CLIST_ROW (work)) < 0) - { - row++; - work = work->next; - } - } - } - - /* reset the row end pointer if we're inserting at the end of the list */ - if (row == clist->rows) - clist->row_list_end = (g_list_append (clist->row_list_end, - clist_row))->next; - else - clist->row_list = g_list_insert (clist->row_list, clist_row, row); - - } - clist->rows++; - - if (row < ROW_FROM_YPIXEL (clist, 0)) - clist->voffset -= (clist->row_height + CELL_SPACING); - - /* syncronize the selection list */ - sync_selection (clist, row, SYNC_INSERT); - - if (clist->rows == 1) - { - clist->focus_row = 0; - if (clist->selection_mode == GTK_SELECTION_BROWSE) - gtk_clist_select_row (clist, 0, -1); - } - - /* redraw the list if it isn't frozen */ - if (CLIST_UNFROZEN (clist)) - { - adjust_adjustments (clist, FALSE); - - if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - draw_rows (clist, NULL); - } - - return row; -} - -static void -real_remove_row (GtkCList *clist, - gint row) -{ - gint was_visible; - GList *list; - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - /* return if out of bounds */ - if (row < 0 || row > (clist->rows - 1)) - return; - - was_visible = (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE); - - /* get the row we're going to delete */ - list = ROW_ELEMENT (clist, row); - g_assert (list != NULL); - clist_row = list->data; - - /* if we're removing a selected row, we have to make sure - * it's properly unselected, and then sync up the clist->selected - * list to reflect the deincrimented indexies of rows after the - * removal */ - if (clist_row->state == GTK_STATE_SELECTED) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - row, -1, NULL); - - sync_selection (clist, row, SYNC_REMOVE); - - /* reset the row end pointer if we're removing at the end of the list */ - clist->rows--; - if (clist->row_list == list) - clist->row_list = g_list_next (list); - if (clist->row_list_end == list) - clist->row_list_end = g_list_previous (list); - list = g_list_remove (list, clist_row); - - if (row < ROW_FROM_YPIXEL (clist, 0)) - clist->voffset += clist->row_height + CELL_SPACING; - - if (clist->selection_mode == GTK_SELECTION_BROWSE && !clist->selection && - clist->focus_row >= 0) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - clist->focus_row, -1, NULL); - - /* toast the row */ - row_delete (clist, clist_row); - - /* redraw the row if it isn't frozen */ - if (CLIST_UNFROZEN (clist)) - { - adjust_adjustments (clist, FALSE); - - if (was_visible) - draw_rows (clist, NULL); - } -} - -static void -real_clear (GtkCList *clist) -{ - GList *list; - GList *free_list; - gint i; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - /* free up the selection list */ - g_list_free (clist->selection); - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - - clist->selection = NULL; - clist->selection_end = NULL; - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - clist->voffset = 0; - clist->focus_row = -1; - clist->anchor = -1; - clist->undo_anchor = -1; - clist->anchor_state = GTK_STATE_SELECTED; - clist->drag_pos = -1; - - /* remove all the rows */ - GTK_CLIST_SET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - free_list = clist->row_list; - clist->row_list = NULL; - clist->row_list_end = NULL; - clist->rows = 0; - for (list = free_list; list; list = list->next) - row_delete (clist, GTK_CLIST_ROW (list)); - g_list_free (free_list); - GTK_CLIST_UNSET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - { - if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[i].button) - gtk_clist_set_column_width - (clist, i, (clist->column[i].button->requisition.width - - (CELL_SPACING + (2 * COLUMN_INSET)))); - else - gtk_clist_set_column_width (clist, i, 0); - } - /* zero-out the scrollbars */ - if (clist->vadjustment) - { - gtk_adjustment_set_value (clist->vadjustment, 0.0); - CLIST_REFRESH (clist); - } - else - gtk_widget_queue_resize (GTK_WIDGET (clist)); -} - -static void -real_row_move (GtkCList *clist, - gint source_row, - gint dest_row) -{ - GtkCListRow *clist_row; - GList *list; - gint first, last; - gint d; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (GTK_CLIST_AUTO_SORT(clist)) - return; - - if (source_row < 0 || source_row >= clist->rows || - dest_row < 0 || dest_row >= clist->rows || - source_row == dest_row) - return; - - gtk_clist_freeze (clist); - - /* unlink source row */ - clist_row = ROW_ELEMENT (clist, source_row)->data; - if (source_row == clist->rows - 1) - clist->row_list_end = clist->row_list_end->prev; - clist->row_list = g_list_remove (clist->row_list, clist_row); - clist->rows--; - - /* relink source row */ - clist->row_list = g_list_insert (clist->row_list, clist_row, dest_row); - if (dest_row == clist->rows) - clist->row_list_end = clist->row_list_end->next; - clist->rows++; - - /* sync selection */ - if (source_row > dest_row) - { - first = dest_row; - last = source_row; - d = 1; - } - else - { - first = source_row; - last = dest_row; - d = -1; - } - - for (list = clist->selection; list; list = list->next) - { - if (list->data == GINT_TO_POINTER (source_row)) - list->data = GINT_TO_POINTER (dest_row); - else if (first <= GPOINTER_TO_INT (list->data) && - last >= GPOINTER_TO_INT (list->data)) - list->data = GINT_TO_POINTER (GPOINTER_TO_INT (list->data) + d); - } - - if (clist->focus_row == source_row) - clist->focus_row = dest_row; - else if (clist->focus_row > first) - clist->focus_row += d; - - gtk_clist_thaw (clist); -} - -/* PUBLIC ROW FUNCTIONS - * gtk_clist_moveto - * gtk_clist_set_row_height - * gtk_clist_set_row_data - * gtk_clist_set_row_data_full - * gtk_clist_get_row_data - * gtk_clist_find_row_from_data - * gtk_clist_swap_rows - * gtk_clist_row_move - * gtk_clist_row_is_visible - * gtk_clist_set_foreground - * gtk_clist_set_background - */ -void -gtk_clist_moveto (GtkCList *clist, - gint row, - gint column, - gfloat row_align, - gfloat col_align) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < -1 || row >= clist->rows) - return; - if (column < -1 || column >= clist->columns) - return; - - row_align = CLAMP (row_align, 0, 1); - col_align = CLAMP (col_align, 0, 1); - - /* adjust horizontal scrollbar */ - if (clist->hadjustment && column >= 0) - { - gint x; - - x = (COLUMN_LEFT (clist, column) - CELL_SPACING - COLUMN_INSET - - (col_align * (clist->clist_window_width - 2 * COLUMN_INSET - - CELL_SPACING - clist->column[column].area.width))); - if (x < 0) - gtk_adjustment_set_value (clist->hadjustment, 0.0); - else if (x > LIST_WIDTH (clist) - clist->clist_window_width) - gtk_adjustment_set_value - (clist->hadjustment, LIST_WIDTH (clist) - clist->clist_window_width); - else - gtk_adjustment_set_value (clist->hadjustment, x); - } - - /* adjust vertical scrollbar */ - if (clist->vadjustment && row >= 0) - move_vertical (clist, row, row_align); -} - -void -gtk_clist_set_row_height (GtkCList *clist, - guint height) -{ - GtkWidget *widget; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - widget = GTK_WIDGET (clist); - - if (height > 0) - { - clist->row_height = height; - GTK_CLIST_SET_FLAG (clist, CLIST_ROW_HEIGHT_SET); - } - else - { - GTK_CLIST_UNSET_FLAG (clist, CLIST_ROW_HEIGHT_SET); - clist->row_height = 0; - } - - if (widget->style->font_desc) - { - PangoContext *context = gtk_widget_get_pango_context (widget); - PangoFontMetrics *metrics; - - metrics = pango_context_get_metrics (context, - widget->style->font_desc, - pango_context_get_language (context)); - - if (!GTK_CLIST_ROW_HEIGHT_SET(clist)) - { - clist->row_height = (pango_font_metrics_get_ascent (metrics) + - pango_font_metrics_get_descent (metrics)); - clist->row_height = PANGO_PIXELS (clist->row_height); - } - - pango_font_metrics_unref (metrics); - } - - CLIST_REFRESH (clist); -} - -void -gtk_clist_set_row_data (GtkCList *clist, - gint row, - gpointer data) -{ - gtk_clist_set_row_data_full (clist, row, data, NULL); -} - -void -gtk_clist_set_row_data_full (GtkCList *clist, - gint row, - gpointer data, - GDestroyNotify destroy) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row > (clist->rows - 1)) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->destroy) - clist_row->destroy (clist_row->data); - - clist_row->data = data; - clist_row->destroy = destroy; -} - -gpointer -gtk_clist_get_row_data (GtkCList *clist, - gint row) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - if (row < 0 || row > (clist->rows - 1)) - return NULL; - - clist_row = ROW_ELEMENT (clist, row)->data; - return clist_row->data; -} - -gint -gtk_clist_find_row_from_data (GtkCList *clist, - gpointer data) -{ - GList *list; - gint n; - - g_return_val_if_fail (GTK_IS_CLIST (clist), -1); - - for (n = 0, list = clist->row_list; list; n++, list = list->next) - if (GTK_CLIST_ROW (list)->data == data) - return n; - - return -1; -} - -void -gtk_clist_swap_rows (GtkCList *clist, - gint row1, - gint row2) -{ - gint first, last; - - g_return_if_fail (GTK_IS_CLIST (clist)); - g_return_if_fail (row1 != row2); - - if (GTK_CLIST_AUTO_SORT(clist)) - return; - - gtk_clist_freeze (clist); - - first = MIN (row1, row2); - last = MAX (row1, row2); - - gtk_clist_row_move (clist, last, first); - gtk_clist_row_move (clist, first + 1, last); - - gtk_clist_thaw (clist); -} - -void -gtk_clist_row_move (GtkCList *clist, - gint source_row, - gint dest_row) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (GTK_CLIST_AUTO_SORT(clist)) - return; - - if (source_row < 0 || source_row >= clist->rows || - dest_row < 0 || dest_row >= clist->rows || - source_row == dest_row) - return; - - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[ROW_MOVE], - source_row, dest_row); -} - -GtkVisibility -gtk_clist_row_is_visible (GtkCList *clist, - gint row) -{ - gint top; - - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - - if (row < 0 || row >= clist->rows) - return GTK_VISIBILITY_NONE; - - if (clist->row_height == 0) - return GTK_VISIBILITY_NONE; - - if (row < ROW_FROM_YPIXEL (clist, 0)) - return GTK_VISIBILITY_NONE; - - if (row > ROW_FROM_YPIXEL (clist, clist->clist_window_height)) - return GTK_VISIBILITY_NONE; - - top = ROW_TOP_YPIXEL (clist, row); - - if ((top < 0) - || ((top + clist->row_height) >= clist->clist_window_height)) - return GTK_VISIBILITY_PARTIAL; - - return GTK_VISIBILITY_FULL; -} - -void -gtk_clist_set_foreground (GtkCList *clist, - gint row, - const GdkColor *color) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (color) - { - clist_row->foreground = *color; - clist_row->fg_set = TRUE; - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (clist)), - &clist_row->foreground, FALSE, TRUE); - } - else - clist_row->fg_set = FALSE; - - if (CLIST_UNFROZEN (clist) && gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); -} - -void -gtk_clist_set_background (GtkCList *clist, - gint row, - const GdkColor *color) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (color) - { - clist_row->background = *color; - clist_row->bg_set = TRUE; - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (clist)), - &clist_row->background, FALSE, TRUE); - } - else - clist_row->bg_set = FALSE; - - if (CLIST_UNFROZEN (clist) - && (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); -} - -/* PUBLIC ROW/CELL STYLE FUNCTIONS - * gtk_clist_set_cell_style - * gtk_clist_get_cell_style - * gtk_clist_set_row_style - * gtk_clist_get_row_style - */ -void -gtk_clist_set_cell_style (GtkCList *clist, - gint row, - gint column, - GtkStyle *style) -{ - GtkRequisition requisition = { 0 }; - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < 0 || column >= clist->columns) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->cell[column].style == style) - return; - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - - if (clist_row->cell[column].style) - { - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gtk_style_detach (clist_row->cell[column].style); - g_object_unref (clist_row->cell[column].style); - } - - clist_row->cell[column].style = style; - - if (clist_row->cell[column].style) - { - g_object_ref (clist_row->cell[column].style); - - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - clist_row->cell[column].style = - gtk_style_attach (clist_row->cell[column].style, - clist->clist_window); - } - - column_auto_resize (clist, clist_row, column, requisition.width); - - /* redraw the list if it's not frozen */ - if (CLIST_UNFROZEN (clist)) - { - if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); - } -} - -GtkStyle * -gtk_clist_get_cell_style (GtkCList *clist, - gint row, - gint column) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - if (row < 0 || row >= clist->rows || column < 0 || column >= clist->columns) - return NULL; - - clist_row = ROW_ELEMENT (clist, row)->data; - - return clist_row->cell[column].style; -} - -void -gtk_clist_set_row_style (GtkCList *clist, - gint row, - GtkStyle *style) -{ - GtkRequisition requisition; - GtkCListRow *clist_row; - gint *old_width; - gint i; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->style == style) - return; - - old_width = g_new (gint, clist->columns); - - if (!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - { - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - i, &requisition); - old_width[i] = requisition.width; - } - } - - if (clist_row->style) - { - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gtk_style_detach (clist_row->style); - g_object_unref (clist_row->style); - } - - clist_row->style = style; - - if (clist_row->style) - { - g_object_ref (clist_row->style); - - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - clist_row->style = gtk_style_attach (clist_row->style, - clist->clist_window); - } - - if (GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - for (i = 0; i < clist->columns; i++) - column_auto_resize (clist, clist_row, i, old_width[i]); - - g_free (old_width); - - /* redraw the list if it's not frozen */ - if (CLIST_UNFROZEN (clist)) - { - if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); - } -} - -GtkStyle * -gtk_clist_get_row_style (GtkCList *clist, - gint row) -{ - GtkCListRow *clist_row; - - g_return_val_if_fail (GTK_IS_CLIST (clist), NULL); - - if (row < 0 || row >= clist->rows) - return NULL; - - clist_row = ROW_ELEMENT (clist, row)->data; - - return clist_row->style; -} - -/* PUBLIC SELECTION FUNCTIONS - * gtk_clist_set_selectable - * gtk_clist_get_selectable - * gtk_clist_select_row - * gtk_clist_unselect_row - * gtk_clist_select_all - * gtk_clist_unselect_all - * gtk_clist_undo_selection - */ -void -gtk_clist_set_selectable (GtkCList *clist, - gint row, - gboolean selectable) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (selectable == clist_row->selectable) - return; - - clist_row->selectable = selectable; - - if (!selectable && clist_row->state == GTK_STATE_SELECTED) - { - if (clist->anchor >= 0 && - clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - clist->drag_button = 0; - remove_grab (clist); - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - } - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - row, -1, NULL); - } -} - -gboolean -gtk_clist_get_selectable (GtkCList *clist, - gint row) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), FALSE); - - if (row < 0 || row >= clist->rows) - return FALSE; - - return GTK_CLIST_ROW (ROW_ELEMENT (clist, row))->selectable; -} - -void -gtk_clist_select_row (GtkCList *clist, - gint row, - gint column) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < -1 || column >= clist->columns) - return; - - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - row, column, NULL); -} - -void -gtk_clist_unselect_row (GtkCList *clist, - gint row, - gint column) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row >= clist->rows) - return; - if (column < -1 || column >= clist->columns) - return; - - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - row, column, NULL); -} - -void -gtk_clist_select_all (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - GTK_CLIST_GET_CLASS (clist)->select_all (clist); -} - -void -gtk_clist_unselect_all (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - GTK_CLIST_GET_CLASS (clist)->unselect_all (clist); -} - -void -gtk_clist_undo_selection (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist->selection_mode == GTK_SELECTION_MULTIPLE && - (clist->undo_selection || clist->undo_unselection)) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNDO_SELECTION]); -} - -/* PRIVATE SELECTION FUNCTIONS - * selection_find - * toggle_row - * fake_toggle_row - * toggle_focus_row - * toggle_add_mode - * real_select_row - * real_unselect_row - * real_select_all - * real_unselect_all - * fake_unselect_all - * real_undo_selection - * set_anchor - * resync_selection - * update_extended_selection - * start_selection - * end_selection - * extend_selection - * sync_selection - */ -static GList * -selection_find (GtkCList *clist, - gint row_number, - GList *row_list_element) -{ - return g_list_find (clist->selection, GINT_TO_POINTER (row_number)); -} - -static void -toggle_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event) -{ - GtkCListRow *clist_row; - - switch (clist->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - case GTK_SELECTION_SINGLE: - clist_row = ROW_ELEMENT (clist, row)->data; - - if (!clist_row) - return; - - if (clist_row->state == GTK_STATE_SELECTED) - { - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - row, column, event); - return; - } - case GTK_SELECTION_BROWSE: - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - row, column, event); - break; - default: - g_assert_not_reached (); - } -} - -static void -fake_toggle_row (GtkCList *clist, - gint row) -{ - GList *work; - - work = ROW_ELEMENT (clist, row); - - if (!work || !GTK_CLIST_ROW (work)->selectable) - return; - - if (GTK_CLIST_ROW (work)->state == GTK_STATE_NORMAL) - clist->anchor_state = GTK_CLIST_ROW (work)->state = GTK_STATE_SELECTED; - else - clist->anchor_state = GTK_CLIST_ROW (work)->state = GTK_STATE_NORMAL; - - if (CLIST_UNFROZEN (clist) && - gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, - GTK_CLIST_ROW (work)); -} - -static gboolean -clist_has_grab (GtkCList *clist) -{ - return (GTK_WIDGET_HAS_GRAB (clist) && - gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist)))); -} - -static void -toggle_focus_row (GtkCList *clist) -{ - g_return_if_fail (clist != 0); - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist) || - clist->focus_row < 0 || clist->focus_row >= clist->rows) - return; - - switch (clist->selection_mode) - { - case GTK_SELECTION_SINGLE: - toggle_row (clist, clist->focus_row, 0, NULL); - break; - case GTK_SELECTION_MULTIPLE: - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - clist->anchor = clist->focus_row; - clist->drag_pos = clist->focus_row; - clist->undo_anchor = clist->focus_row; - - if (GTK_CLIST_ADD_MODE(clist)) - fake_toggle_row (clist, clist->focus_row); - else - GTK_CLIST_GET_CLASS (clist)->fake_unselect_all (clist,clist->focus_row); - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - break; - default: - break; - } -} - -static void -toggle_add_mode (GtkCList *clist) -{ - g_return_if_fail (clist != 0); - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist) || - clist->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - gtk_clist_draw_focus (GTK_WIDGET (clist)); - if (!GTK_CLIST_ADD_MODE(clist)) - { - gint8 dashes[] = { 4, 4 }; - - GTK_CLIST_SET_FLAG (clist, CLIST_ADD_MODE); - gdk_gc_set_line_attributes (clist->xor_gc, 1, - GDK_LINE_ON_OFF_DASH, 0, 0); - gdk_gc_set_dashes (clist->xor_gc, 0, dashes, G_N_ELEMENTS (dashes)); - } - else - { - GTK_CLIST_UNSET_FLAG (clist, CLIST_ADD_MODE); - gdk_gc_set_line_attributes (clist->xor_gc, 1, GDK_LINE_SOLID, 0, 0); - clist->anchor_state = GTK_STATE_SELECTED; - } - gtk_clist_draw_focus (GTK_WIDGET (clist)); -} - -static void -real_select_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event) -{ - GtkCListRow *clist_row; - GList *list; - gint sel_row; - gboolean row_selected; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row > (clist->rows - 1)) - return; - - switch (clist->selection_mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - - row_selected = FALSE; - list = clist->selection; - - while (list) - { - sel_row = GPOINTER_TO_INT (list->data); - list = list->next; - - if (row == sel_row) - row_selected = TRUE; - else - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - sel_row, column, event); - } - - if (row_selected) - return; - - default: - break; - } - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->state != GTK_STATE_NORMAL || !clist_row->selectable) - return; - - clist_row->state = GTK_STATE_SELECTED; - if (!clist->selection) - { - clist->selection = g_list_append (clist->selection, - GINT_TO_POINTER (row)); - clist->selection_end = clist->selection; - } - else - clist->selection_end = - g_list_append (clist->selection_end, GINT_TO_POINTER (row))->next; - - if (CLIST_UNFROZEN (clist) - && (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); -} - -static void -real_unselect_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event) -{ - GtkCListRow *clist_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (row < 0 || row > (clist->rows - 1)) - return; - - clist_row = ROW_ELEMENT (clist, row)->data; - - if (clist_row->state == GTK_STATE_SELECTED) - { - clist_row->state = GTK_STATE_NORMAL; - - if (clist->selection_end && - clist->selection_end->data == GINT_TO_POINTER (row)) - clist->selection_end = clist->selection_end->prev; - - clist->selection = g_list_remove (clist->selection, - GINT_TO_POINTER (row)); - - if (CLIST_UNFROZEN (clist) - && (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); - } -} - -static void -real_select_all (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist)) - return; - - switch (clist->selection_mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - return; - - case GTK_SELECTION_MULTIPLE: - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - if (clist->rows && - ((GtkCListRow *) (clist->row_list->data))->state != - GTK_STATE_SELECTED) - fake_toggle_row (clist, 0); - - clist->anchor_state = GTK_STATE_SELECTED; - clist->anchor = 0; - clist->drag_pos = 0; - clist->undo_anchor = clist->focus_row; - update_extended_selection (clist, clist->rows); - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - return; - default: - g_assert_not_reached (); - } -} - -static void -real_unselect_all (GtkCList *clist) -{ - GList *list; - gint i; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist)) - return; - - switch (clist->selection_mode) - { - case GTK_SELECTION_BROWSE: - if (clist->focus_row >= 0) - { - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[SELECT_ROW], - clist->focus_row, -1, NULL); - return; - } - break; - case GTK_SELECTION_MULTIPLE: - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - clist->anchor = -1; - clist->drag_pos = -1; - clist->undo_anchor = clist->focus_row; - break; - default: - break; - } - - list = clist->selection; - while (list) - { - i = GPOINTER_TO_INT (list->data); - list = list->next; - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[UNSELECT_ROW], i, -1, NULL); - } -} - -static void -fake_unselect_all (GtkCList *clist, - gint row) -{ - GList *list; - GList *work; - gint i; - - if (row >= 0 && (work = ROW_ELEMENT (clist, row))) - { - if (GTK_CLIST_ROW (work)->state == GTK_STATE_NORMAL && - GTK_CLIST_ROW (work)->selectable) - { - GTK_CLIST_ROW (work)->state = GTK_STATE_SELECTED; - - if (CLIST_UNFROZEN (clist) && - gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, - GTK_CLIST_ROW (work)); - } - } - - clist->undo_selection = clist->selection; - clist->selection = NULL; - clist->selection_end = NULL; - - for (list = clist->undo_selection; list; list = list->next) - { - if ((i = GPOINTER_TO_INT (list->data)) == row || - !(work = g_list_nth (clist->row_list, i))) - continue; - - GTK_CLIST_ROW (work)->state = GTK_STATE_NORMAL; - if (CLIST_UNFROZEN (clist) && - gtk_clist_row_is_visible (clist, i) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, i, - GTK_CLIST_ROW (work)); - } -} - -static void -real_undo_selection (GtkCList *clist) -{ - GList *work; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist) || - clist->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - if (!(clist->undo_selection || clist->undo_unselection)) - { - gtk_clist_unselect_all (clist); - return; - } - - for (work = clist->undo_selection; work; work = work->next) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - GPOINTER_TO_INT (work->data), -1, NULL); - - for (work = clist->undo_unselection; work; work = work->next) - { - /* g_print ("unselect %d\n",GPOINTER_TO_INT (work->data)); */ - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - GPOINTER_TO_INT (work->data), -1, NULL); - } - - if (gtk_widget_has_focus (GTK_WIDGET (clist)) && clist->focus_row != clist->undo_anchor) - { - gtk_clist_draw_focus (GTK_WIDGET (clist)); - clist->focus_row = clist->undo_anchor; - gtk_clist_draw_focus (GTK_WIDGET (clist)); - } - else - clist->focus_row = clist->undo_anchor; - - clist->undo_anchor = -1; - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - if (ROW_TOP_YPIXEL (clist, clist->focus_row) + clist->row_height > - clist->clist_window_height) - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - else if (ROW_TOP_YPIXEL (clist, clist->focus_row) < 0) - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); -} - -static void -set_anchor (GtkCList *clist, - gboolean add_mode, - gint anchor, - gint undo_anchor) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist->selection_mode != GTK_SELECTION_MULTIPLE || clist->anchor >= 0) - return; - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - if (add_mode) - fake_toggle_row (clist, anchor); - else - { - GTK_CLIST_GET_CLASS (clist)->fake_unselect_all (clist, anchor); - clist->anchor_state = GTK_STATE_SELECTED; - } - - clist->anchor = anchor; - clist->drag_pos = anchor; - clist->undo_anchor = undo_anchor; -} - -static void -resync_selection (GtkCList *clist, - GdkEvent *event) -{ - gint i; - gint e; - gint row; - GList *list; - GtkCListRow *clist_row; - - if (clist->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - if (clist->anchor < 0 || clist->drag_pos < 0) - return; - - gtk_clist_freeze (clist); - - i = MIN (clist->anchor, clist->drag_pos); - e = MAX (clist->anchor, clist->drag_pos); - - if (clist->undo_selection) - { - list = clist->selection; - clist->selection = clist->undo_selection; - clist->selection_end = g_list_last (clist->selection); - clist->undo_selection = list; - list = clist->selection; - while (list) - { - row = GPOINTER_TO_INT (list->data); - list = list->next; - if (row < i || row > e) - { - clist_row = g_list_nth (clist->row_list, row)->data; - if (clist_row->selectable) - { - clist_row->state = GTK_STATE_SELECTED; - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[UNSELECT_ROW], - row, -1, event); - clist->undo_selection = g_list_prepend - (clist->undo_selection, GINT_TO_POINTER (row)); - } - } - } - } - - if (clist->anchor < clist->drag_pos) - { - for (list = g_list_nth (clist->row_list, i); i <= e; - i++, list = list->next) - if (GTK_CLIST_ROW (list)->selectable) - { - if (g_list_find (clist->selection, GINT_TO_POINTER(i))) - { - if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL) - { - GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[UNSELECT_ROW], - i, -1, event); - clist->undo_selection = - g_list_prepend (clist->undo_selection, - GINT_TO_POINTER (i)); - } - } - else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED) - { - GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; - clist->undo_unselection = - g_list_prepend (clist->undo_unselection, - GINT_TO_POINTER (i)); - } - } - } - else - { - for (list = g_list_nth (clist->row_list, e); i <= e; - e--, list = list->prev) - if (GTK_CLIST_ROW (list)->selectable) - { - if (g_list_find (clist->selection, GINT_TO_POINTER(e))) - { - if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL) - { - GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[UNSELECT_ROW], - e, -1, event); - clist->undo_selection = - g_list_prepend (clist->undo_selection, - GINT_TO_POINTER (e)); - } - } - else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED) - { - GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; - clist->undo_unselection = - g_list_prepend (clist->undo_unselection, - GINT_TO_POINTER (e)); - } - } - } - - clist->undo_unselection = g_list_reverse (clist->undo_unselection); - for (list = clist->undo_unselection; list; list = list->next) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - GPOINTER_TO_INT (list->data), -1, event); - - clist->anchor = -1; - clist->drag_pos = -1; - - gtk_clist_thaw (clist); -} - -static void -update_extended_selection (GtkCList *clist, - gint row) -{ - gint i; - GList *list; - GdkRectangle area; - gint s1 = -1; - gint s2 = -1; - gint e1 = -1; - gint e2 = -1; - gint y1 = clist->clist_window_height; - gint y2 = clist->clist_window_height; - gint h1 = 0; - gint h2 = 0; - gint top; - - if (clist->selection_mode != GTK_SELECTION_MULTIPLE || clist->anchor == -1) - return; - - if (row < 0) - row = 0; - if (row >= clist->rows) - row = clist->rows - 1; - - /* extending downwards */ - if (row > clist->drag_pos && clist->anchor <= clist->drag_pos) - { - s2 = clist->drag_pos + 1; - e2 = row; - } - /* extending upwards */ - else if (row < clist->drag_pos && clist->anchor >= clist->drag_pos) - { - s2 = row; - e2 = clist->drag_pos - 1; - } - else if (row < clist->drag_pos && clist->anchor < clist->drag_pos) - { - e1 = clist->drag_pos; - /* row and drag_pos on different sides of anchor : - take back the selection between anchor and drag_pos, - select between anchor and row */ - if (row < clist->anchor) - { - s1 = clist->anchor + 1; - s2 = row; - e2 = clist->anchor - 1; - } - /* take back the selection between anchor and drag_pos */ - else - s1 = row + 1; - } - else if (row > clist->drag_pos && clist->anchor > clist->drag_pos) - { - s1 = clist->drag_pos; - /* row and drag_pos on different sides of anchor : - take back the selection between anchor and drag_pos, - select between anchor and row */ - if (row > clist->anchor) - { - e1 = clist->anchor - 1; - s2 = clist->anchor + 1; - e2 = row; - } - /* take back the selection between anchor and drag_pos */ - else - e1 = row - 1; - } - - clist->drag_pos = row; - - area.x = 0; - area.width = clist->clist_window_width; - - /* restore the elements between s1 and e1 */ - if (s1 >= 0) - { - for (i = s1, list = g_list_nth (clist->row_list, i); i <= e1; - i++, list = list->next) - if (GTK_CLIST_ROW (list)->selectable) - { - if (GTK_CLIST_GET_CLASS (clist)->selection_find (clist, i, list)) - GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED; - else - GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL; - } - - top = ROW_TOP_YPIXEL (clist, clist->focus_row); - - if (top + clist->row_height <= 0) - { - area.y = 0; - area.height = ROW_TOP_YPIXEL (clist, e1) + clist->row_height; - draw_rows (clist, &area); - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - } - else if (top >= clist->clist_window_height) - { - area.y = ROW_TOP_YPIXEL (clist, s1) - 1; - area.height = clist->clist_window_height - area.y; - draw_rows (clist, &area); - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - } - else if (top < 0) - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - else if (top + clist->row_height > clist->clist_window_height) - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - - y1 = ROW_TOP_YPIXEL (clist, s1) - 1; - h1 = (e1 - s1 + 1) * (clist->row_height + CELL_SPACING); - } - - /* extend the selection between s2 and e2 */ - if (s2 >= 0) - { - for (i = s2, list = g_list_nth (clist->row_list, i); i <= e2; - i++, list = list->next) - if (GTK_CLIST_ROW (list)->selectable && - GTK_CLIST_ROW (list)->state != clist->anchor_state) - GTK_CLIST_ROW (list)->state = clist->anchor_state; - - top = ROW_TOP_YPIXEL (clist, clist->focus_row); - - if (top + clist->row_height <= 0) - { - area.y = 0; - area.height = ROW_TOP_YPIXEL (clist, e2) + clist->row_height; - draw_rows (clist, &area); - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - } - else if (top >= clist->clist_window_height) - { - area.y = ROW_TOP_YPIXEL (clist, s2) - 1; - area.height = clist->clist_window_height - area.y; - draw_rows (clist, &area); - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - } - else if (top < 0) - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - else if (top + clist->row_height > clist->clist_window_height) - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - - y2 = ROW_TOP_YPIXEL (clist, s2) - 1; - h2 = (e2 - s2 + 1) * (clist->row_height + CELL_SPACING); - } - - area.y = MAX (0, MIN (y1, y2)); - if (area.y > clist->clist_window_height) - area.y = 0; - area.height = MIN (clist->clist_window_height, h1 + h2); - if (s1 >= 0 && s2 >= 0) - area.height += (clist->row_height + CELL_SPACING); - draw_rows (clist, &area); -} - -static void -start_selection (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist)) - return; - - set_anchor (clist, GTK_CLIST_ADD_MODE(clist), clist->focus_row, - clist->focus_row); -} - -static void -end_selection (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))) && - gtk_widget_has_focus (GTK_WIDGET (clist))) - return; - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); -} - -static void -extend_selection (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist) || - clist->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - if (auto_start_selection) - set_anchor (clist, GTK_CLIST_ADD_MODE(clist), clist->focus_row, - clist->focus_row); - else if (clist->anchor == -1) - return; - - move_focus_row (clist, scroll_type, position); - - if (ROW_TOP_YPIXEL (clist, clist->focus_row) + clist->row_height > - clist->clist_window_height) - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - else if (ROW_TOP_YPIXEL (clist, clist->focus_row) < 0) - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - - update_extended_selection (clist, clist->focus_row); -} - -static void -sync_selection (GtkCList *clist, - gint row, - gint mode) -{ - GList *list; - gint d; - - if (mode == SYNC_INSERT) - d = 1; - else - d = -1; - - if (clist->focus_row >= row) - { - if (d > 0 || clist->focus_row > row) - clist->focus_row += d; - if (clist->focus_row == -1 && clist->rows >= 1) - clist->focus_row = 0; - else if (d < 0 && clist->focus_row >= clist->rows - 1) - clist->focus_row = clist->rows - 2; - else if (clist->focus_row >= clist->rows) /* Paranoia */ - clist->focus_row = clist->rows - 1; - } - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - clist->anchor = -1; - clist->drag_pos = -1; - clist->undo_anchor = clist->focus_row; - - list = clist->selection; - - while (list) - { - if (GPOINTER_TO_INT (list->data) >= row) - list->data = ((gchar*) list->data) + d; - list = list->next; - } -} - -/* GTKOBJECT - * gtk_clist_destroy - * gtk_clist_finalize - */ -static void -gtk_clist_destroy (GtkObject *object) -{ - gint i; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (object)); - - clist = GTK_CLIST (object); - - /* freeze the list */ - clist->freeze_count++; - - /* get rid of all the rows */ - gtk_clist_clear (clist); - - /* Since we don't have a _remove method, unparent the children - * instead of destroying them so the focus will be unset properly. - * (For other containers, the _remove method takes care of the - * unparent) The destroy will happen when the refcount drops - * to zero. - */ - - /* unref adjustments */ - if (clist->hadjustment) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (clist->hadjustment), clist); - g_object_unref (clist->hadjustment); - clist->hadjustment = NULL; - } - if (clist->vadjustment) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (clist->vadjustment), clist); - g_object_unref (clist->vadjustment); - clist->vadjustment = NULL; - } - - remove_grab (clist); - - /* destroy the column buttons */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button) - { - gtk_widget_unparent (clist->column[i].button); - clist->column[i].button = NULL; - } - - GTK_OBJECT_CLASS (parent_class)->destroy (object); -} - -static void -gtk_clist_finalize (GObject *object) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (object)); - - clist = GTK_CLIST (object); - - columns_delete (clist); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -/* GTKWIDGET - * gtk_clist_realize - * gtk_clist_unrealize - * gtk_clist_map - * gtk_clist_unmap - * gtk_clist_expose - * gtk_clist_style_set - * gtk_clist_button_press - * gtk_clist_button_release - * gtk_clist_motion - * gtk_clist_size_request - * gtk_clist_size_allocate - */ -static void -gtk_clist_realize (GtkWidget *widget) -{ - GtkCList *clist; - GdkWindowAttr attributes; - GdkGCValues values; - GtkCListRow *clist_row; - GList *list; - gint attributes_mask; - gint border_width; - gint i; - gint j; - - g_return_if_fail (GTK_IS_CLIST (widget)); - - clist = GTK_CLIST (widget); - - gtk_widget_set_realized (widget, TRUE); - - border_width = GTK_CONTAINER (widget)->border_width; - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x + border_width; - attributes.y = widget->allocation.y + border_width; - attributes.width = widget->allocation.width - border_width * 2; - attributes.height = widget->allocation.height - border_width * 2; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_KEY_RELEASE_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - /* main window */ - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), - &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, clist); - - widget->style = gtk_style_attach (widget->style, widget->window); - - gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); - - /* column-title window */ - - attributes.x = clist->column_title_area.x; - attributes.y = clist->column_title_area.y; - attributes.width = clist->column_title_area.width; - attributes.height = clist->column_title_area.height; - - clist->title_window = gdk_window_new (widget->window, &attributes, - attributes_mask); - gdk_window_set_user_data (clist->title_window, clist); - - gtk_style_set_background (widget->style, clist->title_window, - GTK_STATE_NORMAL); - gdk_window_show (clist->title_window); - - /* set things up so column buttons are drawn in title window */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button) - gtk_widget_set_parent_window (clist->column[i].button, - clist->title_window); - - /* clist-window */ - attributes.x = (clist->internal_allocation.x + - widget->style->xthickness); - attributes.y = (clist->internal_allocation.y + - widget->style->ythickness + - clist->column_title_area.height); - attributes.width = clist->clist_window_width; - attributes.height = clist->clist_window_height; - - clist->clist_window = gdk_window_new (widget->window, &attributes, - attributes_mask); - gdk_window_set_user_data (clist->clist_window, clist); - - gdk_window_set_background (clist->clist_window, - &widget->style->base[GTK_STATE_NORMAL]); - gdk_window_show (clist->clist_window); - gdk_drawable_get_size (clist->clist_window, &clist->clist_window_width, - &clist->clist_window_height); - - /* create resize windows */ - attributes.wclass = GDK_INPUT_ONLY; - attributes.event_mask = (GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_POINTER_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK); - attributes_mask = GDK_WA_CURSOR; - attributes.cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), - GDK_SB_H_DOUBLE_ARROW); - clist->cursor_drag = attributes.cursor; - - attributes.x = LIST_WIDTH (clist) + 1; - attributes.y = 0; - attributes.width = 0; - attributes.height = 0; - - for (i = 0; i < clist->columns; i++) - { - clist->column[i].window = gdk_window_new (clist->title_window, - &attributes, attributes_mask); - gdk_window_set_user_data (clist->column[i].window, clist); - } - - /* This is slightly less efficient than creating them with the - * right size to begin with, but easier - */ - size_allocate_title_buttons (clist); - - /* GCs */ - clist->fg_gc = gdk_gc_new (widget->window); - clist->bg_gc = gdk_gc_new (widget->window); - - /* We'll use this gc to do scrolling as well */ - gdk_gc_set_exposures (clist->fg_gc, TRUE); - - values.foreground = (widget->style->white.pixel==0 ? - widget->style->black:widget->style->white); - values.function = GDK_XOR; - values.subwindow_mode = GDK_INCLUDE_INFERIORS; - clist->xor_gc = gdk_gc_new_with_values (widget->window, - &values, - GDK_GC_FOREGROUND | - GDK_GC_FUNCTION | - GDK_GC_SUBWINDOW); - - /* attach optional row/cell styles, allocate foreground/background colors */ - list = clist->row_list; - for (i = 0; i < clist->rows; i++) - { - clist_row = list->data; - list = list->next; - - if (clist_row->style) - clist_row->style = gtk_style_attach (clist_row->style, - clist->clist_window); - - if (clist_row->fg_set || clist_row->bg_set) - { - GdkColormap *colormap; - - colormap = gtk_widget_get_colormap (widget); - if (clist_row->fg_set) - gdk_colormap_alloc_color (colormap, &clist_row->foreground, - FALSE, TRUE); - if (clist_row->bg_set) - gdk_colormap_alloc_color (colormap, &clist_row->background, - FALSE, TRUE); - } - - for (j = 0; j < clist->columns; j++) - if (clist_row->cell[j].style) - clist_row->cell[j].style = - gtk_style_attach (clist_row->cell[j].style, clist->clist_window); - } -} - -static void -gtk_clist_unrealize (GtkWidget *widget) -{ - gint i; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (widget)); - - clist = GTK_CLIST (widget); - - /* freeze the list */ - clist->freeze_count++; - - if (gtk_widget_get_mapped (widget)) - gtk_clist_unmap (widget); - - gtk_widget_set_mapped (widget, FALSE); - - /* detach optional row/cell styles */ - if (gtk_widget_get_realized (widget)) - { - GtkCListRow *clist_row; - GList *list; - gint j; - - list = clist->row_list; - for (i = 0; i < clist->rows; i++) - { - clist_row = list->data; - list = list->next; - - if (clist_row->style) - gtk_style_detach (clist_row->style); - for (j = 0; j < clist->columns; j++) - if (clist_row->cell[j].style) - gtk_style_detach (clist_row->cell[j].style); - } - } - - gdk_cursor_unref (clist->cursor_drag); - g_object_unref (clist->xor_gc); - g_object_unref (clist->fg_gc); - g_object_unref (clist->bg_gc); - - for (i = 0; i < clist->columns; i++) - { - if (clist->column[i].button) - gtk_widget_unrealize (clist->column[i].button); - if (clist->column[i].window) - { - gdk_window_set_user_data (clist->column[i].window, NULL); - gdk_window_destroy (clist->column[i].window); - clist->column[i].window = NULL; - } - } - - gdk_window_set_user_data (clist->clist_window, NULL); - gdk_window_destroy (clist->clist_window); - clist->clist_window = NULL; - - gdk_window_set_user_data (clist->title_window, NULL); - gdk_window_destroy (clist->title_window); - clist->title_window = NULL; - - clist->cursor_drag = NULL; - clist->xor_gc = NULL; - clist->fg_gc = NULL; - clist->bg_gc = NULL; - - GTK_WIDGET_CLASS (parent_class)->unrealize (widget); -} - -static void -gtk_clist_map (GtkWidget *widget) -{ - gint i; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (widget)); - - clist = GTK_CLIST (widget); - - if (!gtk_widget_get_mapped (widget)) - { - gtk_widget_set_mapped (widget, TRUE); - - /* map column buttons */ - for (i = 0; i < clist->columns; i++) - { - if (clist->column[i].button && - gtk_widget_get_visible (clist->column[i].button) && - !gtk_widget_get_mapped (clist->column[i].button)) - gtk_widget_map (clist->column[i].button); - } - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].window && clist->column[i].button) - { - gdk_window_raise (clist->column[i].window); - gdk_window_show (clist->column[i].window); - } - - gdk_window_show (clist->title_window); - gdk_window_show (clist->clist_window); - gdk_window_show (widget->window); - - /* unfreeze the list */ - clist->freeze_count = 0; - } -} - -static void -gtk_clist_unmap (GtkWidget *widget) -{ - gint i; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (widget)); - - clist = GTK_CLIST (widget); - - if (gtk_widget_get_mapped (widget)) - { - gtk_widget_set_mapped (widget, FALSE); - - if (clist_has_grab (clist)) - { - remove_grab (clist); - - GTK_CLIST_GET_CLASS (widget)->resync_selection (clist, NULL); - - clist->click_cell.row = -1; - clist->click_cell.column = -1; - clist->drag_button = 0; - - if (GTK_CLIST_IN_DRAG(clist)) - { - gpointer drag_data; - - GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG); - drag_data = gtk_object_get_data (GTK_OBJECT (clist), - "gtk-site-data"); - if (drag_data) - gtk_signal_handler_unblock_by_data (GTK_OBJECT (clist), - drag_data); - } - } - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].window) - gdk_window_hide (clist->column[i].window); - - gdk_window_hide (clist->clist_window); - gdk_window_hide (clist->title_window); - gdk_window_hide (widget->window); - - /* unmap column buttons */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button && - gtk_widget_get_mapped (clist->column[i].button)) - gtk_widget_unmap (clist->column[i].button); - - /* freeze the list */ - clist->freeze_count++; - } -} - -static gint -gtk_clist_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkCList *clist; - - g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - if (GTK_WIDGET_DRAWABLE (widget)) - { - clist = GTK_CLIST (widget); - - /* draw border */ - if (event->window == widget->window) - gtk_draw_shadow (widget->style, widget->window, - GTK_STATE_NORMAL, clist->shadow_type, - 0, 0, - clist->clist_window_width + - (2 * widget->style->xthickness), - clist->clist_window_height + - (2 * widget->style->ythickness) + - clist->column_title_area.height); - - /* exposure events on the list */ - if (event->window == clist->clist_window) - draw_rows (clist, &event->area); - - if (event->window == clist->clist_window && - clist->drag_highlight_row >= 0) - GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight - (clist, g_list_nth (clist->row_list, - clist->drag_highlight_row)->data, - clist->drag_highlight_row, clist->drag_highlight_pos); - - if (event->window == clist->title_window) - { - gint i; - - for (i = 0; i < clist->columns; i++) - { - if (clist->column[i].button) - gtk_container_propagate_expose (GTK_CONTAINER (clist), - clist->column[i].button, - event); - } - } - } - - return FALSE; -} - -static void -gtk_clist_style_set (GtkWidget *widget, - GtkStyle *previous_style) -{ - GtkCList *clist = GTK_CLIST (widget); - - GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style); - - if (gtk_widget_get_realized (widget)) - { - gtk_style_set_background (widget->style, widget->window, widget->state); - gtk_style_set_background (widget->style, clist->title_window, GTK_STATE_SELECTED); - gdk_window_set_background (clist->clist_window, &widget->style->base[GTK_STATE_NORMAL]); - } - - /* Fill in data after widget has correct style */ - - /* text properties */ - if (!GTK_CLIST_ROW_HEIGHT_SET(clist)) - /* Reset clist->row_height */ - gtk_clist_set_row_height (clist, 0); - - /* Column widths */ - if (!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - gint width; - gint i; - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - { - width = gtk_clist_optimal_column_width (clist, i); - if (width != clist->column[i].width) - gtk_clist_set_column_width (clist, i, width); - } - } -} - -static gint -gtk_clist_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - gint i; - GtkCList *clist; - gint x; - gint y; - gint row; - gint column; - gint button_actions; - - g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - clist = GTK_CLIST (widget); - - button_actions = clist->button_actions[event->button - 1]; - - if (button_actions == GTK_BUTTON_IGNORED) - return FALSE; - - /* selections on the list */ - if (event->window == clist->clist_window) - { - x = event->x; - y = event->y; - - if (get_selection_info (clist, x, y, &row, &column)) - { - gint old_row = clist->focus_row; - - if (clist->focus_row == -1) - old_row = row; - - if (event->type == GDK_BUTTON_PRESS) - { - GdkEventMask mask = ((1 << (4 + event->button)) | - GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON_RELEASE_MASK); - - if (gdk_pointer_grab (clist->clist_window, FALSE, mask, - NULL, NULL, event->time)) - return FALSE; - gtk_grab_add (widget); - - clist->click_cell.row = row; - clist->click_cell.column = column; - clist->drag_button = event->button; - } - else - { - clist->click_cell.row = -1; - clist->click_cell.column = -1; - - clist->drag_button = 0; - remove_grab (clist); - } - - if (button_actions & GTK_BUTTON_SELECTS) - { - if (GTK_CLIST_ADD_MODE(clist)) - { - GTK_CLIST_UNSET_FLAG (clist, CLIST_ADD_MODE); - if (gtk_widget_has_focus (widget)) - { - gtk_clist_draw_focus (widget); - gdk_gc_set_line_attributes (clist->xor_gc, 1, - GDK_LINE_SOLID, 0, 0); - clist->focus_row = row; - gtk_clist_draw_focus (widget); - } - else - { - gdk_gc_set_line_attributes (clist->xor_gc, 1, - GDK_LINE_SOLID, 0, 0); - clist->focus_row = row; - } - } - else if (row != clist->focus_row) - { - if (gtk_widget_has_focus (widget)) - { - gtk_clist_draw_focus (widget); - clist->focus_row = row; - gtk_clist_draw_focus (widget); - } - else - clist->focus_row = row; - } - } - - if (!gtk_widget_has_focus (widget)) - gtk_widget_grab_focus (widget); - - if (button_actions & GTK_BUTTON_SELECTS) - { - switch (clist->selection_mode) - { - case GTK_SELECTION_SINGLE: - if (event->type != GDK_BUTTON_PRESS) - { - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[SELECT_ROW], - row, column, event); - clist->anchor = -1; - } - else - clist->anchor = row; - break; - case GTK_SELECTION_BROWSE: - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[SELECT_ROW], - row, column, event); - break; - case GTK_SELECTION_MULTIPLE: - if (event->type != GDK_BUTTON_PRESS) - { - if (clist->anchor != -1) - { - update_extended_selection (clist, clist->focus_row); - GTK_CLIST_GET_CLASS (clist)->resync_selection - (clist, (GdkEvent *) event); - } - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[SELECT_ROW], - row, column, event); - break; - } - - if (event->state & GDK_CONTROL_MASK) - { - if (event->state & GDK_SHIFT_MASK) - { - if (clist->anchor < 0) - { - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - clist->anchor = old_row; - clist->drag_pos = old_row; - clist->undo_anchor = old_row; - } - update_extended_selection (clist, clist->focus_row); - } - else - { - if (clist->anchor == -1) - set_anchor (clist, TRUE, row, old_row); - else - update_extended_selection (clist, - clist->focus_row); - } - break; - } - - if (event->state & GDK_SHIFT_MASK) - { - set_anchor (clist, FALSE, old_row, old_row); - update_extended_selection (clist, clist->focus_row); - break; - } - - if (clist->anchor == -1) - set_anchor (clist, FALSE, row, old_row); - else - update_extended_selection (clist, clist->focus_row); - break; - default: - break; - } - } - } - return TRUE; - } - - /* press on resize windows */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].resizeable && clist->column[i].window && - event->window == clist->column[i].window) - { - gpointer drag_data; - - if (gdk_pointer_grab (clist->column[i].window, FALSE, - GDK_POINTER_MOTION_HINT_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_BUTTON_RELEASE_MASK, - NULL, NULL, event->time)) - return FALSE; - - gtk_grab_add (widget); - GTK_CLIST_SET_FLAG (clist, CLIST_IN_DRAG); - - /* block attached dnd signal handler */ - drag_data = gtk_object_get_data (GTK_OBJECT (clist), "gtk-site-data"); - if (drag_data) - gtk_signal_handler_block_by_data (GTK_OBJECT (clist), drag_data); - - if (!gtk_widget_has_focus (widget)) - gtk_widget_grab_focus (widget); - - clist->drag_pos = i; - clist->x_drag = (COLUMN_LEFT_XPIXEL(clist, i) + COLUMN_INSET + - clist->column[i].area.width + CELL_SPACING); - - if (GTK_CLIST_ADD_MODE(clist)) - gdk_gc_set_line_attributes (clist->xor_gc, 1, GDK_LINE_SOLID, 0, 0); - draw_xor_line (clist); - - return TRUE; - } - - return FALSE; -} - -static gint -gtk_clist_button_release (GtkWidget *widget, - GdkEventButton *event) -{ - GtkCList *clist; - gint button_actions; - - g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - clist = GTK_CLIST (widget); - - button_actions = clist->button_actions[event->button - 1]; - if (button_actions == GTK_BUTTON_IGNORED) - return FALSE; - - /* release on resize windows */ - if (GTK_CLIST_IN_DRAG(clist)) - { - gpointer drag_data; - gint width; - gint x; - gint i; - - i = clist->drag_pos; - clist->drag_pos = -1; - - /* unblock attached dnd signal handler */ - drag_data = gtk_object_get_data (GTK_OBJECT (clist), "gtk-site-data"); - if (drag_data) - gtk_signal_handler_unblock_by_data (GTK_OBJECT (clist), drag_data); - - GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG); - gtk_widget_get_pointer (widget, &x, NULL); - gtk_grab_remove (widget); - gdk_display_pointer_ungrab (gtk_widget_get_display (widget), event->time); - - if (clist->x_drag >= 0) - draw_xor_line (clist); - - if (GTK_CLIST_ADD_MODE(clist)) - { - gint8 dashes[] = { 4, 4 }; - - gdk_gc_set_line_attributes (clist->xor_gc, 1, - GDK_LINE_ON_OFF_DASH, 0, 0); - gdk_gc_set_dashes (clist->xor_gc, 0, dashes, G_N_ELEMENTS (dashes)); - } - - width = new_column_width (clist, i, &x); - gtk_clist_set_column_width (clist, i, width); - - return TRUE; - } - - if (clist->drag_button == event->button) - { - gint row; - gint column; - - clist->drag_button = 0; - clist->click_cell.row = -1; - clist->click_cell.column = -1; - - remove_grab (clist); - - if (button_actions & GTK_BUTTON_SELECTS) - { - switch (clist->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - if (!(event->state & GDK_SHIFT_MASK) || - !GTK_WIDGET_CAN_FOCUS (widget) || - event->x < 0 || event->x >= clist->clist_window_width || - event->y < 0 || event->y >= clist->clist_window_height) - GTK_CLIST_GET_CLASS (clist)->resync_selection - (clist, (GdkEvent *) event); - break; - case GTK_SELECTION_SINGLE: - if (get_selection_info (clist, event->x, event->y, - &row, &column)) - { - if (row >= 0 && row < clist->rows && clist->anchor == row) - toggle_row (clist, row, column, (GdkEvent *) event); - } - clist->anchor = -1; - break; - default: - break; - } - } - - return TRUE; - } - - return FALSE; -} - -static gint -gtk_clist_motion (GtkWidget *widget, - GdkEventMotion *event) -{ - GtkCList *clist; - gint x; - gint y; - gint row; - gint new_width; - gint button_actions = 0; - - g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE); - - clist = GTK_CLIST (widget); - if (!clist_has_grab (clist)) - return FALSE; - - if (clist->drag_button > 0) - button_actions = clist->button_actions[clist->drag_button - 1]; - - if (GTK_CLIST_IN_DRAG(clist)) - { - if (event->is_hint || event->window != widget->window) - gtk_widget_get_pointer (widget, &x, NULL); - else - x = event->x; - - new_width = new_column_width (clist, clist->drag_pos, &x); - if (x != clist->x_drag) - { - /* x_drag < 0 indicates that the xor line is already invisible */ - if (clist->x_drag >= 0) - draw_xor_line (clist); - - clist->x_drag = x; - - if (clist->x_drag >= 0) - draw_xor_line (clist); - } - - if (new_width <= MAX (COLUMN_MIN_WIDTH + 1, - clist->column[clist->drag_pos].min_width + 1)) - { - if (COLUMN_LEFT_XPIXEL (clist, clist->drag_pos) < 0 && x < 0) - gtk_clist_moveto (clist, -1, clist->drag_pos, 0, 0); - return FALSE; - } - if (clist->column[clist->drag_pos].max_width >= COLUMN_MIN_WIDTH && - new_width >= clist->column[clist->drag_pos].max_width) - { - if (COLUMN_LEFT_XPIXEL (clist, clist->drag_pos) + new_width > - clist->clist_window_width && x < 0) - move_horizontal (clist, - COLUMN_LEFT_XPIXEL (clist, clist->drag_pos) + - new_width - clist->clist_window_width + - COLUMN_INSET + CELL_SPACING); - return FALSE; - } - } - - if (event->is_hint || event->window != clist->clist_window) - gdk_window_get_pointer (clist->clist_window, &x, &y, NULL); - else - { - x = event->x; - y = event->y; - } - - if (GTK_CLIST_REORDERABLE(clist) && button_actions & GTK_BUTTON_DRAGS) - { - /* delayed drag start */ - if (event->window == clist->clist_window && - clist->click_cell.row >= 0 && clist->click_cell.column >= 0 && - (y < 0 || y >= clist->clist_window_height || - x < 0 || x >= clist->clist_window_width || - y < ROW_TOP_YPIXEL (clist, clist->click_cell.row) || - y >= (ROW_TOP_YPIXEL (clist, clist->click_cell.row) + - clist->row_height) || - x < COLUMN_LEFT_XPIXEL (clist, clist->click_cell.column) || - x >= (COLUMN_LEFT_XPIXEL(clist, clist->click_cell.column) + - clist->column[clist->click_cell.column].area.width))) - { - GtkTargetList *target_list; - - target_list = gtk_target_list_new (&clist_target_table, 1); - gtk_drag_begin (widget, target_list, GDK_ACTION_MOVE, - clist->drag_button, (GdkEvent *)event); - - } - return TRUE; - } - - /* horizontal autoscrolling */ - if (clist->hadjustment && LIST_WIDTH (clist) > clist->clist_window_width && - (x < 0 || x >= clist->clist_window_width)) - { - if (clist->htimer) - return FALSE; - - clist->htimer = gdk_threads_add_timeout - (SCROLL_TIME, (GSourceFunc) horizontal_timeout, clist); - - if (!((x < 0 && clist->hadjustment->value == 0) || - (x >= clist->clist_window_width && - clist->hadjustment->value == - LIST_WIDTH (clist) - clist->clist_window_width))) - { - if (x < 0) - move_horizontal (clist, -1 + (x/2)); - else - move_horizontal (clist, 1 + (x - clist->clist_window_width) / 2); - } - } - - if (GTK_CLIST_IN_DRAG(clist)) - return FALSE; - - /* vertical autoscrolling */ - row = ROW_FROM_YPIXEL (clist, y); - - /* don't scroll on last pixel row if it's a cell spacing */ - if (y == clist->clist_window_height - 1 && - y == ROW_TOP_YPIXEL (clist, row-1) + clist->row_height) - return FALSE; - - if (LIST_HEIGHT (clist) > clist->clist_window_height && - (y < 0 || y >= clist->clist_window_height)) - { - if (clist->vtimer) - return FALSE; - - clist->vtimer = gdk_threads_add_timeout (SCROLL_TIME, - (GSourceFunc) vertical_timeout, clist); - - if (clist->drag_button && - ((y < 0 && clist->focus_row == 0) || - (y >= clist->clist_window_height && - clist->focus_row == clist->rows - 1))) - return FALSE; - } - - row = CLAMP (row, 0, clist->rows - 1); - - if (button_actions & GTK_BUTTON_SELECTS & - !gtk_object_get_data (GTK_OBJECT (widget), "gtk-site-data")) - { - if (row == clist->focus_row) - return FALSE; - - gtk_clist_draw_focus (widget); - clist->focus_row = row; - gtk_clist_draw_focus (widget); - - switch (clist->selection_mode) - { - case GTK_SELECTION_BROWSE: - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - clist->focus_row, -1, event); - break; - case GTK_SELECTION_MULTIPLE: - update_extended_selection (clist, clist->focus_row); - break; - default: - break; - } - } - - if (ROW_TOP_YPIXEL(clist, row) < 0) - move_vertical (clist, row, 0); - else if (ROW_TOP_YPIXEL(clist, row) + clist->row_height > - clist->clist_window_height) - move_vertical (clist, row, 1); - - return FALSE; -} - -static void -gtk_clist_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkCList *clist; - gint i; - - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (requisition != NULL); - - clist = GTK_CLIST (widget); - - requisition->width = 0; - requisition->height = 0; - - /* compute the size of the column title (title) area */ - clist->column_title_area.height = 0; - if (GTK_CLIST_SHOW_TITLES(clist)) - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button) - { - GtkRequisition child_requisition; - - gtk_widget_size_request (clist->column[i].button, - &child_requisition); - clist->column_title_area.height = - MAX (clist->column_title_area.height, - child_requisition.height); - } - - requisition->width += (widget->style->xthickness + - GTK_CONTAINER (widget)->border_width) * 2; - requisition->height += (clist->column_title_area.height + - (widget->style->ythickness + - GTK_CONTAINER (widget)->border_width) * 2); - - /* if (!clist->hadjustment) */ - requisition->width += list_requisition_width (clist); - /* if (!clist->vadjustment) */ - requisition->height += LIST_HEIGHT (clist); -} - -static void -gtk_clist_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkCList *clist; - GtkAllocation clist_allocation; - gint border_width; - - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (allocation != NULL); - - clist = GTK_CLIST (widget); - widget->allocation = *allocation; - border_width = GTK_CONTAINER (widget)->border_width; - - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (widget->window, - allocation->x + border_width, - allocation->y + border_width, - allocation->width - border_width * 2, - allocation->height - border_width * 2); - } - - /* use internal allocation structure for all the math - * because it's easier than always subtracting the container - * border width */ - clist->internal_allocation.x = 0; - clist->internal_allocation.y = 0; - clist->internal_allocation.width = MAX (1, (gint)allocation->width - - border_width * 2); - clist->internal_allocation.height = MAX (1, (gint)allocation->height - - border_width * 2); - - /* allocate clist window assuming no scrollbars */ - clist_allocation.x = (clist->internal_allocation.x + - widget->style->xthickness); - clist_allocation.y = (clist->internal_allocation.y + - widget->style->ythickness + - clist->column_title_area.height); - clist_allocation.width = MAX (1, (gint)clist->internal_allocation.width - - (2 * (gint)widget->style->xthickness)); - clist_allocation.height = MAX (1, (gint)clist->internal_allocation.height - - (2 * (gint)widget->style->ythickness) - - (gint)clist->column_title_area.height); - - clist->clist_window_width = clist_allocation.width; - clist->clist_window_height = clist_allocation.height; - - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (clist->clist_window, - clist_allocation.x, - clist_allocation.y, - clist_allocation.width, - clist_allocation.height); - } - - /* position the window which holds the column title buttons */ - clist->column_title_area.x = widget->style->xthickness; - clist->column_title_area.y = widget->style->ythickness; - clist->column_title_area.width = clist_allocation.width; - - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (clist->title_window, - clist->column_title_area.x, - clist->column_title_area.y, - clist->column_title_area.width, - clist->column_title_area.height); - } - - /* column button allocation */ - size_allocate_columns (clist, FALSE); - size_allocate_title_buttons (clist); - - adjust_adjustments (clist, TRUE); -} - -/* GTKCONTAINER - * gtk_clist_forall - */ -static void -gtk_clist_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkCList *clist; - guint i; - - g_return_if_fail (GTK_IS_CLIST (container)); - g_return_if_fail (callback != NULL); - - if (!include_internals) - return; - - clist = GTK_CLIST (container); - - /* callback for the column buttons */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button) - (*callback) (clist->column[i].button, callback_data); -} - -/* PRIVATE DRAWING FUNCTIONS - * get_cell_style - * draw_cell_pixmap - * draw_row - * draw_rows - * draw_xor_line - * clist_refresh - */ -static void -get_cell_style (GtkCList *clist, - GtkCListRow *clist_row, - gint state, - gint column, - GtkStyle **style, - GdkGC **fg_gc, - GdkGC **bg_gc) -{ - gint fg_state; - - if ((state == GTK_STATE_NORMAL) && - (GTK_WIDGET (clist)->state == GTK_STATE_INSENSITIVE)) - fg_state = GTK_STATE_INSENSITIVE; - else - fg_state = state; - - if (clist_row->cell[column].style) - { - if (style) - *style = clist_row->cell[column].style; - if (fg_gc) - *fg_gc = clist_row->cell[column].style->fg_gc[fg_state]; - if (bg_gc) { - if (state == GTK_STATE_SELECTED) - *bg_gc = clist_row->cell[column].style->bg_gc[state]; - else - *bg_gc = clist_row->cell[column].style->base_gc[state]; - } - } - else if (clist_row->style) - { - if (style) - *style = clist_row->style; - if (fg_gc) - *fg_gc = clist_row->style->fg_gc[fg_state]; - if (bg_gc) { - if (state == GTK_STATE_SELECTED) - *bg_gc = clist_row->style->bg_gc[state]; - else - *bg_gc = clist_row->style->base_gc[state]; - } - } - else - { - if (style) - *style = GTK_WIDGET (clist)->style; - if (fg_gc) - *fg_gc = GTK_WIDGET (clist)->style->fg_gc[fg_state]; - if (bg_gc) { - if (state == GTK_STATE_SELECTED) - *bg_gc = GTK_WIDGET (clist)->style->bg_gc[state]; - else - *bg_gc = GTK_WIDGET (clist)->style->base_gc[state]; - } - - if (state != GTK_STATE_SELECTED) - { - if (fg_gc && clist_row->fg_set) - *fg_gc = clist->fg_gc; - if (bg_gc && clist_row->bg_set) - *bg_gc = clist->bg_gc; - } - } -} - -static gint -draw_cell_pixmap (GdkWindow *window, - GdkRectangle *clip_rectangle, - GdkGC *fg_gc, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint x, - gint y, - gint width, - gint height) -{ - gint xsrc = 0; - gint ysrc = 0; - - if (mask) - { - gdk_gc_set_clip_mask (fg_gc, mask); - gdk_gc_set_clip_origin (fg_gc, x, y); - } - - if (x < clip_rectangle->x) - { - xsrc = clip_rectangle->x - x; - width -= xsrc; - x = clip_rectangle->x; - } - if (x + width > clip_rectangle->x + clip_rectangle->width) - width = clip_rectangle->x + clip_rectangle->width - x; - - if (y < clip_rectangle->y) - { - ysrc = clip_rectangle->y - y; - height -= ysrc; - y = clip_rectangle->y; - } - if (y + height > clip_rectangle->y + clip_rectangle->height) - height = clip_rectangle->y + clip_rectangle->height - y; - - gdk_draw_drawable (window, fg_gc, pixmap, xsrc, ysrc, x, y, width, height); - gdk_gc_set_clip_origin (fg_gc, 0, 0); - if (mask) - gdk_gc_set_clip_mask (fg_gc, NULL); - - return x + MAX (width, 0); -} - -static void -draw_row (GtkCList *clist, - GdkRectangle *area, - gint row, - GtkCListRow *clist_row) -{ - GtkWidget *widget; - GdkRectangle *rect; - GdkRectangle row_rectangle; - GdkRectangle cell_rectangle; - GdkRectangle clip_rectangle; - GdkRectangle intersect_rectangle; - gint last_column; - gint state; - gint i; - - g_return_if_fail (clist != NULL); - - /* bail now if we arn't drawable yet */ - if (!GTK_WIDGET_DRAWABLE (clist) || row < 0 || row >= clist->rows) - return; - - widget = GTK_WIDGET (clist); - - /* if the function is passed the pointer to the row instead of null, - * it avoids this expensive lookup */ - if (!clist_row) - clist_row = ROW_ELEMENT (clist, row)->data; - - /* rectangle of the entire row */ - row_rectangle.x = 0; - row_rectangle.y = ROW_TOP_YPIXEL (clist, row); - row_rectangle.width = clist->clist_window_width; - row_rectangle.height = clist->row_height; - - /* rectangle of the cell spacing above the row */ - cell_rectangle.x = 0; - cell_rectangle.y = row_rectangle.y - CELL_SPACING; - cell_rectangle.width = row_rectangle.width; - cell_rectangle.height = CELL_SPACING; - - /* rectangle used to clip drawing operations, its y and height - * positions only need to be set once, so we set them once here. - * the x and width are set withing the drawing loop below once per - * column */ - clip_rectangle.y = row_rectangle.y; - clip_rectangle.height = row_rectangle.height; - - if (clist_row->state == GTK_STATE_NORMAL) - { - if (clist_row->fg_set) - gdk_gc_set_foreground (clist->fg_gc, &clist_row->foreground); - if (clist_row->bg_set) - gdk_gc_set_foreground (clist->bg_gc, &clist_row->background); - } - - state = clist_row->state; - - /* draw the cell borders and background */ - if (area) - { - rect = &intersect_rectangle; - if (gdk_rectangle_intersect (area, &cell_rectangle, - &intersect_rectangle)) - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], - TRUE, - intersect_rectangle.x, - intersect_rectangle.y, - intersect_rectangle.width, - intersect_rectangle.height); - - /* the last row has to clear its bottom cell spacing too */ - if (clist_row == clist->row_list_end->data) - { - cell_rectangle.y += clist->row_height + CELL_SPACING; - - if (gdk_rectangle_intersect (area, &cell_rectangle, - &intersect_rectangle)) - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], - TRUE, - intersect_rectangle.x, - intersect_rectangle.y, - intersect_rectangle.width, - intersect_rectangle.height); - } - - if (!gdk_rectangle_intersect (area, &row_rectangle,&intersect_rectangle)) - return; - - } - else - { - rect = &clip_rectangle; - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], - TRUE, - cell_rectangle.x, - cell_rectangle.y, - cell_rectangle.width, - cell_rectangle.height); - - /* the last row has to clear its bottom cell spacing too */ - if (clist_row == clist->row_list_end->data) - { - cell_rectangle.y += clist->row_height + CELL_SPACING; - - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], - TRUE, - cell_rectangle.x, - cell_rectangle.y, - cell_rectangle.width, - cell_rectangle.height); - } - } - - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--) - ; - - /* iterate and draw all the columns (row cells) and draw their contents */ - for (i = 0; i < clist->columns; i++) - { - GtkStyle *style; - GdkGC *fg_gc; - GdkGC *bg_gc; - PangoLayout *layout; - PangoRectangle logical_rect; - - gint width; - gint height; - gint pixmap_width; - gint offset = 0; - - if (!clist->column[i].visible) - continue; - - get_cell_style (clist, clist_row, state, i, &style, &fg_gc, &bg_gc); - - clip_rectangle.x = clist->column[i].area.x + clist->hoffset; - clip_rectangle.width = clist->column[i].area.width; - - /* calculate clipping region clipping region */ - clip_rectangle.x -= COLUMN_INSET + CELL_SPACING; - clip_rectangle.width += (2 * COLUMN_INSET + CELL_SPACING + - (i == last_column) * CELL_SPACING); - - if (area && !gdk_rectangle_intersect (area, &clip_rectangle, - &intersect_rectangle)) - continue; - - gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, - rect->x, rect->y, rect->width, rect->height); - - clip_rectangle.x += COLUMN_INSET + CELL_SPACING; - clip_rectangle.width -= (2 * COLUMN_INSET + CELL_SPACING + - (i == last_column) * CELL_SPACING); - - - /* calculate real width for column justification */ - - layout = _gtk_clist_create_cell_layout (clist, clist_row, i); - if (layout) - { - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - width = logical_rect.width; - } - else - width = 0; - - pixmap_width = 0; - offset = 0; - switch (clist_row->cell[i].type) - { - case GTK_CELL_PIXMAP: - gdk_drawable_get_size (GTK_CELL_PIXMAP (clist_row->cell[i])->pixmap, - &pixmap_width, &height); - width += pixmap_width; - break; - case GTK_CELL_PIXTEXT: - gdk_drawable_get_size (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap, - &pixmap_width, &height); - width += pixmap_width + GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; - break; - default: - break; - } - - switch (clist->column[i].justification) - { - case GTK_JUSTIFY_LEFT: - offset = clip_rectangle.x + clist_row->cell[i].horizontal; - break; - case GTK_JUSTIFY_RIGHT: - offset = (clip_rectangle.x + clist_row->cell[i].horizontal + - clip_rectangle.width - width); - break; - case GTK_JUSTIFY_CENTER: - case GTK_JUSTIFY_FILL: - offset = (clip_rectangle.x + clist_row->cell[i].horizontal + - (clip_rectangle.width / 2) - (width / 2)); - break; - }; - - /* Draw Text and/or Pixmap */ - switch (clist_row->cell[i].type) - { - case GTK_CELL_PIXMAP: - draw_cell_pixmap (clist->clist_window, &clip_rectangle, fg_gc, - GTK_CELL_PIXMAP (clist_row->cell[i])->pixmap, - GTK_CELL_PIXMAP (clist_row->cell[i])->mask, - offset, - clip_rectangle.y + clist_row->cell[i].vertical + - (clip_rectangle.height - height) / 2, - pixmap_width, height); - break; - case GTK_CELL_PIXTEXT: - offset = - draw_cell_pixmap (clist->clist_window, &clip_rectangle, fg_gc, - GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap, - GTK_CELL_PIXTEXT (clist_row->cell[i])->mask, - offset, - clip_rectangle.y + clist_row->cell[i].vertical+ - (clip_rectangle.height - height) / 2, - pixmap_width, height); - offset += GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; - - /* Fall through */ - case GTK_CELL_TEXT: - if (layout) - { - gint row_center_offset = (clist->row_height - logical_rect.height - 1) / 2; - - gdk_gc_set_clip_rectangle (fg_gc, &clip_rectangle); - gdk_draw_layout (clist->clist_window, fg_gc, - offset, - row_rectangle.y + row_center_offset + clist_row->cell[i].vertical, - layout); - g_object_unref (layout); - gdk_gc_set_clip_rectangle (fg_gc, NULL); - } - break; - default: - break; - } - } - - /* draw focus rectangle */ - if (clist->focus_row == row && - GTK_WIDGET_CAN_FOCUS (widget) && gtk_widget_has_focus (widget)) - { - if (!area) - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, - row_rectangle.x, row_rectangle.y, - row_rectangle.width - 1, row_rectangle.height - 1); - else if (gdk_rectangle_intersect (area, &row_rectangle, - &intersect_rectangle)) - { - gdk_gc_set_clip_rectangle (clist->xor_gc, &intersect_rectangle); - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, - row_rectangle.x, row_rectangle.y, - row_rectangle.width - 1, - row_rectangle.height - 1); - gdk_gc_set_clip_rectangle (clist->xor_gc, NULL); - } - } -} - -static void -draw_rows (GtkCList *clist, - GdkRectangle *area) -{ - GList *list; - GtkCListRow *clist_row; - gint i; - gint first_row; - gint last_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist->row_height == 0 || - !GTK_WIDGET_DRAWABLE (clist)) - return; - - if (area) - { - first_row = ROW_FROM_YPIXEL (clist, area->y); - last_row = ROW_FROM_YPIXEL (clist, area->y + area->height); - } - else - { - first_row = ROW_FROM_YPIXEL (clist, 0); - last_row = ROW_FROM_YPIXEL (clist, clist->clist_window_height); - } - - /* this is a small special case which exposes the bottom cell line - * on the last row -- it might go away if I change the wall the cell - * spacings are drawn - */ - if (clist->rows == first_row) - first_row--; - - list = ROW_ELEMENT (clist, first_row); - i = first_row; - while (list) - { - clist_row = list->data; - list = list->next; - - if (i > last_row) - return; - - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, area, i, clist_row); - i++; - } - - if (!area) - { - int w, h, y; - gdk_drawable_get_size (GDK_DRAWABLE (clist->clist_window), &w, &h); - y = ROW_TOP_YPIXEL (clist, i); - gdk_window_clear_area (clist->clist_window, - 0, y, - w, h - y); - } -} - -static void -draw_xor_line (GtkCList *clist) -{ - GtkWidget *widget; - - g_return_if_fail (clist != NULL); - - widget = GTK_WIDGET (clist); - - gdk_draw_line (widget->window, clist->xor_gc, - clist->x_drag, - widget->style->ythickness, - clist->x_drag, - clist->column_title_area.height + - clist->clist_window_height + 1); -} - -static void -clist_refresh (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (CLIST_UNFROZEN (clist)) - { - adjust_adjustments (clist, FALSE); - draw_rows (clist, NULL); - } -} - -/* get cell from coordinates - * get_selection_info - * gtk_clist_get_selection_info - */ -static gint -get_selection_info (GtkCList *clist, - gint x, - gint y, - gint *row, - gint *column) -{ - gint trow, tcol; - - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - - /* bounds checking, return false if the user clicked - * on a blank area */ - trow = ROW_FROM_YPIXEL (clist, y); - if (trow >= clist->rows) - return 0; - - if (row) - *row = trow; - - tcol = COLUMN_FROM_XPIXEL (clist, x); - if (tcol >= clist->columns) - return 0; - - if (column) - *column = tcol; - - return 1; -} - -gint -gtk_clist_get_selection_info (GtkCList *clist, - gint x, - gint y, - gint *row, - gint *column) -{ - g_return_val_if_fail (GTK_IS_CLIST (clist), 0); - return get_selection_info (clist, x, y, row, column); -} - -/* PRIVATE ADJUSTMENT FUNCTIONS - * adjust_adjustments - * vadjustment_changed - * hadjustment_changed - * vadjustment_value_changed - * hadjustment_value_changed - * check_exposures - */ -static void -adjust_adjustments (GtkCList *clist, - gboolean block_resize) -{ - if (clist->vadjustment) - { - clist->vadjustment->page_size = clist->clist_window_height; - clist->vadjustment->step_increment = clist->row_height; - clist->vadjustment->page_increment = - MAX (clist->vadjustment->page_size - clist->vadjustment->step_increment, - clist->vadjustment->page_size / 2); - clist->vadjustment->lower = 0; - clist->vadjustment->upper = LIST_HEIGHT (clist); - - if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist) || - (clist->voffset + (gint)clist->vadjustment->value) != 0) - { - clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) - - clist->clist_window_height)); - gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), - "value-changed"); - } - gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), "changed"); - } - - if (clist->hadjustment) - { - clist->hadjustment->page_size = clist->clist_window_width; - clist->hadjustment->step_increment = 10; - clist->hadjustment->page_increment = - MAX (clist->hadjustment->page_size - clist->hadjustment->step_increment, - clist->hadjustment->page_size / 2); - clist->hadjustment->lower = 0; - clist->hadjustment->upper = LIST_WIDTH (clist); - - if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist) || - (clist->hoffset + (gint)clist->hadjustment->value) != 0) - { - clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) - - clist->clist_window_width)); - gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), - "value-changed"); - } - gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), "changed"); - } - - if (!block_resize && (!clist->vadjustment || !clist->hadjustment)) - { - GtkWidget *widget; - GtkRequisition requisition; - - widget = GTK_WIDGET (clist); - gtk_widget_size_request (widget, &requisition); - - if ((!clist->hadjustment && - requisition.width != widget->allocation.width) || - (!clist->vadjustment && - requisition.height != widget->allocation.height)) - gtk_widget_queue_resize (widget); - } -} - -static void -vadjustment_changed (GtkAdjustment *adjustment, - gpointer data) -{ - GtkCList *clist; - - g_return_if_fail (adjustment != NULL); - g_return_if_fail (data != NULL); - - clist = GTK_CLIST (data); -} - -static void -hadjustment_changed (GtkAdjustment *adjustment, - gpointer data) -{ - GtkCList *clist; - - g_return_if_fail (adjustment != NULL); - g_return_if_fail (data != NULL); - - clist = GTK_CLIST (data); -} - -static void -vadjustment_value_changed (GtkAdjustment *adjustment, - gpointer data) -{ - GtkCList *clist; - gint dy, value; - - g_return_if_fail (adjustment != NULL); - g_return_if_fail (GTK_IS_CLIST (data)); - - clist = GTK_CLIST (data); - - if (adjustment != clist->vadjustment) - return; - - value = -adjustment->value; - dy = value - clist->voffset; - clist->voffset = value; - - if (GTK_WIDGET_DRAWABLE (clist)) - { - gdk_window_scroll (clist->clist_window, 0, dy); - gdk_window_process_updates (clist->clist_window, FALSE); - } - - return; -} - -typedef struct -{ - GdkWindow *window; - gint dx; -} ScrollData; - -/* The window to which widget->window is relative */ -#define ALLOCATION_WINDOW(widget) \ - (!gtk_widget_get_has_window (widget) ? \ - (widget)->window : \ - gdk_window_get_parent ((widget)->window)) - -static void -adjust_allocation_recurse (GtkWidget *widget, - gpointer data) -{ - ScrollData *scroll_data = data; - - if (!gtk_widget_get_realized (widget)) - { - if (gtk_widget_get_visible (widget)) - { - GdkRectangle tmp_rectangle = widget->allocation; - tmp_rectangle.x += scroll_data->dx; - - gtk_widget_size_allocate (widget, &tmp_rectangle); - } - } - else - { - if (ALLOCATION_WINDOW (widget) == scroll_data->window) - { - widget->allocation.x += scroll_data->dx; - - if (GTK_IS_CONTAINER (widget)) - gtk_container_forall (GTK_CONTAINER (widget), - adjust_allocation_recurse, - data); - } - } -} - -static void -adjust_allocation (GtkWidget *widget, - gint dx) -{ - ScrollData scroll_data; - - if (gtk_widget_get_realized (widget)) - scroll_data.window = ALLOCATION_WINDOW (widget); - else - scroll_data.window = NULL; - - scroll_data.dx = dx; - - adjust_allocation_recurse (widget, &scroll_data); -} - -static void -hadjustment_value_changed (GtkAdjustment *adjustment, - gpointer data) -{ - GtkCList *clist; - GtkContainer *container; - GdkRectangle area; - gint i; - gint y = 0; - gint value; - gint dx; - - g_return_if_fail (adjustment != NULL); - g_return_if_fail (GTK_IS_CLIST (data)); - - clist = GTK_CLIST (data); - container = GTK_CONTAINER (data); - - if (adjustment != clist->hadjustment) - return; - - value = adjustment->value; - - dx = -value - clist->hoffset; - - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gdk_window_scroll (clist->title_window, dx, 0); - - /* adjust the column button's allocations */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button) - adjust_allocation (clist->column[i].button, dx); - - clist->hoffset = -value; - - if (GTK_WIDGET_DRAWABLE (clist)) - { - if (GTK_WIDGET_CAN_FOCUS(clist) && gtk_widget_has_focus (GTK_WIDGET (clist)) && - !container->focus_child && GTK_CLIST_ADD_MODE(clist)) - { - y = ROW_TOP_YPIXEL (clist, clist->focus_row); - - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, 0, y, - clist->clist_window_width - 1, - clist->row_height - 1); - } - - gdk_window_scroll (clist->clist_window, dx, 0); - gdk_window_process_updates (clist->clist_window, FALSE); - - if (GTK_WIDGET_CAN_FOCUS(clist) && gtk_widget_has_focus (GTK_WIDGET (clist)) && - !container->focus_child) - { - if (GTK_CLIST_ADD_MODE(clist)) - { - gint focus_row; - - focus_row = clist->focus_row; - clist->focus_row = -1; - draw_rows (clist, &area); - clist->focus_row = focus_row; - - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, - FALSE, 0, y, clist->clist_window_width - 1, - clist->row_height - 1); - return; - } - else if (ABS(dx) < clist->clist_window_width - 1) - { - gint x0; - gint x1; - - if (dx > 0) - { - x0 = clist->clist_window_width - 1; - x1 = dx; - } - else - { - x0 = 0; - x1 = clist->clist_window_width - 1 + dx; - } - - y = ROW_TOP_YPIXEL (clist, clist->focus_row); - gdk_draw_line (clist->clist_window, clist->xor_gc, - x0, y + 1, x0, y + clist->row_height - 2); - gdk_draw_line (clist->clist_window, clist->xor_gc, - x1, y + 1, x1, y + clist->row_height - 2); - } - } - } -} - -/* PRIVATE - * Memory Allocation/Distruction Routines for GtkCList stuctures - * - * functions: - * columns_new - * column_title_new - * columns_delete - * row_new - * row_delete - */ -static GtkCListColumn * -columns_new (GtkCList *clist) -{ - GtkCListColumn *column; - gint i; - - column = g_new (GtkCListColumn, clist->columns); - - for (i = 0; i < clist->columns; i++) - { - column[i].area.x = 0; - column[i].area.y = 0; - column[i].area.width = 0; - column[i].area.height = 0; - column[i].title = NULL; - column[i].button = NULL; - column[i].window = NULL; - column[i].width = 0; - column[i].min_width = -1; - column[i].max_width = -1; - column[i].visible = TRUE; - column[i].width_set = FALSE; - column[i].resizeable = TRUE; - column[i].auto_resize = FALSE; - column[i].button_passive = FALSE; - column[i].justification = GTK_JUSTIFY_LEFT; - } - - return column; -} - -static void -column_title_new (GtkCList *clist, - gint column, - const gchar *title) -{ - g_free (clist->column[column].title); - - clist->column[column].title = g_strdup (title); -} - -static void -columns_delete (GtkCList *clist) -{ - gint i; - - for (i = 0; i < clist->columns; i++) - g_free (clist->column[i].title); - - g_free (clist->column); -} - -static GtkCListRow * -row_new (GtkCList *clist) -{ - int i; - GtkCListRow *clist_row; - - clist_row = g_slice_new (GtkCListRow); - clist_row->cell = g_slice_alloc (sizeof (GtkCell) * clist->columns); - - for (i = 0; i < clist->columns; i++) - { - clist_row->cell[i].type = GTK_CELL_EMPTY; - clist_row->cell[i].vertical = 0; - clist_row->cell[i].horizontal = 0; - clist_row->cell[i].style = NULL; - } - - clist_row->fg_set = FALSE; - clist_row->bg_set = FALSE; - clist_row->style = NULL; - clist_row->selectable = TRUE; - clist_row->state = GTK_STATE_NORMAL; - clist_row->data = NULL; - clist_row->destroy = NULL; - - return clist_row; -} - -static void -row_delete (GtkCList *clist, - GtkCListRow *clist_row) -{ - gint i; - - for (i = 0; i < clist->columns; i++) - { - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, clist_row, i, GTK_CELL_EMPTY, NULL, 0, NULL, NULL); - if (clist_row->cell[i].style) - { - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gtk_style_detach (clist_row->cell[i].style); - g_object_unref (clist_row->cell[i].style); - } - } - - if (clist_row->style) - { - if (gtk_widget_get_realized (GTK_WIDGET (clist))) - gtk_style_detach (clist_row->style); - g_object_unref (clist_row->style); - } - - if (clist_row->destroy) - clist_row->destroy (clist_row->data); - - g_slice_free1 (sizeof (GtkCell) * clist->columns, clist_row->cell); - g_slice_free (GtkCListRow, clist_row); -} - -/* FOCUS FUNCTIONS - * gtk_clist_focus_content_area - * gtk_clist_focus - * gtk_clist_draw_focus - * gtk_clist_focus_in - * gtk_clist_focus_out - * title_focus - */ -static void -gtk_clist_focus_content_area (GtkCList *clist) -{ - if (clist->focus_row < 0) - { - clist->focus_row = 0; - - if ((clist->selection_mode == GTK_SELECTION_BROWSE || - clist->selection_mode == GTK_SELECTION_MULTIPLE) && - !clist->selection) - gtk_signal_emit (GTK_OBJECT (clist), - clist_signals[SELECT_ROW], - clist->focus_row, -1, NULL); - } - gtk_widget_grab_focus (GTK_WIDGET (clist)); -} - -static gboolean -gtk_clist_focus (GtkWidget *widget, - GtkDirectionType direction) -{ - GtkCList *clist = GTK_CLIST (widget); - GtkWidget *focus_child; - gboolean is_current_focus; - - if (!gtk_widget_is_sensitive (widget)) - return FALSE; - - focus_child = GTK_CONTAINER (widget)->focus_child; - - is_current_focus = gtk_widget_is_focus (GTK_WIDGET (clist)); - - if (focus_child && - gtk_widget_child_focus (focus_child, direction)) - return TRUE; - - switch (direction) - { - case GTK_DIR_LEFT: - case GTK_DIR_RIGHT: - if (focus_child) - { - if (title_focus_move (clist, direction)) - return TRUE; - } - else if (!is_current_focus) - { - gtk_clist_focus_content_area (clist); - return TRUE; - } - break; - case GTK_DIR_DOWN: - case GTK_DIR_TAB_FORWARD: - if (!focus_child && !is_current_focus) - { - if (title_focus_in (clist, direction)) - return TRUE; - } - - if (!is_current_focus && clist->rows) - { - gtk_clist_focus_content_area (clist); - return TRUE; - } - break; - case GTK_DIR_UP: - case GTK_DIR_TAB_BACKWARD: - if (!focus_child && is_current_focus) - { - if (title_focus_in (clist, direction)) - return TRUE; - } - - if (!is_current_focus && !focus_child && clist->rows) - { - gtk_clist_focus_content_area (clist); - return TRUE; - } - break; - default: - break; - } - - return FALSE; -} - -static void -gtk_clist_set_focus_child (GtkContainer *container, - GtkWidget *child) -{ - GtkCList *clist = GTK_CLIST (container); - gint i; - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button == child) - clist->focus_header_column = i; - - parent_class->set_focus_child (container, child); -} - -static void -gtk_clist_draw_focus (GtkWidget *widget) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (widget)); - - if (!GTK_WIDGET_DRAWABLE (widget) || !GTK_WIDGET_CAN_FOCUS (widget)) - return; - - clist = GTK_CLIST (widget); - if (clist->focus_row >= 0) - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, - 0, ROW_TOP_YPIXEL(clist, clist->focus_row), - clist->clist_window_width - 1, - clist->row_height - 1); -} - -static gint -gtk_clist_focus_in (GtkWidget *widget, - GdkEventFocus *event) -{ - GtkCList *clist = GTK_CLIST (widget); - - if (clist->selection_mode == GTK_SELECTION_BROWSE && - clist->selection == NULL && clist->focus_row > -1) - { - GList *list; - - list = g_list_nth (clist->row_list, clist->focus_row); - if (list && GTK_CLIST_ROW (list)->selectable) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - clist->focus_row, -1, event); - else - gtk_clist_draw_focus (widget); - } - else - gtk_clist_draw_focus (widget); - - return FALSE; -} - -static gint -gtk_clist_focus_out (GtkWidget *widget, - GdkEventFocus *event) -{ - GtkCList *clist = GTK_CLIST (widget); - - gtk_clist_draw_focus (widget); - - GTK_CLIST_GET_CLASS (widget)->resync_selection (clist, (GdkEvent *) event); - - return FALSE; -} - -static gboolean -focus_column (GtkCList *clist, gint column, gint dir) -{ - GtkWidget *child = clist->column[column].button; - - if (gtk_widget_child_focus (child, dir)) - { - return TRUE; - } - else if (GTK_WIDGET_CAN_FOCUS (child)) - { - gtk_widget_grab_focus (child); - return TRUE; - } - - return FALSE; -} - -/* Focus moved onto the headers. Focus first focusable and visible child. - * (FIXME: focus the last focused child if visible) - */ -static gboolean -title_focus_in (GtkCList *clist, gint dir) -{ - gint i; - gint left, right; - - if (!GTK_CLIST_SHOW_TITLES (clist)) - return FALSE; - - /* Check last focused column */ - if (clist->focus_header_column != -1) - { - i = clist->focus_header_column; - - left = COLUMN_LEFT_XPIXEL (clist, i); - right = left + clist->column[i].area.width; - - if (left >= 0 && right <= clist->clist_window_width) - { - if (focus_column (clist, i, dir)) - return TRUE; - } - } - - /* Check fully visible columns */ - for (i = 0 ; i < clist->columns ; i++) - { - left = COLUMN_LEFT_XPIXEL (clist, i); - right = left + clist->column[i].area.width; - - if (left >= 0 && right <= clist->clist_window_width) - { - if (focus_column (clist, i, dir)) - return TRUE; - } - } - - /* Check partially visible columns */ - for (i = 0 ; i < clist->columns ; i++) - { - left = COLUMN_LEFT_XPIXEL (clist, i); - right = left + clist->column[i].area.width; - - if ((left < 0 && right > 0) || - (left < clist->clist_window_width && right > clist->clist_window_width)) - { - if (focus_column (clist, i, dir)) - return TRUE; - } - } - - return FALSE; -} - -/* Move the focus right or left within the title buttons, scrolling - * as necessary to keep the focused child visible. - */ -static gboolean -title_focus_move (GtkCList *clist, - gint dir) -{ - GtkWidget *focus_child; - gboolean return_val = FALSE; - gint d = 0; - gint i = -1; - gint j; - - if (!GTK_CLIST_SHOW_TITLES(clist)) - return FALSE; - - focus_child = GTK_CONTAINER (clist)->focus_child; - g_assert (focus_child); - - /* Movement direction within headers - */ - switch (dir) - { - case GTK_DIR_RIGHT: - d = 1; - break; - case GTK_DIR_LEFT: - d = -1; - break; - } - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].button == focus_child) - break; - - g_assert (i != -1); /* Have a starting column */ - - j = i + d; - while (!return_val && j >= 0 && j < clist->columns) - { - if (clist->column[j].button && - gtk_widget_get_visible (clist->column[j].button)) - { - if (focus_column (clist, j, dir)) - { - return_val = TRUE; - break; - } - } - j += d; - } - - /* If we didn't find it, wrap around and keep looking - */ - if (!return_val) - { - j = d > 0 ? 0 : clist->columns - 1; - - while (!return_val && j != i) - { - if (clist->column[j].button && - gtk_widget_get_visible (clist->column[j].button)) - { - if (focus_column (clist, j, dir)) - { - return_val = TRUE; - break; - } - } - j += d; - } - } - - /* Scroll horizontally so focused column is visible - */ - if (return_val) - { - if (COLUMN_LEFT_XPIXEL (clist, j) < CELL_SPACING + COLUMN_INSET) - gtk_clist_moveto (clist, -1, j, 0, 0); - else if (COLUMN_LEFT_XPIXEL(clist, j) + clist->column[j].area.width > - clist->clist_window_width) - { - gint last_column; - - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--); - - if (j == last_column) - gtk_clist_moveto (clist, -1, j, 0, 0); - else - gtk_clist_moveto (clist, -1, j, 0, 1); - } - } - return TRUE; /* Even if we didn't find a new one, we can keep the - * focus in the same place. - */ -} - -/* PRIVATE SCROLLING FUNCTIONS - * move_focus_row - * scroll_horizontal - * scroll_vertical - * move_horizontal - * move_vertical - * horizontal_timeout - * vertical_timeout - * remove_grab - */ -static void -move_focus_row (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position) -{ - GtkWidget *widget; - - g_return_if_fail (clist != 0); - g_return_if_fail (GTK_IS_CLIST (clist)); - - widget = GTK_WIDGET (clist); - - switch (scroll_type) - { - case GTK_SCROLL_STEP_UP: - case GTK_SCROLL_STEP_BACKWARD: - if (clist->focus_row <= 0) - return; - gtk_clist_draw_focus (widget); - clist->focus_row--; - gtk_clist_draw_focus (widget); - break; - - case GTK_SCROLL_STEP_DOWN: - case GTK_SCROLL_STEP_FORWARD: - if (clist->focus_row >= clist->rows - 1) - return; - gtk_clist_draw_focus (widget); - clist->focus_row++; - gtk_clist_draw_focus (widget); - break; - case GTK_SCROLL_PAGE_UP: - case GTK_SCROLL_PAGE_BACKWARD: - if (clist->focus_row <= 0) - return; - gtk_clist_draw_focus (widget); - clist->focus_row = MAX (0, clist->focus_row - - (2 * clist->clist_window_height - - clist->row_height - CELL_SPACING) / - (2 * (clist->row_height + CELL_SPACING))); - gtk_clist_draw_focus (widget); - break; - case GTK_SCROLL_PAGE_DOWN: - case GTK_SCROLL_PAGE_FORWARD: - if (clist->focus_row >= clist->rows - 1) - return; - gtk_clist_draw_focus (widget); - clist->focus_row = MIN (clist->rows - 1, clist->focus_row + - (2 * clist->clist_window_height - - clist->row_height - CELL_SPACING) / - (2 * (clist->row_height + CELL_SPACING))); - gtk_clist_draw_focus (widget); - break; - case GTK_SCROLL_JUMP: - if (position >= 0 && position <= 1) - { - gtk_clist_draw_focus (widget); - clist->focus_row = position * (clist->rows - 1); - gtk_clist_draw_focus (widget); - } - break; - default: - break; - } -} - -static void -scroll_horizontal (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position) -{ - gint column = 0; - gint last_column; - - g_return_if_fail (clist != 0); - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist)) - return; - - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--) - ; - - switch (scroll_type) - { - case GTK_SCROLL_STEP_BACKWARD: - column = COLUMN_FROM_XPIXEL (clist, 0); - if (COLUMN_LEFT_XPIXEL (clist, column) - CELL_SPACING - COLUMN_INSET >= 0 - && column > 0) - column--; - break; - case GTK_SCROLL_STEP_FORWARD: - column = COLUMN_FROM_XPIXEL (clist, clist->clist_window_width); - if (column < 0) - return; - if (COLUMN_LEFT_XPIXEL (clist, column) + - clist->column[column].area.width + - CELL_SPACING + COLUMN_INSET - 1 <= clist->clist_window_width && - column < last_column) - column++; - break; - case GTK_SCROLL_PAGE_BACKWARD: - case GTK_SCROLL_PAGE_FORWARD: - return; - case GTK_SCROLL_JUMP: - if (position >= 0 && position <= 1) - { - gint vis_columns = 0; - gint i; - - for (i = 0; i <= last_column; i++) - if (clist->column[i].visible) - vis_columns++; - - column = position * vis_columns; - - for (i = 0; i <= last_column && column > 0; i++) - if (clist->column[i].visible) - column--; - - column = i; - } - else - return; - break; - default: - break; - } - - if (COLUMN_LEFT_XPIXEL (clist, column) < CELL_SPACING + COLUMN_INSET) - gtk_clist_moveto (clist, -1, column, 0, 0); - else if (COLUMN_LEFT_XPIXEL (clist, column) + CELL_SPACING + COLUMN_INSET - 1 - + clist->column[column].area.width > clist->clist_window_width) - { - if (column == last_column) - gtk_clist_moveto (clist, -1, column, 0, 0); - else - gtk_clist_moveto (clist, -1, column, 0, 1); - } -} - -static void -scroll_vertical (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position) -{ - gint old_focus_row; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist_has_grab (clist)) - return; - - switch (clist->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - if (clist->anchor >= 0) - return; - case GTK_SELECTION_BROWSE: - - old_focus_row = clist->focus_row; - move_focus_row (clist, scroll_type, position); - - if (old_focus_row != clist->focus_row) - { - if (clist->selection_mode == GTK_SELECTION_BROWSE) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNSELECT_ROW], - old_focus_row, -1, NULL); - else if (!GTK_CLIST_ADD_MODE(clist)) - { - gtk_clist_unselect_all (clist); - clist->undo_anchor = old_focus_row; - } - } - - switch (gtk_clist_row_is_visible (clist, clist->focus_row)) - { - case GTK_VISIBILITY_NONE: - if (old_focus_row != clist->focus_row && - !(clist->selection_mode == GTK_SELECTION_MULTIPLE && - GTK_CLIST_ADD_MODE(clist))) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - clist->focus_row, -1, NULL); - switch (scroll_type) - { - case GTK_SCROLL_PAGE_UP: - case GTK_SCROLL_STEP_UP: - case GTK_SCROLL_STEP_BACKWARD: - case GTK_SCROLL_PAGE_BACKWARD: - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - break; - case GTK_SCROLL_PAGE_DOWN: - case GTK_SCROLL_STEP_DOWN: - case GTK_SCROLL_STEP_FORWARD: - case GTK_SCROLL_PAGE_FORWARD: - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - break; - case GTK_SCROLL_JUMP: - gtk_clist_moveto (clist, clist->focus_row, -1, 0.5, 0); - break; - default: - break; - } - break; - case GTK_VISIBILITY_PARTIAL: - switch (scroll_type) - { - case GTK_SCROLL_STEP_BACKWARD: - case GTK_SCROLL_PAGE_BACKWARD: - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - break; - case GTK_SCROLL_STEP_FORWARD: - case GTK_SCROLL_PAGE_FORWARD: - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - break; - case GTK_SCROLL_JUMP: - gtk_clist_moveto (clist, clist->focus_row, -1, 0.5, 0); - break; - default: - break; - } - default: - if (old_focus_row != clist->focus_row && - !(clist->selection_mode == GTK_SELECTION_MULTIPLE && - GTK_CLIST_ADD_MODE(clist))) - gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW], - clist->focus_row, -1, NULL); - break; - } - break; - default: - move_focus_row (clist, scroll_type, position); - - if (ROW_TOP_YPIXEL (clist, clist->focus_row) + clist->row_height > - clist->clist_window_height) - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - else if (ROW_TOP_YPIXEL (clist, clist->focus_row) < 0) - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - break; - } -} - -static void -move_horizontal (GtkCList *clist, - gint diff) -{ - gdouble value; - - if (!clist->hadjustment) - return; - - value = CLAMP (clist->hadjustment->value + diff, 0.0, - clist->hadjustment->upper - clist->hadjustment->page_size); - gtk_adjustment_set_value (clist->hadjustment, value); -} - -static void -move_vertical (GtkCList *clist, - gint row, - gfloat align) -{ - gdouble value; - - if (!clist->vadjustment) - return; - - value = (ROW_TOP_YPIXEL (clist, row) - clist->voffset - - align * (clist->clist_window_height - clist->row_height) + - (2 * align - 1) * CELL_SPACING); - - if (value + clist->vadjustment->page_size > clist->vadjustment->upper) - value = clist->vadjustment->upper - clist->vadjustment->page_size; - - gtk_adjustment_set_value (clist->vadjustment, value); -} - -static void -do_fake_motion (GtkWidget *widget) -{ - GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY); - - event->motion.send_event = TRUE; - - gtk_clist_motion (widget, (GdkEventMotion *)event); - gdk_event_free (event); -} - -static gint -horizontal_timeout (GtkCList *clist) -{ - clist->htimer = 0; - do_fake_motion (GTK_WIDGET (clist)); - - return FALSE; -} - -static gint -vertical_timeout (GtkCList *clist) -{ - clist->vtimer = 0; - do_fake_motion (GTK_WIDGET (clist)); - - return FALSE; -} - -static void -remove_grab (GtkCList *clist) -{ - GtkWidget *widget = GTK_WIDGET (clist); - - if (GTK_WIDGET_HAS_GRAB (clist)) - { - GdkDisplay *display = gtk_widget_get_display (widget); - - gtk_grab_remove (widget); - if (gdk_display_pointer_is_grabbed (display)) - gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); - } - - if (clist->htimer) - { - g_source_remove (clist->htimer); - clist->htimer = 0; - } - - if (clist->vtimer) - { - g_source_remove (clist->vtimer); - clist->vtimer = 0; - } -} - -/* PUBLIC SORTING FUNCTIONS - * gtk_clist_sort - * gtk_clist_set_compare_func - * gtk_clist_set_auto_sort - * gtk_clist_set_sort_type - * gtk_clist_set_sort_column - */ -void -gtk_clist_sort (GtkCList *clist) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - GTK_CLIST_GET_CLASS (clist)->sort_list (clist); -} - -void -gtk_clist_set_compare_func (GtkCList *clist, - GtkCListCompareFunc cmp_func) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - clist->compare = (cmp_func) ? cmp_func : default_compare; -} - -void -gtk_clist_set_auto_sort (GtkCList *clist, - gboolean auto_sort) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (GTK_CLIST_AUTO_SORT(clist) && !auto_sort) - GTK_CLIST_UNSET_FLAG (clist, CLIST_AUTO_SORT); - else if (!GTK_CLIST_AUTO_SORT(clist) && auto_sort) - { - GTK_CLIST_SET_FLAG (clist, CLIST_AUTO_SORT); - gtk_clist_sort (clist); - } -} - -void -gtk_clist_set_sort_type (GtkCList *clist, - GtkSortType sort_type) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - clist->sort_type = sort_type; -} - -void -gtk_clist_set_sort_column (GtkCList *clist, - gint column) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (column < 0 || column >= clist->columns) - return; - - clist->sort_column = column; -} - -/* PRIVATE SORTING FUNCTIONS - * default_compare - * real_sort_list - * gtk_clist_merge - * gtk_clist_mergesort - */ -static gint -default_compare (GtkCList *clist, - gconstpointer ptr1, - gconstpointer ptr2) -{ - char *text1 = NULL; - char *text2 = NULL; - - GtkCListRow *row1 = (GtkCListRow *) ptr1; - GtkCListRow *row2 = (GtkCListRow *) ptr2; - - switch (row1->cell[clist->sort_column].type) - { - case GTK_CELL_TEXT: - text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text; - break; - case GTK_CELL_PIXTEXT: - text1 = GTK_CELL_PIXTEXT (row1->cell[clist->sort_column])->text; - break; - default: - break; - } - - switch (row2->cell[clist->sort_column].type) - { - case GTK_CELL_TEXT: - text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text; - break; - case GTK_CELL_PIXTEXT: - text2 = GTK_CELL_PIXTEXT (row2->cell[clist->sort_column])->text; - break; - default: - break; - } - - if (!text2) - return (text1 != NULL); - - if (!text1) - return -1; - - return strcmp (text1, text2); -} - -static void -real_sort_list (GtkCList *clist) -{ - GList *list; - GList *work; - gint i; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (clist->rows <= 1) - return; - - if (clist_has_grab (clist)) - return; - - gtk_clist_freeze (clist); - - if (clist->anchor != -1 && clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - clist->row_list = gtk_clist_mergesort (clist, clist->row_list, clist->rows); - - work = clist->selection; - - for (i = 0, list = clist->row_list; i < clist->rows; i++, list = list->next) - { - if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED) - { - work->data = GINT_TO_POINTER (i); - work = work->next; - } - - if (i == clist->rows - 1) - clist->row_list_end = list; - } - - gtk_clist_thaw (clist); -} - -static GList * -gtk_clist_merge (GtkCList *clist, - GList *a, /* first list to merge */ - GList *b) /* second list to merge */ -{ - GList z = { 0 }; /* auxiliary node */ - GList *c; - gint cmp; - - c = &z; - - while (a || b) - { - if (a && !b) - { - c->next = a; - a->prev = c; - c = a; - a = a->next; - break; - } - else if (!a && b) - { - c->next = b; - b->prev = c; - c = b; - b = b->next; - break; - } - else /* a && b */ - { - cmp = clist->compare (clist, GTK_CLIST_ROW (a), GTK_CLIST_ROW (b)); - if ((cmp >= 0 && clist->sort_type == GTK_SORT_DESCENDING) || - (cmp <= 0 && clist->sort_type == GTK_SORT_ASCENDING) || - (a && !b)) - { - c->next = a; - a->prev = c; - c = a; - a = a->next; - } - else - { - c->next = b; - b->prev = c; - c = b; - b = b->next; - } - } - } - - z.next->prev = NULL; - return z.next; -} - -static GList * -gtk_clist_mergesort (GtkCList *clist, - GList *list, /* the list to sort */ - gint num) /* the list's length */ -{ - GList *half; - gint i; - - if (num <= 1) - { - return list; - } - else - { - /* move "half" to the middle */ - half = list; - for (i = 0; i < num / 2; i++) - half = half->next; - - /* cut the list in two */ - half->prev->next = NULL; - half->prev = NULL; - - /* recursively sort both lists */ - return gtk_clist_merge (clist, - gtk_clist_mergesort (clist, list, num / 2), - gtk_clist_mergesort (clist, half, num - num / 2)); - } -} - -/************************/ - -static void -drag_source_info_destroy (gpointer data) -{ - GtkCListCellInfo *info = data; - - g_free (info); -} - -static void -drag_dest_info_destroy (gpointer data) -{ - GtkCListDestInfo *info = data; - - g_free (info); -} - -static void -drag_dest_cell (GtkCList *clist, - gint x, - gint y, - GtkCListDestInfo *dest_info) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (clist); - - dest_info->insert_pos = GTK_CLIST_DRAG_NONE; - - y -= (GTK_CONTAINER (clist)->border_width + - widget->style->ythickness + - clist->column_title_area.height); - - dest_info->cell.row = ROW_FROM_YPIXEL (clist, y); - if (dest_info->cell.row >= clist->rows) - { - dest_info->cell.row = clist->rows - 1; - y = ROW_TOP_YPIXEL (clist, dest_info->cell.row) + clist->row_height; - } - if (dest_info->cell.row < -1) - dest_info->cell.row = -1; - - x -= GTK_CONTAINER (widget)->border_width + widget->style->xthickness; - - dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x); - - if (dest_info->cell.row >= 0) - { - gint y_delta; - gint h = 0; - - y_delta = y - ROW_TOP_YPIXEL (clist, dest_info->cell.row); - - if (GTK_CLIST_DRAW_DRAG_RECT(clist)) - { - dest_info->insert_pos = GTK_CLIST_DRAG_INTO; - h = clist->row_height / 4; - } - else if (GTK_CLIST_DRAW_DRAG_LINE(clist)) - { - dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE; - h = clist->row_height / 2; - } - - if (GTK_CLIST_DRAW_DRAG_LINE(clist)) - { - if (y_delta < h) - dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE; - else if (clist->row_height - y_delta < h) - dest_info->insert_pos = GTK_CLIST_DRAG_AFTER; - } - } -} - -static void -gtk_clist_drag_begin (GtkWidget *widget, - GdkDragContext *context) -{ - GtkCList *clist; - GtkCListCellInfo *info; - - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (context != NULL); - - clist = GTK_CLIST (widget); - - clist->drag_button = 0; - remove_grab (clist); - - switch (clist->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - update_extended_selection (clist, clist->focus_row); - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - break; - case GTK_SELECTION_SINGLE: - clist->anchor = -1; - case GTK_SELECTION_BROWSE: - break; - default: - g_assert_not_reached (); - } - - info = g_dataset_get_data (context, "gtk-clist-drag-source"); - - if (!info) - { - info = g_new (GtkCListCellInfo, 1); - - if (clist->click_cell.row < 0) - clist->click_cell.row = 0; - else if (clist->click_cell.row >= clist->rows) - clist->click_cell.row = clist->rows - 1; - info->row = clist->click_cell.row; - info->column = clist->click_cell.column; - - g_dataset_set_data_full (context, "gtk-clist-drag-source", info, - drag_source_info_destroy); - } - - if (GTK_CLIST_USE_DRAG_ICONS (clist)) - gtk_drag_set_icon_default (context); -} - -static void -gtk_clist_drag_end (GtkWidget *widget, - GdkDragContext *context) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (context != NULL); - - clist = GTK_CLIST (widget); - - clist->click_cell.row = -1; - clist->click_cell.column = -1; -} - -static void -gtk_clist_drag_leave (GtkWidget *widget, - GdkDragContext *context, - guint time) -{ - GtkCList *clist; - GtkCListDestInfo *dest_info; - - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (context != NULL); - - clist = GTK_CLIST (widget); - - dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest"); - - if (dest_info) - { - if (dest_info->cell.row >= 0 && - GTK_CLIST_REORDERABLE(clist) && - gtk_drag_get_source_widget (context) == widget) - { - GList *list; - GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder"); - - list = context->targets; - while (list) - { - if (atom == GDK_POINTER_TO_ATOM (list->data)) - { - GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight - (clist, - g_list_nth (clist->row_list, dest_info->cell.row)->data, - dest_info->cell.row, dest_info->insert_pos); - clist->drag_highlight_row = -1; - break; - } - list = list->next; - } - } - g_dataset_remove_data (context, "gtk-clist-drag-dest"); - } -} - -static gint -gtk_clist_drag_motion (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - GtkCList *clist; - GtkCListDestInfo new_info; - GtkCListDestInfo *dest_info; - - g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE); - - clist = GTK_CLIST (widget); - - dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest"); - - if (!dest_info) - { - dest_info = g_new (GtkCListDestInfo, 1); - - dest_info->insert_pos = GTK_CLIST_DRAG_NONE; - dest_info->cell.row = -1; - dest_info->cell.column = -1; - - g_dataset_set_data_full (context, "gtk-clist-drag-dest", dest_info, - drag_dest_info_destroy); - } - - drag_dest_cell (clist, x, y, &new_info); - - if (GTK_CLIST_REORDERABLE (clist)) - { - GList *list; - GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder"); - - list = context->targets; - while (list) - { - if (atom == GDK_POINTER_TO_ATOM (list->data)) - break; - list = list->next; - } - - if (list) - { - if (gtk_drag_get_source_widget (context) != widget || - new_info.insert_pos == GTK_CLIST_DRAG_NONE || - new_info.cell.row == clist->click_cell.row || - (new_info.cell.row == clist->click_cell.row - 1 && - new_info.insert_pos == GTK_CLIST_DRAG_AFTER) || - (new_info.cell.row == clist->click_cell.row + 1 && - new_info.insert_pos == GTK_CLIST_DRAG_BEFORE)) - { - if (dest_info->cell.row < 0) - { - gdk_drag_status (context, GDK_ACTION_DEFAULT, time); - return FALSE; - } - return TRUE; - } - - if (new_info.cell.row != dest_info->cell.row || - (new_info.cell.row == dest_info->cell.row && - dest_info->insert_pos != new_info.insert_pos)) - { - if (dest_info->cell.row >= 0) - GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight - (clist, g_list_nth (clist->row_list, - dest_info->cell.row)->data, - dest_info->cell.row, dest_info->insert_pos); - - dest_info->insert_pos = new_info.insert_pos; - dest_info->cell.row = new_info.cell.row; - dest_info->cell.column = new_info.cell.column; - - GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight - (clist, g_list_nth (clist->row_list, - dest_info->cell.row)->data, - dest_info->cell.row, dest_info->insert_pos); - - clist->drag_highlight_row = dest_info->cell.row; - clist->drag_highlight_pos = dest_info->insert_pos; - - gdk_drag_status (context, context->suggested_action, time); - } - return TRUE; - } - } - - dest_info->insert_pos = new_info.insert_pos; - dest_info->cell.row = new_info.cell.row; - dest_info->cell.column = new_info.cell.column; - return TRUE; -} - -static gboolean -gtk_clist_drag_drop (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE); - g_return_val_if_fail (context != NULL, FALSE); - - if (GTK_CLIST_REORDERABLE (widget) && - gtk_drag_get_source_widget (context) == widget) - { - GList *list; - GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder"); - - list = context->targets; - while (list) - { - if (atom == GDK_POINTER_TO_ATOM (list->data)) - return TRUE; - list = list->next; - } - } - return FALSE; -} - -static void -gtk_clist_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (context != NULL); - g_return_if_fail (selection_data != NULL); - - clist = GTK_CLIST (widget); - - if (GTK_CLIST_REORDERABLE (clist) && - gtk_drag_get_source_widget (context) == widget && - selection_data->target == - gdk_atom_intern_static_string ("gtk-clist-drag-reorder") && - selection_data->format == 8 && - selection_data->length == sizeof (GtkCListCellInfo)) - { - GtkCListCellInfo *source_info; - - source_info = (GtkCListCellInfo *)(selection_data->data); - if (source_info) - { - GtkCListDestInfo dest_info; - - drag_dest_cell (clist, x, y, &dest_info); - - if (dest_info.insert_pos == GTK_CLIST_DRAG_AFTER) - dest_info.cell.row++; - if (source_info->row < dest_info.cell.row) - dest_info.cell.row--; - if (dest_info.cell.row != source_info->row) - gtk_clist_row_move (clist, source_info->row, dest_info.cell.row); - - g_dataset_remove_data (context, "gtk-clist-drag-dest"); - } - } -} - -static void -gtk_clist_drag_data_get (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time) -{ - g_return_if_fail (GTK_IS_CLIST (widget)); - g_return_if_fail (context != NULL); - g_return_if_fail (selection_data != NULL); - - if (selection_data->target == gdk_atom_intern_static_string ("gtk-clist-drag-reorder")) - { - GtkCListCellInfo *info; - - info = g_dataset_get_data (context, "gtk-clist-drag-source"); - - if (info) - { - GtkCListCellInfo ret_info; - - ret_info.row = info->row; - ret_info.column = info->column; - - gtk_selection_data_set (selection_data, selection_data->target, - 8, (guchar *) &ret_info, - sizeof (GtkCListCellInfo)); - } - } -} - -static void -draw_drag_highlight (GtkCList *clist, - GtkCListRow *dest_row, - gint dest_row_number, - GtkCListDragPos drag_pos) -{ - gint y; - - y = ROW_TOP_YPIXEL (clist, dest_row_number) - 1; - - switch (drag_pos) - { - case GTK_CLIST_DRAG_NONE: - break; - case GTK_CLIST_DRAG_AFTER: - y += clist->row_height + 1; - case GTK_CLIST_DRAG_BEFORE: - gdk_draw_line (clist->clist_window, clist->xor_gc, - 0, y, clist->clist_window_width, y); - break; - case GTK_CLIST_DRAG_INTO: - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, 0, y, - clist->clist_window_width - 1, clist->row_height); - break; - } -} - -void -gtk_clist_set_reorderable (GtkCList *clist, - gboolean reorderable) -{ - GtkWidget *widget; - - g_return_if_fail (GTK_IS_CLIST (clist)); - - if ((GTK_CLIST_REORDERABLE(clist) != 0) == reorderable) - return; - - widget = GTK_WIDGET (clist); - - if (reorderable) - { - GTK_CLIST_SET_FLAG (clist, CLIST_REORDERABLE); - gtk_drag_dest_set (widget, - GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, - &clist_target_table, 1, GDK_ACTION_MOVE); - } - else - { - GTK_CLIST_UNSET_FLAG (clist, CLIST_REORDERABLE); - gtk_drag_dest_unset (GTK_WIDGET (clist)); - } -} - -void -gtk_clist_set_use_drag_icons (GtkCList *clist, - gboolean use_icons) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (use_icons != 0) - GTK_CLIST_SET_FLAG (clist, CLIST_USE_DRAG_ICONS); - else - GTK_CLIST_UNSET_FLAG (clist, CLIST_USE_DRAG_ICONS); -} - -void -gtk_clist_set_button_actions (GtkCList *clist, - guint button, - guint8 button_actions) -{ - g_return_if_fail (GTK_IS_CLIST (clist)); - - if (button < MAX_BUTTON) - { - if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))) || - GTK_WIDGET_HAS_GRAB (clist)) - { - remove_grab (clist); - clist->drag_button = 0; - } - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - clist->button_actions[button] = button_actions; - } -} - -#include "gtkaliasdef.c" diff --git a/gtk/gtkclist.h b/gtk/gtkclist.h deleted file mode 100644 index d97b5473ee..0000000000 --- a/gtk/gtkclist.h +++ /dev/null @@ -1,792 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald - * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#if !defined (GTK_DISABLE_DEPRECATED) || defined (__GTK_CLIST_C__) || defined (__GTK_CTREE_C__) - -#ifndef __GTK_CLIST_H__ -#define __GTK_CLIST_H__ - - -#include <gtk/gtksignal.h> -#include <gtk/gtkalignment.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkbutton.h> -#include <gtk/gtkhscrollbar.h> -#include <gtk/gtkvscrollbar.h> - - -G_BEGIN_DECLS - - -/* clist flags */ -enum { - GTK_CLIST_IN_DRAG = 1 << 0, - GTK_CLIST_ROW_HEIGHT_SET = 1 << 1, - GTK_CLIST_SHOW_TITLES = 1 << 2, - /* Unused */ - GTK_CLIST_ADD_MODE = 1 << 4, - GTK_CLIST_AUTO_SORT = 1 << 5, - GTK_CLIST_AUTO_RESIZE_BLOCKED = 1 << 6, - GTK_CLIST_REORDERABLE = 1 << 7, - GTK_CLIST_USE_DRAG_ICONS = 1 << 8, - GTK_CLIST_DRAW_DRAG_LINE = 1 << 9, - GTK_CLIST_DRAW_DRAG_RECT = 1 << 10 -}; - -/* cell types */ -typedef enum -{ - GTK_CELL_EMPTY, - GTK_CELL_TEXT, - GTK_CELL_PIXMAP, - GTK_CELL_PIXTEXT, - GTK_CELL_WIDGET -} GtkCellType; - -typedef enum -{ - GTK_CLIST_DRAG_NONE, - GTK_CLIST_DRAG_BEFORE, - GTK_CLIST_DRAG_INTO, - GTK_CLIST_DRAG_AFTER -} GtkCListDragPos; - -typedef enum -{ - GTK_BUTTON_IGNORED = 0, - GTK_BUTTON_SELECTS = 1 << 0, - GTK_BUTTON_DRAGS = 1 << 1, - GTK_BUTTON_EXPANDS = 1 << 2 -} GtkButtonAction; - -#define GTK_TYPE_CLIST (gtk_clist_get_type ()) -#define GTK_CLIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CLIST, GtkCList)) -#define GTK_CLIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CLIST, GtkCListClass)) -#define GTK_IS_CLIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CLIST)) -#define GTK_IS_CLIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CLIST)) -#define GTK_CLIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CLIST, GtkCListClass)) - - -#define GTK_CLIST_FLAGS(clist) (GTK_CLIST (clist)->flags) -#define GTK_CLIST_SET_FLAG(clist,flag) (GTK_CLIST_FLAGS (clist) |= (GTK_ ## flag)) -#define GTK_CLIST_UNSET_FLAG(clist,flag) (GTK_CLIST_FLAGS (clist) &= ~(GTK_ ## flag)) - -#define GTK_CLIST_IN_DRAG(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_IN_DRAG) -#define GTK_CLIST_ROW_HEIGHT_SET(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_ROW_HEIGHT_SET) -#define GTK_CLIST_SHOW_TITLES(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_SHOW_TITLES) -#define GTK_CLIST_ADD_MODE(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_ADD_MODE) -#define GTK_CLIST_AUTO_SORT(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_AUTO_SORT) -#define GTK_CLIST_AUTO_RESIZE_BLOCKED(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_AUTO_RESIZE_BLOCKED) -#define GTK_CLIST_REORDERABLE(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_REORDERABLE) -#define GTK_CLIST_USE_DRAG_ICONS(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_USE_DRAG_ICONS) -#define GTK_CLIST_DRAW_DRAG_LINE(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_DRAW_DRAG_LINE) -#define GTK_CLIST_DRAW_DRAG_RECT(clist) (GTK_CLIST_FLAGS (clist) & GTK_CLIST_DRAW_DRAG_RECT) - -#define GTK_CLIST_ROW(_glist_) ((GtkCListRow *)((_glist_)->data)) - -/* pointer casting for cells */ -#define GTK_CELL_TEXT(cell) (((GtkCellText *) &(cell))) -#define GTK_CELL_PIXMAP(cell) (((GtkCellPixmap *) &(cell))) -#define GTK_CELL_PIXTEXT(cell) (((GtkCellPixText *) &(cell))) -#define GTK_CELL_WIDGET(cell) (((GtkCellWidget *) &(cell))) - -typedef struct _GtkCList GtkCList; -typedef struct _GtkCListClass GtkCListClass; -typedef struct _GtkCListColumn GtkCListColumn; -typedef struct _GtkCListRow GtkCListRow; - -typedef struct _GtkCell GtkCell; -typedef struct _GtkCellText GtkCellText; -typedef struct _GtkCellPixmap GtkCellPixmap; -typedef struct _GtkCellPixText GtkCellPixText; -typedef struct _GtkCellWidget GtkCellWidget; - -typedef gint (*GtkCListCompareFunc) (GtkCList *clist, - gconstpointer ptr1, - gconstpointer ptr2); - -typedef struct _GtkCListCellInfo GtkCListCellInfo; -typedef struct _GtkCListDestInfo GtkCListDestInfo; - -struct _GtkCListCellInfo -{ - gint row; - gint column; -}; - -struct _GtkCListDestInfo -{ - GtkCListCellInfo cell; - GtkCListDragPos insert_pos; -}; - -struct _GtkCList -{ - GtkContainer container; - - guint16 flags; - - gpointer reserved1; - gpointer reserved2; - - guint freeze_count; - - /* allocation rectangle after the container_border_width - * and the width of the shadow border */ - GdkRectangle internal_allocation; - - /* rows */ - gint rows; - gint row_height; - GList *row_list; - GList *row_list_end; - - /* columns */ - gint columns; - GdkRectangle column_title_area; - GdkWindow *title_window; - - /* dynamicly allocated array of column structures */ - GtkCListColumn *column; - - /* the scrolling window and its height and width to - * make things a little speedier */ - GdkWindow *clist_window; - gint clist_window_width; - gint clist_window_height; - - /* offsets for scrolling */ - gint hoffset; - gint voffset; - - /* border shadow style */ - GtkShadowType shadow_type; - - /* the list's selection mode (gtkenums.h) */ - GtkSelectionMode selection_mode; - - /* list of selected rows */ - GList *selection; - GList *selection_end; - - GList *undo_selection; - GList *undo_unselection; - gint undo_anchor; - - /* mouse buttons */ - guint8 button_actions[5]; - - guint8 drag_button; - - /* dnd */ - GtkCListCellInfo click_cell; - - /* scroll adjustments */ - GtkAdjustment *hadjustment; - GtkAdjustment *vadjustment; - - /* xor GC for the vertical drag line */ - GdkGC *xor_gc; - - /* gc for drawing unselected cells */ - GdkGC *fg_gc; - GdkGC *bg_gc; - - /* cursor used to indicate dragging */ - GdkCursor *cursor_drag; - - /* the current x-pixel location of the xor-drag line */ - gint x_drag; - - /* focus handling */ - gint focus_row; - - gint focus_header_column; - - /* dragging the selection */ - gint anchor; - GtkStateType anchor_state; - gint drag_pos; - gint htimer; - gint vtimer; - - GtkSortType sort_type; - GtkCListCompareFunc compare; - gint sort_column; - - gint drag_highlight_row; - GtkCListDragPos drag_highlight_pos; -}; - -struct _GtkCListClass -{ - GtkContainerClass parent_class; - - void (*set_scroll_adjustments) (GtkCList *clist, - GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment); - void (*refresh) (GtkCList *clist); - void (*select_row) (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); - void (*unselect_row) (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); - void (*row_move) (GtkCList *clist, - gint source_row, - gint dest_row); - void (*click_column) (GtkCList *clist, - gint column); - void (*resize_column) (GtkCList *clist, - gint column, - gint width); - void (*toggle_focus_row) (GtkCList *clist); - void (*select_all) (GtkCList *clist); - void (*unselect_all) (GtkCList *clist); - void (*undo_selection) (GtkCList *clist); - void (*start_selection) (GtkCList *clist); - void (*end_selection) (GtkCList *clist); - void (*extend_selection) (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection); - void (*scroll_horizontal) (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position); - void (*scroll_vertical) (GtkCList *clist, - GtkScrollType scroll_type, - gfloat position); - void (*toggle_add_mode) (GtkCList *clist); - void (*abort_column_resize) (GtkCList *clist); - void (*resync_selection) (GtkCList *clist, - GdkEvent *event); - GList* (*selection_find) (GtkCList *clist, - gint row_number, - GList *row_list_element); - void (*draw_row) (GtkCList *clist, - GdkRectangle *area, - gint row, - GtkCListRow *clist_row); - void (*draw_drag_highlight) (GtkCList *clist, - GtkCListRow *target_row, - gint target_row_number, - GtkCListDragPos drag_pos); - void (*clear) (GtkCList *clist); - void (*fake_unselect_all) (GtkCList *clist, - gint row); - void (*sort_list) (GtkCList *clist); - gint (*insert_row) (GtkCList *clist, - gint row, - gchar *text[]); - void (*remove_row) (GtkCList *clist, - gint row); - void (*set_cell_contents) (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkCellType type, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask); - void (*cell_size_request) (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkRequisition *requisition); - -}; - -struct _GtkCListColumn -{ - gchar *title; - GdkRectangle area; - - GtkWidget *button; - GdkWindow *window; - - gint width; - gint min_width; - gint max_width; - GtkJustification justification; - - guint visible : 1; - guint width_set : 1; - guint resizeable : 1; - guint auto_resize : 1; - guint button_passive : 1; -}; - -struct _GtkCListRow -{ - GtkCell *cell; - GtkStateType state; - - GdkColor foreground; - GdkColor background; - - GtkStyle *style; - - gpointer data; - GDestroyNotify destroy; - - guint fg_set : 1; - guint bg_set : 1; - guint selectable : 1; -}; - -/* Cell Structures */ -struct _GtkCellText -{ - GtkCellType type; - - gint16 vertical; - gint16 horizontal; - - GtkStyle *style; - - gchar *text; -}; - -struct _GtkCellPixmap -{ - GtkCellType type; - - gint16 vertical; - gint16 horizontal; - - GtkStyle *style; - - GdkPixmap *pixmap; - GdkBitmap *mask; -}; - -struct _GtkCellPixText -{ - GtkCellType type; - - gint16 vertical; - gint16 horizontal; - - GtkStyle *style; - - gchar *text; - guint8 spacing; - GdkPixmap *pixmap; - GdkBitmap *mask; -}; - -struct _GtkCellWidget -{ - GtkCellType type; - - gint16 vertical; - gint16 horizontal; - - GtkStyle *style; - - GtkWidget *widget; -}; - -struct _GtkCell -{ - GtkCellType type; - - gint16 vertical; - gint16 horizontal; - - GtkStyle *style; - - union { - gchar *text; - - struct { - GdkPixmap *pixmap; - GdkBitmap *mask; - } pm; - - struct { - gchar *text; - guint8 spacing; - GdkPixmap *pixmap; - GdkBitmap *mask; - } pt; - - GtkWidget *widget; - } u; -}; - -GType gtk_clist_get_type (void) G_GNUC_CONST; - -/* create a new GtkCList */ -GtkWidget* gtk_clist_new (gint columns); -GtkWidget* gtk_clist_new_with_titles (gint columns, - gchar *titles[]); - -/* set adjustments of clist */ -void gtk_clist_set_hadjustment (GtkCList *clist, - GtkAdjustment *adjustment); -void gtk_clist_set_vadjustment (GtkCList *clist, - GtkAdjustment *adjustment); - -/* get adjustments of clist */ -GtkAdjustment* gtk_clist_get_hadjustment (GtkCList *clist); -GtkAdjustment* gtk_clist_get_vadjustment (GtkCList *clist); - -/* set the border style of the clist */ -void gtk_clist_set_shadow_type (GtkCList *clist, - GtkShadowType type); - -/* set the clist's selection mode */ -void gtk_clist_set_selection_mode (GtkCList *clist, - GtkSelectionMode mode); - -/* enable clists reorder ability */ -void gtk_clist_set_reorderable (GtkCList *clist, - gboolean reorderable); -void gtk_clist_set_use_drag_icons (GtkCList *clist, - gboolean use_icons); -void gtk_clist_set_button_actions (GtkCList *clist, - guint button, - guint8 button_actions); - -/* freeze all visual updates of the list, and then thaw the list after - * you have made a number of changes and the updates wil occure in a - * more efficent mannor than if you made them on a unfrozen list - */ -void gtk_clist_freeze (GtkCList *clist); -void gtk_clist_thaw (GtkCList *clist); - -/* show and hide the column title buttons */ -void gtk_clist_column_titles_show (GtkCList *clist); -void gtk_clist_column_titles_hide (GtkCList *clist); - -/* set the column title to be a active title (responds to button presses, - * prelights, and grabs keyboard focus), or passive where it acts as just - * a title - */ -void gtk_clist_column_title_active (GtkCList *clist, - gint column); -void gtk_clist_column_title_passive (GtkCList *clist, - gint column); -void gtk_clist_column_titles_active (GtkCList *clist); -void gtk_clist_column_titles_passive (GtkCList *clist); - -/* set the title in the column title button */ -void gtk_clist_set_column_title (GtkCList *clist, - gint column, - const gchar *title); - -/* returns the title of column. Returns NULL if title is not set */ -gchar * gtk_clist_get_column_title (GtkCList *clist, - gint column); - -/* set a widget instead of a title for the column title button */ -void gtk_clist_set_column_widget (GtkCList *clist, - gint column, - GtkWidget *widget); - -/* returns the column widget */ -GtkWidget * gtk_clist_get_column_widget (GtkCList *clist, - gint column); - -/* set the justification on a column */ -void gtk_clist_set_column_justification (GtkCList *clist, - gint column, - GtkJustification justification); - -/* set visibility of a column */ -void gtk_clist_set_column_visibility (GtkCList *clist, - gint column, - gboolean visible); - -/* enable/disable column resize operations by mouse */ -void gtk_clist_set_column_resizeable (GtkCList *clist, - gint column, - gboolean resizeable); - -/* resize column automatically to its optimal width */ -void gtk_clist_set_column_auto_resize (GtkCList *clist, - gint column, - gboolean auto_resize); - -gint gtk_clist_columns_autosize (GtkCList *clist); - -/* return the optimal column width, i.e. maximum of all cell widths */ -gint gtk_clist_optimal_column_width (GtkCList *clist, - gint column); - -/* set the pixel width of a column; this is a necessary step in - * creating a CList because otherwise the column width is chozen from - * the width of the column title, which will never be right - */ -void gtk_clist_set_column_width (GtkCList *clist, - gint column, - gint width); - -/* set column minimum/maximum width. min/max_width < 0 => no restriction */ -void gtk_clist_set_column_min_width (GtkCList *clist, - gint column, - gint min_width); -void gtk_clist_set_column_max_width (GtkCList *clist, - gint column, - gint max_width); - -/* change the height of the rows, the default (height=0) is - * the hight of the current font. - */ -void gtk_clist_set_row_height (GtkCList *clist, - guint height); - -/* scroll the viewing area of the list to the given column and row; - * row_align and col_align are between 0-1 representing the location the - * row should appear on the screnn, 0.0 being top or left, 1.0 being - * bottom or right; if row or column is -1 then then there is no change - */ -void gtk_clist_moveto (GtkCList *clist, - gint row, - gint column, - gfloat row_align, - gfloat col_align); - -/* returns whether the row is visible */ -GtkVisibility gtk_clist_row_is_visible (GtkCList *clist, - gint row); - -/* returns the cell type */ -GtkCellType gtk_clist_get_cell_type (GtkCList *clist, - gint row, - gint column); - -/* sets a given cell's text, replacing its current contents */ -void gtk_clist_set_text (GtkCList *clist, - gint row, - gint column, - const gchar *text); - -/* for the "get" functions, any of the return pointer can be - * NULL if you are not interested - */ -gint gtk_clist_get_text (GtkCList *clist, - gint row, - gint column, - gchar **text); - -/* sets a given cell's pixmap, replacing its current contents */ -void gtk_clist_set_pixmap (GtkCList *clist, - gint row, - gint column, - GdkPixmap *pixmap, - GdkBitmap *mask); - -gint gtk_clist_get_pixmap (GtkCList *clist, - gint row, - gint column, - GdkPixmap **pixmap, - GdkBitmap **mask); - -/* sets a given cell's pixmap and text, replacing its current contents */ -void gtk_clist_set_pixtext (GtkCList *clist, - gint row, - gint column, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask); - -gint gtk_clist_get_pixtext (GtkCList *clist, - gint row, - gint column, - gchar **text, - guint8 *spacing, - GdkPixmap **pixmap, - GdkBitmap **mask); - -/* sets the foreground color of a row, the color must already - * be allocated - */ -void gtk_clist_set_foreground (GtkCList *clist, - gint row, - const GdkColor *color); - -/* sets the background color of a row, the color must already - * be allocated - */ -void gtk_clist_set_background (GtkCList *clist, - gint row, - const GdkColor *color); - -/* set / get cell styles */ -void gtk_clist_set_cell_style (GtkCList *clist, - gint row, - gint column, - GtkStyle *style); - -GtkStyle *gtk_clist_get_cell_style (GtkCList *clist, - gint row, - gint column); - -void gtk_clist_set_row_style (GtkCList *clist, - gint row, - GtkStyle *style); - -GtkStyle *gtk_clist_get_row_style (GtkCList *clist, - gint row); - -/* this sets a horizontal and vertical shift for drawing - * the contents of a cell; it can be positive or negitive; - * this is particulary useful for indenting items in a column - */ -void gtk_clist_set_shift (GtkCList *clist, - gint row, - gint column, - gint vertical, - gint horizontal); - -/* set/get selectable flag of a single row */ -void gtk_clist_set_selectable (GtkCList *clist, - gint row, - gboolean selectable); -gboolean gtk_clist_get_selectable (GtkCList *clist, - gint row); - -/* prepend/append returns the index of the row you just added, - * making it easier to append and modify a row - */ -gint gtk_clist_prepend (GtkCList *clist, - gchar *text[]); -gint gtk_clist_append (GtkCList *clist, - gchar *text[]); - -/* inserts a row at index row and returns the row where it was - * actually inserted (may be different from "row" in auto_sort mode) - */ -gint gtk_clist_insert (GtkCList *clist, - gint row, - gchar *text[]); - -/* removes row at index row */ -void gtk_clist_remove (GtkCList *clist, - gint row); - -/* sets a arbitrary data pointer for a given row */ -void gtk_clist_set_row_data (GtkCList *clist, - gint row, - gpointer data); - -/* sets a data pointer for a given row with destroy notification */ -void gtk_clist_set_row_data_full (GtkCList *clist, - gint row, - gpointer data, - GDestroyNotify destroy); - -/* returns the data set for a row */ -gpointer gtk_clist_get_row_data (GtkCList *clist, - gint row); - -/* givin a data pointer, find the first (and hopefully only!) - * row that points to that data, or -1 if none do - */ -gint gtk_clist_find_row_from_data (GtkCList *clist, - gpointer data); - -/* force selection of a row */ -void gtk_clist_select_row (GtkCList *clist, - gint row, - gint column); - -/* force unselection of a row */ -void gtk_clist_unselect_row (GtkCList *clist, - gint row, - gint column); - -/* undo the last select/unselect operation */ -void gtk_clist_undo_selection (GtkCList *clist); - -/* clear the entire list -- this is much faster than removing - * each item with gtk_clist_remove - */ -void gtk_clist_clear (GtkCList *clist); - -/* return the row column corresponding to the x and y coordinates, - * the returned values are only valid if the x and y coordinates - * are respectively to a window == clist->clist_window - */ -gint gtk_clist_get_selection_info (GtkCList *clist, - gint x, - gint y, - gint *row, - gint *column); - -/* in multiple or extended mode, select all rows */ -void gtk_clist_select_all (GtkCList *clist); - -/* in all modes except browse mode, deselect all rows */ -void gtk_clist_unselect_all (GtkCList *clist); - -/* swap the position of two rows */ -void gtk_clist_swap_rows (GtkCList *clist, - gint row1, - gint row2); - -/* move row from source_row position to dest_row position */ -void gtk_clist_row_move (GtkCList *clist, - gint source_row, - gint dest_row); - -/* sets a compare function different to the default */ -void gtk_clist_set_compare_func (GtkCList *clist, - GtkCListCompareFunc cmp_func); - -/* the column to sort by */ -void gtk_clist_set_sort_column (GtkCList *clist, - gint column); - -/* how to sort : ascending or descending */ -void gtk_clist_set_sort_type (GtkCList *clist, - GtkSortType sort_type); - -/* sort the list with the current compare function */ -void gtk_clist_sort (GtkCList *clist); - -/* Automatically sort upon insertion */ -void gtk_clist_set_auto_sort (GtkCList *clist, - gboolean auto_sort); - -/* Private function for clist, ctree */ - -PangoLayout *_gtk_clist_create_cell_layout (GtkCList *clist, - GtkCListRow *clist_row, - gint column); - - -G_END_DECLS - - -#endif /* __GTK_CLIST_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkcolorbutton.h b/gtk/gtkcolorbutton.h index 21c1460a40..257eb28a42 100644 --- a/gtk/gtkcolorbutton.h +++ b/gtk/gtkcolorbutton.h @@ -29,7 +29,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcolorsel.c b/gtk/gtkcolorsel.c index d7375c28e2..34d2d4a7d9 100644 --- a/gtk/gtkcolorsel.c +++ b/gtk/gtkcolorsel.c @@ -2270,14 +2270,6 @@ gtk_color_selection_new (void) return GTK_WIDGET (colorsel); } - -void -gtk_color_selection_set_update_policy (GtkColorSelection *colorsel, - GtkUpdateType policy) -{ - g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); -} - /** * gtk_color_selection_get_has_opacity_control: * @colorsel: a #GtkColorSelection. @@ -2458,26 +2450,6 @@ gtk_color_selection_set_current_alpha (GtkColorSelection *colorsel, } /** - * gtk_color_selection_set_color: - * @colorsel: a #GtkColorSelection. - * @color: an array of 4 doubles specifying the red, green, blue and opacity - * to set the current color to. - * - * Sets the current color to be @color. The first time this is called, it will - * also set the original color to be @color too. - * - * Deprecated: 2.0: Use gtk_color_selection_set_current_color() instead. - **/ -void -gtk_color_selection_set_color (GtkColorSelection *colorsel, - gdouble *color) -{ - g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); - - set_color_internal (colorsel, color); -} - -/** * gtk_color_selection_get_current_color: * @colorsel: a #GtkColorSelection. * @color: a #GdkColor to fill in with the current color. @@ -2519,30 +2491,6 @@ gtk_color_selection_get_current_alpha (GtkColorSelection *colorsel) } /** - * gtk_color_selection_get_color: - * @colorsel: a #GtkColorSelection. - * @color: an array of 4 #gdouble to fill in with the current color. - * - * Sets @color to be the current color in the GtkColorSelection widget. - * - * Deprecated: 2.0: Use gtk_color_selection_get_current_color() instead. - **/ -void -gtk_color_selection_get_color (GtkColorSelection *colorsel, - gdouble *color) -{ - ColorSelectionPrivate *priv; - - g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel)); - - priv = colorsel->private_data; - color[0] = priv->color[COLORSEL_RED]; - color[1] = priv->color[COLORSEL_GREEN]; - color[2] = priv->color[COLORSEL_BLUE]; - color[3] = priv->has_opacity ? priv->color[COLORSEL_OPACITY] : 65535; -} - -/** * gtk_color_selection_set_previous_color: * @colorsel: a #GtkColorSelection. * @color: a #GdkColor to set the previous color with. @@ -2831,33 +2779,6 @@ gtk_color_selection_palette_to_string (const GdkColor *colors, } /** - * gtk_color_selection_set_change_palette_hook: - * @func: a function to call when the custom palette needs saving. - * - * Installs a global function to be called whenever the user tries to - * modify the palette in a color selection. This function should save - * the new palette contents, and update the GtkSettings property - * "gtk-color-palette" so all GtkColorSelection widgets will be modified. - * - * Return value: the previous change palette hook (that was replaced). - * - * Deprecated: 2.4: This function does not work in multihead environments. - * Use gtk_color_selection_set_change_palette_with_screen_hook() instead. - * - **/ -GtkColorSelectionChangePaletteFunc -gtk_color_selection_set_change_palette_hook (GtkColorSelectionChangePaletteFunc func) -{ - GtkColorSelectionChangePaletteFunc old; - - old = noscreen_change_palette_hook; - - noscreen_change_palette_hook = func; - - return old; -} - -/** * gtk_color_selection_set_change_palette_with_screen_hook: * @func: a function to call when the custom palette needs saving. * diff --git a/gtk/gtkcolorsel.h b/gtk/gtkcolorsel.h index fedb029588..b99d1266ce 100644 --- a/gtk/gtkcolorsel.h +++ b/gtk/gtkcolorsel.h @@ -25,7 +25,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -112,24 +112,8 @@ gboolean gtk_color_selection_palette_from_string (const gchar *str, gchar* gtk_color_selection_palette_to_string (const GdkColor *colors, gint n_colors); -#ifndef GTK_DISABLE_DEPRECATED -#ifndef GDK_MULTIHEAD_SAFE -GtkColorSelectionChangePaletteFunc gtk_color_selection_set_change_palette_hook (GtkColorSelectionChangePaletteFunc func); -#endif -#endif - GtkColorSelectionChangePaletteWithScreenFunc gtk_color_selection_set_change_palette_with_screen_hook (GtkColorSelectionChangePaletteWithScreenFunc func); -#ifndef GTK_DISABLE_DEPRECATED -/* Deprecated calls: */ -void gtk_color_selection_set_color (GtkColorSelection *colorsel, - gdouble *color); -void gtk_color_selection_get_color (GtkColorSelection *colorsel, - gdouble *color); -void gtk_color_selection_set_update_policy (GtkColorSelection *colorsel, - GtkUpdateType policy); -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_COLOR_SELECTION_H__ */ diff --git a/gtk/gtkcolorseldialog.h b/gtk/gtkcolorseldialog.h index 395883693a..dcde2736d8 100644 --- a/gtk/gtkcolorseldialog.h +++ b/gtk/gtkcolorseldialog.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcombo.c b/gtk/gtkcombo.c deleted file mode 100644 index 69ab413bab..0000000000 --- a/gtk/gtkcombo.c +++ /dev/null @@ -1,1234 +0,0 @@ -/* gtkcombo - combo widget for gtk+ - * Copyright 1997 Paolo Molaro - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* Do NOT, I repeat, NOT, copy any of the code in this file. - * The code here relies on all sorts of internal details of GTK+ - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" -#include <string.h> - -#include <gdk/gdkkeysyms.h> - -#include "gtkarrow.h" -#include "gtklabel.h" -#include "gtklist.h" -#include "gtkentry.h" -#include "gtkeventbox.h" -#include "gtkbutton.h" -#include "gtklistitem.h" -#include "gtkscrolledwindow.h" -#include "gtkmain.h" -#include "gtkwindow.h" -#include "gtkcombo.h" -#include "gtkframe.h" -#include "gtkprivate.h" -#include "gtkintl.h" - -#include "gtkalias.h" - -static const gchar gtk_combo_string_key[] = "gtk-combo-string-value"; - -#define COMBO_LIST_MAX_HEIGHT (400) -#define EMPTY_LIST_HEIGHT (15) - -enum { - PROP_0, - PROP_ENABLE_ARROW_KEYS, - PROP_ENABLE_ARROWS_ALWAYS, - PROP_CASE_SENSITIVE, - PROP_ALLOW_EMPTY, - PROP_VALUE_IN_LIST -}; - -static void gtk_combo_realize (GtkWidget *widget); -static void gtk_combo_unrealize (GtkWidget *widget); -static void gtk_combo_destroy (GtkObject *combo); -static GtkListItem *gtk_combo_find (GtkCombo *combo); -static gchar * gtk_combo_func (GtkListItem *li); -static gboolean gtk_combo_focus_idle (GtkCombo *combo); -static gint gtk_combo_entry_focus_out (GtkEntry *entry, - GdkEventFocus *event, - GtkCombo *combo); -static void gtk_combo_get_pos (GtkCombo *combo, - gint *x, - gint *y, - gint *height, - gint *width); -static void gtk_combo_popup_list (GtkCombo *combo); -static void gtk_combo_popdown_list (GtkCombo *combo); - -static void gtk_combo_activate (GtkWidget *widget, - GtkCombo *combo); -static gboolean gtk_combo_popup_button_press (GtkWidget *button, - GdkEventButton *event, - GtkCombo *combo); -static gboolean gtk_combo_popup_button_leave (GtkWidget *button, - GdkEventCrossing *event, - GtkCombo *combo); -static void gtk_combo_update_entry (GtkCombo *combo); -static void gtk_combo_update_list (GtkEntry *entry, - GtkCombo *combo); -static gint gtk_combo_button_press (GtkWidget *widget, - GdkEvent *event, - GtkCombo *combo); -static void gtk_combo_button_event_after (GtkWidget *widget, - GdkEvent *event, - GtkCombo *combo); -static gint gtk_combo_list_enter (GtkWidget *widget, - GdkEventCrossing *event, - GtkCombo *combo); -static gint gtk_combo_list_key_press (GtkWidget *widget, - GdkEventKey *event, - GtkCombo *combo); -static gint gtk_combo_entry_key_press (GtkEntry *widget, - GdkEventKey *event, - GtkCombo *combo); -static gint gtk_combo_window_key_press (GtkWidget *window, - GdkEventKey *event, - GtkCombo *combo); -static void gtk_combo_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_combo_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_combo_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); - -G_DEFINE_TYPE (GtkCombo, gtk_combo, GTK_TYPE_HBOX) - -static void -gtk_combo_class_init (GtkComboClass * klass) -{ - GObjectClass *gobject_class; - GtkObjectClass *oclass; - GtkWidgetClass *widget_class; - - gobject_class = (GObjectClass *) klass; - oclass = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - - gobject_class->set_property = gtk_combo_set_property; - gobject_class->get_property = gtk_combo_get_property; - - g_object_class_install_property (gobject_class, - PROP_ENABLE_ARROW_KEYS, - g_param_spec_boolean ("enable-arrow-keys", - P_("Enable arrow keys"), - P_("Whether the arrow keys move through the list of items"), - TRUE, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_ENABLE_ARROWS_ALWAYS, - g_param_spec_boolean ("enable-arrows-always", - P_("Always enable arrows"), - P_("Obsolete property, ignored"), - TRUE, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_CASE_SENSITIVE, - g_param_spec_boolean ("case-sensitive", - P_("Case sensitive"), - P_("Whether list item matching is case sensitive"), - FALSE, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_ALLOW_EMPTY, - g_param_spec_boolean ("allow-empty", - P_("Allow empty"), - P_("Whether an empty value may be entered in this field"), - TRUE, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_VALUE_IN_LIST, - g_param_spec_boolean ("value-in-list", - P_("Value in list"), - P_("Whether entered values must already be present in the list"), - FALSE, - GTK_PARAM_READWRITE)); - - - oclass->destroy = gtk_combo_destroy; - - widget_class->size_allocate = gtk_combo_size_allocate; - widget_class->realize = gtk_combo_realize; - widget_class->unrealize = gtk_combo_unrealize; -} - -static void -gtk_combo_destroy (GtkObject *object) -{ - GtkCombo *combo = GTK_COMBO (object); - - if (combo->popwin) - { - gtk_widget_destroy (combo->popwin); - g_object_unref (combo->popwin); - combo->popwin = NULL; - } - - GTK_OBJECT_CLASS (gtk_combo_parent_class)->destroy (object); -} - -static int -gtk_combo_entry_key_press (GtkEntry * entry, GdkEventKey * event, GtkCombo * combo) -{ - GList *li; - guint state = event->state & gtk_accelerator_get_default_mod_mask (); - - /* completion */ - if ((event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab) && - state == GDK_MOD1_MASK) - { - GtkEditable *editable = GTK_EDITABLE (entry); - GCompletion * cmpl; - gchar* prefix; - gchar* nprefix = NULL; - gint pos; - - if ( !GTK_LIST (combo->list)->children ) - return FALSE; - - cmpl = g_completion_new ((GCompletionFunc)gtk_combo_func); - g_completion_add_items (cmpl, GTK_LIST (combo->list)->children); - - pos = gtk_editable_get_position (editable); - prefix = gtk_editable_get_chars (editable, 0, pos); - - g_completion_complete_utf8 (cmpl, prefix, &nprefix); - - if (nprefix && strlen (nprefix) > strlen (prefix)) - { - gtk_editable_insert_text (editable, g_utf8_offset_to_pointer (nprefix, pos), - strlen (nprefix) - strlen (prefix), &pos); - gtk_editable_set_position (editable, pos); - } - - g_free (nprefix); - g_free (prefix); - g_completion_free (cmpl); - - return TRUE; - } - - if ((event->keyval == GDK_Down || event->keyval == GDK_KP_Down) && - state == GDK_MOD1_MASK) - { - gtk_combo_activate (NULL, combo); - return TRUE; - } - - if (!combo->use_arrows || !GTK_LIST (combo->list)->children) - return FALSE; - - gtk_combo_update_list (GTK_ENTRY (combo->entry), combo); - li = g_list_find (GTK_LIST (combo->list)->children, gtk_combo_find (combo)); - - if (((event->keyval == GDK_Up || event->keyval == GDK_KP_Up) && state == 0) || - ((event->keyval == 'p' || event->keyval == 'P') && state == GDK_MOD1_MASK)) - { - if (!li) - li = g_list_last (GTK_LIST (combo->list)->children); - else - li = li->prev; - - if (li) - { - gtk_list_select_child (GTK_LIST (combo->list), GTK_WIDGET (li->data)); - gtk_combo_update_entry (combo); - } - - return TRUE; - } - if (((event->keyval == GDK_Down || event->keyval == GDK_KP_Down) && state == 0) || - ((event->keyval == 'n' || event->keyval == 'N') && state == GDK_MOD1_MASK)) - { - if (!li) - li = GTK_LIST (combo->list)->children; - else if (li) - li = li->next; - if (li) - { - gtk_list_select_child (GTK_LIST (combo->list), GTK_WIDGET (li->data)); - gtk_combo_update_entry (combo); - } - - return TRUE; - } - return FALSE; -} - -static int -gtk_combo_window_key_press (GtkWidget *window, - GdkEventKey *event, - GtkCombo *combo) -{ - guint state = event->state & gtk_accelerator_get_default_mod_mask (); - - if ((event->keyval == GDK_Return || - event->keyval == GDK_ISO_Enter || - event->keyval == GDK_KP_Enter) && - state == 0) - { - gtk_combo_popdown_list (combo); - gtk_combo_update_entry (combo); - - return TRUE; - } - else if ((event->keyval == GDK_Up || event->keyval == GDK_KP_Up) && - state == GDK_MOD1_MASK) - { - gtk_combo_popdown_list (combo); - - return TRUE; - } - else if ((event->keyval == GDK_space || event->keyval == GDK_KP_Space) && - state == 0) - { - gtk_combo_update_entry (combo); - } - - return FALSE; -} - -static GtkListItem * -gtk_combo_find (GtkCombo * combo) -{ - const gchar *text; - GtkListItem *found = NULL; - gchar *ltext; - gchar *compare_text; - GList *clist; - - text = gtk_entry_get_text (GTK_ENTRY (combo->entry)); - if (combo->case_sensitive) - compare_text = (gchar *)text; - else - compare_text = g_utf8_casefold (text, -1); - - for (clist = GTK_LIST (combo->list)->children; - !found && clist; - clist = clist->next) - { - ltext = gtk_combo_func (GTK_LIST_ITEM (clist->data)); - if (!ltext) - continue; - - if (!combo->case_sensitive) - ltext = g_utf8_casefold (ltext, -1); - - if (strcmp (ltext, compare_text) == 0) - found = clist->data; - - if (!combo->case_sensitive) - g_free (ltext); - } - - if (!combo->case_sensitive) - g_free (compare_text); - - return found; -} - -static gchar * -gtk_combo_func (GtkListItem * li) -{ - GtkWidget *label; - gchar *ltext = NULL; - - ltext = g_object_get_data (G_OBJECT (li), I_(gtk_combo_string_key)); - if (!ltext) - { - label = GTK_BIN (li)->child; - if (!label || !GTK_IS_LABEL (label)) - return NULL; - ltext = (gchar *) gtk_label_get_text (GTK_LABEL (label)); - } - return ltext; -} - -static gint -gtk_combo_focus_idle (GtkCombo * combo) -{ - if (combo) - { - GDK_THREADS_ENTER (); - gtk_widget_grab_focus (combo->entry); - GDK_THREADS_LEAVE (); - } - return FALSE; -} - -static gint -gtk_combo_entry_focus_out (GtkEntry * entry, GdkEventFocus * event, GtkCombo * combo) -{ - - if (combo->value_in_list && !gtk_combo_find (combo)) - { - GSource *focus_idle; - - /* gdk_beep(); *//* this can be annoying */ - if (combo->ok_if_empty && !strcmp (gtk_entry_get_text (entry), "")) - return FALSE; -#ifdef TEST - printf ("INVALID ENTRY: `%s'\n", gtk_entry_get_text (entry)); -#endif - gtk_grab_add (GTK_WIDGET (combo)); - /* this is needed because if we call gtk_widget_grab_focus() - it isn't guaranteed it's the *last* call before the main-loop, - so the focus can be lost anyway... - the signal_stop_emission doesn't seem to work either... - */ - focus_idle = g_idle_source_new (); - g_source_set_closure (focus_idle, - g_cclosure_new_object (G_CALLBACK (gtk_combo_focus_idle), - G_OBJECT (combo))); - g_source_attach (focus_idle, NULL); - g_source_unref (focus_idle); - - /*g_signal_stop_emission_by_name (entry, "focus_out_event"); */ - return TRUE; - } - return FALSE; -} - -static void -gtk_combo_get_pos (GtkCombo * combo, gint * x, gint * y, gint * height, gint * width) -{ - GtkBin *popwin; - GtkWidget *widget; - GtkScrolledWindow *popup; - - gint real_height; - GtkRequisition list_requisition; - gboolean show_hscroll = FALSE; - gboolean show_vscroll = FALSE; - gint avail_height; - gint min_height; - gint alloc_width; - gint work_height; - gint old_height; - gint old_width; - gint scrollbar_spacing; - - widget = GTK_WIDGET (combo); - popup = GTK_SCROLLED_WINDOW (combo->popup); - popwin = GTK_BIN (combo->popwin); - - scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (popup); - - gdk_window_get_origin (combo->entry->window, x, y); - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) - *x -= widget->allocation.width - combo->entry->allocation.width; - real_height = MIN (combo->entry->requisition.height, - combo->entry->allocation.height); - *y += real_height; - avail_height = gdk_screen_get_height (gtk_widget_get_screen (widget)) - *y; - - gtk_widget_size_request (combo->list, &list_requisition); - min_height = MIN (list_requisition.height, - popup->vscrollbar->requisition.height); - if (!GTK_LIST (combo->list)->children) - list_requisition.height += EMPTY_LIST_HEIGHT; - - alloc_width = (widget->allocation.width - - 2 * popwin->child->style->xthickness - - 2 * GTK_CONTAINER (popwin->child)->border_width - - 2 * GTK_CONTAINER (combo->popup)->border_width - - 2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width - - 2 * GTK_BIN (popup)->child->style->xthickness); - - work_height = (2 * popwin->child->style->ythickness + - 2 * GTK_CONTAINER (popwin->child)->border_width + - 2 * GTK_CONTAINER (combo->popup)->border_width + - 2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width + - 2 * GTK_BIN (popup)->child->style->ythickness); - - do - { - old_width = alloc_width; - old_height = work_height; - - if (!show_hscroll && - alloc_width < list_requisition.width) - { - GtkRequisition requisition; - - gtk_widget_size_request (popup->hscrollbar, &requisition); - work_height += (requisition.height + scrollbar_spacing); - - show_hscroll = TRUE; - } - if (!show_vscroll && - work_height + list_requisition.height > avail_height) - { - GtkRequisition requisition; - - if (work_height + min_height > avail_height && - *y - real_height > avail_height) - { - *y -= (work_height + list_requisition.height + real_height); - break; - } - gtk_widget_size_request (popup->hscrollbar, &requisition); - alloc_width -= (requisition.width + scrollbar_spacing); - show_vscroll = TRUE; - } - } while (old_width != alloc_width || old_height != work_height); - - *width = widget->allocation.width; - if (show_vscroll) - *height = avail_height; - else - *height = work_height + list_requisition.height; - - if (*x < 0) - *x = 0; -} - -static void -gtk_combo_popup_list (GtkCombo *combo) -{ - GtkWidget *toplevel; - GtkList *list; - gint height, width, x, y; - gint old_width, old_height; - - old_width = combo->popwin->allocation.width; - old_height = combo->popwin->allocation.height; - - gtk_combo_get_pos (combo, &x, &y, &height, &width); - - /* workaround for gtk_scrolled_window_size_allocate bug */ - if (old_width != width || old_height != height) - { - gtk_widget_hide (GTK_SCROLLED_WINDOW (combo->popup)->hscrollbar); - gtk_widget_hide (GTK_SCROLLED_WINDOW (combo->popup)->vscrollbar); - } - - gtk_combo_update_list (GTK_ENTRY (combo->entry), combo); - - /* We need to make sure some child of combo->popwin - * is focused to disable GtkWindow's automatic - * "focus-the-first-item" code. If there is no selected - * child, we focus the list itself with some hackery. - */ - list = GTK_LIST (combo->list); - - if (list->selection) - { - gtk_widget_grab_focus (list->selection->data); - } - else - { - gtk_widget_set_can_focus (GTK_WIDGET (list), TRUE); - gtk_widget_grab_focus (combo->list); - GTK_LIST (combo->list)->last_focus_child = NULL; - gtk_widget_set_can_focus (GTK_WIDGET (list), FALSE); - } - - gtk_window_move (GTK_WINDOW (combo->popwin), x, y); - - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (combo)); - - if (GTK_IS_WINDOW (toplevel)) - { - gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), - GTK_WINDOW (combo->popwin)); - gtk_window_set_transient_for (GTK_WINDOW (combo->popwin), GTK_WINDOW (toplevel)); - } - - gtk_widget_set_size_request (combo->popwin, width, height); - gtk_widget_show (combo->popwin); - - gtk_widget_grab_focus (combo->popwin); -} - -static void -gtk_combo_popdown_list (GtkCombo *combo) -{ - combo->current_button = 0; - - if (GTK_BUTTON (combo->button)->in_button) - { - GTK_BUTTON (combo->button)->in_button = FALSE; - g_signal_emit_by_name (combo->button, "released"); - } - - if (GTK_WIDGET_HAS_GRAB (combo->popwin)) - { - gtk_grab_remove (combo->popwin); - gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (combo)), - gtk_get_current_event_time ()); - gdk_display_keyboard_ungrab (gtk_widget_get_display (GTK_WIDGET (combo)), - gtk_get_current_event_time ()); - } - - gtk_widget_hide (combo->popwin); - - gtk_window_group_add_window (gtk_window_get_group (NULL), GTK_WINDOW (combo->popwin)); -} - -static gboolean -popup_grab_on_window (GdkWindow *window, - guint32 activate_time) -{ - if ((gdk_pointer_grab (window, TRUE, - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_POINTER_MOTION_MASK, - NULL, NULL, activate_time) == 0)) - { - if (gdk_keyboard_grab (window, TRUE, - activate_time) == 0) - return TRUE; - else - { - gdk_display_pointer_ungrab (gdk_drawable_get_display (window), - activate_time); - return FALSE; - } - } - - return FALSE; -} - -static void -gtk_combo_activate (GtkWidget *widget, - GtkCombo *combo) -{ - if (!combo->button->window || - !popup_grab_on_window (combo->button->window, - gtk_get_current_event_time ())) - return; - - gtk_combo_popup_list (combo); - - /* This must succeed since we already have the grab */ - popup_grab_on_window (combo->popwin->window, - gtk_get_current_event_time ()); - - if (!gtk_widget_has_focus (combo->entry)) - gtk_widget_grab_focus (combo->entry); - - gtk_grab_add (combo->popwin); -} - -static gboolean -gtk_combo_popup_button_press (GtkWidget *button, - GdkEventButton *event, - GtkCombo *combo) -{ - if (!gtk_widget_has_focus (combo->entry)) - gtk_widget_grab_focus (combo->entry); - - if (event->button != 1) - return FALSE; - - if (!popup_grab_on_window (combo->button->window, - gtk_get_current_event_time ())) - return FALSE; - - combo->current_button = event->button; - - gtk_combo_popup_list (combo); - - /* This must succeed since we already have the grab */ - popup_grab_on_window (combo->popwin->window, - gtk_get_current_event_time ()); - - g_signal_emit_by_name (button, "depressed"); - - gtk_grab_add (combo->popwin); - - return TRUE; -} - -static gboolean -gtk_combo_popup_button_leave (GtkWidget *button, - GdkEventCrossing *event, - GtkCombo *combo) -{ - /* The idea here is that we want to keep the button down if the - * popup is popped up. - */ - return combo->current_button != 0; -} - -static void -gtk_combo_update_entry (GtkCombo * combo) -{ - GtkList *list = GTK_LIST (combo->list); - char *text; - - g_signal_handler_block (list, combo->list_change_id); - if (list->selection) - { - text = gtk_combo_func (GTK_LIST_ITEM (list->selection->data)); - if (!text) - text = ""; - gtk_entry_set_text (GTK_ENTRY (combo->entry), text); - } - g_signal_handler_unblock (list, combo->list_change_id); -} - -static void -gtk_combo_selection_changed (GtkList *list, - GtkCombo *combo) -{ - if (!gtk_widget_get_visible (combo->popwin)) - gtk_combo_update_entry (combo); -} - -static void -gtk_combo_update_list (GtkEntry * entry, GtkCombo * combo) -{ - GtkList *list = GTK_LIST (combo->list); - GList *slist = list->selection; - GtkListItem *li; - - gtk_grab_remove (GTK_WIDGET (combo)); - - g_signal_handler_block (entry, combo->entry_change_id); - if (slist && slist->data) - gtk_list_unselect_child (list, GTK_WIDGET (slist->data)); - li = gtk_combo_find (combo); - if (li) - gtk_list_select_child (list, GTK_WIDGET (li)); - g_signal_handler_unblock (entry, combo->entry_change_id); -} - -static gint -gtk_combo_button_press (GtkWidget * widget, GdkEvent * event, GtkCombo * combo) -{ - GtkWidget *child; - - child = gtk_get_event_widget (event); - - /* We don't ask for button press events on the grab widget, so - * if an event is reported directly to the grab widget, it must - * be on a window outside the application (and thus we remove - * the popup window). Otherwise, we check if the widget is a child - * of the grab widget, and only remove the popup window if it - * is not. - */ - if (child != widget) - { - while (child) - { - if (child == widget) - return FALSE; - child = child->parent; - } - } - - gtk_combo_popdown_list (combo); - - return TRUE; -} - -static gboolean -is_within (GtkWidget *widget, - GtkWidget *ancestor) -{ - return widget == ancestor || gtk_widget_is_ancestor (widget, ancestor); -} - -static void -gtk_combo_button_event_after (GtkWidget *widget, - GdkEvent *event, - GtkCombo *combo) -{ - GtkWidget *child; - - if (event->type != GDK_BUTTON_RELEASE) - return; - - child = gtk_get_event_widget ((GdkEvent*) event); - - if ((combo->current_button != 0) && (event->button.button == 1)) - { - /* This was the initial button press */ - - combo->current_button = 0; - - /* Check to see if we released inside the button */ - if (child && is_within (child, combo->button)) - { - gtk_grab_add (combo->popwin); - gdk_pointer_grab (combo->popwin->window, TRUE, - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_POINTER_MOTION_MASK, - NULL, NULL, GDK_CURRENT_TIME); - return; - } - } - - if (is_within (child, combo->list)) - gtk_combo_update_entry (combo); - - gtk_combo_popdown_list (combo); - -} - -static void -find_child_foreach (GtkWidget *widget, - gpointer data) -{ - GdkEventButton *event = data; - - if (!event->window) - { - if (event->x >= widget->allocation.x && - event->x < widget->allocation.x + widget->allocation.width && - event->y >= widget->allocation.y && - event->y < widget->allocation.y + widget->allocation.height) - event->window = g_object_ref (widget->window); - } -} - -static void -find_child_window (GtkContainer *container, - GdkEventButton *event) -{ - gtk_container_foreach (container, find_child_foreach, event); -} - -static gint -gtk_combo_list_enter (GtkWidget *widget, - GdkEventCrossing *event, - GtkCombo *combo) -{ - GtkWidget *event_widget; - - event_widget = gtk_get_event_widget ((GdkEvent*) event); - - if ((event_widget == combo->list) && - (combo->current_button != 0) && - (!GTK_WIDGET_HAS_GRAB (combo->list))) - { - GdkEvent *tmp_event = gdk_event_new (GDK_BUTTON_PRESS); - gint x, y; - GdkModifierType mask; - - gtk_grab_remove (combo->popwin); - - /* Transfer the grab over to the list by synthesizing - * a button press event - */ - gdk_window_get_pointer (combo->list->window, &x, &y, &mask); - - tmp_event->button.send_event = TRUE; - tmp_event->button.time = GDK_CURRENT_TIME; /* bad */ - tmp_event->button.x = x; - tmp_event->button.y = y; - /* We leave all the XInput fields unfilled here, in the expectation - * that GtkList doesn't care. - */ - tmp_event->button.button = combo->current_button; - tmp_event->button.state = mask; - - find_child_window (GTK_CONTAINER (combo->list), &tmp_event->button); - if (!tmp_event->button.window) - { - GtkWidget *child; - - if (GTK_LIST (combo->list)->children) - child = GTK_LIST (combo->list)->children->data; - else - child = combo->list; - - tmp_event->button.window = g_object_ref (child->window); - } - - gtk_widget_event (combo->list, tmp_event); - gdk_event_free (tmp_event); - } - - return FALSE; -} - -static int -gtk_combo_list_key_press (GtkWidget * widget, GdkEventKey * event, GtkCombo * combo) -{ - guint state = event->state & gtk_accelerator_get_default_mod_mask (); - - if (event->keyval == GDK_Escape && state == 0) - { - if (GTK_WIDGET_HAS_GRAB (combo->list)) - gtk_list_end_drag_selection (GTK_LIST (combo->list)); - - gtk_combo_popdown_list (combo); - - return TRUE; - } - return FALSE; -} - -static void -combo_event_box_realize (GtkWidget *widget) -{ - GdkCursor *cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), - GDK_TOP_LEFT_ARROW); - gdk_window_set_cursor (widget->window, cursor); - gdk_cursor_unref (cursor); -} - -static void -gtk_combo_init (GtkCombo * combo) -{ - GtkWidget *arrow; - GtkWidget *frame; - GtkWidget *event_box; - - combo->case_sensitive = FALSE; - combo->value_in_list = FALSE; - combo->ok_if_empty = TRUE; - combo->use_arrows = TRUE; - combo->use_arrows_always = TRUE; - combo->entry = gtk_entry_new (); - combo->button = gtk_button_new (); - combo->current_button = 0; - arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); - gtk_widget_show (arrow); - gtk_container_add (GTK_CONTAINER (combo->button), arrow); - gtk_box_pack_start (GTK_BOX (combo), combo->entry, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (combo), combo->button, FALSE, FALSE, 0); - gtk_widget_set_can_focus (combo->button, FALSE); - gtk_widget_show (combo->entry); - gtk_widget_show (combo->button); - combo->entry_change_id = g_signal_connect (combo->entry, "changed", - G_CALLBACK (gtk_combo_update_list), - combo); - g_signal_connect_after (combo->entry, "key-press-event", - G_CALLBACK (gtk_combo_entry_key_press), combo); - g_signal_connect_after (combo->entry, "focus-out-event", - G_CALLBACK (gtk_combo_entry_focus_out), combo); - combo->activate_id = g_signal_connect (combo->entry, "activate", - G_CALLBACK (gtk_combo_activate), - combo); - g_signal_connect (combo->button, "button-press-event", - G_CALLBACK (gtk_combo_popup_button_press), combo); - g_signal_connect (combo->button, "leave-notify-event", - G_CALLBACK (gtk_combo_popup_button_leave), combo); - - combo->popwin = gtk_window_new (GTK_WINDOW_POPUP); - gtk_widget_set_name (combo->popwin, "gtk-combo-popup-window"); - gtk_window_set_type_hint (GTK_WINDOW (combo->popwin), GDK_WINDOW_TYPE_HINT_COMBO); - g_object_ref (combo->popwin); - gtk_window_set_resizable (GTK_WINDOW (combo->popwin), FALSE); - - g_signal_connect (combo->popwin, "key-press-event", - G_CALLBACK (gtk_combo_window_key_press), combo); - - gtk_widget_set_events (combo->popwin, GDK_KEY_PRESS_MASK); - - event_box = gtk_event_box_new (); - gtk_container_add (GTK_CONTAINER (combo->popwin), event_box); - g_signal_connect (event_box, "realize", - G_CALLBACK (combo_event_box_realize), NULL); - gtk_widget_show (event_box); - - - frame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (event_box), frame); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_widget_show (frame); - - combo->popup = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (combo->popup), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_widget_set_can_focus (GTK_SCROLLED_WINDOW (combo->popup)->hscrollbar, FALSE); - gtk_widget_set_can_focus (GTK_SCROLLED_WINDOW (combo->popup)->vscrollbar, FALSE); - gtk_container_add (GTK_CONTAINER (frame), combo->popup); - gtk_widget_show (combo->popup); - - combo->list = gtk_list_new (); - /* We'll use enter notify events to figure out when to transfer - * the grab to the list - */ - gtk_widget_set_events (combo->list, GDK_ENTER_NOTIFY_MASK); - - gtk_list_set_selection_mode (GTK_LIST(combo->list), GTK_SELECTION_BROWSE); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (combo->popup), combo->list); - gtk_container_set_focus_vadjustment (GTK_CONTAINER (combo->list), - gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (combo->popup))); - gtk_container_set_focus_hadjustment (GTK_CONTAINER (combo->list), - gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (combo->popup))); - gtk_widget_show (combo->list); - - combo->list_change_id = g_signal_connect (combo->list, "selection-changed", - G_CALLBACK (gtk_combo_selection_changed), combo); - - g_signal_connect (combo->popwin, "key-press-event", - G_CALLBACK (gtk_combo_list_key_press), combo); - g_signal_connect (combo->popwin, "button-press-event", - G_CALLBACK (gtk_combo_button_press), combo); - - g_signal_connect (combo->popwin, "event-after", - G_CALLBACK (gtk_combo_button_event_after), combo); - g_signal_connect (combo->list, "event-after", - G_CALLBACK (gtk_combo_button_event_after), combo); - - g_signal_connect (combo->list, "enter-notify-event", - G_CALLBACK (gtk_combo_list_enter), combo); -} - -static void -gtk_combo_realize (GtkWidget *widget) -{ - GtkCombo *combo = GTK_COMBO (widget); - - gtk_window_set_screen (GTK_WINDOW (combo->popwin), - gtk_widget_get_screen (widget)); - - GTK_WIDGET_CLASS (gtk_combo_parent_class)->realize (widget); -} - -static void -gtk_combo_unrealize (GtkWidget *widget) -{ - GtkCombo *combo = GTK_COMBO (widget); - - gtk_combo_popdown_list (combo); - gtk_widget_unrealize (combo->popwin); - - GTK_WIDGET_CLASS (gtk_combo_parent_class)->unrealize (widget); -} - -GtkWidget* -gtk_combo_new (void) -{ - return g_object_new (GTK_TYPE_COMBO, NULL); -} - -void -gtk_combo_set_value_in_list (GtkCombo * combo, gboolean val, gboolean ok_if_empty) -{ - g_return_if_fail (GTK_IS_COMBO (combo)); - val = val != FALSE; - ok_if_empty = ok_if_empty != FALSE; - - g_object_freeze_notify (G_OBJECT (combo)); - if (combo->value_in_list != val) - { - combo->value_in_list = val; - g_object_notify (G_OBJECT (combo), "value-in-list"); - } - if (combo->ok_if_empty != ok_if_empty) - { - combo->ok_if_empty = ok_if_empty; - g_object_notify (G_OBJECT (combo), "allow-empty"); - } - g_object_thaw_notify (G_OBJECT (combo)); -} - -void -gtk_combo_set_case_sensitive (GtkCombo * combo, gboolean val) -{ - g_return_if_fail (GTK_IS_COMBO (combo)); - val = val != FALSE; - - if (combo->case_sensitive != val) - { - combo->case_sensitive = val; - g_object_notify (G_OBJECT (combo), "case-sensitive"); - } -} - -void -gtk_combo_set_use_arrows (GtkCombo * combo, gboolean val) -{ - g_return_if_fail (GTK_IS_COMBO (combo)); - val = val != FALSE; - - if (combo->use_arrows != val) - { - combo->use_arrows = val; - g_object_notify (G_OBJECT (combo), "enable-arrow-keys"); - } -} - -void -gtk_combo_set_use_arrows_always (GtkCombo * combo, gboolean val) -{ - g_return_if_fail (GTK_IS_COMBO (combo)); - val = val != FALSE; - - if (combo->use_arrows_always != val) - { - g_object_freeze_notify (G_OBJECT (combo)); - combo->use_arrows_always = val; - g_object_notify (G_OBJECT (combo), "enable-arrows-always"); - - if (combo->use_arrows != TRUE) - { - combo->use_arrows = TRUE; - g_object_notify (G_OBJECT (combo), "enable-arrow-keys"); - } - g_object_thaw_notify (G_OBJECT (combo)); - } -} - -void -gtk_combo_set_popdown_strings (GtkCombo *combo, - GList *strings) -{ - GList *list; - GtkWidget *li; - - g_return_if_fail (GTK_IS_COMBO (combo)); - - gtk_combo_popdown_list (combo); - - gtk_list_clear_items (GTK_LIST (combo->list), 0, -1); - list = strings; - while (list) - { - li = gtk_list_item_new_with_label ((gchar *) list->data); - gtk_widget_show (li); - gtk_container_add (GTK_CONTAINER (combo->list), li); - list = list->next; - } -} - -void -gtk_combo_set_item_string (GtkCombo *combo, - GtkItem *item, - const gchar *item_value) -{ - g_return_if_fail (GTK_IS_COMBO (combo)); - g_return_if_fail (item != NULL); - - g_object_set_data_full (G_OBJECT (item), I_(gtk_combo_string_key), - g_strdup (item_value), g_free); -} - -static void -gtk_combo_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkCombo *combo = GTK_COMBO (widget); - - GTK_WIDGET_CLASS (gtk_combo_parent_class)->size_allocate (widget, allocation); - - if (combo->entry->allocation.height > combo->entry->requisition.height) - { - GtkAllocation button_allocation; - - button_allocation = combo->button->allocation; - button_allocation.height = combo->entry->requisition.height; - button_allocation.y = combo->entry->allocation.y + - (combo->entry->allocation.height - combo->entry->requisition.height) - / 2; - gtk_widget_size_allocate (combo->button, &button_allocation); - } -} - -void -gtk_combo_disable_activate (GtkCombo *combo) -{ - g_return_if_fail (GTK_IS_COMBO (combo)); - - if ( combo->activate_id ) { - g_signal_handler_disconnect (combo->entry, combo->activate_id); - combo->activate_id = 0; - } -} - -static void -gtk_combo_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkCombo *combo = GTK_COMBO (object); - - switch (prop_id) - { - case PROP_ENABLE_ARROW_KEYS: - gtk_combo_set_use_arrows (combo, g_value_get_boolean (value)); - break; - case PROP_ENABLE_ARROWS_ALWAYS: - gtk_combo_set_use_arrows_always (combo, g_value_get_boolean (value)); - break; - case PROP_CASE_SENSITIVE: - gtk_combo_set_case_sensitive (combo, g_value_get_boolean (value)); - break; - case PROP_ALLOW_EMPTY: - combo->ok_if_empty = g_value_get_boolean (value); - break; - case PROP_VALUE_IN_LIST: - combo->value_in_list = g_value_get_boolean (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - -} - -static void -gtk_combo_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkCombo *combo = GTK_COMBO (object); - - switch (prop_id) - { - case PROP_ENABLE_ARROW_KEYS: - g_value_set_boolean (value, combo->use_arrows); - break; - case PROP_ENABLE_ARROWS_ALWAYS: - g_value_set_boolean (value, combo->use_arrows_always); - break; - case PROP_CASE_SENSITIVE: - g_value_set_boolean (value, combo->case_sensitive); - break; - case PROP_ALLOW_EMPTY: - g_value_set_boolean (value, combo->ok_if_empty); - break; - case PROP_VALUE_IN_LIST: - g_value_set_boolean (value, combo->value_in_list); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - -} - -#define __GTK_SMART_COMBO_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkcombo.h b/gtk/gtkcombo.h deleted file mode 100644 index c9c8b930c0..0000000000 --- a/gtk/gtkcombo.h +++ /dev/null @@ -1,118 +0,0 @@ -/* gtkcombo - combo widget for gtk+ - * Copyright 1997 Paolo Molaro - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_SMART_COMBO_H__ -#define __GTK_SMART_COMBO_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_COMBO (gtk_combo_get_type ()) -#define GTK_COMBO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_COMBO, GtkCombo)) -#define GTK_COMBO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_COMBO, GtkComboClass)) -#define GTK_IS_COMBO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_COMBO)) -#define GTK_IS_COMBO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COMBO)) -#define GTK_COMBO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COMBO, GtkComboClass)) - - -typedef struct _GtkCombo GtkCombo; -typedef struct _GtkComboClass GtkComboClass; - -/* you should access only the entry and list fields directly */ -struct _GtkCombo { - GtkHBox hbox; - - /*< public >*/ - GtkWidget *entry; - - /*< private >*/ - GtkWidget *button; - GtkWidget *popup; - GtkWidget *popwin; - - /*< public >*/ - GtkWidget *list; - - /*< private >*/ - guint entry_change_id; - guint list_change_id; /* unused */ - - guint value_in_list:1; - guint ok_if_empty:1; - guint case_sensitive:1; - guint use_arrows:1; - guint use_arrows_always:1; - - guint16 current_button; - guint activate_id; -}; - -struct _GtkComboClass { - GtkHBoxClass parent_class; - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - -GType gtk_combo_get_type (void) G_GNUC_CONST; - -GtkWidget* gtk_combo_new (void); -/* the text in the entry must be or not be in the list */ -void gtk_combo_set_value_in_list (GtkCombo* combo, - gboolean val, - gboolean ok_if_empty); -/* set/unset arrows working for changing the value (can be annoying) */ -void gtk_combo_set_use_arrows (GtkCombo* combo, - gboolean val); -/* up/down arrows change value if current value not in list */ -void gtk_combo_set_use_arrows_always (GtkCombo* combo, - gboolean val); -/* perform case-sensitive compares */ -void gtk_combo_set_case_sensitive (GtkCombo* combo, - gboolean val); -/* call this function on an item if it isn't a label or you - want it to have a different value to be displayed in the entry */ -void gtk_combo_set_item_string (GtkCombo* combo, - GtkItem* item, - const gchar* item_value); -/* simple interface */ -void gtk_combo_set_popdown_strings (GtkCombo* combo, - GList *strings); - -void gtk_combo_disable_activate (GtkCombo* combo); - -G_END_DECLS - -#endif /* __GTK_SMART_COMBO_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkcombobox.h b/gtk/gtkcombobox.h index 963e4b415b..cbe40f9ca5 100644 --- a/gtk/gtkcombobox.h +++ b/gtk/gtkcombobox.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcomboboxentry.h b/gtk/gtkcomboboxentry.h index 81c5aec1f5..c8820c56b5 100644 --- a/gtk/gtkcomboboxentry.h +++ b/gtk/gtkcomboboxentry.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index 2fa7c22b69..3e1fa7528e 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -1538,55 +1538,6 @@ struct _GtkForeachData gpointer callback_data; }; -static void -gtk_container_foreach_unmarshal (GtkWidget *child, - gpointer data) -{ - GtkForeachData *fdata = (GtkForeachData*) data; - GtkArg args[2]; - - /* first argument */ - args[0].name = NULL; - args[0].type = G_TYPE_FROM_INSTANCE (child); - GTK_VALUE_OBJECT (args[0]) = GTK_OBJECT (child); - - /* location for return value */ - args[1].name = NULL; - args[1].type = G_TYPE_NONE; - - fdata->callback (fdata->container, fdata->callback_data, 1, args); -} - -void -gtk_container_foreach_full (GtkContainer *container, - GtkCallback callback, - GtkCallbackMarshal marshal, - gpointer callback_data, - GDestroyNotify notify) -{ - g_return_if_fail (GTK_IS_CONTAINER (container)); - - if (marshal) - { - GtkForeachData fdata; - - fdata.container = GTK_OBJECT (container); - fdata.callback = marshal; - fdata.callback_data = callback_data; - - gtk_container_foreach (container, gtk_container_foreach_unmarshal, &fdata); - } - else - { - g_return_if_fail (callback != NULL); - - gtk_container_foreach (container, callback, &callback_data); - } - - if (notify) - notify (callback_data); -} - /** * gtk_container_set_focus_child: * @container: a #GtkContainer diff --git a/gtk/gtkcontainer.h b/gtk/gtkcontainer.h index 0bf30b9a2f..a1c3a52068 100644 --- a/gtk/gtkcontainer.h +++ b/gtk/gtkcontainer.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -122,19 +122,8 @@ void gtk_container_check_resize (GtkContainer *container); void gtk_container_foreach (GtkContainer *container, GtkCallback callback, gpointer callback_data); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_container_foreach_full (GtkContainer *container, - GtkCallback callback, - GtkCallbackMarshal marshal, - gpointer callback_data, - GDestroyNotify notify); -#endif /* GTK_DISABLE_DEPRECATED */ GList* gtk_container_get_children (GtkContainer *container); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_container_children gtk_container_get_children -#endif - void gtk_container_propagate_expose (GtkContainer *container, GtkWidget *child, GdkEventExpose *event); @@ -220,9 +209,6 @@ GList *_gtk_container_focus_sort (GtkContainer *container, GtkDirectionType direction, GtkWidget *old_focus); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_container_border_width gtk_container_set_border_width -#endif /* GTK_DISABLE_DEPRECATED */ G_END_DECLS diff --git a/gtk/gtkctree.c b/gtk/gtkctree.c deleted file mode 100644 index bd4175c61d..0000000000 --- a/gtk/gtkctree.c +++ /dev/null @@ -1,6144 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald, - * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org> - * - * GtkCTree widget for GTK+ - * Copyright (C) 1998 Lars Hamann and Stefan Jeske - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" -#include <stdlib.h> - -#undef GTK_DISABLE_DEPRECATED -#define __GTK_CTREE_C__ - -#include "gtkctree.h" -#include "gtkbindings.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtkdnd.h" -#include "gtkintl.h" -#include <gdk/gdkkeysyms.h> - -#include "gtkalias.h" - -#define PM_SIZE 8 -#define TAB_SIZE (PM_SIZE + 6) -#define CELL_SPACING 1 -#define CLIST_OPTIMUM_SIZE 64 -#define COLUMN_INSET 3 -#define DRAG_WIDTH 6 - -#define ROW_TOP_YPIXEL(clist, row) (((clist)->row_height * (row)) + \ - (((row) + 1) * CELL_SPACING) + \ - (clist)->voffset) -#define ROW_FROM_YPIXEL(clist, y) (((y) - (clist)->voffset) / \ - ((clist)->row_height + CELL_SPACING)) -#define COLUMN_LEFT_XPIXEL(clist, col) ((clist)->column[(col)].area.x \ - + (clist)->hoffset) -#define COLUMN_LEFT(clist, column) ((clist)->column[(column)].area.x) - -static inline gint -COLUMN_FROM_XPIXEL (GtkCList * clist, - gint x) -{ - gint i, cx; - - for (i = 0; i < clist->columns; i++) - if (clist->column[i].visible) - { - cx = clist->column[i].area.x + clist->hoffset; - - if (x >= (cx - (COLUMN_INSET + CELL_SPACING)) && - x <= (cx + clist->column[i].area.width + COLUMN_INSET)) - return i; - } - - /* no match */ - return -1; -} - -#define CLIST_UNFROZEN(clist) (((GtkCList*) (clist))->freeze_count == 0) -#define CLIST_REFRESH(clist) G_STMT_START { \ - if (CLIST_UNFROZEN (clist)) \ - GTK_CLIST_GET_CLASS (clist)->refresh ((GtkCList*) (clist)); \ -} G_STMT_END - - -enum { - ARG_0, - ARG_N_COLUMNS, - ARG_TREE_COLUMN, - ARG_INDENT, - ARG_SPACING, - ARG_SHOW_STUB, - ARG_LINE_STYLE, - ARG_EXPANDER_STYLE -}; - - -static void gtk_ctree_class_init (GtkCTreeClass *klass); -static void gtk_ctree_init (GtkCTree *ctree); -static GObject* gtk_ctree_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_params); -static void gtk_ctree_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_ctree_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_ctree_realize (GtkWidget *widget); -static void gtk_ctree_unrealize (GtkWidget *widget); -static gint gtk_ctree_button_press (GtkWidget *widget, - GdkEventButton *event); -static void ctree_attach_styles (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void ctree_detach_styles (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static gint draw_cell_pixmap (GdkWindow *window, - GdkRectangle *clip_rectangle, - GdkGC *fg_gc, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint x, - gint y, - gint width, - gint height); -static void get_cell_style (GtkCList *clist, - GtkCListRow *clist_row, - gint state, - gint column, - GtkStyle **style, - GdkGC **fg_gc, - GdkGC **bg_gc); -static gint gtk_ctree_draw_expander (GtkCTree *ctree, - GtkCTreeRow *ctree_row, - GtkStyle *style, - GdkRectangle *clip_rectangle, - gint x); -static gint gtk_ctree_draw_lines (GtkCTree *ctree, - GtkCTreeRow *ctree_row, - gint row, - gint column, - gint state, - GdkRectangle *clip_rectangle, - GdkRectangle *cell_rectangle, - GdkRectangle *crect, - GdkRectangle *area, - GtkStyle *style); -static void draw_row (GtkCList *clist, - GdkRectangle *area, - gint row, - GtkCListRow *clist_row); -static void draw_drag_highlight (GtkCList *clist, - GtkCListRow *dest_row, - gint dest_row_number, - GtkCListDragPos drag_pos); -static void tree_draw_node (GtkCTree *ctree, - GtkCTreeNode *node); -static void set_cell_contents (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkCellType type, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask); -static void set_node_info (GtkCTree *ctree, - GtkCTreeNode *node, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap_closed, - GdkBitmap *mask_closed, - GdkPixmap *pixmap_opened, - GdkBitmap *mask_opened, - gboolean is_leaf, - gboolean expanded); -static GtkCTreeRow *row_new (GtkCTree *ctree); -static void row_delete (GtkCTree *ctree, - GtkCTreeRow *ctree_row); -static void tree_delete (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void tree_delete_row (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void real_clear (GtkCList *clist); -static void tree_update_level (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void tree_select (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void tree_unselect (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void real_select_all (GtkCList *clist); -static void real_unselect_all (GtkCList *clist); -static void tree_expand (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void tree_collapse (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void tree_collapse_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth); -static void tree_toggle_expansion (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void change_focus_row_expansion (GtkCTree *ctree, - GtkCTreeExpansionType expansion); -static void real_select_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); -static void real_unselect_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event); -static void real_tree_select (GtkCTree *ctree, - GtkCTreeNode *node, - gint column); -static void real_tree_unselect (GtkCTree *ctree, - GtkCTreeNode *node, - gint column); -static void real_tree_expand (GtkCTree *ctree, - GtkCTreeNode *node); -static void real_tree_collapse (GtkCTree *ctree, - GtkCTreeNode *node); -static void real_tree_move (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *new_parent, - GtkCTreeNode *new_sibling); -static void real_row_move (GtkCList *clist, - gint source_row, - gint dest_row); -static void gtk_ctree_link (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *parent, - GtkCTreeNode *sibling, - gboolean update_focus_row); -static void gtk_ctree_unlink (GtkCTree *ctree, - GtkCTreeNode *node, - gboolean update_focus_row); -static GtkCTreeNode * gtk_ctree_last_visible (GtkCTree *ctree, - GtkCTreeNode *node); -static gboolean ctree_is_hot_spot (GtkCTree *ctree, - GtkCTreeNode *node, - gint row, - gint x, - gint y); -static void tree_sort (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static void fake_unselect_all (GtkCList *clist, - gint row); -static GList * selection_find (GtkCList *clist, - gint row_number, - GList *row_list_element); -static void resync_selection (GtkCList *clist, - GdkEvent *event); -static void real_undo_selection (GtkCList *clist); -static void select_row_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -static gint real_insert_row (GtkCList *clist, - gint row, - gchar *text[]); -static void real_remove_row (GtkCList *clist, - gint row); -static void real_sort_list (GtkCList *clist); -static void cell_size_request (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkRequisition *requisition); -static void column_auto_resize (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - gint old_width); -static void auto_resize_columns (GtkCList *clist); - - -static gboolean check_drag (GtkCTree *ctree, - GtkCTreeNode *drag_source, - GtkCTreeNode *drag_target, - GtkCListDragPos insert_pos); -static void gtk_ctree_drag_begin (GtkWidget *widget, - GdkDragContext *context); -static gint gtk_ctree_drag_motion (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time); -static void gtk_ctree_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint32 time); -static void remove_grab (GtkCList *clist); -static void drag_dest_cell (GtkCList *clist, - gint x, - gint y, - GtkCListDestInfo *dest_info); - - -enum -{ - TREE_SELECT_ROW, - TREE_UNSELECT_ROW, - TREE_EXPAND, - TREE_COLLAPSE, - TREE_MOVE, - CHANGE_FOCUS_ROW_EXPANSION, - LAST_SIGNAL -}; - -static GtkCListClass *parent_class = NULL; -static GtkContainerClass *container_class = NULL; -static guint ctree_signals[LAST_SIGNAL] = {0}; - - -GtkType -gtk_ctree_get_type (void) -{ - static GtkType ctree_type = 0; - - if (!ctree_type) - { - static const GtkTypeInfo ctree_info = - { - "GtkCTree", - sizeof (GtkCTree), - sizeof (GtkCTreeClass), - (GtkClassInitFunc) gtk_ctree_class_init, - (GtkObjectInitFunc) gtk_ctree_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkCTree"); - ctree_type = gtk_type_unique (GTK_TYPE_CLIST, &ctree_info); - } - - return ctree_type; -} - -static void -gtk_ctree_class_init (GtkCTreeClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkCListClass *clist_class; - GtkBindingSet *binding_set; - - gobject_class->constructor = gtk_ctree_constructor; - - object_class = (GtkObjectClass *) klass; - widget_class = (GtkWidgetClass *) klass; - container_class = (GtkContainerClass *) klass; - clist_class = (GtkCListClass *) klass; - - parent_class = gtk_type_class (GTK_TYPE_CLIST); - container_class = gtk_type_class (GTK_TYPE_CONTAINER); - - object_class->set_arg = gtk_ctree_set_arg; - object_class->get_arg = gtk_ctree_get_arg; - - widget_class->realize = gtk_ctree_realize; - widget_class->unrealize = gtk_ctree_unrealize; - widget_class->button_press_event = gtk_ctree_button_press; - - widget_class->drag_begin = gtk_ctree_drag_begin; - widget_class->drag_motion = gtk_ctree_drag_motion; - widget_class->drag_data_received = gtk_ctree_drag_data_received; - - clist_class->select_row = real_select_row; - clist_class->unselect_row = real_unselect_row; - clist_class->row_move = real_row_move; - clist_class->undo_selection = real_undo_selection; - clist_class->resync_selection = resync_selection; - clist_class->selection_find = selection_find; - clist_class->click_column = NULL; - clist_class->draw_row = draw_row; - clist_class->draw_drag_highlight = draw_drag_highlight; - clist_class->clear = real_clear; - clist_class->select_all = real_select_all; - clist_class->unselect_all = real_unselect_all; - clist_class->fake_unselect_all = fake_unselect_all; - clist_class->insert_row = real_insert_row; - clist_class->remove_row = real_remove_row; - clist_class->sort_list = real_sort_list; - clist_class->set_cell_contents = set_cell_contents; - clist_class->cell_size_request = cell_size_request; - - klass->tree_select_row = real_tree_select; - klass->tree_unselect_row = real_tree_unselect; - klass->tree_expand = real_tree_expand; - klass->tree_collapse = real_tree_collapse; - klass->tree_move = real_tree_move; - klass->change_focus_row_expansion = change_focus_row_expansion; - - gtk_object_add_arg_type ("GtkCTree::n-columns", /* overrides GtkCList::n_columns!! */ - GTK_TYPE_UINT, - GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME, - ARG_N_COLUMNS); - gtk_object_add_arg_type ("GtkCTree::tree-column", - GTK_TYPE_UINT, - GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME, - ARG_TREE_COLUMN); - gtk_object_add_arg_type ("GtkCTree::indent", - GTK_TYPE_UINT, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_INDENT); - gtk_object_add_arg_type ("GtkCTree::spacing", - GTK_TYPE_UINT, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_SPACING); - gtk_object_add_arg_type ("GtkCTree::show-stub", - GTK_TYPE_BOOL, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_SHOW_STUB); - gtk_object_add_arg_type ("GtkCTree::line-style", - GTK_TYPE_CTREE_LINE_STYLE, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_LINE_STYLE); - gtk_object_add_arg_type ("GtkCTree::expander-style", - GTK_TYPE_CTREE_EXPANDER_STYLE, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_EXPANDER_STYLE); - - ctree_signals[TREE_SELECT_ROW] = - gtk_signal_new (I_("tree-select-row"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCTreeClass, tree_select_row), - _gtk_marshal_VOID__POINTER_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_CTREE_NODE, - GTK_TYPE_INT); - ctree_signals[TREE_UNSELECT_ROW] = - gtk_signal_new (I_("tree-unselect-row"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCTreeClass, tree_unselect_row), - _gtk_marshal_VOID__POINTER_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_CTREE_NODE, - GTK_TYPE_INT); - ctree_signals[TREE_EXPAND] = - gtk_signal_new (I_("tree-expand"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCTreeClass, tree_expand), - _gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_CTREE_NODE); - ctree_signals[TREE_COLLAPSE] = - gtk_signal_new (I_("tree-collapse"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCTreeClass, tree_collapse), - _gtk_marshal_VOID__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_CTREE_NODE); - ctree_signals[TREE_MOVE] = - gtk_signal_new (I_("tree-move"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCTreeClass, tree_move), - _gtk_marshal_VOID__POINTER_POINTER_POINTER, - GTK_TYPE_NONE, 3, - GTK_TYPE_CTREE_NODE, - GTK_TYPE_CTREE_NODE, - GTK_TYPE_CTREE_NODE); - ctree_signals[CHANGE_FOCUS_ROW_EXPANSION] = - gtk_signal_new (I_("change-focus-row-expansion"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkCTreeClass, - change_focus_row_expansion), - _gtk_marshal_VOID__ENUM, - GTK_TYPE_NONE, 1, GTK_TYPE_CTREE_EXPANSION_TYPE); - - binding_set = gtk_binding_set_by_class (klass); - gtk_binding_entry_add_signal (binding_set, - GDK_plus, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND); - gtk_binding_entry_add_signal (binding_set, - GDK_plus, GDK_CONTROL_MASK, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND_RECURSIVE); - - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Add, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND); - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Add, GDK_CONTROL_MASK, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_EXPAND_RECURSIVE); - - gtk_binding_entry_add_signal (binding_set, - GDK_minus, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_COLLAPSE); - gtk_binding_entry_add_signal (binding_set, - GDK_minus, GDK_CONTROL_MASK, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, - GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE); - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Subtract, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_COLLAPSE); - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Subtract, GDK_CONTROL_MASK, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, - GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE); - gtk_binding_entry_add_signal (binding_set, - GDK_equal, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE); - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Equal, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE); - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Multiply, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE); - gtk_binding_entry_add_signal (binding_set, - GDK_asterisk, 0, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, GTK_CTREE_EXPANSION_TOGGLE); - gtk_binding_entry_add_signal (binding_set, - GDK_KP_Multiply, GDK_CONTROL_MASK, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, - GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE); - gtk_binding_entry_add_signal (binding_set, - GDK_asterisk, GDK_CONTROL_MASK, - "change-focus-row-expansion", 1, - GTK_TYPE_ENUM, - GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE); -} - -static void -gtk_ctree_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkCTree *ctree; - GtkCList *clist; - - ctree = GTK_CTREE (object); - clist = GTK_CLIST (ctree); - - switch (arg_id) - { - case ARG_N_COLUMNS: /* construct-only arg, only set at construction time */ - clist->columns = MAX (1, GTK_VALUE_UINT (*arg)); - ctree->tree_column = CLAMP (ctree->tree_column, 0, clist->columns); - break; - case ARG_TREE_COLUMN: /* construct-only arg, only set at construction time */ - ctree->tree_column = GTK_VALUE_UINT (*arg); - ctree->tree_column = CLAMP (ctree->tree_column, 0, clist->columns); - break; - case ARG_INDENT: - gtk_ctree_set_indent (ctree, GTK_VALUE_UINT (*arg)); - break; - case ARG_SPACING: - gtk_ctree_set_spacing (ctree, GTK_VALUE_UINT (*arg)); - break; - case ARG_SHOW_STUB: - gtk_ctree_set_show_stub (ctree, GTK_VALUE_BOOL (*arg)); - break; - case ARG_LINE_STYLE: - gtk_ctree_set_line_style (ctree, GTK_VALUE_ENUM (*arg)); - break; - case ARG_EXPANDER_STYLE: - gtk_ctree_set_expander_style (ctree, GTK_VALUE_ENUM (*arg)); - break; - default: - break; - } -} - -static void -gtk_ctree_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkCTree *ctree; - - ctree = GTK_CTREE (object); - - switch (arg_id) - { - case ARG_N_COLUMNS: - GTK_VALUE_UINT (*arg) = GTK_CLIST (ctree)->columns; - break; - case ARG_TREE_COLUMN: - GTK_VALUE_UINT (*arg) = ctree->tree_column; - break; - case ARG_INDENT: - GTK_VALUE_UINT (*arg) = ctree->tree_indent; - break; - case ARG_SPACING: - GTK_VALUE_UINT (*arg) = ctree->tree_spacing; - break; - case ARG_SHOW_STUB: - GTK_VALUE_BOOL (*arg) = ctree->show_stub; - break; - case ARG_LINE_STYLE: - GTK_VALUE_ENUM (*arg) = ctree->line_style; - break; - case ARG_EXPANDER_STYLE: - GTK_VALUE_ENUM (*arg) = ctree->expander_style; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -gtk_ctree_init (GtkCTree *ctree) -{ - GtkCList *clist; - - GTK_CLIST_SET_FLAG (ctree, CLIST_DRAW_DRAG_RECT); - GTK_CLIST_SET_FLAG (ctree, CLIST_DRAW_DRAG_LINE); - - clist = GTK_CLIST (ctree); - - ctree->tree_indent = 20; - ctree->tree_spacing = 5; - ctree->tree_column = 0; - ctree->line_style = GTK_CTREE_LINES_SOLID; - ctree->expander_style = GTK_CTREE_EXPANDER_SQUARE; - ctree->drag_compare = NULL; - ctree->show_stub = TRUE; - - clist->button_actions[0] |= GTK_BUTTON_EXPANDS; -} - -static void -ctree_attach_styles (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - GtkCList *clist; - gint i; - - clist = GTK_CLIST (ctree); - - if (GTK_CTREE_ROW (node)->row.style) - GTK_CTREE_ROW (node)->row.style = - gtk_style_attach (GTK_CTREE_ROW (node)->row.style, clist->clist_window); - - if (GTK_CTREE_ROW (node)->row.fg_set || GTK_CTREE_ROW (node)->row.bg_set) - { - GdkColormap *colormap; - - colormap = gtk_widget_get_colormap (GTK_WIDGET (ctree)); - if (GTK_CTREE_ROW (node)->row.fg_set) - gdk_colormap_alloc_color (colormap, - &(GTK_CTREE_ROW (node)->row.foreground), - FALSE, TRUE); - if (GTK_CTREE_ROW (node)->row.bg_set) - gdk_colormap_alloc_color (colormap, - &(GTK_CTREE_ROW (node)->row.background), - FALSE, TRUE); - } - - for (i = 0; i < clist->columns; i++) - if (GTK_CTREE_ROW (node)->row.cell[i].style) - GTK_CTREE_ROW (node)->row.cell[i].style = - gtk_style_attach (GTK_CTREE_ROW (node)->row.cell[i].style, - clist->clist_window); -} - -static void -ctree_detach_styles (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - GtkCList *clist; - gint i; - - clist = GTK_CLIST (ctree); - - if (GTK_CTREE_ROW (node)->row.style) - gtk_style_detach (GTK_CTREE_ROW (node)->row.style); - for (i = 0; i < clist->columns; i++) - if (GTK_CTREE_ROW (node)->row.cell[i].style) - gtk_style_detach (GTK_CTREE_ROW (node)->row.cell[i].style); -} - -static void -gtk_ctree_realize (GtkWidget *widget) -{ - GtkCTree *ctree; - GtkCList *clist; - GdkGCValues values; - GtkCTreeNode *node; - GtkCTreeNode *child; - gint i; - - g_return_if_fail (GTK_IS_CTREE (widget)); - - GTK_WIDGET_CLASS (parent_class)->realize (widget); - - ctree = GTK_CTREE (widget); - clist = GTK_CLIST (widget); - - node = GTK_CTREE_NODE (clist->row_list); - for (i = 0; i < clist->rows; i++) - { - if (GTK_CTREE_ROW (node)->children && !GTK_CTREE_ROW (node)->expanded) - for (child = GTK_CTREE_ROW (node)->children; child; - child = GTK_CTREE_ROW (child)->sibling) - gtk_ctree_pre_recursive (ctree, child, ctree_attach_styles, NULL); - node = GTK_CTREE_NODE_NEXT (node); - } - - values.foreground = widget->style->fg[GTK_STATE_NORMAL]; - values.background = widget->style->base[GTK_STATE_NORMAL]; - values.subwindow_mode = GDK_INCLUDE_INFERIORS; - values.line_style = GDK_LINE_SOLID; - ctree->lines_gc = gdk_gc_new_with_values (GTK_CLIST(widget)->clist_window, - &values, - GDK_GC_FOREGROUND | - GDK_GC_BACKGROUND | - GDK_GC_SUBWINDOW | - GDK_GC_LINE_STYLE); - - if (ctree->line_style == GTK_CTREE_LINES_DOTTED) - { - gint8 dashes[] = { 1, 1 }; - - gdk_gc_set_line_attributes (ctree->lines_gc, 1, - GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER); - gdk_gc_set_dashes (ctree->lines_gc, 0, dashes, G_N_ELEMENTS (dashes)); - } -} - -static void -gtk_ctree_unrealize (GtkWidget *widget) -{ - GtkCTree *ctree; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (widget)); - - GTK_WIDGET_CLASS (parent_class)->unrealize (widget); - - ctree = GTK_CTREE (widget); - clist = GTK_CLIST (widget); - - if (gtk_widget_get_realized (widget)) - { - GtkCTreeNode *node; - GtkCTreeNode *child; - gint i; - - node = GTK_CTREE_NODE (clist->row_list); - for (i = 0; i < clist->rows; i++) - { - if (GTK_CTREE_ROW (node)->children && - !GTK_CTREE_ROW (node)->expanded) - for (child = GTK_CTREE_ROW (node)->children; child; - child = GTK_CTREE_ROW (child)->sibling) - gtk_ctree_pre_recursive(ctree, child, ctree_detach_styles, NULL); - node = GTK_CTREE_NODE_NEXT (node); - } - } - - g_object_unref (ctree->lines_gc); -} - -static gint -gtk_ctree_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - GtkCTree *ctree; - GtkCList *clist; - gint button_actions; - - g_return_val_if_fail (GTK_IS_CTREE (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - ctree = GTK_CTREE (widget); - clist = GTK_CLIST (widget); - - button_actions = clist->button_actions[event->button - 1]; - - if (button_actions == GTK_BUTTON_IGNORED) - return FALSE; - - if (event->window == clist->clist_window) - { - GtkCTreeNode *work; - gint x; - gint y; - gint row; - gint column; - - x = event->x; - y = event->y; - - if (!gtk_clist_get_selection_info (clist, x, y, &row, &column)) - return FALSE; - - work = GTK_CTREE_NODE (g_list_nth (clist->row_list, row)); - - if (button_actions & GTK_BUTTON_EXPANDS && - (GTK_CTREE_ROW (work)->children && !GTK_CTREE_ROW (work)->is_leaf && - (event->type == GDK_2BUTTON_PRESS || - ctree_is_hot_spot (ctree, work, row, x, y)))) - { - if (GTK_CTREE_ROW (work)->expanded) - gtk_ctree_collapse (ctree, work); - else - gtk_ctree_expand (ctree, work); - - return TRUE; - } - } - - return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event); -} - -static void -draw_drag_highlight (GtkCList *clist, - GtkCListRow *dest_row, - gint dest_row_number, - GtkCListDragPos drag_pos) -{ - GtkCTree *ctree; - GdkPoint points[4]; - gint level; - gint i; - gint y = 0; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - ctree = GTK_CTREE (clist); - - level = ((GtkCTreeRow *)(dest_row))->level; - - y = ROW_TOP_YPIXEL (clist, dest_row_number) - 1; - - switch (drag_pos) - { - case GTK_CLIST_DRAG_NONE: - break; - case GTK_CLIST_DRAG_AFTER: - y += clist->row_height + 1; - case GTK_CLIST_DRAG_BEFORE: - - if (clist->column[ctree->tree_column].visible) - switch (clist->column[ctree->tree_column].justification) - { - case GTK_JUSTIFY_CENTER: - case GTK_JUSTIFY_FILL: - case GTK_JUSTIFY_LEFT: - if (ctree->tree_column > 0) - gdk_draw_line (clist->clist_window, clist->xor_gc, - COLUMN_LEFT_XPIXEL(clist, 0), y, - COLUMN_LEFT_XPIXEL(clist, ctree->tree_column - 1)+ - clist->column[ctree->tree_column - 1].area.width, - y); - - gdk_draw_line (clist->clist_window, clist->xor_gc, - COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + - ctree->tree_indent * level - - (ctree->tree_indent - PM_SIZE) / 2, y, - GTK_WIDGET (ctree)->allocation.width, y); - break; - case GTK_JUSTIFY_RIGHT: - if (ctree->tree_column < clist->columns - 1) - gdk_draw_line (clist->clist_window, clist->xor_gc, - COLUMN_LEFT_XPIXEL(clist, ctree->tree_column + 1), - y, - COLUMN_LEFT_XPIXEL(clist, clist->columns - 1) + - clist->column[clist->columns - 1].area.width, y); - - gdk_draw_line (clist->clist_window, clist->xor_gc, - 0, y, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) - + clist->column[ctree->tree_column].area.width - - ctree->tree_indent * level + - (ctree->tree_indent - PM_SIZE) / 2, y); - break; - } - else - gdk_draw_line (clist->clist_window, clist->xor_gc, - 0, y, clist->clist_window_width, y); - break; - case GTK_CLIST_DRAG_INTO: - y = ROW_TOP_YPIXEL (clist, dest_row_number) + clist->row_height; - - if (clist->column[ctree->tree_column].visible) - switch (clist->column[ctree->tree_column].justification) - { - case GTK_JUSTIFY_CENTER: - case GTK_JUSTIFY_FILL: - case GTK_JUSTIFY_LEFT: - points[0].x = COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + - ctree->tree_indent * level - (ctree->tree_indent - PM_SIZE) / 2; - points[0].y = y; - points[3].x = points[0].x; - points[3].y = y - clist->row_height - 1; - points[1].x = clist->clist_window_width - 1; - points[1].y = points[0].y; - points[2].x = points[1].x; - points[2].y = points[3].y; - - for (i = 0; i < 3; i++) - gdk_draw_line (clist->clist_window, clist->xor_gc, - points[i].x, points[i].y, - points[i+1].x, points[i+1].y); - - if (ctree->tree_column > 0) - { - points[0].x = COLUMN_LEFT_XPIXEL(clist, - ctree->tree_column - 1) + - clist->column[ctree->tree_column - 1].area.width ; - points[0].y = y; - points[3].x = points[0].x; - points[3].y = y - clist->row_height - 1; - points[1].x = 0; - points[1].y = points[0].y; - points[2].x = 0; - points[2].y = points[3].y; - - for (i = 0; i < 3; i++) - gdk_draw_line (clist->clist_window, clist->xor_gc, - points[i].x, points[i].y, points[i+1].x, - points[i+1].y); - } - break; - case GTK_JUSTIFY_RIGHT: - points[0].x = COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) - - ctree->tree_indent * level + (ctree->tree_indent - PM_SIZE) / 2 + - clist->column[ctree->tree_column].area.width; - points[0].y = y; - points[3].x = points[0].x; - points[3].y = y - clist->row_height - 1; - points[1].x = 0; - points[1].y = points[0].y; - points[2].x = 0; - points[2].y = points[3].y; - - for (i = 0; i < 3; i++) - gdk_draw_line (clist->clist_window, clist->xor_gc, - points[i].x, points[i].y, - points[i+1].x, points[i+1].y); - - if (ctree->tree_column < clist->columns - 1) - { - points[0].x = COLUMN_LEFT_XPIXEL(clist, ctree->tree_column +1); - points[0].y = y; - points[3].x = points[0].x; - points[3].y = y - clist->row_height - 1; - points[1].x = clist->clist_window_width - 1; - points[1].y = points[0].y; - points[2].x = points[1].x; - points[2].y = points[3].y; - - for (i = 0; i < 3; i++) - gdk_draw_line (clist->clist_window, clist->xor_gc, - points[i].x, points[i].y, - points[i+1].x, points[i+1].y); - } - break; - } - else - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, - 0, y - clist->row_height, - clist->clist_window_width - 1, clist->row_height); - break; - } -} - -static gint -draw_cell_pixmap (GdkWindow *window, - GdkRectangle *clip_rectangle, - GdkGC *fg_gc, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint x, - gint y, - gint width, - gint height) -{ - gint xsrc = 0; - gint ysrc = 0; - - if (mask) - { - gdk_gc_set_clip_mask (fg_gc, mask); - gdk_gc_set_clip_origin (fg_gc, x, y); - } - if (x < clip_rectangle->x) - { - xsrc = clip_rectangle->x - x; - width -= xsrc; - x = clip_rectangle->x; - } - if (x + width > clip_rectangle->x + clip_rectangle->width) - width = clip_rectangle->x + clip_rectangle->width - x; - - if (y < clip_rectangle->y) - { - ysrc = clip_rectangle->y - y; - height -= ysrc; - y = clip_rectangle->y; - } - if (y + height > clip_rectangle->y + clip_rectangle->height) - height = clip_rectangle->y + clip_rectangle->height - y; - - if (width > 0 && height > 0) - gdk_draw_drawable (window, fg_gc, pixmap, xsrc, ysrc, x, y, width, height); - - if (mask) - { - gdk_gc_set_clip_rectangle (fg_gc, NULL); - gdk_gc_set_clip_origin (fg_gc, 0, 0); - } - - return x + MAX (width, 0); -} - -static void -get_cell_style (GtkCList *clist, - GtkCListRow *clist_row, - gint state, - gint column, - GtkStyle **style, - GdkGC **fg_gc, - GdkGC **bg_gc) -{ - gint fg_state; - - if ((state == GTK_STATE_NORMAL) && - (GTK_WIDGET (clist)->state == GTK_STATE_INSENSITIVE)) - fg_state = GTK_STATE_INSENSITIVE; - else - fg_state = state; - - if (clist_row->cell[column].style) - { - if (style) - *style = clist_row->cell[column].style; - if (fg_gc) - *fg_gc = clist_row->cell[column].style->fg_gc[fg_state]; - if (bg_gc) { - if (state == GTK_STATE_SELECTED) - *bg_gc = clist_row->cell[column].style->bg_gc[state]; - else - *bg_gc = clist_row->cell[column].style->base_gc[state]; - } - } - else if (clist_row->style) - { - if (style) - *style = clist_row->style; - if (fg_gc) - *fg_gc = clist_row->style->fg_gc[fg_state]; - if (bg_gc) { - if (state == GTK_STATE_SELECTED) - *bg_gc = clist_row->style->bg_gc[state]; - else - *bg_gc = clist_row->style->base_gc[state]; - } - } - else - { - if (style) - *style = GTK_WIDGET (clist)->style; - if (fg_gc) - *fg_gc = GTK_WIDGET (clist)->style->fg_gc[fg_state]; - if (bg_gc) { - if (state == GTK_STATE_SELECTED) - *bg_gc = GTK_WIDGET (clist)->style->bg_gc[state]; - else - *bg_gc = GTK_WIDGET (clist)->style->base_gc[state]; - } - - if (state != GTK_STATE_SELECTED) - { - if (fg_gc && clist_row->fg_set) - *fg_gc = clist->fg_gc; - if (bg_gc && clist_row->bg_set) - *bg_gc = clist->bg_gc; - } - } -} - -static gint -gtk_ctree_draw_expander (GtkCTree *ctree, - GtkCTreeRow *ctree_row, - GtkStyle *style, - GdkRectangle *clip_rectangle, - gint x) -{ - GtkCList *clist; - GdkPoint points[3]; - gint justification_factor; - gint y; - - if (ctree->expander_style == GTK_CTREE_EXPANDER_NONE) - return x; - - clist = GTK_CLIST (ctree); - if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT) - justification_factor = -1; - else - justification_factor = 1; - y = (clip_rectangle->y + (clip_rectangle->height - PM_SIZE) / 2 - - (clip_rectangle->height + 1) % 2); - - if (!ctree_row->children) - { - switch (ctree->expander_style) - { - case GTK_CTREE_EXPANDER_NONE: - return x; - case GTK_CTREE_EXPANDER_TRIANGLE: - return x + justification_factor * (PM_SIZE + 3); - case GTK_CTREE_EXPANDER_SQUARE: - case GTK_CTREE_EXPANDER_CIRCULAR: - return x + justification_factor * (PM_SIZE + 1); - } - } - - gdk_gc_set_clip_rectangle (style->fg_gc[GTK_STATE_NORMAL], clip_rectangle); - gdk_gc_set_clip_rectangle (style->base_gc[GTK_STATE_NORMAL], clip_rectangle); - - switch (ctree->expander_style) - { - case GTK_CTREE_EXPANDER_NONE: - break; - case GTK_CTREE_EXPANDER_TRIANGLE: - if (ctree_row->expanded) - { - points[0].x = x; - points[0].y = y + (PM_SIZE + 2) / 6; - points[1].x = points[0].x + justification_factor * (PM_SIZE + 2); - points[1].y = points[0].y; - points[2].x = (points[0].x + - justification_factor * (PM_SIZE + 2) / 2); - points[2].y = y + 2 * (PM_SIZE + 2) / 3; - } - else - { - points[0].x = x + justification_factor * ((PM_SIZE + 2) / 6 + 2); - points[0].y = y - 1; - points[1].x = points[0].x; - points[1].y = points[0].y + (PM_SIZE + 2); - points[2].x = (points[0].x + - justification_factor * (2 * (PM_SIZE + 2) / 3 - 1)); - points[2].y = points[0].y + (PM_SIZE + 2) / 2; - } - - gdk_draw_polygon (clist->clist_window, style->base_gc[GTK_STATE_NORMAL], - TRUE, points, 3); - gdk_draw_polygon (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL], - FALSE, points, 3); - - x += justification_factor * (PM_SIZE + 3); - break; - case GTK_CTREE_EXPANDER_SQUARE: - case GTK_CTREE_EXPANDER_CIRCULAR: - if (justification_factor == -1) - x += justification_factor * (PM_SIZE + 1); - - if (ctree->expander_style == GTK_CTREE_EXPANDER_CIRCULAR) - { - gdk_draw_arc (clist->clist_window, style->base_gc[GTK_STATE_NORMAL], - TRUE, x, y, PM_SIZE, PM_SIZE, 0, 360 * 64); - gdk_draw_arc (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL], - FALSE, x, y, PM_SIZE, PM_SIZE, 0, 360 * 64); - } - else - { - gdk_draw_rectangle (clist->clist_window, - style->base_gc[GTK_STATE_NORMAL], TRUE, - x, y, PM_SIZE, PM_SIZE); - gdk_draw_rectangle (clist->clist_window, - style->fg_gc[GTK_STATE_NORMAL], FALSE, - x, y, PM_SIZE, PM_SIZE); - } - - gdk_draw_line (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL], - x + 2, y + PM_SIZE / 2, x + PM_SIZE - 2, y + PM_SIZE / 2); - - if (!ctree_row->expanded) - gdk_draw_line (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL], - x + PM_SIZE / 2, y + 2, - x + PM_SIZE / 2, y + PM_SIZE - 2); - - if (justification_factor == 1) - x += justification_factor * (PM_SIZE + 1); - break; - } - - gdk_gc_set_clip_rectangle (style->fg_gc[GTK_STATE_NORMAL], NULL); - gdk_gc_set_clip_rectangle (style->base_gc[GTK_STATE_NORMAL], NULL); - - return x; -} - - -static gint -gtk_ctree_draw_lines (GtkCTree *ctree, - GtkCTreeRow *ctree_row, - gint row, - gint column, - gint state, - GdkRectangle *clip_rectangle, - GdkRectangle *cell_rectangle, - GdkRectangle *crect, - GdkRectangle *area, - GtkStyle *style) -{ - GtkCList *clist; - GtkCTreeNode *node; - GtkCTreeNode *parent; - GdkRectangle tree_rectangle; - GdkRectangle tc_rectangle; - GdkGC *bg_gc; - gint offset; - gint offset_x; - gint offset_y; - gint xcenter; - gint ycenter; - gint next_level; - gint column_right; - gint column_left; - gint justify_right; - gint justification_factor; - - clist = GTK_CLIST (ctree); - ycenter = clip_rectangle->y + (clip_rectangle->height / 2); - justify_right = (clist->column[column].justification == GTK_JUSTIFY_RIGHT); - - if (justify_right) - { - offset = (clip_rectangle->x + clip_rectangle->width - 1 - - ctree->tree_indent * (ctree_row->level - 1)); - justification_factor = -1; - } - else - { - offset = clip_rectangle->x + ctree->tree_indent * (ctree_row->level - 1); - justification_factor = 1; - } - - switch (ctree->line_style) - { - case GTK_CTREE_LINES_NONE: - break; - case GTK_CTREE_LINES_TABBED: - xcenter = offset + justification_factor * TAB_SIZE; - - column_right = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) + - clist->column[ctree->tree_column].area.width + - COLUMN_INSET); - column_left = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) - - COLUMN_INSET - CELL_SPACING); - - if (area) - { - tree_rectangle.y = crect->y; - tree_rectangle.height = crect->height; - - if (justify_right) - { - tree_rectangle.x = xcenter; - tree_rectangle.width = column_right - xcenter; - } - else - { - tree_rectangle.x = column_left; - tree_rectangle.width = xcenter - column_left; - } - - if (!gdk_rectangle_intersect (area, &tree_rectangle, &tc_rectangle)) - { - offset += justification_factor * 3; - break; - } - } - - gdk_gc_set_clip_rectangle (ctree->lines_gc, crect); - - next_level = ctree_row->level; - - if (!ctree_row->sibling || (ctree_row->children && ctree_row->expanded)) - { - node = gtk_ctree_find_node_ptr (ctree, ctree_row); - if (GTK_CTREE_NODE_NEXT (node)) - next_level = GTK_CTREE_ROW (GTK_CTREE_NODE_NEXT (node))->level; - else - next_level = 0; - } - - if (ctree->tree_indent > 0) - { - node = ctree_row->parent; - while (node) - { - xcenter -= (justification_factor * ctree->tree_indent); - - if ((justify_right && xcenter < column_left) || - (!justify_right && xcenter > column_right)) - { - node = GTK_CTREE_ROW (node)->parent; - continue; - } - - tree_rectangle.y = cell_rectangle->y; - tree_rectangle.height = cell_rectangle->height; - if (justify_right) - { - tree_rectangle.x = MAX (xcenter - ctree->tree_indent + 1, - column_left); - tree_rectangle.width = MIN (xcenter - column_left, - ctree->tree_indent); - } - else - { - tree_rectangle.x = xcenter; - tree_rectangle.width = MIN (column_right - xcenter, - ctree->tree_indent); - } - - if (!area || gdk_rectangle_intersect (area, &tree_rectangle, - &tc_rectangle)) - { - get_cell_style (clist, >K_CTREE_ROW (node)->row, - state, column, NULL, NULL, &bg_gc); - - if (bg_gc == clist->bg_gc) - gdk_gc_set_foreground - (clist->bg_gc, >K_CTREE_ROW (node)->row.background); - - if (!area) - gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, - tree_rectangle.x, - tree_rectangle.y, - tree_rectangle.width, - tree_rectangle.height); - else - gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, - tc_rectangle.x, - tc_rectangle.y, - tc_rectangle.width, - tc_rectangle.height); - } - if (next_level > GTK_CTREE_ROW (node)->level) - gdk_draw_line (clist->clist_window, ctree->lines_gc, - xcenter, crect->y, - xcenter, crect->y + crect->height); - else - { - gint width; - - offset_x = MIN (ctree->tree_indent, 2 * TAB_SIZE); - width = offset_x / 2 + offset_x % 2; - - parent = GTK_CTREE_ROW (node)->parent; - - tree_rectangle.y = ycenter; - tree_rectangle.height = (cell_rectangle->y - ycenter + - cell_rectangle->height); - - if (justify_right) - { - tree_rectangle.x = MAX(xcenter + 1 - width, column_left); - tree_rectangle.width = MIN (xcenter + 1 - column_left, - width); - } - else - { - tree_rectangle.x = xcenter; - tree_rectangle.width = MIN (column_right - xcenter, - width); - } - - if (!area || - gdk_rectangle_intersect (area, &tree_rectangle, - &tc_rectangle)) - { - if (parent) - { - get_cell_style (clist, >K_CTREE_ROW (parent)->row, - state, column, NULL, NULL, &bg_gc); - if (bg_gc == clist->bg_gc) - gdk_gc_set_foreground - (clist->bg_gc, - >K_CTREE_ROW (parent)->row.background); - } - else if (state == GTK_STATE_SELECTED) - bg_gc = style->base_gc[state]; - else - bg_gc = GTK_WIDGET (clist)->style->base_gc[state]; - - if (!area) - gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, - tree_rectangle.x, - tree_rectangle.y, - tree_rectangle.width, - tree_rectangle.height); - else - gdk_draw_rectangle (clist->clist_window, - bg_gc, TRUE, - tc_rectangle.x, - tc_rectangle.y, - tc_rectangle.width, - tc_rectangle.height); - } - - get_cell_style (clist, >K_CTREE_ROW (node)->row, - state, column, NULL, NULL, &bg_gc); - if (bg_gc == clist->bg_gc) - gdk_gc_set_foreground - (clist->bg_gc, >K_CTREE_ROW (node)->row.background); - - gdk_gc_set_clip_rectangle (bg_gc, crect); - gdk_draw_arc (clist->clist_window, bg_gc, TRUE, - xcenter - (justify_right * offset_x), - cell_rectangle->y, - offset_x, clist->row_height, - (180 + (justify_right * 90)) * 64, 90 * 64); - gdk_gc_set_clip_rectangle (bg_gc, NULL); - - gdk_draw_line (clist->clist_window, ctree->lines_gc, - xcenter, cell_rectangle->y, xcenter, ycenter); - - if (justify_right) - gdk_draw_arc (clist->clist_window, ctree->lines_gc, FALSE, - xcenter - offset_x, cell_rectangle->y, - offset_x, clist->row_height, - 270 * 64, 90 * 64); - else - gdk_draw_arc (clist->clist_window, ctree->lines_gc, FALSE, - xcenter, cell_rectangle->y, - offset_x, clist->row_height, - 180 * 64, 90 * 64); - } - node = GTK_CTREE_ROW (node)->parent; - } - } - - if (state != GTK_STATE_SELECTED) - { - tree_rectangle.y = clip_rectangle->y; - tree_rectangle.height = clip_rectangle->height; - tree_rectangle.width = COLUMN_INSET + CELL_SPACING + - MIN (clist->column[ctree->tree_column].area.width + COLUMN_INSET, - TAB_SIZE); - - if (justify_right) - tree_rectangle.x = MAX (xcenter + 1, column_left); - else - tree_rectangle.x = column_left; - - if (!area) - gdk_draw_rectangle (clist->clist_window, - GTK_WIDGET - (ctree)->style->base_gc[GTK_STATE_NORMAL], - TRUE, - tree_rectangle.x, - tree_rectangle.y, - tree_rectangle.width, - tree_rectangle.height); - else if (gdk_rectangle_intersect (area, &tree_rectangle, - &tc_rectangle)) - gdk_draw_rectangle (clist->clist_window, - GTK_WIDGET - (ctree)->style->base_gc[GTK_STATE_NORMAL], - TRUE, - tc_rectangle.x, - tc_rectangle.y, - tc_rectangle.width, - tc_rectangle.height); - } - - xcenter = offset + (justification_factor * ctree->tree_indent / 2); - - get_cell_style (clist, &ctree_row->row, state, column, NULL, NULL, - &bg_gc); - if (bg_gc == clist->bg_gc) - gdk_gc_set_foreground (clist->bg_gc, &ctree_row->row.background); - - gdk_gc_set_clip_rectangle (bg_gc, crect); - if (ctree_row->is_leaf) - { - GdkPoint points[6]; - - points[0].x = offset + justification_factor * TAB_SIZE; - points[0].y = cell_rectangle->y; - - points[1].x = points[0].x - justification_factor * 4; - points[1].y = points[0].y; - - points[2].x = points[1].x - justification_factor * 2; - points[2].y = points[1].y + 3; - - points[3].x = points[2].x; - points[3].y = points[2].y + clist->row_height - 5; - - points[4].x = points[3].x + justification_factor * 2; - points[4].y = points[3].y + 3; - - points[5].x = points[4].x + justification_factor * 4; - points[5].y = points[4].y; - - gdk_draw_polygon (clist->clist_window, bg_gc, TRUE, points, 6); - gdk_draw_lines (clist->clist_window, ctree->lines_gc, points, 6); - } - else - { - gdk_draw_arc (clist->clist_window, bg_gc, TRUE, - offset - (justify_right * 2 * TAB_SIZE), - cell_rectangle->y, - 2 * TAB_SIZE, clist->row_height, - (90 + (180 * justify_right)) * 64, 180 * 64); - gdk_draw_arc (clist->clist_window, ctree->lines_gc, FALSE, - offset - (justify_right * 2 * TAB_SIZE), - cell_rectangle->y, - 2 * TAB_SIZE, clist->row_height, - (90 + (180 * justify_right)) * 64, 180 * 64); - } - gdk_gc_set_clip_rectangle (bg_gc, NULL); - gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL); - - offset += justification_factor * 3; - break; - default: - xcenter = offset + justification_factor * PM_SIZE / 2; - - if (area) - { - tree_rectangle.y = crect->y; - tree_rectangle.height = crect->height; - - if (justify_right) - { - tree_rectangle.x = xcenter - PM_SIZE / 2 - 2; - tree_rectangle.width = (clip_rectangle->x + - clip_rectangle->width -tree_rectangle.x); - } - else - { - tree_rectangle.x = clip_rectangle->x + PM_SIZE / 2; - tree_rectangle.width = (xcenter + PM_SIZE / 2 + 2 - - clip_rectangle->x); - } - - if (!gdk_rectangle_intersect (area, &tree_rectangle, &tc_rectangle)) - break; - } - - offset_x = 1; - offset_y = 0; - if (ctree->line_style == GTK_CTREE_LINES_DOTTED) - { - offset_x += abs((clip_rectangle->x + clist->hoffset) % 2); - offset_y = abs((cell_rectangle->y + clist->voffset) % 2); - } - - clip_rectangle->y--; - clip_rectangle->height++; - gdk_gc_set_clip_rectangle (ctree->lines_gc, clip_rectangle); - gdk_draw_line (clist->clist_window, ctree->lines_gc, - xcenter, - (ctree->show_stub || clist->row_list->data != ctree_row) ? - cell_rectangle->y + offset_y : ycenter, - xcenter, - (ctree_row->sibling) ? crect->y +crect->height : ycenter); - - gdk_draw_line (clist->clist_window, ctree->lines_gc, - xcenter + (justification_factor * offset_x), ycenter, - xcenter + (justification_factor * (PM_SIZE / 2 + 2)), - ycenter); - - node = ctree_row->parent; - while (node) - { - xcenter -= (justification_factor * ctree->tree_indent); - - if (GTK_CTREE_ROW (node)->sibling) - gdk_draw_line (clist->clist_window, ctree->lines_gc, - xcenter, cell_rectangle->y + offset_y, - xcenter, crect->y + crect->height); - node = GTK_CTREE_ROW (node)->parent; - } - gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL); - clip_rectangle->y++; - clip_rectangle->height--; - break; - } - return offset; -} - -static void -draw_row (GtkCList *clist, - GdkRectangle *area, - gint row, - GtkCListRow *clist_row) -{ - GtkWidget *widget; - GtkCTree *ctree; - GdkRectangle *crect; - GdkRectangle row_rectangle; - GdkRectangle cell_rectangle; - GdkRectangle clip_rectangle; - GdkRectangle intersect_rectangle; - gint last_column; - gint column_left = 0; - gint column_right = 0; - gint offset = 0; - gint state; - gint i; - - g_return_if_fail (clist != NULL); - - /* bail now if we arn't drawable yet */ - if (!GTK_WIDGET_DRAWABLE (clist) || row < 0 || row >= clist->rows) - return; - - widget = GTK_WIDGET (clist); - ctree = GTK_CTREE (clist); - - /* if the function is passed the pointer to the row instead of null, - * it avoids this expensive lookup */ - if (!clist_row) - clist_row = (g_list_nth (clist->row_list, row))->data; - - /* rectangle of the entire row */ - row_rectangle.x = 0; - row_rectangle.y = ROW_TOP_YPIXEL (clist, row); - row_rectangle.width = clist->clist_window_width; - row_rectangle.height = clist->row_height; - - /* rectangle of the cell spacing above the row */ - cell_rectangle.x = 0; - cell_rectangle.y = row_rectangle.y - CELL_SPACING; - cell_rectangle.width = row_rectangle.width; - cell_rectangle.height = CELL_SPACING; - - /* rectangle used to clip drawing operations, its y and height - * positions only need to be set once, so we set them once here. - * the x and width are set withing the drawing loop below once per - * column */ - clip_rectangle.y = row_rectangle.y; - clip_rectangle.height = row_rectangle.height; - - if (clist_row->state == GTK_STATE_NORMAL) - { - if (clist_row->fg_set) - gdk_gc_set_foreground (clist->fg_gc, &clist_row->foreground); - if (clist_row->bg_set) - gdk_gc_set_foreground (clist->bg_gc, &clist_row->background); - } - - state = clist_row->state; - - gdk_gc_set_foreground (ctree->lines_gc, - &widget->style->fg[clist_row->state]); - - /* draw the cell borders */ - if (area) - { - crect = &intersect_rectangle; - - if (gdk_rectangle_intersect (area, &cell_rectangle, crect)) - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], TRUE, - crect->x, crect->y, crect->width, crect->height); - } - else - { - crect = &cell_rectangle; - - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], TRUE, - crect->x, crect->y, crect->width, crect->height); - } - - /* horizontal black lines */ - if (ctree->line_style == GTK_CTREE_LINES_TABBED) - { - - column_right = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) + - clist->column[ctree->tree_column].area.width + - COLUMN_INSET); - column_left = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) - - COLUMN_INSET - (ctree->tree_column != 0) * CELL_SPACING); - - switch (clist->column[ctree->tree_column].justification) - { - case GTK_JUSTIFY_CENTER: - case GTK_JUSTIFY_FILL: - case GTK_JUSTIFY_LEFT: - offset = (column_left + ctree->tree_indent * - (((GtkCTreeRow *)clist_row)->level - 1)); - - gdk_draw_line (clist->clist_window, ctree->lines_gc, - MIN (offset + TAB_SIZE, column_right), - cell_rectangle.y, - clist->clist_window_width, cell_rectangle.y); - break; - case GTK_JUSTIFY_RIGHT: - offset = (column_right - 1 - ctree->tree_indent * - (((GtkCTreeRow *)clist_row)->level - 1)); - - gdk_draw_line (clist->clist_window, ctree->lines_gc, - -1, cell_rectangle.y, - MAX (offset - TAB_SIZE, column_left), - cell_rectangle.y); - break; - } - } - - /* the last row has to clear its bottom cell spacing too */ - if (clist_row == clist->row_list_end->data) - { - cell_rectangle.y += clist->row_height + CELL_SPACING; - - if (!area || gdk_rectangle_intersect (area, &cell_rectangle, crect)) - { - gdk_draw_rectangle (clist->clist_window, - widget->style->base_gc[GTK_STATE_NORMAL], TRUE, - crect->x, crect->y, crect->width, crect->height); - - /* horizontal black lines */ - if (ctree->line_style == GTK_CTREE_LINES_TABBED) - { - switch (clist->column[ctree->tree_column].justification) - { - case GTK_JUSTIFY_CENTER: - case GTK_JUSTIFY_FILL: - case GTK_JUSTIFY_LEFT: - gdk_draw_line (clist->clist_window, ctree->lines_gc, - MIN (column_left + TAB_SIZE + COLUMN_INSET + - (((GtkCTreeRow *)clist_row)->level > 1) * - MIN (ctree->tree_indent / 2, TAB_SIZE), - column_right), - cell_rectangle.y, - clist->clist_window_width, cell_rectangle.y); - break; - case GTK_JUSTIFY_RIGHT: - gdk_draw_line (clist->clist_window, ctree->lines_gc, - -1, cell_rectangle.y, - MAX (column_right - TAB_SIZE - 1 - - COLUMN_INSET - - (((GtkCTreeRow *)clist_row)->level > 1) * - MIN (ctree->tree_indent / 2, TAB_SIZE), - column_left - 1), cell_rectangle.y); - break; - } - } - } - } - - for (last_column = clist->columns - 1; - last_column >= 0 && !clist->column[last_column].visible; last_column--) - ; - - /* iterate and draw all the columns (row cells) and draw their contents */ - for (i = 0; i < clist->columns; i++) - { - GtkStyle *style; - GdkGC *fg_gc; - GdkGC *bg_gc; - PangoLayout *layout = NULL; - PangoRectangle logical_rect; - - gint width; - gint height; - gint pixmap_width; - gint string_width; - gint old_offset; - - if (!clist->column[i].visible) - continue; - - get_cell_style (clist, clist_row, state, i, &style, &fg_gc, &bg_gc); - - /* calculate clipping region */ - clip_rectangle.x = clist->column[i].area.x + clist->hoffset; - clip_rectangle.width = clist->column[i].area.width; - - cell_rectangle.x = clip_rectangle.x - COLUMN_INSET - CELL_SPACING; - cell_rectangle.width = (clip_rectangle.width + 2 * COLUMN_INSET + - (1 + (i == last_column)) * CELL_SPACING); - cell_rectangle.y = clip_rectangle.y; - cell_rectangle.height = clip_rectangle.height; - - string_width = 0; - pixmap_width = 0; - - if (area && !gdk_rectangle_intersect (area, &cell_rectangle, - &intersect_rectangle)) - { - if (i != ctree->tree_column) - continue; - } - else - { - gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE, - crect->x, crect->y, crect->width, crect->height); - - - layout = _gtk_clist_create_cell_layout (clist, clist_row, i); - if (layout) - { - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - width = logical_rect.width; - } - else - width = 0; - - switch (clist_row->cell[i].type) - { - case GTK_CELL_PIXMAP: - gdk_drawable_get_size - (GTK_CELL_PIXMAP (clist_row->cell[i])->pixmap, &pixmap_width, - &height); - width += pixmap_width; - break; - case GTK_CELL_PIXTEXT: - if (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap) - { - gdk_drawable_get_size - (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap, - &pixmap_width, &height); - width += pixmap_width; - } - - if (GTK_CELL_PIXTEXT (clist_row->cell[i])->text && - GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap) - width += GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; - - if (i == ctree->tree_column) - width += (ctree->tree_indent * - ((GtkCTreeRow *)clist_row)->level); - break; - default: - break; - } - - switch (clist->column[i].justification) - { - case GTK_JUSTIFY_LEFT: - offset = clip_rectangle.x + clist_row->cell[i].horizontal; - break; - case GTK_JUSTIFY_RIGHT: - offset = (clip_rectangle.x + clist_row->cell[i].horizontal + - clip_rectangle.width - width); - break; - case GTK_JUSTIFY_CENTER: - case GTK_JUSTIFY_FILL: - offset = (clip_rectangle.x + clist_row->cell[i].horizontal + - (clip_rectangle.width / 2) - (width / 2)); - break; - }; - - if (i != ctree->tree_column) - { - offset += clist_row->cell[i].horizontal; - switch (clist_row->cell[i].type) - { - case GTK_CELL_PIXMAP: - draw_cell_pixmap - (clist->clist_window, &clip_rectangle, fg_gc, - GTK_CELL_PIXMAP (clist_row->cell[i])->pixmap, - GTK_CELL_PIXMAP (clist_row->cell[i])->mask, - offset, - clip_rectangle.y + clist_row->cell[i].vertical + - (clip_rectangle.height - height) / 2, - pixmap_width, height); - break; - case GTK_CELL_PIXTEXT: - offset = draw_cell_pixmap - (clist->clist_window, &clip_rectangle, fg_gc, - GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap, - GTK_CELL_PIXTEXT (clist_row->cell[i])->mask, - offset, - clip_rectangle.y + clist_row->cell[i].vertical + - (clip_rectangle.height - height) / 2, - pixmap_width, height); - offset += GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; - - /* Fall through */ - case GTK_CELL_TEXT: - if (layout) - { - gint row_center_offset = (clist->row_height - logical_rect.height) / 2; - - gdk_gc_set_clip_rectangle (fg_gc, &clip_rectangle); - gdk_draw_layout (clist->clist_window, fg_gc, - offset, - row_rectangle.y + row_center_offset + clist_row->cell[i].vertical, - layout); - gdk_gc_set_clip_rectangle (fg_gc, NULL); - g_object_unref (G_OBJECT (layout)); - } - break; - default: - break; - } - continue; - } - } - - if (bg_gc == clist->bg_gc) - gdk_gc_set_background (ctree->lines_gc, &clist_row->background); - - /* draw ctree->tree_column */ - cell_rectangle.y -= CELL_SPACING; - cell_rectangle.height += CELL_SPACING; - - if (area && !gdk_rectangle_intersect (area, &cell_rectangle, - &intersect_rectangle)) - { - if (layout) - g_object_unref (G_OBJECT (layout)); - continue; - } - - /* draw lines */ - offset = gtk_ctree_draw_lines (ctree, (GtkCTreeRow *)clist_row, row, i, - state, &clip_rectangle, &cell_rectangle, - crect, area, style); - - /* draw expander */ - offset = gtk_ctree_draw_expander (ctree, (GtkCTreeRow *)clist_row, - style, &clip_rectangle, offset); - - if (clist->column[i].justification == GTK_JUSTIFY_RIGHT) - offset -= ctree->tree_spacing; - else - offset += ctree->tree_spacing; - - if (clist->column[i].justification == GTK_JUSTIFY_RIGHT) - offset -= (pixmap_width + clist_row->cell[i].horizontal); - else - offset += clist_row->cell[i].horizontal; - - old_offset = offset; - offset = draw_cell_pixmap (clist->clist_window, &clip_rectangle, fg_gc, - GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap, - GTK_CELL_PIXTEXT (clist_row->cell[i])->mask, - offset, - clip_rectangle.y + clist_row->cell[i].vertical - + (clip_rectangle.height - height) / 2, - pixmap_width, height); - - if (layout) - { - gint row_center_offset = (clist->row_height - logical_rect.height) / 2; - - if (clist->column[i].justification == GTK_JUSTIFY_RIGHT) - { - offset = (old_offset - string_width); - if (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap) - offset -= GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; - } - else - { - if (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap) - offset += GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing; - } - - gdk_gc_set_clip_rectangle (fg_gc, &clip_rectangle); - gdk_draw_layout (clist->clist_window, fg_gc, - offset, - row_rectangle.y + row_center_offset + clist_row->cell[i].vertical, - layout); - - g_object_unref (G_OBJECT (layout)); - } - gdk_gc_set_clip_rectangle (fg_gc, NULL); - } - - /* draw focus rectangle */ - if (clist->focus_row == row && - GTK_WIDGET_CAN_FOCUS (widget) && gtk_widget_has_focus (widget)) - { - if (!area) - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, - row_rectangle.x, row_rectangle.y, - row_rectangle.width - 1, row_rectangle.height - 1); - else if (gdk_rectangle_intersect (area, &row_rectangle, - &intersect_rectangle)) - { - gdk_gc_set_clip_rectangle (clist->xor_gc, &intersect_rectangle); - gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, - row_rectangle.x, row_rectangle.y, - row_rectangle.width - 1, - row_rectangle.height - 1); - gdk_gc_set_clip_rectangle (clist->xor_gc, NULL); - } - } -} - -static void -tree_draw_node (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - - clist = GTK_CLIST (ctree); - - if (CLIST_UNFROZEN (clist) && gtk_ctree_is_viewable (ctree, node)) - { - GtkCTreeNode *work; - gint num = 0; - - work = GTK_CTREE_NODE (clist->row_list); - while (work && work != node) - { - work = GTK_CTREE_NODE_NEXT (work); - num++; - } - if (work && gtk_clist_row_is_visible (clist, num) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row - (clist, NULL, num, GTK_CLIST_ROW ((GList *) node)); - } -} - -static GtkCTreeNode * -gtk_ctree_last_visible (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCTreeNode *work; - - if (!node) - return NULL; - - work = GTK_CTREE_ROW (node)->children; - - if (!work || !GTK_CTREE_ROW (node)->expanded) - return node; - - while (GTK_CTREE_ROW (work)->sibling) - work = GTK_CTREE_ROW (work)->sibling; - - return gtk_ctree_last_visible (ctree, work); -} - -static void -gtk_ctree_link (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *parent, - GtkCTreeNode *sibling, - gboolean update_focus_row) -{ - GtkCList *clist; - GList *list_end; - GList *list; - GList *work; - gboolean visible = FALSE; - gint rows = 0; - - if (sibling) - g_return_if_fail (GTK_CTREE_ROW (sibling)->parent == parent); - g_return_if_fail (node != NULL); - g_return_if_fail (node != sibling); - g_return_if_fail (node != parent); - - clist = GTK_CLIST (ctree); - - if (update_focus_row && clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - for (rows = 1, list_end = (GList *)node; list_end->next; - list_end = list_end->next) - rows++; - - GTK_CTREE_ROW (node)->parent = parent; - GTK_CTREE_ROW (node)->sibling = sibling; - - if (!parent || (parent && (gtk_ctree_is_viewable (ctree, parent) && - GTK_CTREE_ROW (parent)->expanded))) - { - visible = TRUE; - clist->rows += rows; - } - - if (parent) - work = (GList *)(GTK_CTREE_ROW (parent)->children); - else - work = clist->row_list; - - if (sibling) - { - if (work != (GList *)sibling) - { - while (GTK_CTREE_ROW (work)->sibling != sibling) - work = (GList *)(GTK_CTREE_ROW (work)->sibling); - GTK_CTREE_ROW (work)->sibling = node; - } - - if (sibling == GTK_CTREE_NODE (clist->row_list)) - clist->row_list = (GList *) node; - if (GTK_CTREE_NODE_PREV (sibling) && - GTK_CTREE_NODE_NEXT (GTK_CTREE_NODE_PREV (sibling)) == sibling) - { - list = (GList *)GTK_CTREE_NODE_PREV (sibling); - list->next = (GList *)node; - } - - list = (GList *)node; - list->prev = (GList *)GTK_CTREE_NODE_PREV (sibling); - list_end->next = (GList *)sibling; - list = (GList *)sibling; - list->prev = list_end; - if (parent && GTK_CTREE_ROW (parent)->children == sibling) - GTK_CTREE_ROW (parent)->children = node; - } - else - { - if (work) - { - /* find sibling */ - while (GTK_CTREE_ROW (work)->sibling) - work = (GList *)(GTK_CTREE_ROW (work)->sibling); - GTK_CTREE_ROW (work)->sibling = node; - - /* find last visible child of sibling */ - work = (GList *) gtk_ctree_last_visible (ctree, - GTK_CTREE_NODE (work)); - - list_end->next = work->next; - if (work->next) - list = work->next->prev = list_end; - work->next = (GList *)node; - list = (GList *)node; - list->prev = work; - } - else - { - if (parent) - { - GTK_CTREE_ROW (parent)->children = node; - list = (GList *)node; - list->prev = (GList *)parent; - if (GTK_CTREE_ROW (parent)->expanded) - { - list_end->next = (GList *)GTK_CTREE_NODE_NEXT (parent); - if (GTK_CTREE_NODE_NEXT(parent)) - { - list = (GList *)GTK_CTREE_NODE_NEXT (parent); - list->prev = list_end; - } - list = (GList *)parent; - list->next = (GList *)node; - } - else - list_end->next = NULL; - } - else - { - clist->row_list = (GList *)node; - list = (GList *)node; - list->prev = NULL; - list_end->next = NULL; - } - } - } - - gtk_ctree_pre_recursive (ctree, node, tree_update_level, NULL); - - if (clist->row_list_end == NULL || - clist->row_list_end->next == (GList *)node) - clist->row_list_end = list_end; - - if (visible && update_focus_row) - { - gint pos; - - pos = g_list_position (clist->row_list, (GList *)node); - - if (pos <= clist->focus_row) - { - clist->focus_row += rows; - clist->undo_anchor = clist->focus_row; - } - } -} - -static void -gtk_ctree_unlink (GtkCTree *ctree, - GtkCTreeNode *node, - gboolean update_focus_row) -{ - GtkCList *clist; - gint rows; - gint level; - gint visible; - GtkCTreeNode *work; - GtkCTreeNode *parent; - GList *list; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - clist = GTK_CLIST (ctree); - - if (update_focus_row && clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - visible = gtk_ctree_is_viewable (ctree, node); - - /* clist->row_list_end unlinked ? */ - if (visible && - (GTK_CTREE_NODE_NEXT (node) == NULL || - (GTK_CTREE_ROW (node)->children && - gtk_ctree_is_ancestor (ctree, node, - GTK_CTREE_NODE (clist->row_list_end))))) - clist->row_list_end = (GList *) (GTK_CTREE_NODE_PREV (node)); - - /* update list */ - rows = 0; - level = GTK_CTREE_ROW (node)->level; - work = GTK_CTREE_NODE_NEXT (node); - while (work && GTK_CTREE_ROW (work)->level > level) - { - work = GTK_CTREE_NODE_NEXT (work); - rows++; - } - - if (visible) - { - clist->rows -= (rows + 1); - - if (update_focus_row) - { - gint pos; - - pos = g_list_position (clist->row_list, (GList *)node); - if (pos + rows < clist->focus_row) - clist->focus_row -= (rows + 1); - else if (pos <= clist->focus_row) - { - if (!GTK_CTREE_ROW (node)->sibling) - clist->focus_row = MAX (pos - 1, 0); - else - clist->focus_row = pos; - - clist->focus_row = MIN (clist->focus_row, clist->rows - 1); - } - clist->undo_anchor = clist->focus_row; - } - } - - if (work) - { - list = (GList *)GTK_CTREE_NODE_PREV (work); - list->next = NULL; - list = (GList *)work; - list->prev = (GList *)GTK_CTREE_NODE_PREV (node); - } - - if (GTK_CTREE_NODE_PREV (node) && - GTK_CTREE_NODE_NEXT (GTK_CTREE_NODE_PREV (node)) == node) - { - list = (GList *)GTK_CTREE_NODE_PREV (node); - list->next = (GList *)work; - } - - /* update tree */ - parent = GTK_CTREE_ROW (node)->parent; - if (parent) - { - if (GTK_CTREE_ROW (parent)->children == node) - { - GTK_CTREE_ROW (parent)->children = GTK_CTREE_ROW (node)->sibling; - if (!GTK_CTREE_ROW (parent)->children) - gtk_ctree_collapse (ctree, parent); - } - else - { - GtkCTreeNode *sibling; - - sibling = GTK_CTREE_ROW (parent)->children; - while (GTK_CTREE_ROW (sibling)->sibling != node) - sibling = GTK_CTREE_ROW (sibling)->sibling; - GTK_CTREE_ROW (sibling)->sibling = GTK_CTREE_ROW (node)->sibling; - } - } - else - { - if (clist->row_list == (GList *)node) - clist->row_list = (GList *) (GTK_CTREE_ROW (node)->sibling); - else - { - GtkCTreeNode *sibling; - - sibling = GTK_CTREE_NODE (clist->row_list); - while (GTK_CTREE_ROW (sibling)->sibling != node) - sibling = GTK_CTREE_ROW (sibling)->sibling; - GTK_CTREE_ROW (sibling)->sibling = GTK_CTREE_ROW (node)->sibling; - } - } -} - -static void -real_row_move (GtkCList *clist, - gint source_row, - gint dest_row) -{ - GtkCTree *ctree; - GtkCTreeNode *node; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - if (GTK_CLIST_AUTO_SORT (clist)) - return; - - if (source_row < 0 || source_row >= clist->rows || - dest_row < 0 || dest_row >= clist->rows || - source_row == dest_row) - return; - - ctree = GTK_CTREE (clist); - node = GTK_CTREE_NODE (g_list_nth (clist->row_list, source_row)); - - if (source_row < dest_row) - { - GtkCTreeNode *work; - - dest_row++; - work = GTK_CTREE_ROW (node)->children; - - while (work && GTK_CTREE_ROW (work)->level > GTK_CTREE_ROW (node)->level) - { - work = GTK_CTREE_NODE_NEXT (work); - dest_row++; - } - - if (dest_row > clist->rows) - dest_row = clist->rows; - } - - if (dest_row < clist->rows) - { - GtkCTreeNode *sibling; - - sibling = GTK_CTREE_NODE (g_list_nth (clist->row_list, dest_row)); - gtk_ctree_move (ctree, node, GTK_CTREE_ROW (sibling)->parent, sibling); - } - else - gtk_ctree_move (ctree, node, NULL, NULL); -} - -static void -real_tree_move (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *new_parent, - GtkCTreeNode *new_sibling) -{ - GtkCList *clist; - GtkCTreeNode *work; - gboolean visible = FALSE; - - g_return_if_fail (ctree != NULL); - g_return_if_fail (node != NULL); - g_return_if_fail (!new_sibling || - GTK_CTREE_ROW (new_sibling)->parent == new_parent); - - if (new_parent && GTK_CTREE_ROW (new_parent)->is_leaf) - return; - - /* new_parent != child of child */ - for (work = new_parent; work; work = GTK_CTREE_ROW (work)->parent) - if (work == node) - return; - - clist = GTK_CLIST (ctree); - - visible = gtk_ctree_is_viewable (ctree, node); - - if (clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - if (GTK_CLIST_AUTO_SORT (clist)) - { - if (new_parent == GTK_CTREE_ROW (node)->parent) - return; - - if (new_parent) - new_sibling = GTK_CTREE_ROW (new_parent)->children; - else - new_sibling = GTK_CTREE_NODE (clist->row_list); - - while (new_sibling && clist->compare - (clist, GTK_CTREE_ROW (node), GTK_CTREE_ROW (new_sibling)) > 0) - new_sibling = GTK_CTREE_ROW (new_sibling)->sibling; - } - - if (new_parent == GTK_CTREE_ROW (node)->parent && - new_sibling == GTK_CTREE_ROW (node)->sibling) - return; - - gtk_clist_freeze (clist); - - work = NULL; - if (gtk_ctree_is_viewable (ctree, node)) - work = GTK_CTREE_NODE (g_list_nth (clist->row_list, clist->focus_row)); - - gtk_ctree_unlink (ctree, node, FALSE); - gtk_ctree_link (ctree, node, new_parent, new_sibling, FALSE); - - if (work) - { - while (work && !gtk_ctree_is_viewable (ctree, work)) - work = GTK_CTREE_ROW (work)->parent; - clist->focus_row = g_list_position (clist->row_list, (GList *)work); - clist->undo_anchor = clist->focus_row; - } - - if (clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist) && - (visible || gtk_ctree_is_viewable (ctree, node))) - gtk_clist_set_column_width - (clist, ctree->tree_column, - gtk_clist_optimal_column_width (clist, ctree->tree_column)); - - gtk_clist_thaw (clist); -} - -static void -change_focus_row_expansion (GtkCTree *ctree, - GtkCTreeExpansionType action) -{ - GtkCList *clist; - GtkCTreeNode *node; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (ctree))) && - GTK_WIDGET_HAS_GRAB (ctree)) - return; - - if (!(node = - GTK_CTREE_NODE (g_list_nth (clist->row_list, clist->focus_row))) || - GTK_CTREE_ROW (node)->is_leaf || !(GTK_CTREE_ROW (node)->children)) - return; - - switch (action) - { - case GTK_CTREE_EXPANSION_EXPAND: - gtk_ctree_expand (ctree, node); - break; - case GTK_CTREE_EXPANSION_EXPAND_RECURSIVE: - gtk_ctree_expand_recursive (ctree, node); - break; - case GTK_CTREE_EXPANSION_COLLAPSE: - gtk_ctree_collapse (ctree, node); - break; - case GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE: - gtk_ctree_collapse_recursive (ctree, node); - break; - case GTK_CTREE_EXPANSION_TOGGLE: - gtk_ctree_toggle_expansion (ctree, node); - break; - case GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE: - gtk_ctree_toggle_expansion_recursive (ctree, node); - break; - } -} - -static void -real_tree_expand (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - GtkCTreeNode *work; - GtkRequisition requisition; - gboolean visible; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (!node || GTK_CTREE_ROW (node)->expanded || GTK_CTREE_ROW (node)->is_leaf) - return; - - clist = GTK_CLIST (ctree); - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - GTK_CTREE_ROW (node)->expanded = TRUE; - - visible = gtk_ctree_is_viewable (ctree, node); - /* get cell width if tree_column is auto resized */ - if (visible && clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, >K_CTREE_ROW (node)->row, ctree->tree_column, &requisition); - - /* unref/unset closed pixmap */ - if (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap) - { - g_object_unref - (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap); - - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = NULL; - - if (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask) - { - g_object_unref - (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask); - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask = NULL; - } - } - - /* set/ref opened pixmap */ - if (GTK_CTREE_ROW (node)->pixmap_opened) - { - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = - g_object_ref (GTK_CTREE_ROW (node)->pixmap_opened); - - if (GTK_CTREE_ROW (node)->mask_opened) - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask = - g_object_ref (GTK_CTREE_ROW (node)->mask_opened); - } - - - work = GTK_CTREE_ROW (node)->children; - if (work) - { - GList *list = (GList *)work; - gint *cell_width = NULL; - gint tmp = 0; - gint row; - gint i; - - if (visible && !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - cell_width = g_new0 (gint, clist->columns); - if (clist->column[ctree->tree_column].auto_resize) - cell_width[ctree->tree_column] = requisition.width; - - while (work) - { - /* search maximum cell widths of auto_resize columns */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - { - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, >K_CTREE_ROW (work)->row, i, &requisition); - cell_width[i] = MAX (requisition.width, cell_width[i]); - } - - list = (GList *)work; - work = GTK_CTREE_NODE_NEXT (work); - tmp++; - } - } - else - while (work) - { - list = (GList *)work; - work = GTK_CTREE_NODE_NEXT (work); - tmp++; - } - - list->next = (GList *)GTK_CTREE_NODE_NEXT (node); - - if (GTK_CTREE_NODE_NEXT (node)) - { - GList *tmp_list; - - tmp_list = (GList *)GTK_CTREE_NODE_NEXT (node); - tmp_list->prev = list; - } - else - clist->row_list_end = list; - - list = (GList *)node; - list->next = (GList *)(GTK_CTREE_ROW (node)->children); - - if (visible) - { - /* resize auto_resize columns if needed */ - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize && - cell_width[i] > clist->column[i].width) - gtk_clist_set_column_width (clist, i, cell_width[i]); - g_free (cell_width); - - /* update focus_row position */ - row = g_list_position (clist->row_list, (GList *)node); - if (row < clist->focus_row) - clist->focus_row += tmp; - - clist->rows += tmp; - CLIST_REFRESH (clist); - } - } - else if (visible && clist->column[ctree->tree_column].auto_resize) - /* resize tree_column if needed */ - column_auto_resize (clist, >K_CTREE_ROW (node)->row, ctree->tree_column, - requisition.width); -} - -static void -real_tree_collapse (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - GtkCTreeNode *work; - GtkRequisition requisition; - gboolean visible; - gint level; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (!node || !GTK_CTREE_ROW (node)->expanded || - GTK_CTREE_ROW (node)->is_leaf) - return; - - clist = GTK_CLIST (ctree); - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - GTK_CTREE_ROW (node)->expanded = FALSE; - level = GTK_CTREE_ROW (node)->level; - - visible = gtk_ctree_is_viewable (ctree, node); - /* get cell width if tree_column is auto resized */ - if (visible && clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, >K_CTREE_ROW (node)->row, ctree->tree_column, &requisition); - - /* unref/unset opened pixmap */ - if (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap) - { - g_object_unref - (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap); - - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = NULL; - - if (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask) - { - g_object_unref - (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask); - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask = NULL; - } - } - - /* set/ref closed pixmap */ - if (GTK_CTREE_ROW (node)->pixmap_closed) - { - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = - g_object_ref (GTK_CTREE_ROW (node)->pixmap_closed); - - if (GTK_CTREE_ROW (node)->mask_closed) - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask = - g_object_ref (GTK_CTREE_ROW (node)->mask_closed); - } - - work = GTK_CTREE_ROW (node)->children; - if (work) - { - gint tmp = 0; - gint row; - GList *list; - - while (work && GTK_CTREE_ROW (work)->level > level) - { - work = GTK_CTREE_NODE_NEXT (work); - tmp++; - } - - if (work) - { - list = (GList *)node; - list->next = (GList *)work; - list = (GList *)GTK_CTREE_NODE_PREV (work); - list->next = NULL; - list = (GList *)work; - list->prev = (GList *)node; - } - else - { - list = (GList *)node; - list->next = NULL; - clist->row_list_end = (GList *)node; - } - - if (visible) - { - /* resize auto_resize columns if needed */ - auto_resize_columns (clist); - - row = g_list_position (clist->row_list, (GList *)node); - if (row < clist->focus_row) - clist->focus_row -= tmp; - clist->rows -= tmp; - CLIST_REFRESH (clist); - } - } - else if (visible && clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - /* resize tree_column if needed */ - column_auto_resize (clist, >K_CTREE_ROW (node)->row, ctree->tree_column, - requisition.width); - -} - -static void -column_auto_resize (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - gint old_width) -{ - /* resize column if needed for auto_resize */ - GtkRequisition requisition; - - if (!clist->column[column].auto_resize || - GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - return; - - if (clist_row) - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - else - requisition.width = 0; - - if (requisition.width > clist->column[column].width) - gtk_clist_set_column_width (clist, column, requisition.width); - else if (requisition.width < old_width && - old_width == clist->column[column].width) - { - GList *list; - gint new_width; - - /* run a "gtk_clist_optimal_column_width" but break, if - * the column doesn't shrink */ - if (GTK_CLIST_SHOW_TITLES (clist) && clist->column[column].button) - new_width = (clist->column[column].button->requisition.width - - (CELL_SPACING + (2 * COLUMN_INSET))); - else - new_width = 0; - - for (list = clist->row_list; list; list = list->next) - { - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, GTK_CLIST_ROW (list), column, &requisition); - new_width = MAX (new_width, requisition.width); - if (new_width == clist->column[column].width) - break; - } - if (new_width < clist->column[column].width) - gtk_clist_set_column_width (clist, column, new_width); - } -} - -static void -auto_resize_columns (GtkCList *clist) -{ - gint i; - - if (GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - return; - - for (i = 0; i < clist->columns; i++) - column_auto_resize (clist, NULL, i, clist->column[i].width); -} - -static void -cell_size_request (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkRequisition *requisition) -{ - GtkCTree *ctree; - gint width; - gint height; - PangoLayout *layout; - PangoRectangle logical_rect; - - g_return_if_fail (GTK_IS_CTREE (clist)); - g_return_if_fail (requisition != NULL); - - ctree = GTK_CTREE (clist); - - layout = _gtk_clist_create_cell_layout (clist, clist_row, column); - if (layout) - { - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - - requisition->width = logical_rect.width; - requisition->height = logical_rect.height; - - g_object_unref (G_OBJECT (layout)); - } - else - { - requisition->width = 0; - requisition->height = 0; - } - - switch (clist_row->cell[column].type) - { - case GTK_CELL_PIXTEXT: - if (GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap) - { - gdk_drawable_get_size (GTK_CELL_PIXTEXT - (clist_row->cell[column])->pixmap, - &width, &height); - width += GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing; - } - else - width = height = 0; - - requisition->width += width; - requisition->height = MAX (requisition->height, height); - - if (column == ctree->tree_column) - { - requisition->width += (ctree->tree_spacing + ctree->tree_indent * - (((GtkCTreeRow *) clist_row)->level - 1)); - switch (ctree->expander_style) - { - case GTK_CTREE_EXPANDER_NONE: - break; - case GTK_CTREE_EXPANDER_TRIANGLE: - requisition->width += PM_SIZE + 3; - break; - case GTK_CTREE_EXPANDER_SQUARE: - case GTK_CTREE_EXPANDER_CIRCULAR: - requisition->width += PM_SIZE + 1; - break; - } - if (ctree->line_style == GTK_CTREE_LINES_TABBED) - requisition->width += 3; - } - break; - case GTK_CELL_PIXMAP: - gdk_drawable_get_size (GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap, - &width, &height); - requisition->width += width; - requisition->height = MAX (requisition->height, height); - break; - default: - break; - } - - requisition->width += clist_row->cell[column].horizontal; - requisition->height += clist_row->cell[column].vertical; -} - -static void -set_cell_contents (GtkCList *clist, - GtkCListRow *clist_row, - gint column, - GtkCellType type, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask) -{ - gboolean visible = FALSE; - GtkCTree *ctree; - GtkRequisition requisition; - gchar *old_text = NULL; - GdkPixmap *old_pixmap = NULL; - GdkBitmap *old_mask = NULL; - - g_return_if_fail (GTK_IS_CTREE (clist)); - g_return_if_fail (clist_row != NULL); - - ctree = GTK_CTREE (clist); - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - GtkCTreeNode *parent; - - parent = ((GtkCTreeRow *)clist_row)->parent; - if (!parent || (parent && GTK_CTREE_ROW (parent)->expanded && - gtk_ctree_is_viewable (ctree, parent))) - { - visible = TRUE; - GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row, - column, &requisition); - } - } - - switch (clist_row->cell[column].type) - { - case GTK_CELL_EMPTY: - break; - case GTK_CELL_TEXT: - old_text = GTK_CELL_TEXT (clist_row->cell[column])->text; - break; - case GTK_CELL_PIXMAP: - old_pixmap = GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap; - old_mask = GTK_CELL_PIXMAP (clist_row->cell[column])->mask; - break; - case GTK_CELL_PIXTEXT: - old_text = GTK_CELL_PIXTEXT (clist_row->cell[column])->text; - old_pixmap = GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap; - old_mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask; - break; - case GTK_CELL_WIDGET: - /* unimplemented */ - break; - - default: - break; - } - - clist_row->cell[column].type = GTK_CELL_EMPTY; - if (column == ctree->tree_column && type != GTK_CELL_EMPTY) - type = GTK_CELL_PIXTEXT; - - /* Note that pixmap and mask were already ref'ed by the caller - */ - switch (type) - { - case GTK_CELL_TEXT: - if (text) - { - clist_row->cell[column].type = GTK_CELL_TEXT; - GTK_CELL_TEXT (clist_row->cell[column])->text = g_strdup (text); - } - break; - case GTK_CELL_PIXMAP: - if (pixmap) - { - clist_row->cell[column].type = GTK_CELL_PIXMAP; - GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap = pixmap; - /* We set the mask even if it is NULL */ - GTK_CELL_PIXMAP (clist_row->cell[column])->mask = mask; - } - break; - case GTK_CELL_PIXTEXT: - if (column == ctree->tree_column) - { - clist_row->cell[column].type = GTK_CELL_PIXTEXT; - GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing = spacing; - if (text) - GTK_CELL_PIXTEXT (clist_row->cell[column])->text = g_strdup (text); - else - GTK_CELL_PIXTEXT (clist_row->cell[column])->text = NULL; - if (pixmap) - { - GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap = pixmap; - GTK_CELL_PIXTEXT (clist_row->cell[column])->mask = mask; - } - else - { - GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap = NULL; - GTK_CELL_PIXTEXT (clist_row->cell[column])->mask = NULL; - } - } - else if (text && pixmap) - { - clist_row->cell[column].type = GTK_CELL_PIXTEXT; - GTK_CELL_PIXTEXT (clist_row->cell[column])->text = g_strdup (text); - GTK_CELL_PIXTEXT (clist_row->cell[column])->spacing = spacing; - GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap = pixmap; - GTK_CELL_PIXTEXT (clist_row->cell[column])->mask = mask; - } - break; - default: - break; - } - - if (visible && clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - column_auto_resize (clist, clist_row, column, requisition.width); - - g_free (old_text); - if (old_pixmap) - g_object_unref (old_pixmap); - if (old_mask) - g_object_unref (old_mask); -} - -static void -set_node_info (GtkCTree *ctree, - GtkCTreeNode *node, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap_closed, - GdkBitmap *mask_closed, - GdkPixmap *pixmap_opened, - GdkBitmap *mask_opened, - gboolean is_leaf, - gboolean expanded) -{ - if (GTK_CTREE_ROW (node)->pixmap_opened) - { - g_object_unref (GTK_CTREE_ROW (node)->pixmap_opened); - if (GTK_CTREE_ROW (node)->mask_opened) - g_object_unref (GTK_CTREE_ROW (node)->mask_opened); - } - if (GTK_CTREE_ROW (node)->pixmap_closed) - { - g_object_unref (GTK_CTREE_ROW (node)->pixmap_closed); - if (GTK_CTREE_ROW (node)->mask_closed) - g_object_unref (GTK_CTREE_ROW (node)->mask_closed); - } - - GTK_CTREE_ROW (node)->pixmap_opened = NULL; - GTK_CTREE_ROW (node)->mask_opened = NULL; - GTK_CTREE_ROW (node)->pixmap_closed = NULL; - GTK_CTREE_ROW (node)->mask_closed = NULL; - - if (pixmap_closed) - { - GTK_CTREE_ROW (node)->pixmap_closed = g_object_ref (pixmap_closed); - if (mask_closed) - GTK_CTREE_ROW (node)->mask_closed = g_object_ref (mask_closed); - } - if (pixmap_opened) - { - GTK_CTREE_ROW (node)->pixmap_opened = g_object_ref (pixmap_opened); - if (mask_opened) - GTK_CTREE_ROW (node)->mask_opened = g_object_ref (mask_opened); - } - - GTK_CTREE_ROW (node)->is_leaf = is_leaf; - GTK_CTREE_ROW (node)->expanded = (is_leaf) ? FALSE : expanded; - - if (GTK_CTREE_ROW (node)->expanded) - gtk_ctree_node_set_pixtext (ctree, node, ctree->tree_column, - text, spacing, pixmap_opened, mask_opened); - else - gtk_ctree_node_set_pixtext (ctree, node, ctree->tree_column, - text, spacing, pixmap_closed, mask_closed); -} - -static void -tree_delete (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - tree_unselect (ctree, node, NULL); - row_delete (ctree, GTK_CTREE_ROW (node)); - g_list_free_1 ((GList *)node); -} - -static void -tree_delete_row (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - row_delete (ctree, GTK_CTREE_ROW (node)); - g_list_free_1 ((GList *)node); -} - -static void -tree_update_level (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (!node) - return; - - if (GTK_CTREE_ROW (node)->parent) - GTK_CTREE_ROW (node)->level = - GTK_CTREE_ROW (GTK_CTREE_ROW (node)->parent)->level + 1; - else - GTK_CTREE_ROW (node)->level = 1; -} - -static void -tree_select (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (node && GTK_CTREE_ROW (node)->row.state != GTK_STATE_SELECTED && - GTK_CTREE_ROW (node)->row.selectable) - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], - node, -1); -} - -static void -tree_unselect (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (node && GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], - node, -1); -} - -static void -tree_expand (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (node && !GTK_CTREE_ROW (node)->expanded) - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_EXPAND], node); -} - -static void -tree_collapse (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (node && GTK_CTREE_ROW (node)->expanded) - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], node); -} - -static void -tree_collapse_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth) -{ - if (node && GTK_CTREE_ROW (node)->level == depth) - gtk_ctree_collapse_recursive (ctree, node); -} - -static void -tree_toggle_expansion (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (!node) - return; - - if (GTK_CTREE_ROW (node)->expanded) - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], node); - else - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_EXPAND], node); -} - -static GtkCTreeRow * -row_new (GtkCTree *ctree) -{ - GtkCList *clist; - GtkCTreeRow *ctree_row; - int i; - - clist = GTK_CLIST (ctree); - ctree_row = g_slice_new (GtkCTreeRow); - ctree_row->row.cell = g_slice_alloc (sizeof (GtkCell) * clist->columns); - - for (i = 0; i < clist->columns; i++) - { - ctree_row->row.cell[i].type = GTK_CELL_EMPTY; - ctree_row->row.cell[i].vertical = 0; - ctree_row->row.cell[i].horizontal = 0; - ctree_row->row.cell[i].style = NULL; - } - - GTK_CELL_PIXTEXT (ctree_row->row.cell[ctree->tree_column])->text = NULL; - - ctree_row->row.fg_set = FALSE; - ctree_row->row.bg_set = FALSE; - ctree_row->row.style = NULL; - ctree_row->row.selectable = TRUE; - ctree_row->row.state = GTK_STATE_NORMAL; - ctree_row->row.data = NULL; - ctree_row->row.destroy = NULL; - - ctree_row->level = 0; - ctree_row->expanded = FALSE; - ctree_row->parent = NULL; - ctree_row->sibling = NULL; - ctree_row->children = NULL; - ctree_row->pixmap_closed = NULL; - ctree_row->mask_closed = NULL; - ctree_row->pixmap_opened = NULL; - ctree_row->mask_opened = NULL; - - return ctree_row; -} - -static void -row_delete (GtkCTree *ctree, - GtkCTreeRow *ctree_row) -{ - GtkCList *clist; - gint i; - - clist = GTK_CLIST (ctree); - - for (i = 0; i < clist->columns; i++) - { - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, &(ctree_row->row), i, GTK_CELL_EMPTY, NULL, 0, NULL, NULL); - if (ctree_row->row.cell[i].style) - { - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gtk_style_detach (ctree_row->row.cell[i].style); - g_object_unref (ctree_row->row.cell[i].style); - } - } - - if (ctree_row->row.style) - { - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gtk_style_detach (ctree_row->row.style); - g_object_unref (ctree_row->row.style); - } - - if (ctree_row->pixmap_closed) - { - g_object_unref (ctree_row->pixmap_closed); - if (ctree_row->mask_closed) - g_object_unref (ctree_row->mask_closed); - } - - if (ctree_row->pixmap_opened) - { - g_object_unref (ctree_row->pixmap_opened); - if (ctree_row->mask_opened) - g_object_unref (ctree_row->mask_opened); - } - - if (ctree_row->row.destroy) - { - GDestroyNotify dnotify = ctree_row->row.destroy; - gpointer ddata = ctree_row->row.data; - - ctree_row->row.destroy = NULL; - ctree_row->row.data = NULL; - - dnotify (ddata); - } - - g_slice_free1 (sizeof (GtkCell) * clist->columns, ctree_row->row.cell); - g_slice_free (GtkCTreeRow, ctree_row); -} - -static void -real_select_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event) -{ - GList *node; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - if ((node = g_list_nth (clist->row_list, row)) && - GTK_CTREE_ROW (node)->row.selectable) - gtk_signal_emit (GTK_OBJECT (clist), ctree_signals[TREE_SELECT_ROW], - node, column); -} - -static void -real_unselect_row (GtkCList *clist, - gint row, - gint column, - GdkEvent *event) -{ - GList *node; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - if ((node = g_list_nth (clist->row_list, row))) - gtk_signal_emit (GTK_OBJECT (clist), ctree_signals[TREE_UNSELECT_ROW], - node, column); -} - -static void -real_tree_select (GtkCTree *ctree, - GtkCTreeNode *node, - gint column) -{ - GtkCList *clist; - GList *list; - GtkCTreeNode *sel_row; - gboolean node_selected; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (!node || GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED || - !GTK_CTREE_ROW (node)->row.selectable) - return; - - clist = GTK_CLIST (ctree); - - switch (clist->selection_mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - - node_selected = FALSE; - list = clist->selection; - - while (list) - { - sel_row = list->data; - list = list->next; - - if (node == sel_row) - node_selected = TRUE; - else - gtk_signal_emit (GTK_OBJECT (ctree), - ctree_signals[TREE_UNSELECT_ROW], sel_row, column); - } - - if (node_selected) - return; - - default: - break; - } - - GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; - - if (!clist->selection) - { - clist->selection = g_list_append (clist->selection, node); - clist->selection_end = clist->selection; - } - else - clist->selection_end = g_list_append (clist->selection_end, node)->next; - - tree_draw_node (ctree, node); -} - -static void -real_tree_unselect (GtkCTree *ctree, - GtkCTreeNode *node, - gint column) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (!node || GTK_CTREE_ROW (node)->row.state != GTK_STATE_SELECTED) - return; - - clist = GTK_CLIST (ctree); - - if (clist->selection_end && clist->selection_end->data == node) - clist->selection_end = clist->selection_end->prev; - - clist->selection = g_list_remove (clist->selection, node); - - GTK_CTREE_ROW (node)->row.state = GTK_STATE_NORMAL; - - tree_draw_node (ctree, node); -} - -static void -select_row_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - if (!node || GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED || - !GTK_CTREE_ROW (node)->row.selectable) - return; - - GTK_CLIST (ctree)->undo_unselection = - g_list_prepend (GTK_CLIST (ctree)->undo_unselection, node); - gtk_ctree_select (ctree, node); -} - -static void -real_select_all (GtkCList *clist) -{ - GtkCTree *ctree; - GtkCTreeNode *node; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - ctree = GTK_CTREE (clist); - - switch (clist->selection_mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - return; - - case GTK_SELECTION_MULTIPLE: - - gtk_clist_freeze (clist); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - clist->anchor_state = GTK_STATE_SELECTED; - clist->anchor = -1; - clist->drag_pos = -1; - clist->undo_anchor = clist->focus_row; - - for (node = GTK_CTREE_NODE (clist->row_list); node; - node = GTK_CTREE_NODE_NEXT (node)) - gtk_ctree_pre_recursive (ctree, node, select_row_recursive, NULL); - - gtk_clist_thaw (clist); - break; - - default: - /* do nothing */ - break; - } -} - -static void -real_unselect_all (GtkCList *clist) -{ - GtkCTree *ctree; - GtkCTreeNode *node; - GList *list; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - ctree = GTK_CTREE (clist); - - switch (clist->selection_mode) - { - case GTK_SELECTION_BROWSE: - if (clist->focus_row >= 0) - { - gtk_ctree_select - (ctree, - GTK_CTREE_NODE (g_list_nth (clist->row_list, clist->focus_row))); - return; - } - break; - - case GTK_SELECTION_MULTIPLE: - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - clist->anchor = -1; - clist->drag_pos = -1; - clist->undo_anchor = clist->focus_row; - break; - - default: - break; - } - - list = clist->selection; - - while (list) - { - node = list->data; - list = list->next; - gtk_ctree_unselect (ctree, node); - } -} - -static gboolean -ctree_is_hot_spot (GtkCTree *ctree, - GtkCTreeNode *node, - gint row, - gint x, - gint y) -{ - GtkCTreeRow *tree_row; - GtkCList *clist; - gint xl; - gint yu; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - clist = GTK_CLIST (ctree); - - if (!clist->column[ctree->tree_column].visible || - ctree->expander_style == GTK_CTREE_EXPANDER_NONE) - return FALSE; - - tree_row = GTK_CTREE_ROW (node); - - yu = (ROW_TOP_YPIXEL (clist, row) + (clist->row_height - PM_SIZE) / 2 - - (clist->row_height - 1) % 2); - - if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT) - xl = (clist->column[ctree->tree_column].area.x + - clist->column[ctree->tree_column].area.width - 1 + clist->hoffset - - (tree_row->level - 1) * ctree->tree_indent - PM_SIZE - - (ctree->line_style == GTK_CTREE_LINES_TABBED) * 3); - else - xl = (clist->column[ctree->tree_column].area.x + clist->hoffset + - (tree_row->level - 1) * ctree->tree_indent + - (ctree->line_style == GTK_CTREE_LINES_TABBED) * 3); - - return (x >= xl && x <= xl + PM_SIZE && y >= yu && y <= yu + PM_SIZE); -} - -/*********************************************************** - *********************************************************** - *** Public interface *** - *********************************************************** - ***********************************************************/ - - -/*********************************************************** - * Creation, insertion, deletion * - ***********************************************************/ - -static GObject* -gtk_ctree_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GObject *object = G_OBJECT_CLASS (parent_class)->constructor (type, - n_construct_properties, - construct_properties); - - return object; -} - -GtkWidget* -gtk_ctree_new_with_titles (gint columns, - gint tree_column, - gchar *titles[]) -{ - GtkWidget *widget; - - g_return_val_if_fail (columns > 0, NULL); - g_return_val_if_fail (tree_column >= 0 && tree_column < columns, NULL); - - widget = g_object_new (GTK_TYPE_CTREE, - "n_columns", columns, - "tree_column", tree_column, - NULL); - if (titles) - { - GtkCList *clist = GTK_CLIST (widget); - guint i; - - for (i = 0; i < columns; i++) - gtk_clist_set_column_title (clist, i, titles[i]); - gtk_clist_column_titles_show (clist); - } - - return widget; -} - -GtkWidget * -gtk_ctree_new (gint columns, - gint tree_column) -{ - return gtk_ctree_new_with_titles (columns, tree_column, NULL); -} - -static gint -real_insert_row (GtkCList *clist, - gint row, - gchar *text[]) -{ - GtkCTreeNode *parent = NULL; - GtkCTreeNode *sibling; - GtkCTreeNode *node; - - g_return_val_if_fail (GTK_IS_CTREE (clist), -1); - - sibling = GTK_CTREE_NODE (g_list_nth (clist->row_list, row)); - if (sibling) - parent = GTK_CTREE_ROW (sibling)->parent; - - node = gtk_ctree_insert_node (GTK_CTREE (clist), parent, sibling, text, 5, - NULL, NULL, NULL, NULL, TRUE, FALSE); - - if (GTK_CLIST_AUTO_SORT (clist) || !sibling) - return g_list_position (clist->row_list, (GList *) node); - - return row; -} - - -/** - * gtk_ctree_insert_node: - * @pixmap_closed: (allow-none): - * @mask_closed: (allow-none): - * @pixmap_opened: (allow-none): - * @mask_opened: (allow-none): - */ -GtkCTreeNode * -gtk_ctree_insert_node (GtkCTree *ctree, - GtkCTreeNode *parent, - GtkCTreeNode *sibling, - gchar *text[], - guint8 spacing, - GdkPixmap *pixmap_closed, - GdkBitmap *mask_closed, - GdkPixmap *pixmap_opened, - GdkBitmap *mask_opened, - gboolean is_leaf, - gboolean expanded) -{ - GtkCList *clist; - GtkCTreeRow *new_row; - GtkCTreeNode *node; - GList *list; - gint i; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - if (sibling) - g_return_val_if_fail (GTK_CTREE_ROW (sibling)->parent == parent, NULL); - - if (parent && GTK_CTREE_ROW (parent)->is_leaf) - return NULL; - - clist = GTK_CLIST (ctree); - - /* create the row */ - new_row = row_new (ctree); - list = g_list_alloc (); - list->data = new_row; - node = GTK_CTREE_NODE (list); - - if (text) - for (i = 0; i < clist->columns; i++) - if (text[i] && i != ctree->tree_column) - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, &(new_row->row), i, GTK_CELL_TEXT, text[i], 0, NULL, NULL); - - set_node_info (ctree, node, text ? - text[ctree->tree_column] : NULL, spacing, pixmap_closed, - mask_closed, pixmap_opened, mask_opened, is_leaf, expanded); - - /* sorted insertion */ - if (GTK_CLIST_AUTO_SORT (clist)) - { - if (parent) - sibling = GTK_CTREE_ROW (parent)->children; - else - sibling = GTK_CTREE_NODE (clist->row_list); - - while (sibling && clist->compare - (clist, GTK_CTREE_ROW (node), GTK_CTREE_ROW (sibling)) > 0) - sibling = GTK_CTREE_ROW (sibling)->sibling; - } - - gtk_ctree_link (ctree, node, parent, sibling, TRUE); - - if (text && !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist) && - gtk_ctree_is_viewable (ctree, node)) - { - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - column_auto_resize (clist, &(new_row->row), i, 0); - } - - if (clist->rows == 1) - { - clist->focus_row = 0; - if (clist->selection_mode == GTK_SELECTION_BROWSE) - gtk_ctree_select (ctree, node); - } - - - CLIST_REFRESH (clist); - - return node; -} - -GtkCTreeNode * -gtk_ctree_insert_gnode (GtkCTree *ctree, - GtkCTreeNode *parent, - GtkCTreeNode *sibling, - GNode *gnode, - GtkCTreeGNodeFunc func, - gpointer data) -{ - GtkCList *clist; - GtkCTreeNode *cnode = NULL; - GtkCTreeNode *child = NULL; - GtkCTreeNode *new_child; - GList *list; - GNode *work; - guint depth = 1; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - g_return_val_if_fail (gnode != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - if (sibling) - g_return_val_if_fail (GTK_CTREE_ROW (sibling)->parent == parent, NULL); - - clist = GTK_CLIST (ctree); - - if (parent) - depth = GTK_CTREE_ROW (parent)->level + 1; - - list = g_list_alloc (); - list->data = row_new (ctree); - cnode = GTK_CTREE_NODE (list); - - gtk_clist_freeze (clist); - - set_node_info (ctree, cnode, "", 0, NULL, NULL, NULL, NULL, TRUE, FALSE); - - if (!func (ctree, depth, gnode, cnode, data)) - { - tree_delete_row (ctree, cnode, NULL); - gtk_clist_thaw (clist); - return NULL; - } - - if (GTK_CLIST_AUTO_SORT (clist)) - { - if (parent) - sibling = GTK_CTREE_ROW (parent)->children; - else - sibling = GTK_CTREE_NODE (clist->row_list); - - while (sibling && clist->compare - (clist, GTK_CTREE_ROW (cnode), GTK_CTREE_ROW (sibling)) > 0) - sibling = GTK_CTREE_ROW (sibling)->sibling; - } - - gtk_ctree_link (ctree, cnode, parent, sibling, TRUE); - - for (work = g_node_last_child (gnode); work; work = work->prev) - { - new_child = gtk_ctree_insert_gnode (ctree, cnode, child, - work, func, data); - if (new_child) - child = new_child; - } - - gtk_clist_thaw (clist); - - return cnode; -} - -GNode * -gtk_ctree_export_to_gnode (GtkCTree *ctree, - GNode *parent, - GNode *sibling, - GtkCTreeNode *node, - GtkCTreeGNodeFunc func, - gpointer data) -{ - GtkCTreeNode *work; - GNode *gnode; - gint depth; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - if (sibling) - { - g_return_val_if_fail (parent != NULL, NULL); - g_return_val_if_fail (sibling->parent == parent, NULL); - } - - gnode = g_node_new (NULL); - depth = g_node_depth (parent) + 1; - - if (!func (ctree, depth, gnode, node, data)) - { - g_node_destroy (gnode); - return NULL; - } - - if (parent) - g_node_insert_before (parent, sibling, gnode); - - if (!GTK_CTREE_ROW (node)->is_leaf) - { - GNode *new_sibling = NULL; - - for (work = GTK_CTREE_ROW (node)->children; work; - work = GTK_CTREE_ROW (work)->sibling) - new_sibling = gtk_ctree_export_to_gnode (ctree, gnode, new_sibling, - work, func, data); - - g_node_reverse_children (gnode); - } - - return gnode; -} - -static void -real_remove_row (GtkCList *clist, - gint row) -{ - GtkCTreeNode *node; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - node = GTK_CTREE_NODE (g_list_nth (clist->row_list, row)); - - if (node) - gtk_ctree_remove_node (GTK_CTREE (clist), node); -} - -void -gtk_ctree_remove_node (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - gtk_clist_freeze (clist); - - if (node) - { - gtk_ctree_unlink (ctree, node, TRUE); - gtk_ctree_post_recursive (ctree, node, GTK_CTREE_FUNC (tree_delete), - NULL); - if (clist->selection_mode == GTK_SELECTION_BROWSE && !clist->selection && - clist->focus_row >= 0) - gtk_clist_select_row (clist, clist->focus_row, -1); - - auto_resize_columns (clist); - } - else - gtk_clist_clear (clist); - - gtk_clist_thaw (clist); -} - -static void -real_clear (GtkCList *clist) -{ - GtkCTree *ctree; - GtkCTreeNode *work; - GtkCTreeNode *ptr; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - ctree = GTK_CTREE (clist); - - /* remove all rows */ - work = GTK_CTREE_NODE (clist->row_list); - clist->row_list = NULL; - clist->row_list_end = NULL; - - GTK_CLIST_SET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - while (work) - { - ptr = work; - work = GTK_CTREE_ROW (work)->sibling; - gtk_ctree_post_recursive (ctree, ptr, GTK_CTREE_FUNC (tree_delete_row), - NULL); - } - GTK_CLIST_UNSET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - - parent_class->clear (clist); -} - - -/*********************************************************** - * Generic recursive functions, querying / finding tree * - * information * - ***********************************************************/ - - -void -gtk_ctree_post_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeFunc func, - gpointer data) -{ - GtkCTreeNode *work; - GtkCTreeNode *tmp; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (func != NULL); - - if (node) - work = GTK_CTREE_ROW (node)->children; - else - work = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (work) - { - tmp = GTK_CTREE_ROW (work)->sibling; - gtk_ctree_post_recursive (ctree, work, func, data); - work = tmp; - } - - if (node) - func (ctree, node, data); -} - -void -gtk_ctree_post_recursive_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth, - GtkCTreeFunc func, - gpointer data) -{ - GtkCTreeNode *work; - GtkCTreeNode *tmp; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (func != NULL); - - if (depth < 0) - { - gtk_ctree_post_recursive (ctree, node, func, data); - return; - } - - if (node) - work = GTK_CTREE_ROW (node)->children; - else - work = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - if (work && GTK_CTREE_ROW (work)->level <= depth) - { - while (work) - { - tmp = GTK_CTREE_ROW (work)->sibling; - gtk_ctree_post_recursive_to_depth (ctree, work, depth, func, data); - work = tmp; - } - } - - if (node && GTK_CTREE_ROW (node)->level <= depth) - func (ctree, node, data); -} - -void -gtk_ctree_pre_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeFunc func, - gpointer data) -{ - GtkCTreeNode *work; - GtkCTreeNode *tmp; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (func != NULL); - - if (node) - { - work = GTK_CTREE_ROW (node)->children; - func (ctree, node, data); - } - else - work = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (work) - { - tmp = GTK_CTREE_ROW (work)->sibling; - gtk_ctree_pre_recursive (ctree, work, func, data); - work = tmp; - } -} - -void -gtk_ctree_pre_recursive_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth, - GtkCTreeFunc func, - gpointer data) -{ - GtkCTreeNode *work; - GtkCTreeNode *tmp; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (func != NULL); - - if (depth < 0) - { - gtk_ctree_pre_recursive (ctree, node, func, data); - return; - } - - if (node) - { - work = GTK_CTREE_ROW (node)->children; - if (GTK_CTREE_ROW (node)->level <= depth) - func (ctree, node, data); - } - else - work = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - if (work && GTK_CTREE_ROW (work)->level <= depth) - { - while (work) - { - tmp = GTK_CTREE_ROW (work)->sibling; - gtk_ctree_pre_recursive_to_depth (ctree, work, depth, func, data); - work = tmp; - } - } -} - -gboolean -gtk_ctree_is_viewable (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCTreeRow *work; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - work = GTK_CTREE_ROW (node); - - while (work->parent && GTK_CTREE_ROW (work->parent)->expanded) - work = GTK_CTREE_ROW (work->parent); - - if (!work->parent) - return TRUE; - - return FALSE; -} - -GtkCTreeNode * -gtk_ctree_last (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - - if (!node) - return NULL; - - while (GTK_CTREE_ROW (node)->sibling) - node = GTK_CTREE_ROW (node)->sibling; - - if (GTK_CTREE_ROW (node)->children) - return gtk_ctree_last (ctree, GTK_CTREE_ROW (node)->children); - - return node; -} - -GtkCTreeNode * -gtk_ctree_find_node_ptr (GtkCTree *ctree, - GtkCTreeRow *ctree_row) -{ - GtkCTreeNode *node; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - g_return_val_if_fail (ctree_row != NULL, NULL); - - if (ctree_row->parent) - node = GTK_CTREE_ROW (ctree_row->parent)->children; - else - node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (GTK_CTREE_ROW (node) != ctree_row) - node = GTK_CTREE_ROW (node)->sibling; - - return node; -} - -GtkCTreeNode * -gtk_ctree_node_nth (GtkCTree *ctree, - guint row) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - - if ((row >= GTK_CLIST(ctree)->rows)) - return NULL; - - return GTK_CTREE_NODE (g_list_nth (GTK_CLIST (ctree)->row_list, row)); -} - -gboolean -gtk_ctree_find (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *child) -{ - if (!child) - return FALSE; - - if (!node) - node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (node) - { - if (node == child) - return TRUE; - if (GTK_CTREE_ROW (node)->children) - { - if (gtk_ctree_find (ctree, GTK_CTREE_ROW (node)->children, child)) - return TRUE; - } - node = GTK_CTREE_ROW (node)->sibling; - } - return FALSE; -} - -gboolean -gtk_ctree_is_ancestor (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *child) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - if (GTK_CTREE_ROW (node)->children) - return gtk_ctree_find (ctree, GTK_CTREE_ROW (node)->children, child); - - return FALSE; -} - -GtkCTreeNode * -gtk_ctree_find_by_row_data (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - GtkCTreeNode *work; - - if (!node) - node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (node) - { - if (GTK_CTREE_ROW (node)->row.data == data) - return node; - if (GTK_CTREE_ROW (node)->children && - (work = gtk_ctree_find_by_row_data - (ctree, GTK_CTREE_ROW (node)->children, data))) - return work; - node = GTK_CTREE_ROW (node)->sibling; - } - return NULL; -} - -GList * -gtk_ctree_find_all_by_row_data (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - GList *list = NULL; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - - /* if node == NULL then look in the whole tree */ - if (!node) - node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (node) - { - if (GTK_CTREE_ROW (node)->row.data == data) - list = g_list_append (list, node); - - if (GTK_CTREE_ROW (node)->children) - { - GList *sub_list; - - sub_list = gtk_ctree_find_all_by_row_data (ctree, - GTK_CTREE_ROW - (node)->children, - data); - list = g_list_concat (list, sub_list); - } - node = GTK_CTREE_ROW (node)->sibling; - } - return list; -} - -GtkCTreeNode * -gtk_ctree_find_by_row_data_custom (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data, - GCompareFunc func) -{ - GtkCTreeNode *work; - - g_return_val_if_fail (func != NULL, NULL); - - if (!node) - node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (node) - { - if (!func (GTK_CTREE_ROW (node)->row.data, data)) - return node; - if (GTK_CTREE_ROW (node)->children && - (work = gtk_ctree_find_by_row_data_custom - (ctree, GTK_CTREE_ROW (node)->children, data, func))) - return work; - node = GTK_CTREE_ROW (node)->sibling; - } - return NULL; -} - -GList * -gtk_ctree_find_all_by_row_data_custom (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data, - GCompareFunc func) -{ - GList *list = NULL; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - g_return_val_if_fail (func != NULL, NULL); - - /* if node == NULL then look in the whole tree */ - if (!node) - node = GTK_CTREE_NODE (GTK_CLIST (ctree)->row_list); - - while (node) - { - if (!func (GTK_CTREE_ROW (node)->row.data, data)) - list = g_list_append (list, node); - - if (GTK_CTREE_ROW (node)->children) - { - GList *sub_list; - - sub_list = gtk_ctree_find_all_by_row_data_custom (ctree, - GTK_CTREE_ROW - (node)->children, - data, - func); - list = g_list_concat (list, sub_list); - } - node = GTK_CTREE_ROW (node)->sibling; - } - return list; -} - -gboolean -gtk_ctree_is_hot_spot (GtkCTree *ctree, - gint x, - gint y) -{ - GtkCTreeNode *node; - gint column; - gint row; - - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - - if (gtk_clist_get_selection_info (GTK_CLIST (ctree), x, y, &row, &column)) - if ((node = GTK_CTREE_NODE(g_list_nth (GTK_CLIST (ctree)->row_list, row)))) - return ctree_is_hot_spot (ctree, node, row, x, y); - - return FALSE; -} - - -/*********************************************************** - * Tree signals : move, expand, collapse, (un)select * - ***********************************************************/ - - -/** - * gtk_ctree_move: - * @new_parent: (allow-none): - * @new_sibling: (allow-none): - */ -void -gtk_ctree_move (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *new_parent, - GtkCTreeNode *new_sibling) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_MOVE], node, - new_parent, new_sibling); -} - -void -gtk_ctree_expand (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (GTK_CTREE_ROW (node)->is_leaf) - return; - - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_EXPAND], node); -} - -void -gtk_ctree_expand_recursive (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - gboolean thaw = FALSE; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - if (node && GTK_CTREE_ROW (node)->is_leaf) - return; - - if (CLIST_UNFROZEN (clist) && (!node || gtk_ctree_is_viewable (ctree, node))) - { - gtk_clist_freeze (clist); - thaw = TRUE; - } - - gtk_ctree_post_recursive (ctree, node, GTK_CTREE_FUNC (tree_expand), NULL); - - if (thaw) - gtk_clist_thaw (clist); -} - -void -gtk_ctree_expand_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth) -{ - GtkCList *clist; - gboolean thaw = FALSE; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - if (node && GTK_CTREE_ROW (node)->is_leaf) - return; - - if (CLIST_UNFROZEN (clist) && (!node || gtk_ctree_is_viewable (ctree, node))) - { - gtk_clist_freeze (clist); - thaw = TRUE; - } - - gtk_ctree_post_recursive_to_depth (ctree, node, depth, - GTK_CTREE_FUNC (tree_expand), NULL); - - if (thaw) - gtk_clist_thaw (clist); -} - -void -gtk_ctree_collapse (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (GTK_CTREE_ROW (node)->is_leaf) - return; - - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], node); -} - -void -gtk_ctree_collapse_recursive (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - gboolean thaw = FALSE; - gint i; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (node && GTK_CTREE_ROW (node)->is_leaf) - return; - - clist = GTK_CLIST (ctree); - - if (CLIST_UNFROZEN (clist) && (!node || gtk_ctree_is_viewable (ctree, node))) - { - gtk_clist_freeze (clist); - thaw = TRUE; - } - - GTK_CLIST_SET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - gtk_ctree_post_recursive (ctree, node, GTK_CTREE_FUNC (tree_collapse), NULL); - GTK_CLIST_UNSET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - gtk_clist_set_column_width (clist, i, - gtk_clist_optimal_column_width (clist, i)); - - if (thaw) - gtk_clist_thaw (clist); -} - -void -gtk_ctree_collapse_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth) -{ - GtkCList *clist; - gboolean thaw = FALSE; - gint i; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (node && GTK_CTREE_ROW (node)->is_leaf) - return; - - clist = GTK_CLIST (ctree); - - if (CLIST_UNFROZEN (clist) && (!node || gtk_ctree_is_viewable (ctree, node))) - { - gtk_clist_freeze (clist); - thaw = TRUE; - } - - GTK_CLIST_SET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - gtk_ctree_post_recursive_to_depth (ctree, node, depth, - GTK_CTREE_FUNC (tree_collapse_to_depth), - GINT_TO_POINTER (depth)); - GTK_CLIST_UNSET_FLAG (clist, CLIST_AUTO_RESIZE_BLOCKED); - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - gtk_clist_set_column_width (clist, i, - gtk_clist_optimal_column_width (clist, i)); - - if (thaw) - gtk_clist_thaw (clist); -} - -void -gtk_ctree_toggle_expansion (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (GTK_CTREE_ROW (node)->is_leaf) - return; - - tree_toggle_expansion (ctree, node, NULL); -} - -void -gtk_ctree_toggle_expansion_recursive (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - gboolean thaw = FALSE; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (node && GTK_CTREE_ROW (node)->is_leaf) - return; - - clist = GTK_CLIST (ctree); - - if (CLIST_UNFROZEN (clist) && (!node || gtk_ctree_is_viewable (ctree, node))) - { - gtk_clist_freeze (clist); - thaw = TRUE; - } - - gtk_ctree_post_recursive (ctree, node, - GTK_CTREE_FUNC (tree_toggle_expansion), NULL); - - if (thaw) - gtk_clist_thaw (clist); -} - -void -gtk_ctree_select (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (GTK_CTREE_ROW (node)->row.selectable) - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], - node, -1); -} - -void -gtk_ctree_unselect (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - gtk_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], - node, -1); -} - -void -gtk_ctree_select_recursive (GtkCTree *ctree, - GtkCTreeNode *node) -{ - gtk_ctree_real_select_recursive (ctree, node, TRUE); -} - -void -gtk_ctree_unselect_recursive (GtkCTree *ctree, - GtkCTreeNode *node) -{ - gtk_ctree_real_select_recursive (ctree, node, FALSE); -} - -void -gtk_ctree_real_select_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - gint state) -{ - GtkCList *clist; - gboolean thaw = FALSE; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - if ((state && - (clist->selection_mode == GTK_SELECTION_BROWSE || - clist->selection_mode == GTK_SELECTION_SINGLE)) || - (!state && clist->selection_mode == GTK_SELECTION_BROWSE)) - return; - - if (CLIST_UNFROZEN (clist) && (!node || gtk_ctree_is_viewable (ctree, node))) - { - gtk_clist_freeze (clist); - thaw = TRUE; - } - - if (clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - if (state) - gtk_ctree_post_recursive (ctree, node, - GTK_CTREE_FUNC (tree_select), NULL); - else - gtk_ctree_post_recursive (ctree, node, - GTK_CTREE_FUNC (tree_unselect), NULL); - - if (thaw) - gtk_clist_thaw (clist); -} - - -/*********************************************************** - * Analogons of GtkCList functions * - ***********************************************************/ - - -void -gtk_ctree_node_set_text (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - const gchar *text) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return; - - clist = GTK_CLIST (ctree); - - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, &(GTK_CTREE_ROW (node)->row), column, GTK_CELL_TEXT, - text, 0, NULL, NULL); - - tree_draw_node (ctree, node); -} - - -/** - * gtk_ctree_node_set_pixmap: - * @mask: (allow-none): - */ -void -gtk_ctree_node_set_pixmap (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - GdkPixmap *pixmap, - GdkBitmap *mask) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - g_return_if_fail (pixmap != NULL); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return; - - g_object_ref (pixmap); - if (mask) - g_object_ref (mask); - - clist = GTK_CLIST (ctree); - - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, &(GTK_CTREE_ROW (node)->row), column, GTK_CELL_PIXMAP, - NULL, 0, pixmap, mask); - - tree_draw_node (ctree, node); -} - - -/** - * gtk_ctree_node_set_pixtext: - * @mask: (allow-none): - */ -void -gtk_ctree_node_set_pixtext (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - if (column != ctree->tree_column) - g_return_if_fail (pixmap != NULL); - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return; - - clist = GTK_CLIST (ctree); - - if (pixmap) - { - g_object_ref (pixmap); - if (mask) - g_object_ref (mask); - } - - GTK_CLIST_GET_CLASS (clist)->set_cell_contents - (clist, &(GTK_CTREE_ROW (node)->row), column, GTK_CELL_PIXTEXT, - text, spacing, pixmap, mask); - - tree_draw_node (ctree, node); -} - - -/** - * gtk_ctree_set_node_info: - * @pixmap_closed: (allow-none): - * @mask_closed: (allow-none): - * @pixmap_opened: (allow-none): - * @mask_opened: (allow-none): - */ -void -gtk_ctree_set_node_info (GtkCTree *ctree, - GtkCTreeNode *node, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap_closed, - GdkBitmap *mask_closed, - GdkPixmap *pixmap_opened, - GdkBitmap *mask_opened, - gboolean is_leaf, - gboolean expanded) -{ - gboolean old_leaf; - gboolean old_expanded; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - old_leaf = GTK_CTREE_ROW (node)->is_leaf; - old_expanded = GTK_CTREE_ROW (node)->expanded; - - if (is_leaf && GTK_CTREE_ROW (node)->children) - { - GtkCTreeNode *work; - GtkCTreeNode *ptr; - - work = GTK_CTREE_ROW (node)->children; - while (work) - { - ptr = work; - work = GTK_CTREE_ROW (work)->sibling; - gtk_ctree_remove_node (ctree, ptr); - } - } - - set_node_info (ctree, node, text, spacing, pixmap_closed, mask_closed, - pixmap_opened, mask_opened, is_leaf, expanded); - - if (!is_leaf && !old_leaf) - { - GTK_CTREE_ROW (node)->expanded = old_expanded; - if (expanded && !old_expanded) - gtk_ctree_expand (ctree, node); - else if (!expanded && old_expanded) - gtk_ctree_collapse (ctree, node); - } - - GTK_CTREE_ROW (node)->expanded = (is_leaf) ? FALSE : expanded; - - tree_draw_node (ctree, node); -} - -void -gtk_ctree_node_set_shift (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gint vertical, - gint horizontal) -{ - GtkCList *clist; - GtkRequisition requisition; - gboolean visible = FALSE; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return; - - clist = GTK_CLIST (ctree); - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - visible = gtk_ctree_is_viewable (ctree, node); - if (visible) - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, >K_CTREE_ROW (node)->row, column, &requisition); - } - - GTK_CTREE_ROW (node)->row.cell[column].vertical = vertical; - GTK_CTREE_ROW (node)->row.cell[column].horizontal = horizontal; - - if (visible) - column_auto_resize (clist, >K_CTREE_ROW (node)->row, - column, requisition.width); - - tree_draw_node (ctree, node); -} - -static void -remove_grab (GtkCList *clist) -{ - if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))) && - GTK_WIDGET_HAS_GRAB (clist)) - { - gtk_grab_remove (GTK_WIDGET (clist)); - gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (clist)), - GDK_CURRENT_TIME); - } - - if (clist->htimer) - { - g_source_remove (clist->htimer); - clist->htimer = 0; - } - - if (clist->vtimer) - { - g_source_remove (clist->vtimer); - clist->vtimer = 0; - } -} - -void -gtk_ctree_node_set_selectable (GtkCTree *ctree, - GtkCTreeNode *node, - gboolean selectable) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (selectable == GTK_CTREE_ROW (node)->row.selectable) - return; - - GTK_CTREE_ROW (node)->row.selectable = selectable; - - if (!selectable && GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) - { - GtkCList *clist; - - clist = GTK_CLIST (ctree); - - if (clist->anchor >= 0 && - clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - clist->drag_button = 0; - remove_grab (clist); - - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - } - gtk_ctree_unselect (ctree, node); - } -} - -gboolean -gtk_ctree_node_get_selectable (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_val_if_fail (node != NULL, FALSE); - - return GTK_CTREE_ROW (node)->row.selectable; -} - -GtkCellType -gtk_ctree_node_get_cell_type (GtkCTree *ctree, - GtkCTreeNode *node, - gint column) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), -1); - g_return_val_if_fail (node != NULL, -1); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return -1; - - return GTK_CTREE_ROW (node)->row.cell[column].type; -} - -gboolean -gtk_ctree_node_get_text (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gchar **text) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return FALSE; - - if (GTK_CTREE_ROW (node)->row.cell[column].type != GTK_CELL_TEXT) - return FALSE; - - if (text) - *text = GTK_CELL_TEXT (GTK_CTREE_ROW (node)->row.cell[column])->text; - - return TRUE; -} - -gboolean -gtk_ctree_node_get_pixmap (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - GdkPixmap **pixmap, - GdkBitmap **mask) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return FALSE; - - if (GTK_CTREE_ROW (node)->row.cell[column].type != GTK_CELL_PIXMAP) - return FALSE; - - if (pixmap) - *pixmap = GTK_CELL_PIXMAP (GTK_CTREE_ROW (node)->row.cell[column])->pixmap; - if (mask) - *mask = GTK_CELL_PIXMAP (GTK_CTREE_ROW (node)->row.cell[column])->mask; - - return TRUE; -} - -gboolean -gtk_ctree_node_get_pixtext (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gchar **text, - guint8 *spacing, - GdkPixmap **pixmap, - GdkBitmap **mask) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return FALSE; - - if (GTK_CTREE_ROW (node)->row.cell[column].type != GTK_CELL_PIXTEXT) - return FALSE; - - if (text) - *text = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (node)->row.cell[column])->text; - if (spacing) - *spacing = GTK_CELL_PIXTEXT (GTK_CTREE_ROW - (node)->row.cell[column])->spacing; - if (pixmap) - *pixmap = GTK_CELL_PIXTEXT (GTK_CTREE_ROW - (node)->row.cell[column])->pixmap; - if (mask) - *mask = GTK_CELL_PIXTEXT (GTK_CTREE_ROW (node)->row.cell[column])->mask; - - return TRUE; -} - -gboolean -gtk_ctree_get_node_info (GtkCTree *ctree, - GtkCTreeNode *node, - gchar **text, - guint8 *spacing, - GdkPixmap **pixmap_closed, - GdkBitmap **mask_closed, - GdkPixmap **pixmap_opened, - GdkBitmap **mask_opened, - gboolean *is_leaf, - gboolean *expanded) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - if (text) - *text = GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->text; - if (spacing) - *spacing = GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->spacing; - if (pixmap_closed) - *pixmap_closed = GTK_CTREE_ROW (node)->pixmap_closed; - if (mask_closed) - *mask_closed = GTK_CTREE_ROW (node)->mask_closed; - if (pixmap_opened) - *pixmap_opened = GTK_CTREE_ROW (node)->pixmap_opened; - if (mask_opened) - *mask_opened = GTK_CTREE_ROW (node)->mask_opened; - if (is_leaf) - *is_leaf = GTK_CTREE_ROW (node)->is_leaf; - if (expanded) - *expanded = GTK_CTREE_ROW (node)->expanded; - - return TRUE; -} - -void -gtk_ctree_node_set_cell_style (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - GtkStyle *style) -{ - GtkCList *clist; - GtkRequisition requisition; - gboolean visible = FALSE; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - clist = GTK_CLIST (ctree); - - if (column < 0 || column >= clist->columns) - return; - - if (GTK_CTREE_ROW (node)->row.cell[column].style == style) - return; - - if (clist->column[column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - visible = gtk_ctree_is_viewable (ctree, node); - if (visible) - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, >K_CTREE_ROW (node)->row, column, &requisition); - } - - if (GTK_CTREE_ROW (node)->row.cell[column].style) - { - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gtk_style_detach (GTK_CTREE_ROW (node)->row.cell[column].style); - g_object_unref (GTK_CTREE_ROW (node)->row.cell[column].style); - } - - GTK_CTREE_ROW (node)->row.cell[column].style = style; - - if (GTK_CTREE_ROW (node)->row.cell[column].style) - { - g_object_ref (GTK_CTREE_ROW (node)->row.cell[column].style); - - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - GTK_CTREE_ROW (node)->row.cell[column].style = - gtk_style_attach (GTK_CTREE_ROW (node)->row.cell[column].style, - clist->clist_window); - } - - if (visible) - column_auto_resize (clist, >K_CTREE_ROW (node)->row, column, - requisition.width); - - tree_draw_node (ctree, node); -} - -GtkStyle * -gtk_ctree_node_get_cell_style (GtkCTree *ctree, - GtkCTreeNode *node, - gint column) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - g_return_val_if_fail (node != NULL, NULL); - - if (column < 0 || column >= GTK_CLIST (ctree)->columns) - return NULL; - - return GTK_CTREE_ROW (node)->row.cell[column].style; -} - -void -gtk_ctree_node_set_row_style (GtkCTree *ctree, - GtkCTreeNode *node, - GtkStyle *style) -{ - GtkCList *clist; - GtkRequisition requisition; - gboolean visible; - gint *old_width = NULL; - gint i; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - clist = GTK_CLIST (ctree); - - if (GTK_CTREE_ROW (node)->row.style == style) - return; - - visible = gtk_ctree_is_viewable (ctree, node); - if (visible && !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - old_width = g_new (gint, clist->columns); - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - { - GTK_CLIST_GET_CLASS (clist)->cell_size_request - (clist, >K_CTREE_ROW (node)->row, i, &requisition); - old_width[i] = requisition.width; - } - } - - if (GTK_CTREE_ROW (node)->row.style) - { - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gtk_style_detach (GTK_CTREE_ROW (node)->row.style); - g_object_unref (GTK_CTREE_ROW (node)->row.style); - } - - GTK_CTREE_ROW (node)->row.style = style; - - if (GTK_CTREE_ROW (node)->row.style) - { - g_object_ref (GTK_CTREE_ROW (node)->row.style); - - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - GTK_CTREE_ROW (node)->row.style = - gtk_style_attach (GTK_CTREE_ROW (node)->row.style, - clist->clist_window); - } - - if (visible && !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - for (i = 0; i < clist->columns; i++) - if (clist->column[i].auto_resize) - column_auto_resize (clist, >K_CTREE_ROW (node)->row, i, - old_width[i]); - g_free (old_width); - } - tree_draw_node (ctree, node); -} - -GtkStyle * -gtk_ctree_node_get_row_style (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - g_return_val_if_fail (node != NULL, NULL); - - return GTK_CTREE_ROW (node)->row.style; -} - -void -gtk_ctree_node_set_foreground (GtkCTree *ctree, - GtkCTreeNode *node, - const GdkColor *color) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (color) - { - GTK_CTREE_ROW (node)->row.foreground = *color; - GTK_CTREE_ROW (node)->row.fg_set = TRUE; - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (ctree)), - >K_CTREE_ROW (node)->row.foreground, - FALSE, TRUE); - } - else - GTK_CTREE_ROW (node)->row.fg_set = FALSE; - - tree_draw_node (ctree, node); -} - -void -gtk_ctree_node_set_background (GtkCTree *ctree, - GtkCTreeNode *node, - const GdkColor *color) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - if (color) - { - GTK_CTREE_ROW (node)->row.background = *color; - GTK_CTREE_ROW (node)->row.bg_set = TRUE; - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (ctree)), - >K_CTREE_ROW (node)->row.background, - FALSE, TRUE); - } - else - GTK_CTREE_ROW (node)->row.bg_set = FALSE; - - tree_draw_node (ctree, node); -} - -void -gtk_ctree_node_set_row_data (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - gtk_ctree_node_set_row_data_full (ctree, node, data, NULL); -} - -void -gtk_ctree_node_set_row_data_full (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data, - GDestroyNotify destroy) -{ - GDestroyNotify dnotify; - gpointer ddata; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (node != NULL); - - dnotify = GTK_CTREE_ROW (node)->row.destroy; - ddata = GTK_CTREE_ROW (node)->row.data; - - GTK_CTREE_ROW (node)->row.data = data; - GTK_CTREE_ROW (node)->row.destroy = destroy; - - if (dnotify) - dnotify (ddata); -} - -gpointer -gtk_ctree_node_get_row_data (GtkCTree *ctree, - GtkCTreeNode *node) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), NULL); - - return node ? GTK_CTREE_ROW (node)->row.data : NULL; -} - -void -gtk_ctree_node_moveto (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gfloat row_align, - gfloat col_align) -{ - gint row = -1; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - while (node && !gtk_ctree_is_viewable (ctree, node)) - node = GTK_CTREE_ROW (node)->parent; - - if (node) - row = g_list_position (clist->row_list, (GList *)node); - - gtk_clist_moveto (clist, row, column, row_align, col_align); -} - -GtkVisibility -gtk_ctree_node_is_visible (GtkCTree *ctree, - GtkCTreeNode *node) -{ - gint row; - - g_return_val_if_fail (ctree != NULL, 0); - g_return_val_if_fail (node != NULL, 0); - - row = g_list_position (GTK_CLIST (ctree)->row_list, (GList*) node); - return gtk_clist_row_is_visible (GTK_CLIST (ctree), row); -} - - -/*********************************************************** - * GtkCTree specific functions * - ***********************************************************/ - -void -gtk_ctree_set_indent (GtkCTree *ctree, - gint indent) -{ - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (indent >= 0); - - if (indent == ctree->tree_indent) - return; - - clist = GTK_CLIST (ctree); - ctree->tree_indent = indent; - - if (clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - gtk_clist_set_column_width - (clist, ctree->tree_column, - gtk_clist_optimal_column_width (clist, ctree->tree_column)); - else - CLIST_REFRESH (ctree); -} - -void -gtk_ctree_set_spacing (GtkCTree *ctree, - gint spacing) -{ - GtkCList *clist; - gint old_spacing; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - g_return_if_fail (spacing >= 0); - - if (spacing == ctree->tree_spacing) - return; - - clist = GTK_CLIST (ctree); - - old_spacing = ctree->tree_spacing; - ctree->tree_spacing = spacing; - - if (clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - gtk_clist_set_column_width (clist, ctree->tree_column, - clist->column[ctree->tree_column].width + - spacing - old_spacing); - else - CLIST_REFRESH (ctree); -} - -void -gtk_ctree_set_show_stub (GtkCTree *ctree, - gboolean show_stub) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - - show_stub = show_stub != FALSE; - - if (show_stub != ctree->show_stub) - { - GtkCList *clist; - - clist = GTK_CLIST (ctree); - ctree->show_stub = show_stub; - - if (CLIST_UNFROZEN (clist) && clist->rows && - gtk_clist_row_is_visible (clist, 0) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row - (clist, NULL, 0, GTK_CLIST_ROW (clist->row_list)); - } -} - -void -gtk_ctree_set_line_style (GtkCTree *ctree, - GtkCTreeLineStyle line_style) -{ - GtkCList *clist; - GtkCTreeLineStyle old_style; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (line_style == ctree->line_style) - return; - - clist = GTK_CLIST (ctree); - - old_style = ctree->line_style; - ctree->line_style = line_style; - - if (clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - if (old_style == GTK_CTREE_LINES_TABBED) - gtk_clist_set_column_width - (clist, ctree->tree_column, - clist->column[ctree->tree_column].width - 3); - else if (line_style == GTK_CTREE_LINES_TABBED) - gtk_clist_set_column_width - (clist, ctree->tree_column, - clist->column[ctree->tree_column].width + 3); - } - - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - { - gint8 dashes[] = { 1, 1 }; - - switch (line_style) - { - case GTK_CTREE_LINES_SOLID: - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_SOLID, - GDK_CAP_BUTT, GDK_JOIN_MITER); - break; - case GTK_CTREE_LINES_DOTTED: - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gdk_gc_set_line_attributes (ctree->lines_gc, 1, - GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER); - gdk_gc_set_dashes (ctree->lines_gc, 0, dashes, G_N_ELEMENTS (dashes)); - break; - case GTK_CTREE_LINES_TABBED: - if (gtk_widget_get_realized (GTK_WIDGET (ctree))) - gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_SOLID, - GDK_CAP_BUTT, GDK_JOIN_MITER); - break; - case GTK_CTREE_LINES_NONE: - break; - default: - return; - } - CLIST_REFRESH (ctree); - } -} - -void -gtk_ctree_set_expander_style (GtkCTree *ctree, - GtkCTreeExpanderStyle expander_style) -{ - GtkCList *clist; - GtkCTreeExpanderStyle old_style; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - if (expander_style == ctree->expander_style) - return; - - clist = GTK_CLIST (ctree); - - old_style = ctree->expander_style; - ctree->expander_style = expander_style; - - if (clist->column[ctree->tree_column].auto_resize && - !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist)) - { - gint new_width; - - new_width = clist->column[ctree->tree_column].width; - switch (old_style) - { - case GTK_CTREE_EXPANDER_NONE: - break; - case GTK_CTREE_EXPANDER_TRIANGLE: - new_width -= PM_SIZE + 3; - break; - case GTK_CTREE_EXPANDER_SQUARE: - case GTK_CTREE_EXPANDER_CIRCULAR: - new_width -= PM_SIZE + 1; - break; - } - - switch (expander_style) - { - case GTK_CTREE_EXPANDER_NONE: - break; - case GTK_CTREE_EXPANDER_TRIANGLE: - new_width += PM_SIZE + 3; - break; - case GTK_CTREE_EXPANDER_SQUARE: - case GTK_CTREE_EXPANDER_CIRCULAR: - new_width += PM_SIZE + 1; - break; - } - - gtk_clist_set_column_width (clist, ctree->tree_column, new_width); - } - - if (GTK_WIDGET_DRAWABLE (clist)) - CLIST_REFRESH (clist); -} - - -/*********************************************************** - * Tree sorting functions * - ***********************************************************/ - - -static void -tree_sort (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data) -{ - GtkCTreeNode *list_start; - GtkCTreeNode *cmp; - GtkCTreeNode *work; - GtkCList *clist; - - clist = GTK_CLIST (ctree); - - if (node) - list_start = GTK_CTREE_ROW (node)->children; - else - list_start = GTK_CTREE_NODE (clist->row_list); - - while (list_start) - { - cmp = list_start; - work = GTK_CTREE_ROW (cmp)->sibling; - while (work) - { - if (clist->sort_type == GTK_SORT_ASCENDING) - { - if (clist->compare - (clist, GTK_CTREE_ROW (work), GTK_CTREE_ROW (cmp)) < 0) - cmp = work; - } - else - { - if (clist->compare - (clist, GTK_CTREE_ROW (work), GTK_CTREE_ROW (cmp)) > 0) - cmp = work; - } - work = GTK_CTREE_ROW (work)->sibling; - } - if (cmp == list_start) - list_start = GTK_CTREE_ROW (cmp)->sibling; - else - { - gtk_ctree_unlink (ctree, cmp, FALSE); - gtk_ctree_link (ctree, cmp, node, list_start, FALSE); - } - } -} - -void -gtk_ctree_sort_recursive (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - GtkCTreeNode *focus_node = NULL; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - gtk_clist_freeze (clist); - - if (clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - if (!node || (node && gtk_ctree_is_viewable (ctree, node))) - focus_node = - GTK_CTREE_NODE (g_list_nth (clist->row_list, clist->focus_row)); - - gtk_ctree_post_recursive (ctree, node, GTK_CTREE_FUNC (tree_sort), NULL); - - if (!node) - tree_sort (ctree, NULL, NULL); - - if (focus_node) - { - clist->focus_row = g_list_position (clist->row_list,(GList *)focus_node); - clist->undo_anchor = clist->focus_row; - } - - gtk_clist_thaw (clist); -} - -static void -real_sort_list (GtkCList *clist) -{ - gtk_ctree_sort_recursive (GTK_CTREE (clist), NULL); -} - -void -gtk_ctree_sort_node (GtkCTree *ctree, - GtkCTreeNode *node) -{ - GtkCList *clist; - GtkCTreeNode *focus_node = NULL; - - g_return_if_fail (GTK_IS_CTREE (ctree)); - - clist = GTK_CLIST (ctree); - - gtk_clist_freeze (clist); - - if (clist->selection_mode == GTK_SELECTION_MULTIPLE) - { - GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - } - - if (!node || (node && gtk_ctree_is_viewable (ctree, node))) - focus_node = GTK_CTREE_NODE - (g_list_nth (clist->row_list, clist->focus_row)); - - tree_sort (ctree, node, NULL); - - if (focus_node) - { - clist->focus_row = g_list_position (clist->row_list,(GList *)focus_node); - clist->undo_anchor = clist->focus_row; - } - - gtk_clist_thaw (clist); -} - -/************************************************************************/ - -static void -fake_unselect_all (GtkCList *clist, - gint row) -{ - GList *list; - GList *focus_node = NULL; - - if (row >= 0 && (focus_node = g_list_nth (clist->row_list, row))) - { - if (GTK_CTREE_ROW (focus_node)->row.state == GTK_STATE_NORMAL && - GTK_CTREE_ROW (focus_node)->row.selectable) - { - GTK_CTREE_ROW (focus_node)->row.state = GTK_STATE_SELECTED; - - if (CLIST_UNFROZEN (clist) && - gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) - GTK_CLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, - GTK_CLIST_ROW (focus_node)); - } - } - - clist->undo_selection = clist->selection; - clist->selection = NULL; - clist->selection_end = NULL; - - for (list = clist->undo_selection; list; list = list->next) - { - if (list->data == focus_node) - continue; - - GTK_CTREE_ROW ((GList *)(list->data))->row.state = GTK_STATE_NORMAL; - tree_draw_node (GTK_CTREE (clist), GTK_CTREE_NODE (list->data)); - } -} - -static GList * -selection_find (GtkCList *clist, - gint row_number, - GList *row_list_element) -{ - return g_list_find (clist->selection, row_list_element); -} - -static void -resync_selection (GtkCList *clist, GdkEvent *event) -{ - GtkCTree *ctree; - GList *list; - GtkCTreeNode *node; - gint i; - gint e; - gint row; - gboolean unselect; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - if (clist->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - if (clist->anchor < 0 || clist->drag_pos < 0) - return; - - ctree = GTK_CTREE (clist); - - clist->freeze_count++; - - i = MIN (clist->anchor, clist->drag_pos); - e = MAX (clist->anchor, clist->drag_pos); - - if (clist->undo_selection) - { - list = clist->selection; - clist->selection = clist->undo_selection; - clist->selection_end = g_list_last (clist->selection); - clist->undo_selection = list; - list = clist->selection; - - while (list) - { - node = list->data; - list = list->next; - - unselect = TRUE; - - if (gtk_ctree_is_viewable (ctree, node)) - { - row = g_list_position (clist->row_list, (GList *)node); - if (row >= i && row <= e) - unselect = FALSE; - } - if (unselect && GTK_CTREE_ROW (node)->row.selectable) - { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; - gtk_ctree_unselect (ctree, node); - clist->undo_selection = g_list_prepend (clist->undo_selection, - node); - } - } - } - - if (clist->anchor < clist->drag_pos) - { - for (node = GTK_CTREE_NODE (g_list_nth (clist->row_list, i)); i <= e; - i++, node = GTK_CTREE_NODE_NEXT (node)) - if (GTK_CTREE_ROW (node)->row.selectable) - { - if (g_list_find (clist->selection, node)) - { - if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_NORMAL) - { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; - gtk_ctree_unselect (ctree, node); - clist->undo_selection = - g_list_prepend (clist->undo_selection, node); - } - } - else if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) - { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_NORMAL; - clist->undo_unselection = - g_list_prepend (clist->undo_unselection, node); - } - } - } - else - { - for (node = GTK_CTREE_NODE (g_list_nth (clist->row_list, e)); i <= e; - e--, node = GTK_CTREE_NODE_PREV (node)) - if (GTK_CTREE_ROW (node)->row.selectable) - { - if (g_list_find (clist->selection, node)) - { - if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_NORMAL) - { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_SELECTED; - gtk_ctree_unselect (ctree, node); - clist->undo_selection = - g_list_prepend (clist->undo_selection, node); - } - } - else if (GTK_CTREE_ROW (node)->row.state == GTK_STATE_SELECTED) - { - GTK_CTREE_ROW (node)->row.state = GTK_STATE_NORMAL; - clist->undo_unselection = - g_list_prepend (clist->undo_unselection, node); - } - } - } - - clist->undo_unselection = g_list_reverse (clist->undo_unselection); - for (list = clist->undo_unselection; list; list = list->next) - gtk_ctree_select (ctree, list->data); - - clist->anchor = -1; - clist->drag_pos = -1; - - if (!CLIST_UNFROZEN (clist)) - clist->freeze_count--; -} - -static void -real_undo_selection (GtkCList *clist) -{ - GtkCTree *ctree; - GList *work; - - g_return_if_fail (GTK_IS_CTREE (clist)); - - if (clist->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - if (!(clist->undo_selection || clist->undo_unselection)) - { - gtk_clist_unselect_all (clist); - return; - } - - ctree = GTK_CTREE (clist); - - for (work = clist->undo_selection; work; work = work->next) - if (GTK_CTREE_ROW (work->data)->row.selectable) - gtk_ctree_select (ctree, GTK_CTREE_NODE (work->data)); - - for (work = clist->undo_unselection; work; work = work->next) - if (GTK_CTREE_ROW (work->data)->row.selectable) - gtk_ctree_unselect (ctree, GTK_CTREE_NODE (work->data)); - - if (gtk_widget_has_focus (GTK_WIDGET (clist)) && clist->focus_row != clist->undo_anchor) - { - clist->focus_row = clist->undo_anchor; - gtk_widget_queue_draw (GTK_WIDGET (clist)); - } - else - clist->focus_row = clist->undo_anchor; - - clist->undo_anchor = -1; - - g_list_free (clist->undo_selection); - g_list_free (clist->undo_unselection); - clist->undo_selection = NULL; - clist->undo_unselection = NULL; - - if (ROW_TOP_YPIXEL (clist, clist->focus_row) + clist->row_height > - clist->clist_window_height) - gtk_clist_moveto (clist, clist->focus_row, -1, 1, 0); - else if (ROW_TOP_YPIXEL (clist, clist->focus_row) < 0) - gtk_clist_moveto (clist, clist->focus_row, -1, 0, 0); - -} - -void -gtk_ctree_set_drag_compare_func (GtkCTree *ctree, - GtkCTreeCompareDragFunc cmp_func) -{ - g_return_if_fail (GTK_IS_CTREE (ctree)); - - ctree->drag_compare = cmp_func; -} - -static gboolean -check_drag (GtkCTree *ctree, - GtkCTreeNode *drag_source, - GtkCTreeNode *drag_target, - GtkCListDragPos insert_pos) -{ - g_return_val_if_fail (GTK_IS_CTREE (ctree), FALSE); - - if (drag_source && drag_source != drag_target && - (!GTK_CTREE_ROW (drag_source)->children || - !gtk_ctree_is_ancestor (ctree, drag_source, drag_target))) - { - switch (insert_pos) - { - case GTK_CLIST_DRAG_NONE: - return FALSE; - case GTK_CLIST_DRAG_AFTER: - if (GTK_CTREE_ROW (drag_target)->sibling != drag_source) - return (!ctree->drag_compare || - ctree->drag_compare (ctree, - drag_source, - GTK_CTREE_ROW (drag_target)->parent, - GTK_CTREE_ROW (drag_target)->sibling)); - break; - case GTK_CLIST_DRAG_BEFORE: - if (GTK_CTREE_ROW (drag_source)->sibling != drag_target) - return (!ctree->drag_compare || - ctree->drag_compare (ctree, - drag_source, - GTK_CTREE_ROW (drag_target)->parent, - drag_target)); - break; - case GTK_CLIST_DRAG_INTO: - if (!GTK_CTREE_ROW (drag_target)->is_leaf && - GTK_CTREE_ROW (drag_target)->children != drag_source) - return (!ctree->drag_compare || - ctree->drag_compare (ctree, - drag_source, - drag_target, - GTK_CTREE_ROW (drag_target)->children)); - break; - } - } - return FALSE; -} - - - -/************************************/ -static void -drag_dest_info_destroy (gpointer data) -{ - GtkCListDestInfo *info = data; - - g_free (info); -} - -static void -drag_dest_cell (GtkCList *clist, - gint x, - gint y, - GtkCListDestInfo *dest_info) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (clist); - - dest_info->insert_pos = GTK_CLIST_DRAG_NONE; - - y -= (GTK_CONTAINER (widget)->border_width + - widget->style->ythickness + clist->column_title_area.height); - dest_info->cell.row = ROW_FROM_YPIXEL (clist, y); - - if (dest_info->cell.row >= clist->rows) - { - dest_info->cell.row = clist->rows - 1; - y = ROW_TOP_YPIXEL (clist, dest_info->cell.row) + clist->row_height; - } - if (dest_info->cell.row < -1) - dest_info->cell.row = -1; - - x -= GTK_CONTAINER (widget)->border_width + widget->style->xthickness; - - dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x); - - if (dest_info->cell.row >= 0) - { - gint y_delta; - gint h = 0; - - y_delta = y - ROW_TOP_YPIXEL (clist, dest_info->cell.row); - - if (GTK_CLIST_DRAW_DRAG_RECT(clist) && - !GTK_CTREE_ROW (g_list_nth (clist->row_list, - dest_info->cell.row))->is_leaf) - { - dest_info->insert_pos = GTK_CLIST_DRAG_INTO; - h = clist->row_height / 4; - } - else if (GTK_CLIST_DRAW_DRAG_LINE(clist)) - { - dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE; - h = clist->row_height / 2; - } - - if (GTK_CLIST_DRAW_DRAG_LINE(clist)) - { - if (y_delta < h) - dest_info->insert_pos = GTK_CLIST_DRAG_BEFORE; - else if (clist->row_height - y_delta < h) - dest_info->insert_pos = GTK_CLIST_DRAG_AFTER; - } - } -} - -static void -gtk_ctree_drag_begin (GtkWidget *widget, - GdkDragContext *context) -{ - GtkCList *clist; - GtkCTree *ctree; - gboolean use_icons; - - g_return_if_fail (GTK_IS_CTREE (widget)); - g_return_if_fail (context != NULL); - - clist = GTK_CLIST (widget); - ctree = GTK_CTREE (widget); - - use_icons = GTK_CLIST_USE_DRAG_ICONS (clist); - GTK_CLIST_UNSET_FLAG (clist, CLIST_USE_DRAG_ICONS); - GTK_WIDGET_CLASS (parent_class)->drag_begin (widget, context); - - if (use_icons) - { - GtkCTreeNode *node; - - GTK_CLIST_SET_FLAG (clist, CLIST_USE_DRAG_ICONS); - node = GTK_CTREE_NODE (g_list_nth (clist->row_list, - clist->click_cell.row)); - if (node) - { - if (GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap) - { - gtk_drag_set_icon_pixmap - (context, - gtk_widget_get_colormap (widget), - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap, - GTK_CELL_PIXTEXT - (GTK_CTREE_ROW (node)->row.cell[ctree->tree_column])->mask, - -2, -2); - return; - } - } - gtk_drag_set_icon_default (context); - } -} - -static gint -gtk_ctree_drag_motion (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time) -{ - GtkCList *clist; - GtkCTree *ctree; - GtkCListDestInfo new_info; - GtkCListDestInfo *dest_info; - - g_return_val_if_fail (GTK_IS_CTREE (widget), FALSE); - - clist = GTK_CLIST (widget); - ctree = GTK_CTREE (widget); - - dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest"); - - if (!dest_info) - { - dest_info = g_new (GtkCListDestInfo, 1); - - dest_info->cell.row = -1; - dest_info->cell.column = -1; - dest_info->insert_pos = GTK_CLIST_DRAG_NONE; - - g_dataset_set_data_full (context, "gtk-clist-drag-dest", dest_info, - drag_dest_info_destroy); - } - - drag_dest_cell (clist, x, y, &new_info); - - if (GTK_CLIST_REORDERABLE (clist)) - { - GList *list; - GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder"); - - list = context->targets; - while (list) - { - if (atom == GDK_POINTER_TO_ATOM (list->data)) - break; - list = list->next; - } - - if (list) - { - GtkCTreeNode *drag_source; - GtkCTreeNode *drag_target; - - drag_source = GTK_CTREE_NODE (g_list_nth (clist->row_list, - clist->click_cell.row)); - drag_target = GTK_CTREE_NODE (g_list_nth (clist->row_list, - new_info.cell.row)); - - if (gtk_drag_get_source_widget (context) != widget || - !check_drag (ctree, drag_source, drag_target, - new_info.insert_pos)) - { - if (dest_info->cell.row < 0) - { - gdk_drag_status (context, GDK_ACTION_DEFAULT, time); - return FALSE; - } - return TRUE; - } - - if (new_info.cell.row != dest_info->cell.row || - (new_info.cell.row == dest_info->cell.row && - dest_info->insert_pos != new_info.insert_pos)) - { - if (dest_info->cell.row >= 0) - GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight - (clist, - g_list_nth (clist->row_list, dest_info->cell.row)->data, - dest_info->cell.row, dest_info->insert_pos); - - dest_info->insert_pos = new_info.insert_pos; - dest_info->cell.row = new_info.cell.row; - dest_info->cell.column = new_info.cell.column; - - GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight - (clist, - g_list_nth (clist->row_list, dest_info->cell.row)->data, - dest_info->cell.row, dest_info->insert_pos); - - clist->drag_highlight_row = dest_info->cell.row; - clist->drag_highlight_pos = dest_info->insert_pos; - - gdk_drag_status (context, context->suggested_action, time); - } - return TRUE; - } - } - - dest_info->insert_pos = new_info.insert_pos; - dest_info->cell.row = new_info.cell.row; - dest_info->cell.column = new_info.cell.column; - return TRUE; -} - -static void -gtk_ctree_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint32 time) -{ - GtkCTree *ctree; - GtkCList *clist; - - g_return_if_fail (GTK_IS_CTREE (widget)); - g_return_if_fail (context != NULL); - g_return_if_fail (selection_data != NULL); - - ctree = GTK_CTREE (widget); - clist = GTK_CLIST (widget); - - if (GTK_CLIST_REORDERABLE (clist) && - gtk_drag_get_source_widget (context) == widget && - selection_data->target == - gdk_atom_intern_static_string ("gtk-clist-drag-reorder") && - selection_data->format == 8 && - selection_data->length == sizeof (GtkCListCellInfo)) - { - GtkCListCellInfo *source_info; - - source_info = (GtkCListCellInfo *)(selection_data->data); - if (source_info) - { - GtkCListDestInfo dest_info; - GtkCTreeNode *source_node; - GtkCTreeNode *dest_node; - - drag_dest_cell (clist, x, y, &dest_info); - - source_node = GTK_CTREE_NODE (g_list_nth (clist->row_list, - source_info->row)); - dest_node = GTK_CTREE_NODE (g_list_nth (clist->row_list, - dest_info.cell.row)); - - if (!source_node || !dest_node) - return; - - switch (dest_info.insert_pos) - { - case GTK_CLIST_DRAG_NONE: - break; - case GTK_CLIST_DRAG_INTO: - if (check_drag (ctree, source_node, dest_node, - dest_info.insert_pos)) - gtk_ctree_move (ctree, source_node, dest_node, - GTK_CTREE_ROW (dest_node)->children); - g_dataset_remove_data (context, "gtk-clist-drag-dest"); - break; - case GTK_CLIST_DRAG_BEFORE: - if (check_drag (ctree, source_node, dest_node, - dest_info.insert_pos)) - gtk_ctree_move (ctree, source_node, - GTK_CTREE_ROW (dest_node)->parent, dest_node); - g_dataset_remove_data (context, "gtk-clist-drag-dest"); - break; - case GTK_CLIST_DRAG_AFTER: - if (check_drag (ctree, source_node, dest_node, - dest_info.insert_pos)) - gtk_ctree_move (ctree, source_node, - GTK_CTREE_ROW (dest_node)->parent, - GTK_CTREE_ROW (dest_node)->sibling); - g_dataset_remove_data (context, "gtk-clist-drag-dest"); - break; - } - } - } -} - -GType -gtk_ctree_node_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_pointer_type_register_static ("GtkCTreeNode"); - - return our_type; -} - -#include "gtkaliasdef.c" diff --git a/gtk/gtkctree.h b/gtk/gtkctree.h deleted file mode 100644 index a4aa83773b..0000000000 --- a/gtk/gtkctree.h +++ /dev/null @@ -1,445 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald - * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org> - * - * GtkCTree widget for GTK+ - * Copyright (C) 1998 Lars Hamann and Stefan Jeske - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#if !defined (GTK_DISABLE_DEPRECATED) || defined (__GTK_CLIST_C__) || defined (__GTK_CTREE_C__) - -#ifndef __GTK_CTREE_H__ -#define __GTK_CTREE_H__ - -#include <gtk/gtkclist.h> - -G_BEGIN_DECLS - -#define GTK_TYPE_CTREE (gtk_ctree_get_type ()) -#define GTK_CTREE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CTREE, GtkCTree)) -#define GTK_CTREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CTREE, GtkCTreeClass)) -#define GTK_IS_CTREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CTREE)) -#define GTK_IS_CTREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CTREE)) -#define GTK_CTREE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CTREE, GtkCTreeClass)) - -#define GTK_CTREE_ROW(_node_) ((GtkCTreeRow *)(((GList *)(_node_))->data)) -#define GTK_CTREE_NODE(_node_) ((GtkCTreeNode *)((_node_))) -#define GTK_CTREE_NODE_NEXT(_nnode_) ((GtkCTreeNode *)(((GList *)(_nnode_))->next)) -#define GTK_CTREE_NODE_PREV(_pnode_) ((GtkCTreeNode *)(((GList *)(_pnode_))->prev)) -#define GTK_CTREE_FUNC(_func_) ((GtkCTreeFunc)(_func_)) - -#define GTK_TYPE_CTREE_NODE (gtk_ctree_node_get_type ()) - -typedef enum -{ - GTK_CTREE_POS_BEFORE, - GTK_CTREE_POS_AS_CHILD, - GTK_CTREE_POS_AFTER -} GtkCTreePos; - -typedef enum -{ - GTK_CTREE_LINES_NONE, - GTK_CTREE_LINES_SOLID, - GTK_CTREE_LINES_DOTTED, - GTK_CTREE_LINES_TABBED -} GtkCTreeLineStyle; - -typedef enum -{ - GTK_CTREE_EXPANDER_NONE, - GTK_CTREE_EXPANDER_SQUARE, - GTK_CTREE_EXPANDER_TRIANGLE, - GTK_CTREE_EXPANDER_CIRCULAR -} GtkCTreeExpanderStyle; - -typedef enum -{ - GTK_CTREE_EXPANSION_EXPAND, - GTK_CTREE_EXPANSION_EXPAND_RECURSIVE, - GTK_CTREE_EXPANSION_COLLAPSE, - GTK_CTREE_EXPANSION_COLLAPSE_RECURSIVE, - GTK_CTREE_EXPANSION_TOGGLE, - GTK_CTREE_EXPANSION_TOGGLE_RECURSIVE -} GtkCTreeExpansionType; - -typedef struct _GtkCTree GtkCTree; -typedef struct _GtkCTreeClass GtkCTreeClass; -typedef struct _GtkCTreeRow GtkCTreeRow; -typedef struct _GtkCTreeNode GtkCTreeNode; - -typedef void (*GtkCTreeFunc) (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); - -typedef gboolean (*GtkCTreeGNodeFunc) (GtkCTree *ctree, - guint depth, - GNode *gnode, - GtkCTreeNode *cnode, - gpointer data); - -typedef gboolean (*GtkCTreeCompareDragFunc) (GtkCTree *ctree, - GtkCTreeNode *source_node, - GtkCTreeNode *new_parent, - GtkCTreeNode *new_sibling); - -struct _GtkCTree -{ - GtkCList clist; - - GdkGC *lines_gc; - - gint tree_indent; - gint tree_spacing; - gint tree_column; - - guint line_style : 2; - guint expander_style : 2; - guint show_stub : 1; - - GtkCTreeCompareDragFunc drag_compare; -}; - -struct _GtkCTreeClass -{ - GtkCListClass parent_class; - - void (*tree_select_row) (GtkCTree *ctree, - GtkCTreeNode *row, - gint column); - void (*tree_unselect_row) (GtkCTree *ctree, - GtkCTreeNode *row, - gint column); - void (*tree_expand) (GtkCTree *ctree, - GtkCTreeNode *node); - void (*tree_collapse) (GtkCTree *ctree, - GtkCTreeNode *node); - void (*tree_move) (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *new_parent, - GtkCTreeNode *new_sibling); - void (*change_focus_row_expansion) (GtkCTree *ctree, - GtkCTreeExpansionType action); -}; - -struct _GtkCTreeRow -{ - GtkCListRow row; - - GtkCTreeNode *parent; - GtkCTreeNode *sibling; - GtkCTreeNode *children; - - GdkPixmap *pixmap_closed; - GdkBitmap *mask_closed; - GdkPixmap *pixmap_opened; - GdkBitmap *mask_opened; - - guint16 level; - - guint is_leaf : 1; - guint expanded : 1; -}; - -struct _GtkCTreeNode { - GList list; -}; - - -/*********************************************************** - * Creation, insertion, deletion * - ***********************************************************/ - -GType gtk_ctree_get_type (void) G_GNUC_CONST; -GtkWidget * gtk_ctree_new_with_titles (gint columns, - gint tree_column, - gchar *titles[]); -GtkWidget * gtk_ctree_new (gint columns, - gint tree_column); -GtkCTreeNode * gtk_ctree_insert_node (GtkCTree *ctree, - GtkCTreeNode *parent, - GtkCTreeNode *sibling, - gchar *text[], - guint8 spacing, - GdkPixmap *pixmap_closed, - GdkBitmap *mask_closed, - GdkPixmap *pixmap_opened, - GdkBitmap *mask_opened, - gboolean is_leaf, - gboolean expanded); -void gtk_ctree_remove_node (GtkCTree *ctree, - GtkCTreeNode *node); -GtkCTreeNode * gtk_ctree_insert_gnode (GtkCTree *ctree, - GtkCTreeNode *parent, - GtkCTreeNode *sibling, - GNode *gnode, - GtkCTreeGNodeFunc func, - gpointer data); -GNode * gtk_ctree_export_to_gnode (GtkCTree *ctree, - GNode *parent, - GNode *sibling, - GtkCTreeNode *node, - GtkCTreeGNodeFunc func, - gpointer data); - -/*********************************************************** - * Generic recursive functions, querying / finding tree * - * information * - ***********************************************************/ - -void gtk_ctree_post_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeFunc func, - gpointer data); -void gtk_ctree_post_recursive_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth, - GtkCTreeFunc func, - gpointer data); -void gtk_ctree_pre_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeFunc func, - gpointer data); -void gtk_ctree_pre_recursive_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth, - GtkCTreeFunc func, - gpointer data); -gboolean gtk_ctree_is_viewable (GtkCTree *ctree, - GtkCTreeNode *node); -GtkCTreeNode * gtk_ctree_last (GtkCTree *ctree, - GtkCTreeNode *node); -GtkCTreeNode * gtk_ctree_find_node_ptr (GtkCTree *ctree, - GtkCTreeRow *ctree_row); -GtkCTreeNode * gtk_ctree_node_nth (GtkCTree *ctree, - guint row); -gboolean gtk_ctree_find (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *child); -gboolean gtk_ctree_is_ancestor (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *child); -GtkCTreeNode * gtk_ctree_find_by_row_data (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -/* returns a GList of all GtkCTreeNodes with row->data == data. */ -GList * gtk_ctree_find_all_by_row_data (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -GtkCTreeNode * gtk_ctree_find_by_row_data_custom (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data, - GCompareFunc func); -/* returns a GList of all GtkCTreeNodes with row->data == data. */ -GList * gtk_ctree_find_all_by_row_data_custom (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data, - GCompareFunc func); -gboolean gtk_ctree_is_hot_spot (GtkCTree *ctree, - gint x, - gint y); - -/*********************************************************** - * Tree signals : move, expand, collapse, (un)select * - ***********************************************************/ - -void gtk_ctree_move (GtkCTree *ctree, - GtkCTreeNode *node, - GtkCTreeNode *new_parent, - GtkCTreeNode *new_sibling); -void gtk_ctree_expand (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_expand_recursive (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_expand_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth); -void gtk_ctree_collapse (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_collapse_recursive (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_collapse_to_depth (GtkCTree *ctree, - GtkCTreeNode *node, - gint depth); -void gtk_ctree_toggle_expansion (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_toggle_expansion_recursive (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_select (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_select_recursive (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_unselect (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_unselect_recursive (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_real_select_recursive (GtkCTree *ctree, - GtkCTreeNode *node, - gint state); - -/*********************************************************** - * Analogons of GtkCList functions * - ***********************************************************/ - -void gtk_ctree_node_set_text (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - const gchar *text); -void gtk_ctree_node_set_pixmap (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - GdkPixmap *pixmap, - GdkBitmap *mask); -void gtk_ctree_node_set_pixtext (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap, - GdkBitmap *mask); -void gtk_ctree_set_node_info (GtkCTree *ctree, - GtkCTreeNode *node, - const gchar *text, - guint8 spacing, - GdkPixmap *pixmap_closed, - GdkBitmap *mask_closed, - GdkPixmap *pixmap_opened, - GdkBitmap *mask_opened, - gboolean is_leaf, - gboolean expanded); -void gtk_ctree_node_set_shift (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gint vertical, - gint horizontal); -void gtk_ctree_node_set_selectable (GtkCTree *ctree, - GtkCTreeNode *node, - gboolean selectable); -gboolean gtk_ctree_node_get_selectable (GtkCTree *ctree, - GtkCTreeNode *node); -GtkCellType gtk_ctree_node_get_cell_type (GtkCTree *ctree, - GtkCTreeNode *node, - gint column); -gboolean gtk_ctree_node_get_text (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gchar **text); -gboolean gtk_ctree_node_get_pixmap (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - GdkPixmap **pixmap, - GdkBitmap **mask); -gboolean gtk_ctree_node_get_pixtext (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gchar **text, - guint8 *spacing, - GdkPixmap **pixmap, - GdkBitmap **mask); -gboolean gtk_ctree_get_node_info (GtkCTree *ctree, - GtkCTreeNode *node, - gchar **text, - guint8 *spacing, - GdkPixmap **pixmap_closed, - GdkBitmap **mask_closed, - GdkPixmap **pixmap_opened, - GdkBitmap **mask_opened, - gboolean *is_leaf, - gboolean *expanded); -void gtk_ctree_node_set_row_style (GtkCTree *ctree, - GtkCTreeNode *node, - GtkStyle *style); -GtkStyle * gtk_ctree_node_get_row_style (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_node_set_cell_style (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - GtkStyle *style); -GtkStyle * gtk_ctree_node_get_cell_style (GtkCTree *ctree, - GtkCTreeNode *node, - gint column); -void gtk_ctree_node_set_foreground (GtkCTree *ctree, - GtkCTreeNode *node, - const GdkColor *color); -void gtk_ctree_node_set_background (GtkCTree *ctree, - GtkCTreeNode *node, - const GdkColor *color); -void gtk_ctree_node_set_row_data (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data); -void gtk_ctree_node_set_row_data_full (GtkCTree *ctree, - GtkCTreeNode *node, - gpointer data, - GDestroyNotify destroy); -gpointer gtk_ctree_node_get_row_data (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_node_moveto (GtkCTree *ctree, - GtkCTreeNode *node, - gint column, - gfloat row_align, - gfloat col_align); -GtkVisibility gtk_ctree_node_is_visible (GtkCTree *ctree, - GtkCTreeNode *node); - -/*********************************************************** - * GtkCTree specific functions * - ***********************************************************/ - -void gtk_ctree_set_indent (GtkCTree *ctree, - gint indent); -void gtk_ctree_set_spacing (GtkCTree *ctree, - gint spacing); -void gtk_ctree_set_show_stub (GtkCTree *ctree, - gboolean show_stub); -void gtk_ctree_set_line_style (GtkCTree *ctree, - GtkCTreeLineStyle line_style); -void gtk_ctree_set_expander_style (GtkCTree *ctree, - GtkCTreeExpanderStyle expander_style); -void gtk_ctree_set_drag_compare_func (GtkCTree *ctree, - GtkCTreeCompareDragFunc cmp_func); - -/*********************************************************** - * Tree sorting functions * - ***********************************************************/ - -void gtk_ctree_sort_node (GtkCTree *ctree, - GtkCTreeNode *node); -void gtk_ctree_sort_recursive (GtkCTree *ctree, - GtkCTreeNode *node); - - -#define gtk_ctree_set_reorderable(t,r) gtk_clist_set_reorderable((GtkCList*) (t),(r)) - -/* GType for the GtkCTreeNode. This is a boxed type, although it uses - * no-op's for the copy and free routines. It is defined in order to - * provide type information for the signal arguments - */ -GType gtk_ctree_node_get_type (void) G_GNUC_CONST; - -G_END_DECLS - -#endif /* __GTK_CTREE_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkcurve.c b/gtk/gtkcurve.c deleted file mode 100644 index e1304dbd52..0000000000 --- a/gtk/gtkcurve.c +++ /dev/null @@ -1,1039 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1997 David Mosberger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "gtkcurve.h" -#include "gtkdrawingarea.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtkradiobutton.h" -#include "gtktable.h" -#include "gtkprivate.h" -#include "gtkintl.h" -#include "gtkalias.h" - -#define RADIUS 3 /* radius of the control points */ -#define MIN_DISTANCE 8 /* min distance between control points */ - -#define GRAPH_MASK (GDK_EXPOSURE_MASK | \ - GDK_POINTER_MOTION_MASK | \ - GDK_POINTER_MOTION_HINT_MASK | \ - GDK_ENTER_NOTIFY_MASK | \ - GDK_BUTTON_PRESS_MASK | \ - GDK_BUTTON_RELEASE_MASK | \ - GDK_BUTTON1_MOTION_MASK) - -enum { - PROP_0, - PROP_CURVE_TYPE, - PROP_MIN_X, - PROP_MAX_X, - PROP_MIN_Y, - PROP_MAX_Y -}; - -static GtkDrawingAreaClass *parent_class = NULL; -static guint curve_type_changed_signal = 0; - - -/* forward declarations: */ -static void gtk_curve_class_init (GtkCurveClass *class); -static void gtk_curve_init (GtkCurve *curve); -static void gtk_curve_get_property (GObject *object, - guint param_id, - GValue *value, - GParamSpec *pspec); -static void gtk_curve_set_property (GObject *object, - guint param_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_curve_finalize (GObject *object); -static gint gtk_curve_graph_events (GtkWidget *widget, - GdkEvent *event, - GtkCurve *c); -static void gtk_curve_size_graph (GtkCurve *curve); - -GType -gtk_curve_get_type (void) -{ - static GType curve_type = 0; - - if (!curve_type) - { - const GTypeInfo curve_info = - { - sizeof (GtkCurveClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gtk_curve_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GtkCurve), - 0, /* n_preallocs */ - (GInstanceInitFunc) gtk_curve_init, - }; - - curve_type = g_type_register_static (GTK_TYPE_DRAWING_AREA, I_("GtkCurve"), - &curve_info, 0); - } - return curve_type; -} - -static void -gtk_curve_class_init (GtkCurveClass *class) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (class); - - parent_class = g_type_class_peek_parent (class); - - gobject_class->finalize = gtk_curve_finalize; - - gobject_class->set_property = gtk_curve_set_property; - gobject_class->get_property = gtk_curve_get_property; - - g_object_class_install_property (gobject_class, - PROP_CURVE_TYPE, - g_param_spec_enum ("curve-type", - P_("Curve type"), - P_("Is this curve linear, spline interpolated, or free-form"), - GTK_TYPE_CURVE_TYPE, - GTK_CURVE_TYPE_SPLINE, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_MIN_X, - g_param_spec_float ("min-x", - P_("Minimum X"), - P_("Minimum possible value for X"), - -G_MAXFLOAT, - G_MAXFLOAT, - 0.0, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_MAX_X, - g_param_spec_float ("max-x", - P_("Maximum X"), - P_("Maximum possible X value"), - -G_MAXFLOAT, - G_MAXFLOAT, - 1.0, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_MIN_Y, - g_param_spec_float ("min-y", - P_("Minimum Y"), - P_("Minimum possible value for Y"), - -G_MAXFLOAT, - G_MAXFLOAT, - 0.0, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_MAX_Y, - g_param_spec_float ("max-y", - P_("Maximum Y"), - P_("Maximum possible value for Y"), - -G_MAXFLOAT, - G_MAXFLOAT, - 1.0, - GTK_PARAM_READWRITE)); - - curve_type_changed_signal = - g_signal_new (I_("curve-type-changed"), - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GtkCurveClass, curve_type_changed), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -static void -gtk_curve_init (GtkCurve *curve) -{ - gint old_mask; - - curve->cursor_type = GDK_TOP_LEFT_ARROW; - curve->pixmap = NULL; - curve->curve_type = GTK_CURVE_TYPE_SPLINE; - curve->height = 0; - curve->grab_point = -1; - - curve->num_points = 0; - curve->point = NULL; - - curve->num_ctlpoints = 0; - curve->ctlpoint = NULL; - - curve->min_x = 0.0; - curve->max_x = 1.0; - curve->min_y = 0.0; - curve->max_y = 1.0; - - old_mask = gtk_widget_get_events (GTK_WIDGET (curve)); - gtk_widget_set_events (GTK_WIDGET (curve), old_mask | GRAPH_MASK); - g_signal_connect (curve, "event", - G_CALLBACK (gtk_curve_graph_events), curve); - gtk_curve_size_graph (curve); -} - -static void -gtk_curve_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkCurve *curve = GTK_CURVE (object); - - switch (prop_id) - { - case PROP_CURVE_TYPE: - gtk_curve_set_curve_type (curve, g_value_get_enum (value)); - break; - case PROP_MIN_X: - gtk_curve_set_range (curve, g_value_get_float (value), curve->max_x, - curve->min_y, curve->max_y); - break; - case PROP_MAX_X: - gtk_curve_set_range (curve, curve->min_x, g_value_get_float (value), - curve->min_y, curve->max_y); - break; - case PROP_MIN_Y: - gtk_curve_set_range (curve, curve->min_x, curve->max_x, - g_value_get_float (value), curve->max_y); - break; - case PROP_MAX_Y: - gtk_curve_set_range (curve, curve->min_x, curve->max_x, - curve->min_y, g_value_get_float (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_curve_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkCurve *curve = GTK_CURVE (object); - - switch (prop_id) - { - case PROP_CURVE_TYPE: - g_value_set_enum (value, curve->curve_type); - break; - case PROP_MIN_X: - g_value_set_float (value, curve->min_x); - break; - case PROP_MAX_X: - g_value_set_float (value, curve->max_x); - break; - case PROP_MIN_Y: - g_value_set_float (value, curve->min_y); - break; - case PROP_MAX_Y: - g_value_set_float (value, curve->max_y); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static int -project (gfloat value, gfloat min, gfloat max, int norm) -{ - return (norm - 1) * ((value - min) / (max - min)) + 0.5; -} - -static gfloat -unproject (gint value, gfloat min, gfloat max, int norm) -{ - return value / (gfloat) (norm - 1) * (max - min) + min; -} - -/* Solve the tridiagonal equation system that determines the second - derivatives for the interpolation points. (Based on Numerical - Recipies 2nd Edition.) */ -static void -spline_solve (int n, gfloat x[], gfloat y[], gfloat y2[]) -{ - gfloat p, sig, *u; - gint i, k; - - u = g_malloc ((n - 1) * sizeof (u[0])); - - y2[0] = u[0] = 0.0; /* set lower boundary condition to "natural" */ - - for (i = 1; i < n - 1; ++i) - { - sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]); - p = sig * y2[i - 1] + 2.0; - y2[i] = (sig - 1.0) / p; - u[i] = ((y[i + 1] - y[i]) - / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1])); - u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p; - } - - y2[n - 1] = 0.0; - for (k = n - 2; k >= 0; --k) - y2[k] = y2[k] * y2[k + 1] + u[k]; - - g_free (u); -} - -static gfloat -spline_eval (int n, gfloat x[], gfloat y[], gfloat y2[], gfloat val) -{ - gint k_lo, k_hi, k; - gfloat h, b, a; - - /* do a binary search for the right interval: */ - k_lo = 0; k_hi = n - 1; - while (k_hi - k_lo > 1) - { - k = (k_hi + k_lo) / 2; - if (x[k] > val) - k_hi = k; - else - k_lo = k; - } - - h = x[k_hi] - x[k_lo]; - g_assert (h > 0.0); - - a = (x[k_hi] - val) / h; - b = (val - x[k_lo]) / h; - return a*y[k_lo] + b*y[k_hi] + - ((a*a*a - a)*y2[k_lo] + (b*b*b - b)*y2[k_hi]) * (h*h)/6.0; -} - -static void -gtk_curve_interpolate (GtkCurve *c, gint width, gint height) -{ - gfloat *vector; - int i; - - vector = g_malloc (width * sizeof (vector[0])); - - gtk_curve_get_vector (c, width, vector); - - c->height = height; - if (c->num_points != width) - { - c->num_points = width; - g_free (c->point); - c->point = g_malloc (c->num_points * sizeof (c->point[0])); - } - - for (i = 0; i < width; ++i) - { - c->point[i].x = RADIUS + i; - c->point[i].y = RADIUS + height - - project (vector[i], c->min_y, c->max_y, height); - } - - g_free (vector); -} - -static void -gtk_curve_draw (GtkCurve *c, gint width, gint height) -{ - GtkStateType state; - GtkStyle *style; - gint i; - - if (!c->pixmap) - return; - - if (c->height != height || c->num_points != width) - gtk_curve_interpolate (c, width, height); - - state = GTK_STATE_NORMAL; - if (!gtk_widget_is_sensitive (GTK_WIDGET (c))) - state = GTK_STATE_INSENSITIVE; - - style = GTK_WIDGET (c)->style; - - /* clear the pixmap: */ - gtk_paint_flat_box (style, c->pixmap, GTK_STATE_NORMAL, GTK_SHADOW_NONE, - NULL, GTK_WIDGET (c), "curve_bg", - 0, 0, width + RADIUS * 2, height + RADIUS * 2); - /* draw the grid lines: (XXX make more meaningful) */ - for (i = 0; i < 5; i++) - { - gdk_draw_line (c->pixmap, style->dark_gc[state], - RADIUS, i * (height / 4.0) + RADIUS, - width + RADIUS, i * (height / 4.0) + RADIUS); - gdk_draw_line (c->pixmap, style->dark_gc[state], - i * (width / 4.0) + RADIUS, RADIUS, - i * (width / 4.0) + RADIUS, height + RADIUS); - } - - gdk_draw_points (c->pixmap, style->fg_gc[state], c->point, c->num_points); - if (c->curve_type != GTK_CURVE_TYPE_FREE) - for (i = 0; i < c->num_ctlpoints; ++i) - { - gint x, y; - - if (c->ctlpoint[i][0] < c->min_x) - continue; - - x = project (c->ctlpoint[i][0], c->min_x, c->max_x, - width); - y = height - - project (c->ctlpoint[i][1], c->min_y, c->max_y, - height); - - /* draw a bullet: */ - gdk_draw_arc (c->pixmap, style->fg_gc[state], TRUE, x, y, - RADIUS * 2, RADIUS*2, 0, 360*64); - } - gdk_draw_drawable (GTK_WIDGET (c)->window, style->fg_gc[state], c->pixmap, - 0, 0, 0, 0, width + RADIUS * 2, height + RADIUS * 2); -} - -static gint -gtk_curve_graph_events (GtkWidget *widget, GdkEvent *event, GtkCurve *c) -{ - GdkCursorType new_type = c->cursor_type; - gint i, src, dst, leftbound, rightbound; - GdkEventMotion *mevent; - GtkWidget *w; - gint tx, ty; - gint cx, x, y, width, height; - gint closest_point = 0; - gfloat rx, ry, min_x; - guint distance; - gint x1, x2, y1, y2; - gint retval = FALSE; - - w = GTK_WIDGET (c); - width = w->allocation.width - RADIUS * 2; - height = w->allocation.height - RADIUS * 2; - - if ((width < 0) || (height < 0)) - return FALSE; - - /* get the pointer position */ - gdk_window_get_pointer (w->window, &tx, &ty, NULL); - x = CLAMP ((tx - RADIUS), 0, width-1); - y = CLAMP ((ty - RADIUS), 0, height-1); - - min_x = c->min_x; - - distance = ~0U; - for (i = 0; i < c->num_ctlpoints; ++i) - { - cx = project (c->ctlpoint[i][0], min_x, c->max_x, width); - if ((guint) abs (x - cx) < distance) - { - distance = abs (x - cx); - closest_point = i; - } - } - - switch (event->type) - { - case GDK_CONFIGURE: - if (c->pixmap) - g_object_unref (c->pixmap); - c->pixmap = NULL; - /* fall through */ - case GDK_EXPOSE: - if (!c->pixmap) - c->pixmap = gdk_pixmap_new (w->window, - w->allocation.width, - w->allocation.height, -1); - gtk_curve_draw (c, width, height); - break; - - case GDK_BUTTON_PRESS: - gtk_grab_add (widget); - - new_type = GDK_TCROSS; - - switch (c->curve_type) - { - case GTK_CURVE_TYPE_LINEAR: - case GTK_CURVE_TYPE_SPLINE: - if (distance > MIN_DISTANCE) - { - /* insert a new control point */ - if (c->num_ctlpoints > 0) - { - cx = project (c->ctlpoint[closest_point][0], min_x, - c->max_x, width); - if (x > cx) - ++closest_point; - } - ++c->num_ctlpoints; - c->ctlpoint = - g_realloc (c->ctlpoint, - c->num_ctlpoints * sizeof (*c->ctlpoint)); - for (i = c->num_ctlpoints - 1; i > closest_point; --i) - memcpy (c->ctlpoint + i, c->ctlpoint + i - 1, - sizeof (*c->ctlpoint)); - } - c->grab_point = closest_point; - c->ctlpoint[c->grab_point][0] = - unproject (x, min_x, c->max_x, width); - c->ctlpoint[c->grab_point][1] = - unproject (height - y, c->min_y, c->max_y, height); - - gtk_curve_interpolate (c, width, height); - break; - - case GTK_CURVE_TYPE_FREE: - c->point[x].x = RADIUS + x; - c->point[x].y = RADIUS + y; - c->grab_point = x; - c->last = y; - break; - } - gtk_curve_draw (c, width, height); - retval = TRUE; - break; - - case GDK_BUTTON_RELEASE: - gtk_grab_remove (widget); - - /* delete inactive points: */ - if (c->curve_type != GTK_CURVE_TYPE_FREE) - { - for (src = dst = 0; src < c->num_ctlpoints; ++src) - { - if (c->ctlpoint[src][0] >= min_x) - { - memcpy (c->ctlpoint + dst, c->ctlpoint + src, - sizeof (*c->ctlpoint)); - ++dst; - } - } - if (dst < src) - { - c->num_ctlpoints -= (src - dst); - if (c->num_ctlpoints <= 0) - { - c->num_ctlpoints = 1; - c->ctlpoint[0][0] = min_x; - c->ctlpoint[0][1] = c->min_y; - gtk_curve_interpolate (c, width, height); - gtk_curve_draw (c, width, height); - } - c->ctlpoint = - g_realloc (c->ctlpoint, - c->num_ctlpoints * sizeof (*c->ctlpoint)); - } - } - new_type = GDK_FLEUR; - c->grab_point = -1; - retval = TRUE; - break; - - case GDK_MOTION_NOTIFY: - mevent = (GdkEventMotion *) event; - - switch (c->curve_type) - { - case GTK_CURVE_TYPE_LINEAR: - case GTK_CURVE_TYPE_SPLINE: - if (c->grab_point == -1) - { - /* if no point is grabbed... */ - if (distance <= MIN_DISTANCE) - new_type = GDK_FLEUR; - else - new_type = GDK_TCROSS; - } - else - { - /* drag the grabbed point */ - new_type = GDK_TCROSS; - - leftbound = -MIN_DISTANCE; - if (c->grab_point > 0) - leftbound = project (c->ctlpoint[c->grab_point - 1][0], - min_x, c->max_x, width); - - rightbound = width + RADIUS * 2 + MIN_DISTANCE; - if (c->grab_point + 1 < c->num_ctlpoints) - rightbound = project (c->ctlpoint[c->grab_point + 1][0], - min_x, c->max_x, width); - - if (tx <= leftbound || tx >= rightbound - || ty > height + RADIUS * 2 + MIN_DISTANCE - || ty < -MIN_DISTANCE) - c->ctlpoint[c->grab_point][0] = min_x - 1.0; - else - { - rx = unproject (x, min_x, c->max_x, width); - ry = unproject (height - y, c->min_y, c->max_y, height); - c->ctlpoint[c->grab_point][0] = rx; - c->ctlpoint[c->grab_point][1] = ry; - } - gtk_curve_interpolate (c, width, height); - gtk_curve_draw (c, width, height); - } - break; - - case GTK_CURVE_TYPE_FREE: - if (c->grab_point != -1) - { - if (c->grab_point > x) - { - x1 = x; - x2 = c->grab_point; - y1 = y; - y2 = c->last; - } - else - { - x1 = c->grab_point; - x2 = x; - y1 = c->last; - y2 = y; - } - - if (x2 != x1) - for (i = x1; i <= x2; i++) - { - c->point[i].x = RADIUS + i; - c->point[i].y = RADIUS + - (y1 + ((y2 - y1) * (i - x1)) / (x2 - x1)); - } - else - { - c->point[x].x = RADIUS + x; - c->point[x].y = RADIUS + y; - } - c->grab_point = x; - c->last = y; - gtk_curve_draw (c, width, height); - } - if (mevent->state & GDK_BUTTON1_MASK) - new_type = GDK_TCROSS; - else - new_type = GDK_PENCIL; - break; - } - if (new_type != (GdkCursorType) c->cursor_type) - { - GdkCursor *cursor; - - c->cursor_type = new_type; - - cursor = gdk_cursor_new_for_display (gtk_widget_get_display (w), - c->cursor_type); - gdk_window_set_cursor (w->window, cursor); - gdk_cursor_unref (cursor); - } - retval = TRUE; - break; - - default: - break; - } - - return retval; -} - -void -gtk_curve_set_curve_type (GtkCurve *c, GtkCurveType new_type) -{ - gfloat rx, dx; - gint x, i; - - if (new_type != c->curve_type) - { - gint width, height; - - width = GTK_WIDGET (c)->allocation.width - RADIUS * 2; - height = GTK_WIDGET (c)->allocation.height - RADIUS * 2; - - if (new_type == GTK_CURVE_TYPE_FREE) - { - gtk_curve_interpolate (c, width, height); - c->curve_type = new_type; - } - else if (c->curve_type == GTK_CURVE_TYPE_FREE) - { - g_free (c->ctlpoint); - c->num_ctlpoints = 9; - c->ctlpoint = g_malloc (c->num_ctlpoints * sizeof (*c->ctlpoint)); - - rx = 0.0; - dx = (width - 1) / (gfloat) (c->num_ctlpoints - 1); - - for (i = 0; i < c->num_ctlpoints; ++i, rx += dx) - { - x = (int) (rx + 0.5); - c->ctlpoint[i][0] = - unproject (x, c->min_x, c->max_x, width); - c->ctlpoint[i][1] = - unproject (RADIUS + height - c->point[x].y, - c->min_y, c->max_y, height); - } - c->curve_type = new_type; - gtk_curve_interpolate (c, width, height); - } - else - { - c->curve_type = new_type; - gtk_curve_interpolate (c, width, height); - } - g_signal_emit (c, curve_type_changed_signal, 0); - g_object_notify (G_OBJECT (c), "curve-type"); - gtk_curve_draw (c, width, height); - } -} - -static void -gtk_curve_size_graph (GtkCurve *curve) -{ - gint width, height; - gfloat aspect; - GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (curve)); - - width = (curve->max_x - curve->min_x) + 1; - height = (curve->max_y - curve->min_y) + 1; - aspect = width / (gfloat) height; - if (width > gdk_screen_get_width (screen) / 4) - width = gdk_screen_get_width (screen) / 4; - if (height > gdk_screen_get_height (screen) / 4) - height = gdk_screen_get_height (screen) / 4; - - if (aspect < 1.0) - width = height * aspect; - else - height = width / aspect; - - gtk_widget_set_size_request (GTK_WIDGET (curve), - width + RADIUS * 2, - height + RADIUS * 2); -} - -static void -gtk_curve_reset_vector (GtkCurve *curve) -{ - g_free (curve->ctlpoint); - - curve->num_ctlpoints = 2; - curve->ctlpoint = g_malloc (2 * sizeof (curve->ctlpoint[0])); - curve->ctlpoint[0][0] = curve->min_x; - curve->ctlpoint[0][1] = curve->min_y; - curve->ctlpoint[1][0] = curve->max_x; - curve->ctlpoint[1][1] = curve->max_y; - - if (curve->pixmap) - { - gint width, height; - - width = GTK_WIDGET (curve)->allocation.width - RADIUS * 2; - height = GTK_WIDGET (curve)->allocation.height - RADIUS * 2; - - if (curve->curve_type == GTK_CURVE_TYPE_FREE) - { - curve->curve_type = GTK_CURVE_TYPE_LINEAR; - gtk_curve_interpolate (curve, width, height); - curve->curve_type = GTK_CURVE_TYPE_FREE; - } - else - gtk_curve_interpolate (curve, width, height); - gtk_curve_draw (curve, width, height); - } -} - -void -gtk_curve_reset (GtkCurve *c) -{ - GtkCurveType old_type; - - old_type = c->curve_type; - c->curve_type = GTK_CURVE_TYPE_SPLINE; - gtk_curve_reset_vector (c); - - if (old_type != GTK_CURVE_TYPE_SPLINE) - { - g_signal_emit (c, curve_type_changed_signal, 0); - g_object_notify (G_OBJECT (c), "curve-type"); - } -} - -void -gtk_curve_set_gamma (GtkCurve *c, gfloat gamma) -{ - gfloat x, one_over_gamma, height; - GtkCurveType old_type; - gint i; - - if (c->num_points < 2) - return; - - old_type = c->curve_type; - c->curve_type = GTK_CURVE_TYPE_FREE; - - if (gamma <= 0) - one_over_gamma = 1.0; - else - one_over_gamma = 1.0 / gamma; - height = c->height; - for (i = 0; i < c->num_points; ++i) - { - x = (gfloat) i / (c->num_points - 1); - c->point[i].x = RADIUS + i; - c->point[i].y = - RADIUS + (height * (1.0 - pow (x, one_over_gamma)) + 0.5); - } - - if (old_type != GTK_CURVE_TYPE_FREE) - g_signal_emit (c, curve_type_changed_signal, 0); - - gtk_curve_draw (c, c->num_points, c->height); -} - -void -gtk_curve_set_range (GtkCurve *curve, - gfloat min_x, - gfloat max_x, - gfloat min_y, - gfloat max_y) -{ - g_object_freeze_notify (G_OBJECT (curve)); - if (curve->min_x != min_x) { - curve->min_x = min_x; - g_object_notify (G_OBJECT (curve), "min-x"); - } - if (curve->max_x != max_x) { - curve->max_x = max_x; - g_object_notify (G_OBJECT (curve), "max-x"); - } - if (curve->min_y != min_y) { - curve->min_y = min_y; - g_object_notify (G_OBJECT (curve), "min-y"); - } - if (curve->max_y != max_y) { - curve->max_y = max_y; - g_object_notify (G_OBJECT (curve), "max-y"); - } - g_object_thaw_notify (G_OBJECT (curve)); - - gtk_curve_size_graph (curve); - gtk_curve_reset_vector (curve); -} - -void -gtk_curve_set_vector (GtkCurve *c, int veclen, gfloat vector[]) -{ - GtkCurveType old_type; - gfloat rx, dx, ry; - gint i, height; - GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (c)); - - old_type = c->curve_type; - c->curve_type = GTK_CURVE_TYPE_FREE; - - if (c->point) - height = GTK_WIDGET (c)->allocation.height - RADIUS * 2; - else - { - height = (c->max_y - c->min_y); - if (height > gdk_screen_get_height (screen) / 4) - height = gdk_screen_get_height (screen) / 4; - - c->height = height; - c->num_points = veclen; - c->point = g_malloc (c->num_points * sizeof (c->point[0])); - } - rx = 0; - dx = (veclen - 1.0) / (c->num_points - 1.0); - - for (i = 0; i < c->num_points; ++i, rx += dx) - { - ry = vector[(int) (rx + 0.5)]; - if (ry > c->max_y) ry = c->max_y; - if (ry < c->min_y) ry = c->min_y; - c->point[i].x = RADIUS + i; - c->point[i].y = - RADIUS + height - project (ry, c->min_y, c->max_y, height); - } - if (old_type != GTK_CURVE_TYPE_FREE) - { - g_signal_emit (c, curve_type_changed_signal, 0); - g_object_notify (G_OBJECT (c), "curve-type"); - } - - gtk_curve_draw (c, c->num_points, height); -} - -void -gtk_curve_get_vector (GtkCurve *c, int veclen, gfloat vector[]) -{ - gfloat rx, ry, dx, dy, min_x, delta_x, *mem, *xv, *yv, *y2v, prev; - gint dst, i, x, next, num_active_ctlpoints = 0, first_active = -1; - - min_x = c->min_x; - - if (c->curve_type != GTK_CURVE_TYPE_FREE) - { - /* count active points: */ - prev = min_x - 1.0; - for (i = num_active_ctlpoints = 0; i < c->num_ctlpoints; ++i) - if (c->ctlpoint[i][0] > prev) - { - if (first_active < 0) - first_active = i; - prev = c->ctlpoint[i][0]; - ++num_active_ctlpoints; - } - - /* handle degenerate case: */ - if (num_active_ctlpoints < 2) - { - if (num_active_ctlpoints > 0) - ry = c->ctlpoint[first_active][1]; - else - ry = c->min_y; - if (ry < c->min_y) ry = c->min_y; - if (ry > c->max_y) ry = c->max_y; - for (x = 0; x < veclen; ++x) - vector[x] = ry; - return; - } - } - - switch (c->curve_type) - { - case GTK_CURVE_TYPE_SPLINE: - mem = g_malloc (3 * num_active_ctlpoints * sizeof (gfloat)); - xv = mem; - yv = mem + num_active_ctlpoints; - y2v = mem + 2*num_active_ctlpoints; - - prev = min_x - 1.0; - for (i = dst = 0; i < c->num_ctlpoints; ++i) - if (c->ctlpoint[i][0] > prev) - { - prev = c->ctlpoint[i][0]; - xv[dst] = c->ctlpoint[i][0]; - yv[dst] = c->ctlpoint[i][1]; - ++dst; - } - - spline_solve (num_active_ctlpoints, xv, yv, y2v); - - rx = min_x; - dx = (c->max_x - min_x) / (veclen - 1); - for (x = 0; x < veclen; ++x, rx += dx) - { - ry = spline_eval (num_active_ctlpoints, xv, yv, y2v, rx); - if (ry < c->min_y) ry = c->min_y; - if (ry > c->max_y) ry = c->max_y; - vector[x] = ry; - } - - g_free (mem); - break; - - case GTK_CURVE_TYPE_LINEAR: - dx = (c->max_x - min_x) / (veclen - 1); - rx = min_x; - ry = c->min_y; - dy = 0.0; - i = first_active; - for (x = 0; x < veclen; ++x, rx += dx) - { - if (rx >= c->ctlpoint[i][0]) - { - if (rx > c->ctlpoint[i][0]) - ry = c->min_y; - dy = 0.0; - next = i + 1; - while (next < c->num_ctlpoints - && c->ctlpoint[next][0] <= c->ctlpoint[i][0]) - ++next; - if (next < c->num_ctlpoints) - { - delta_x = c->ctlpoint[next][0] - c->ctlpoint[i][0]; - dy = ((c->ctlpoint[next][1] - c->ctlpoint[i][1]) - / delta_x); - dy *= dx; - ry = c->ctlpoint[i][1]; - i = next; - } - } - vector[x] = ry; - ry += dy; - } - break; - - case GTK_CURVE_TYPE_FREE: - if (c->point) - { - rx = 0.0; - dx = c->num_points / (double) veclen; - for (x = 0; x < veclen; ++x, rx += dx) - vector[x] = unproject (RADIUS + c->height - c->point[(int) rx].y, - c->min_y, c->max_y, - c->height); - } - else - memset (vector, 0, veclen * sizeof (vector[0])); - break; - } -} - -GtkWidget* -gtk_curve_new (void) -{ - return g_object_new (GTK_TYPE_CURVE, NULL); -} - -static void -gtk_curve_finalize (GObject *object) -{ - GtkCurve *curve; - - g_return_if_fail (GTK_IS_CURVE (object)); - - curve = GTK_CURVE (object); - if (curve->pixmap) - g_object_unref (curve->pixmap); - g_free (curve->point); - g_free (curve->ctlpoint); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -#define __GTK_CURVE_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkcurve.h b/gtk/gtkcurve.h deleted file mode 100644 index 68ee716edb..0000000000 --- a/gtk/gtkcurve.h +++ /dev/null @@ -1,106 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_CURVE_H__ -#define __GTK_CURVE_H__ - - -#include <gtk/gtkdrawingarea.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_CURVE (gtk_curve_get_type ()) -#define GTK_CURVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CURVE, GtkCurve)) -#define GTK_CURVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CURVE, GtkCurveClass)) -#define GTK_IS_CURVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CURVE)) -#define GTK_IS_CURVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CURVE)) -#define GTK_CURVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CURVE, GtkCurveClass)) - - -typedef struct _GtkCurve GtkCurve; -typedef struct _GtkCurveClass GtkCurveClass; - - -struct _GtkCurve -{ - GtkDrawingArea graph; - - gint cursor_type; - gfloat min_x; - gfloat max_x; - gfloat min_y; - gfloat max_y; - GdkPixmap *pixmap; - GtkCurveType curve_type; - gint height; /* (cached) graph height in pixels */ - gint grab_point; /* point currently grabbed */ - gint last; - - /* (cached) curve points: */ - gint num_points; - GdkPoint *point; - - /* control points: */ - gint num_ctlpoints; /* number of control points */ - gfloat (*ctlpoint)[2]; /* array of control points */ -}; - -struct _GtkCurveClass -{ - GtkDrawingAreaClass parent_class; - - void (* curve_type_changed) (GtkCurve *curve); - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - - -GType gtk_curve_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_curve_new (void); -void gtk_curve_reset (GtkCurve *curve); -void gtk_curve_set_gamma (GtkCurve *curve, gfloat gamma_); -void gtk_curve_set_range (GtkCurve *curve, - gfloat min_x, gfloat max_x, - gfloat min_y, gfloat max_y); -void gtk_curve_get_vector (GtkCurve *curve, - int veclen, gfloat vector[]); -void gtk_curve_set_vector (GtkCurve *curve, - int veclen, gfloat vector[]); -void gtk_curve_set_curve_type (GtkCurve *curve, GtkCurveType type); - - -G_END_DECLS - -#endif /* __GTK_CURVE_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkdebug.h b/gtk/gtkdebug.h index 3798bc4ad9..4e656a2ef1 100644 --- a/gtk/gtkdebug.h +++ b/gtk/gtkdebug.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkdialog.h b/gtk/gtkdialog.h index 18a18961c8..b1a89f0072 100644 --- a/gtk/gtkdialog.h +++ b/gtk/gtkdialog.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkdnd-quartz.c b/gtk/gtkdnd-quartz.c index 244015faf5..9a4ee30892 100644 --- a/gtk/gtkdnd-quartz.c +++ b/gtk/gtkdnd-quartz.c @@ -1820,16 +1820,6 @@ gtk_drag_set_icon_default (GdkDragContext *context) gtk_drag_set_icon_stock (context, GTK_STOCK_DND, -2, -2); } -void -gtk_drag_set_default_icon (GdkColormap *colormap, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint hot_x, - gint hot_y) -{ - g_warning ("gtk_drag_set_default_icon is not supported on Mac OS X."); -} - static void gtk_drag_source_info_destroy (GtkDragSourceInfo *info) { diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 75a750c4f7..0c73e18e45 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -3406,53 +3406,6 @@ gtk_drag_set_icon_default (GdkDragContext *context) default_icon_hot_y); } -/** - * gtk_drag_set_default_icon: - * @colormap: the colormap of the icon - * @pixmap: the image data for the icon - * @mask: (allow-none): the transparency mask for an image, or %NULL - * @hot_x: The X offset within @widget of the hotspot. - * @hot_y: The Y offset within @widget of the hotspot. - * - * Changes the default drag icon. GTK+ retains references for the - * arguments, and will release them when they are no longer needed. - * - * Deprecated: Change the default drag icon via the stock system by - * changing the stock pixbuf for #GTK_STOCK_DND instead. - **/ -void -gtk_drag_set_default_icon (GdkColormap *colormap, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint hot_x, - gint hot_y) -{ - g_return_if_fail (GDK_IS_COLORMAP (colormap)); - g_return_if_fail (GDK_IS_PIXMAP (pixmap)); - g_return_if_fail (!mask || GDK_IS_PIXMAP (mask)); - - if (default_icon_colormap) - g_object_unref (default_icon_colormap); - if (default_icon_pixmap) - g_object_unref (default_icon_pixmap); - if (default_icon_mask) - g_object_unref (default_icon_mask); - - default_icon_colormap = colormap; - g_object_ref (colormap); - - default_icon_pixmap = pixmap; - g_object_ref (pixmap); - - default_icon_mask = mask; - if (mask) - g_object_ref (mask); - - default_icon_hot_x = hot_x; - default_icon_hot_y = hot_y; -} - - /************************************************************* * _gtk_drag_source_handle_event: * Called from widget event handling code on Drag events diff --git a/gtk/gtkdnd.h b/gtk/gtkdnd.h index 19af311411..e26b2fa85d 100644 --- a/gtk/gtkdnd.h +++ b/gtk/gtkdnd.h @@ -25,7 +25,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -175,14 +175,6 @@ void _gtk_drag_source_handle_event (GtkWidget *widget, void _gtk_drag_dest_handle_event (GtkWidget *toplevel, GdkEvent *event); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_drag_set_default_icon (GdkColormap *colormap, - GdkPixmap *pixmap, - GdkBitmap *mask, - gint hot_x, - gint hot_y); -#endif /* !GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_DND_H__ */ diff --git a/gtk/gtkdrawingarea.c b/gtk/gtkdrawingarea.c index fa7d8b44b6..0ac5952f2d 100644 --- a/gtk/gtkdrawingarea.c +++ b/gtk/gtkdrawingarea.c @@ -59,19 +59,6 @@ gtk_drawing_area_new (void) return g_object_new (GTK_TYPE_DRAWING_AREA, NULL); } -void -gtk_drawing_area_size (GtkDrawingArea *darea, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_DRAWING_AREA (darea)); - - GTK_WIDGET (darea)->requisition.width = width; - GTK_WIDGET (darea)->requisition.height = height; - - gtk_widget_queue_resize (GTK_WIDGET (darea)); -} - static void gtk_drawing_area_realize (GtkWidget *widget) { diff --git a/gtk/gtkdrawingarea.h b/gtk/gtkdrawingarea.h index 3984940140..07283bbfb6 100644 --- a/gtk/gtkdrawingarea.h +++ b/gtk/gtkdrawingarea.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -70,13 +70,6 @@ struct _GtkDrawingAreaClass GType gtk_drawing_area_get_type (void) G_GNUC_CONST; GtkWidget* gtk_drawing_area_new (void); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_drawing_area_size (GtkDrawingArea *darea, - gint width, - gint height); -#endif /* GTK_DISABLE_DEPRECATED */ - - G_END_DECLS #endif /* __GTK_DRAWING_AREA_H__ */ diff --git a/gtk/gtkeditable.h b/gtk/gtkeditable.h index 914d41cb2b..fbbc847111 100644 --- a/gtk/gtkeditable.h +++ b/gtk/gtkeditable.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 4eae62ca54..4a93531276 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -6640,32 +6640,6 @@ gtk_entry_new_with_buffer (GtkEntryBuffer *buffer) return g_object_new (GTK_TYPE_ENTRY, "buffer", buffer, NULL); } -/** - * gtk_entry_new_with_max_length: - * @max: the maximum length of the entry, or 0 for no maximum. - * (other than the maximum length of entries.) The value passed in will - * be clamped to the range 0-65536. - * - * Creates a new #GtkEntry widget with the given maximum length. - * - * Return value: a new #GtkEntry - * - * Deprecated: 2.0: Use gtk_entry_set_max_length() instead. - **/ -GtkWidget* -gtk_entry_new_with_max_length (gint max) -{ - GtkEntry *entry; - - max = CLAMP (max, 0, GTK_ENTRY_BUFFER_MAX_SIZE); - - entry = g_object_new (GTK_TYPE_ENTRY, NULL); - gtk_entry_buffer_set_max_length (get_buffer (entry), max); - - return GTK_WIDGET (entry); -} - - static GtkEntryBuffer* get_buffer (GtkEntry *entry) { @@ -6834,75 +6808,6 @@ gtk_entry_set_text (GtkEntry *entry, } /** - * gtk_entry_append_text: - * @entry: a #GtkEntry - * @text: the text to append - * - * Appends the given text to the contents of the widget. - * - * Deprecated: 2.0: Use gtk_editable_insert_text() instead. - */ -void -gtk_entry_append_text (GtkEntry *entry, - const gchar *text) -{ - GtkEntryPrivate *priv; - gint tmp_pos; - - g_return_if_fail (GTK_IS_ENTRY (entry)); - g_return_if_fail (text != NULL); - priv = GTK_ENTRY_GET_PRIVATE (entry); - - tmp_pos = gtk_entry_buffer_get_length (get_buffer (entry)); - gtk_editable_insert_text (GTK_EDITABLE (entry), text, -1, &tmp_pos); -} - -/** - * gtk_entry_prepend_text: - * @entry: a #GtkEntry - * @text: the text to prepend - * - * Prepends the given text to the contents of the widget. - * - * Deprecated: 2.0: Use gtk_editable_insert_text() instead. - */ -void -gtk_entry_prepend_text (GtkEntry *entry, - const gchar *text) -{ - gint tmp_pos; - - g_return_if_fail (GTK_IS_ENTRY (entry)); - g_return_if_fail (text != NULL); - - tmp_pos = 0; - gtk_editable_insert_text (GTK_EDITABLE (entry), text, -1, &tmp_pos); -} - -/** - * gtk_entry_set_position: - * @entry: a #GtkEntry - * @position: the position of the cursor. The cursor is displayed - * before the character with the given (base 0) index in the widget. - * The value must be less than or equal to the number of characters - * in the widget. A value of -1 indicates that the position should - * be set after the last character in the entry. Note that this - * position is in characters, not in bytes. - * - * Sets the cursor position in an entry to the given value. - * - * Deprecated: 2.0: Use gtk_editable_set_position() instead. - */ -void -gtk_entry_set_position (GtkEntry *entry, - gint position) -{ - g_return_if_fail (GTK_IS_ENTRY (entry)); - - gtk_editable_set_position (GTK_EDITABLE (entry), position); -} - -/** * gtk_entry_set_visibility: * @entry: a #GtkEntry * @visible: %TRUE if the contents of the entry are displayed @@ -7043,26 +6948,6 @@ gtk_entry_unset_invisible_char (GtkEntry *entry) } /** - * gtk_entry_set_editable: - * @entry: a #GtkEntry - * @editable: %TRUE if the user is allowed to edit the text - * in the widget - * - * Determines if the user can edit the text in the editable - * widget or not. - * - * Deprecated: 2.0: Use gtk_editable_set_editable() instead. - */ -void -gtk_entry_set_editable (GtkEntry *entry, - gboolean editable) -{ - g_return_if_fail (GTK_IS_ENTRY (entry)); - - gtk_editable_set_editable (GTK_EDITABLE (entry), editable); -} - -/** * gtk_entry_set_overwrite_mode: * @entry: a #GtkEntry * @overwrite: new value @@ -7129,28 +7014,6 @@ gtk_entry_get_text (GtkEntry *entry) } /** - * gtk_entry_select_region: - * @entry: a #GtkEntry - * @start: the starting position - * @end: the end position - * - * Selects a region of text. The characters that are selected are - * those characters at positions from @start_pos up to, but not - * including @end_pos. If @end_pos is negative, then the the characters - * selected will be those characters from @start_pos to the end of - * the text. - * - * Deprecated: 2.0: Use gtk_editable_select_region() instead. - */ -void -gtk_entry_select_region (GtkEntry *entry, - gint start, - gint end) -{ - gtk_editable_select_region (GTK_EDITABLE (entry), start, end); -} - -/** * gtk_entry_set_max_length: * @entry: a #GtkEntry * @max: the maximum length of the entry, or 0 for no maximum. diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h index 9bbba0b2cd..9bf5f85ff5 100644 --- a/gtk/gtkentry.h +++ b/gtk/gtkentry.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -302,8 +302,7 @@ void gtk_entry_set_icon_drag_source (GtkEntry * GtkTargetList *target_list, GdkDragAction actions); gint gtk_entry_get_current_icon_drag_source (GtkEntry *entry); - -GdkWindow * gtk_entry_get_icon_window (GtkEntry *entry, +GdkWindow* gtk_entry_get_icon_window (GtkEntry *entry, GtkEntryIconPosition icon_pos); gboolean gtk_entry_im_context_filter_keypress (GtkEntry *entry, @@ -311,24 +310,6 @@ gboolean gtk_entry_im_context_filter_keypress (GtkEntry * void gtk_entry_reset_im_context (GtkEntry *entry); -/* Deprecated compatibility functions - */ - -#ifndef GTK_DISABLE_DEPRECATED -GtkWidget* gtk_entry_new_with_max_length (gint max); -void gtk_entry_append_text (GtkEntry *entry, - const gchar *text); -void gtk_entry_prepend_text (GtkEntry *entry, - const gchar *text); -void gtk_entry_set_position (GtkEntry *entry, - gint position); -void gtk_entry_select_region (GtkEntry *entry, - gint start, - gint end); -void gtk_entry_set_editable (GtkEntry *entry, - gboolean editable); -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_ENTRY_H__ */ diff --git a/gtk/gtkentrybuffer.h b/gtk/gtkentrybuffer.h index 20556cb9e8..51725b9720 100644 --- a/gtk/gtkentrybuffer.h +++ b/gtk/gtkentrybuffer.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkentrycompletion.h b/gtk/gtkentrycompletion.h index f0f05aa430..016b25e764 100644 --- a/gtk/gtkentrycompletion.h +++ b/gtk/gtkentrycompletion.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h index 7c577c70b7..2bb021e7a8 100644 --- a/gtk/gtkenums.h +++ b/gtk/gtkenums.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -94,16 +94,6 @@ typedef enum GTK_BUTTONBOX_CENTER } GtkButtonBoxStyle; -#ifndef GTK_DISABLE_DEPRECATED -/* Curve types */ -typedef enum -{ - GTK_CURVE_TYPE_LINEAR, /* linear interpolation */ - GTK_CURVE_TYPE_SPLINE, /* spline interpolation */ - GTK_CURVE_TYPE_FREE /* free form curve */ -} GtkCurveType; -#endif - typedef enum { GTK_DELETE_CHARS, @@ -158,17 +148,6 @@ typedef enum GTK_SENSITIVITY_OFF } GtkSensitivityType; -#ifndef GTK_DISABLE_DEPRECATED -/* side types */ -typedef enum -{ - GTK_SIDE_TOP, - GTK_SIDE_BOTTOM, - GTK_SIDE_LEFT, - GTK_SIDE_RIGHT -} GtkSideType; -#endif /* GTK_DISABLE_DEPRECATED */ - /* Reading directions for text */ typedef enum { @@ -186,19 +165,6 @@ typedef enum GTK_JUSTIFY_FILL } GtkJustification; -#ifndef GTK_DISABLE_DEPRECATED -/* GtkPatternSpec match types */ -typedef enum -{ - GTK_MATCH_ALL, /* "*A?A*" */ - GTK_MATCH_ALL_TAIL, /* "*A?AA" */ - GTK_MATCH_HEAD, /* "AAAA*" */ - GTK_MATCH_TAIL, /* "*AAAA" */ - GTK_MATCH_EXACT, /* "AAAAA" */ - GTK_MATCH_LAST -} GtkMatchType; -#endif /* GTK_DISABLE_DEPRECATED */ - /* Menu keyboard movement types */ typedef enum { @@ -317,14 +283,6 @@ typedef enum GTK_POS_BOTTOM } GtkPositionType; -#ifndef GTK_DISABLE_DEPRECATED -typedef enum -{ - GTK_PREVIEW_COLOR, - GTK_PREVIEW_GRAYSCALE -} GtkPreviewType; -#endif /* GTK_DISABLE_DEPRECATED */ - /* Style for buttons */ typedef enum { @@ -341,19 +299,6 @@ typedef enum GTK_RESIZE_IMMEDIATE /* Perform the resizes now */ } GtkResizeMode; -#ifndef GTK_DISABLE_DEPRECATED -/* signal run types */ -typedef enum /*< flags >*/ -{ - GTK_RUN_FIRST = G_SIGNAL_RUN_FIRST, - GTK_RUN_LAST = G_SIGNAL_RUN_LAST, - GTK_RUN_BOTH = (GTK_RUN_FIRST | GTK_RUN_LAST), - GTK_RUN_NO_RECURSE = G_SIGNAL_NO_RECURSE, - GTK_RUN_ACTION = G_SIGNAL_ACTION, - GTK_RUN_NO_HOOKS = G_SIGNAL_NO_HOOKS -} GtkSignalRunType; -#endif /* GTK_DISABLE_DEPRECATED */ - /* scrolling types */ typedef enum { diff --git a/gtk/gtkeventbox.h b/gtk/gtkeventbox.h index c8e9d9cd56..079ff48e30 100644 --- a/gtk/gtkeventbox.h +++ b/gtk/gtkeventbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkexpander.h b/gtk/gtkexpander.h index dc07a6ce71..11f91750d2 100644 --- a/gtk/gtkexpander.h +++ b/gtk/gtkexpander.h @@ -21,7 +21,7 @@ * Mark McLoughlin <mark@skynet.ie> */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkfilechooser.h b/gtk/gtkfilechooser.h index 21ba7ee5f7..bcc8734d8a 100644 --- a/gtk/gtkfilechooser.h +++ b/gtk/gtkfilechooser.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c index b7227a0bec..439e3ded68 100644 --- a/gtk/gtkfilechooserbutton.c +++ b/gtk/gtkfilechooserbutton.c @@ -820,10 +820,6 @@ gtk_file_chooser_button_set_property (GObject *object, fs_bookmarks_changed_cb (priv->fs, button); break; - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: - /* Ignore property */ - break; - case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE: g_warning ("%s: Choosers of type `%s` do not support selecting multiple files.", G_STRFUNC, G_OBJECT_TYPE_NAME (object)); @@ -856,7 +852,6 @@ gtk_file_chooser_button_get_property (GObject *object, case PROP_TITLE: case GTK_FILE_CHOOSER_PROP_ACTION: - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: case GTK_FILE_CHOOSER_PROP_FILTER: case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY: case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET: @@ -2739,33 +2734,6 @@ gtk_file_chooser_button_new (const gchar *title, } /** - * gtk_file_chooser_button_new_with_backend: - * @title: the title of the browse dialog. - * @action: the open mode for the widget. - * @backend: the name of the #GtkFileSystem backend to use. - * - * Creates a new file-selecting button widget using @backend. - * - * Returns: a new button widget. - * - * Since: 2.6 - * Deprecated: 2.14: Use gtk_file_chooser_button_new() instead. - **/ -GtkWidget * -gtk_file_chooser_button_new_with_backend (const gchar *title, - GtkFileChooserAction action, - const gchar *backend) -{ - g_return_val_if_fail (action == GTK_FILE_CHOOSER_ACTION_OPEN || - action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL); - - return g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON, - "action", action, - "title", (title ? title : _(DEFAULT_TITLE)), - NULL); -} - -/** * gtk_file_chooser_button_new_with_dialog: * @dialog: the widget to use as dialog * diff --git a/gtk/gtkfilechooserbutton.h b/gtk/gtkfilechooserbutton.h index b57209c84c..f6a5bd58c5 100644 --- a/gtk/gtkfilechooserbutton.h +++ b/gtk/gtkfilechooserbutton.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -69,13 +69,6 @@ struct _GtkFileChooserButtonClass GType gtk_file_chooser_button_get_type (void) G_GNUC_CONST; GtkWidget * gtk_file_chooser_button_new (const gchar *title, GtkFileChooserAction action); - -#ifndef GTK_DISABLE_DEPRECATED -GtkWidget * gtk_file_chooser_button_new_with_backend (const gchar *title, - GtkFileChooserAction action, - const gchar *backend); -#endif /* GTK_DISABLE_DEPRECATED */ - GtkWidget * gtk_file_chooser_button_new_with_dialog (GtkWidget *dialog); G_CONST_RETURN gchar *gtk_file_chooser_button_get_title (GtkFileChooserButton *button); void gtk_file_chooser_button_set_title (GtkFileChooserButton *button, diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index 429e8c4df0..114e37109d 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -5440,10 +5440,6 @@ gtk_file_chooser_default_set_property (GObject *object, } break; - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: - /* Ignore property */ - break; - case GTK_FILE_CHOOSER_PROP_FILTER: set_current_filter (impl, g_value_get_object (value)); break; diff --git a/gtk/gtkfilechooserdialog.c b/gtk/gtkfilechooserdialog.c index 43a11ce037..327b865d6e 100644 --- a/gtk/gtkfilechooserdialog.c +++ b/gtk/gtkfilechooserdialog.c @@ -308,10 +308,6 @@ gtk_file_chooser_dialog_set_property (GObject *object, switch (prop_id) { - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: - g_free (priv->file_system); - priv->file_system = g_value_dup_string (value); - break; default: g_object_set_property (G_OBJECT (priv->widget), pspec->name, value); break; @@ -468,44 +464,5 @@ gtk_file_chooser_dialog_new (const gchar *title, return result; } -/** - * gtk_file_chooser_dialog_new_with_backend: - * @title: (allow-none): Title of the dialog, or %NULL - * @parent: (allow-none): Transient parent of the dialog, or %NULL - * @action: Open or save mode for the dialog - * @backend: The name of the specific filesystem backend to use. - * @first_button_text: (allow-none): stock ID or text to go in the first button, or %NULL - * @Varargs: response ID for the first button, then additional (button, id) pairs, ending with %NULL - * - * Creates a new #GtkFileChooserDialog with a specified backend. This is - * especially useful if you use gtk_file_chooser_set_local_only() to allow - * non-local files and you use a more expressive vfs, such as gnome-vfs, - * to load files. - * - * Return value: a new #GtkFileChooserDialog - * - * Since: 2.4 - * Deprecated: 2.14: Use gtk_file_chooser_dialog_new() instead. - **/ -GtkWidget * -gtk_file_chooser_dialog_new_with_backend (const gchar *title, - GtkWindow *parent, - GtkFileChooserAction action, - const gchar *backend, - const gchar *first_button_text, - ...) -{ - GtkWidget *result; - va_list varargs; - - va_start (varargs, first_button_text); - result = gtk_file_chooser_dialog_new_valist (title, parent, action, - backend, first_button_text, - varargs); - va_end (varargs); - - return result; -} - #define __GTK_FILE_CHOOSER_DIALOG_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkfilechooserdialog.h b/gtk/gtkfilechooserdialog.h index d79f6f89a7..10ee0639c9 100644 --- a/gtk/gtkfilechooserdialog.h +++ b/gtk/gtkfilechooserdialog.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -60,15 +60,6 @@ GtkWidget *gtk_file_chooser_dialog_new (const gchar *title const gchar *first_button_text, ...) G_GNUC_NULL_TERMINATED; -#ifndef GTK_DISABLE_DEPRECATED -GtkWidget *gtk_file_chooser_dialog_new_with_backend (const gchar *title, - GtkWindow *parent, - GtkFileChooserAction action, - const gchar *backend, - const gchar *first_button_text, - ...) G_GNUC_NULL_TERMINATED; -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_FILE_CHOOSER_DIALOG_H__ */ diff --git a/gtk/gtkfilechooserutils.c b/gtk/gtkfilechooserutils.c index 69c71d1116..1f0847bf9d 100644 --- a/gtk/gtkfilechooserutils.c +++ b/gtk/gtkfilechooserutils.c @@ -91,9 +91,6 @@ _gtk_file_chooser_install_properties (GObjectClass *klass) GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET, "extra-widget"); g_object_class_override_property (klass, - GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND, - "file-system-backend"); - g_object_class_override_property (klass, GTK_FILE_CHOOSER_PROP_FILTER, "filter"); g_object_class_override_property (klass, diff --git a/gtk/gtkfilechooserutils.h b/gtk/gtkfilechooserutils.h index a590cccd16..2aff40639a 100644 --- a/gtk/gtkfilechooserutils.h +++ b/gtk/gtkfilechooserutils.h @@ -31,7 +31,7 @@ G_BEGIN_DECLS typedef enum { GTK_FILE_CHOOSER_PROP_FIRST = 0x1000, GTK_FILE_CHOOSER_PROP_ACTION = GTK_FILE_CHOOSER_PROP_FIRST, - GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND, + /* GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND, */ GTK_FILE_CHOOSER_PROP_FILTER, GTK_FILE_CHOOSER_PROP_LOCAL_ONLY, GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET, diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index d69d8542b2..ca37b17936 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -126,10 +126,6 @@ gtk_file_chooser_widget_set_property (GObject *object, switch (prop_id) { - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: - g_free (priv->file_system); - priv->file_system = g_value_dup_string (value); - break; default: g_object_set_property (G_OBJECT (priv->impl), pspec->name, value); break; @@ -167,30 +163,5 @@ gtk_file_chooser_widget_new (GtkFileChooserAction action) NULL); } -/** - * gtk_file_chooser_widget_new_with_backend: - * @action: Open or save mode for the widget - * @backend: The name of the specific filesystem backend to use. - * - * Creates a new #GtkFileChooserWidget with a specified backend. This is - * especially useful if you use gtk_file_chooser_set_local_only() to allow - * non-local files. This is a file chooser widget that can be embedded in - * custom windows and it is the same widget that is used by - * #GtkFileChooserDialog. - * - * Return value: a new #GtkFileChooserWidget - * - * Since: 2.4 - * Deprecated: 2.14: Use gtk_file_chooser_widget_new() instead. - **/ -GtkWidget * -gtk_file_chooser_widget_new_with_backend (GtkFileChooserAction action, - const gchar *backend) -{ - return g_object_new (GTK_TYPE_FILE_CHOOSER_WIDGET, - "action", action, - NULL); -} - #define __GTK_FILE_CHOOSER_WIDGET_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkfilechooserwidget.h b/gtk/gtkfilechooserwidget.h index 333531f573..fbc04c9d6e 100644 --- a/gtk/gtkfilechooserwidget.h +++ b/gtk/gtkfilechooserwidget.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -56,12 +56,6 @@ struct _GtkFileChooserWidgetClass GType gtk_file_chooser_widget_get_type (void) G_GNUC_CONST; GtkWidget *gtk_file_chooser_widget_new (GtkFileChooserAction action); - -#ifndef GTK_DISABLE_DEPRECATED -GtkWidget *gtk_file_chooser_widget_new_with_backend (GtkFileChooserAction action, - const gchar *backend); -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_FILE_CHOOSER_WIDGET_H__ */ diff --git a/gtk/gtkfilefilter.h b/gtk/gtkfilefilter.h index dde1fa931a..7a848e51a5 100644 --- a/gtk/gtkfilefilter.h +++ b/gtk/gtkfilefilter.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkfilesel.c b/gtk/gtkfilesel.c deleted file mode 100644 index 465b722a51..0000000000 --- a/gtk/gtkfilesel.c +++ /dev/null @@ -1,3999 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#ifdef HAVE_SYS_PARAM_H -#include <sys/param.h> -#endif -#include <stdlib.h> -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <string.h> -#include <errno.h> -#ifdef HAVE_PWD_H -#include <pwd.h> -#endif - -#include <glib.h> /* Include early to get G_OS_WIN32 etc */ -#include <glib/gstdio.h> - -#if defined(G_PLATFORM_WIN32) -#include <ctype.h> -#define STRICT -#include <windows.h> -#undef STRICT -#endif /* G_PLATFORM_WIN32 */ - -#include "gdk/gdkkeysyms.h" - -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu */ - -#include "gtkbutton.h" -#include "gtkcellrenderertext.h" -#include "gtkentry.h" -#include "gtkfilesel.h" -#include "gtkhbox.h" -#include "gtkhbbox.h" -#include "gtkintl.h" -#include "gtklabel.h" -#include "gtkliststore.h" -#include "gtkmain.h" -#include "gtkprivate.h" -#include "gtkscrolledwindow.h" -#include "gtkstock.h" -#include "gtktreeselection.h" -#include "gtktreeview.h" -#include "gtkvbox.h" -#include "gtkmenu.h" -#include "gtkmenuitem.h" -#include "gtkdialog.h" -#include "gtkmessagedialog.h" -#include "gtkdnd.h" -#include "gtkeventbox.h" -#include "gtkoptionmenu.h" - -#define WANT_HPANED 1 -#include "gtkhpaned.h" - -#include "gtkalias.h" - -#ifdef G_OS_WIN32 -#include <direct.h> -#include <io.h> -#ifndef S_ISDIR -#define S_ISDIR(mode) ((mode)&_S_IFDIR) -#endif -#endif /* G_OS_WIN32 */ - -#ifdef G_WITH_CYGWIN -#include <sys/cygwin.h> /* For cygwin_conv_to_posix_path */ -#endif - -#define DIR_LIST_WIDTH 180 -#define DIR_LIST_HEIGHT 180 -#define FILE_LIST_WIDTH 180 -#define FILE_LIST_HEIGHT 180 - -/* The Hurd doesn't define either PATH_MAX or MAXPATHLEN, so we put this - * in here, since the rest of the code in the file does require some - * fixed maximum. - */ -#ifndef MAXPATHLEN -# ifdef PATH_MAX -# define MAXPATHLEN PATH_MAX -# else -# define MAXPATHLEN 2048 -# endif -#endif - -/* I've put this here so it doesn't get confused with the - * file completion interface */ -typedef struct _HistoryCallbackArg HistoryCallbackArg; - -struct _HistoryCallbackArg -{ - gchar *directory; - GtkWidget *menu_item; -}; - - -typedef struct _CompletionState CompletionState; -typedef struct _CompletionDir CompletionDir; -typedef struct _CompletionDirSent CompletionDirSent; -typedef struct _CompletionDirEntry CompletionDirEntry; -typedef struct _CompletionUserDir CompletionUserDir; -typedef struct _PossibleCompletion PossibleCompletion; - -/* Non-external file completion decls and structures */ - -/* A contant telling PRCS how many directories to cache. Its actually - * kept in a list, so the geometry isn't important. */ -#define CMPL_DIRECTORY_CACHE_SIZE 10 - -/* A constant used to determine whether a substring was an exact - * match by first_diff_index() - */ -#define PATTERN_MATCH -1 -#define CMPL_ERRNO_TOO_LONG ((1<<16)-1) -#define CMPL_ERRNO_DID_NOT_CONVERT ((1<<16)-2) - -/* This structure contains all the useful information about a directory - * for the purposes of filename completion. These structures are cached - * in the CompletionState struct. CompletionDir's are reference counted. - */ -struct _CompletionDirSent -{ -#ifndef G_PLATFORM_WIN32 - ino_t inode; - time_t mtime; - dev_t device; -#endif - - gint entry_count; - struct _CompletionDirEntry *entries; -}; - -struct _CompletionDir -{ - CompletionDirSent *sent; - - gchar *fullname; - gint fullname_len; - - struct _CompletionDir *cmpl_parent; - gint cmpl_index; - gchar *cmpl_text; -}; - -/* This structure contains pairs of directory entry names with a flag saying - * whether or not they are a valid directory. NOTE: This information is used - * to provide the caller with information about whether to update its completions - * or try to open a file. Since directories are cached by the directory mtime, - * a symlink which points to an invalid file (which will not be a directory), - * will not be reevaluated if that file is created, unless the containing - * directory is touched. I consider this case to be worth ignoring (josh). - */ -struct _CompletionDirEntry -{ - gboolean is_dir; - gchar *entry_name; - gchar *sort_key; -}; - -struct _CompletionUserDir -{ - gchar *login; - gchar *homedir; -}; - -struct _PossibleCompletion -{ - /* accessible fields, all are accessed externally by functions - * declared above - */ - gchar *text; - gint is_a_completion; - gboolean is_directory; - - /* Private fields - */ - gint text_alloc; -}; - -struct _CompletionState -{ - gint last_valid_char; - gchar *updated_text; - gint updated_text_len; - gint updated_text_alloc; - gboolean re_complete; - - gchar *user_dir_name_buffer; - gint user_directories_len; - - gchar *last_completion_text; - - gint user_completion_index; /* if >= 0, currently completing ~user */ - - struct _CompletionDir *completion_dir; /* directory completing from */ - struct _CompletionDir *active_completion_dir; - - struct _PossibleCompletion the_completion; - - struct _CompletionDir *reference_dir; /* initial directory */ - - GList* directory_storage; - GList* directory_sent_storage; - - struct _CompletionUserDir *user_directories; -}; - -enum { - PROP_0, - PROP_SHOW_FILEOPS, - PROP_FILENAME, - PROP_SELECT_MULTIPLE -}; - -enum { - DIR_COLUMN -}; - -enum { - FILE_COLUMN -}; - -/* File completion functions which would be external, were they used - * outside of this file. - */ - -static CompletionState* cmpl_init_state (void); -static void cmpl_free_state (CompletionState *cmpl_state); -static gint cmpl_state_okay (CompletionState* cmpl_state); -static const gchar* cmpl_strerror (gint); - -static PossibleCompletion* cmpl_completion_matches(gchar *text_to_complete, - gchar **remaining_text, - CompletionState *cmpl_state); - -/* Returns a name for consideration, possibly a completion, this name - * will be invalid after the next call to cmpl_next_completion. - */ -static char* cmpl_this_completion (PossibleCompletion*); - -/* True if this completion matches the given text. Otherwise, this - * output can be used to have a list of non-completions. - */ -static gint cmpl_is_a_completion (PossibleCompletion*); - -/* True if the completion is a directory - */ -static gboolean cmpl_is_directory (PossibleCompletion*); - -/* Obtains the next completion, or NULL - */ -static PossibleCompletion* cmpl_next_completion (CompletionState*); - -/* Updating completions: the return value of cmpl_updated_text() will - * be text_to_complete completed as much as possible after the most - * recent call to cmpl_completion_matches. For the present - * application, this is the suggested replacement for the user's input - * string. You must CALL THIS AFTER ALL cmpl_text_completions have - * been received. - */ -static gchar* cmpl_updated_text (CompletionState* cmpl_state); - -/* After updating, to see if the completion was a directory, call - * this. If it was, you should consider re-calling completion_matches. - */ -static gboolean cmpl_updated_dir (CompletionState* cmpl_state); - -/* Current location: if using file completion, return the current - * directory, from which file completion begins. More specifically, - * the cwd concatenated with all exact completions up to the last - * directory delimiter('/'). - */ -static gchar* cmpl_reference_position (CompletionState* cmpl_state); - -#if 0 -/* This doesn't work currently and would require changes - * to fnmatch.c to get working. - */ -/* backing up: if cmpl_completion_matches returns NULL, you may query - * the index of the last completable character into cmpl_updated_text. - */ -static gint cmpl_last_valid_char (CompletionState* cmpl_state); -#endif - -/* When the user selects a non-directory, call cmpl_completion_fullname - * to get the full name of the selected file. - */ -static gchar* cmpl_completion_fullname (const gchar*, CompletionState* cmpl_state); - - -/* Directory operations. */ -static CompletionDir* open_ref_dir (gchar* text_to_complete, - gchar** remaining_text, - CompletionState* cmpl_state); -#ifndef G_PLATFORM_WIN32 -static gboolean check_dir (gchar *dir_name, - struct stat *result, - gboolean *stat_subdirs); -#endif -static CompletionDir* open_dir (gchar* dir_name, - CompletionState* cmpl_state); -#ifdef HAVE_PWD_H -static CompletionDir* open_user_dir (const gchar* text_to_complete, - CompletionState *cmpl_state); -#endif -static CompletionDir* open_relative_dir (gchar* dir_name, CompletionDir* dir, - CompletionState *cmpl_state); -static CompletionDirSent* open_new_dir (gchar* dir_name, - struct stat* sbuf, - gboolean stat_subdirs); -static gint correct_dir_fullname (CompletionDir* cmpl_dir); -static gint correct_parent (CompletionDir* cmpl_dir, - struct stat *sbuf); -#ifndef G_PLATFORM_WIN32 -static gchar* find_parent_dir_fullname (gchar* dirname); -#endif -static CompletionDir* attach_dir (CompletionDirSent* sent, - gchar* dir_name, - CompletionState *cmpl_state); -static void free_dir_sent (CompletionDirSent* sent); -static void free_dir (CompletionDir *dir); -static void prune_memory_usage(CompletionState *cmpl_state); - -/* Completion operations */ -#ifdef HAVE_PWD_H -static PossibleCompletion* attempt_homedir_completion(gchar* text_to_complete, - CompletionState *cmpl_state); -#endif -static PossibleCompletion* attempt_file_completion(CompletionState *cmpl_state); -static CompletionDir* find_completion_dir(gchar* text_to_complete, - gchar** remaining_text, - CompletionState* cmpl_state); -static PossibleCompletion* append_completion_text(gchar* text, - CompletionState* cmpl_state); -#ifdef HAVE_PWD_H -static gint get_pwdb(CompletionState* cmpl_state); -static gint compare_user_dir(const void* a, const void* b); -#endif -static gint first_diff_index(gchar* pat, gchar* text); -static gint compare_cmpl_dir(const void* a, const void* b); -static void update_cmpl(PossibleCompletion* poss, - CompletionState* cmpl_state); - -static void gtk_file_selection_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_file_selection_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void gtk_file_selection_finalize (GObject *object); -static void gtk_file_selection_destroy (GtkObject *object); -static void gtk_file_selection_map (GtkWidget *widget); -static gint gtk_file_selection_key_press (GtkWidget *widget, - GdkEventKey *event, - gpointer user_data); -static gint gtk_file_selection_insert_text (GtkWidget *widget, - const gchar *new_text, - gint new_text_length, - gint *position, - gpointer user_data); -static void gtk_file_selection_update_fileops (GtkFileSelection *filesel); - -static void gtk_file_selection_file_activate (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data); -static void gtk_file_selection_file_changed (GtkTreeSelection *selection, - gpointer user_data); -static void gtk_file_selection_dir_activate (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data); - -static void gtk_file_selection_populate (GtkFileSelection *fs, - gchar *rel_path, - gboolean try_complete, - gboolean reset_entry); -static void gtk_file_selection_abort (GtkFileSelection *fs); - -static void gtk_file_selection_update_history_menu (GtkFileSelection *fs, - gchar *current_dir); - -static void gtk_file_selection_create_dir (GtkWidget *widget, gpointer data); -static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data); -static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data); - -static void free_selected_names (GPtrArray *names); - -#ifndef G_PLATFORM_WIN32 - -#define compare_utf8_filenames(a, b) strcmp(a, b) -#define compare_sys_filenames(a, b) strcmp(a, b) - -#else - -static gint -compare_utf8_filenames (const gchar *a, - const gchar *b) -{ - gchar *a_folded, *b_folded; - gint retval; - - a_folded = g_utf8_strdown (a, -1); - b_folded = g_utf8_strdown (b, -1); - - retval = strcmp (a_folded, b_folded); - - g_free (a_folded); - g_free (b_folded); - - return retval; -} - -static gint -compare_sys_filenames (const gchar *a, - const gchar *b) -{ - gchar *a_utf8, *b_utf8; - gint retval; - - a_utf8 = g_filename_to_utf8 (a, -1, NULL, NULL, NULL); - b_utf8 = g_filename_to_utf8 (b, -1, NULL, NULL, NULL); - - retval = compare_utf8_filenames (a_utf8, b_utf8); - - g_free (a_utf8); - g_free (b_utf8); - - return retval; -} - -#endif - -/* Saves errno when something cmpl does fails. */ -static gint cmpl_errno; - -#ifdef G_WITH_CYGWIN -/* - * Take the path currently in the file selection - * entry field and translate as necessary from - * a Win32 style to Cygwin style path. For - * instance translate: - * x:\somepath\file.jpg - * to: - * /cygdrive/x/somepath/file.jpg - * - * Replace the path in the selection text field. - * Return a boolean value concerning whether a - * translation had to be made. - */ -static int -translate_win32_path (GtkFileSelection *filesel) -{ - int updated = 0; - const gchar *path; - gchar newPath[MAX_PATH]; - - /* - * Retrieve the current path - */ - path = gtk_entry_get_text (GTK_ENTRY (filesel->selection_entry)); - - cygwin_conv_to_posix_path (path, newPath); - updated = (strcmp (path, newPath) != 0); - - if (updated) - gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), newPath); - - return updated; -} -#endif - -G_DEFINE_TYPE (GtkFileSelection, gtk_file_selection, GTK_TYPE_DIALOG) - -static void -gtk_file_selection_class_init (GtkFileSelectionClass *class) -{ - GObjectClass *gobject_class; - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - gobject_class = (GObjectClass*) class; - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - - gobject_class->finalize = gtk_file_selection_finalize; - gobject_class->set_property = gtk_file_selection_set_property; - gobject_class->get_property = gtk_file_selection_get_property; - - g_object_class_install_property (gobject_class, - PROP_FILENAME, - g_param_spec_string ("filename", - P_("Filename"), - P_("The currently selected filename"), - NULL, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_SHOW_FILEOPS, - g_param_spec_boolean ("show-fileops", - P_("Show file operations"), - P_("Whether buttons for creating/manipulating files should be displayed"), - TRUE, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_SELECT_MULTIPLE, - g_param_spec_boolean ("select-multiple", - P_("Select Multiple"), - P_("Whether to allow multiple files to be selected"), - FALSE, - GTK_PARAM_READWRITE)); - object_class->destroy = gtk_file_selection_destroy; - widget_class->map = gtk_file_selection_map; -} - -static void gtk_file_selection_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkFileSelection *filesel; - - filesel = GTK_FILE_SELECTION (object); - - switch (prop_id) - { - case PROP_FILENAME: - gtk_file_selection_set_filename (filesel, - g_value_get_string (value)); - break; - case PROP_SHOW_FILEOPS: - if (g_value_get_boolean (value)) - gtk_file_selection_show_fileop_buttons (filesel); - else - gtk_file_selection_hide_fileop_buttons (filesel); - break; - case PROP_SELECT_MULTIPLE: - gtk_file_selection_set_select_multiple (filesel, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void gtk_file_selection_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkFileSelection *filesel; - - filesel = GTK_FILE_SELECTION (object); - - switch (prop_id) - { - case PROP_FILENAME: - g_value_set_string (value, - gtk_file_selection_get_filename(filesel)); - break; - - case PROP_SHOW_FILEOPS: - /* This is a little bit hacky, but doing otherwise would require - * adding a field to the object. - */ - g_value_set_boolean (value, (filesel->fileop_c_dir && - filesel->fileop_del_file && - filesel->fileop_ren_file)); - break; - case PROP_SELECT_MULTIPLE: - g_value_set_boolean (value, gtk_file_selection_get_select_multiple (filesel)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static gboolean -grab_default (GtkWidget *widget) -{ - gtk_widget_grab_default (widget); - return FALSE; -} - -static void -gtk_file_selection_init (GtkFileSelection *filesel) -{ - GtkWidget *entry_vbox; - GtkWidget *label; - GtkWidget *list_hbox, *list_container; - GtkWidget *pulldown_hbox; - GtkWidget *scrolled_win; - GtkWidget *eventbox; - GtkWidget *spacer; - GtkDialog *dialog; - - GtkListStore *model; - GtkTreeViewColumn *column; - - gtk_widget_push_composite_child (); - - dialog = GTK_DIALOG (filesel); - - filesel->cmpl_state = cmpl_init_state (); - - /* The dialog-sized vertical box */ - filesel->main_vbox = dialog->vbox; - gtk_container_set_border_width (GTK_CONTAINER (filesel), 10); - - /* The horizontal box containing create, rename etc. buttons */ - filesel->button_area = gtk_hbutton_box_new (); - gtk_button_box_set_layout (GTK_BUTTON_BOX (filesel->button_area), GTK_BUTTONBOX_START); - gtk_box_set_spacing (GTK_BOX (filesel->button_area), 0); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->button_area, - FALSE, FALSE, 0); - gtk_widget_show (filesel->button_area); - - gtk_file_selection_show_fileop_buttons (filesel); - - /* hbox for pulldown menu */ - pulldown_hbox = gtk_hbox_new (TRUE, 5); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), pulldown_hbox, FALSE, FALSE, 0); - gtk_widget_show (pulldown_hbox); - - /* Pulldown menu */ - filesel->history_pulldown = gtk_option_menu_new (); - gtk_widget_show (filesel->history_pulldown); - gtk_box_pack_start (GTK_BOX (pulldown_hbox), filesel->history_pulldown, - FALSE, FALSE, 0); - - /* The horizontal box containing the directory and file listboxes */ - - spacer = gtk_hbox_new (FALSE, 0); - gtk_widget_set_size_request (spacer, -1, 5); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), spacer, FALSE, FALSE, 0); - gtk_widget_show (spacer); - - list_hbox = gtk_hbox_new (FALSE, 5); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), list_hbox, TRUE, TRUE, 0); - gtk_widget_show (list_hbox); - if (WANT_HPANED) - list_container = g_object_new (GTK_TYPE_HPANED, - "visible", TRUE, - "parent", list_hbox, - "border_width", 0, - NULL); - else - list_container = list_hbox; - - spacer = gtk_hbox_new (FALSE, 0); - gtk_widget_set_size_request (spacer, -1, 5); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), spacer, FALSE, FALSE, 0); - gtk_widget_show (spacer); - - /* The directories list */ - - model = gtk_list_store_new (1, G_TYPE_STRING); - filesel->dir_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); - g_object_unref (model); - - column = gtk_tree_view_column_new_with_attributes (_("Folders"), - gtk_cell_renderer_text_new (), - "text", DIR_COLUMN, - NULL); - label = gtk_label_new_with_mnemonic (_("Fol_ders")); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->dir_list); - gtk_widget_show (label); - gtk_tree_view_column_set_widget (column, label); - gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->dir_list), column); - - gtk_widget_set_size_request (filesel->dir_list, - DIR_LIST_WIDTH, DIR_LIST_HEIGHT); - g_signal_connect (filesel->dir_list, "row-activated", - G_CALLBACK (gtk_file_selection_dir_activate), filesel); - - /* gtk_clist_column_titles_passive (GTK_CLIST (filesel->dir_list)); */ - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->dir_list); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0); - if (GTK_IS_PANED (list_container)) - gtk_paned_pack1 (GTK_PANED (list_container), scrolled_win, TRUE, TRUE); - else - gtk_container_add (GTK_CONTAINER (list_container), scrolled_win); - gtk_widget_show (filesel->dir_list); - gtk_widget_show (scrolled_win); - - /* The files list */ - model = gtk_list_store_new (1, G_TYPE_STRING); - filesel->file_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); - g_object_unref (model); - - column = gtk_tree_view_column_new_with_attributes (_("Files"), - gtk_cell_renderer_text_new (), - "text", FILE_COLUMN, - NULL); - label = gtk_label_new_with_mnemonic (_("_Files")); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list); - gtk_widget_show (label); - gtk_tree_view_column_set_widget (column, label); - gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column); - - gtk_widget_set_size_request (filesel->file_list, - FILE_LIST_WIDTH, FILE_LIST_HEIGHT); - g_signal_connect (filesel->file_list, "row-activated", - G_CALLBACK (gtk_file_selection_file_activate), filesel); - g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->file_list)), "changed", - G_CALLBACK (gtk_file_selection_file_changed), filesel); - - /* gtk_clist_column_titles_passive (GTK_CLIST (filesel->file_list)); */ - - scrolled_win = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->file_list); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0); - gtk_container_add (GTK_CONTAINER (list_container), scrolled_win); - gtk_widget_show (filesel->file_list); - gtk_widget_show (scrolled_win); - - /* action area for packing buttons into. */ - filesel->action_area = gtk_hbox_new (TRUE, 0); - gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->action_area, - FALSE, FALSE, 0); - gtk_widget_show (filesel->action_area); - - /* The OK/Cancel button area */ - - /* The Cancel button */ - filesel->cancel_button = gtk_dialog_add_button (dialog, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL); - /* The OK button */ - filesel->ok_button = gtk_dialog_add_button (dialog, - GTK_STOCK_OK, - GTK_RESPONSE_OK); - - gtk_dialog_set_alternative_button_order (dialog, - GTK_RESPONSE_OK, - GTK_RESPONSE_CANCEL, - -1); - - gtk_widget_grab_default (filesel->ok_button); - - /* The selection entry widget */ - entry_vbox = gtk_vbox_new (FALSE, 2); - gtk_box_pack_end (GTK_BOX (filesel->main_vbox), entry_vbox, FALSE, FALSE, 2); - gtk_widget_show (entry_vbox); - - eventbox = gtk_event_box_new (); - filesel->selection_text = label = gtk_label_new (""); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_container_add (GTK_CONTAINER (eventbox), label); - gtk_box_pack_start (GTK_BOX (entry_vbox), eventbox, FALSE, FALSE, 0); - gtk_widget_show (label); - gtk_widget_show (eventbox); - - filesel->selection_entry = gtk_entry_new (); - g_signal_connect (filesel->selection_entry, "key-press-event", - G_CALLBACK (gtk_file_selection_key_press), filesel); - g_signal_connect (filesel->selection_entry, "insert-text", - G_CALLBACK (gtk_file_selection_insert_text), NULL); - g_signal_connect_swapped (filesel->selection_entry, "changed", - G_CALLBACK (gtk_file_selection_update_fileops), filesel); - g_signal_connect_swapped (filesel->selection_entry, "focus-in-event", - G_CALLBACK (grab_default), - filesel->ok_button); - g_signal_connect_swapped (filesel->selection_entry, "activate", - G_CALLBACK (gtk_button_clicked), - filesel->ok_button); - - gtk_box_pack_start (GTK_BOX (entry_vbox), filesel->selection_entry, TRUE, TRUE, 0); - gtk_widget_show (filesel->selection_entry); - - gtk_label_set_mnemonic_widget (GTK_LABEL (filesel->selection_text), - filesel->selection_entry); - - if (!cmpl_state_okay (filesel->cmpl_state)) - { - gchar err_buf[256]; - - g_snprintf (err_buf, sizeof (err_buf), _("Folder unreadable: %s"), cmpl_strerror (cmpl_errno)); - - gtk_label_set_text (GTK_LABEL (filesel->selection_text), err_buf); - } - else - { - gtk_file_selection_populate (filesel, "", FALSE, TRUE); - } - - gtk_widget_grab_focus (filesel->selection_entry); - - gtk_widget_pop_composite_child (); -} - -static void -dnd_really_drop (GtkWidget *dialog, gint response_id, GtkFileSelection *fs) -{ - gchar *filename; - - if (response_id == GTK_RESPONSE_YES) - { - filename = g_object_get_data (G_OBJECT (dialog), "gtk-fs-dnd-filename"); - - gtk_file_selection_set_filename (fs, filename); - } - - gtk_widget_destroy (dialog); -} - -static void -filenames_dropped (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *selection_data, - guint info, - guint time) -{ - char **uris = NULL; - char *filename = NULL; - char *hostname; - const char *this_hostname; - GError *error = NULL; - - uris = gtk_selection_data_get_uris (selection_data); - if (!uris || !uris[0]) - { - g_strfreev (uris); - return; - } - - filename = g_filename_from_uri (uris[0], &hostname, &error); - g_strfreev (uris); - - if (!filename) - { - g_warning ("Error getting dropped filename: %s\n", - error->message); - g_error_free (error); - return; - } - - this_hostname = g_get_host_name (); - - if ((hostname == NULL) || - (strcmp (hostname, this_hostname) == 0) || - (strcmp (hostname, "localhost") == 0)) - gtk_file_selection_set_filename (GTK_FILE_SELECTION (widget), - filename); - else - { - GtkWidget *dialog; - gchar *filename_utf8; - - /* Conversion back to UTF-8 should always succeed for the result - * of g_filename_from_uri() - */ - filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); - g_assert (filename_utf8); - - dialog = gtk_message_dialog_new (GTK_WINDOW (widget), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_YES_NO, - _("The file \"%s\" resides on another machine (called %s) and may not be available to this program.\n" - "Are you sure that you want to select it?"), filename_utf8, hostname); - g_free (filename_utf8); - - g_object_set_data_full (G_OBJECT (dialog), I_("gtk-fs-dnd-filename"), g_strdup (filename), g_free); - - g_signal_connect_data (dialog, "response", - (GCallback) dnd_really_drop, - widget, NULL, 0); - - gtk_widget_show (dialog); - } - - g_free (hostname); - g_free (filename); -} - -static void -filenames_drag_get (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time, - GtkFileSelection *filesel) -{ - const gchar *file; - gchar *filename_utf8; - - file = gtk_file_selection_get_filename (filesel); - if (!file) - return; - - if (gtk_targets_include_uri (&selection_data->target, 1)) - { - gchar *file_uri; - const char *hostname; - GError *error; - char *uris[2]; - - hostname = g_get_host_name (); - - error = NULL; - file_uri = g_filename_to_uri (file, hostname, &error); - if (!file_uri) - { - g_warning ("Error getting filename: %s\n", - error->message); - g_error_free (error); - return; - } - - uris[0] = file_uri; - uris[1] = NULL; - gtk_selection_data_set_uris (selection_data, uris); - g_free (file_uri); - - return; - } - - filename_utf8 = g_filename_to_utf8 (file, -1, NULL, NULL, NULL); - if (!filename_utf8) - return; - - gtk_selection_data_set_text (selection_data, filename_utf8, -1); - g_free (filename_utf8); -} - -static void -file_selection_setup_dnd (GtkFileSelection *filesel) -{ - GtkWidget *eventbox; - - gtk_drag_dest_set (GTK_WIDGET (filesel), - GTK_DEST_DEFAULT_ALL, - NULL, 0, - GDK_ACTION_COPY); - gtk_drag_dest_add_uri_targets (GTK_WIDGET (filesel)); - - g_signal_connect (filesel, "drag-data-received", - G_CALLBACK (filenames_dropped), NULL); - - eventbox = gtk_widget_get_parent (filesel->selection_text); - gtk_drag_source_set (eventbox, - GDK_BUTTON1_MASK, - NULL, 0, - GDK_ACTION_COPY); - gtk_drag_source_add_uri_targets (eventbox); - gtk_drag_source_add_text_targets (eventbox); - - g_signal_connect (eventbox, "drag-data-get", - G_CALLBACK (filenames_drag_get), filesel); -} - -GtkWidget* -gtk_file_selection_new (const gchar *title) -{ - GtkFileSelection *filesel; - - filesel = g_object_new (GTK_TYPE_FILE_SELECTION, NULL); - gtk_window_set_title (GTK_WINDOW (filesel), title); - gtk_dialog_set_has_separator (GTK_DIALOG (filesel), FALSE); - - file_selection_setup_dnd (filesel); - - return GTK_WIDGET (filesel); -} - -void -gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel) -{ - g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - - /* delete, create directory, and rename */ - if (!filesel->fileop_c_dir) - { - filesel->fileop_c_dir = gtk_button_new_with_mnemonic (_("_New Folder")); - g_signal_connect (filesel->fileop_c_dir, "clicked", - G_CALLBACK (gtk_file_selection_create_dir), - filesel); - gtk_box_pack_start (GTK_BOX (filesel->button_area), - filesel->fileop_c_dir, TRUE, TRUE, 0); - gtk_widget_show (filesel->fileop_c_dir); - } - - if (!filesel->fileop_del_file) - { - filesel->fileop_del_file = gtk_button_new_with_mnemonic (_("De_lete File")); - g_signal_connect (filesel->fileop_del_file, "clicked", - G_CALLBACK (gtk_file_selection_delete_file), - filesel); - gtk_box_pack_start (GTK_BOX (filesel->button_area), - filesel->fileop_del_file, TRUE, TRUE, 0); - gtk_widget_show (filesel->fileop_del_file); - } - - if (!filesel->fileop_ren_file) - { - filesel->fileop_ren_file = gtk_button_new_with_mnemonic (_("_Rename File")); - g_signal_connect (filesel->fileop_ren_file, "clicked", - G_CALLBACK (gtk_file_selection_rename_file), - filesel); - gtk_box_pack_start (GTK_BOX (filesel->button_area), - filesel->fileop_ren_file, TRUE, TRUE, 0); - gtk_widget_show (filesel->fileop_ren_file); - } - - gtk_file_selection_update_fileops (filesel); - - g_object_notify (G_OBJECT (filesel), "show-fileops"); -} - -void -gtk_file_selection_hide_fileop_buttons (GtkFileSelection *filesel) -{ - g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - - if (filesel->fileop_ren_file) - { - gtk_widget_destroy (filesel->fileop_ren_file); - filesel->fileop_ren_file = NULL; - } - - if (filesel->fileop_del_file) - { - gtk_widget_destroy (filesel->fileop_del_file); - filesel->fileop_del_file = NULL; - } - - if (filesel->fileop_c_dir) - { - gtk_widget_destroy (filesel->fileop_c_dir); - filesel->fileop_c_dir = NULL; - } - g_object_notify (G_OBJECT (filesel), "show-fileops"); -} - - - -/** - * gtk_file_selection_set_filename: - * @filesel: a #GtkFileSelection. - * @filename: a string to set as the default file name. - * - * Sets a default path for the file requestor. If @filename includes a - * directory path, then the requestor will open with that path as its - * current working directory. - * - * This has the consequence that in order to open the requestor with a - * working directory and an empty filename, @filename must have a trailing - * directory separator. - * - * The encoding of @filename is preferred GLib file name encoding, which - * may not be UTF-8. See g_filename_from_utf8(). - **/ -void -gtk_file_selection_set_filename (GtkFileSelection *filesel, - const gchar *filename) -{ - gchar *buf; - const char *name, *last_slash; - char *filename_utf8; - - g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - g_return_if_fail (filename != NULL); - - filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL); - g_return_if_fail (filename_utf8 != NULL); - - last_slash = strrchr (filename_utf8, G_DIR_SEPARATOR); - - if (!last_slash) - { - buf = g_strdup (""); - name = filename_utf8; - } - else - { - buf = g_strdup (filename_utf8); - buf[last_slash - filename_utf8 + 1] = 0; - name = last_slash + 1; - } - - gtk_file_selection_populate (filesel, buf, FALSE, TRUE); - - if (filesel->selection_entry) - gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), name); - g_free (buf); - g_object_notify (G_OBJECT (filesel), "filename"); - - g_free (filename_utf8); -} - -/** - * gtk_file_selection_get_filename: - * @filesel: a #GtkFileSelection - * - * This function returns the selected filename in the GLib file name - * encoding. To convert to UTF-8, call g_filename_to_utf8(). The - * returned string points to a statically allocated buffer and should - * be copied if you plan to keep it around. - * - * If no file is selected then the selected directory path is returned. - * - * Return value: currently-selected filename in the on-disk encoding. - **/ -G_CONST_RETURN gchar* -gtk_file_selection_get_filename (GtkFileSelection *filesel) -{ - static const gchar nothing[2] = ""; - static GString *something; - char *sys_filename; - const char *text; - - g_return_val_if_fail (GTK_IS_FILE_SELECTION (filesel), nothing); - -#ifdef G_WITH_CYGWIN - translate_win32_path (filesel); -#endif - text = gtk_entry_get_text (GTK_ENTRY (filesel->selection_entry)); - if (text) - { - gchar *fullname = cmpl_completion_fullname (text, filesel->cmpl_state); - sys_filename = g_filename_from_utf8 (fullname, -1, NULL, NULL, NULL); - g_free (fullname); - if (!sys_filename) - return nothing; - if (!something) - something = g_string_new (sys_filename); - else - g_string_assign (something, sys_filename); - g_free (sys_filename); - - return something->str; - } - - return nothing; -} - -void -gtk_file_selection_complete (GtkFileSelection *filesel, - const gchar *pattern) -{ - g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - g_return_if_fail (pattern != NULL); - - if (filesel->selection_entry) - gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), pattern); - gtk_file_selection_populate (filesel, (gchar*) pattern, TRUE, TRUE); -} - -static void -gtk_file_selection_destroy (GtkObject *object) -{ - GtkFileSelection *filesel; - GList *list; - HistoryCallbackArg *callback_arg; - - g_return_if_fail (GTK_IS_FILE_SELECTION (object)); - - filesel = GTK_FILE_SELECTION (object); - - if (filesel->fileop_dialog) - { - gtk_widget_destroy (filesel->fileop_dialog); - filesel->fileop_dialog = NULL; - } - - if (filesel->history_list) - { - list = filesel->history_list; - while (list) - { - callback_arg = list->data; - g_free (callback_arg->directory); - g_free (callback_arg); - list = list->next; - } - g_list_free (filesel->history_list); - filesel->history_list = NULL; - } - - if (filesel->cmpl_state) - { - cmpl_free_state (filesel->cmpl_state); - filesel->cmpl_state = NULL; - } - - if (filesel->selected_names) - { - free_selected_names (filesel->selected_names); - filesel->selected_names = NULL; - } - - if (filesel->last_selected) - { - g_free (filesel->last_selected); - filesel->last_selected = NULL; - } - - GTK_OBJECT_CLASS (gtk_file_selection_parent_class)->destroy (object); -} - -static void -gtk_file_selection_map (GtkWidget *widget) -{ - GtkFileSelection *filesel = GTK_FILE_SELECTION (widget); - - /* Refresh the contents */ - gtk_file_selection_populate (filesel, "", FALSE, FALSE); - - GTK_WIDGET_CLASS (gtk_file_selection_parent_class)->map (widget); -} - -static void -gtk_file_selection_finalize (GObject *object) -{ - GtkFileSelection *filesel = GTK_FILE_SELECTION (object); - - g_free (filesel->fileop_file); - - G_OBJECT_CLASS (gtk_file_selection_parent_class)->finalize (object); -} - -/* Begin file operations callbacks */ - -static void -gtk_file_selection_fileop_error (GtkFileSelection *fs, - gchar *error_message) -{ - GtkWidget *dialog; - - g_return_if_fail (error_message != NULL); - - /* main dialog */ - dialog = gtk_message_dialog_new (GTK_WINDOW (fs), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - "%s", error_message); - - /* yes, we free it */ - g_free (error_message); - - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - g_signal_connect_swapped (dialog, "response", - G_CALLBACK (gtk_widget_destroy), - dialog); - - gtk_widget_show (dialog); -} - -static void -gtk_file_selection_fileop_destroy (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - fs->fileop_dialog = NULL; -} - -static gboolean -entry_is_empty (GtkEntry *entry) -{ - const gchar *text = gtk_entry_get_text (entry); - - return *text == '\0'; -} - -static void -gtk_file_selection_fileop_entry_changed (GtkEntry *entry, - GtkWidget *button) -{ - gtk_widget_set_sensitive (button, !entry_is_empty (entry)); -} - -static void -gtk_file_selection_create_dir_confirmed (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - const gchar *dirname; - gchar *path; - gchar *full_path; - gchar *sys_full_path; - gchar *buf; - GError *error = NULL; - CompletionState *cmpl_state; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - dirname = gtk_entry_get_text (GTK_ENTRY (fs->fileop_entry)); - cmpl_state = (CompletionState*) fs->cmpl_state; - path = cmpl_reference_position (cmpl_state); - - full_path = g_strconcat (path, G_DIR_SEPARATOR_S, dirname, NULL); - sys_full_path = g_filename_from_utf8 (full_path, -1, NULL, NULL, &error); - if (error) - { - if (g_error_matches (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) - buf = g_strdup_printf (_("The folder name \"%s\" contains symbols that are not allowed in filenames"), dirname); - else - buf = g_strdup_printf (_("Error creating folder '%s': %s"), - dirname, error->message); - gtk_file_selection_fileop_error (fs, buf); - g_error_free (error); - goto out; - } - - if (g_mkdir (sys_full_path, 0777) < 0) - { - int errsv = errno; - - buf = g_strdup_printf (_("Error creating folder '%s': %s"), - dirname, g_strerror (errsv)); - gtk_file_selection_fileop_error (fs, buf); - } - - out: - g_free (full_path); - g_free (sys_full_path); - - gtk_widget_destroy (fs->fileop_dialog); - gtk_file_selection_populate (fs, "", FALSE, FALSE); -} - -static void -gtk_file_selection_create_dir (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - GtkWidget *label; - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *button; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - if (fs->fileop_dialog) - return; - - /* main dialog */ - dialog = gtk_dialog_new (); - fs->fileop_dialog = dialog; - g_signal_connect (dialog, "destroy", - G_CALLBACK (gtk_file_selection_fileop_destroy), - fs); - gtk_window_set_title (GTK_WINDOW (dialog), _("New Folder")); - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fs)); - - /* If file dialog is grabbed, grab option dialog */ - /* When option dialog is closed, file dialog will be grabbed again */ - if (GTK_WINDOW (fs)->modal) - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); - gtk_widget_show( vbox); - - label = gtk_label_new_with_mnemonic (_("_Folder name:")); - gtk_misc_set_alignment(GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 5); - gtk_widget_show (label); - - /* The directory entry widget */ - fs->fileop_entry = gtk_entry_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), fs->fileop_entry); - gtk_box_pack_start (GTK_BOX (vbox), fs->fileop_entry, - TRUE, TRUE, 5); - gtk_widget_set_can_default (fs->fileop_entry, TRUE); - gtk_entry_set_activates_default (GTK_ENTRY (fs->fileop_entry), TRUE); - gtk_widget_show (fs->fileop_entry); - - /* buttons */ - button = gtk_dialog_add_button (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (gtk_widget_destroy), - dialog); - - gtk_widget_grab_focus (fs->fileop_entry); - - button = gtk_dialog_add_button (GTK_DIALOG (dialog), - _("C_reate"), GTK_RESPONSE_OK); - gtk_widget_set_sensitive (button, FALSE); - g_signal_connect (button, "clicked", - G_CALLBACK (gtk_file_selection_create_dir_confirmed), - fs); - g_signal_connect (fs->fileop_entry, "changed", - G_CALLBACK (gtk_file_selection_fileop_entry_changed), - button); - - gtk_widget_grab_default (button); - - gtk_widget_show (dialog); -} - -static void -gtk_file_selection_delete_file_response (GtkDialog *dialog, - gint response_id, - gpointer data) -{ - GtkFileSelection *fs = data; - CompletionState *cmpl_state; - gchar *path; - gchar *full_path; - gchar *sys_full_path; - GError *error = NULL; - gchar *buf; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - if (response_id != GTK_RESPONSE_OK) - { - gtk_widget_destroy (GTK_WIDGET (dialog)); - return; - } - - cmpl_state = (CompletionState*) fs->cmpl_state; - path = cmpl_reference_position (cmpl_state); - - full_path = g_strconcat (path, G_DIR_SEPARATOR_S, fs->fileop_file, NULL); - sys_full_path = g_filename_from_utf8 (full_path, -1, NULL, NULL, &error); - if (error) - { - if (g_error_matches (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) - buf = g_strdup_printf (_("The filename \"%s\" contains symbols that are not allowed in filenames"), - fs->fileop_file); - else - buf = g_strdup_printf (_("Error deleting file '%s': %s"), - fs->fileop_file, error->message); - - gtk_file_selection_fileop_error (fs, buf); - g_error_free (error); - goto out; - } - - if (g_unlink (sys_full_path) < 0) - { - int errsv = errno; - - buf = g_strdup_printf (_("Error deleting file '%s': %s"), - fs->fileop_file, g_strerror (errsv)); - gtk_file_selection_fileop_error (fs, buf); - } - - out: - g_free (full_path); - g_free (sys_full_path); - - gtk_widget_destroy (fs->fileop_dialog); - gtk_file_selection_populate (fs, "", FALSE, TRUE); -} - -static void -gtk_file_selection_delete_file (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - GtkWidget *dialog; - const gchar *filename; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - if (fs->fileop_dialog) - return; - -#ifdef G_WITH_CYGWIN - translate_win32_path (fs); -#endif - - filename = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); - if (strlen (filename) < 1) - return; - - g_free (fs->fileop_file); - fs->fileop_file = g_strdup (filename); - - /* main dialog */ - fs->fileop_dialog = dialog = - gtk_message_dialog_new (GTK_WINDOW (fs), - GTK_WINDOW (fs)->modal ? GTK_DIALOG_MODAL : 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - _("Really delete file \"%s\"?"), filename); - - g_signal_connect (dialog, "destroy", - G_CALLBACK (gtk_file_selection_fileop_destroy), - fs); - gtk_window_set_title (GTK_WINDOW (dialog), _("Delete File")); - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - - /* buttons */ - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_DELETE, GTK_RESPONSE_OK, - NULL); - - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); - - g_signal_connect (dialog, "response", - G_CALLBACK (gtk_file_selection_delete_file_response), - fs); - - gtk_widget_show (dialog); -} - -static void -gtk_file_selection_rename_file_confirmed (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - gchar *buf; - const gchar *file; - gchar *path; - gchar *new_filename; - gchar *old_filename; - gchar *sys_new_filename; - gchar *sys_old_filename; - CompletionState *cmpl_state; - GError *error = NULL; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - file = gtk_entry_get_text (GTK_ENTRY (fs->fileop_entry)); - cmpl_state = (CompletionState*) fs->cmpl_state; - path = cmpl_reference_position (cmpl_state); - - new_filename = g_strconcat (path, G_DIR_SEPARATOR_S, file, NULL); - old_filename = g_strconcat (path, G_DIR_SEPARATOR_S, fs->fileop_file, NULL); - - sys_new_filename = g_filename_from_utf8 (new_filename, -1, NULL, NULL, &error); - if (error) - { - if (g_error_matches (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) - buf = g_strdup_printf (_("The filename \"%s\" contains symbols that are not allowed in filenames"), new_filename); - else - buf = g_strdup_printf (_("Error renaming file to \"%s\": %s"), - new_filename, error->message); - gtk_file_selection_fileop_error (fs, buf); - g_error_free (error); - goto out1; - } - - sys_old_filename = g_filename_from_utf8 (old_filename, -1, NULL, NULL, &error); - if (error) - { - if (g_error_matches (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) - buf = g_strdup_printf (_("The filename \"%s\" contains symbols that are not allowed in filenames"), old_filename); - else - buf = g_strdup_printf (_("Error renaming file \"%s\": %s"), - old_filename, error->message); - gtk_file_selection_fileop_error (fs, buf); - g_error_free (error); - goto out2; - } - - if (g_rename (sys_old_filename, sys_new_filename) < 0) - { - int errsv = errno; - - buf = g_strdup_printf (_("Error renaming file \"%s\" to \"%s\": %s"), - sys_old_filename, sys_new_filename, - g_strerror (errsv)); - gtk_file_selection_fileop_error (fs, buf); - goto out2; - } - - gtk_file_selection_populate (fs, "", FALSE, FALSE); - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), file); - - out2: - g_free (sys_old_filename); - - out1: - g_free (new_filename); - g_free (old_filename); - g_free (sys_new_filename); - - gtk_widget_destroy (fs->fileop_dialog); -} - -static void -gtk_file_selection_rename_file (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - GtkWidget *label; - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *button; - gchar *buf; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - if (fs->fileop_dialog) - return; - - g_free (fs->fileop_file); - fs->fileop_file = g_strdup (gtk_entry_get_text (GTK_ENTRY (fs->selection_entry))); - if (strlen (fs->fileop_file) < 1) - return; - - /* main dialog */ - fs->fileop_dialog = dialog = gtk_dialog_new (); - g_signal_connect (dialog, "destroy", - G_CALLBACK (gtk_file_selection_fileop_destroy), - fs); - gtk_window_set_title (GTK_WINDOW (dialog), _("Rename File")); - gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fs)); - - /* If file dialog is grabbed, grab option dialog */ - /* When option dialog closed, file dialog will be grabbed again */ - if (GTK_WINDOW (fs)->modal) - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, - FALSE, FALSE, 0); - gtk_widget_show(vbox); - - buf = g_strdup_printf (_("Rename file \"%s\" to:"), fs->fileop_file); - label = gtk_label_new (buf); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); - gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 5); - gtk_widget_show (label); - g_free (buf); - - /* New filename entry */ - fs->fileop_entry = gtk_entry_new (); - gtk_box_pack_start (GTK_BOX (vbox), fs->fileop_entry, - TRUE, TRUE, 5); - gtk_widget_set_can_default (fs->fileop_entry, TRUE); - gtk_entry_set_activates_default (GTK_ENTRY (fs->fileop_entry), TRUE); - gtk_widget_show (fs->fileop_entry); - - gtk_entry_set_text (GTK_ENTRY (fs->fileop_entry), fs->fileop_file); - gtk_editable_select_region (GTK_EDITABLE (fs->fileop_entry), - 0, strlen (fs->fileop_file)); - - /* buttons */ - button = gtk_dialog_add_button (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - g_signal_connect_swapped (button, "clicked", - G_CALLBACK (gtk_widget_destroy), - dialog); - - gtk_widget_grab_focus (fs->fileop_entry); - - button = gtk_dialog_add_button (GTK_DIALOG (dialog), - _("_Rename"), GTK_RESPONSE_OK); - g_signal_connect (button, "clicked", - G_CALLBACK (gtk_file_selection_rename_file_confirmed), - fs); - g_signal_connect (fs->fileop_entry, "changed", - G_CALLBACK (gtk_file_selection_fileop_entry_changed), - button); - - gtk_widget_grab_default (button); - - gtk_widget_show (dialog); -} - -static gint -gtk_file_selection_insert_text (GtkWidget *widget, - const gchar *new_text, - gint new_text_length, - gint *position, - gpointer user_data) -{ - gchar *filename; - - filename = g_filename_from_utf8 (new_text, new_text_length, NULL, NULL, NULL); - - if (!filename) - { - gdk_display_beep (gtk_widget_get_display (widget)); - g_signal_stop_emission_by_name (widget, "insert-text"); - return FALSE; - } - - g_free (filename); - - return TRUE; -} - -static void -gtk_file_selection_update_fileops (GtkFileSelection *fs) -{ - gboolean sensitive; - - if (!fs->selection_entry) - return; - - sensitive = !entry_is_empty (GTK_ENTRY (fs->selection_entry)); - - if (fs->fileop_del_file) - gtk_widget_set_sensitive (fs->fileop_del_file, sensitive); - - if (fs->fileop_ren_file) - gtk_widget_set_sensitive (fs->fileop_ren_file, sensitive); -} - -static gint -gtk_file_selection_key_press (GtkWidget *widget, - GdkEventKey *event, - gpointer user_data) -{ - GtkFileSelection *fs; - char *text; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - if ((event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab) && - (event->state & gtk_accelerator_get_default_mod_mask ()) == 0) - { - fs = GTK_FILE_SELECTION (user_data); -#ifdef G_WITH_CYGWIN - translate_win32_path (fs); -#endif - text = g_strdup (gtk_entry_get_text (GTK_ENTRY (fs->selection_entry))); - - gtk_file_selection_populate (fs, text, TRUE, TRUE); - - g_free (text); - - return TRUE; - } - - return FALSE; -} - -static void -gtk_file_selection_history_callback (GtkWidget *widget, - gpointer data) -{ - GtkFileSelection *fs = data; - HistoryCallbackArg *callback_arg; - GList *list; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - list = fs->history_list; - - while (list) { - callback_arg = list->data; - - if (callback_arg->menu_item == widget) - { - gtk_file_selection_populate (fs, callback_arg->directory, FALSE, FALSE); - break; - } - - list = list->next; - } -} - -static void -gtk_file_selection_update_history_menu (GtkFileSelection *fs, - gchar *current_directory) -{ - HistoryCallbackArg *callback_arg; - GtkWidget *menu_item; - GList *list; - gchar *current_dir; - gint dir_len; - gint i; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - g_return_if_fail (current_directory != NULL); - - list = fs->history_list; - - if (fs->history_menu) - { - while (list) { - callback_arg = list->data; - g_free (callback_arg->directory); - g_free (callback_arg); - list = list->next; - } - g_list_free (fs->history_list); - fs->history_list = NULL; - - gtk_widget_destroy (fs->history_menu); - } - - fs->history_menu = gtk_menu_new (); - - current_dir = g_strdup (current_directory); - - dir_len = strlen (current_dir); - - for (i = dir_len; i >= 0; i--) - { - /* the i == dir_len is to catch the full path for the first - * entry. */ - if ( (current_dir[i] == G_DIR_SEPARATOR) || (i == dir_len)) - { - /* another small hack to catch the full path */ - if (i != dir_len) - current_dir[i + 1] = '\0'; -#ifdef G_WITH_CYGWIN - if (!strcmp (current_dir, "//")) - continue; -#endif - menu_item = gtk_menu_item_new_with_label (current_dir); - - callback_arg = g_new (HistoryCallbackArg, 1); - callback_arg->menu_item = menu_item; - - /* since the autocompletion gets confused if you don't - * supply a trailing '/' on a dir entry, set the full - * (current) path to "" which just refreshes the filesel */ - if (dir_len == i) - { - callback_arg->directory = g_strdup (""); - } - else - { - callback_arg->directory = g_strdup (current_dir); - } - - fs->history_list = g_list_append (fs->history_list, callback_arg); - - g_signal_connect (menu_item, "activate", - G_CALLBACK (gtk_file_selection_history_callback), - fs); - gtk_menu_shell_append (GTK_MENU_SHELL (fs->history_menu), menu_item); - gtk_widget_show (menu_item); - } - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->history_pulldown), - fs->history_menu); - g_free (current_dir); -} - -static gchar * -get_real_filename (gchar *filename, - gboolean free_old) -{ -#ifdef G_WITH_CYGWIN - /* Check to see if the selection was a drive selector */ - if (isalpha (filename[0]) && (filename[1] == ':')) - { - gchar temp_filename[MAX_PATH]; - int len; - - cygwin_conv_to_posix_path (filename, temp_filename); - - /* we need trailing '/'. */ - len = strlen (temp_filename); - if (len > 0 && temp_filename[len-1] != '/') - { - temp_filename[len] = '/'; - temp_filename[len+1] = '\0'; - } - - if (free_old) - g_free (filename); - - return g_strdup (temp_filename); - } -#endif /* G_WITH_CYGWIN */ - return filename; -} - -static void -gtk_file_selection_file_activate (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data) -{ - GtkFileSelection *fs = GTK_FILE_SELECTION (user_data); - GtkTreeModel *model = gtk_tree_view_get_model (tree_view); - GtkTreeIter iter; - gchar *filename; - - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_model_get (model, &iter, FILE_COLUMN, &filename, -1); - filename = get_real_filename (filename, TRUE); - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); - gtk_button_clicked (GTK_BUTTON (fs->ok_button)); - - g_free (filename); -} - -static void -gtk_file_selection_dir_activate (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - gpointer user_data) -{ - GtkFileSelection *fs = GTK_FILE_SELECTION (user_data); - GtkTreeModel *model = gtk_tree_view_get_model (tree_view); - GtkTreeIter iter; - gchar *filename; - - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_model_get (model, &iter, DIR_COLUMN, &filename, -1); - filename = get_real_filename (filename, TRUE); - gtk_file_selection_populate (fs, filename, FALSE, FALSE); - g_free (filename); -} - -#ifdef G_PLATFORM_WIN32 - -static void -win32_gtk_add_drives_to_dir_list (GtkListStore *model) -{ - gchar *textPtr; - gchar buffer[128]; - char formatBuffer[128]; - GtkTreeIter iter; - - /* Get the drives string */ - GetLogicalDriveStrings (sizeof (buffer), buffer); - - /* Add the drives as necessary */ - textPtr = buffer; - while (*textPtr != '\0') - { - /* Ignore floppies (?) */ - if (GetDriveType (textPtr) != DRIVE_REMOVABLE) - { - /* Build the actual displayable string */ - g_snprintf (formatBuffer, sizeof (formatBuffer), "%c:\\", toupper (textPtr[0])); - - /* Add to the list */ - gtk_list_store_append (model, &iter); - gtk_list_store_set (model, &iter, DIR_COLUMN, formatBuffer, -1); - } - textPtr += (strlen (textPtr) + 1); - } -} -#endif - -static gchar * -escape_underscores (const gchar *str) -{ - GString *result = g_string_new (NULL); - while (*str) - { - if (*str == '_') - g_string_append_c (result, '_'); - - g_string_append_c (result, *str); - str++; - } - - return g_string_free (result, FALSE); -} - -static void -gtk_file_selection_populate (GtkFileSelection *fs, - gchar *rel_path, - gboolean try_complete, - gboolean reset_entry) -{ - CompletionState *cmpl_state; - PossibleCompletion* poss; - GtkTreeIter iter; - GtkListStore *dir_model; - GtkListStore *file_model; - gchar* filename; - gchar* rem_path = rel_path; - gchar* sel_text; - gint did_recurse = FALSE; - gint possible_count = 0; - - g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); - - cmpl_state = (CompletionState*) fs->cmpl_state; - poss = cmpl_completion_matches (rel_path, &rem_path, cmpl_state); - - if (!cmpl_state_okay (cmpl_state)) - { - /* Something went wrong. */ - gtk_file_selection_abort (fs); - return; - } - - g_assert (cmpl_state->reference_dir); - - dir_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fs->dir_list))); - file_model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fs->file_list))); - - gtk_list_store_clear (dir_model); - gtk_list_store_clear (file_model); - - /* Set the dir list to include ./ and ../ */ - gtk_list_store_append (dir_model, &iter); - gtk_list_store_set (dir_model, &iter, DIR_COLUMN, "." G_DIR_SEPARATOR_S, -1); - gtk_list_store_append (dir_model, &iter); - gtk_list_store_set (dir_model, &iter, DIR_COLUMN, ".." G_DIR_SEPARATOR_S, -1); - - while (poss) - { - if (cmpl_is_a_completion (poss)) - { - possible_count += 1; - - filename = cmpl_this_completion (poss); - - if (cmpl_is_directory (poss)) - { - if (strcmp (filename, "." G_DIR_SEPARATOR_S) != 0 && - strcmp (filename, ".." G_DIR_SEPARATOR_S) != 0) - { - gtk_list_store_append (dir_model, &iter); - gtk_list_store_set (dir_model, &iter, DIR_COLUMN, filename, -1); - } - } - else - { - gtk_list_store_append (file_model, &iter); - gtk_list_store_set (file_model, &iter, DIR_COLUMN, filename, -1); - } - } - - poss = cmpl_next_completion (cmpl_state); - } - -#ifdef G_PLATFORM_WIN32 - /* For Windows, add drives as potential selections */ - win32_gtk_add_drives_to_dir_list (dir_model); -#endif - - /* File lists are set. */ - - g_assert (cmpl_state->reference_dir); - - if (try_complete) - { - - /* User is trying to complete filenames, so advance the user's input - * string to the updated_text, which is the common leading substring - * of all possible completions, and if its a directory attempt - * attempt completions in it. */ - - if (cmpl_updated_text (cmpl_state)[0]) - { - - if (cmpl_updated_dir (cmpl_state)) - { - gchar* dir_name = g_strdup (cmpl_updated_text (cmpl_state)); - - did_recurse = TRUE; - - gtk_file_selection_populate (fs, dir_name, TRUE, TRUE); - - g_free (dir_name); - } - else - { - if (fs->selection_entry) - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), - cmpl_updated_text (cmpl_state)); - } - } - else - { - if (fs->selection_entry) - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), rem_path); - } - } - else if (reset_entry) - { - if (fs->selection_entry) - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), ""); - } - - if (!did_recurse) - { - if (fs->selection_entry && try_complete) - gtk_editable_set_position (GTK_EDITABLE (fs->selection_entry), -1); - - if (fs->selection_entry) - { - char *escaped = escape_underscores (cmpl_reference_position (cmpl_state)); - sel_text = g_strconcat (_("_Selection: "), escaped, NULL); - g_free (escaped); - - gtk_label_set_text_with_mnemonic (GTK_LABEL (fs->selection_text), sel_text); - g_free (sel_text); - } - - if (fs->history_pulldown) - { - gtk_file_selection_update_history_menu (fs, cmpl_reference_position (cmpl_state)); - } - - } -} - -static void -gtk_file_selection_abort (GtkFileSelection *fs) -{ - gchar err_buf[256]; - - g_snprintf (err_buf, sizeof (err_buf), _("Folder unreadable: %s"), cmpl_strerror (cmpl_errno)); - - /* BEEP gdk_beep(); */ - - if (fs->selection_entry) - gtk_label_set_text (GTK_LABEL (fs->selection_text), err_buf); -} - -/** - * gtk_file_selection_set_select_multiple: - * @filesel: a #GtkFileSelection - * @select_multiple: whether or not the user is allowed to select multiple - * files in the file list. - * - * Sets whether the user is allowed to select multiple files in the file list. - * Use gtk_file_selection_get_selections () to get the list of selected files. - **/ -void -gtk_file_selection_set_select_multiple (GtkFileSelection *filesel, - gboolean select_multiple) -{ - GtkTreeSelection *sel; - GtkSelectionMode mode; - - g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); - - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->file_list)); - - mode = select_multiple ? GTK_SELECTION_MULTIPLE : GTK_SELECTION_SINGLE; - - if (mode != gtk_tree_selection_get_mode (sel)) - { - gtk_tree_selection_set_mode (sel, mode); - - g_object_notify (G_OBJECT (filesel), "select-multiple"); - } -} - -/** - * gtk_file_selection_get_select_multiple: - * @filesel: a #GtkFileSelection - * - * Determines whether or not the user is allowed to select multiple files in - * the file list. See gtk_file_selection_set_select_multiple(). - * - * Return value: %TRUE if the user is allowed to select multiple files in the - * file list - **/ -gboolean -gtk_file_selection_get_select_multiple (GtkFileSelection *filesel) -{ - GtkTreeSelection *sel; - - g_return_val_if_fail (GTK_IS_FILE_SELECTION (filesel), FALSE); - - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->file_list)); - return (gtk_tree_selection_get_mode (sel) == GTK_SELECTION_MULTIPLE); -} - -static void -multiple_changed_foreach (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer data) -{ - GPtrArray *names = data; - gchar *filename; - - gtk_tree_model_get (model, iter, FILE_COLUMN, &filename, -1); - - g_ptr_array_add (names, filename); -} - -static void -free_selected_names (GPtrArray *names) -{ - gint i; - - for (i = 0; i < names->len; i++) - g_free (g_ptr_array_index (names, i)); - - g_ptr_array_free (names, TRUE); -} - -static void -gtk_file_selection_file_changed (GtkTreeSelection *selection, - gpointer user_data) -{ - GtkFileSelection *fs = GTK_FILE_SELECTION (user_data); - GPtrArray *new_names; - gchar *filename; - const gchar *entry; - gint index = -1; - - new_names = g_ptr_array_sized_new (8); - - gtk_tree_selection_selected_foreach (selection, - multiple_changed_foreach, - new_names); - - /* nothing selected */ - if (new_names->len == 0) - { - g_ptr_array_free (new_names, TRUE); - - if (fs->selected_names != NULL) - { - free_selected_names (fs->selected_names); - fs->selected_names = NULL; - } - - goto maybe_clear_entry; - } - - if (new_names->len != 1) - { - GPtrArray *old_names = fs->selected_names; - - if (old_names != NULL) - { - /* A common case is selecting a range of files from top to bottom, - * so quickly check for that to avoid looping over the entire list - */ - if (compare_utf8_filenames (g_ptr_array_index (old_names, old_names->len - 1), - g_ptr_array_index (new_names, new_names->len - 1)) != 0) - index = new_names->len - 1; - else - { - gint i = 0, j = 0, cmp; - - /* do a quick diff, stopping at the first file not in the - * old list - */ - while (i < old_names->len && j < new_names->len) - { - cmp = compare_utf8_filenames (g_ptr_array_index (old_names, i), - g_ptr_array_index (new_names, j)); - if (cmp < 0) - { - i++; - } - else if (cmp == 0) - { - i++; - j++; - } - else if (cmp > 0) - { - index = j; - break; - } - } - - /* we ran off the end of the old list */ - if (index == -1 && i < new_names->len) - index = j; - } - } - else - { - /* A phantom anchor still exists at the point where the last item - * was selected, which is used for subsequent range selections. - * So search up from there. - */ - if (fs->last_selected && - compare_utf8_filenames (fs->last_selected, - g_ptr_array_index (new_names, 0)) == 0) - index = new_names->len - 1; - else - index = 0; - } - } - else - index = 0; - - if (fs->selected_names != NULL) - free_selected_names (fs->selected_names); - - fs->selected_names = new_names; - - if (index != -1) - { - g_free (fs->last_selected); - - fs->last_selected = g_strdup (g_ptr_array_index (new_names, index)); - filename = get_real_filename (fs->last_selected, FALSE); - - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); - - if (filename != fs->last_selected) - g_free (filename); - - return; - } - -maybe_clear_entry: - - entry = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); - if ((entry != NULL) && (fs->last_selected != NULL) && - (compare_utf8_filenames (entry, fs->last_selected) == 0)) - gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), ""); -} - -/** - * gtk_file_selection_get_selections: - * @filesel: a #GtkFileSelection - * - * Retrieves the list of file selections the user has made in the dialog box. - * This function is intended for use when the user can select multiple files - * in the file list. - * - * The filenames are in the GLib file name encoding. To convert to - * UTF-8, call g_filename_to_utf8() on each string. - * - * Return value: a newly-allocated %NULL-terminated array of strings. Use - * g_strfreev() to free it. - **/ -gchar ** -gtk_file_selection_get_selections (GtkFileSelection *filesel) -{ - GPtrArray *names; - gchar **selections; - gchar *filename, *dirname; - gchar *current, *buf; - gint i, count; - gboolean unselected_entry; - - g_return_val_if_fail (GTK_IS_FILE_SELECTION (filesel), NULL); - - filename = g_strdup (gtk_file_selection_get_filename (filesel)); - - if (strlen (filename) == 0) - { - g_free (filename); - return NULL; - } - - names = filesel->selected_names; - - if (names != NULL) - selections = g_new (gchar *, names->len + 2); - else - selections = g_new (gchar *, 2); - - count = 0; - unselected_entry = TRUE; - - if (names != NULL) - { - dirname = g_path_get_dirname (filename); - - if ((names->len >= 1) && - (strcmp (gtk_entry_get_text (GTK_ENTRY (filesel->selection_entry)), "") == 0)) - { /* multiple files are selected and last selection was removed via ctrl click */ - g_free (dirname); - dirname = g_strdup (filename); /* as gtk_file_selection_get_filename returns dir - if no file is selected */ - unselected_entry = FALSE; - } - - for (i = 0; i < names->len; i++) - { - buf = g_filename_from_utf8 (g_ptr_array_index (names, i), -1, - NULL, NULL, NULL); - current = g_build_filename (dirname, buf, NULL); - g_free (buf); - - selections[count++] = current; - - if (unselected_entry && compare_sys_filenames (current, filename) == 0) - unselected_entry = FALSE; - } - - g_free (dirname); - } - - if (unselected_entry) - selections[count++] = filename; - else - g_free (filename); - - selections[count] = NULL; - - return selections; -} - -/**********************************************************************/ -/* External Interface */ -/**********************************************************************/ - -/* The four completion state selectors - */ -static gchar* -cmpl_updated_text (CompletionState *cmpl_state) -{ - return cmpl_state->updated_text; -} - -static gboolean -cmpl_updated_dir (CompletionState *cmpl_state) -{ - return cmpl_state->re_complete; -} - -static gchar* -cmpl_reference_position (CompletionState *cmpl_state) -{ - return cmpl_state->reference_dir->fullname; -} - -#if 0 -/* This doesn't work currently and would require changes - * to fnmatch.c to get working. - */ -static gint -cmpl_last_valid_char (CompletionState *cmpl_state) -{ - return cmpl_state->last_valid_char; -} -#endif - -static gchar* -cmpl_completion_fullname (const gchar *text, - CompletionState *cmpl_state) -{ - if (!cmpl_state_okay (cmpl_state)) - { - return g_strdup (""); - } - else if (g_path_is_absolute (text)) - { - return g_strdup (text); - } -#ifdef HAVE_PWD_H - else if (text[0] == '~') - { - CompletionDir* dir; - char* slash; - - dir = open_user_dir (text, cmpl_state); - - if (dir) - { - slash = strchr (text, G_DIR_SEPARATOR); - - /* slash may be NULL, that works too */ - return g_strconcat (dir->fullname, slash, NULL); - } - } -#endif - - return g_build_filename (cmpl_state->reference_dir->fullname, - text, - NULL); -} - -/* The three completion selectors - */ -static gchar* -cmpl_this_completion (PossibleCompletion* pc) -{ - return pc->text; -} - -static gboolean -cmpl_is_directory (PossibleCompletion* pc) -{ - return pc->is_directory; -} - -static gint -cmpl_is_a_completion (PossibleCompletion* pc) -{ - return pc->is_a_completion; -} - -/**********************************************************************/ -/* Construction, deletion */ -/**********************************************************************/ - -/* Get the nearest parent of the current directory for which - * we can convert the filename into UTF-8. With paranoia. - * Returns "." when all goes wrong. - */ -static gchar * -get_current_dir_utf8 (void) -{ - gchar *dir = g_get_current_dir (); - gchar *dir_utf8 = NULL; - - while (TRUE) - { - gchar *last_slash; - - dir_utf8 = g_filename_to_utf8 (dir, -1, NULL, NULL, NULL); - if (dir_utf8) - break; - - last_slash = strrchr (dir, G_DIR_SEPARATOR); - if (!last_slash) /* g_get_current_dir() wasn't absolute! */ - break; - - if (last_slash + 1 == g_path_skip_root (dir)) /* Parent directory is a root directory */ - { - if (last_slash[1] == '\0') /* Root misencoded! */ - break; - else - last_slash[1] = '\0'; - } - else - last_slash[0] = '\0'; - - g_assert (last_slash); - } - - g_free (dir); - - return dir_utf8 ? dir_utf8 : g_strdup ("."); -} - -static CompletionState* -cmpl_init_state (void) -{ - gchar *utf8_cwd; - CompletionState *new_state; - gint tries = 0; - - new_state = g_new (CompletionState, 1); - - utf8_cwd = get_current_dir_utf8 (); - -tryagain: - tries++; - new_state->reference_dir = NULL; - new_state->completion_dir = NULL; - new_state->active_completion_dir = NULL; - new_state->directory_storage = NULL; - new_state->directory_sent_storage = NULL; - new_state->last_valid_char = 0; - new_state->updated_text = g_new (gchar, MAXPATHLEN); - new_state->updated_text_alloc = MAXPATHLEN; - new_state->the_completion.text = g_new (gchar, MAXPATHLEN); - new_state->the_completion.text_alloc = MAXPATHLEN; - new_state->user_dir_name_buffer = NULL; - new_state->user_directories = NULL; - - new_state->reference_dir = open_dir (utf8_cwd, new_state); - - if (!new_state->reference_dir) - { - /* Directories changing from underneath us, grumble */ - strcpy (utf8_cwd, G_DIR_SEPARATOR_S); - if (tries < 2) - goto tryagain; - } - - g_free (utf8_cwd); - return new_state; -} - -static void -cmpl_free_dir_list (GList* dp0) -{ - GList *dp = dp0; - - while (dp) - { - free_dir (dp->data); - dp = dp->next; - } - - g_list_free (dp0); -} - -static void -cmpl_free_dir_sent_list (GList* dp0) -{ - GList *dp = dp0; - - while (dp) - { - free_dir_sent (dp->data); - dp = dp->next; - } - - g_list_free (dp0); -} - -static void -cmpl_free_state (CompletionState* cmpl_state) -{ - g_return_if_fail (cmpl_state != NULL); - - cmpl_free_dir_list (cmpl_state->directory_storage); - cmpl_free_dir_sent_list (cmpl_state->directory_sent_storage); - - g_free (cmpl_state->user_dir_name_buffer); - g_free (cmpl_state->user_directories); - g_free (cmpl_state->the_completion.text); - g_free (cmpl_state->updated_text); - - g_free (cmpl_state); -} - -static void -free_dir (CompletionDir* dir) -{ - g_free (dir->cmpl_text); - g_free (dir->fullname); - g_free (dir); -} - -static void -free_dir_sent (CompletionDirSent* sent) -{ - gint i; - for (i = 0; i < sent->entry_count; i++) - { - g_free (sent->entries[i].entry_name); - g_free (sent->entries[i].sort_key); - } - g_free (sent->entries); - g_free (sent); -} - -static void -prune_memory_usage (CompletionState *cmpl_state) -{ - GList* cdsl = cmpl_state->directory_sent_storage; - GList* cdl = cmpl_state->directory_storage; - GList* cdl0 = cdl; - gint len = 0; - - for (; cdsl && len < CMPL_DIRECTORY_CACHE_SIZE; len += 1) - cdsl = cdsl->next; - - if (cdsl) - { - cmpl_free_dir_sent_list (cdsl->next); - cdsl->next = NULL; - } - - cmpl_state->directory_storage = NULL; - while (cdl) - { - if (cdl->data == cmpl_state->reference_dir) - cmpl_state->directory_storage = g_list_prepend (NULL, cdl->data); - else - free_dir (cdl->data); - cdl = cdl->next; - } - - g_list_free (cdl0); -} - -/**********************************************************************/ -/* The main entrances. */ -/**********************************************************************/ - -static PossibleCompletion* -cmpl_completion_matches (gchar *text_to_complete, - gchar **remaining_text, - CompletionState *cmpl_state) -{ -#ifdef HAVE_PWD_H - gchar* first_slash; -#endif - PossibleCompletion *poss; - - prune_memory_usage (cmpl_state); - - g_assert (text_to_complete != NULL); - - cmpl_state->user_completion_index = -1; - cmpl_state->last_completion_text = text_to_complete; - cmpl_state->the_completion.text[0] = 0; - cmpl_state->last_valid_char = 0; - cmpl_state->updated_text_len = -1; - cmpl_state->updated_text[0] = 0; - cmpl_state->re_complete = FALSE; - -#ifdef HAVE_PWD_H - first_slash = strchr (text_to_complete, G_DIR_SEPARATOR); - - if (text_to_complete[0] == '~' && !first_slash) - { - /* Text starts with ~ and there is no slash, show all the - * home directory completions. - */ - poss = attempt_homedir_completion (text_to_complete, cmpl_state); - - update_cmpl (poss, cmpl_state); - - return poss; - } -#endif - cmpl_state->reference_dir = - open_ref_dir (text_to_complete, remaining_text, cmpl_state); - - if (!cmpl_state->reference_dir) - return NULL; - - cmpl_state->completion_dir = - find_completion_dir (*remaining_text, remaining_text, cmpl_state); - - cmpl_state->last_valid_char = *remaining_text - text_to_complete; - - if (!cmpl_state->completion_dir) - return NULL; - - cmpl_state->completion_dir->cmpl_index = -1; - cmpl_state->completion_dir->cmpl_parent = NULL; - cmpl_state->completion_dir->cmpl_text = g_strdup (*remaining_text); - - cmpl_state->active_completion_dir = cmpl_state->completion_dir; - - cmpl_state->reference_dir = cmpl_state->completion_dir; - - poss = attempt_file_completion (cmpl_state); - - update_cmpl (poss, cmpl_state); - - return poss; -} - -static PossibleCompletion* -cmpl_next_completion (CompletionState* cmpl_state) -{ - PossibleCompletion* poss = NULL; - - cmpl_state->the_completion.text[0] = 0; - -#ifdef HAVE_PWD_H - if (cmpl_state->user_completion_index >= 0) - poss = attempt_homedir_completion (cmpl_state->last_completion_text, cmpl_state); - else - poss = attempt_file_completion (cmpl_state); -#else - poss = attempt_file_completion (cmpl_state); -#endif - - update_cmpl (poss, cmpl_state); - - return poss; -} - -/**********************************************************************/ -/* Directory Operations */ -/**********************************************************************/ - -/* Open the directory where completion will begin from, if possible. */ -static CompletionDir* -open_ref_dir (gchar *text_to_complete, - gchar **remaining_text, - CompletionState *cmpl_state) -{ - gchar* first_slash; - CompletionDir *new_dir; - - first_slash = strchr (text_to_complete, G_DIR_SEPARATOR); - -#ifdef G_WITH_CYGWIN - if (text_to_complete[0] == '/' && text_to_complete[1] == '/') - { - char root_dir[5]; - g_snprintf (root_dir, sizeof (root_dir), "//%c", text_to_complete[2]); - - new_dir = open_dir (root_dir, cmpl_state); - - if (new_dir) { - *remaining_text = text_to_complete + 4; - } - } -#else - if (FALSE) - ; -#endif -#ifdef HAVE_PWD_H - else if (text_to_complete[0] == '~') - { - new_dir = open_user_dir (text_to_complete, cmpl_state); - - if (new_dir) - { - if (first_slash) - *remaining_text = first_slash + 1; - else - *remaining_text = text_to_complete + strlen (text_to_complete); - } - else - { - return NULL; - } - } -#endif - else if (g_path_is_absolute (text_to_complete) || !cmpl_state->reference_dir) - { - gchar *tmp = g_strdup (text_to_complete); - gchar *p; - - p = tmp; - while (*p && *p != '*' && *p != '?') - p++; - - *p = '\0'; - p = strrchr (tmp, G_DIR_SEPARATOR); - if (p) - { - if (p + 1 == g_path_skip_root (tmp)) - p++; - - *p = '\0'; - new_dir = open_dir (tmp, cmpl_state); - - if (new_dir) - *remaining_text = text_to_complete + - ((p == g_path_skip_root (tmp)) ? (p - tmp) : (p + 1 - tmp)); - } - else - { - /* If no possible candidates, use the cwd */ - gchar *utf8_curdir = get_current_dir_utf8 (); - - new_dir = open_dir (utf8_curdir, cmpl_state); - - if (new_dir) - *remaining_text = text_to_complete; - - g_free (utf8_curdir); - } - - g_free (tmp); - } - else - { - *remaining_text = text_to_complete; - - new_dir = open_dir (cmpl_state->reference_dir->fullname, cmpl_state); - } - - if (new_dir) - { - new_dir->cmpl_index = -1; - new_dir->cmpl_parent = NULL; - } - - return new_dir; -} - -#ifdef HAVE_PWD_H - -/* open a directory by user name */ -static CompletionDir* -open_user_dir (const gchar *text_to_complete, - CompletionState *cmpl_state) -{ - CompletionDir *result; - gchar *first_slash; - gint cmp_len; - - g_assert (text_to_complete && text_to_complete[0] == '~'); - - first_slash = strchr (text_to_complete, G_DIR_SEPARATOR); - - if (first_slash) - cmp_len = first_slash - text_to_complete - 1; - else - cmp_len = strlen (text_to_complete + 1); - - if (!cmp_len) - { - /* ~/ */ - const gchar *homedir = g_get_home_dir (); - gchar *utf8_homedir = g_filename_to_utf8 (homedir, -1, NULL, NULL, NULL); - - if (utf8_homedir) - result = open_dir (utf8_homedir, cmpl_state); - else - result = NULL; - - g_free (utf8_homedir); - } - else - { - /* ~user/ */ - gchar* copy = g_new (char, cmp_len + 1); - gchar *utf8_dir; - struct passwd *pwd; - - strncpy (copy, text_to_complete + 1, cmp_len); - copy[cmp_len] = 0; - pwd = getpwnam (copy); - g_free (copy); - if (!pwd) - { - cmpl_errno = errno; - return NULL; - } - utf8_dir = g_filename_to_utf8 (pwd->pw_dir, -1, NULL, NULL, NULL); - result = open_dir (utf8_dir, cmpl_state); - g_free (utf8_dir); - } - return result; -} - -#endif - -/* open a directory relative to the current relative directory */ -static CompletionDir* -open_relative_dir (gchar *dir_name, - CompletionDir *dir, - CompletionState *cmpl_state) -{ - CompletionDir *result; - GString *path; - - path = g_string_sized_new (dir->fullname_len + strlen (dir_name) + 10); - g_string_assign (path, dir->fullname); - - if (dir->fullname_len > 1 - && path->str[dir->fullname_len - 1] != G_DIR_SEPARATOR) - g_string_append_c (path, G_DIR_SEPARATOR); - g_string_append (path, dir_name); - - result = open_dir (path->str, cmpl_state); - - g_string_free (path, TRUE); - - return result; -} - -/* after the cache lookup fails, really open a new directory */ -static CompletionDirSent* -open_new_dir (gchar *dir_name, - struct stat *sbuf, - gboolean stat_subdirs) -{ - CompletionDirSent *sent; - GDir *directory; - const char *dirent; - GError *error = NULL; - gint entry_count = 0; - gint n_entries = 0; - gint i; - struct stat ent_sbuf; - GString *path; - gchar *sys_dir_name; - - sent = g_new (CompletionDirSent, 1); -#ifndef G_PLATFORM_WIN32 - sent->mtime = sbuf->st_mtime; - sent->inode = sbuf->st_ino; - sent->device = sbuf->st_dev; -#endif - path = g_string_sized_new (2*MAXPATHLEN + 10); - - sys_dir_name = g_filename_from_utf8 (dir_name, -1, NULL, NULL, NULL); - if (!sys_dir_name) - { - cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; - g_free (sent); - return NULL; - } - - directory = g_dir_open (sys_dir_name, 0, &error); - if (!directory) - { - cmpl_errno = error->code; /* ??? */ - g_free (sys_dir_name); - g_free (sent); - return NULL; - } - - while ((dirent = g_dir_read_name (directory)) != NULL) - entry_count++; - entry_count += 2; /* For ".",".." */ - - sent->entries = g_new (CompletionDirEntry, entry_count); - sent->entry_count = entry_count; - - g_dir_rewind (directory); - - for (i = 0; i < entry_count; i += 1) - { - GError *error = NULL; - - if (i == 0) - dirent = "."; - else if (i == 1) - dirent = ".."; - else - { - dirent = g_dir_read_name (directory); - if (!dirent) /* Directory changed */ - break; - } - - sent->entries[n_entries].entry_name = g_filename_to_utf8 (dirent, -1, NULL, NULL, &error); - if (sent->entries[n_entries].entry_name == NULL - || !g_utf8_validate (sent->entries[n_entries].entry_name, -1, NULL)) - { - gchar *escaped_str = g_strescape (dirent, NULL); - g_message (_("The filename \"%s\" couldn't be converted to UTF-8. " - "(try setting the environment variable G_FILENAME_ENCODING): %s"), - escaped_str, - error->message ? error->message : _("Invalid UTF-8")); - g_free (escaped_str); - g_clear_error (&error); - continue; - } - g_clear_error (&error); - - sent->entries[n_entries].sort_key = g_utf8_collate_key (sent->entries[n_entries].entry_name, -1); - - g_string_assign (path, sys_dir_name); - if (path->str[path->len-1] != G_DIR_SEPARATOR) - { - g_string_append_c (path, G_DIR_SEPARATOR); - } - g_string_append (path, dirent); - - if (stat_subdirs) - { - /* Here we know path->str is a "system charset" string */ - if (g_stat (path->str, &ent_sbuf) >= 0 && S_ISDIR (ent_sbuf.st_mode)) - sent->entries[n_entries].is_dir = TRUE; - else - /* stat may fail, and we don't mind, since it could be a - * dangling symlink. */ - sent->entries[n_entries].is_dir = FALSE; - } - else - sent->entries[n_entries].is_dir = 1; - - n_entries++; - } - sent->entry_count = n_entries; - - g_free (sys_dir_name); - g_string_free (path, TRUE); - qsort (sent->entries, sent->entry_count, sizeof (CompletionDirEntry), compare_cmpl_dir); - - g_dir_close (directory); - - return sent; -} - -#ifndef G_PLATFORM_WIN32 - -static gboolean -check_dir (gchar *dir_name, - struct stat *result, - gboolean *stat_subdirs) -{ - /* A list of directories that we know only contain other directories. - * Trying to stat every file in these directories would be very - * expensive. - */ - - static struct { - const gchar name[5]; - gboolean present; - struct stat statbuf; - } no_stat_dirs[] = { - { "/afs", FALSE, { 0 } }, - { "/net", FALSE, { 0 } } - }; - - static const gint n_no_stat_dirs = G_N_ELEMENTS (no_stat_dirs); - static gboolean initialized = FALSE; - gchar *sys_dir_name; - gint i; - - if (!initialized) - { - initialized = TRUE; - for (i = 0; i < n_no_stat_dirs; i++) - { - if (g_stat (no_stat_dirs[i].name, &no_stat_dirs[i].statbuf) == 0) - no_stat_dirs[i].present = TRUE; - } - } - - sys_dir_name = g_filename_from_utf8 (dir_name, -1, NULL, NULL, NULL); - if (!sys_dir_name) - { - cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; - return FALSE; - } - - if (g_stat (sys_dir_name, result) < 0) - { - g_free (sys_dir_name); - cmpl_errno = errno; - return FALSE; - } - g_free (sys_dir_name); - - *stat_subdirs = TRUE; - for (i = 0; i < n_no_stat_dirs; i++) - { - if (no_stat_dirs[i].present && - (no_stat_dirs[i].statbuf.st_dev == result->st_dev) && - (no_stat_dirs[i].statbuf.st_ino == result->st_ino)) - { - *stat_subdirs = FALSE; - break; - } - } - - return TRUE; -} - -#endif - -/* open a directory by absolute pathname */ -static CompletionDir* -open_dir (gchar *dir_name, - CompletionState *cmpl_state) -{ -#ifndef G_PLATFORM_WIN32 - struct stat sbuf; - gboolean stat_subdirs; - GList* cdsl; -#endif - CompletionDirSent *sent; - -#ifndef G_PLATFORM_WIN32 - if (!check_dir (dir_name, &sbuf, &stat_subdirs)) - return NULL; - - cdsl = cmpl_state->directory_sent_storage; - - while (cdsl) - { - sent = cdsl->data; - - if (sent->inode == sbuf.st_ino && - sent->mtime == sbuf.st_mtime && - sent->device == sbuf.st_dev) - return attach_dir (sent, dir_name, cmpl_state); - - cdsl = cdsl->next; - } - - sent = open_new_dir (dir_name, &sbuf, stat_subdirs); -#else - sent = open_new_dir (dir_name, NULL, TRUE); -#endif - - if (sent) - { - cmpl_state->directory_sent_storage = - g_list_prepend (cmpl_state->directory_sent_storage, sent); - - return attach_dir (sent, dir_name, cmpl_state); - } - - return NULL; -} - -static CompletionDir* -attach_dir (CompletionDirSent *sent, - gchar *dir_name, - CompletionState *cmpl_state) -{ - CompletionDir* new_dir; - - new_dir = g_new (CompletionDir, 1); - - cmpl_state->directory_storage = - g_list_prepend (cmpl_state->directory_storage, new_dir); - - new_dir->sent = sent; - new_dir->fullname = g_strdup (dir_name); - new_dir->fullname_len = strlen (dir_name); - new_dir->cmpl_text = NULL; - - return new_dir; -} - -static gint -correct_dir_fullname (CompletionDir* cmpl_dir) -{ - gint length = strlen (cmpl_dir->fullname); - gchar *first_slash = strchr (cmpl_dir->fullname, G_DIR_SEPARATOR); - gchar *sys_filename; - struct stat sbuf; - - /* Does it end with /. (\.) ? */ - if (length >= 2 && - strcmp (cmpl_dir->fullname + length - 2, G_DIR_SEPARATOR_S ".") == 0) - { - /* Is it just the root directory (on a drive) ? */ - if (cmpl_dir->fullname + length - 2 == first_slash) - { - cmpl_dir->fullname[length - 1] = 0; - cmpl_dir->fullname_len = length - 1; - return TRUE; - } - else - { - cmpl_dir->fullname[length - 2] = 0; - } - } - - /* Ends with /./ (\.\)? */ - else if (length >= 3 && - strcmp (cmpl_dir->fullname + length - 3, - G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S) == 0) - cmpl_dir->fullname[length - 2] = 0; - - /* Ends with /.. (\..) ? */ - else if (length >= 3 && - strcmp (cmpl_dir->fullname + length - 3, - G_DIR_SEPARATOR_S "..") == 0) - { - /* Is it just /.. (X:\..)? */ - if (cmpl_dir->fullname + length - 3 == first_slash) - { - cmpl_dir->fullname[length - 2] = 0; - cmpl_dir->fullname_len = length - 2; - return TRUE; - } - - sys_filename = g_filename_from_utf8 (cmpl_dir->fullname, -1, NULL, NULL, NULL); - if (!sys_filename) - { - cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; - return FALSE; - } - - if (g_stat (sys_filename, &sbuf) < 0) - { - g_free (sys_filename); - cmpl_errno = errno; - return FALSE; - } - g_free (sys_filename); - - cmpl_dir->fullname[length - 3] = 0; - - if (!correct_parent (cmpl_dir, &sbuf)) - return FALSE; - } - - /* Ends with /../ (\..\)? */ - else if (length >= 4 && - strcmp (cmpl_dir->fullname + length - 4, - G_DIR_SEPARATOR_S ".." G_DIR_SEPARATOR_S) == 0) - { - /* Is it just /../ (X:\..\)? */ - if (cmpl_dir->fullname + length - 4 == first_slash) - { - cmpl_dir->fullname[length - 3] = 0; - cmpl_dir->fullname_len = length - 3; - return TRUE; - } - - sys_filename = g_filename_from_utf8 (cmpl_dir->fullname, -1, NULL, NULL, NULL); - if (!sys_filename) - { - cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; - return FALSE; - } - - if (g_stat (sys_filename, &sbuf) < 0) - { - g_free (sys_filename); - cmpl_errno = errno; - return FALSE; - } - g_free (sys_filename); - - cmpl_dir->fullname[length - 4] = 0; - - if (!correct_parent (cmpl_dir, &sbuf)) - return FALSE; - } - - cmpl_dir->fullname_len = strlen (cmpl_dir->fullname); - - return TRUE; -} - -static gint -correct_parent (CompletionDir *cmpl_dir, - struct stat *sbuf) -{ - struct stat parbuf; - gchar *last_slash; - gchar *first_slash; -#ifndef G_PLATFORM_WIN32 - gchar *new_name; -#endif - gchar *sys_filename; - gchar c = 0; - - last_slash = strrchr (cmpl_dir->fullname, G_DIR_SEPARATOR); - g_assert (last_slash); - first_slash = strchr (cmpl_dir->fullname, G_DIR_SEPARATOR); - - /* Clever (?) way to check for top-level directory that works also on - * Win32, where there is a drive letter and colon prefixed... - */ - if (last_slash != first_slash) - { - last_slash[0] = 0; - } - else - { - c = last_slash[1]; - last_slash[1] = 0; - } - - sys_filename = g_filename_from_utf8 (cmpl_dir->fullname, -1, NULL, NULL, NULL); - if (!sys_filename) - { - cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; - if (!c) - last_slash[0] = G_DIR_SEPARATOR; - return FALSE; - } - - if (g_stat (sys_filename, &parbuf) < 0) - { - g_free (sys_filename); - cmpl_errno = errno; - if (!c) - last_slash[0] = G_DIR_SEPARATOR; - return FALSE; - } - g_free (sys_filename); - -#ifndef G_PLATFORM_WIN32 /* No inode numbers on Win32 */ - if (parbuf.st_ino == sbuf->st_ino && parbuf.st_dev == sbuf->st_dev) - /* it wasn't a link */ - return TRUE; - - if (c) - last_slash[1] = c; - else - last_slash[0] = G_DIR_SEPARATOR; - - /* it was a link, have to figure it out the hard way */ - - new_name = find_parent_dir_fullname (cmpl_dir->fullname); - - if (!new_name) - return FALSE; - - g_free (cmpl_dir->fullname); - - cmpl_dir->fullname = new_name; -#endif - - return TRUE; -} - -#ifndef G_PLATFORM_WIN32 - -static gchar* -find_parent_dir_fullname (gchar* dirname) -{ - gchar *sys_orig_dir; - gchar *result; - gchar *sys_cwd; - gchar *sys_dirname; - - sys_orig_dir = g_get_current_dir (); - sys_dirname = g_filename_from_utf8 (dirname, -1, NULL, NULL, NULL); - if (!sys_dirname) - { - g_free (sys_orig_dir); - cmpl_errno = CMPL_ERRNO_DID_NOT_CONVERT; - return NULL; - } - - if (chdir (sys_dirname) != 0 || chdir ("..") != 0) - { - int ignored; - - cmpl_errno = errno; - ignored = g_chdir (sys_orig_dir); - g_free (sys_dirname); - g_free (sys_orig_dir); - return NULL; - } - g_free (sys_dirname); - - sys_cwd = g_get_current_dir (); - result = g_filename_to_utf8 (sys_cwd, -1, NULL, NULL, NULL); - g_free (sys_cwd); - - if (chdir (sys_orig_dir) != 0) - { - cmpl_errno = errno; - g_free (sys_orig_dir); - return NULL; - } - - g_free (sys_orig_dir); - return result; -} - -#endif - -/**********************************************************************/ -/* Completion Operations */ -/**********************************************************************/ - -#ifdef HAVE_PWD_H - -static PossibleCompletion* -attempt_homedir_completion (gchar *text_to_complete, - CompletionState *cmpl_state) -{ - gint index; - - if (!cmpl_state->user_dir_name_buffer && - !get_pwdb (cmpl_state)) - return NULL; - - cmpl_state->user_completion_index += 1; - - while (cmpl_state->user_completion_index < cmpl_state->user_directories_len) - { - index = first_diff_index (text_to_complete + 1, - cmpl_state->user_directories - [cmpl_state->user_completion_index].login); - - switch (index) - { - case PATTERN_MATCH: - break; - default: - if (cmpl_state->last_valid_char < (index + 1)) - cmpl_state->last_valid_char = index + 1; - cmpl_state->user_completion_index += 1; - continue; - } - - cmpl_state->the_completion.is_a_completion = 1; - cmpl_state->the_completion.is_directory = TRUE; - - append_completion_text ("~", cmpl_state); - - append_completion_text (cmpl_state-> - user_directories[cmpl_state->user_completion_index].login, - cmpl_state); - - return append_completion_text (G_DIR_SEPARATOR_S, cmpl_state); - } - - if (text_to_complete[1] - || cmpl_state->user_completion_index > cmpl_state->user_directories_len) - { - cmpl_state->user_completion_index = -1; - return NULL; - } - else - { - cmpl_state->user_completion_index += 1; - cmpl_state->the_completion.is_a_completion = 1; - cmpl_state->the_completion.is_directory = TRUE; - - return append_completion_text ("~" G_DIR_SEPARATOR_S, cmpl_state); - } -} - -#endif - -#ifdef G_PLATFORM_WIN32 -/* FIXME: determine whether we should casefold all Unicode letters - * here, too (and in in first_diff_index() walk through the strings with - * g_utf8_next_char()), or if this folding isn't actually needed at - * all. - */ -#define FOLD(c) (tolower(c)) -#else -#define FOLD(c) (c) -#endif - -/* returns the index (>= 0) of the first differing character, - * PATTERN_MATCH if the completion matches */ -static gint -first_diff_index (gchar *pat, - gchar *text) -{ - gint diff = 0; - - while (*pat && *text && FOLD (*text) == FOLD (*pat)) - { - pat += 1; - text += 1; - diff += 1; - } - - if (*pat) - return diff; - - return PATTERN_MATCH; -} - -static PossibleCompletion* -append_completion_text (gchar *text, - CompletionState *cmpl_state) -{ - gint len, i = 1; - - if (!cmpl_state->the_completion.text) - return NULL; - - len = strlen (text) + strlen (cmpl_state->the_completion.text) + 1; - - if (cmpl_state->the_completion.text_alloc > len) - { - strcat (cmpl_state->the_completion.text, text); - return &cmpl_state->the_completion; - } - - while (i < len) - i <<= 1; - - cmpl_state->the_completion.text_alloc = i; - - cmpl_state->the_completion.text = (gchar*) g_realloc (cmpl_state->the_completion.text, i); - - if (!cmpl_state->the_completion.text) - return NULL; - else - { - strcat (cmpl_state->the_completion.text, text); - return &cmpl_state->the_completion; - } -} - -static CompletionDir* -find_completion_dir (gchar *text_to_complete, - gchar **remaining_text, - CompletionState *cmpl_state) -{ - gchar* first_slash = strchr (text_to_complete, G_DIR_SEPARATOR); - CompletionDir* dir = cmpl_state->reference_dir; - CompletionDir* next; - *remaining_text = text_to_complete; - - while (first_slash) - { - gint len = first_slash - *remaining_text; - gint found = 0; - gchar *found_name = NULL; /* Quiet gcc */ - gint i; - gchar* pat_buf = g_new (gchar, len + 1); - - strncpy (pat_buf, *remaining_text, len); - pat_buf[len] = 0; - - for (i = 0; i < dir->sent->entry_count; i += 1) - { - if (dir->sent->entries[i].is_dir && - _gtk_fnmatch (pat_buf, dir->sent->entries[i].entry_name, TRUE)) - { - if (found) - { - g_free (pat_buf); - return dir; - } - else - { - found = 1; - found_name = dir->sent->entries[i].entry_name; - } - } - } - - if (!found) - { - /* Perhaps we are trying to open an automount directory */ - found_name = pat_buf; - } - - next = open_relative_dir (found_name, dir, cmpl_state); - - if (!next) - { - g_free (pat_buf); - return NULL; -} - - next->cmpl_parent = dir; - - dir = next; - - if (!correct_dir_fullname (dir)) - { - g_free (pat_buf); - return NULL; - } - - *remaining_text = first_slash + 1; - first_slash = strchr (*remaining_text, G_DIR_SEPARATOR); - - g_free (pat_buf); - } - - return dir; -} - -static void -update_cmpl (PossibleCompletion *poss, - CompletionState *cmpl_state) -{ - gint cmpl_len; - - if (!poss || !cmpl_is_a_completion (poss)) - return; - - cmpl_len = strlen (cmpl_this_completion (poss)); - - if (cmpl_state->updated_text_alloc < cmpl_len + 1) - { - cmpl_state->updated_text_alloc = 2*cmpl_len; - cmpl_state->updated_text = - (gchar*)g_realloc (cmpl_state->updated_text, - cmpl_state->updated_text_alloc); - } - - if (cmpl_state->updated_text_len < 0) - { - strcpy (cmpl_state->updated_text, cmpl_this_completion (poss)); - cmpl_state->updated_text_len = cmpl_len; - cmpl_state->re_complete = cmpl_is_directory (poss); - } - else if (cmpl_state->updated_text_len == 0) - { - cmpl_state->re_complete = FALSE; - } - else - { - gint first_diff = - first_diff_index (cmpl_state->updated_text, - cmpl_this_completion (poss)); - - cmpl_state->re_complete = FALSE; - - if (first_diff == PATTERN_MATCH) - return; - - if (first_diff > cmpl_state->updated_text_len) - strcpy (cmpl_state->updated_text, cmpl_this_completion (poss)); - - cmpl_state->updated_text_len = first_diff; - cmpl_state->updated_text[first_diff] = 0; - } -} - -static PossibleCompletion* -attempt_file_completion (CompletionState *cmpl_state) -{ - gchar *pat_buf, *first_slash; - CompletionDir *dir = cmpl_state->active_completion_dir; - - dir->cmpl_index += 1; - - if (dir->cmpl_index == dir->sent->entry_count) - { - if (dir->cmpl_parent == NULL) - { - cmpl_state->active_completion_dir = NULL; - - return NULL; - } - else - { - cmpl_state->active_completion_dir = dir->cmpl_parent; - - return attempt_file_completion (cmpl_state); - } - } - - g_assert (dir->cmpl_text); - - first_slash = strchr (dir->cmpl_text, G_DIR_SEPARATOR); - - if (first_slash) - { - gint len = first_slash - dir->cmpl_text; - - pat_buf = g_new (gchar, len + 1); - strncpy (pat_buf, dir->cmpl_text, len); - pat_buf[len] = 0; - } - else - { - gint len = strlen (dir->cmpl_text); - - pat_buf = g_new (gchar, len + 2); - strcpy (pat_buf, dir->cmpl_text); - /* Don't append a * if the user entered one herself. - * This way one can complete *.h and don't get matches - * on any .help files, for instance. - */ - if (strchr (pat_buf, '*') == NULL) - strcpy (pat_buf + len, "*"); - } - - if (first_slash) - { - if (dir->sent->entries[dir->cmpl_index].is_dir) - { - if (_gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name, TRUE)) - { - CompletionDir* new_dir; - - new_dir = open_relative_dir (dir->sent->entries[dir->cmpl_index].entry_name, - dir, cmpl_state); - - if (!new_dir) - { - g_free (pat_buf); - return NULL; - } - - new_dir->cmpl_parent = dir; - - new_dir->cmpl_index = -1; - new_dir->cmpl_text = g_strdup (first_slash + 1); - - cmpl_state->active_completion_dir = new_dir; - - g_free (pat_buf); - return attempt_file_completion (cmpl_state); - } - else - { - g_free (pat_buf); - return attempt_file_completion (cmpl_state); - } - } - else - { - g_free (pat_buf); - return attempt_file_completion (cmpl_state); - } - } - else - { - if (dir->cmpl_parent != NULL) - { - append_completion_text (dir->fullname + - strlen (cmpl_state->completion_dir->fullname) + 1, - cmpl_state); - append_completion_text (G_DIR_SEPARATOR_S, cmpl_state); - } - - append_completion_text (dir->sent->entries[dir->cmpl_index].entry_name, cmpl_state); - - cmpl_state->the_completion.is_a_completion = - _gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name, TRUE); - - cmpl_state->the_completion.is_directory = dir->sent->entries[dir->cmpl_index].is_dir; - if (dir->sent->entries[dir->cmpl_index].is_dir) - append_completion_text (G_DIR_SEPARATOR_S, cmpl_state); - - g_free (pat_buf); - return &cmpl_state->the_completion; - } -} - -#ifdef HAVE_PWD_H - -static gint -get_pwdb (CompletionState* cmpl_state) -{ - struct passwd *pwd_ptr; - gchar* buf_ptr; - gchar *utf8; - gint len = 0, i, count = 0; - - if (cmpl_state->user_dir_name_buffer) - return TRUE; - setpwent (); - - while ((pwd_ptr = getpwent ()) != NULL) - { - utf8 = g_filename_to_utf8 (pwd_ptr->pw_name, -1, NULL, NULL, NULL); - len += strlen (utf8); - g_free (utf8); - utf8 = g_filename_to_utf8 (pwd_ptr->pw_dir, -1, NULL, NULL, NULL); - len += strlen (utf8); - g_free (utf8); - len += 2; - count += 1; - } - - setpwent (); - - cmpl_state->user_dir_name_buffer = g_new (gchar, len); - cmpl_state->user_directories = g_new (CompletionUserDir, count); - cmpl_state->user_directories_len = count; - - buf_ptr = cmpl_state->user_dir_name_buffer; - - for (i = 0; i < count; i += 1) - { - pwd_ptr = getpwent (); - if (!pwd_ptr) - { - cmpl_errno = errno; - goto error; - } - - utf8 = g_filename_to_utf8 (pwd_ptr->pw_name, -1, NULL, NULL, NULL); - strcpy (buf_ptr, utf8); - g_free (utf8); - - cmpl_state->user_directories[i].login = buf_ptr; - - buf_ptr += strlen (buf_ptr); - buf_ptr += 1; - - utf8 = g_filename_to_utf8 (pwd_ptr->pw_dir, -1, NULL, NULL, NULL); - strcpy (buf_ptr, utf8); - g_free (utf8); - - cmpl_state->user_directories[i].homedir = buf_ptr; - - buf_ptr += strlen (buf_ptr); - buf_ptr += 1; - } - - qsort (cmpl_state->user_directories, - cmpl_state->user_directories_len, - sizeof (CompletionUserDir), - compare_user_dir); - - endpwent (); - - return TRUE; - -error: - - g_free (cmpl_state->user_dir_name_buffer); - g_free (cmpl_state->user_directories); - - cmpl_state->user_dir_name_buffer = NULL; - cmpl_state->user_directories = NULL; - - return FALSE; -} - -static gint -compare_user_dir (const void *a, - const void *b) -{ - return strcmp ((((CompletionUserDir*)a))->login, - (((CompletionUserDir*)b))->login); -} - -#endif - -static gint -compare_cmpl_dir (const void *a, - const void *b) -{ - - return strcmp (((CompletionDirEntry*)a)->sort_key, - (((CompletionDirEntry*)b))->sort_key); -} - -static gint -cmpl_state_okay (CompletionState* cmpl_state) -{ - return cmpl_state && cmpl_state->reference_dir; -} - -static const gchar* -cmpl_strerror (gint err) -{ - if (err == CMPL_ERRNO_TOO_LONG) - return _("Name too long"); - else if (err == CMPL_ERRNO_DID_NOT_CONVERT) - return _("Couldn't convert filename"); - else - return g_strerror (err); -} - -#if defined (G_OS_WIN32) && !defined (_WIN64) - -/* DLL ABI stability backward compatibility versions */ - -#undef gtk_file_selection_get_filename - -G_CONST_RETURN gchar* -gtk_file_selection_get_filename (GtkFileSelection *filesel) -{ - static gchar retval[MAXPATHLEN*2+1]; - gchar *tem; - - tem = g_locale_from_utf8 (gtk_file_selection_get_filename_utf8 (filesel), - -1, NULL, NULL, NULL); - - strncpy (retval, tem, sizeof (retval) - 1); - retval[sizeof (retval) - 1] = '\0'; - g_free (tem); - - return retval; -} - -#undef gtk_file_selection_set_filename - -void -gtk_file_selection_set_filename (GtkFileSelection *filesel, - const gchar *filename) -{ - gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL); - gtk_file_selection_set_filename_utf8 (filesel, utf8_filename); - g_free (utf8_filename); -} - -#undef gtk_file_selection_get_selections - -gchar ** -gtk_file_selection_get_selections (GtkFileSelection *filesel) -{ - int i = 0; - gchar **selections = gtk_file_selection_get_selections_utf8 (filesel); - - if (selections != NULL) - while (selections[i] != NULL) - { - gchar *tem = selections[i]; - selections[i] = g_locale_from_utf8 (selections[i], - -1, NULL, NULL, NULL); - g_free (tem); - i++; - } - - return selections; -} - -#endif /* G_OS_WIN32 && !_WIN64 */ - -#define __GTK_FILESEL_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkfilesel.h b/gtk/gtkfilesel.h deleted file mode 100644 index 8823566872..0000000000 --- a/gtk/gtkfilesel.h +++ /dev/null @@ -1,125 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_FILESEL_H__ -#define __GTK_FILESEL_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - - -#define GTK_TYPE_FILE_SELECTION (gtk_file_selection_get_type ()) -#define GTK_FILE_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_SELECTION, GtkFileSelection)) -#define GTK_FILE_SELECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_SELECTION, GtkFileSelectionClass)) -#define GTK_IS_FILE_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_SELECTION)) -#define GTK_IS_FILE_SELECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FILE_SELECTION)) -#define GTK_FILE_SELECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_SELECTION, GtkFileSelectionClass)) - - -typedef struct _GtkFileSelection GtkFileSelection; -typedef struct _GtkFileSelectionClass GtkFileSelectionClass; - -struct _GtkFileSelection -{ - /*< private >*/ - GtkDialog parent_instance; - - /*< public >*/ - GtkWidget *dir_list; - GtkWidget *file_list; - GtkWidget *selection_entry; - GtkWidget *selection_text; - GtkWidget *main_vbox; - GtkWidget *ok_button; - GtkWidget *cancel_button; - GtkWidget *help_button; - GtkWidget *history_pulldown; - GtkWidget *history_menu; - GList *history_list; - GtkWidget *fileop_dialog; - GtkWidget *fileop_entry; - gchar *fileop_file; - gpointer cmpl_state; - - GtkWidget *fileop_c_dir; - GtkWidget *fileop_del_file; - GtkWidget *fileop_ren_file; - - GtkWidget *button_area; - GtkWidget *action_area; - - /*< private >*/ - GPtrArray *selected_names; - gchar *last_selected; -}; - -struct _GtkFileSelectionClass -{ - GtkDialogClass parent_class; - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - - -#ifdef G_OS_WIN32 -/* Reserve old names for DLL ABI backward compatibility */ -#define gtk_file_selection_get_filename gtk_file_selection_get_filename_utf8 -#define gtk_file_selection_set_filename gtk_file_selection_set_filename_utf8 -#define gtk_file_selection_get_selections gtk_file_selection_get_selections_utf8 -#endif - -GType gtk_file_selection_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_file_selection_new (const gchar *title); -void gtk_file_selection_set_filename (GtkFileSelection *filesel, - const gchar *filename); -G_CONST_RETURN gchar* gtk_file_selection_get_filename (GtkFileSelection *filesel); - -void gtk_file_selection_complete (GtkFileSelection *filesel, - const gchar *pattern); -void gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel); -void gtk_file_selection_hide_fileop_buttons (GtkFileSelection *filesel); - -gchar** gtk_file_selection_get_selections (GtkFileSelection *filesel); - -void gtk_file_selection_set_select_multiple (GtkFileSelection *filesel, - gboolean select_multiple); -gboolean gtk_file_selection_get_select_multiple (GtkFileSelection *filesel); - - -G_END_DECLS - - -#endif /* __GTK_FILESEL_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkfixed.c b/gtk/gtkfixed.c index 3106e1f000..9a0d67f0ee 100644 --- a/gtk/gtkfixed.c +++ b/gtk/gtkfixed.c @@ -453,53 +453,5 @@ gtk_fixed_forall (GtkContainer *container, } } -/** - * gtk_fixed_set_has_window: - * @fixed: a #GtkFixed - * @has_window: %TRUE if a separate window should be created - * - * Sets whether a #GtkFixed widget is created with a separate - * #GdkWindow for @widget->window or not. (By default, it will be - * created with no separate #GdkWindow). This function must be called - * while the #GtkFixed is not realized, for instance, immediately after the - * window is created. - * - * This function was added to provide an easy migration path for - * older applications which may expect #GtkFixed to have a separate window. - * - * Deprecated: 2.20: Use gtk_widget_set_has_window() instead. - **/ -void -gtk_fixed_set_has_window (GtkFixed *fixed, - gboolean has_window) -{ - g_return_if_fail (GTK_IS_FIXED (fixed)); - g_return_if_fail (!gtk_widget_get_realized (GTK_WIDGET (fixed))); - - if (has_window != gtk_widget_get_has_window (GTK_WIDGET (fixed))) - { - gtk_widget_set_has_window (GTK_WIDGET (fixed), has_window); - } -} - -/** - * gtk_fixed_get_has_window: - * @fixed: a #GtkWidget - * - * Gets whether the #GtkFixed has its own #GdkWindow. - * See gtk_fixed_set_has_window(). - * - * Return value: %TRUE if @fixed has its own window. - * - * Deprecated: 2.20: Use gtk_widget_get_has_window() instead. - **/ -gboolean -gtk_fixed_get_has_window (GtkFixed *fixed) -{ - g_return_val_if_fail (GTK_IS_FIXED (fixed), FALSE); - - return gtk_widget_get_has_window (GTK_WIDGET (fixed)); -} - #define __GTK_FIXED_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkfixed.h b/gtk/gtkfixed.h index 6480a2d188..7f2fa96003 100644 --- a/gtk/gtkfixed.h +++ b/gtk/gtkfixed.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -79,11 +79,7 @@ void gtk_fixed_move (GtkFixed *fixed, GtkWidget *widget, gint x, gint y); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_fixed_set_has_window (GtkFixed *fixed, - gboolean has_window); -gboolean gtk_fixed_get_has_window (GtkFixed *fixed); -#endif + G_END_DECLS diff --git a/gtk/gtkfontbutton.h b/gtk/gtkfontbutton.h index 134097096c..813e639ef7 100644 --- a/gtk/gtkfontbutton.h +++ b/gtk/gtkfontbutton.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkfontsel.c b/gtk/gtkfontsel.c index 3eb3d45c33..e22a87f96b 100644 --- a/gtk/gtkfontsel.c +++ b/gtk/gtkfontsel.c @@ -1340,24 +1340,6 @@ gtk_font_selection_get_size (GtkFontSelection *fontsel) } /** - * gtk_font_selection_get_font: - * @fontsel: a #GtkFontSelection - * - * Gets the currently-selected font. - * - * Return value: A #GdkFont. - * - * Deprecated: 2.0: Use gtk_font_selection_get_font_name() instead. - */ -GdkFont * -gtk_font_selection_get_font (GtkFontSelection *fontsel) -{ - g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL); - - return gtk_font_selection_get_font_internal (fontsel); -} - -/** * gtk_font_selection_get_font_name: * @fontsel: a #GtkFontSelection * @@ -1693,26 +1675,6 @@ gtk_font_selection_dialog_get_ok_button (GtkFontSelectionDialog *fsd) } /** - * gtk_font_selection_dialog_get_apply_button: - * @fsd: a #GtkFontSelectionDialog - * - * Obtains a button. The button doesn't have any function. - * - * Return value: a #GtkWidget - * - * Since: 2.14 - * - * Deprecated: 2.16: Don't use this function. - */ -GtkWidget * -gtk_font_selection_dialog_get_apply_button (GtkFontSelectionDialog *fsd) -{ - g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL); - - return fsd->apply_button; -} - -/** * gtk_font_selection_dialog_get_cancel_button: * @fsd: a #GtkFontSelectionDialog * @@ -1779,25 +1741,6 @@ gtk_font_selection_dialog_get_font_name (GtkFontSelectionDialog *fsd) } /** - * gtk_font_selection_dialog_get_font: - * @fsd: a #GtkFontSelectionDialog - * - * Gets the currently-selected font. - * - * Return value: the #GdkFont from the #GtkFontSelection for the - * currently selected font in the dialog, or %NULL if no font is selected - * - * Deprecated: 2.0: Use gtk_font_selection_dialog_get_font_name() instead. - */ -GdkFont* -gtk_font_selection_dialog_get_font (GtkFontSelectionDialog *fsd) -{ - g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL); - - return gtk_font_selection_get_font_internal (GTK_FONT_SELECTION (fsd->fontsel)); -} - -/** * gtk_font_selection_dialog_set_font_name: * @fsd: a #GtkFontSelectionDialog * @fontname: a font name like "Helvetica 12" or "Times Bold 18" diff --git a/gtk/gtkfontsel.h b/gtk/gtkfontsel.h index 6cf97359d1..5b1b2ceb63 100644 --- a/gtk/gtkfontsel.h +++ b/gtk/gtkfontsel.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -156,10 +156,6 @@ PangoFontFace * gint gtk_font_selection_get_size (GtkFontSelection *fontsel); gchar* gtk_font_selection_get_font_name (GtkFontSelection *fontsel); -#ifndef GTK_DISABLE_DEPRECATED -GdkFont* gtk_font_selection_get_font (GtkFontSelection *fontsel); -#endif /* GTK_DISABLE_DEPRECATED */ - gboolean gtk_font_selection_set_font_name (GtkFontSelection *fontsel, const gchar *fontname); const gchar* gtk_font_selection_get_preview_text (GtkFontSelection *fontsel); @@ -176,9 +172,6 @@ GType gtk_font_selection_dialog_get_type (void) G_GNUC_CONST; GtkWidget *gtk_font_selection_dialog_new (const gchar *title); GtkWidget *gtk_font_selection_dialog_get_ok_button (GtkFontSelectionDialog *fsd); -#ifndef GTK_DISABLE_DEPRECATED -GtkWidget *gtk_font_selection_dialog_get_apply_button (GtkFontSelectionDialog *fsd); -#endif GtkWidget *gtk_font_selection_dialog_get_cancel_button (GtkFontSelectionDialog *fsd); /* This returns the X Logical Font Description fontname, or NULL if no font @@ -188,13 +181,6 @@ GtkWidget *gtk_font_selection_dialog_get_cancel_button (GtkFontSelectionDialog * You should g_free() the returned font name after you're done with it. */ gchar* gtk_font_selection_dialog_get_font_name (GtkFontSelectionDialog *fsd); -#ifndef GTK_DISABLE_DEPRECATED -/* This will return the current GdkFont, or NULL if none is selected or there - was a problem loading it. Remember to use gdk_font_ref/unref() if you want - to use the font (in a style, for example). */ -GdkFont* gtk_font_selection_dialog_get_font (GtkFontSelectionDialog *fsd); -#endif /* GTK_DISABLE_DEPRECATED */ - /* This sets the currently displayed font. It should be a valid X Logical Font Description font name (anything else will be ignored), e.g. "-adobe-courier-bold-o-normal--25-*-*-*-*-*-*-*" diff --git a/gtk/gtkframe.h b/gtk/gtkframe.h index 2b1e926cde..393f355c72 100644 --- a/gtk/gtkframe.h +++ b/gtk/gtkframe.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkgamma.c b/gtk/gtkgamma.c deleted file mode 100644 index 79e4d1c06b..0000000000 --- a/gtk/gtkgamma.c +++ /dev/null @@ -1,494 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1997 David Mosberger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#include <gdk-pixbuf/gdk-pixdata.h> - -#include "gtkgamma.h" -#include "gtkcurve.h" -#include "gtkdialog.h" -#include "gtkdrawingarea.h" -#include "gtkentry.h" -#include "gtkhbox.h" -#include "gtkimage.h" -#include "gtklabel.h" -#include "gtkmain.h" -#include "gtkradiobutton.h" -#include "gtkstock.h" -#include "gtktable.h" -#include "gtkvbox.h" -#include "gtkwindow.h" -#include "gtkintl.h" -#include "gtkalias.h" - -/* forward declarations: */ -static void gtk_gamma_curve_destroy (GtkObject *object); - -static void curve_type_changed_callback (GtkWidget *w, gpointer data); -static void button_realize_callback (GtkWidget *w); -static void button_toggled_callback (GtkWidget *w, gpointer data); -static void button_clicked_callback (GtkWidget *w, gpointer data); - -enum - { - LINEAR = 0, - SPLINE, - FREE, - GAMMA, - RESET, - NUM_XPMS - }; - -/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ - -#ifdef __SUNPRO_C -#pragma align 4 (spline_pixdata) -#endif -#ifdef __GNUC__ -static const guint8 spline_pixdata[] __attribute__ ((__aligned__ (4))) = -#else -static const guint8 spline_pixdata[] = -#endif -{ "" - /* Pixbuf magic (0x47646b50) */ - "GdkP" - /* length: header (24) + pixel_data (182) */ - "\0\0\0\316" - /* pixdata_type (0x2010002) */ - "\2\1\0\2" - /* rowstride (64) */ - "\0\0\0@" - /* width (16) */ - "\0\0\0\20" - /* height (16) */ - "\0\0\0\20" - /* pixel_data: */ - "\216\0\0\0\0\202\0\0\0\377\211\0\0\0\0\206\377\0\0\377\1\0\0\0\377\207" - "\0\0\0\0\202\377\0\0\377\214\0\0\0\0\2\0\0\0\377\274--\377\215\0\0\0" - "\0\203\0\0\0\377\215\0\0\0\0\2\274--\377\0\0\0\377\216\0\0\0\0\1\377" - "\0\0\377\216\0\0\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377\216\0\0" - "\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377" - "\217\0\0\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377\216\0\0\0\0\2\0" - "\0\0\377\274--\377\216\0\0\0\0\202\0\0\0\377\216\0\0\0\0"}; - - -/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ - -#ifdef __SUNPRO_C -#pragma align 4 (linear_pixdata) -#endif -#ifdef __GNUC__ -static const guint8 linear_pixdata[] __attribute__ ((__aligned__ (4))) = -#else -static const guint8 linear_pixdata[] = -#endif -{ "" - /* Pixbuf magic (0x47646b50) */ - "GdkP" - /* length: header (24) + pixel_data (323) */ - "\0\0\1[" - /* pixdata_type (0x2010002) */ - "\2\1\0\2" - /* rowstride (64) */ - "\0\0\0@" - /* width (16) */ - "\0\0\0\20" - /* height (16) */ - "\0\0\0\20" - /* pixel_data: */ - "\216\0\0\0\0\202\0\0\0\377\216\0\0\0\0\2\202AA\377\0\0\0\377\216\0\0" - "\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377" - "\206\0\0\0\0\3\177\177\177\377\0\0\0\377\177\177\177\377\205\0\0\0\0" - "\1\377\0\0\377\207\0\0\0\0\203\0\0\0\377\205\0\0\0\0\1\377\0\0\377\207" - "\0\0\0\0\3\202AA\377\0\0\0\377\202AA\377\204\0\0\0\0\1\377\0\0\377\210" - "\0\0\0\0\3\377\0\0\377\0\0\0\0\377\0\0\377\204\0\0\0\0\1\377\0\0\377" - "\207\0\0\0\0\1\377\0\0\377\203\0\0\0\0\1\377\0\0\377\202\0\0\0\0\1\377" - "\0\0\377\210\0\0\0\0\1\377\0\0\377\203\0\0\0\0\1\377\0\0\377\202\0\0" - "\0\0\1\377\0\0\377\207\0\0\0\0\1\377\0\0\377\205\0\0\0\0\3\377\0\0\377" - "\0\0\0\377\202AA\377\207\0\0\0\0\1\377\0\0\377\205\0\0\0\0\203\0\0\0" - "\377\206\0\0\0\0\1\377\0\0\377\206\0\0\0\0\3\177\177\177\377\0\0\0\377" - "\177\177\177\377\205\0\0\0\0\2\0\0\0\377\202AA\377\216\0\0\0\0\202\0" - "\0\0\377\216\0\0\0\0"}; - - -/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ - -#ifdef __SUNPRO_C -#pragma align 4 (free_pixdata) -#endif -#ifdef __GNUC__ -static const guint8 free_pixdata[] __attribute__ ((__aligned__ (4))) = -#else -static const guint8 free_pixdata[] = -#endif -{ "" - /* Pixbuf magic (0x47646b50) */ - "GdkP" - /* length: header (24) + pixel_data (204) */ - "\0\0\0\344" - /* pixdata_type (0x2010002) */ - "\2\1\0\2" - /* rowstride (64) */ - "\0\0\0@" - /* width (16) */ - "\0\0\0\20" - /* height (16) */ - "\0\0\0\20" - /* pixel_data: */ - "\246\0\0\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377\220\0\0\0\0\1\377" - "\0\0\377\217\0\0\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377\220\0\0" - "\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377\217\0\0\0\0\1\377\0\0\377" - "\214\0\0\0\0\1\377\0\0\377\203\0\0\0\0\2\377\0\0\377\0\0\0\0\205\377" - "\0\0\377\204\0\0\0\0\1\377\0\0\377\204\0\0\0\0\1\377\0\0\377\211\0\0" - "\0\0\1\377\0\0\377\205\0\0\0\0\1\377\0\0\377\210\0\0\0\0\1\377\0\0\377" - "\207\0\0\0\0\1\377\0\0\377\206\0\0\0\0\1\377\0\0\377\210\0\0\0\0\1\377" - "\0\0\377\205\0\0\0\0\1\377\0\0\377\217\0\0\0\0"}; - - -/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ - -#ifdef __SUNPRO_C -#pragma align 4 (gamma_pixdata) -#endif -#ifdef __GNUC__ -static const guint8 gamma_pixdata[] __attribute__ ((__aligned__ (4))) = -#else -static const guint8 gamma_pixdata[] = -#endif -{ "" - /* Pixbuf magic (0x47646b50) */ - "GdkP" - /* length: header (24) + pixel_data (218) */ - "\0\0\0\362" - /* pixdata_type (0x2010002) */ - "\2\1\0\2" - /* rowstride (64) */ - "\0\0\0@" - /* width (16) */ - "\0\0\0\20" - /* height (16) */ - "\0\0\0\20" - /* pixel_data: */ - "\264\0\0\0\0\2\0\0\0\377^^^\377\202\0\0\0\0\3\214\214\214\377\0\0\0\377" - "\214\214\214\377\211\0\0\0\0\7FFF\377\27\27\27\377\273\273\273\377\0" - "\0\0\0uuu\377\27\27\27\377\244\244\244\377\212\0\0\0\0\3uuu\377\214\214" - "\214\377\0\0\0\0\202FFF\377\214\0\0\0\0\4\0\0\0\377\0\0\0\0\0\0\0\377" - "\214\214\214\377\214\0\0\0\0\3FFF\377\0\0\0\0FFF\377\215\0\0\0\0\3FF" - "F\377\27\27\27\377\214\214\214\377\215\0\0\0\0\2\244\244\244\377\0\0" - "\0\377\216\0\0\0\0\2uuu\377^^^\377\216\0\0\0\0\2///\377\0\0\0\377\216" - "\0\0\0\0\202\0\0\0\377\216\0\0\0\0\2\0\0\0\377///\377\250\0\0\0\0"}; - - -/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ - -#ifdef __SUNPRO_C -#pragma align 4 (reset_pixdata) -#endif -#ifdef __GNUC__ -static const guint8 reset_pixdata[] __attribute__ ((__aligned__ (4))) = -#else -static const guint8 reset_pixdata[] = -#endif -{ "" - /* Pixbuf magic (0x47646b50) */ - "GdkP" - /* length: header (24) + pixel_data (173) */ - "\0\0\0\305" - /* pixdata_type (0x2010002) */ - "\2\1\0\2" - /* rowstride (64) */ - "\0\0\0@" - /* width (16) */ - "\0\0\0\20" - /* height (16) */ - "\0\0\0\20" - /* pixel_data: */ - "\216\0\0\0\0\202\0\0\0\377\216\0\0\0\0\2\202AA\377\0\0\0\377\215\0\0" - "\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377" - "\216\0\0\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377\216\0\0\0\0\1\377" - "\0\0\377\216\0\0\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377\216\0\0" - "\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377\216\0\0\0\0\1\377\0\0\377" - "\216\0\0\0\0\1\377\0\0\377\215\0\0\0\0\2\0\0\0\377\202AA\377\216\0\0" - "\0\0\202\0\0\0\377\216\0\0\0\0"}; - -G_DEFINE_TYPE (GtkGammaCurve, gtk_gamma_curve, GTK_TYPE_VBOX) - -static void -gtk_gamma_curve_class_init (GtkGammaCurveClass *class) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass *) class; - object_class->destroy = gtk_gamma_curve_destroy; -} - -static void -gtk_gamma_curve_init (GtkGammaCurve *curve) -{ - GtkWidget *vbox; - int i; - - curve->gamma = 1.0; - - curve->table = gtk_table_new (1, 2, FALSE); - gtk_table_set_col_spacings (GTK_TABLE (curve->table), 3); - gtk_container_add (GTK_CONTAINER (curve), curve->table); - - curve->curve = gtk_curve_new (); - g_signal_connect (curve->curve, "curve-type-changed", - G_CALLBACK (curve_type_changed_callback), curve); - gtk_table_attach_defaults (GTK_TABLE (curve->table), curve->curve, 0, 1, 0, 1); - - vbox = gtk_vbox_new (/* homogeneous */ FALSE, /* spacing */ 3); - gtk_table_attach (GTK_TABLE (curve->table), vbox, 1, 2, 0, 1, 0, 0, 0, 0); - - /* toggle buttons: */ - for (i = 0; i < 3; ++i) - { - curve->button[i] = gtk_toggle_button_new (); - g_object_set_data (G_OBJECT (curve->button[i]), I_("_GtkGammaCurveIndex"), - GINT_TO_POINTER (i)); - gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]); - g_signal_connect (curve->button[i], "realize", - G_CALLBACK (button_realize_callback), NULL); - g_signal_connect (curve->button[i], "toggled", - G_CALLBACK (button_toggled_callback), curve); - gtk_widget_show (curve->button[i]); - } - - /* push buttons: */ - for (i = 3; i < 5; ++i) - { - curve->button[i] = gtk_button_new (); - g_object_set_data (G_OBJECT (curve->button[i]), I_("_GtkGammaCurveIndex"), - GINT_TO_POINTER (i)); - gtk_container_add (GTK_CONTAINER (vbox), curve->button[i]); - g_signal_connect (curve->button[i], "realize", - G_CALLBACK (button_realize_callback), NULL); - g_signal_connect (curve->button[i], "clicked", - G_CALLBACK (button_clicked_callback), curve); - gtk_widget_show (curve->button[i]); - } - - gtk_widget_show (vbox); - gtk_widget_show (curve->table); - gtk_widget_show (curve->curve); -} - -static void -button_realize_callback (GtkWidget *w) -{ - GtkWidget *image; - struct { - const guint8 *stream; - gint length; - } streams[5] = { - { linear_pixdata, sizeof (linear_pixdata) }, - { spline_pixdata, sizeof (spline_pixdata) }, - { free_pixdata, sizeof (free_pixdata) }, - { gamma_pixdata, sizeof (gamma_pixdata) }, - { reset_pixdata, sizeof (reset_pixdata) } - }; - GdkPixdata pixdata; - GdkPixbuf *pixbuf; - int i; - - i = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex")); - gdk_pixdata_deserialize (&pixdata, streams[i].length, streams[i].stream, NULL); - pixbuf = gdk_pixbuf_from_pixdata (&pixdata, TRUE, NULL); - image = gtk_image_new_from_pixbuf (pixbuf); - gtk_container_add (GTK_CONTAINER (w), image); - gtk_widget_show (image); - - g_object_unref (pixbuf); -} - -static void -button_toggled_callback (GtkWidget *w, gpointer data) -{ - GtkGammaCurve *c = data; - GtkCurveType type; - int active, i; - - if (!GTK_TOGGLE_BUTTON (w)->active) - return; - - active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex")); - - for (i = 0; i < 3; ++i) - if ((i != active) && GTK_TOGGLE_BUTTON (c->button[i])->active) - break; - - if (i < 3) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[i]), FALSE); - - switch (active) - { - case 0: type = GTK_CURVE_TYPE_SPLINE; break; - case 1: type = GTK_CURVE_TYPE_LINEAR; break; - default: type = GTK_CURVE_TYPE_FREE; break; - } - gtk_curve_set_curve_type (GTK_CURVE (c->curve), type); -} - -static void -gamma_cancel_callback (GtkWidget *w, gpointer data) -{ - GtkGammaCurve *c = data; - - gtk_widget_destroy (c->gamma_dialog); -} - -static void -gamma_ok_callback (GtkWidget *w, gpointer data) -{ - GtkGammaCurve *c = data; - const gchar *start; - gchar *end; - gfloat v; - - start = gtk_entry_get_text (GTK_ENTRY (c->gamma_text)); - if (start) - { - v = g_strtod (start, &end); - if (end > start && v > 0.0) - c->gamma = v; - } - gtk_curve_set_gamma (GTK_CURVE (c->curve), c->gamma); - gamma_cancel_callback (w, data); -} - -static void -button_clicked_callback (GtkWidget *w, gpointer data) -{ - GtkGammaCurve *c = data; - int active; - - active = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "_GtkGammaCurveIndex")); - if (active == 3) - { - /* set gamma */ - if (c->gamma_dialog) - return; - else - { - GtkWidget *vbox, *hbox, *label, *button; - gchar buf[64]; - - c->gamma_dialog = gtk_dialog_new (); - gtk_window_set_screen (GTK_WINDOW (c->gamma_dialog), - gtk_widget_get_screen (w)); - gtk_window_set_title (GTK_WINDOW (c->gamma_dialog), _("Gamma")); - g_object_add_weak_pointer (G_OBJECT (c->gamma_dialog), - (gpointer *)&c->gamma_dialog); - - vbox = GTK_DIALOG (c->gamma_dialog)->vbox; - - hbox = gtk_hbox_new (/* homogeneous */ FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2); - gtk_widget_show (hbox); - - label = gtk_label_new_with_mnemonic (_("_Gamma value")); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 2); - gtk_widget_show (label); - - sprintf (buf, "%g", c->gamma); - c->gamma_text = gtk_entry_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), c->gamma_text); - gtk_entry_set_text (GTK_ENTRY (c->gamma_text), buf); - gtk_box_pack_start (GTK_BOX (hbox), c->gamma_text, TRUE, TRUE, 2); - gtk_widget_show (c->gamma_text); - - /* fill in action area: */ - hbox = GTK_DIALOG (c->gamma_dialog)->action_area; - - button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); - g_signal_connect (button, "clicked", - G_CALLBACK (gamma_cancel_callback), c); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_show (button); - - button = gtk_button_new_from_stock (GTK_STOCK_OK); - gtk_widget_set_can_default (button, TRUE); - g_signal_connect (button, "clicked", - G_CALLBACK (gamma_ok_callback), c); - gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); - gtk_widget_grab_default (button); - gtk_widget_show (button); - - gtk_widget_show (c->gamma_dialog); - } - } - else - { - /* reset */ - gtk_curve_reset (GTK_CURVE (c->curve)); - } -} - -static void -curve_type_changed_callback (GtkWidget *w, gpointer data) -{ - GtkGammaCurve *c = data; - GtkCurveType new_type; - int active; - - new_type = GTK_CURVE (w)->curve_type; - switch (new_type) - { - case GTK_CURVE_TYPE_SPLINE: active = 0; break; - case GTK_CURVE_TYPE_LINEAR: active = 1; break; - default: active = 2; break; - } - if (!GTK_TOGGLE_BUTTON (c->button[active])->active) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (c->button[active]), TRUE); -} - -GtkWidget* -gtk_gamma_curve_new (void) -{ - return g_object_new (GTK_TYPE_GAMMA_CURVE, NULL); -} - -static void -gtk_gamma_curve_destroy (GtkObject *object) -{ - GtkGammaCurve *c = GTK_GAMMA_CURVE (object); - - if (c->gamma_dialog) - gtk_widget_destroy (c->gamma_dialog); - - GTK_OBJECT_CLASS (gtk_gamma_curve_parent_class)->destroy (object); -} - -#define __GTK_GAMMA_CURVE_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkgamma.h b/gtk/gtkgamma.h deleted file mode 100644 index 0173f960ac..0000000000 --- a/gtk/gtkgamma.h +++ /dev/null @@ -1,82 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1997 David Mosberger - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_GAMMA_CURVE_H__ -#define __GTK_GAMMA_CURVE_H__ - - -#include <gtk/gtkvbox.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_GAMMA_CURVE (gtk_gamma_curve_get_type ()) -#define GTK_GAMMA_CURVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_GAMMA_CURVE, GtkGammaCurve)) -#define GTK_GAMMA_CURVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_GAMMA_CURVE, GtkGammaCurveClass)) -#define GTK_IS_GAMMA_CURVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_GAMMA_CURVE)) -#define GTK_IS_GAMMA_CURVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_GAMMA_CURVE)) -#define GTK_GAMMA_CURVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_GAMMA_CURVE, GtkGammaCurveClass)) - -typedef struct _GtkGammaCurve GtkGammaCurve; -typedef struct _GtkGammaCurveClass GtkGammaCurveClass; - - -struct _GtkGammaCurve -{ - GtkVBox vbox; - - GtkWidget *GSEAL (table); - GtkWidget *GSEAL (curve); - GtkWidget *GSEAL (button[5]); /* spline, linear, free, gamma, reset */ - - gfloat GSEAL (gamma); - GtkWidget *GSEAL (gamma_dialog); - GtkWidget *GSEAL (gamma_text); -}; - -struct _GtkGammaCurveClass -{ - GtkVBoxClass parent_class; - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - - -GType gtk_gamma_curve_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_gamma_curve_new (void); - - -G_END_DECLS - -#endif /* __GTK_GAMMA_CURVE_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkgc.h b/gtk/gtkgc.h index 5fcb1a2cf0..8395bbafbf 100644 --- a/gtk/gtkgc.h +++ b/gtk/gtkgc.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhandlebox.h b/gtk/gtkhandlebox.h index 47fb39053d..b914e962d7 100644 --- a/gtk/gtkhandlebox.h +++ b/gtk/gtkhandlebox.h @@ -29,7 +29,7 @@ * their parents. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhbbox.c b/gtk/gtkhbbox.c index 50131d1ea1..55b0b15098 100644 --- a/gtk/gtkhbbox.c +++ b/gtk/gtkhbbox.c @@ -30,8 +30,6 @@ #include "gtkintl.h" #include "gtkalias.h" - -static gint default_spacing = 30; static gint default_layout_style = GTK_BUTTONBOX_EDGE; G_DEFINE_TYPE (GtkHButtonBox, gtk_hbutton_box, GTK_TYPE_BUTTON_BOX) @@ -54,44 +52,6 @@ gtk_hbutton_box_new (void) return g_object_new (GTK_TYPE_HBUTTON_BOX, NULL); } - -/* set default value for spacing */ - -void -gtk_hbutton_box_set_spacing_default (gint spacing) -{ - default_spacing = spacing; -} - - -/* set default value for layout style */ - -void -gtk_hbutton_box_set_layout_default (GtkButtonBoxStyle layout) -{ - g_return_if_fail (layout >= GTK_BUTTONBOX_DEFAULT_STYLE && - layout <= GTK_BUTTONBOX_CENTER); - - default_layout_style = layout; -} - -/* get default value for spacing */ - -gint -gtk_hbutton_box_get_spacing_default (void) -{ - return default_spacing; -} - - -/* get default value for layout style */ - -GtkButtonBoxStyle -gtk_hbutton_box_get_layout_default (void) -{ - return default_layout_style; -} - GtkButtonBoxStyle _gtk_hbutton_box_get_layout_default (void) { diff --git a/gtk/gtkhbbox.h b/gtk/gtkhbbox.h index 25eecba106..f0aec6e8dd 100644 --- a/gtk/gtkhbbox.h +++ b/gtk/gtkhbbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -64,14 +64,6 @@ GtkWidget* gtk_hbutton_box_new (void); /* buttons can be added by gtk_container_add() */ -#ifndef GTK_DISABLE_DEPRECATED -gint gtk_hbutton_box_get_spacing_default (void); -GtkButtonBoxStyle gtk_hbutton_box_get_layout_default (void); - -void gtk_hbutton_box_set_spacing_default (gint spacing); -void gtk_hbutton_box_set_layout_default (GtkButtonBoxStyle layout); -#endif - /* private API */ GtkButtonBoxStyle _gtk_hbutton_box_get_layout_default (void); diff --git a/gtk/gtkhbox.h b/gtk/gtkhbox.h index 02b74acbe9..e04c7314cf 100644 --- a/gtk/gtkhbox.h +++ b/gtk/gtkhbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhpaned.h b/gtk/gtkhpaned.h index 560ea2e3e6..3a526b5cb1 100644 --- a/gtk/gtkhpaned.h +++ b/gtk/gtkhpaned.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhruler.h b/gtk/gtkhruler.h index 3c30917cef..d2c876e3f4 100644 --- a/gtk/gtkhruler.h +++ b/gtk/gtkhruler.h @@ -34,7 +34,7 @@ * distribution. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhscale.h b/gtk/gtkhscale.h index 6b13a09c4c..9ecfd699fb 100644 --- a/gtk/gtkhscale.h +++ b/gtk/gtkhscale.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhscrollbar.h b/gtk/gtkhscrollbar.h index f3300a7ccb..2246c74dc5 100644 --- a/gtk/gtkhscrollbar.h +++ b/gtk/gtkhscrollbar.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkhseparator.h b/gtk/gtkhseparator.h index a4d9f11725..4cda938477 100644 --- a/gtk/gtkhseparator.h +++ b/gtk/gtkhseparator.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkiconfactory.h b/gtk/gtkiconfactory.h index 574b101d08..d7a1bf8787 100644 --- a/gtk/gtkiconfactory.h +++ b/gtk/gtkiconfactory.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h index f8609cbc0b..aa1fa51685 100644 --- a/gtk/gtkicontheme.h +++ b/gtk/gtkicontheme.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkiconview.h b/gtk/gtkiconview.h index 7b9e51d227..10e17897d8 100644 --- a/gtk/gtkiconview.h +++ b/gtk/gtkiconview.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index 87e0b08245..9edae99a16 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -1526,46 +1526,6 @@ gtk_image_new (void) return g_object_new (GTK_TYPE_IMAGE, NULL); } -/** - * gtk_image_set: - * @image: a #GtkImage - * @val: a #GdkImage - * @mask: a #GdkBitmap that indicates which parts of the image should be transparent. - * - * Sets the #GtkImage. - * - * Deprecated: 2.0: Use gtk_image_set_from_image() instead. - */ -void -gtk_image_set (GtkImage *image, - GdkImage *val, - GdkBitmap *mask) -{ - g_return_if_fail (GTK_IS_IMAGE (image)); - - gtk_image_set_from_image (image, val, mask); -} - -/** - * gtk_image_get: - * @image: a #GtkImage - * @val: return location for a #GdkImage - * @mask: a #GdkBitmap that indicates which parts of the image should be transparent. - * - * Gets the #GtkImage. - * - * Deprecated: 2.0: Use gtk_image_get_image() instead. - */ -void -gtk_image_get (GtkImage *image, - GdkImage **val, - GdkBitmap **mask) -{ - g_return_if_fail (GTK_IS_IMAGE (image)); - - gtk_image_get_image (image, val, mask); -} - static void gtk_image_reset_anim_iter (GtkImage *image) { diff --git a/gtk/gtkimage.h b/gtk/gtkimage.h index dd6153c44c..13da499888 100644 --- a/gtk/gtkimage.h +++ b/gtk/gtkimage.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -258,17 +258,6 @@ void gtk_image_get_gicon (GtkImage *image, GtkIconSize *size); gint gtk_image_get_pixel_size (GtkImage *image); -#ifndef GTK_DISABLE_DEPRECATED -/* These three are deprecated */ - -void gtk_image_set (GtkImage *image, - GdkImage *val, - GdkBitmap *mask); -void gtk_image_get (GtkImage *image, - GdkImage **val, - GdkBitmap **mask); -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_IMAGE_H__ */ diff --git a/gtk/gtkimagemenuitem.h b/gtk/gtkimagemenuitem.h index b82bdfd319..7d50ea44b6 100644 --- a/gtk/gtkimagemenuitem.h +++ b/gtk/gtkimagemenuitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkimcontext.h b/gtk/gtkimcontext.h index a0f26471a5..21452f2cce 100644 --- a/gtk/gtkimcontext.h +++ b/gtk/gtkimcontext.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkimcontextsimple.h b/gtk/gtkimcontextsimple.h index 2c44db25a3..8017c314f8 100644 --- a/gtk/gtkimcontextsimple.h +++ b/gtk/gtkimcontextsimple.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkimmulticontext.h b/gtk/gtkimmulticontext.h index 951ddae266..418a9327f7 100644 --- a/gtk/gtkimmulticontext.h +++ b/gtk/gtkimmulticontext.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkinputdialog.c b/gtk/gtkinputdialog.c deleted file mode 100644 index c91467b6ae..0000000000 --- a/gtk/gtkinputdialog.c +++ /dev/null @@ -1,764 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * gtkinputdialog.c - * - * Copyright 1997 Owen Taylor <owt1@cornell.edu> - * - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <stdlib.h> - -#include "gdk/gdkkeysyms.h" - -#undef GTK_DISABLE_DEPRECATED /* GtkOptionMenu */ - -#include "gtkinputdialog.h" -#include "gtkbutton.h" -#include "gtkentry.h" -#include "gtkhbox.h" -#include "gtklabel.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtkmenu.h" -#include "gtkmenuitem.h" -#include "gtknotebook.h" -#include "gtkoptionmenu.h" -#include "gtkscrolledwindow.h" -#include "gtkstock.h" -#include "gtktable.h" -#include "gtkvbox.h" - -#include "gtkintl.h" -#include "gtkalias.h" - -typedef struct _GtkInputDialogPrivate GtkInputDialogPrivate; -typedef struct _GtkInputKeyInfo GtkInputKeyInfo; - -struct _GtkInputDialogPrivate -{ - GtkWidget *device_menu; - GtkWidget *device_optionmenu; - GtkWidget *no_devices_label; - GtkWidget *main_vbox; -}; - -struct _GtkInputKeyInfo -{ - gint index; - GtkWidget *entry; - GtkInputDialog *inputd; -}; - -enum -{ - ENABLE_DEVICE, - DISABLE_DEVICE, - LAST_SIGNAL -}; - - -#define AXIS_LIST_WIDTH 160 -#define AXIS_LIST_HEIGHT 175 - -#define KEYS_LIST_WIDTH 200 -#define KEYS_LIST_HEIGHT 175 - -/* Forward declarations */ - -static void gtk_input_dialog_screen_changed (GtkWidget *widget, - GdkScreen *previous_screen); -static void gtk_input_dialog_set_device (GtkWidget *widget, - gpointer data); -static void gtk_input_dialog_set_mapping_mode (GtkWidget *w, - gpointer data); -static void gtk_input_dialog_set_axis (GtkWidget *widget, - gpointer data); -static void gtk_input_dialog_fill_axes (GtkInputDialog *inputd, - GdkDevice *info); -static void gtk_input_dialog_set_key (GtkInputKeyInfo *key, - guint keyval, - GdkModifierType modifiers); -static gboolean gtk_input_dialog_key_press (GtkWidget *widget, - GdkEventKey *event, - GtkInputKeyInfo *key); -static void gtk_input_dialog_clear_key (GtkWidget *widget, - GtkInputKeyInfo *key); -static void gtk_input_dialog_destroy_key (GtkWidget *widget, - GtkInputKeyInfo *key); -static void gtk_input_dialog_fill_keys (GtkInputDialog *inputd, - GdkDevice *info); - -static guint input_dialog_signals[LAST_SIGNAL] = { 0 }; - -G_DEFINE_TYPE (GtkInputDialog, gtk_input_dialog, GTK_TYPE_DIALOG) - -static GtkInputDialogPrivate * -gtk_input_dialog_get_private (GtkInputDialog *input_dialog) -{ - return G_TYPE_INSTANCE_GET_PRIVATE (input_dialog, - GTK_TYPE_INPUT_DIALOG, - GtkInputDialogPrivate); -} - -static GtkInputDialog * -input_dialog_from_widget (GtkWidget *widget) -{ - GtkWidget *toplevel; - - if (GTK_IS_MENU_ITEM (widget)) - { - GtkMenu *menu = GTK_MENU (widget->parent); - widget = gtk_menu_get_attach_widget (menu); - } - - toplevel = gtk_widget_get_toplevel (widget); - return GTK_INPUT_DIALOG (toplevel); -} - -static void -gtk_input_dialog_class_init (GtkInputDialogClass *klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; - - widget_class->screen_changed = gtk_input_dialog_screen_changed; - - klass->enable_device = NULL; - klass->disable_device = NULL; - - input_dialog_signals[ENABLE_DEVICE] = - g_signal_new (I_("enable-device"), - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkInputDialogClass, enable_device), - NULL, NULL, - _gtk_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - GDK_TYPE_DEVICE); - - input_dialog_signals[DISABLE_DEVICE] = - g_signal_new (I_("disable-device"), - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkInputDialogClass, disable_device), - NULL, NULL, - _gtk_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - GDK_TYPE_DEVICE); - - g_type_class_add_private (object_class, sizeof (GtkInputDialogPrivate)); -} - -static void -gtk_input_dialog_init (GtkInputDialog *inputd) -{ - GtkInputDialogPrivate *private = gtk_input_dialog_get_private (inputd); - GtkDialog *dialog = GTK_DIALOG (inputd); - GtkWidget *util_box; - GtkWidget *label; - GtkWidget *mapping_menu; - GtkWidget *menuitem; - GtkWidget *notebook; - - gtk_widget_push_composite_child (); - - gtk_window_set_title (GTK_WINDOW (inputd), _("Input")); - - gtk_dialog_set_has_separator (dialog, FALSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); - gtk_box_set_spacing (GTK_BOX (dialog->vbox), 2); /* 2 * 5 + 2 = 12 */ - gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 5); - gtk_box_set_spacing (GTK_BOX (dialog->action_area), 6); - - /* main vbox */ - - private->main_vbox = gtk_vbox_new (FALSE, 12); - gtk_container_set_border_width (GTK_CONTAINER (private->main_vbox), 5); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (inputd)->vbox), private->main_vbox, - TRUE, TRUE, 0); - - private->no_devices_label = gtk_label_new (_("No extended input devices")); - gtk_container_set_border_width (GTK_CONTAINER (private->main_vbox), 5); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (inputd)->vbox), - private->no_devices_label, - TRUE, TRUE, 0); - - /* menu for selecting device */ - - private->device_menu = gtk_menu_new (); - - util_box = gtk_hbox_new (FALSE, 12); - gtk_box_pack_start (GTK_BOX (private->main_vbox), util_box, FALSE, FALSE, 0); - - label = gtk_label_new_with_mnemonic (_("_Device:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 0); - - private->device_optionmenu = gtk_option_menu_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), private->device_optionmenu); - gtk_box_pack_start (GTK_BOX (util_box), private->device_optionmenu, TRUE, TRUE, 0); - gtk_widget_show (private->device_optionmenu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (private->device_optionmenu), private->device_menu); - - gtk_widget_show (label); - - /* Device options */ - - /* mapping mode option menu */ - - mapping_menu = gtk_menu_new (); - - menuitem = gtk_menu_item_new_with_label(_("Disabled")); - gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); - gtk_widget_show (menuitem); - g_signal_connect (menuitem, "activate", - G_CALLBACK (gtk_input_dialog_set_mapping_mode), - GINT_TO_POINTER (GDK_MODE_DISABLED)); - - menuitem = gtk_menu_item_new_with_label(_("Screen")); - gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); - gtk_widget_show (menuitem); - g_signal_connect (menuitem, "activate", - G_CALLBACK (gtk_input_dialog_set_mapping_mode), - GINT_TO_POINTER (GDK_MODE_SCREEN)); - - menuitem = gtk_menu_item_new_with_label(_("Window")); - gtk_menu_shell_append (GTK_MENU_SHELL (mapping_menu), menuitem); - gtk_widget_show (menuitem); - g_signal_connect (menuitem, "activate", - G_CALLBACK (gtk_input_dialog_set_mapping_mode), - GINT_TO_POINTER (GDK_MODE_WINDOW)); - - label = gtk_label_new_with_mnemonic (_("_Mode:")); - gtk_box_pack_start (GTK_BOX (util_box), label, FALSE, FALSE, 0); - - inputd->mode_optionmenu = gtk_option_menu_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), inputd->mode_optionmenu); - gtk_box_pack_start (GTK_BOX (util_box), inputd->mode_optionmenu, FALSE, FALSE, 0); - gtk_widget_show (inputd->mode_optionmenu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (inputd->mode_optionmenu), mapping_menu); - - gtk_widget_show(label); - - gtk_widget_show (util_box); - - /* Notebook */ - - notebook = gtk_notebook_new (); - gtk_box_pack_start (GTK_BOX (private->main_vbox), notebook, TRUE, TRUE, 0); - gtk_widget_show (notebook); - - /* The axis listbox */ - - label = gtk_label_new (_("Axes")); - - inputd->axis_listbox = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (inputd->axis_listbox), 12); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(inputd->axis_listbox), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_widget_set_size_request (inputd->axis_listbox, - AXIS_LIST_WIDTH, AXIS_LIST_HEIGHT); - gtk_notebook_append_page (GTK_NOTEBOOK(notebook), - inputd->axis_listbox, label); - - gtk_widget_show (inputd->axis_listbox); - - inputd->axis_list = NULL; - - /* Keys listbox */ - - label = gtk_label_new (_("Keys")); - - inputd->keys_listbox = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (inputd->keys_listbox), 12); - gtk_widget_set_size_request (inputd->keys_listbox, - KEYS_LIST_WIDTH, KEYS_LIST_HEIGHT); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (inputd->keys_listbox), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_notebook_append_page (GTK_NOTEBOOK (notebook), - inputd->keys_listbox, label); - - gtk_widget_show (inputd->keys_listbox); - - inputd->keys_list = NULL; - - inputd->save_button = gtk_button_new_from_stock (GTK_STOCK_SAVE); - gtk_widget_set_can_default (inputd->save_button, TRUE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG(inputd)->action_area), - inputd->save_button, TRUE, TRUE, 0); - gtk_widget_show (inputd->save_button); - - inputd->close_button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); - gtk_widget_set_can_default (inputd->close_button, TRUE); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG(inputd)->action_area), - inputd->close_button, TRUE, TRUE, 0); - - gtk_widget_show (inputd->close_button); - gtk_widget_grab_default (inputd->close_button); - - gtk_widget_pop_composite_child (); - - gtk_input_dialog_screen_changed (GTK_WIDGET (inputd), NULL); - - _gtk_dialog_set_ignore_separator (dialog, TRUE); -} - -static void -gtk_input_dialog_screen_changed (GtkWidget *widget, - GdkScreen *previous_screen) -{ - GtkInputDialog *inputd = GTK_INPUT_DIALOG (widget); - GtkInputDialogPrivate *private = gtk_input_dialog_get_private (inputd); - - GList *device_info = NULL; - GdkDevice *core_pointer = NULL; - GList *tmp_list; - - if (gtk_widget_has_screen (widget)) - { - GdkDisplay *display; - - display = gtk_widget_get_display (widget); - device_info = gdk_display_list_devices (display); - core_pointer = gdk_display_get_core_pointer (display); - } - - inputd->current_device = NULL; - gtk_container_foreach (GTK_CONTAINER (private->device_menu), - (GtkCallback)gtk_widget_destroy, NULL); - - if (g_list_length(device_info) <= 1) /* only core device */ - { - gtk_widget_hide (private->main_vbox); - gtk_widget_show (private->no_devices_label); - gtk_widget_set_sensitive(inputd->save_button, FALSE); - } - else - { - gtk_widget_show (private->main_vbox); - gtk_widget_hide (private->no_devices_label); - gtk_widget_set_sensitive(inputd->save_button, TRUE); - - for (tmp_list = device_info; tmp_list; tmp_list = tmp_list->next) - { - GdkDevice *info = tmp_list->data; - if (info != core_pointer) - { - GtkWidget *menuitem; - - menuitem = gtk_menu_item_new_with_label (info->name); - - gtk_menu_shell_append (GTK_MENU_SHELL (private->device_menu), - menuitem); - gtk_widget_show (menuitem); - g_signal_connect (menuitem, "activate", - G_CALLBACK (gtk_input_dialog_set_device), - info); - } - } - - gtk_input_dialog_set_device (widget, device_info->data); - gtk_option_menu_set_history (GTK_OPTION_MENU (private->device_optionmenu), 0); - } -} - -GtkWidget* -gtk_input_dialog_new (void) -{ - GtkInputDialog *inputd; - - inputd = g_object_new (GTK_TYPE_INPUT_DIALOG, NULL); - - return GTK_WIDGET (inputd); -} - -static void -gtk_input_dialog_set_device (GtkWidget *w, - gpointer data) -{ - GdkDevice *device = data; - GtkInputDialog *inputd = input_dialog_from_widget (w); - - inputd->current_device = device; - - gtk_input_dialog_fill_axes (inputd, device); - gtk_input_dialog_fill_keys (inputd, device); - - gtk_option_menu_set_history (GTK_OPTION_MENU (inputd->mode_optionmenu), - device->mode); -} - -static void -gtk_input_dialog_set_mapping_mode (GtkWidget *w, - gpointer data) -{ - GtkInputDialog *inputd = input_dialog_from_widget (w); - GdkDevice *info = inputd->current_device; - GdkInputMode old_mode; - GdkInputMode mode = GPOINTER_TO_INT (data); - - if (!info) - return; - - old_mode = info->mode; - - if (mode != old_mode) - { - if (gdk_device_set_mode (info, mode)) - { - if (mode == GDK_MODE_DISABLED) - g_signal_emit (inputd, - input_dialog_signals[DISABLE_DEVICE], - 0, - info); - else - g_signal_emit (inputd, - input_dialog_signals[ENABLE_DEVICE], - 0, - info); - } - else - gtk_option_menu_set_history (GTK_OPTION_MENU (inputd->mode_optionmenu), - old_mode); - - /* FIXME: error dialog ? */ - } -} - -static void -gtk_input_dialog_set_axis (GtkWidget *w, - gpointer data) -{ - GdkAxisUse use = GPOINTER_TO_INT(data) & 0xFFFF; - GdkAxisUse old_use; - GdkAxisUse *new_axes; - GtkInputDialog *inputd = input_dialog_from_widget (w); - GdkDevice *info = inputd->current_device; - - gint axis = (GPOINTER_TO_INT(data) >> 16) - 1; - gint old_axis; - int i; - - if (!info) - return; - - new_axes = g_new (GdkAxisUse, info->num_axes); - old_axis = -1; - for (i=0;i<info->num_axes;i++) - { - new_axes[i] = info->axes[i].use; - if (info->axes[i].use == use) - old_axis = i; - } - - if (axis != -1) - old_use = info->axes[axis].use; - else - old_use = GDK_AXIS_IGNORE; - - if (axis == old_axis) { - g_free (new_axes); - return; - } - - /* we must always have an x and a y axis */ - if ((axis == -1 && (use == GDK_AXIS_X || use == GDK_AXIS_Y)) || - (old_axis == -1 && (old_use == GDK_AXIS_X || old_use == GDK_AXIS_Y))) - { - gtk_option_menu_set_history ( - GTK_OPTION_MENU (inputd->axis_items[use]), - old_axis + 1); - } - else - { - if (axis != -1) - gdk_device_set_axis_use (info, axis, use); - - if (old_axis != -1) - gdk_device_set_axis_use (info, old_axis, old_use); - - if (old_use != GDK_AXIS_IGNORE) - { - gtk_option_menu_set_history ( - GTK_OPTION_MENU (inputd->axis_items[old_use]), - old_axis + 1); - } - } - - g_free (new_axes); -} - -static void -gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDevice *info) -{ - static const char *const axis_use_strings[GDK_AXIS_LAST] = - { - "", - N_("_X:"), - N_("_Y:"), - N_("_Pressure:"), - N_("X _tilt:"), - N_("Y t_ilt:"), - N_("_Wheel:") - }; - - int i,j; - GtkWidget *menu; - GtkWidget *option_menu; - GtkWidget *label; - GtkWidget *viewport; - GtkWidget *old_child; - - /* remove all the old items */ - if (inputd->axis_list) - { - gtk_widget_hide (inputd->axis_list); /* suppress resizes (or get warnings) */ - gtk_widget_destroy (inputd->axis_list); - } - inputd->axis_list = gtk_table_new (GDK_AXIS_LAST, 2, 0); - gtk_table_set_row_spacings (GTK_TABLE (inputd->axis_list), 6); - gtk_table_set_col_spacings (GTK_TABLE (inputd->axis_list), 12); - - viewport = gtk_viewport_new (NULL, NULL); - old_child = gtk_bin_get_child (GTK_BIN (inputd->axis_listbox)); - if (old_child != NULL) - gtk_widget_destroy (old_child); - gtk_container_add (GTK_CONTAINER (inputd->axis_listbox), viewport); - gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE); - gtk_widget_show (viewport); - gtk_container_add (GTK_CONTAINER (viewport), inputd->axis_list); - gtk_widget_show (inputd->axis_list); - - gtk_widget_realize (inputd->axis_list); - gdk_window_set_background (inputd->axis_list->window, - &inputd->axis_list->style->base[GTK_STATE_NORMAL]); - - for (i=GDK_AXIS_X;i<GDK_AXIS_LAST;i++) - { - /* create the label */ - - label = gtk_label_new_with_mnemonic (_(axis_use_strings[i])); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); - gtk_table_attach (GTK_TABLE (inputd->axis_list), label, 0, 1, i, i+1, - GTK_FILL, 0, 2, 2); - - /* and the use option menu */ - menu = gtk_menu_new(); - - for (j = -1; j < info->num_axes; j++) - { - char buffer[16]; - GtkWidget *menu_item; - - if (j == -1) - menu_item = gtk_menu_item_new_with_label (_("none")); - else - { - g_snprintf (buffer, sizeof (buffer), "%d", j+1); - menu_item = gtk_menu_item_new_with_label (buffer); - } - g_signal_connect (menu_item, "activate", - G_CALLBACK (gtk_input_dialog_set_axis), - GINT_TO_POINTER (0x10000 * (j + 1) + i)); - gtk_widget_show (menu_item); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - } - - inputd->axis_items[i] = option_menu = gtk_option_menu_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), option_menu); - gtk_table_attach (GTK_TABLE (inputd->axis_list), option_menu, - 1, 2, i, i+1, GTK_EXPAND | GTK_FILL, 0, 2, 2); - - gtk_widget_show (option_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu); - for (j = 0; j < info->num_axes; j++) - if (info->axes[j].use == (GdkAxisUse) i) - { - gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), j+1); - break; - } - - gtk_widget_show (label); - } -} - -static void -gtk_input_dialog_clear_key (GtkWidget *widget, GtkInputKeyInfo *key) -{ - if (!key->inputd->current_device) - return; - - gtk_entry_set_text (GTK_ENTRY(key->entry), _("(disabled)")); - gdk_device_set_key (key->inputd->current_device, key->index, 0, 0); -} - -static void -gtk_input_dialog_set_key (GtkInputKeyInfo *key, - guint keyval, GdkModifierType modifiers) -{ - GString *str; - gchar chars[2]; - - if (keyval) - { - str = g_string_new (NULL); - - if (modifiers & GDK_SHIFT_MASK) - g_string_append (str, "Shift+"); - if (modifiers & GDK_CONTROL_MASK) - g_string_append (str, "Ctrl+"); - if (modifiers & GDK_MOD1_MASK) - g_string_append (str, "Alt+"); - - if ((keyval >= 0x20) && (keyval <= 0xFF)) - { - chars[0] = keyval; - chars[1] = 0; - g_string_append (str, chars); - } - else - g_string_append (str, _("(unknown)")); - gtk_entry_set_text (GTK_ENTRY(key->entry), str->str); - - g_string_free (str, TRUE); - } - else - { - gtk_entry_set_text (GTK_ENTRY(key->entry), _("(disabled)")); - } -} - -static gboolean -gtk_input_dialog_key_press (GtkWidget *widget, - GdkEventKey *event, - GtkInputKeyInfo *key) -{ - if (!key->inputd->current_device) - return FALSE; - - gtk_input_dialog_set_key (key, event->keyval, event->state & 0xFF); - gdk_device_set_key (key->inputd->current_device, key->index, - event->keyval, event->state & 0xFF); - - g_signal_stop_emission_by_name (widget, "key-press-event"); - - return TRUE; -} - -static void -gtk_input_dialog_destroy_key (GtkWidget *widget, GtkInputKeyInfo *key) -{ - g_free (key); -} - -static void -gtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDevice *info) -{ - int i; - GtkWidget *label; - GtkWidget *button; - GtkWidget *hbox; - GtkWidget *viewport; - GtkWidget *old_child; - - char buffer[32]; - - /* remove all the old items */ - if (inputd->keys_list) - { - gtk_widget_hide (inputd->keys_list); /* suppress resizes (or get warnings) */ - gtk_widget_destroy (inputd->keys_list); - } - - inputd->keys_list = gtk_table_new (info->num_keys, 2, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (inputd->keys_list), 6); - gtk_table_set_col_spacings (GTK_TABLE (inputd->keys_list), 12); - - viewport = gtk_viewport_new (NULL, NULL); - old_child = gtk_bin_get_child (GTK_BIN (inputd->keys_listbox)); - if (old_child != NULL) - gtk_widget_destroy (old_child); - gtk_container_add (GTK_CONTAINER (inputd->keys_listbox), viewport); - gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_NONE); - gtk_widget_show (viewport); - gtk_container_add (GTK_CONTAINER (viewport), inputd->keys_list); - gtk_widget_show (inputd->keys_list); - - gtk_widget_realize (inputd->keys_list); - gdk_window_set_background (inputd->keys_list->window, - &inputd->keys_list->style->base[GTK_STATE_NORMAL]); - - for (i=0;i<info->num_keys;i++) - { - GtkInputKeyInfo *key = g_new (GtkInputKeyInfo, 1); - key->index = i; - key->inputd = inputd; - - /* create the label */ - - g_snprintf (buffer, sizeof (buffer), "_%d:", i+1); - label = gtk_label_new_with_mnemonic (buffer); - gtk_table_attach (GTK_TABLE (inputd->keys_list), label, 0, 1, i, i+1, - GTK_FILL, 0, 2, 2); - gtk_widget_show (label); - - /* the entry */ - - hbox = gtk_hbox_new (FALSE, 6); - gtk_table_attach (GTK_TABLE (inputd->keys_list), hbox, 1, 2, i, i+1, - GTK_EXPAND | GTK_FILL, 0, 2, 2); - gtk_widget_show (hbox); - - key->entry = gtk_entry_new (); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), key->entry); - gtk_box_pack_start (GTK_BOX (hbox), key->entry, TRUE, TRUE, 0); - gtk_widget_show (key->entry); - - g_signal_connect (key->entry, "key-press-event", - G_CALLBACK (gtk_input_dialog_key_press), key); - g_signal_connect (key->entry, "destroy", - G_CALLBACK (gtk_input_dialog_destroy_key), key); - - /* and clear button */ - - button = gtk_button_new_with_mnemonic (_("Cl_ear")); - gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0); - gtk_widget_show (button); - - g_signal_connect (button, "clicked", - G_CALLBACK (gtk_input_dialog_clear_key), key); - - gtk_input_dialog_set_key (key, info->keys[i].keyval, - info->keys[i].modifiers); - } -} - -#define __GTK_INPUTDIALOG_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkinputdialog.h b/gtk/gtkinputdialog.h deleted file mode 100644 index 6e95356bea..0000000000 --- a/gtk/gtkinputdialog.h +++ /dev/null @@ -1,100 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -/* - * NOTE this widget is considered too specialized/little-used for - * GTK+, and will in the future be moved to some other package. If - * your application needs this widget, feel free to use it, as the - * widget does work and is useful in some applications; it's just not - * of general interest. However, we are not accepting new features for - * the widget, and it will eventually move out of the GTK+ - * distribution. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_INPUTDIALOG_H__ -#define __GTK_INPUTDIALOG_H__ - - -#include <gtk/gtkdialog.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_INPUT_DIALOG (gtk_input_dialog_get_type ()) -#define GTK_INPUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_INPUT_DIALOG, GtkInputDialog)) -#define GTK_INPUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_INPUT_DIALOG, GtkInputDialogClass)) -#define GTK_IS_INPUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_INPUT_DIALOG)) -#define GTK_IS_INPUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_INPUT_DIALOG)) -#define GTK_INPUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_INPUT_DIALOG, GtkInputDialogClass)) - - -typedef struct _GtkInputDialog GtkInputDialog; -typedef struct _GtkInputDialogClass GtkInputDialogClass; - -struct _GtkInputDialog -{ - GtkDialog dialog; - - GtkWidget *GSEAL (axis_list); - GtkWidget *GSEAL (axis_listbox); - GtkWidget *GSEAL (mode_optionmenu); - - GtkWidget *GSEAL (close_button); - GtkWidget *GSEAL (save_button); - - GtkWidget *GSEAL (axis_items[GDK_AXIS_LAST]); - GdkDevice *GSEAL (current_device); - - GtkWidget *GSEAL (keys_list); - GtkWidget *GSEAL (keys_listbox); -}; - -struct _GtkInputDialogClass -{ - GtkDialogClass parent_class; - - void (* enable_device) (GtkInputDialog *inputd, - GdkDevice *device); - void (* disable_device) (GtkInputDialog *inputd, - GdkDevice *device); - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - -GType gtk_input_dialog_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_input_dialog_new (void); - -G_END_DECLS - -#endif /* __GTK_INPUTDIALOG_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkinvisible.h b/gtk/gtkinvisible.h index 5625f99458..2f38905525 100644 --- a/gtk/gtkinvisible.h +++ b/gtk/gtkinvisible.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkitem.h b/gtk/gtkitem.h index 4c3d3aee63..0475805610 100644 --- a/gtk/gtkitem.h +++ b/gtk/gtkitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkitemfactory.c b/gtk/gtkitemfactory.c deleted file mode 100644 index 4197866b14..0000000000 --- a/gtk/gtkitemfactory.c +++ /dev/null @@ -1,1586 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkItemFactory: Flexible item factory with automatic rc handling - * Copyright (C) 1998 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include <config.h> - -#undef GTK_DISABLE_DEPRECATED -#include "gtkitemfactory.h" -#include "gtkoptionmenu.h" -#include "gtkmenubar.h" -#include "gtkmenu.h" -#include "gtkmenuitem.h" -#include "gtkradiomenuitem.h" -#include "gtkcheckmenuitem.h" -#include "gtkimagemenuitem.h" -#include "gtktearoffmenuitem.h" -#include "gtkaccelmap.h" -#include "gtkaccellabel.h" -#include "gdk/gdkkeysyms.h" -#include "gtkimage.h" -#include "gtkstock.h" -#include "gtkiconfactory.h" -#include "gtkintl.h" -#include <string.h> -#include <fcntl.h> -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#include <stdio.h> - -#include "gtkalias.h" - -/* --- defines --- */ -#define ITEM_FACTORY_STRING ((gchar*) item_factory_string) -#define ITEM_BLOCK_SIZE (128) - - -/* --- structures --- */ -typedef struct _GtkIFCBData GtkIFCBData; -typedef struct _GtkIFDumpData GtkIFDumpData; -struct _GtkIFCBData -{ - GtkItemFactoryCallback func; - guint callback_type; - gpointer func_data; - guint callback_action; -}; - - -/* --- prototypes --- */ -static void gtk_item_factory_destroy (GtkObject *object); -static void gtk_item_factory_finalize (GObject *object); - - -/* --- static variables --- */ -static const gchar item_factory_string[] = "Gtk-<ItemFactory>"; -static GQuark quark_popup_data = 0; -static GQuark quark_if_menu_pos = 0; -static GQuark quark_item_factory = 0; -static GQuark quark_item_path = 0; -static GQuark quark_action = 0; -static GQuark quark_accel_group = 0; -static GQuark quark_type_item = 0; -static GQuark quark_type_title = 0; -static GQuark quark_type_radio_item = 0; -static GQuark quark_type_check_item = 0; -static GQuark quark_type_toggle_item = 0; -static GQuark quark_type_image_item = 0; -static GQuark quark_type_stock_item = 0; -static GQuark quark_type_tearoff_item = 0; -static GQuark quark_type_separator_item = 0; -static GQuark quark_type_branch = 0; -static GQuark quark_type_last_branch = 0; - -G_DEFINE_TYPE (GtkItemFactory, gtk_item_factory, GTK_TYPE_OBJECT) - -/* --- functions --- */ -static void -gtk_item_factory_class_init (GtkItemFactoryClass *class) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (class); - GtkObjectClass *object_class = GTK_OBJECT_CLASS (class); - - gobject_class->finalize = gtk_item_factory_finalize; - - object_class->destroy = gtk_item_factory_destroy; - - class->item_ht = g_hash_table_new (g_str_hash, g_str_equal); - - quark_popup_data = g_quark_from_static_string ("GtkItemFactory-popup-data"); - quark_if_menu_pos = g_quark_from_static_string ("GtkItemFactory-menu-position"); - quark_item_factory = g_quark_from_static_string ("GtkItemFactory"); - quark_item_path = g_quark_from_static_string ("GtkItemFactory-path"); - quark_action = g_quark_from_static_string ("GtkItemFactory-action"); - quark_accel_group = g_quark_from_static_string ("GtkAccelGroup"); - quark_type_item = g_quark_from_static_string ("<Item>"); - quark_type_title = g_quark_from_static_string ("<Title>"); - quark_type_radio_item = g_quark_from_static_string ("<RadioItem>"); - quark_type_check_item = g_quark_from_static_string ("<CheckItem>"); - quark_type_toggle_item = g_quark_from_static_string ("<ToggleItem>"); - quark_type_image_item = g_quark_from_static_string ("<ImageItem>"); - quark_type_stock_item = g_quark_from_static_string ("<StockItem>"); - quark_type_separator_item = g_quark_from_static_string ("<Separator>"); - quark_type_tearoff_item = g_quark_from_static_string ("<Tearoff>"); - quark_type_branch = g_quark_from_static_string ("<Branch>"); - quark_type_last_branch = g_quark_from_static_string ("<LastBranch>"); -} - -static void -gtk_item_factory_init (GtkItemFactory *ifactory) -{ - ifactory->path = NULL; - ifactory->accel_group = NULL; - ifactory->widget = NULL; - ifactory->items = NULL; - ifactory->translate_func = NULL; - ifactory->translate_data = NULL; - ifactory->translate_notify = NULL; -} - -/** - * gtk_item_factory_new: - * @container_type: the kind of menu to create; can be - * #GTK_TYPE_MENU_BAR, #GTK_TYPE_MENU or #GTK_TYPE_OPTION_MENU - * @path: the factory path of the new item factory, a string of the form - * <literal>"<name>"</literal> - * @accel_group: (allow-none): a #GtkAccelGroup to which the accelerators for the - * menu items will be added, or %NULL to create a new one - * @returns: a new #GtkItemFactory - * - * Creates a new #GtkItemFactory. - * - * Beware that the returned object does not have a floating reference. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkItemFactory* -gtk_item_factory_new (GType container_type, - const gchar *path, - GtkAccelGroup *accel_group) -{ - GtkItemFactory *ifactory; - - g_return_val_if_fail (path != NULL, NULL); - - ifactory = g_object_new (GTK_TYPE_ITEM_FACTORY, NULL); - gtk_item_factory_construct (ifactory, container_type, path, accel_group); - - return ifactory; -} - -static void -gtk_item_factory_callback_marshal (GtkWidget *widget, - gpointer func_data) -{ - GtkIFCBData *data; - - data = func_data; - - if (data->callback_type == 1) - { - GtkItemFactoryCallback1 func1 = (GtkItemFactoryCallback1) data->func; - func1 (data->func_data, data->callback_action, widget); - } - else if (data->callback_type == 2) - { - GtkItemFactoryCallback2 func2 = (GtkItemFactoryCallback2) data->func; - func2 (widget, data->func_data, data->callback_action); - } -} - -static void -gtk_item_factory_item_remove_widget (GtkWidget *widget, - GtkItemFactoryItem *item) -{ - item->widgets = g_slist_remove (item->widgets, widget); - g_object_set_qdata (G_OBJECT (widget), quark_item_factory, NULL); - g_object_set_qdata (G_OBJECT (widget), quark_item_path, NULL); -} - -/** - * gtk_item_factory_add_foreign: - * @accel_widget: widget to install an accelerator on - * @full_path: the full path for the @accel_widget - * @accel_group: the accelerator group to install the accelerator in - * @keyval: key value of the accelerator - * @modifiers: modifier combination of the accelerator - * - * Installs an accelerator for @accel_widget in @accel_group, that causes - * the ::activate signal to be emitted if the accelerator is activated. - * - * This function can be used to make widgets participate in the accel - * saving/restoring functionality provided by gtk_accel_map_save() and - * gtk_accel_map_load(), even if they haven't been created by an item - * factory. - * - * Deprecated: 2.4: The recommended API for this purpose are the functions - * gtk_menu_item_set_accel_path() and gtk_widget_set_accel_path(); don't - * use gtk_item_factory_add_foreign() in new code, since it is likely to - * be removed in the future. - */ -void -gtk_item_factory_add_foreign (GtkWidget *accel_widget, - const gchar *full_path, - GtkAccelGroup *accel_group, - guint keyval, - GdkModifierType modifiers) -{ - GtkItemFactoryClass *class; - GtkItemFactoryItem *item; - - g_return_if_fail (GTK_IS_WIDGET (accel_widget)); - g_return_if_fail (full_path != NULL); - - class = gtk_type_class (GTK_TYPE_ITEM_FACTORY); - - keyval = keyval != GDK_VoidSymbol ? keyval : 0; - - item = g_hash_table_lookup (class->item_ht, full_path); - if (!item) - { - item = g_slice_new (GtkItemFactoryItem); - - item->path = g_strdup (full_path); - item->widgets = NULL; - - g_hash_table_insert (class->item_ht, item->path, item); - } - - item->widgets = g_slist_prepend (item->widgets, accel_widget); - g_signal_connect (accel_widget, - "destroy", - G_CALLBACK (gtk_item_factory_item_remove_widget), - item); - - /* set the item path for the widget - */ - g_object_set_qdata (G_OBJECT (accel_widget), quark_item_path, item->path); - gtk_widget_set_name (accel_widget, item->path); - if (accel_group) - { - g_object_ref (accel_group); - g_object_set_qdata_full (G_OBJECT (accel_widget), - quark_accel_group, - accel_group, - g_object_unref); - } - else - g_object_set_qdata (G_OBJECT (accel_widget), quark_accel_group, NULL); - - /* install defined accelerators - */ - if (g_signal_lookup ("activate", G_TYPE_FROM_INSTANCE (accel_widget))) - { - if (accel_group) - { - gtk_accel_map_add_entry (full_path, keyval, modifiers); - gtk_widget_set_accel_path (accel_widget, full_path, accel_group); - } - } -} - -static void -ifactory_cb_data_free (gpointer mem) -{ - g_slice_free (GtkIFCBData, mem); -} - -static void -gtk_item_factory_add_item (GtkItemFactory *ifactory, - const gchar *path, - const gchar *accelerator, - GtkItemFactoryCallback callback, - guint callback_action, - gpointer callback_data, - guint callback_type, - gchar *item_type, - GtkWidget *widget) -{ - GtkItemFactoryClass *class; - GtkItemFactoryItem *item; - gchar *fpath; - guint keyval; - GdkModifierType mods; - - g_return_if_fail (widget != NULL); - g_return_if_fail (item_type != NULL); - - class = GTK_ITEM_FACTORY_GET_CLASS (ifactory); - - /* set accelerator group on menu widgets - */ - if (GTK_IS_MENU (widget)) - gtk_menu_set_accel_group ((GtkMenu*) widget, ifactory->accel_group); - - /* connect callback if necessary - */ - if (callback) - { - GtkIFCBData *data; - - data = g_slice_new (GtkIFCBData); - data->func = callback; - data->callback_type = callback_type; - data->func_data = callback_data; - data->callback_action = callback_action; - - g_object_weak_ref (G_OBJECT (widget), - (GWeakNotify) ifactory_cb_data_free, - data); - g_signal_connect (widget, - "activate", - G_CALLBACK (gtk_item_factory_callback_marshal), - data); - } - - /* link the widget into its item-entry - * and keep back pointer on both the item factory and the widget - */ - g_object_set_qdata (G_OBJECT (widget), quark_action, GUINT_TO_POINTER (callback_action)); - g_object_set_qdata (G_OBJECT (widget), quark_item_factory, ifactory); - if (accelerator) - gtk_accelerator_parse (accelerator, &keyval, &mods); - else - { - keyval = 0; - mods = 0; - } - fpath = g_strconcat (ifactory->path, path, NULL); - gtk_item_factory_add_foreign (widget, fpath, ifactory->accel_group, keyval, mods); - item = g_hash_table_lookup (class->item_ht, fpath); - g_free (fpath); - - g_return_if_fail (item != NULL); - - if (!g_slist_find (ifactory->items, item)) - ifactory->items = g_slist_prepend (ifactory->items, item); -} - -/** - * gtk_item_factory_construct: - * @ifactory: a #GtkItemFactory - * @container_type: the kind of menu to create; can be - * #GTK_TYPE_MENU_BAR, #GTK_TYPE_MENU or #GTK_TYPE_OPTION_MENU - * @path: the factory path of @ifactory, a string of the form - * <literal>"<name>"</literal> - * @accel_group: a #GtkAccelGroup to which the accelerators for the - * menu items will be added, or %NULL to create a new one - * - * Initializes an item factory. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_construct (GtkItemFactory *ifactory, - GType container_type, - const gchar *path, - GtkAccelGroup *accel_group) -{ - guint len; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - g_return_if_fail (ifactory->accel_group == NULL); - g_return_if_fail (path != NULL); - if (!g_type_is_a (container_type, GTK_TYPE_OPTION_MENU)) - g_return_if_fail (g_type_is_a (container_type, GTK_TYPE_MENU_SHELL)); - - len = strlen (path); - - if (path[0] != '<' && path[len - 1] != '>') - { - g_warning ("GtkItemFactory: invalid factory path `%s'", path); - return; - } - - if (accel_group) - { - ifactory->accel_group = accel_group; - g_object_ref (ifactory->accel_group); - } - else - ifactory->accel_group = gtk_accel_group_new (); - - ifactory->path = g_strdup (path); - ifactory->widget = g_object_connect (g_object_new (container_type, NULL), - "signal::destroy", gtk_widget_destroyed, &ifactory->widget, - NULL); - g_object_ref_sink (ifactory); - - gtk_item_factory_add_item (ifactory, - "", NULL, - NULL, 0, NULL, 0, - ITEM_FACTORY_STRING, - ifactory->widget); -} - -/** - * gtk_item_factory_from_path: - * @path: a string starting with a factory path of the form - * <literal>"<name>"</literal> - * @returns: (allow-none): the #GtkItemFactory created for the given factory path, or %NULL - * - * Finds an item factory which has been constructed using the - * <literal>"<name>"</literal> prefix of @path as the @path argument - * for gtk_item_factory_new(). - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkItemFactory* -gtk_item_factory_from_path (const gchar *path) -{ - GtkItemFactoryClass *class; - GtkItemFactoryItem *item; - gchar *fname; - guint i; - - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (path[0] == '<', NULL); - - class = gtk_type_class (GTK_TYPE_ITEM_FACTORY); - - i = 0; - while (path[i] && path[i] != '>') - i++; - if (path[i] != '>') - { - g_warning ("gtk_item_factory_from_path(): invalid factory path \"%s\"", - path); - return NULL; - } - fname = g_new (gchar, i + 2); - g_memmove (fname, path, i + 1); - fname[i + 1] = 0; - - item = g_hash_table_lookup (class->item_ht, fname); - - g_free (fname); - - if (item && item->widgets) - return gtk_item_factory_from_widget (item->widgets->data); - - return NULL; -} - -static void -gtk_item_factory_destroy (GtkObject *object) -{ - GtkItemFactory *ifactory = (GtkItemFactory*) object; - GSList *slist; - - if (ifactory->widget) - { - GtkObject *dobj; - - dobj = GTK_OBJECT (ifactory->widget); - - g_object_ref_sink (dobj); - gtk_object_destroy (dobj); - g_object_unref (dobj); - - ifactory->widget = NULL; - } - - for (slist = ifactory->items; slist; slist = slist->next) - { - GtkItemFactoryItem *item = slist->data; - GSList *link; - - for (link = item->widgets; link; link = link->next) - if (g_object_get_qdata (link->data, quark_item_factory) == ifactory) - g_object_set_qdata (link->data, quark_item_factory, NULL); - } - g_slist_free (ifactory->items); - ifactory->items = NULL; - - GTK_OBJECT_CLASS (gtk_item_factory_parent_class)->destroy (object); -} - -static void -gtk_item_factory_finalize (GObject *object) -{ - GtkItemFactory *ifactory = GTK_ITEM_FACTORY (object); - - if (ifactory->accel_group) - g_object_unref (ifactory->accel_group); - - g_free (ifactory->path); - g_assert (ifactory->widget == NULL); - - if (ifactory->translate_notify) - ifactory->translate_notify (ifactory->translate_data); - - G_OBJECT_CLASS (gtk_item_factory_parent_class)->finalize (object); -} - -/** - * gtk_item_factory_from_widget: - * @widget: a widget - * @returns: (allow-none): the item factory from which @widget was created, or %NULL - * - * Obtains the item factory from which a widget was created. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkItemFactory* -gtk_item_factory_from_widget (GtkWidget *widget) -{ - GtkItemFactory *ifactory; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - - ifactory = g_object_get_qdata (G_OBJECT (widget), quark_item_factory); - - if (ifactory == NULL && GTK_IS_MENU_ITEM (widget) && - GTK_MENU_ITEM (widget)->submenu != NULL) - { - GtkWidget *menu = GTK_MENU_ITEM (widget)->submenu; - ifactory = g_object_get_qdata (G_OBJECT (menu), quark_item_factory); - } - - return ifactory; -} - -/** - * gtk_item_factory_path_from_widget: - * @widget: a widget - * @returns: the full path to @widget if it has been created by an item - * factory, %NULL otherwise. This value is owned by GTK+ and must not be - * modified or freed. - * - * If @widget has been created by an item factory, returns the full path - * to it. (The full path of a widget is the concatenation of the factory - * path specified in gtk_item_factory_new() with the path specified in the - * #GtkItemFactoryEntry from which the widget was created.) - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -G_CONST_RETURN gchar* -gtk_item_factory_path_from_widget (GtkWidget *widget) -{ - gchar* path; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - - path = g_object_get_qdata (G_OBJECT (widget), quark_item_path); - - if (path == NULL && GTK_IS_MENU_ITEM (widget) && - GTK_MENU_ITEM (widget)->submenu != NULL) - { - GtkWidget *menu = GTK_MENU_ITEM (widget)->submenu; - path = g_object_get_qdata (G_OBJECT (menu), quark_item_path); - } - - return path; -} - -/** - * gtk_item_factory_create_items: - * @ifactory: a #GtkItemFactory - * @n_entries: the length of @entries - * @entries: an array of #GtkItemFactoryEntry<!-- -->s whose @callback members - * must by of type #GtkItemFactoryCallback1 - * @callback_data: data passed to the callback functions of all entries - * - * Creates the menu items from the @entries. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_create_items (GtkItemFactory *ifactory, - guint n_entries, - GtkItemFactoryEntry *entries, - gpointer callback_data) -{ - gtk_item_factory_create_items_ac (ifactory, n_entries, entries, callback_data, 1); -} - -/** - * gtk_item_factory_create_items_ac: - * @ifactory: a #GtkItemFactory - * @n_entries: the length of @entries - * @entries: an array of #GtkItemFactoryEntry<!-- -->s - * @callback_data: data passed to the callback functions of all entries - * @callback_type: 1 if the callback functions in @entries are of type - * #GtkItemFactoryCallback1, 2 if they are of type #GtkItemFactoryCallback2 - * - * Creates the menu items from the @entries. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_create_items_ac (GtkItemFactory *ifactory, - guint n_entries, - GtkItemFactoryEntry *entries, - gpointer callback_data, - guint callback_type) -{ - guint i; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - g_return_if_fail (callback_type >= 1 && callback_type <= 2); - - if (n_entries == 0) - return; - - g_return_if_fail (entries != NULL); - - for (i = 0; i < n_entries; i++) - gtk_item_factory_create_item (ifactory, entries + i, callback_data, callback_type); -} - -/** - * gtk_item_factory_get_widget: - * @ifactory: a #GtkItemFactory - * @path: the path to the widget - * @returns: (allow-none): the widget for the given path, or %NULL if @path doesn't lead - * to a widget - * - * Obtains the widget which corresponds to @path. - * - * If the widget corresponding to @path is a menu item which opens a - * submenu, then the submenu is returned. If you are interested in the menu - * item, use gtk_item_factory_get_item() instead. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkWidget* -gtk_item_factory_get_widget (GtkItemFactory *ifactory, - const gchar *path) -{ - GtkItemFactoryClass *class; - GtkItemFactoryItem *item; - - g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL); - g_return_val_if_fail (path != NULL, NULL); - - class = GTK_ITEM_FACTORY_GET_CLASS (ifactory); - - if (path[0] == '<') - item = g_hash_table_lookup (class->item_ht, (gpointer) path); - else - { - gchar *fpath; - - fpath = g_strconcat (ifactory->path, path, NULL); - item = g_hash_table_lookup (class->item_ht, fpath); - g_free (fpath); - } - - if (item) - { - GSList *slist; - - for (slist = item->widgets; slist; slist = slist->next) - { - if (gtk_item_factory_from_widget (slist->data) == ifactory) - return slist->data; - } - } - - return NULL; -} - -/** - * gtk_item_factory_get_widget_by_action: - * @ifactory: a #GtkItemFactory - * @action: an action as specified in the @callback_action field - * of #GtkItemFactoryEntry - * @returns: (allow-none): the widget which corresponds to the given action, or %NULL - * if no widget was found - * - * Obtains the widget which was constructed from the #GtkItemFactoryEntry - * with the given @action. - * - * If there are multiple items with the same action, the result is - * undefined. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkWidget* -gtk_item_factory_get_widget_by_action (GtkItemFactory *ifactory, - guint action) -{ - GSList *slist; - - g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL); - - for (slist = ifactory->items; slist; slist = slist->next) - { - GtkItemFactoryItem *item = slist->data; - GSList *link; - - for (link = item->widgets; link; link = link->next) - if (g_object_get_qdata (link->data, quark_item_factory) == ifactory && - g_object_get_qdata (link->data, quark_action) == GUINT_TO_POINTER (action)) - return link->data; - } - - return NULL; -} - -/** - * gtk_item_factory_get_item: - * @ifactory: a #GtkItemFactory - * @path: the path to the menu item - * @returns: (allow-none): the menu item for the given path, or %NULL if @path doesn't - * lead to a menu item - * - * Obtains the menu item which corresponds to @path. - * - * If the widget corresponding to @path is a menu item which opens a - * submenu, then the item is returned. If you are interested in the submenu, - * use gtk_item_factory_get_widget() instead. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkWidget* -gtk_item_factory_get_item (GtkItemFactory *ifactory, - const gchar *path) -{ - GtkWidget *widget; - - g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL); - g_return_val_if_fail (path != NULL, NULL); - - widget = gtk_item_factory_get_widget (ifactory, path); - - if (GTK_IS_MENU (widget)) - widget = gtk_menu_get_attach_widget (GTK_MENU (widget)); - - return GTK_IS_ITEM (widget) ? widget : NULL; -} - - -/** - * gtk_item_factory_get_item_by_action: - * @ifactory: a #GtkItemFactory - * @action: an action as specified in the @callback_action field - * of #GtkItemFactoryEntry - * @returns: (allow-none): the menu item which corresponds to the given action, or %NULL - * if no menu item was found - * - * Obtains the menu item which was constructed from the first - * #GtkItemFactoryEntry with the given @action. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -GtkWidget* -gtk_item_factory_get_item_by_action (GtkItemFactory *ifactory, - guint action) -{ - GtkWidget *widget; - - g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL); - - widget = gtk_item_factory_get_widget_by_action (ifactory, action); - - if (GTK_IS_MENU (widget)) - widget = gtk_menu_get_attach_widget (GTK_MENU (widget)); - - return GTK_IS_ITEM (widget) ? widget : NULL; -} - -static char * -item_factory_find_separator_r (char *path) -{ - gchar *result = NULL; - gboolean escaped = FALSE; - - while (*path) - { - if (escaped) - escaped = FALSE; - else - { - if (*path == '\\') - escaped = TRUE; - else if (*path == '/') - result = path; - } - - path++; - } - - return result; -} - -static char * -item_factory_unescape_label (const char *label) -{ - char *new = g_malloc (strlen (label) + 1); - char *p = new; - gboolean escaped = FALSE; - - while (*label) - { - if (escaped) - { - *p++ = *label; - escaped = FALSE; - } - else - { - if (*label == '\\') - escaped = TRUE; - else - *p++ = *label; - } - - label++; - } - - *p = '\0'; - - return new; -} - -static gboolean -gtk_item_factory_parse_path (GtkItemFactory *ifactory, - gchar *str, - gchar **path, - gchar **parent_path, - gchar **item) -{ - gchar *translation; - gchar *p, *q; - - *path = g_strdup (str); - - p = q = *path; - while (*p) - { - if (*p == '_') - { - if (p[1] == '_') - { - p++; - *q++ = '_'; - } - } - else - { - *q++ = *p; - } - p++; - } - *q = 0; - - *parent_path = g_strdup (*path); - p = item_factory_find_separator_r (*parent_path); - if (!p) - { - g_warning ("GtkItemFactory: invalid entry path `%s'", str); - return FALSE; - } - *p = 0; - - if (ifactory->translate_func) - translation = ifactory->translate_func (str, ifactory->translate_data); - else - translation = str; - - p = item_factory_find_separator_r (translation); - if (p) - p++; - else - p = translation; - - *item = item_factory_unescape_label (p); - - return TRUE; -} - -/** - * gtk_item_factory_create_item: - * @ifactory: a #GtkItemFactory - * @entry: the #GtkItemFactoryEntry to create an item for - * @callback_data: data passed to the callback function of @entry - * @callback_type: 1 if the callback function of @entry is of type - * #GtkItemFactoryCallback1, 2 if it is of type #GtkItemFactoryCallback2 - * - * Creates an item for @entry. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_create_item (GtkItemFactory *ifactory, - GtkItemFactoryEntry *entry, - gpointer callback_data, - guint callback_type) -{ - GtkOptionMenu *option_menu = NULL; - GtkWidget *parent; - GtkWidget *widget; - GtkWidget *image; - GSList *radio_group; - gchar *name; - gchar *parent_path; - gchar *path; - gchar *accelerator; - guint type_id; - GType type; - gchar *item_type_path; - GtkStockItem stock_item; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - g_return_if_fail (entry != NULL); - g_return_if_fail (entry->path != NULL); - g_return_if_fail (entry->path[0] == '/'); - g_return_if_fail (callback_type >= 1 && callback_type <= 2); - - if (!entry->item_type || - entry->item_type[0] == 0) - { - item_type_path = "<Item>"; - type_id = quark_type_item; - } - else - { - item_type_path = entry->item_type; - type_id = g_quark_try_string (item_type_path); - } - - radio_group = NULL; - if (type_id == quark_type_item) - type = GTK_TYPE_MENU_ITEM; - else if (type_id == quark_type_title) - type = GTK_TYPE_MENU_ITEM; - else if (type_id == quark_type_radio_item) - type = GTK_TYPE_RADIO_MENU_ITEM; - else if (type_id == quark_type_check_item) - type = GTK_TYPE_CHECK_MENU_ITEM; - else if (type_id == quark_type_image_item) - type = GTK_TYPE_IMAGE_MENU_ITEM; - else if (type_id == quark_type_stock_item) - type = GTK_TYPE_IMAGE_MENU_ITEM; - else if (type_id == quark_type_tearoff_item) - type = GTK_TYPE_TEAROFF_MENU_ITEM; - else if (type_id == quark_type_toggle_item) - type = GTK_TYPE_CHECK_MENU_ITEM; - else if (type_id == quark_type_separator_item) - type = GTK_TYPE_MENU_ITEM; - else if (type_id == quark_type_branch) - type = GTK_TYPE_MENU_ITEM; - else if (type_id == quark_type_last_branch) - type = GTK_TYPE_MENU_ITEM; - else - { - GtkWidget *radio_link; - - radio_link = gtk_item_factory_get_widget (ifactory, item_type_path); - if (radio_link && GTK_IS_RADIO_MENU_ITEM (radio_link)) - { - type = GTK_TYPE_RADIO_MENU_ITEM; - radio_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (radio_link)); - } - else - { - g_warning ("GtkItemFactory: entry path `%s' has invalid type `%s'", - entry->path, - item_type_path); - return; - } - } - - if (!gtk_item_factory_parse_path (ifactory, entry->path, - &path, &parent_path, &name)) - return; - - parent = gtk_item_factory_get_widget (ifactory, parent_path); - if (!parent) - { - GtkItemFactoryEntry pentry; - gchar *ppath, *p; - - ppath = g_strdup (entry->path); - p = item_factory_find_separator_r (ppath); - g_return_if_fail (p != NULL); - *p = 0; - pentry.path = ppath; - pentry.accelerator = NULL; - pentry.callback = NULL; - pentry.callback_action = 0; - pentry.item_type = "<Branch>"; - - gtk_item_factory_create_item (ifactory, &pentry, NULL, 1); - g_free (ppath); - - parent = gtk_item_factory_get_widget (ifactory, parent_path); - g_return_if_fail (parent != NULL); - } - - if (GTK_IS_OPTION_MENU (parent)) - { - option_menu = GTK_OPTION_MENU (parent); - if (!option_menu->menu) - { - GtkWidget *menu = g_object_new (GTK_TYPE_MENU, NULL); - gchar *p = g_strconcat (ifactory->path, parent_path, NULL); - - gtk_menu_set_accel_path (GTK_MENU (menu), p); - g_free (p); - gtk_option_menu_set_menu (option_menu, menu); - } - parent = option_menu->menu; - } - g_free (parent_path); - - g_return_if_fail (GTK_IS_CONTAINER (parent)); - - accelerator = entry->accelerator; - - widget = g_object_new (type, - "visible", TRUE, - "sensitive", (type_id != quark_type_separator_item && - type_id != quark_type_title), - "parent", parent, - NULL); - if (option_menu && !option_menu->menu_item) - gtk_option_menu_set_history (option_menu, 0); - - if (GTK_IS_RADIO_MENU_ITEM (widget)) - gtk_radio_menu_item_set_group (GTK_RADIO_MENU_ITEM (widget), radio_group); - if (type_id == quark_type_image_item) - { - GdkPixbuf *pixbuf = NULL; - image = NULL; - if (entry->extra_data) - { - pixbuf = gdk_pixbuf_new_from_inline (-1, - entry->extra_data, - FALSE, - NULL); - if (pixbuf) - image = gtk_image_new_from_pixbuf (pixbuf); - } - if (image) - { - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (widget), image); - gtk_widget_show (image); - } - if (pixbuf) - g_object_unref (pixbuf); - } - if (type_id == quark_type_stock_item) - { - image = gtk_image_new_from_stock (entry->extra_data, GTK_ICON_SIZE_MENU); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (widget), image); - gtk_widget_show (image); - - if (gtk_stock_lookup (entry->extra_data, &stock_item)) - { - if (!accelerator) - accelerator = gtk_accelerator_name (stock_item.keyval, stock_item.modifier); - } - } - - /* install underline accelerators for this item - */ - if (type_id != quark_type_separator_item && - type_id != quark_type_tearoff_item && - *name) - { - GtkWidget *label; - - label = g_object_new (GTK_TYPE_ACCEL_LABEL, - "visible", TRUE, - "parent", widget, - "accel-widget", widget, - "xalign", 0.0, - NULL); - gtk_label_set_text_with_mnemonic (GTK_LABEL (label), name); - } - - g_free (name); - - if (type_id == quark_type_branch || - type_id == quark_type_last_branch) - { - gchar *p; - - if (entry->callback) - g_warning ("gtk_item_factory_create_item(): Can't specify a callback on a branch: \"%s\"", - entry->path); - if (type_id == quark_type_last_branch) - gtk_menu_item_set_right_justified (GTK_MENU_ITEM (widget), TRUE); - - parent = widget; - widget = g_object_new (GTK_TYPE_MENU, NULL); - p = g_strconcat (ifactory->path, path, NULL); - gtk_menu_set_accel_path (GTK_MENU (widget), p); - g_free (p); - - gtk_menu_item_set_submenu (GTK_MENU_ITEM (parent), widget); - } - - gtk_item_factory_add_item (ifactory, - path, accelerator, - (type_id == quark_type_branch || - type_id == quark_type_last_branch) ? - (GtkItemFactoryCallback) NULL : entry->callback, - entry->callback_action, callback_data, - callback_type, - item_type_path, - widget); - if (accelerator != entry->accelerator) - g_free (accelerator); - g_free (path); -} - -/** - * gtk_item_factory_create_menu_entries: - * @n_entries: the length of @entries - * @entries: an array of #GtkMenuEntry<!-- -->s - * - * Creates the menu items from the @entries. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_create_menu_entries (guint n_entries, - GtkMenuEntry *entries) -{ - static GPatternSpec *pspec_separator = NULL; - static GPatternSpec *pspec_check = NULL; - guint i; - - if (!n_entries) - return; - g_return_if_fail (entries != NULL); - - if (!pspec_separator) - { - pspec_separator = g_pattern_spec_new ("*<separator>*"); - pspec_check = g_pattern_spec_new ("*<check>*"); - } - - for (i = 0; i < n_entries; i++) - { - GtkItemFactory *ifactory; - GtkItemFactoryEntry entry; - gchar *path; - gchar *cpath; - - path = entries[i].path; - ifactory = gtk_item_factory_from_path (path); - if (!ifactory) - { - g_warning ("gtk_item_factory_create_menu_entries(): " - "entry[%u] refers to unknown item factory: \"%s\"", - i, entries[i].path); - continue; - } - - while (*path != '>') - path++; - path++; - cpath = NULL; - - entry.path = path; - entry.accelerator = entries[i].accelerator; - entry.callback = entries[i].callback; - entry.callback_action = 0; - if (g_pattern_match_string (pspec_separator, path)) - entry.item_type = "<Separator>"; - else if (!g_pattern_match_string (pspec_check, path)) - entry.item_type = NULL; - else - { - gboolean in_brace = FALSE; - gchar *c; - - cpath = g_new (gchar, strlen (path)); - c = cpath; - while (*path != 0) - { - if (*path == '<') - in_brace = TRUE; - else if (*path == '>') - in_brace = FALSE; - else if (!in_brace) - *(c++) = *path; - path++; - } - *c = 0; - entry.item_type = "<ToggleItem>"; - entry.path = cpath; - } - - gtk_item_factory_create_item (ifactory, &entry, entries[i].callback_data, 2); - entries[i].widget = gtk_item_factory_get_widget (ifactory, entries[i].path); - g_free (cpath); - } -} - -/** - * gtk_item_factories_path_delete: - * @ifactory_path: a factory path to prepend to @path. May be %NULL if @path - * starts with a factory path - * @path: a path - * - * Deletes all widgets constructed from the specified path. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factories_path_delete (const gchar *ifactory_path, - const gchar *path) -{ - GtkItemFactoryClass *class; - GtkItemFactoryItem *item; - - g_return_if_fail (path != NULL); - - class = gtk_type_class (GTK_TYPE_ITEM_FACTORY); - - if (path[0] == '<') - item = g_hash_table_lookup (class->item_ht, (gpointer) path); - else - { - gchar *fpath; - - g_return_if_fail (ifactory_path != NULL); - - fpath = g_strconcat (ifactory_path, path, NULL); - item = g_hash_table_lookup (class->item_ht, fpath); - g_free (fpath); - } - - if (item) - { - GSList *widget_list; - GSList *slist; - - widget_list = NULL; - for (slist = item->widgets; slist; slist = slist->next) - { - GtkWidget *widget; - - widget = slist->data; - widget_list = g_slist_prepend (widget_list, widget); - g_object_ref (widget); - } - - for (slist = widget_list; slist; slist = slist->next) - { - GtkWidget *widget; - - widget = slist->data; - gtk_widget_destroy (widget); - g_object_unref (widget); - } - g_slist_free (widget_list); - } -} - -/** - * gtk_item_factory_delete_item: - * @ifactory: a #GtkItemFactory - * @path: a path - * - * Deletes the menu item which was created for @path by the given - * item factory. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_delete_item (GtkItemFactory *ifactory, - const gchar *path) -{ - GtkWidget *widget; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - g_return_if_fail (path != NULL); - - widget = gtk_item_factory_get_widget (ifactory, path); - - if (widget) - { - if (GTK_IS_MENU (widget)) - widget = gtk_menu_get_attach_widget (GTK_MENU (widget)); - - gtk_widget_destroy (widget); - } -} - -/** - * gtk_item_factory_delete_entry: - * @ifactory: a #GtkItemFactory - * @entry: a #GtkItemFactoryEntry - * - * Deletes the menu item which was created from @entry by the given - * item factory. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_delete_entry (GtkItemFactory *ifactory, - GtkItemFactoryEntry *entry) -{ - gchar *path; - gchar *parent_path; - gchar *name; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - g_return_if_fail (entry != NULL); - g_return_if_fail (entry->path != NULL); - g_return_if_fail (entry->path[0] == '/'); - - if (!gtk_item_factory_parse_path (ifactory, entry->path, - &path, &parent_path, &name)) - return; - - gtk_item_factory_delete_item (ifactory, path); - - g_free (path); - g_free (parent_path); - g_free (name); -} - -/** - * gtk_item_factory_delete_entries: - * @ifactory: a #GtkItemFactory - * @n_entries: the length of @entries - * @entries: an array of #GtkItemFactoryEntry<!-- -->s - * - * Deletes the menu items which were created from the @entries by the given - * item factory. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_delete_entries (GtkItemFactory *ifactory, - guint n_entries, - GtkItemFactoryEntry *entries) -{ - guint i; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - if (n_entries > 0) - g_return_if_fail (entries != NULL); - - for (i = 0; i < n_entries; i++) - gtk_item_factory_delete_entry (ifactory, entries + i); -} - -typedef struct -{ - guint x; - guint y; -} MenuPos; - -static void -gtk_item_factory_menu_pos (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - gpointer func_data) -{ - MenuPos *mpos = func_data; - - *x = mpos->x; - *y = mpos->y; -} - -/** - * gtk_item_factory_popup_data_from_widget: - * @widget: a widget - * @returns: @popup_data associated with the item factory from - * which @widget was created, or %NULL if @widget wasn't created - * by an item factory - * - * Obtains the @popup_data which was passed to - * gtk_item_factory_popup_with_data(). This data is available until the menu - * is popped down again. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -gpointer -gtk_item_factory_popup_data_from_widget (GtkWidget *widget) -{ - GtkItemFactory *ifactory; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - - ifactory = gtk_item_factory_from_widget (widget); - if (ifactory) - return g_object_get_qdata (G_OBJECT (ifactory), quark_popup_data); - - return NULL; -} - -/** - * gtk_item_factory_popup_data: - * @ifactory: a #GtkItemFactory - * @returns: @popup_data associated with @ifactory - * - * Obtains the @popup_data which was passed to - * gtk_item_factory_popup_with_data(). This data is available until the menu - * is popped down again. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -gpointer -gtk_item_factory_popup_data (GtkItemFactory *ifactory) -{ - g_return_val_if_fail (GTK_IS_ITEM_FACTORY (ifactory), NULL); - - return g_object_get_qdata (G_OBJECT (ifactory), quark_popup_data); -} - -static void -ifactory_delete_popup_data (GtkObject *object, - GtkItemFactory *ifactory) -{ - g_signal_handlers_disconnect_by_func (object, - ifactory_delete_popup_data, - ifactory); - g_object_set_qdata (G_OBJECT (ifactory), quark_popup_data, NULL); -} - -/** - * gtk_item_factory_popup: - * @ifactory: a #GtkItemFactory of type #GTK_TYPE_MENU (see gtk_item_factory_new()) - * @x: the x position - * @y: the y position - * @mouse_button: the mouse button which was pressed to initiate the popup - * @time_: the time at which the activation event occurred - * - * Pops up the menu constructed from the item factory at (@x, @y). - * - * The @mouse_button parameter should be the mouse button pressed to initiate - * the menu popup. If the menu popup was initiated by something other than - * a mouse button press, such as a mouse button release or a keypress, - * @mouse_button should be 0. - * - * The @time_ parameter should be the time stamp of the event that - * initiated the popup. If such an event is not available, use - * gtk_get_current_event_time() instead. - * - * The operation of the @mouse_button and the @time_ parameter is the same - * as the @button and @activation_time parameters for gtk_menu_popup(). - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_popup (GtkItemFactory *ifactory, - guint x, - guint y, - guint mouse_button, - guint32 time) -{ - gtk_item_factory_popup_with_data (ifactory, NULL, NULL, x, y, mouse_button, time); -} - -/** - * gtk_item_factory_popup_with_data: - * @ifactory: a #GtkItemFactory of type #GTK_TYPE_MENU (see gtk_item_factory_new()) - * @popup_data: data available for callbacks while the menu is posted - * @destroy: a #GDestroyNotify function to be called on @popup_data when - * the menu is unposted - * @x: the x position - * @y: the y position - * @mouse_button: the mouse button which was pressed to initiate the popup - * @time_: the time at which the activation event occurred - * - * Pops up the menu constructed from the item factory at (@x, @y). Callbacks - * can access the @popup_data while the menu is posted via - * gtk_item_factory_popup_data() and gtk_item_factory_popup_data_from_widget(). - * - * The @mouse_button parameter should be the mouse button pressed to initiate - * the menu popup. If the menu popup was initiated by something other than - * a mouse button press, such as a mouse button release or a keypress, - * @mouse_button should be 0. - * - * The @time_ parameter should be the time stamp of the event that - * initiated the popup. If such an event is not available, use - * gtk_get_current_event_time() instead. - * - * The operation of the @mouse_button and the @time_ parameters is the same - * as the @button and @activation_time parameters for gtk_menu_popup(). - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_popup_with_data (GtkItemFactory *ifactory, - gpointer popup_data, - GDestroyNotify destroy, - guint x, - guint y, - guint mouse_button, - guint32 time) -{ - MenuPos *mpos; - - g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory)); - g_return_if_fail (GTK_IS_MENU (ifactory->widget)); - - mpos = g_object_get_qdata (G_OBJECT (ifactory->widget), quark_if_menu_pos); - - if (!mpos) - { - mpos = g_new0 (MenuPos, 1); - g_object_set_qdata_full (G_OBJECT (ifactory->widget), - quark_if_menu_pos, - mpos, - g_free); - } - - mpos->x = x; - mpos->y = y; - - if (popup_data != NULL) - { - g_object_set_qdata_full (G_OBJECT (ifactory), - quark_popup_data, - popup_data, - destroy); - g_signal_connect (ifactory->widget, - "selection-done", - G_CALLBACK (ifactory_delete_popup_data), - ifactory); - } - - gtk_menu_popup (GTK_MENU (ifactory->widget), - NULL, NULL, - gtk_item_factory_menu_pos, mpos, - mouse_button, time); -} - -/** - * gtk_item_factory_set_translate_func: - * @ifactory: a #GtkItemFactory - * @func: the #GtkTranslateFunc function to be used to translate path elements - * @data: data to pass to @func and @notify - * @notify: a #GDestroyNotify function to be called when @ifactory is - * destroyed and when the translation function is changed again - * - * Sets a function to be used for translating the path elements before they - * are displayed. - * - * Deprecated: 2.4: Use #GtkUIManager instead. - */ -void -gtk_item_factory_set_translate_func (GtkItemFactory *ifactory, - GtkTranslateFunc func, - gpointer data, - GDestroyNotify notify) -{ - g_return_if_fail (ifactory != NULL); - - if (ifactory->translate_notify) - ifactory->translate_notify (ifactory->translate_data); - - ifactory->translate_func = func; - ifactory->translate_data = data; - ifactory->translate_notify = notify; -} - -#define __GTK_ITEM_FACTORY_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkitemfactory.h b/gtk/gtkitemfactory.h deleted file mode 100644 index 5c57b8032e..0000000000 --- a/gtk/gtkitemfactory.h +++ /dev/null @@ -1,236 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkItemFactory: Flexible item factory with automatic rc handling - * Copyright (C) 1998 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_ITEM_FACTORY_H__ -#define __GTK_ITEM_FACTORY_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -typedef void (*GtkPrintFunc) (gpointer func_data, - const gchar *str); -/* We use () here to mean unspecified arguments. This is deprecated - * as of C99, but we can't change it without breaking compatibility. - * (Note that if we are included from a C++ program () will mean - * (void) so an explicit cast will be needed.) - */ -typedef void (*GtkItemFactoryCallback) (); -typedef void (*GtkItemFactoryCallback1) (gpointer callback_data, - guint callback_action, - GtkWidget *widget); - -#define GTK_TYPE_ITEM_FACTORY (gtk_item_factory_get_type ()) -#define GTK_ITEM_FACTORY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_ITEM_FACTORY, GtkItemFactory)) -#define GTK_ITEM_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ITEM_FACTORY, GtkItemFactoryClass)) -#define GTK_IS_ITEM_FACTORY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_ITEM_FACTORY)) -#define GTK_IS_ITEM_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ITEM_FACTORY)) -#define GTK_ITEM_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ITEM_FACTORY, GtkItemFactoryClass)) - - -typedef struct _GtkItemFactory GtkItemFactory; -typedef struct _GtkItemFactoryClass GtkItemFactoryClass; -typedef struct _GtkItemFactoryEntry GtkItemFactoryEntry; -typedef struct _GtkItemFactoryItem GtkItemFactoryItem; - -struct _GtkItemFactory -{ - GtkObject object; - - gchar *path; - GtkAccelGroup *accel_group; - GtkWidget *widget; - GSList *items; - - GtkTranslateFunc translate_func; - gpointer translate_data; - GDestroyNotify translate_notify; -}; - -struct _GtkItemFactoryClass -{ - GtkObjectClass object_class; - - GHashTable *item_ht; - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - -struct _GtkItemFactoryEntry -{ - gchar *path; - gchar *accelerator; - - GtkItemFactoryCallback callback; - guint callback_action; - - /* possible values: - * NULL -> "<Item>" - * "" -> "<Item>" - * "<Title>" -> create a title item - * "<Item>" -> create a simple item - * "<ImageItem>" -> create an item holding an image - * "<StockItem>" -> create an item holding a stock image - * "<CheckItem>" -> create a check item - * "<ToggleItem>" -> create a toggle item - * "<RadioItem>" -> create a radio item - * <path> -> path of a radio item to link against - * "<Separator>" -> create a separator - * "<Tearoff>" -> create a tearoff separator - * "<Branch>" -> create an item to hold sub items - * "<LastBranch>" -> create a right justified item to hold sub items - */ - gchar *item_type; - - /* Extra data for some item types: - * ImageItem -> pointer to inlined pixbuf stream - * StockItem -> name of stock item - */ - gconstpointer extra_data; -}; - -struct _GtkItemFactoryItem -{ - gchar *path; - GSList *widgets; -}; - - -GType gtk_item_factory_get_type (void) G_GNUC_CONST; - -/* `container_type' must be of GTK_TYPE_MENU_BAR, GTK_TYPE_MENU, - * or GTK_TYPE_OPTION_MENU. - */ -GtkItemFactory* gtk_item_factory_new (GType container_type, - const gchar *path, - GtkAccelGroup *accel_group); -void gtk_item_factory_construct (GtkItemFactory *ifactory, - GType container_type, - const gchar *path, - GtkAccelGroup *accel_group); - -/* These functions operate on GtkItemFactoryClass basis. - */ -void gtk_item_factory_add_foreign (GtkWidget *accel_widget, - const gchar *full_path, - GtkAccelGroup *accel_group, - guint keyval, - GdkModifierType modifiers); - -GtkItemFactory* gtk_item_factory_from_widget (GtkWidget *widget); -G_CONST_RETURN gchar* gtk_item_factory_path_from_widget (GtkWidget *widget); - -GtkWidget* gtk_item_factory_get_item (GtkItemFactory *ifactory, - const gchar *path); -GtkWidget* gtk_item_factory_get_widget (GtkItemFactory *ifactory, - const gchar *path); -GtkWidget* gtk_item_factory_get_widget_by_action (GtkItemFactory *ifactory, - guint action); -GtkWidget* gtk_item_factory_get_item_by_action (GtkItemFactory *ifactory, - guint action); - -void gtk_item_factory_create_item (GtkItemFactory *ifactory, - GtkItemFactoryEntry *entry, - gpointer callback_data, - guint callback_type); -void gtk_item_factory_create_items (GtkItemFactory *ifactory, - guint n_entries, - GtkItemFactoryEntry *entries, - gpointer callback_data); -void gtk_item_factory_delete_item (GtkItemFactory *ifactory, - const gchar *path); -void gtk_item_factory_delete_entry (GtkItemFactory *ifactory, - GtkItemFactoryEntry *entry); -void gtk_item_factory_delete_entries (GtkItemFactory *ifactory, - guint n_entries, - GtkItemFactoryEntry *entries); -void gtk_item_factory_popup (GtkItemFactory *ifactory, - guint x, - guint y, - guint mouse_button, - guint32 time_); -void gtk_item_factory_popup_with_data(GtkItemFactory *ifactory, - gpointer popup_data, - GDestroyNotify destroy, - guint x, - guint y, - guint mouse_button, - guint32 time_); -gpointer gtk_item_factory_popup_data (GtkItemFactory *ifactory); -gpointer gtk_item_factory_popup_data_from_widget (GtkWidget *widget); -void gtk_item_factory_set_translate_func (GtkItemFactory *ifactory, - GtkTranslateFunc func, - gpointer data, - GDestroyNotify notify); - -/* Compatibility functions for deprecated GtkMenuFactory code - */ - -/* Used by gtk_item_factory_create_menu_entries () */ -typedef void (*GtkMenuCallback) (GtkWidget *widget, - gpointer user_data); -typedef struct { - gchar *path; - gchar *accelerator; - GtkMenuCallback callback; - gpointer callback_data; - GtkWidget *widget; -} GtkMenuEntry; - -/* Used by gtk_item_factory_callback_marshal () */ -typedef void (*GtkItemFactoryCallback2) (GtkWidget *widget, - gpointer callback_data, - guint callback_action); - -/* Used by gtk_item_factory_create_items () */ -void gtk_item_factory_create_items_ac (GtkItemFactory *ifactory, - guint n_entries, - GtkItemFactoryEntry *entries, - gpointer callback_data, - guint callback_type); - -GtkItemFactory* gtk_item_factory_from_path (const gchar *path); -void gtk_item_factory_create_menu_entries (guint n_entries, - GtkMenuEntry *entries); -void gtk_item_factories_path_delete (const gchar *ifactory_path, - const gchar *path); - -G_END_DECLS - -#endif /* !GTK_DISABLE_DEPRECATED */ - -#endif /* __GTK_ITEM_FACTORY_H__ */ - diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index 3d58d25342..611cebbf80 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -2879,17 +2879,6 @@ gtk_label_get_line_wrap_mode (GtkLabel *label) return label->wrap_mode; } - -void -gtk_label_get (GtkLabel *label, - gchar **str) -{ - g_return_if_fail (GTK_IS_LABEL (label)); - g_return_if_fail (str != NULL); - - *str = label->text; -} - static void gtk_label_destroy (GtkObject *object) { @@ -4227,36 +4216,6 @@ gtk_label_set_uline_text_internal (GtkLabel *label, g_free (pattern); } -guint -gtk_label_parse_uline (GtkLabel *label, - const gchar *str) -{ - guint keyval; - - g_return_val_if_fail (GTK_IS_LABEL (label), GDK_VoidSymbol); - g_return_val_if_fail (str != NULL, GDK_VoidSymbol); - - g_object_freeze_notify (G_OBJECT (label)); - - gtk_label_set_label_internal (label, g_strdup (str ? str : "")); - gtk_label_set_use_markup_internal (label, FALSE); - gtk_label_set_use_underline_internal (label, TRUE); - - gtk_label_recalculate (label); - - keyval = label->mnemonic_keyval; - if (keyval != GDK_VoidSymbol) - { - label->mnemonic_keyval = GDK_VoidSymbol; - gtk_label_setup_mnemonic (label, keyval); - g_object_notify (G_OBJECT (label), "mnemonic-keyval"); - } - - g_object_thaw_notify (G_OBJECT (label)); - - return keyval; -} - /** * gtk_label_set_text_with_mnemonic: * @label: a #GtkLabel diff --git a/gtk/gtklabel.h b/gtk/gtklabel.h index 88a9db7ddf..9c8cffacfd 100644 --- a/gtk/gtklabel.h +++ b/gtk/gtklabel.h @@ -23,7 +23,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -182,20 +182,6 @@ void gtk_label_set_track_visited_links (GtkLabel *label, gboolean track_links); gboolean gtk_label_get_track_visited_links (GtkLabel *label); -#ifndef GTK_DISABLE_DEPRECATED - -#define gtk_label_set gtk_label_set_text -void gtk_label_get (GtkLabel *label, - gchar **str); - -/* Convenience function to set the name and pattern by parsing - * a string with embedded underscores, and return the appropriate - * key symbol for the accelerator. - */ -guint gtk_label_parse_uline (GtkLabel *label, - const gchar *string); - -#endif /* GTK_DISABLE_DEPRECATED */ /* private */ diff --git a/gtk/gtklayout.c b/gtk/gtklayout.c index 7e3e0b9afb..868347f645 100644 --- a/gtk/gtklayout.c +++ b/gtk/gtklayout.c @@ -534,42 +534,6 @@ gtk_layout_get_size (GtkLayout *layout, *height = layout->height; } -/** - * gtk_layout_freeze: - * @layout: a #GtkLayout - * - * This is a deprecated function, it doesn't do anything useful. - **/ -void -gtk_layout_freeze (GtkLayout *layout) -{ - g_return_if_fail (GTK_IS_LAYOUT (layout)); - - layout->freeze_count++; -} - -/** - * gtk_layout_thaw: - * @layout: a #GtkLayout - * - * This is a deprecated function, it doesn't do anything useful. - **/ -void -gtk_layout_thaw (GtkLayout *layout) -{ - g_return_if_fail (GTK_IS_LAYOUT (layout)); - - if (layout->freeze_count) - { - if (!(--layout->freeze_count)) - { - gtk_widget_queue_draw (GTK_WIDGET (layout)); - gdk_window_process_updates (GTK_WIDGET (layout)->window, TRUE); - } - } - -} - /* Basic Object handling procedures */ static void diff --git a/gtk/gtklayout.h b/gtk/gtklayout.h index 0d2e6bcf54..b446fb331f 100644 --- a/gtk/gtklayout.h +++ b/gtk/gtklayout.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -119,20 +119,6 @@ void gtk_layout_set_hadjustment (GtkLayout *layout, void gtk_layout_set_vadjustment (GtkLayout *layout, GtkAdjustment *adjustment); - -#ifndef GTK_DISABLE_DEPRECATED -/* These disable and enable moving and repainting the scrolling window - * of the GtkLayout, respectively. If you want to update the layout's - * offsets but do not want it to repaint itself, you should use these - * functions. - * - * - I don't understand these are supposed to work, so I suspect - * - they don't now. OWT 1/20/98 - */ -void gtk_layout_freeze (GtkLayout *layout); -void gtk_layout_thaw (GtkLayout *layout); -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_LAYOUT_H__ */ diff --git a/gtk/gtklinkbutton.h b/gtk/gtklinkbutton.h index 4e834dae94..a5e987e27c 100644 --- a/gtk/gtklinkbutton.h +++ b/gtk/gtklinkbutton.h @@ -22,7 +22,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Cambridge, MA 02139, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtklist.c b/gtk/gtklist.c deleted file mode 100644 index db4c665831..0000000000 --- a/gtk/gtklist.c +++ /dev/null @@ -1,2587 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" -#include <string.h> /* memset */ - -#undef GTK_DISABLE_DEPRECATED -#define __GTK_LIST_C__ - -#include "gtklist.h" -#include "gtklistitem.h" -#include "gtkmain.h" -#include "gtksignal.h" -#include "gtklabel.h" -#include "gtkmarshalers.h" -#include "gtkintl.h" - -#include "gtkalias.h" - -enum { - SELECTION_CHANGED, - SELECT_CHILD, - UNSELECT_CHILD, - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_SELECTION_MODE -}; - -#define SCROLL_TIME 100 - -/*** GtkList Methods ***/ -static void gtk_list_class_init (GtkListClass *klass); -static void gtk_list_init (GtkList *list); -static void gtk_list_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_list_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -/*** GtkObject Methods ***/ -static void gtk_list_dispose (GObject *object); - -/*** GtkWidget Methods ***/ -static void gtk_list_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_list_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_list_realize (GtkWidget *widget); -static void gtk_list_unmap (GtkWidget *widget); -static void gtk_list_style_set (GtkWidget *widget, - GtkStyle *previous_style); -static gint gtk_list_motion_notify (GtkWidget *widget, - GdkEventMotion *event); -static gint gtk_list_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_list_button_release (GtkWidget *widget, - GdkEventButton *event); - -static gboolean gtk_list_focus (GtkWidget *widget, - GtkDirectionType direction); - -/*** GtkContainer Methods ***/ -static void gtk_list_add (GtkContainer *container, - GtkWidget *widget); -static void gtk_list_remove (GtkContainer *container, - GtkWidget *widget); -static void gtk_list_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); -static GtkType gtk_list_child_type (GtkContainer *container); -static void gtk_list_set_focus_child (GtkContainer *container, - GtkWidget *widget); - -/*** GtkList Private Functions ***/ -static void gtk_list_move_focus_child (GtkList *list, - GtkScrollType scroll_type, - gfloat position); -static gint gtk_list_horizontal_timeout (GtkWidget *list); -static gint gtk_list_vertical_timeout (GtkWidget *list); -static void gtk_list_remove_items_internal (GtkList *list, - GList *items, - gboolean no_unref); - -/*** GtkList Selection Methods ***/ -static void gtk_real_list_select_child (GtkList *list, - GtkWidget *child); -static void gtk_real_list_unselect_child (GtkList *list, - GtkWidget *child); - -/*** GtkList Selection Functions ***/ -static void gtk_list_set_anchor (GtkList *list, - gboolean add_mode, - gint anchor, - GtkWidget *undo_focus_child); -static void gtk_list_fake_unselect_all (GtkList *list, - GtkWidget *item); -static void gtk_list_fake_toggle_row (GtkList *list, - GtkWidget *item); -static void gtk_list_update_extended_selection (GtkList *list, - gint row); -static void gtk_list_reset_extended_selection (GtkList *list); - -/*** GtkListItem Signal Functions ***/ -static void gtk_list_signal_drag_begin (GtkWidget *widget, - GdkDragContext *context, - GtkList *list); -static void gtk_list_signal_toggle_focus_row (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_select_all (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_unselect_all (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_undo_selection (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_start_selection (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_end_selection (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_extend_selection (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection, - GtkList *list); -static void gtk_list_signal_scroll_horizontal (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - GtkList *list); -static void gtk_list_signal_scroll_vertical (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - GtkList *list); -static void gtk_list_signal_toggle_add_mode (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_item_select (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_item_deselect (GtkListItem *list_item, - GtkList *list); -static void gtk_list_signal_item_toggle (GtkListItem *list_item, - GtkList *list); - - -static void gtk_list_drag_begin (GtkWidget *widget, - GdkDragContext *context); - - -static GtkContainerClass *parent_class = NULL; -static guint list_signals[LAST_SIGNAL] = { 0 }; - -static const gchar vadjustment_key[] = "gtk-vadjustment"; -static guint vadjustment_key_id = 0; -static const gchar hadjustment_key[] = "gtk-hadjustment"; -static guint hadjustment_key_id = 0; - -GtkType -gtk_list_get_type (void) -{ - static GtkType list_type = 0; - - if (!list_type) - { - static const GtkTypeInfo list_info = - { - "GtkList", - sizeof (GtkList), - sizeof (GtkListClass), - (GtkClassInitFunc) gtk_list_class_init, - (GtkObjectInitFunc) gtk_list_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkList"); - list_type = gtk_type_unique (GTK_TYPE_CONTAINER, &list_info); - } - - return list_type; -} - -static void -gtk_list_class_init (GtkListClass *class) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (class); - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - container_class = (GtkContainerClass*) class; - - parent_class = gtk_type_class (GTK_TYPE_CONTAINER); - - vadjustment_key_id = g_quark_from_static_string (vadjustment_key); - hadjustment_key_id = g_quark_from_static_string (hadjustment_key); - - gobject_class->dispose = gtk_list_dispose; - - - object_class->set_arg = gtk_list_set_arg; - object_class->get_arg = gtk_list_get_arg; - - widget_class->unmap = gtk_list_unmap; - widget_class->style_set = gtk_list_style_set; - widget_class->realize = gtk_list_realize; - widget_class->button_press_event = gtk_list_button_press; - widget_class->button_release_event = gtk_list_button_release; - widget_class->motion_notify_event = gtk_list_motion_notify; - widget_class->size_request = gtk_list_size_request; - widget_class->size_allocate = gtk_list_size_allocate; - widget_class->drag_begin = gtk_list_drag_begin; - widget_class->focus = gtk_list_focus; - - container_class->add = gtk_list_add; - container_class->remove = gtk_list_remove; - container_class->forall = gtk_list_forall; - container_class->child_type = gtk_list_child_type; - container_class->set_focus_child = gtk_list_set_focus_child; - - class->selection_changed = NULL; - class->select_child = gtk_real_list_select_child; - class->unselect_child = gtk_real_list_unselect_child; - - list_signals[SELECTION_CHANGED] = - gtk_signal_new (I_("selection-changed"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListClass, selection_changed), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_signals[SELECT_CHILD] = - gtk_signal_new (I_("select-child"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListClass, select_child), - _gtk_marshal_VOID__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_WIDGET); - list_signals[UNSELECT_CHILD] = - gtk_signal_new (I_("unselect-child"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListClass, unselect_child), - _gtk_marshal_VOID__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_WIDGET); - - gtk_object_add_arg_type ("GtkList::selection-mode", - GTK_TYPE_SELECTION_MODE, - GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, - ARG_SELECTION_MODE); -} - -static void -gtk_list_init (GtkList *list) -{ - list->children = NULL; - list->selection = NULL; - - list->undo_selection = NULL; - list->undo_unselection = NULL; - - list->last_focus_child = NULL; - list->undo_focus_child = NULL; - - list->htimer = 0; - list->vtimer = 0; - - list->anchor = -1; - list->drag_pos = -1; - list->anchor_state = GTK_STATE_SELECTED; - - list->selection_mode = GTK_SELECTION_SINGLE; - list->drag_selection = FALSE; - list->add_mode = FALSE; -} - -static void -gtk_list_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkList *list = GTK_LIST (object); - - switch (arg_id) - { - case ARG_SELECTION_MODE: - gtk_list_set_selection_mode (list, GTK_VALUE_ENUM (*arg)); - break; - } -} - -static void -gtk_list_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkList *list = GTK_LIST (object); - - switch (arg_id) - { - case ARG_SELECTION_MODE: - GTK_VALUE_ENUM (*arg) = list->selection_mode; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -GtkWidget* -gtk_list_new (void) -{ - return GTK_WIDGET (gtk_type_new (GTK_TYPE_LIST)); -} - - -/* Private GtkObject Methods : - * - * gtk_list_dispose - */ -static void -gtk_list_dispose (GObject *object) -{ - gtk_list_clear_items (GTK_LIST (object), 0, -1); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - - -/* Private GtkWidget Methods : - * - * gtk_list_size_request - * gtk_list_size_allocate - * gtk_list_realize - * gtk_list_unmap - * gtk_list_motion_notify - * gtk_list_button_press - * gtk_list_button_release - */ -static void -gtk_list_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkList *list = GTK_LIST (widget); - GtkWidget *child; - GList *children; - - requisition->width = 0; - requisition->height = 0; - - children = list->children; - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child)) - { - GtkRequisition child_requisition; - - gtk_widget_size_request (child, &child_requisition); - - requisition->width = MAX (requisition->width, - child_requisition.width); - requisition->height += child_requisition.height; - } - } - - requisition->width += GTK_CONTAINER (list)->border_width * 2; - requisition->height += GTK_CONTAINER (list)->border_width * 2; - - requisition->width = MAX (requisition->width, 1); - requisition->height = MAX (requisition->height, 1); -} - -static void -gtk_list_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkList *list = GTK_LIST (widget); - GtkWidget *child; - GtkAllocation child_allocation; - GList *children; - - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, allocation->height); - - if (list->children) - { - child_allocation.x = GTK_CONTAINER (list)->border_width; - child_allocation.y = GTK_CONTAINER (list)->border_width; - child_allocation.width = MAX (1, (gint)allocation->width - - child_allocation.x * 2); - - children = list->children; - - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child)) - { - GtkRequisition child_requisition; - gtk_widget_get_child_requisition (child, &child_requisition); - - child_allocation.height = child_requisition.height; - - gtk_widget_size_allocate (child, &child_allocation); - - child_allocation.y += child_allocation.height; - } - } - } -} - -static void -gtk_list_realize (GtkWidget *widget) -{ - GdkWindowAttr attributes; - gint attributes_mask; - - gtk_widget_set_realized (widget, TRUE); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; - - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), - &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, widget); - - widget->style = gtk_style_attach (widget->style, widget->window); - gdk_window_set_background (widget->window, - &widget->style->base[GTK_STATE_NORMAL]); -} - -static gboolean -list_has_grab (GtkList *list) -{ - return (GTK_WIDGET_HAS_GRAB (list) && - gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (list)))); - -} - -static void -gtk_list_unmap (GtkWidget *widget) -{ - GtkList *list = GTK_LIST (widget); - - if (!gtk_widget_get_mapped (widget)) - return; - - gtk_widget_set_mapped (widget, FALSE); - - if (list_has_grab (list)) - { - gtk_list_end_drag_selection (list); - - if (list->anchor != -1 && list->selection_mode == GTK_SELECTION_MULTIPLE) - gtk_list_end_selection (list); - } - - gdk_window_hide (widget->window); -} - -static gint -gtk_list_motion_notify (GtkWidget *widget, - GdkEventMotion *event) -{ - GtkList *list = GTK_LIST (widget); - GtkWidget *item = NULL; - GtkAdjustment *adj; - GtkContainer *container; - GList *work; - gint x; - gint y; - gint row = -1; - gint focus_row = 0; - gint length = 0; - - if (!list->drag_selection || !list->children) - return FALSE; - - container = GTK_CONTAINER (widget); - - if (event->is_hint || event->window != widget->window) - gdk_window_get_pointer (widget->window, &x, &y, NULL); - else - { - x = event->x; - y = event->y; - } - - adj = gtk_object_get_data_by_id (GTK_OBJECT (list), hadjustment_key_id); - - /* horizontal autoscrolling */ - if (adj && widget->allocation.width > adj->page_size && - (x < adj->value || x >= adj->value + adj->page_size)) - { - if (list->htimer == 0) - { - list->htimer = gdk_threads_add_timeout - (SCROLL_TIME, (GSourceFunc) gtk_list_horizontal_timeout, widget); - - if (!((x < adj->value && adj->value <= 0) || - (x > adj->value + adj->page_size && - adj->value >= adj->upper - adj->page_size))) - { - gdouble value; - - if (x < adj->value) - value = adj->value + (x - adj->value) / 2 - 1; - else - value = adj->value + 1 + (x - adj->value - adj->page_size) / 2; - - gtk_adjustment_set_value (adj, - CLAMP (value, 0.0, - adj->upper - adj->page_size)); - } - } - else - return FALSE; - } - - - /* vertical autoscrolling */ - for (work = list->children; work; length++, work = work->next) - { - if (row < 0) - { - item = GTK_WIDGET (work->data); - if (item->allocation.y > y || - (item->allocation.y <= y && - item->allocation.y + item->allocation.height > y)) - row = length; - } - - if (work->data == container->focus_child) - focus_row = length; - } - - if (row < 0) - row = length - 1; - - if (list->vtimer != 0) - return FALSE; - - if (!((y < 0 && focus_row == 0) || - (y > widget->allocation.height && focus_row >= length - 1))) - list->vtimer = gdk_threads_add_timeout (SCROLL_TIME, - (GSourceFunc) gtk_list_vertical_timeout, - list); - - if (row != focus_row) - gtk_widget_grab_focus (item); - - switch (list->selection_mode) - { - case GTK_SELECTION_BROWSE: - gtk_list_select_child (list, item); - break; - case GTK_SELECTION_MULTIPLE: - gtk_list_update_extended_selection (list, row); - break; - default: - break; - } - - return FALSE; -} - -static gint -gtk_list_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - GtkList *list = GTK_LIST (widget); - GtkWidget *item; - - if (event->button != 1) - return FALSE; - - item = gtk_get_event_widget ((GdkEvent*) event); - - while (item && !GTK_IS_LIST_ITEM (item)) - item = item->parent; - - if (item && (item->parent == widget)) - { - gint last_focus_row; - gint focus_row; - - if (event->type == GDK_BUTTON_PRESS) - { - gtk_grab_add (widget); - list->drag_selection = TRUE; - } - else if (list_has_grab (list)) - gtk_list_end_drag_selection (list); - - if (!gtk_widget_has_focus(item)) - gtk_widget_grab_focus (item); - - if (list->add_mode) - { - list->add_mode = FALSE; - gtk_widget_queue_draw (item); - } - - switch (list->selection_mode) - { - case GTK_SELECTION_SINGLE: - if (event->type != GDK_BUTTON_PRESS) - gtk_list_select_child (list, item); - else - list->undo_focus_child = item; - break; - - case GTK_SELECTION_BROWSE: - break; - - case GTK_SELECTION_MULTIPLE: - focus_row = g_list_index (list->children, item); - - if (list->last_focus_child) - last_focus_row = g_list_index (list->children, - list->last_focus_child); - else - { - last_focus_row = focus_row; - list->last_focus_child = item; - } - - if (event->type != GDK_BUTTON_PRESS) - { - if (list->anchor >= 0) - { - gtk_list_update_extended_selection (list, focus_row); - gtk_list_end_selection (list); - } - gtk_list_select_child (list, item); - break; - } - - if (event->state & GDK_CONTROL_MASK) - { - if (event->state & GDK_SHIFT_MASK) - { - if (list->anchor < 0) - { - g_list_free (list->undo_selection); - g_list_free (list->undo_unselection); - list->undo_selection = NULL; - list->undo_unselection = NULL; - - list->anchor = last_focus_row; - list->drag_pos = last_focus_row; - list->undo_focus_child = list->last_focus_child; - } - gtk_list_update_extended_selection (list, focus_row); - } - else - { - if (list->anchor < 0) - gtk_list_set_anchor (list, TRUE, - focus_row, list->last_focus_child); - else - gtk_list_update_extended_selection (list, focus_row); - } - break; - } - - if (event->state & GDK_SHIFT_MASK) - { - gtk_list_set_anchor (list, FALSE, - last_focus_row, list->last_focus_child); - gtk_list_update_extended_selection (list, focus_row); - break; - } - - if (list->anchor < 0) - gtk_list_set_anchor (list, FALSE, focus_row, - list->last_focus_child); - else - gtk_list_update_extended_selection (list, focus_row); - break; - - default: - break; - } - - return TRUE; - } - - return FALSE; -} - -static gint -gtk_list_button_release (GtkWidget *widget, - GdkEventButton *event) -{ - GtkList *list = GTK_LIST (widget); - GtkWidget *item; - - /* we don't handle button 2 and 3 */ - if (event->button != 1) - return FALSE; - - if (list->drag_selection) - { - gtk_list_end_drag_selection (list); - - switch (list->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - if (!(event->state & GDK_SHIFT_MASK)) - gtk_list_end_selection (list); - break; - - case GTK_SELECTION_SINGLE: - - item = gtk_get_event_widget ((GdkEvent*) event); - - while (item && !GTK_IS_LIST_ITEM (item)) - item = item->parent; - - if (item && item->parent == widget) - { - if (list->undo_focus_child == item) - gtk_list_toggle_row (list, item); - } - list->undo_focus_child = NULL; - break; - - default: - break; - } - - return TRUE; - } - - return FALSE; -} - -static void -gtk_list_style_set (GtkWidget *widget, - GtkStyle *previous_style) -{ - GtkStyle *style; - - if (previous_style && gtk_widget_get_realized (widget)) - { - style = gtk_widget_get_style (widget); - gdk_window_set_background (gtk_widget_get_window (widget), - &style->base[gtk_widget_get_state (widget)]); - } -} - -/* GtkContainer Methods : - * gtk_list_add - * gtk_list_remove - * gtk_list_forall - * gtk_list_child_type - * gtk_list_set_focus_child - * gtk_list_focus - */ -static void -gtk_list_add (GtkContainer *container, - GtkWidget *widget) -{ - GList *item_list; - - g_return_if_fail (GTK_IS_LIST_ITEM (widget)); - - item_list = g_list_alloc (); - item_list->data = widget; - - gtk_list_append_items (GTK_LIST (container), item_list); -} - -static void -gtk_list_remove (GtkContainer *container, - GtkWidget *widget) -{ - GList *item_list; - - g_return_if_fail (container == GTK_CONTAINER (widget->parent)); - - item_list = g_list_alloc (); - item_list->data = widget; - - gtk_list_remove_items (GTK_LIST (container), item_list); - - g_list_free (item_list); -} - -static void -gtk_list_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkList *list = GTK_LIST (container); - GtkWidget *child; - GList *children; - - children = list->children; - - while (children) - { - child = children->data; - children = children->next; - - (* callback) (child, callback_data); - } -} - -static GtkType -gtk_list_child_type (GtkContainer *container) -{ - return GTK_TYPE_LIST_ITEM; -} - -static void -gtk_list_set_focus_child (GtkContainer *container, - GtkWidget *child) -{ - GtkList *list; - - g_return_if_fail (GTK_IS_LIST (container)); - - if (child) - g_return_if_fail (GTK_IS_WIDGET (child)); - - list = GTK_LIST (container); - - if (child != container->focus_child) - { - if (container->focus_child) - { - list->last_focus_child = container->focus_child; - g_object_unref (container->focus_child); - } - container->focus_child = child; - if (container->focus_child) - g_object_ref (container->focus_child); - } - - /* check for v adjustment */ - if (container->focus_child) - { - GtkAdjustment *adjustment; - - adjustment = gtk_object_get_data_by_id (GTK_OBJECT (container), - vadjustment_key_id); - if (adjustment) - gtk_adjustment_clamp_page (adjustment, - container->focus_child->allocation.y, - (container->focus_child->allocation.y + - container->focus_child->allocation.height)); - switch (list->selection_mode) - { - case GTK_SELECTION_BROWSE: - gtk_list_select_child (list, child); - break; - case GTK_SELECTION_MULTIPLE: - if (!list->last_focus_child && !list->add_mode) - { - list->undo_focus_child = list->last_focus_child; - gtk_list_unselect_all (list); - gtk_list_select_child (list, child); - } - break; - default: - break; - } - } -} - -static gboolean -gtk_list_focus (GtkWidget *widget, - GtkDirectionType direction) -{ - gint return_val = FALSE; - GtkContainer *container; - - container = GTK_CONTAINER (widget); - - if (container->focus_child == NULL || - !gtk_widget_has_focus (container->focus_child)) - { - if (GTK_LIST (container)->last_focus_child) - gtk_container_set_focus_child - (container, GTK_LIST (container)->last_focus_child); - - if (GTK_WIDGET_CLASS (parent_class)->focus) - return_val = GTK_WIDGET_CLASS (parent_class)->focus (widget, - direction); - } - - if (!return_val) - { - GtkList *list; - - list = GTK_LIST (container); - if (list->selection_mode == GTK_SELECTION_MULTIPLE && list->anchor >= 0) - gtk_list_end_selection (list); - - if (container->focus_child) - list->last_focus_child = container->focus_child; - } - - return return_val; -} - - -/* Public GtkList Methods : - * - * gtk_list_insert_items - * gtk_list_append_items - * gtk_list_prepend_items - * gtk_list_remove_items - * gtk_list_remove_items_no_unref - * gtk_list_clear_items - * - * gtk_list_child_position - */ -void -gtk_list_insert_items (GtkList *list, - GList *items, - gint position) -{ - GtkWidget *widget; - GList *tmp_list; - GList *last; - gint nchildren; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (!items) - return; - - gtk_list_end_drag_selection (list); - if (list->selection_mode == GTK_SELECTION_MULTIPLE && list->anchor >= 0) - gtk_list_end_selection (list); - - tmp_list = items; - while (tmp_list) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - - gtk_widget_set_parent (widget, GTK_WIDGET (list)); - gtk_signal_connect (GTK_OBJECT (widget), "drag-begin", - G_CALLBACK (gtk_list_signal_drag_begin), - list); - gtk_signal_connect (GTK_OBJECT (widget), "toggle-focus-row", - G_CALLBACK (gtk_list_signal_toggle_focus_row), - list); - gtk_signal_connect (GTK_OBJECT (widget), "select-all", - G_CALLBACK (gtk_list_signal_select_all), - list); - gtk_signal_connect (GTK_OBJECT (widget), "unselect-all", - G_CALLBACK (gtk_list_signal_unselect_all), - list); - gtk_signal_connect (GTK_OBJECT (widget), "undo-selection", - G_CALLBACK (gtk_list_signal_undo_selection), - list); - gtk_signal_connect (GTK_OBJECT (widget), "start-selection", - G_CALLBACK (gtk_list_signal_start_selection), - list); - gtk_signal_connect (GTK_OBJECT (widget), "end-selection", - G_CALLBACK (gtk_list_signal_end_selection), - list); - gtk_signal_connect (GTK_OBJECT (widget), "extend-selection", - G_CALLBACK (gtk_list_signal_extend_selection), - list); - gtk_signal_connect (GTK_OBJECT (widget), "scroll-horizontal", - G_CALLBACK (gtk_list_signal_scroll_horizontal), - list); - gtk_signal_connect (GTK_OBJECT (widget), "scroll-vertical", - G_CALLBACK (gtk_list_signal_scroll_vertical), - list); - gtk_signal_connect (GTK_OBJECT (widget), "toggle-add-mode", - G_CALLBACK (gtk_list_signal_toggle_add_mode), - list); - gtk_signal_connect (GTK_OBJECT (widget), "select", - G_CALLBACK (gtk_list_signal_item_select), - list); - gtk_signal_connect (GTK_OBJECT (widget), "deselect", - G_CALLBACK (gtk_list_signal_item_deselect), - list); - gtk_signal_connect (GTK_OBJECT (widget), "toggle", - G_CALLBACK (gtk_list_signal_item_toggle), - list); - } - - - nchildren = g_list_length (list->children); - if ((position < 0) || (position > nchildren)) - position = nchildren; - - if (position == nchildren) - { - if (list->children) - { - tmp_list = g_list_last (list->children); - tmp_list->next = items; - items->prev = tmp_list; - } - else - { - list->children = items; - } - } - else - { - tmp_list = g_list_nth (list->children, position); - last = g_list_last (items); - - if (tmp_list->prev) - tmp_list->prev->next = items; - last->next = tmp_list; - items->prev = tmp_list->prev; - tmp_list->prev = last; - - if (tmp_list == list->children) - list->children = items; - } - - if (list->children && !list->selection && - (list->selection_mode == GTK_SELECTION_BROWSE)) - { - widget = list->children->data; - gtk_list_select_child (list, widget); - } -} - -void -gtk_list_append_items (GtkList *list, - GList *items) -{ - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_insert_items (list, items, -1); -} - -void -gtk_list_prepend_items (GtkList *list, - GList *items) -{ - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_insert_items (list, items, 0); -} - -void -gtk_list_remove_items (GtkList *list, - GList *items) -{ - gtk_list_remove_items_internal (list, items, FALSE); -} - -void -gtk_list_remove_items_no_unref (GtkList *list, - GList *items) -{ - gtk_list_remove_items_internal (list, items, TRUE); -} - -void -gtk_list_clear_items (GtkList *list, - gint start, - gint end) -{ - GtkContainer *container; - GtkWidget *widget; - GtkWidget *new_focus_child = NULL; - GList *start_list; - GList *end_list; - GList *tmp_list; - guint nchildren; - gboolean grab_focus = FALSE; - - g_return_if_fail (GTK_IS_LIST (list)); - - nchildren = g_list_length (list->children); - - if (nchildren == 0) - return; - - if ((end < 0) || (end > nchildren)) - end = nchildren; - - if (start >= end) - return; - - container = GTK_CONTAINER (list); - - gtk_list_end_drag_selection (list); - if (list->selection_mode == GTK_SELECTION_MULTIPLE) - { - if (list->anchor >= 0) - gtk_list_end_selection (list); - - gtk_list_reset_extended_selection (list); - } - - start_list = g_list_nth (list->children, start); - end_list = g_list_nth (list->children, end); - - if (start_list->prev) - start_list->prev->next = end_list; - if (end_list && end_list->prev) - end_list->prev->next = NULL; - if (end_list) - end_list->prev = start_list->prev; - if (start_list == list->children) - list->children = end_list; - - if (container->focus_child) - { - if (g_list_find (start_list, container->focus_child)) - { - if (start_list->prev) - new_focus_child = start_list->prev->data; - else if (list->children) - new_focus_child = list->children->data; - - if (gtk_widget_has_focus (container->focus_child)) - grab_focus = TRUE; - } - } - - tmp_list = start_list; - while (tmp_list) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - - g_object_ref (widget); - - if (widget->state == GTK_STATE_SELECTED) - gtk_list_unselect_child (list, widget); - - gtk_signal_disconnect_by_data (GTK_OBJECT (widget), (gpointer) list); - gtk_widget_unparent (widget); - - if (widget == list->undo_focus_child) - list->undo_focus_child = NULL; - if (widget == list->last_focus_child) - list->last_focus_child = NULL; - - g_object_unref (widget); - } - - g_list_free (start_list); - - if (new_focus_child) - { - if (grab_focus) - gtk_widget_grab_focus (new_focus_child); - else if (container->focus_child) - gtk_container_set_focus_child (container, new_focus_child); - - if ((list->selection_mode == GTK_SELECTION_BROWSE || - list->selection_mode == GTK_SELECTION_MULTIPLE) && !list->selection) - { - list->last_focus_child = new_focus_child; - gtk_list_select_child (list, new_focus_child); - } - } - - if (gtk_widget_get_visible (GTK_WIDGET (list))) - gtk_widget_queue_resize (GTK_WIDGET (list)); -} - -gint -gtk_list_child_position (GtkList *list, - GtkWidget *child) -{ - GList *children; - gint pos; - - g_return_val_if_fail (GTK_IS_LIST (list), -1); - g_return_val_if_fail (child != NULL, -1); - - pos = 0; - children = list->children; - - while (children) - { - if (child == GTK_WIDGET (children->data)) - return pos; - - pos += 1; - children = children->next; - } - - return -1; -} - - -/* Private GtkList Insert/Remove Item Functions: - * - * gtk_list_remove_items_internal - */ -static void -gtk_list_remove_items_internal (GtkList *list, - GList *items, - gboolean no_unref) -{ - GtkWidget *widget; - GtkWidget *new_focus_child; - GtkWidget *old_focus_child; - GtkContainer *container; - GList *tmp_list; - GList *work; - gboolean grab_focus = FALSE; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (!items) - return; - - container = GTK_CONTAINER (list); - - gtk_list_end_drag_selection (list); - if (list->selection_mode == GTK_SELECTION_MULTIPLE) - { - if (list->anchor >= 0) - gtk_list_end_selection (list); - - gtk_list_reset_extended_selection (list); - } - - tmp_list = items; - while (tmp_list) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - - if (widget->state == GTK_STATE_SELECTED) - gtk_list_unselect_child (list, widget); - } - - if (container->focus_child) - { - old_focus_child = new_focus_child = container->focus_child; - if (gtk_widget_has_focus (container->focus_child)) - grab_focus = TRUE; - } - else - old_focus_child = new_focus_child = list->last_focus_child; - - tmp_list = items; - while (tmp_list) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - - g_object_ref (widget); - if (no_unref) - g_object_ref (widget); - - if (widget == new_focus_child) - { - work = g_list_find (list->children, widget); - - if (work) - { - if (work->next) - new_focus_child = work->next->data; - else if (list->children != work && work->prev) - new_focus_child = work->prev->data; - else - new_focus_child = NULL; - } - } - - gtk_signal_disconnect_by_data (GTK_OBJECT (widget), (gpointer) list); - list->children = g_list_remove (list->children, widget); - gtk_widget_unparent (widget); - - if (widget == list->undo_focus_child) - list->undo_focus_child = NULL; - if (widget == list->last_focus_child) - list->last_focus_child = NULL; - - g_object_unref (widget); - } - - if (new_focus_child && new_focus_child != old_focus_child) - { - if (grab_focus) - gtk_widget_grab_focus (new_focus_child); - else if (container->focus_child) - gtk_container_set_focus_child (container, new_focus_child); - - if (list->selection_mode == GTK_SELECTION_BROWSE && !list->selection) - { - list->last_focus_child = new_focus_child; - gtk_list_select_child (list, new_focus_child); - } - } - - if (gtk_widget_get_visible (GTK_WIDGET (list))) - gtk_widget_queue_resize (GTK_WIDGET (list)); -} - - -/* Public GtkList Selection Methods : - * - * gtk_list_set_selection_mode - * gtk_list_select_item - * gtk_list_unselect_item - * gtk_list_select_child - * gtk_list_unselect_child - * gtk_list_select_all - * gtk_list_unselect_all - * gtk_list_extend_selection - * gtk_list_end_drag_selection - * gtk_list_start_selection - * gtk_list_end_selection - * gtk_list_toggle_row - * gtk_list_toggle_focus_row - * gtk_list_toggle_add_mode - * gtk_list_undo_selection - */ -void -gtk_list_set_selection_mode (GtkList *list, - GtkSelectionMode mode) -{ - g_return_if_fail (GTK_IS_LIST (list)); - - if (list->selection_mode == mode) - return; - - list->selection_mode = mode; - - switch (mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - gtk_list_unselect_all (list); - break; - default: - break; - } -} - -void -gtk_list_select_item (GtkList *list, - gint item) -{ - GList *tmp_list; - - g_return_if_fail (GTK_IS_LIST (list)); - - tmp_list = g_list_nth (list->children, item); - if (tmp_list) - gtk_list_select_child (list, GTK_WIDGET (tmp_list->data)); -} - -void -gtk_list_unselect_item (GtkList *list, - gint item) -{ - GList *tmp_list; - - g_return_if_fail (GTK_IS_LIST (list)); - - tmp_list = g_list_nth (list->children, item); - if (tmp_list) - gtk_list_unselect_child (list, GTK_WIDGET (tmp_list->data)); -} - -void -gtk_list_select_child (GtkList *list, - GtkWidget *child) -{ - gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECT_CHILD], child); -} - -void -gtk_list_unselect_child (GtkList *list, - GtkWidget *child) -{ - gtk_signal_emit (GTK_OBJECT (list), list_signals[UNSELECT_CHILD], child); -} - -void -gtk_list_select_all (GtkList *list) -{ - GtkContainer *container; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (!list->children) - return; - - if (list_has_grab (list)) - gtk_list_end_drag_selection (list); - - if (list->selection_mode == GTK_SELECTION_MULTIPLE && list->anchor >= 0) - gtk_list_end_selection (list); - - container = GTK_CONTAINER (list); - - switch (list->selection_mode) - { - case GTK_SELECTION_BROWSE: - if (container->focus_child) - { - gtk_list_select_child (list, container->focus_child); - return; - } - break; - case GTK_SELECTION_MULTIPLE: - g_list_free (list->undo_selection); - g_list_free (list->undo_unselection); - list->undo_selection = NULL; - list->undo_unselection = NULL; - - if (list->children && - gtk_widget_get_state (list->children->data) != GTK_STATE_SELECTED) - gtk_list_fake_toggle_row (list, GTK_WIDGET (list->children->data)); - - list->anchor_state = GTK_STATE_SELECTED; - list->anchor = 0; - list->drag_pos = 0; - list->undo_focus_child = container->focus_child; - gtk_list_update_extended_selection (list, g_list_length(list->children)); - gtk_list_end_selection (list); - return; - default: - break; - } -} - -void -gtk_list_unselect_all (GtkList *list) -{ - GtkContainer *container; - GtkWidget *item; - GList *work; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (!list->children) - return; - - if (list_has_grab (list)) - gtk_list_end_drag_selection (list); - - if (list->selection_mode == GTK_SELECTION_MULTIPLE && list->anchor >= 0) - gtk_list_end_selection (list); - - container = GTK_CONTAINER (list); - - switch (list->selection_mode) - { - case GTK_SELECTION_BROWSE: - if (container->focus_child) - { - gtk_list_select_child (list, container->focus_child); - return; - } - break; - case GTK_SELECTION_MULTIPLE: - gtk_list_reset_extended_selection (list); - break; - default: - break; - } - - work = list->selection; - - while (work) - { - item = work->data; - work = work->next; - gtk_list_unselect_child (list, item); - } -} - -void -gtk_list_extend_selection (GtkList *list, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection) -{ - GtkContainer *container; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (list_has_grab (list) || - list->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - container = GTK_CONTAINER (list); - - if (auto_start_selection) - { - gint focus_row; - - focus_row = g_list_index (list->children, container->focus_child); - gtk_list_set_anchor (list, list->add_mode, focus_row, - container->focus_child); - } - else if (list->anchor < 0) - return; - - gtk_list_move_focus_child (list, scroll_type, position); - gtk_list_update_extended_selection - (list, g_list_index (list->children, container->focus_child)); -} - -void -gtk_list_end_drag_selection (GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST (list)); - - list->drag_selection = FALSE; - if (GTK_WIDGET_HAS_GRAB (list)) - gtk_grab_remove (GTK_WIDGET (list)); - - if (list->htimer) - { - g_source_remove (list->htimer); - list->htimer = 0; - } - if (list->vtimer) - { - g_source_remove (list->vtimer); - list->vtimer = 0; - } -} - -void -gtk_list_start_selection (GtkList *list) -{ - GtkContainer *container; - gint focus_row; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (list_has_grab (list)) - return; - - container = GTK_CONTAINER (list); - - if ((focus_row = g_list_index (list->selection, container->focus_child)) - >= 0) - gtk_list_set_anchor (list, list->add_mode, - focus_row, container->focus_child); -} - -void -gtk_list_end_selection (GtkList *list) -{ - gint i; - gint e; - gboolean top_down; - GList *work; - GtkWidget *item; - gint item_index; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (list_has_grab (list) || list->anchor < 0) - return; - - i = MIN (list->anchor, list->drag_pos); - e = MAX (list->anchor, list->drag_pos); - - top_down = (list->anchor < list->drag_pos); - - list->anchor = -1; - list->drag_pos = -1; - - if (list->undo_selection) - { - work = list->selection; - list->selection = list->undo_selection; - list->undo_selection = work; - work = list->selection; - while (work) - { - item = work->data; - work = work->next; - item_index = g_list_index (list->children, item); - if (item_index < i || item_index > e) - { - gtk_widget_set_state (item, GTK_STATE_SELECTED); - gtk_list_unselect_child (list, item); - list->undo_selection = g_list_prepend (list->undo_selection, - item); - } - } - } - - if (top_down) - { - for (work = g_list_nth (list->children, i); i <= e; - i++, work = work->next) - { - item = work->data; - if (g_list_find (list->selection, item)) - { - if (item->state == GTK_STATE_NORMAL) - { - gtk_widget_set_state (item, GTK_STATE_SELECTED); - gtk_list_unselect_child (list, item); - list->undo_selection = g_list_prepend (list->undo_selection, - item); - } - } - else if (item->state == GTK_STATE_SELECTED) - { - gtk_widget_set_state (item, GTK_STATE_NORMAL); - list->undo_unselection = g_list_prepend (list->undo_unselection, - item); - } - } - } - else - { - for (work = g_list_nth (list->children, e); i <= e; - e--, work = work->prev) - { - item = work->data; - if (g_list_find (list->selection, item)) - { - if (item->state == GTK_STATE_NORMAL) - { - gtk_widget_set_state (item, GTK_STATE_SELECTED); - gtk_list_unselect_child (list, item); - list->undo_selection = g_list_prepend (list->undo_selection, - item); - } - } - else if (item->state == GTK_STATE_SELECTED) - { - gtk_widget_set_state (item, GTK_STATE_NORMAL); - list->undo_unselection = g_list_prepend (list->undo_unselection, - item); - } - } - } - - for (work = g_list_reverse (list->undo_unselection); work; work = work->next) - gtk_list_select_child (list, GTK_WIDGET (work->data)); - - -} - -void -gtk_list_toggle_row (GtkList *list, - GtkWidget *item) -{ - g_return_if_fail (GTK_IS_LIST (list)); - g_return_if_fail (GTK_IS_LIST_ITEM (item)); - - switch (list->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - case GTK_SELECTION_SINGLE: - if (item->state == GTK_STATE_SELECTED) - { - gtk_list_unselect_child (list, item); - return; - } - case GTK_SELECTION_BROWSE: - gtk_list_select_child (list, item); - break; - } -} - -void -gtk_list_toggle_focus_row (GtkList *list) -{ - GtkContainer *container; - gint focus_row; - - g_return_if_fail (list != 0); - g_return_if_fail (GTK_IS_LIST (list)); - - container = GTK_CONTAINER (list); - - if (list_has_grab (list) || !container->focus_child) - return; - - switch (list->selection_mode) - { - case GTK_SELECTION_SINGLE: - gtk_list_toggle_row (list, container->focus_child); - break; - case GTK_SELECTION_MULTIPLE: - if ((focus_row = g_list_index (list->children, container->focus_child)) - < 0) - return; - - g_list_free (list->undo_selection); - g_list_free (list->undo_unselection); - list->undo_selection = NULL; - list->undo_unselection = NULL; - - list->anchor = focus_row; - list->drag_pos = focus_row; - list->undo_focus_child = container->focus_child; - - if (list->add_mode) - gtk_list_fake_toggle_row (list, container->focus_child); - else - gtk_list_fake_unselect_all (list, container->focus_child); - - gtk_list_end_selection (list); - break; - default: - break; - } -} - -void -gtk_list_toggle_add_mode (GtkList *list) -{ - GtkContainer *container; - - g_return_if_fail (list != 0); - g_return_if_fail (GTK_IS_LIST (list)); - - if (list_has_grab (list) || - list->selection_mode != GTK_SELECTION_MULTIPLE) - return; - - container = GTK_CONTAINER (list); - - if (list->add_mode) - { - list->add_mode = FALSE; - list->anchor_state = GTK_STATE_SELECTED; - } - else - list->add_mode = TRUE; - - if (container->focus_child) - gtk_widget_queue_draw (container->focus_child); -} - -void -gtk_list_undo_selection (GtkList *list) -{ - GList *work; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (list->selection_mode != GTK_SELECTION_MULTIPLE || - list_has_grab (list)) - return; - - if (list->anchor >= 0) - gtk_list_end_selection (list); - - if (!(list->undo_selection || list->undo_unselection)) - { - gtk_list_unselect_all (list); - return; - } - - for (work = list->undo_selection; work; work = work->next) - gtk_list_select_child (list, GTK_WIDGET (work->data)); - - for (work = list->undo_unselection; work; work = work->next) - gtk_list_unselect_child (list, GTK_WIDGET (work->data)); - - if (list->undo_focus_child) - { - GtkContainer *container; - - container = GTK_CONTAINER (list); - - if (container->focus_child && - gtk_widget_has_focus (container->focus_child)) - gtk_widget_grab_focus (list->undo_focus_child); - else - gtk_container_set_focus_child (container, list->undo_focus_child); - } - - list->undo_focus_child = NULL; - - g_list_free (list->undo_selection); - g_list_free (list->undo_unselection); - list->undo_selection = NULL; - list->undo_unselection = NULL; -} - - -/* Private GtkList Selection Methods : - * - * gtk_real_list_select_child - * gtk_real_list_unselect_child - */ -static void -gtk_real_list_select_child (GtkList *list, - GtkWidget *child) -{ - g_return_if_fail (GTK_IS_LIST (list)); - g_return_if_fail (GTK_IS_LIST_ITEM (child)); - - switch (child->state) - { - case GTK_STATE_SELECTED: - case GTK_STATE_INSENSITIVE: - break; - default: - gtk_list_item_select (GTK_LIST_ITEM (child)); - break; - } -} - -static void -gtk_real_list_unselect_child (GtkList *list, - GtkWidget *child) -{ - g_return_if_fail (GTK_IS_LIST (list)); - g_return_if_fail (GTK_IS_LIST_ITEM (child)); - - if (child->state == GTK_STATE_SELECTED) - gtk_list_item_deselect (GTK_LIST_ITEM (child)); -} - - -/* Private GtkList Selection Functions : - * - * gtk_list_set_anchor - * gtk_list_fake_unselect_all - * gtk_list_fake_toggle_row - * gtk_list_update_extended_selection - * gtk_list_reset_extended_selection - */ -static void -gtk_list_set_anchor (GtkList *list, - gboolean add_mode, - gint anchor, - GtkWidget *undo_focus_child) -{ - GList *work; - - g_return_if_fail (GTK_IS_LIST (list)); - - if (list->selection_mode != GTK_SELECTION_MULTIPLE || list->anchor >= 0) - return; - - g_list_free (list->undo_selection); - g_list_free (list->undo_unselection); - list->undo_selection = NULL; - list->undo_unselection = NULL; - - if ((work = g_list_nth (list->children, anchor))) - { - if (add_mode) - gtk_list_fake_toggle_row (list, GTK_WIDGET (work->data)); - else - { - gtk_list_fake_unselect_all (list, GTK_WIDGET (work->data)); - list->anchor_state = GTK_STATE_SELECTED; - } - } - - list->anchor = anchor; - list->drag_pos = anchor; - list->undo_focus_child = undo_focus_child; -} - -static void -gtk_list_fake_unselect_all (GtkList *list, - GtkWidget *item) -{ - GList *work; - - if (item && item->state == GTK_STATE_NORMAL) - gtk_widget_set_state (item, GTK_STATE_SELECTED); - - list->undo_selection = list->selection; - list->selection = NULL; - - for (work = list->undo_selection; work; work = work->next) - if (work->data != item) - gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_NORMAL); -} - -static void -gtk_list_fake_toggle_row (GtkList *list, - GtkWidget *item) -{ - if (!item) - return; - - if (item->state == GTK_STATE_NORMAL) - { - list->anchor_state = GTK_STATE_SELECTED; - gtk_widget_set_state (item, GTK_STATE_SELECTED); - } - else - { - list->anchor_state = GTK_STATE_NORMAL; - gtk_widget_set_state (item, GTK_STATE_NORMAL); - } -} - -static void -gtk_list_update_extended_selection (GtkList *list, - gint row) -{ - gint i; - GList *work; - gint s1 = -1; - gint s2 = -1; - gint e1 = -1; - gint e2 = -1; - gint length; - - if (row < 0) - row = 0; - - length = g_list_length (list->children); - if (row >= length) - row = length - 1; - - if (list->selection_mode != GTK_SELECTION_MULTIPLE || !list->anchor < 0) - return; - - /* extending downwards */ - if (row > list->drag_pos && list->anchor <= list->drag_pos) - { - s2 = list->drag_pos + 1; - e2 = row; - } - /* extending upwards */ - else if (row < list->drag_pos && list->anchor >= list->drag_pos) - { - s2 = row; - e2 = list->drag_pos - 1; - } - else if (row < list->drag_pos && list->anchor < list->drag_pos) - { - e1 = list->drag_pos; - /* row and drag_pos on different sides of anchor : - take back the selection between anchor and drag_pos, - select between anchor and row */ - if (row < list->anchor) - { - s1 = list->anchor + 1; - s2 = row; - e2 = list->anchor - 1; - } - /* take back the selection between anchor and drag_pos */ - else - s1 = row + 1; - } - else if (row > list->drag_pos && list->anchor > list->drag_pos) - { - s1 = list->drag_pos; - /* row and drag_pos on different sides of anchor : - take back the selection between anchor and drag_pos, - select between anchor and row */ - if (row > list->anchor) - { - e1 = list->anchor - 1; - s2 = list->anchor + 1; - e2 = row; - } - /* take back the selection between anchor and drag_pos */ - else - e1 = row - 1; - } - - list->drag_pos = row; - - /* restore the elements between s1 and e1 */ - if (s1 >= 0) - { - for (i = s1, work = g_list_nth (list->children, i); i <= e1; - i++, work = work->next) - { - if (g_list_find (list->selection, work->data)) - gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_SELECTED); - else - gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_NORMAL); - } - } - - /* extend the selection between s2 and e2 */ - if (s2 >= 0) - { - for (i = s2, work = g_list_nth (list->children, i); i <= e2; - i++, work = work->next) - if (GTK_WIDGET (work->data)->state != list->anchor_state) - gtk_widget_set_state (GTK_WIDGET (work->data), list->anchor_state); - } -} - -static void -gtk_list_reset_extended_selection (GtkList *list) -{ - g_return_if_fail (list != 0); - g_return_if_fail (GTK_IS_LIST (list)); - - g_list_free (list->undo_selection); - g_list_free (list->undo_unselection); - list->undo_selection = NULL; - list->undo_unselection = NULL; - - list->anchor = -1; - list->drag_pos = -1; - list->undo_focus_child = GTK_CONTAINER (list)->focus_child; -} - -/* Public GtkList Scroll Methods : - * - * gtk_list_scroll_horizontal - * gtk_list_scroll_vertical - */ -void -gtk_list_scroll_horizontal (GtkList *list, - GtkScrollType scroll_type, - gfloat position) -{ - GtkAdjustment *adj; - - g_return_if_fail (list != 0); - g_return_if_fail (GTK_IS_LIST (list)); - - if (list_has_grab (list)) - return; - - if (!(adj = - gtk_object_get_data_by_id (GTK_OBJECT (list), hadjustment_key_id))) - return; - - switch (scroll_type) - { - case GTK_SCROLL_STEP_UP: - case GTK_SCROLL_STEP_BACKWARD: - adj->value = CLAMP (adj->value - adj->step_increment, adj->lower, - adj->upper - adj->page_size); - break; - case GTK_SCROLL_STEP_DOWN: - case GTK_SCROLL_STEP_FORWARD: - adj->value = CLAMP (adj->value + adj->step_increment, adj->lower, - adj->upper - adj->page_size); - break; - case GTK_SCROLL_PAGE_UP: - case GTK_SCROLL_PAGE_BACKWARD: - adj->value = CLAMP (adj->value - adj->page_increment, adj->lower, - adj->upper - adj->page_size); - break; - case GTK_SCROLL_PAGE_DOWN: - case GTK_SCROLL_PAGE_FORWARD: - adj->value = CLAMP (adj->value + adj->page_increment, adj->lower, - adj->upper - adj->page_size); - break; - case GTK_SCROLL_JUMP: - adj->value = CLAMP (adj->lower + (adj->upper - adj->lower) * position, - adj->lower, adj->upper - adj->page_size); - break; - default: - break; - } - gtk_adjustment_value_changed (adj); -} - -void -gtk_list_scroll_vertical (GtkList *list, - GtkScrollType scroll_type, - gfloat position) -{ - g_return_if_fail (GTK_IS_LIST (list)); - - if (list_has_grab (list)) - return; - - if (list->selection_mode == GTK_SELECTION_MULTIPLE) - { - GtkContainer *container; - - if (list->anchor >= 0) - return; - - container = GTK_CONTAINER (list); - list->undo_focus_child = container->focus_child; - gtk_list_move_focus_child (list, scroll_type, position); - if (container->focus_child != list->undo_focus_child && !list->add_mode) - { - gtk_list_unselect_all (list); - gtk_list_select_child (list, container->focus_child); - } - } - else - gtk_list_move_focus_child (list, scroll_type, position); -} - - -/* Private GtkList Scroll/Focus Functions : - * - * gtk_list_move_focus_child - * gtk_list_horizontal_timeout - * gtk_list_vertical_timeout - */ -static void -gtk_list_move_focus_child (GtkList *list, - GtkScrollType scroll_type, - gfloat position) -{ - GtkContainer *container; - GList *work; - GtkWidget *item; - GtkAdjustment *adj; - gint new_value; - - g_return_if_fail (list != 0); - g_return_if_fail (GTK_IS_LIST (list)); - - container = GTK_CONTAINER (list); - - if (container->focus_child) - work = g_list_find (list->children, container->focus_child); - else - work = list->children; - - if (!work) - return; - - switch (scroll_type) - { - case GTK_SCROLL_STEP_BACKWARD: - work = work->prev; - if (work) - gtk_widget_grab_focus (GTK_WIDGET (work->data)); - break; - case GTK_SCROLL_STEP_FORWARD: - work = work->next; - if (work) - gtk_widget_grab_focus (GTK_WIDGET (work->data)); - break; - case GTK_SCROLL_PAGE_BACKWARD: - if (!work->prev) - return; - - item = work->data; - adj = gtk_object_get_data_by_id (GTK_OBJECT (list), vadjustment_key_id); - - if (adj) - { - gboolean correct = FALSE; - - new_value = adj->value; - - if (item->allocation.y <= adj->value) - { - new_value = MAX (item->allocation.y + item->allocation.height - - adj->page_size, adj->lower); - correct = TRUE; - } - - if (item->allocation.y > new_value) - for (; work; work = work->prev) - { - item = GTK_WIDGET (work->data); - if (item->allocation.y <= new_value && - item->allocation.y + item->allocation.height > new_value) - break; - } - else - for (; work; work = work->next) - { - item = GTK_WIDGET (work->data); - if (item->allocation.y <= new_value && - item->allocation.y + item->allocation.height > new_value) - break; - } - - if (correct && work && work->next && item->allocation.y < new_value) - item = work->next->data; - } - else - item = list->children->data; - - gtk_widget_grab_focus (item); - break; - case GTK_SCROLL_PAGE_FORWARD: - if (!work->next) - return; - - item = work->data; - adj = gtk_object_get_data_by_id (GTK_OBJECT (list), vadjustment_key_id); - - if (adj) - { - gboolean correct = FALSE; - - new_value = adj->value; - - if (item->allocation.y + item->allocation.height >= - adj->value + adj->page_size) - { - new_value = item->allocation.y; - correct = TRUE; - } - - new_value = MIN (new_value + adj->page_size, adj->upper); - - if (item->allocation.y > new_value) - for (; work; work = work->prev) - { - item = GTK_WIDGET (work->data); - if (item->allocation.y <= new_value && - item->allocation.y + item->allocation.height > new_value) - break; - } - else - for (; work; work = work->next) - { - item = GTK_WIDGET (work->data); - if (item->allocation.y <= new_value && - item->allocation.y + item->allocation.height > new_value) - break; - } - - if (correct && work && work->prev && - item->allocation.y + item->allocation.height - 1 > new_value) - item = work->prev->data; - } - else - item = g_list_last (work)->data; - - gtk_widget_grab_focus (item); - break; - case GTK_SCROLL_JUMP: - new_value = GTK_WIDGET(list)->allocation.height * CLAMP (position, 0, 1); - - for (item = NULL, work = list->children; work; work =work->next) - { - item = GTK_WIDGET (work->data); - if (item->allocation.y <= new_value && - item->allocation.y + item->allocation.height > new_value) - break; - } - - gtk_widget_grab_focus (item); - break; - default: - break; - } -} - -static void -do_fake_motion (GtkWidget *list) -{ - GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY); - - event->motion.send_event = TRUE; - - gtk_list_motion_notify (list, (GdkEventMotion *)event); - gdk_event_free (event); -} - -static gint -gtk_list_horizontal_timeout (GtkWidget *list) -{ - GTK_LIST (list)->htimer = 0; - do_fake_motion (list); - - return FALSE; -} - -static gint -gtk_list_vertical_timeout (GtkWidget *list) -{ - GTK_LIST (list)->vtimer = 0; - do_fake_motion (list); - - return FALSE; -} - - -/* Private GtkListItem Signal Functions : - * - * gtk_list_signal_toggle_focus_row - * gtk_list_signal_select_all - * gtk_list_signal_unselect_all - * gtk_list_signal_undo_selection - * gtk_list_signal_start_selection - * gtk_list_signal_end_selection - * gtk_list_signal_extend_selection - * gtk_list_signal_scroll_horizontal - * gtk_list_signal_scroll_vertical - * gtk_list_signal_toggle_add_mode - * gtk_list_signal_item_select - * gtk_list_signal_item_deselect - * gtk_list_signal_item_toggle - */ -static void -gtk_list_signal_toggle_focus_row (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_toggle_focus_row (list); -} - -static void -gtk_list_signal_select_all (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_select_all (list); -} - -static void -gtk_list_signal_unselect_all (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_unselect_all (list); -} - -static void -gtk_list_signal_undo_selection (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_undo_selection (list); -} - -static void -gtk_list_signal_start_selection (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_start_selection (list); -} - -static void -gtk_list_signal_end_selection (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_end_selection (list); -} - -static void -gtk_list_signal_extend_selection (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_extend_selection (list, scroll_type, position, - auto_start_selection); -} - -static void -gtk_list_signal_scroll_horizontal (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_scroll_horizontal (list, scroll_type, position); -} - -static void -gtk_list_signal_scroll_vertical (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_scroll_vertical (list, scroll_type, position); -} - -static void -gtk_list_signal_toggle_add_mode (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_toggle_add_mode (list); -} - -static void -gtk_list_signal_item_select (GtkListItem *list_item, - GtkList *list) -{ - GList *selection; - GList *tmp_list; - GList *sel_list; - - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - if (GTK_WIDGET (list_item)->state != GTK_STATE_SELECTED) - return; - - switch (list->selection_mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - sel_list = NULL; - selection = list->selection; - - while (selection) - { - tmp_list = selection; - selection = selection->next; - - if (tmp_list->data == list_item) - sel_list = tmp_list; - else - gtk_list_item_deselect (GTK_LIST_ITEM (tmp_list->data)); - } - - if (!sel_list) - { - list->selection = g_list_prepend (list->selection, list_item); - g_object_ref (list_item); - } - gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]); - break; - case GTK_SELECTION_MULTIPLE: - if (list->anchor >= 0) - return; - } -} - -static void -gtk_list_signal_item_deselect (GtkListItem *list_item, - GtkList *list) -{ - GList *node; - - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - if (GTK_WIDGET (list_item)->state != GTK_STATE_NORMAL) - return; - - node = g_list_find (list->selection, list_item); - - if (node) - { - list->selection = g_list_remove_link (list->selection, node); - g_list_free_1 (node); - g_object_unref (list_item); - gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECTION_CHANGED]); - } -} - -static void -gtk_list_signal_item_toggle (GtkListItem *list_item, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); - g_return_if_fail (GTK_IS_LIST (list)); - - if ((list->selection_mode == GTK_SELECTION_BROWSE || - list->selection_mode == GTK_SELECTION_MULTIPLE) && - GTK_WIDGET (list_item)->state == GTK_STATE_NORMAL) - { - gtk_widget_set_state (GTK_WIDGET (list_item), GTK_STATE_SELECTED); - return; - } - - switch (GTK_WIDGET (list_item)->state) - { - case GTK_STATE_SELECTED: - gtk_list_signal_item_select (list_item, list); - break; - case GTK_STATE_NORMAL: - gtk_list_signal_item_deselect (list_item, list); - break; - default: - break; - } -} - -static void -gtk_list_signal_drag_begin (GtkWidget *widget, - GdkDragContext *context, - GtkList *list) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (widget)); - g_return_if_fail (GTK_IS_LIST (list)); - - gtk_list_drag_begin (GTK_WIDGET (list), context); -} - -static void -gtk_list_drag_begin (GtkWidget *widget, - GdkDragContext *context) -{ - GtkList *list; - - g_return_if_fail (GTK_IS_LIST (widget)); - g_return_if_fail (context != NULL); - - list = GTK_LIST (widget); - - if (list->drag_selection) - { - gtk_list_end_drag_selection (list); - - switch (list->selection_mode) - { - case GTK_SELECTION_MULTIPLE: - gtk_list_end_selection (list); - break; - case GTK_SELECTION_SINGLE: - list->undo_focus_child = NULL; - break; - default: - break; - } - } -} - -#include "gtkaliasdef.c" diff --git a/gtk/gtklist.h b/gtk/gtklist.h deleted file mode 100644 index 3a2f13f13b..0000000000 --- a/gtk/gtklist.h +++ /dev/null @@ -1,138 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#if !defined (GTK_DISABLE_DEPRECATED) || defined (__GTK_LIST_C__) - -#ifndef __GTK_LIST_H__ -#define __GTK_LIST_H__ - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GTK_TYPE_LIST (gtk_list_get_type ()) -#define GTK_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LIST, GtkList)) -#define GTK_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_LIST, GtkListClass)) -#define GTK_IS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_LIST)) -#define GTK_IS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LIST)) -#define GTK_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LIST, GtkListClass)) - - -typedef struct _GtkList GtkList; -typedef struct _GtkListClass GtkListClass; - -struct _GtkList -{ - GtkContainer container; - - GList *children; - GList *selection; - - GList *undo_selection; - GList *undo_unselection; - - GtkWidget *last_focus_child; - GtkWidget *undo_focus_child; - - guint htimer; - guint vtimer; - - gint anchor; - gint drag_pos; - GtkStateType anchor_state; - - guint selection_mode : 2; - guint drag_selection:1; - guint add_mode:1; -}; - -struct _GtkListClass -{ - GtkContainerClass parent_class; - - void (* selection_changed) (GtkList *list); - void (* select_child) (GtkList *list, - GtkWidget *child); - void (* unselect_child) (GtkList *list, - GtkWidget *child); -}; - - -GType gtk_list_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_list_new (void); -void gtk_list_insert_items (GtkList *list, - GList *items, - gint position); -void gtk_list_append_items (GtkList *list, - GList *items); -void gtk_list_prepend_items (GtkList *list, - GList *items); -void gtk_list_remove_items (GtkList *list, - GList *items); -void gtk_list_remove_items_no_unref (GtkList *list, - GList *items); -void gtk_list_clear_items (GtkList *list, - gint start, - gint end); -void gtk_list_select_item (GtkList *list, - gint item); -void gtk_list_unselect_item (GtkList *list, - gint item); -void gtk_list_select_child (GtkList *list, - GtkWidget *child); -void gtk_list_unselect_child (GtkList *list, - GtkWidget *child); -gint gtk_list_child_position (GtkList *list, - GtkWidget *child); -void gtk_list_set_selection_mode (GtkList *list, - GtkSelectionMode mode); - -void gtk_list_extend_selection (GtkList *list, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection); -void gtk_list_start_selection (GtkList *list); -void gtk_list_end_selection (GtkList *list); -void gtk_list_select_all (GtkList *list); -void gtk_list_unselect_all (GtkList *list); -void gtk_list_scroll_horizontal (GtkList *list, - GtkScrollType scroll_type, - gfloat position); -void gtk_list_scroll_vertical (GtkList *list, - GtkScrollType scroll_type, - gfloat position); -void gtk_list_toggle_add_mode (GtkList *list); -void gtk_list_toggle_focus_row (GtkList *list); -void gtk_list_toggle_row (GtkList *list, - GtkWidget *item); -void gtk_list_undo_selection (GtkList *list); -void gtk_list_end_drag_selection (GtkList *list); - -G_END_DECLS - -#endif /* __GTK_LIST_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtklistitem.c b/gtk/gtklistitem.c deleted file mode 100644 index 4615841525..0000000000 --- a/gtk/gtklistitem.c +++ /dev/null @@ -1,635 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <gdk/gdkkeysyms.h> - -#undef GTK_DISABLE_DEPRECATED -#define __GTK_LIST_ITEM_C__ - -#include "gtkbindings.h" -#include "gtklabel.h" -#include "gtklistitem.h" -#include "gtklist.h" -#include "gtkmarshalers.h" -#include "gtksignal.h" -#include "gtkintl.h" - -#include "gtkalias.h" - - -enum -{ - TOGGLE_FOCUS_ROW, - SELECT_ALL, - UNSELECT_ALL, - UNDO_SELECTION, - START_SELECTION, - END_SELECTION, - TOGGLE_ADD_MODE, - EXTEND_SELECTION, - SCROLL_VERTICAL, - SCROLL_HORIZONTAL, - LAST_SIGNAL -}; - -static void gtk_list_item_class_init (GtkListItemClass *klass); -static void gtk_list_item_init (GtkListItem *list_item); -static void gtk_list_item_realize (GtkWidget *widget); -static void gtk_list_item_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_list_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_list_item_style_set (GtkWidget *widget, - GtkStyle *previous_style); -static gint gtk_list_item_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_list_item_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_real_list_item_select (GtkItem *item); -static void gtk_real_list_item_deselect (GtkItem *item); -static void gtk_real_list_item_toggle (GtkItem *item); - - -static GtkItemClass *parent_class = NULL; -static guint list_item_signals[LAST_SIGNAL] = {0}; - - -GtkType -gtk_list_item_get_type (void) -{ - static GtkType list_item_type = 0; - - if (!list_item_type) - { - static const GtkTypeInfo list_item_info = - { - "GtkListItem", - sizeof (GtkListItem), - sizeof (GtkListItemClass), - (GtkClassInitFunc) gtk_list_item_class_init, - (GtkObjectInitFunc) gtk_list_item_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkListItem"); - list_item_type = gtk_type_unique (gtk_item_get_type (), &list_item_info); - } - - return list_item_type; -} - -static void -gtk_list_item_class_init (GtkListItemClass *class) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkItemClass *item_class; - GtkBindingSet *binding_set; - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - item_class = (GtkItemClass*) class; - - parent_class = gtk_type_class (gtk_item_get_type ()); - - widget_class->realize = gtk_list_item_realize; - widget_class->size_request = gtk_list_item_size_request; - widget_class->size_allocate = gtk_list_item_size_allocate; - widget_class->style_set = gtk_list_item_style_set; - widget_class->button_press_event = gtk_list_item_button_press; - widget_class->expose_event = gtk_list_item_expose; - - item_class->select = gtk_real_list_item_select; - item_class->deselect = gtk_real_list_item_deselect; - item_class->toggle = gtk_real_list_item_toggle; - - class->toggle_focus_row = NULL; - class->select_all = NULL; - class->unselect_all = NULL; - class->undo_selection = NULL; - class->start_selection = NULL; - class->end_selection = NULL; - class->extend_selection = NULL; - class->scroll_horizontal = NULL; - class->scroll_vertical = NULL; - class->toggle_add_mode = NULL; - - list_item_signals[TOGGLE_FOCUS_ROW] = - gtk_signal_new (I_("toggle-focus-row"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, toggle_focus_row), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[SELECT_ALL] = - gtk_signal_new (I_("select-all"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, select_all), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[UNSELECT_ALL] = - gtk_signal_new (I_("unselect-all"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, unselect_all), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[UNDO_SELECTION] = - gtk_signal_new (I_("undo-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, undo_selection), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[START_SELECTION] = - gtk_signal_new (I_("start-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, start_selection), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[END_SELECTION] = - gtk_signal_new (I_("end-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, end_selection), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[TOGGLE_ADD_MODE] = - gtk_signal_new (I_("toggle-add-mode"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, toggle_add_mode), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - list_item_signals[EXTEND_SELECTION] = - gtk_signal_new (I_("extend-selection"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, extend_selection), - _gtk_marshal_VOID__ENUM_FLOAT_BOOLEAN, - GTK_TYPE_NONE, 3, - GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT, GTK_TYPE_BOOL); - list_item_signals[SCROLL_VERTICAL] = - gtk_signal_new (I_("scroll-vertical"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, scroll_vertical), - _gtk_marshal_VOID__ENUM_FLOAT, - GTK_TYPE_NONE, 2, GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT); - list_item_signals[SCROLL_HORIZONTAL] = - gtk_signal_new (I_("scroll-horizontal"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkListItemClass, scroll_horizontal), - _gtk_marshal_VOID__ENUM_FLOAT, - GTK_TYPE_NONE, 2, GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT); - - binding_set = gtk_binding_set_by_class (class); - gtk_binding_entry_add_signal (binding_set, GDK_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, 0, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Home, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_End, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_End, GDK_CONTROL_MASK, - "scroll-vertical", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - - gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - - gtk_binding_entry_add_signal (binding_set, GDK_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, GDK_SHIFT_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_Home, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_End, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_KP_End, - GDK_SHIFT_MASK | GDK_CONTROL_MASK, - "extend-selection", 3, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE); - - - gtk_binding_entry_add_signal (binding_set, GDK_Left, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Right, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_Home, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 0.0); - gtk_binding_entry_add_signal (binding_set, GDK_End, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_End, 0, - "scroll-horizontal", 2, - GTK_TYPE_ENUM, GTK_SCROLL_JUMP, - GTK_TYPE_FLOAT, 1.0); - - gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, - "undo-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_space, 0, - "toggle-focus-row", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0, - "toggle-focus-row", 0); - gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK, - "toggle-add-mode", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK, - "toggle-add-mode", 0); - gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK, - "select-all", 0); - gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, GDK_CONTROL_MASK, - "select-all", 0); - gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK, - "unselect-all", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_L, - GDK_RELEASE_MASK | GDK_SHIFT_MASK, - "end-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_R, - GDK_RELEASE_MASK | GDK_SHIFT_MASK, - "end-selection", 0); - gtk_binding_entry_add_signal (binding_set, GDK_Shift_R, - GDK_RELEASE_MASK | GDK_SHIFT_MASK | - GDK_CONTROL_MASK, - "end-selection", 0); -} - -static void -gtk_list_item_init (GtkListItem *list_item) -{ - gtk_widget_set_can_focus (GTK_WIDGET (list_item), TRUE); -} - -GtkWidget* -gtk_list_item_new (void) -{ - return GTK_WIDGET (gtk_type_new (gtk_list_item_get_type ())); -} - -GtkWidget* -gtk_list_item_new_with_label (const gchar *label) -{ - GtkWidget *list_item; - GtkWidget *label_widget; - - list_item = gtk_list_item_new (); - label_widget = gtk_label_new (label); - gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.5); - gtk_misc_set_padding (GTK_MISC (label_widget), 0, 1); - - gtk_container_add (GTK_CONTAINER (list_item), label_widget); - gtk_widget_show (label_widget); - - return list_item; -} - -void -gtk_list_item_select (GtkListItem *list_item) -{ - gtk_item_select (GTK_ITEM (list_item)); -} - -void -gtk_list_item_deselect (GtkListItem *list_item) -{ - gtk_item_deselect (GTK_ITEM (list_item)); -} - - -static void -gtk_list_item_realize (GtkWidget *widget) -{ - GdkWindowAttr attributes; - gint attributes_mask; - - /*GTK_WIDGET_CLASS (parent_class)->realize (widget);*/ - - g_return_if_fail (GTK_IS_LIST_ITEM (widget)); - - gtk_widget_set_realized (widget, TRUE); - - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.window_type = GDK_WINDOW_CHILD; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = (gtk_widget_get_events (widget) | - GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON1_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK | - GDK_KEY_PRESS_MASK | - GDK_KEY_RELEASE_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK); - - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, widget); - - widget->style = gtk_style_attach (widget->style, widget->window); - gdk_window_set_background (widget->window, - &widget->style->base[GTK_STATE_NORMAL]); -} - -static void -gtk_list_item_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkBin *bin; - GtkRequisition child_requisition; - gint focus_width; - gint focus_pad; - - g_return_if_fail (GTK_IS_LIST_ITEM (widget)); - g_return_if_fail (requisition != NULL); - - bin = GTK_BIN (widget); - gtk_widget_style_get (widget, - "focus-line-width", &focus_width, - "focus-padding", &focus_pad, - NULL); - - requisition->width = 2 * (GTK_CONTAINER (widget)->border_width + - widget->style->xthickness + focus_width + focus_pad - 1); - requisition->height = 2 * (GTK_CONTAINER (widget)->border_width + - focus_width + focus_pad - 1); - - if (bin->child && gtk_widget_get_visible (bin->child)) - { - gtk_widget_size_request (bin->child, &child_requisition); - - requisition->width += child_requisition.width; - requisition->height += child_requisition.height; - } -} - -static void -gtk_list_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkBin *bin; - GtkAllocation child_allocation; - - g_return_if_fail (GTK_IS_LIST_ITEM (widget)); - g_return_if_fail (allocation != NULL); - - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, allocation->height); - - bin = GTK_BIN (widget); - - if (bin->child) - { - child_allocation.x = (GTK_CONTAINER (widget)->border_width + - widget->style->xthickness); - child_allocation.y = GTK_CONTAINER (widget)->border_width; - child_allocation.width = allocation->width - child_allocation.x * 2; - child_allocation.height = allocation->height - child_allocation.y * 2; - - gtk_widget_size_allocate (bin->child, &child_allocation); - } -} - -static void -gtk_list_item_style_set (GtkWidget *widget, - GtkStyle *previous_style) -{ - GtkStyle *style; - - g_return_if_fail (widget != NULL); - - if (previous_style && gtk_widget_get_realized (widget)) - { - style = gtk_widget_get_style (widget); - gdk_window_set_background (gtk_widget_get_window (widget), - &style->base[gtk_widget_get_state (widget)]); - } -} - -static gint -gtk_list_item_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - if (event->type == GDK_BUTTON_PRESS && !gtk_widget_has_focus (widget)) - gtk_widget_grab_focus (widget); - - return FALSE; -} - -static gint -gtk_list_item_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - g_return_val_if_fail (widget != NULL, FALSE); - - if (gtk_widget_is_drawable (widget)) - { - if (widget->state == GTK_STATE_NORMAL) - { - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - gdk_window_clear_area (widget->window, event->area.x, event->area.y, - event->area.width, event->area.height); - } - else - { - gtk_paint_flat_box (widget->style, widget->window, - widget->state, GTK_SHADOW_ETCHED_OUT, - &event->area, widget, "listitem", - 0, 0, -1, -1); - } - - GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); - - if (gtk_widget_has_focus (widget)) - { - if (GTK_IS_LIST (widget->parent) && GTK_LIST (widget->parent)->add_mode) - gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget), - NULL, widget, "add-mode", - 0, 0, widget->allocation.width, widget->allocation.height); - else - gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget), - NULL, widget, NULL, - 0, 0, widget->allocation.width, widget->allocation.height); - } - } - - return FALSE; -} - -static void -gtk_real_list_item_select (GtkItem *item) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (item)); - - switch (GTK_WIDGET (item)->state) - { - case GTK_STATE_SELECTED: - case GTK_STATE_INSENSITIVE: - break; - default: - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); - break; - } -} - -static void -gtk_real_list_item_deselect (GtkItem *item) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (item)); - - if (GTK_WIDGET (item)->state == GTK_STATE_SELECTED) - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_NORMAL); -} - -static void -gtk_real_list_item_toggle (GtkItem *item) -{ - g_return_if_fail (GTK_IS_LIST_ITEM (item)); - - switch (GTK_WIDGET (item)->state) - { - case GTK_STATE_SELECTED: - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_NORMAL); - break; - case GTK_STATE_INSENSITIVE: - break; - default: - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); - break; - } -} - -#include "gtkaliasdef.c" diff --git a/gtk/gtklistitem.h b/gtk/gtklistitem.h deleted file mode 100644 index 9f83a48722..0000000000 --- a/gtk/gtklistitem.h +++ /dev/null @@ -1,91 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#if !defined (GTK_DISABLE_DEPRECATED) || defined (__GTK_LIST_ITEM_C__) - -#ifndef __GTK_LIST_ITEM_H__ -#define __GTK_LIST_ITEM_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - - -#define GTK_TYPE_LIST_ITEM (gtk_list_item_get_type ()) -#define GTK_LIST_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LIST_ITEM, GtkListItem)) -#define GTK_LIST_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_LIST_ITEM, GtkListItemClass)) -#define GTK_IS_LIST_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_LIST_ITEM)) -#define GTK_IS_LIST_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LIST_ITEM)) -#define GTK_LIST_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LIST_ITEM, GtkListItemClass)) - - -typedef struct _GtkListItem GtkListItem; -typedef struct _GtkListItemClass GtkListItemClass; - -struct _GtkListItem -{ - GtkItem item; -}; - -struct _GtkListItemClass -{ - GtkItemClass parent_class; - - void (*toggle_focus_row) (GtkListItem *list_item); - void (*select_all) (GtkListItem *list_item); - void (*unselect_all) (GtkListItem *list_item); - void (*undo_selection) (GtkListItem *list_item); - void (*start_selection) (GtkListItem *list_item); - void (*end_selection) (GtkListItem *list_item); - void (*extend_selection) (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position, - gboolean auto_start_selection); - void (*scroll_horizontal) (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position); - void (*scroll_vertical) (GtkListItem *list_item, - GtkScrollType scroll_type, - gfloat position); - void (*toggle_add_mode) (GtkListItem *list_item); -}; - - -GType gtk_list_item_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_list_item_new (void); -GtkWidget* gtk_list_item_new_with_label (const gchar *label); -void gtk_list_item_select (GtkListItem *list_item); -void gtk_list_item_deselect (GtkListItem *list_item); - - - -G_END_DECLS - - -#endif /* __GTK_LIST_ITEM_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkliststore.h b/gtk/gtkliststore.h index 6de426e89c..51cbfb3278 100644 --- a/gtk/gtkliststore.h +++ b/gtk/gtkliststore.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 082eb0fbdb..ed88d3898d 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -186,12 +186,6 @@ static void gtk_quit_destroy (GtkQuitFunction *quitf); static gint gtk_invoke_key_snoopers (GtkWidget *grab_widget, GdkEvent *event); -static void gtk_destroy_closure (gpointer data); -static gboolean gtk_invoke_idle_timeout (gpointer data); -static void gtk_invoke_input (gpointer data, - gint source, - GdkInputCondition condition); - #if 0 static void gtk_error (gchar *str); static void gtk_warning (gchar *str); @@ -1069,13 +1063,6 @@ gtk_init_check_abi_check (int *argc, char ***argv, int num_checks, size_t sizeof #endif -void -gtk_exit (gint errorcode) -{ - exit (errorcode); -} - - /** * gtk_set_locale: * @@ -2076,175 +2063,6 @@ gtk_quit_remove_by_data (gpointer data) } } -guint -gtk_timeout_add_full (guint32 interval, - GtkFunction function, - GtkCallbackMarshal marshal, - gpointer data, - GDestroyNotify destroy) -{ - if (marshal) - { - GtkClosure *closure; - - closure = g_new (GtkClosure, 1); - closure->marshal = marshal; - closure->data = data; - closure->destroy = destroy; - - return g_timeout_add_full (0, interval, - gtk_invoke_idle_timeout, - closure, - gtk_destroy_closure); - } - else - return g_timeout_add_full (0, interval, function, data, destroy); -} - -guint -gtk_timeout_add (guint32 interval, - GtkFunction function, - gpointer data) -{ - return g_timeout_add_full (0, interval, function, data, NULL); -} - -void -gtk_timeout_remove (guint tag) -{ - g_source_remove (tag); -} - -guint -gtk_idle_add_full (gint priority, - GtkFunction function, - GtkCallbackMarshal marshal, - gpointer data, - GDestroyNotify destroy) -{ - if (marshal) - { - GtkClosure *closure; - - closure = g_new (GtkClosure, 1); - closure->marshal = marshal; - closure->data = data; - closure->destroy = destroy; - - return g_idle_add_full (priority, - gtk_invoke_idle_timeout, - closure, - gtk_destroy_closure); - } - else - return g_idle_add_full (priority, function, data, destroy); -} - -guint -gtk_idle_add (GtkFunction function, - gpointer data) -{ - return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL); -} - -guint -gtk_idle_add_priority (gint priority, - GtkFunction function, - gpointer data) -{ - return g_idle_add_full (priority, function, data, NULL); -} - -void -gtk_idle_remove (guint tag) -{ - g_source_remove (tag); -} - -void -gtk_idle_remove_by_data (gpointer data) -{ - if (!g_idle_remove_by_data (data)) - g_warning ("gtk_idle_remove_by_data(%p): no such idle", data); -} - -guint -gtk_input_add_full (gint source, - GdkInputCondition condition, - GdkInputFunction function, - GtkCallbackMarshal marshal, - gpointer data, - GDestroyNotify destroy) -{ - if (marshal) - { - GtkClosure *closure; - - closure = g_new (GtkClosure, 1); - closure->marshal = marshal; - closure->data = data; - closure->destroy = destroy; - - return gdk_input_add_full (source, - condition, - (GdkInputFunction) gtk_invoke_input, - closure, - (GDestroyNotify) gtk_destroy_closure); - } - else - return gdk_input_add_full (source, condition, function, data, destroy); -} - -void -gtk_input_remove (guint tag) -{ - g_source_remove (tag); -} - -static void -gtk_destroy_closure (gpointer data) -{ - GtkClosure *closure = data; - - if (closure->destroy) - (closure->destroy) (closure->data); - g_free (closure); -} - -static gboolean -gtk_invoke_idle_timeout (gpointer data) -{ - GtkClosure *closure = data; - - GtkArg args[1]; - gint ret_val = FALSE; - args[0].name = NULL; - args[0].type = G_TYPE_BOOLEAN; - args[0].d.pointer_data = &ret_val; - closure->marshal (NULL, closure->data, 0, args); - return ret_val; -} - -static void -gtk_invoke_input (gpointer data, - gint source, - GdkInputCondition condition) -{ - GtkClosure *closure = data; - - GtkArg args[3]; - args[0].type = G_TYPE_INT; - args[0].name = NULL; - GTK_VALUE_INT (args[0]) = source; - args[1].type = GDK_TYPE_INPUT_CONDITION; - args[1].name = NULL; - GTK_VALUE_FLAGS (args[1]) = condition; - args[2].type = G_TYPE_NONE; - args[2].name = NULL; - - closure->marshal (NULL, closure->data, 2, args); -} - /** * gtk_get_current_event: * @@ -2501,9 +2319,8 @@ gtk_print (gchar *str) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_signal_connect (GTK_OBJECT (window), "destroy", - G_CALLBACK (gtk_widget_destroyed), - &window); + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_widget_destroyed), &window); gtk_window_set_title (GTK_WINDOW (window), "Messages"); @@ -2552,9 +2369,8 @@ gtk_print (gchar *str) button = gtk_button_new_with_label ("close"); - gtk_signal_connect_object (GTK_OBJECT (button), "clicked", - G_CALLBACK (gtk_widget_hide), - GTK_OBJECT (window)); + g_signal_connect_swapped (button, "clicked", + G_CALLBACK (gtk_widget_hide), window); gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0); gtk_widget_set_can_default (button, TRUE); gtk_widget_grab_default (button); diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h index 21de92ed42..13f0fcb44a 100644 --- a/gtk/gtkmain.h +++ b/gtk/gtkmain.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -45,20 +45,6 @@ G_BEGIN_DECLS */ #define GTK_PRIORITY_RESIZE (G_PRIORITY_HIGH_IDLE + 10) -#ifndef GTK_DISABLE_DEPRECATED - -/* Use GDK_PRIORITY_REDRAW */ -#define GTK_PRIORITY_REDRAW (G_PRIORITY_HIGH_IDLE + 20) - -/* Deprecated. Use G_PRIORITY #define's instead - */ -#define GTK_PRIORITY_HIGH G_PRIORITY_HIGH -#define GTK_PRIORITY_INTERNAL GTK_PRIORITY_REDRAW -#define GTK_PRIORITY_DEFAULT G_PRIORITY_DEFAULT_IDLE -#define GTK_PRIORITY_LOW G_PRIORITY_LOW - -#endif /* GTK_DISABLE_DEPRECATED */ - typedef gint (*GtkKeySnoopFunc) (GtkWidget *grab_widget, GdkEventKey *event, gpointer func_data); @@ -127,10 +113,6 @@ gboolean gtk_init_check_abi_check (int *argc, #endif -#ifndef GTK_DISABLE_DEPRECATED -void gtk_exit (gint error_code); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_disable_setlocale (void); gchar * gtk_set_locale (void); PangoLanguage *gtk_get_default_language (void); @@ -170,37 +152,6 @@ guint gtk_quit_add_full (guint main_level, GDestroyNotify destroy); void gtk_quit_remove (guint quit_handler_id); void gtk_quit_remove_by_data (gpointer data); -#ifndef GTK_DISABLE_DEPRECATED -guint gtk_timeout_add (guint32 interval, - GtkFunction function, - gpointer data); -guint gtk_timeout_add_full (guint32 interval, - GtkFunction function, - GtkCallbackMarshal marshal, - gpointer data, - GDestroyNotify destroy); -void gtk_timeout_remove (guint timeout_handler_id); - -guint gtk_idle_add (GtkFunction function, - gpointer data); -guint gtk_idle_add_priority (gint priority, - GtkFunction function, - gpointer data); -guint gtk_idle_add_full (gint priority, - GtkFunction function, - GtkCallbackMarshal marshal, - gpointer data, - GDestroyNotify destroy); -void gtk_idle_remove (guint idle_handler_id); -void gtk_idle_remove_by_data (gpointer data); -guint gtk_input_add_full (gint source, - GdkInputCondition condition, - GdkInputFunction function, - GtkCallbackMarshal marshal, - gpointer data, - GDestroyNotify destroy); -void gtk_input_remove (guint input_handler_id); -#endif /* GTK_DISABLE_DEPRECATED */ guint gtk_key_snooper_install (GtkKeySnoopFunc snooper, gpointer func_data); diff --git a/gtk/gtkmarshal.list b/gtk/gtkmarshal.list deleted file mode 100644 index a016dffc6d..0000000000 --- a/gtk/gtkmarshal.list +++ /dev/null @@ -1,36 +0,0 @@ -BOOL:NONE -BOOL:POINTER -BOOL:POINTER,POINTER,INT,INT -BOOL:POINTER,INT,INT -BOOL:POINTER,INT,INT,UINT -BOOL:POINTER,STRING,STRING,POINTER -ENUM:ENUM -INT:POINTER -INT:POINTER,CHAR,CHAR -NONE:BOOL -NONE:BOXED -NONE:ENUM -NONE:ENUM,FLOAT -NONE:ENUM,FLOAT,BOOL -NONE:INT -NONE:INT,INT -NONE:INT,INT,POINTER -NONE:NONE -NONE:OBJECT -NONE:POINTER -NONE:POINTER,INT -NONE:POINTER,POINTER -NONE:POINTER,POINTER,POINTER -NONE:POINTER,STRING,STRING -NONE:POINTER,UINT -NONE:POINTER,UINT,ENUM -NONE:POINTER,POINTER,UINT,UINT -NONE:POINTER,INT,INT,POINTER,UINT,UINT -NONE:POINTER,UINT,UINT -NONE:POINTER,UINT,UINT -NONE:STRING -NONE:STRING,INT,POINTER -NONE:UINT -NONE:UINT,POINTER,UINT,ENUM,ENUM,POINTER -NONE:UINT,POINTER,UINT,UINT,ENUM -NONE:UINT,STRING diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index b5b9820faa..0bbfae42ac 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -3034,7 +3034,7 @@ get_accel_path (GtkWidget *menu_item, { accel_group = gtk_accel_group_from_accel_closure (accel_closure); - *locked = accel_group->lock_count > 0; + *locked = gtk_accel_group_get_is_locked (accel_group); } } } diff --git a/gtk/gtkmenu.h b/gtk/gtkmenu.h index 694457a059..6a944c0584 100644 --- a/gtk/gtkmenu.h +++ b/gtk/gtkmenu.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -203,12 +203,6 @@ void gtk_menu_set_monitor (GtkMenu *menu, gint gtk_menu_get_monitor (GtkMenu *menu); GList* gtk_menu_get_for_attach_widget (GtkWidget *widget); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_menu_append(menu,child) gtk_menu_shell_append ((GtkMenuShell *)(menu),(child)) -#define gtk_menu_prepend(menu,child) gtk_menu_shell_prepend ((GtkMenuShell *)(menu),(child)) -#define gtk_menu_insert(menu,child,pos) gtk_menu_shell_insert ((GtkMenuShell *)(menu),(child),(pos)) -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_menu_set_reserve_toggle_size (GtkMenu *menu, gboolean reserve_toggle_size); gboolean gtk_menu_get_reserve_toggle_size (GtkMenu *menu); diff --git a/gtk/gtkmenubar.h b/gtk/gtkmenubar.h index 2acce0b172..050fb4846b 100644 --- a/gtk/gtkmenubar.h +++ b/gtk/gtkmenubar.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -75,12 +75,6 @@ GtkPackDirection gtk_menu_bar_get_child_pack_direction (GtkMenuBar *menuba void gtk_menu_bar_set_child_pack_direction (GtkMenuBar *menubar, GtkPackDirection child_pack_dir); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_menu_bar_append(menu,child) gtk_menu_shell_append ((GtkMenuShell *)(menu),(child)) -#define gtk_menu_bar_prepend(menu,child) gtk_menu_shell_prepend ((GtkMenuShell *)(menu),(child)) -#define gtk_menu_bar_insert(menu,child,pos) gtk_menu_shell_insert ((GtkMenuShell *)(menu),(child),(pos)) -#endif /* GTK_DISABLE_DEPRECATED */ - /* Private functions */ void _gtk_menu_bar_cycle_focus (GtkMenuBar *menubar, GtkDirectionType dir); diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index 8e03b99c73..76fab0d24d 100644 --- a/gtk/gtkmenuitem.c +++ b/gtk/gtkmenuitem.c @@ -812,24 +812,6 @@ gtk_menu_item_get_submenu (GtkMenuItem *menu_item) return menu_item->submenu; } -/** - * gtk_menu_item_remove_submenu: - * @menu_item: a #GtkMenuItem - * - * Removes the widget's submenu. - * - * Deprecated: 2.12: gtk_menu_item_remove_submenu() is deprecated and - * should not be used in newly written code. Use - * gtk_menu_item_set_submenu() instead. - **/ -void -gtk_menu_item_remove_submenu (GtkMenuItem *menu_item) -{ - g_return_if_fail (GTK_IS_MENU_ITEM (menu_item)); - - gtk_menu_item_set_submenu (menu_item, NULL); -} - void _gtk_menu_item_set_placement (GtkMenuItem *menu_item, GtkSubmenuPlacement placement); diff --git a/gtk/gtkmenuitem.h b/gtk/gtkmenuitem.h index b8a1f1a91f..6334785f1b 100644 --- a/gtk/gtkmenuitem.h +++ b/gtk/gtkmenuitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -135,11 +135,6 @@ void _gtk_menu_item_popup_submenu (GtkWidget *menu_item, gboolean with_delay); void _gtk_menu_item_popdown_submenu (GtkWidget *menu_item); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_menu_item_remove_submenu (GtkMenuItem *menu_item); -#define gtk_menu_item_right_justify(menu_item) gtk_menu_item_set_right_justified ((menu_item), TRUE) -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_MENU_ITEM_H__ */ diff --git a/gtk/gtkmenushell.h b/gtk/gtkmenushell.h index 614d3975f2..e0d042bf17 100644 --- a/gtk/gtkmenushell.h +++ b/gtk/gtkmenushell.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkmenutoolbutton.c b/gtk/gtkmenutoolbutton.c index 3e3cf07751..460423d348 100644 --- a/gtk/gtkmenutoolbutton.c +++ b/gtk/gtkmenutoolbutton.c @@ -21,8 +21,6 @@ #include "config.h" -#undef GTK_DISABLE_DEPRECATED /* GtkTooltips */ - #include "gtkmenutoolbutton.h" #include "gtktogglebutton.h" #include "gtkarrow.h" @@ -593,39 +591,12 @@ gtk_menu_tool_button_get_menu (GtkMenuToolButton *button) } /** - * gtk_menu_tool_button_set_arrow_tooltip: - * @button: a #GtkMenuToolButton - * @tooltips: the #GtkTooltips object to be used - * @tip_text: (allow-none): text to be used as tooltip text for tool_item - * @tip_private: (allow-none): text to be used as private tooltip text - * - * Sets the #GtkTooltips object to be used for arrow button which - * pops up the menu. See gtk_tool_item_set_tooltip() for setting - * a tooltip on the whole #GtkMenuToolButton. - * - * Since: 2.6 - * - * Deprecated: 2.12: Use gtk_menu_tool_button_set_arrow_tooltip_text() - * instead. - **/ -void -gtk_menu_tool_button_set_arrow_tooltip (GtkMenuToolButton *button, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private) -{ - g_return_if_fail (GTK_IS_MENU_TOOL_BUTTON (button)); - - gtk_tooltips_set_tip (tooltips, button->priv->arrow_button, tip_text, tip_private); -} - -/** * gtk_menu_tool_button_set_arrow_tooltip_text: * @button: a #GtkMenuToolButton * @text: text to be used as tooltip text for button's arrow button * * Sets the tooltip text to be used as tooltip for the arrow button which - * pops up the menu. See gtk_tool_item_set_tooltip() for setting a tooltip + * pops up the menu. See gtk_tool_item_set_tooltip_text() for setting a tooltip * on the whole #GtkMenuToolButton. * * Since: 2.12 @@ -645,7 +616,7 @@ gtk_menu_tool_button_set_arrow_tooltip_text (GtkMenuToolButton *button, * @markup: markup text to be used as tooltip text for button's arrow button * * Sets the tooltip markup text to be used as tooltip for the arrow button - * which pops up the menu. See gtk_tool_item_set_tooltip() for setting a + * which pops up the menu. See gtk_tool_item_set_tooltip_text() for setting a * tooltip on the whole #GtkMenuToolButton. * * Since: 2.12 diff --git a/gtk/gtkmenutoolbutton.h b/gtk/gtkmenutoolbutton.h index ec50e34017..916e6acf7b 100644 --- a/gtk/gtkmenutoolbutton.h +++ b/gtk/gtkmenutoolbutton.h @@ -19,7 +19,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -71,14 +71,6 @@ GtkToolItem *gtk_menu_tool_button_new_from_stock (const gchar *stock_id); void gtk_menu_tool_button_set_menu (GtkMenuToolButton *button, GtkWidget *menu); GtkWidget *gtk_menu_tool_button_get_menu (GtkMenuToolButton *button); - -#ifndef GTK_DISABLE_DEPRECATED -void gtk_menu_tool_button_set_arrow_tooltip (GtkMenuToolButton *button, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_menu_tool_button_set_arrow_tooltip_text (GtkMenuToolButton *button, const gchar *text); void gtk_menu_tool_button_set_arrow_tooltip_markup (GtkMenuToolButton *button, diff --git a/gtk/gtkmessagedialog.h b/gtk/gtkmessagedialog.h index c46c7b3db7..c4ef610693 100644 --- a/gtk/gtkmessagedialog.h +++ b/gtk/gtkmessagedialog.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkmisc.h b/gtk/gtkmisc.h index 477c73b605..0cb14163de 100644 --- a/gtk/gtkmisc.h +++ b/gtk/gtkmisc.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkmodules.h b/gtk/gtkmodules.h index 84bc86ca63..ca1c52e431 100644 --- a/gtk/gtkmodules.h +++ b/gtk/gtkmodules.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index d038cc5f53..62008bafd3 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -105,14 +105,9 @@ enum { PROP_SHOW_TABS, PROP_SHOW_BORDER, PROP_SCROLLABLE, - PROP_TAB_BORDER, - PROP_TAB_HBORDER, - PROP_TAB_VBORDER, PROP_PAGE, PROP_ENABLE_POPUP, - PROP_GROUP_ID, PROP_GROUP, - PROP_HOMOGENEOUS }; enum { @@ -417,15 +412,6 @@ static void gtk_notebook_menu_detacher (GtkWidget *widget, GtkMenu *menu); /*** GtkNotebook Private Setters ***/ -static void gtk_notebook_set_homogeneous_tabs_internal (GtkNotebook *notebook, - gboolean homogeneous); -static void gtk_notebook_set_tab_border_internal (GtkNotebook *notebook, - guint border_width); -static void gtk_notebook_set_tab_hborder_internal (GtkNotebook *notebook, - guint tab_hborder); -static void gtk_notebook_set_tab_vborder_internal (GtkNotebook *notebook, - guint tab_vborder); - static void gtk_notebook_update_tab_states (GtkNotebook *notebook); static gboolean gtk_notebook_mnemonic_activate_switch_page (GtkWidget *child, gboolean overload, @@ -597,33 +583,6 @@ gtk_notebook_class_init (GtkNotebookClass *class) GTK_POS_TOP, GTK_PARAM_READWRITE)); g_object_class_install_property (gobject_class, - PROP_TAB_BORDER, - g_param_spec_uint ("tab-border", - P_("Tab Border"), - P_("Width of the border around the tab labels"), - 0, - G_MAXUINT, - 2, - GTK_PARAM_WRITABLE)); - g_object_class_install_property (gobject_class, - PROP_TAB_HBORDER, - g_param_spec_uint ("tab-hborder", - P_("Horizontal Tab Border"), - P_("Width of the horizontal border of tab labels"), - 0, - G_MAXUINT, - 2, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_TAB_VBORDER, - g_param_spec_uint ("tab-vborder", - P_("Vertical Tab Border"), - P_("Width of the vertical border of tab labels"), - 0, - G_MAXUINT, - 2, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, PROP_SHOW_TABS, g_param_spec_boolean ("show-tabs", P_("Show Tabs"), @@ -651,22 +610,6 @@ gtk_notebook_class_init (GtkNotebookClass *class) P_("If TRUE, pressing the right mouse button on the notebook pops up a menu that you can use to go to a page"), FALSE, GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_HOMOGENEOUS, - g_param_spec_boolean ("homogeneous", - P_("Homogeneous"), - P_("Whether tabs should have homogeneous sizes"), - FALSE, - GTK_PARAM_READWRITE)); - g_object_class_install_property (gobject_class, - PROP_GROUP_ID, - g_param_spec_int ("group-id", - P_("Group ID"), - P_("Group ID for tabs drag and drop"), - -1, - G_MAXINT, - -1, - GTK_PARAM_READWRITE)); /** * GtkNotebook:group: @@ -1530,27 +1473,12 @@ gtk_notebook_set_property (GObject *object, else gtk_notebook_popup_disable (notebook); break; - case PROP_HOMOGENEOUS: - gtk_notebook_set_homogeneous_tabs_internal (notebook, g_value_get_boolean (value)); - break; case PROP_PAGE: gtk_notebook_set_current_page (notebook, g_value_get_int (value)); break; case PROP_TAB_POS: gtk_notebook_set_tab_pos (notebook, g_value_get_enum (value)); break; - case PROP_TAB_BORDER: - gtk_notebook_set_tab_border_internal (notebook, g_value_get_uint (value)); - break; - case PROP_TAB_HBORDER: - gtk_notebook_set_tab_hborder_internal (notebook, g_value_get_uint (value)); - break; - case PROP_TAB_VBORDER: - gtk_notebook_set_tab_vborder_internal (notebook, g_value_get_uint (value)); - break; - case PROP_GROUP_ID: - gtk_notebook_set_group_id (notebook, g_value_get_int (value)); - break; case PROP_GROUP: gtk_notebook_set_group (notebook, g_value_get_pointer (value)); break; @@ -1586,24 +1514,12 @@ gtk_notebook_get_property (GObject *object, case PROP_ENABLE_POPUP: g_value_set_boolean (value, notebook->menu != NULL); break; - case PROP_HOMOGENEOUS: - g_value_set_boolean (value, notebook->homogeneous); - break; case PROP_PAGE: g_value_set_int (value, gtk_notebook_get_current_page (notebook)); break; case PROP_TAB_POS: g_value_set_enum (value, notebook->tab_pos); break; - case PROP_TAB_HBORDER: - g_value_set_uint (value, notebook->tab_hborder); - break; - case PROP_TAB_VBORDER: - g_value_set_uint (value, notebook->tab_vborder); - break; - case PROP_GROUP_ID: - g_value_set_int (value, gtk_notebook_get_group_id (notebook)); - break; case PROP_GROUP: g_value_set_pointer (value, priv->group); break; @@ -3833,7 +3749,7 @@ gtk_notebook_get_child_property (GtkContainer *container, label = gtk_notebook_get_tab_label (notebook, child); if (GTK_IS_LABEL (label)) - g_value_set_string (value, GTK_LABEL (label)->label); + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (label))); else g_value_set_string (value, NULL); break; @@ -3841,7 +3757,7 @@ gtk_notebook_get_child_property (GtkContainer *container, label = gtk_notebook_get_menu_label (notebook, child); if (GTK_IS_LABEL (label)) - g_value_set_string (value, GTK_LABEL (label)->label); + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (label))); else g_value_set_string (value, NULL); break; @@ -4727,7 +4643,7 @@ gtk_notebook_update_labels (GtkNotebook *notebook) { if (GTK_IS_LABEL (page->tab_label)) gtk_label_set_text (GTK_LABEL (page->menu_label), - GTK_LABEL (page->tab_label)->label); + gtk_label_get_label (GTK_LABEL (page->tab_label))); else gtk_label_set_text (GTK_LABEL (page->menu_label), string); } @@ -6273,7 +6189,7 @@ gtk_notebook_menu_item_create (GtkNotebook *notebook, if (page->default_menu) { if (GTK_IS_LABEL (page->tab_label)) - page->menu_label = gtk_label_new (GTK_LABEL (page->tab_label)->label); + page->menu_label = gtk_label_new (gtk_label_get_label (GTK_LABEL (page->tab_label))); else page->menu_label = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (page->menu_label), 0.0, 0.5); @@ -6310,75 +6226,6 @@ gtk_notebook_menu_detacher (GtkWidget *widget, notebook->menu = NULL; } -/* Private GtkNotebook Setter Functions: - * - * gtk_notebook_set_homogeneous_tabs_internal - * gtk_notebook_set_tab_border_internal - * gtk_notebook_set_tab_hborder_internal - * gtk_notebook_set_tab_vborder_internal - */ -static void -gtk_notebook_set_homogeneous_tabs_internal (GtkNotebook *notebook, - gboolean homogeneous) -{ - if (homogeneous == notebook->homogeneous) - return; - - notebook->homogeneous = homogeneous; - gtk_widget_queue_resize (GTK_WIDGET (notebook)); - - g_object_notify (G_OBJECT (notebook), "homogeneous"); -} - -static void -gtk_notebook_set_tab_border_internal (GtkNotebook *notebook, - guint border_width) -{ - notebook->tab_hborder = border_width; - notebook->tab_vborder = border_width; - - if (notebook->show_tabs && - gtk_widget_get_visible (GTK_WIDGET (notebook))) - gtk_widget_queue_resize (GTK_WIDGET (notebook)); - - g_object_freeze_notify (G_OBJECT (notebook)); - g_object_notify (G_OBJECT (notebook), "tab-hborder"); - g_object_notify (G_OBJECT (notebook), "tab-vborder"); - g_object_thaw_notify (G_OBJECT (notebook)); -} - -static void -gtk_notebook_set_tab_hborder_internal (GtkNotebook *notebook, - guint tab_hborder) -{ - if (notebook->tab_hborder == tab_hborder) - return; - - notebook->tab_hborder = tab_hborder; - - if (notebook->show_tabs && - gtk_widget_get_visible (GTK_WIDGET (notebook))) - gtk_widget_queue_resize (GTK_WIDGET (notebook)); - - g_object_notify (G_OBJECT (notebook), "tab-hborder"); -} - -static void -gtk_notebook_set_tab_vborder_internal (GtkNotebook *notebook, - guint tab_vborder) -{ - if (notebook->tab_vborder == tab_vborder) - return; - - notebook->tab_vborder = tab_vborder; - - if (notebook->show_tabs && - gtk_widget_get_visible (GTK_WIDGET (notebook))) - gtk_widget_queue_resize (GTK_WIDGET (notebook)); - - g_object_notify (G_OBJECT (notebook), "tab-vborder"); -} - /* Public GtkNotebook Page Insert/Remove Methods : * * gtk_notebook_append_page @@ -7000,73 +6847,6 @@ gtk_notebook_get_tab_pos (GtkNotebook *notebook) } /** - * gtk_notebook_set_homogeneous_tabs: - * @notebook: a #GtkNotebook - * @homogeneous: %TRUE if all tabs should be the same size. - * - * Sets whether the tabs must have all the same size or not. - **/ -void -gtk_notebook_set_homogeneous_tabs (GtkNotebook *notebook, - gboolean homogeneous) -{ - g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - - gtk_notebook_set_homogeneous_tabs_internal (notebook, homogeneous); -} - -/** - * gtk_notebook_set_tab_border: - * @notebook: a #GtkNotebook - * @border_width: width of the border around the tab labels. - * - * Sets the width the border around the tab labels - * in a notebook. This is equivalent to calling - * gtk_notebook_set_tab_hborder (@notebook, @border_width) followed - * by gtk_notebook_set_tab_vborder (@notebook, @border_width). - **/ -void -gtk_notebook_set_tab_border (GtkNotebook *notebook, - guint border_width) -{ - g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - - gtk_notebook_set_tab_border_internal (notebook, border_width); -} - -/** - * gtk_notebook_set_tab_hborder: - * @notebook: a #GtkNotebook - * @tab_hborder: width of the horizontal border of tab labels. - * - * Sets the width of the horizontal border of tab labels. - **/ -void -gtk_notebook_set_tab_hborder (GtkNotebook *notebook, - guint tab_hborder) -{ - g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - - gtk_notebook_set_tab_hborder_internal (notebook, tab_hborder); -} - -/** - * gtk_notebook_set_tab_vborder: - * @notebook: a #GtkNotebook - * @tab_vborder: width of the vertical border of tab labels. - * - * Sets the width of the vertical border of tab labels. - **/ -void -gtk_notebook_set_tab_vborder (GtkNotebook *notebook, - guint tab_vborder) -{ - g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - - gtk_notebook_set_tab_vborder_internal (notebook, tab_vborder); -} - -/** * gtk_notebook_set_scrollable: * @notebook: a #GtkNotebook * @scrollable: %TRUE if scroll arrows should be added @@ -7687,32 +7467,6 @@ gtk_notebook_set_window_creation_hook (GtkNotebookWindowCreationFunc func, } /** - * gtk_notebook_set_group_id: - * @notebook: a #GtkNotebook - * @group_id: a group identificator, or -1 to unset it - * - * Sets an group identificator for @notebook, notebooks sharing - * the same group identificator will be able to exchange tabs - * via drag and drop. A notebook with group identificator -1 will - * not be able to exchange tabs with any other notebook. - * - * Since: 2.10 - * Deprecated: 2.12: use gtk_notebook_set_group() instead. - */ -void -gtk_notebook_set_group_id (GtkNotebook *notebook, - gint group_id) -{ - gpointer group; - - g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - - /* add 1 to get rid of the -1/NULL difference */ - group = GINT_TO_POINTER (group_id + 1); - gtk_notebook_set_group (notebook, group); -} - -/** * gtk_notebook_set_group: * @notebook: a #GtkNotebook * @group: (allow-none): a pointer to identify the notebook group, or %NULL to unset it @@ -7743,30 +7497,6 @@ gtk_notebook_set_group (GtkNotebook *notebook, } /** - * gtk_notebook_get_group_id: - * @notebook: a #GtkNotebook - * - * Gets the current group identificator for @notebook. - * - * Return Value: the group identificator, or -1 if none is set. - * - * Since: 2.10 - * Deprecated: 2.12: use gtk_notebook_get_group() instead. - */ -gint -gtk_notebook_get_group_id (GtkNotebook *notebook) -{ - GtkNotebookPrivate *priv; - - g_return_val_if_fail (GTK_IS_NOTEBOOK (notebook), -1); - - priv = GTK_NOTEBOOK_GET_PRIVATE (notebook); - - /* substract 1 to get rid of the -1/NULL difference */ - return GPOINTER_TO_INT (priv->group) - 1; -} - -/** * gtk_notebook_get_group: * @notebook: a #GtkNotebook * diff --git a/gtk/gtknotebook.h b/gtk/gtknotebook.h index 0a14a75617..e58bc5d2d2 100644 --- a/gtk/gtknotebook.h +++ b/gtk/gtknotebook.h @@ -25,7 +25,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -173,13 +173,6 @@ void gtk_notebook_remove_page (GtkNotebook *notebook, void gtk_notebook_set_window_creation_hook (GtkNotebookWindowCreationFunc func, gpointer data, GDestroyNotify destroy); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_notebook_set_group_id (GtkNotebook *notebook, - gint group_id); -gint gtk_notebook_get_group_id (GtkNotebook *notebook); - -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_notebook_set_group (GtkNotebook *notebook, gpointer group); gpointer gtk_notebook_get_group (GtkNotebook *notebook); @@ -214,18 +207,6 @@ gboolean gtk_notebook_get_show_tabs (GtkNotebook *notebook); void gtk_notebook_set_tab_pos (GtkNotebook *notebook, GtkPositionType pos); GtkPositionType gtk_notebook_get_tab_pos (GtkNotebook *notebook); - -#ifndef GTK_DISABLE_DEPRECATED -void gtk_notebook_set_homogeneous_tabs (GtkNotebook *notebook, - gboolean homogeneous); -void gtk_notebook_set_tab_border (GtkNotebook *notebook, - guint border_width); -void gtk_notebook_set_tab_hborder (GtkNotebook *notebook, - guint tab_hborder); -void gtk_notebook_set_tab_vborder (GtkNotebook *notebook, - guint tab_vborder); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_notebook_set_scrollable (GtkNotebook *notebook, gboolean scrollable); gboolean gtk_notebook_get_scrollable (GtkNotebook *notebook); @@ -293,11 +274,6 @@ void gtk_notebook_set_action_widget (GtkNotebook *notebook, GtkWidget *widget, GtkPackType pack_type); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_notebook_current_page gtk_notebook_get_current_page -#define gtk_notebook_set_page gtk_notebook_set_current_page -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_NOTEBOOK_H__ */ diff --git a/gtk/gtkobject.c b/gtk/gtkobject.c index d0e65ed0fd..9cedfe346f 100644 --- a/gtk/gtkobject.c +++ b/gtk/gtkobject.c @@ -30,8 +30,6 @@ #include <string.h> #include <stdio.h> -#undef GTK_DISABLE_DEPRECATED - #include "gtkobject.h" #include "gtkintl.h" #include "gtkmarshalers.h" @@ -44,10 +42,6 @@ enum { DESTROY, LAST_SIGNAL }; -enum { - PROP_0, - PROP_USER_DATA -}; static void gtk_object_base_class_init (GtkObjectClass *class); @@ -55,22 +49,12 @@ static void gtk_object_base_class_finalize (GtkObjectClass *class); static void gtk_object_class_init (GtkObjectClass *klass); static void gtk_object_init (GtkObject *object, GtkObjectClass *klass); -static void gtk_object_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_object_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec); static void gtk_object_dispose (GObject *object); static void gtk_object_real_destroy (GtkObject *object); static void gtk_object_finalize (GObject *object); -static void gtk_object_notify_weaks (GtkObject *object); static gpointer parent_class = NULL; static guint object_signals[LAST_SIGNAL] = { 0 }; -static GQuark quark_weakrefs = 0; /**************************************************** @@ -109,9 +93,6 @@ gtk_object_get_type (void) static void gtk_object_base_class_init (GtkObjectClass *class) { - /* reset instance specifc methods that don't get inherited */ - class->get_arg = NULL; - class->set_arg = NULL; } static void @@ -119,257 +100,18 @@ gtk_object_base_class_finalize (GtkObjectClass *class) { } -static inline gboolean -gtk_arg_set_from_value (GtkArg *arg, - const GValue *value, - gboolean copy_string) -{ - switch (G_TYPE_FUNDAMENTAL (arg->type)) - { - case G_TYPE_CHAR: GTK_VALUE_CHAR (*arg) = g_value_get_char (value); break; - case G_TYPE_UCHAR: GTK_VALUE_UCHAR (*arg) = g_value_get_uchar (value); break; - case G_TYPE_BOOLEAN: GTK_VALUE_BOOL (*arg) = g_value_get_boolean (value); break; - case G_TYPE_INT: GTK_VALUE_INT (*arg) = g_value_get_int (value); break; - case G_TYPE_UINT: GTK_VALUE_UINT (*arg) = g_value_get_uint (value); break; - case G_TYPE_LONG: GTK_VALUE_LONG (*arg) = g_value_get_long (value); break; - case G_TYPE_ULONG: GTK_VALUE_ULONG (*arg) = g_value_get_ulong (value); break; - case G_TYPE_ENUM: GTK_VALUE_ENUM (*arg) = g_value_get_enum (value); break; - case G_TYPE_FLAGS: GTK_VALUE_FLAGS (*arg) = g_value_get_flags (value); break; - case G_TYPE_FLOAT: GTK_VALUE_FLOAT (*arg) = g_value_get_float (value); break; - case G_TYPE_DOUBLE: GTK_VALUE_DOUBLE (*arg) = g_value_get_double (value); break; - case G_TYPE_BOXED: GTK_VALUE_BOXED (*arg) = g_value_get_boxed (value); break; - case G_TYPE_POINTER: GTK_VALUE_POINTER (*arg) = g_value_get_pointer (value); break; - case G_TYPE_OBJECT: GTK_VALUE_POINTER (*arg) = g_value_get_object (value); break; - case G_TYPE_STRING: if (copy_string) - GTK_VALUE_STRING (*arg) = g_value_dup_string (value); - else - GTK_VALUE_STRING (*arg) = (char *) g_value_get_string (value); - break; - default: - return FALSE; - } - return TRUE; -} - -static inline gboolean -gtk_arg_to_value (GtkArg *arg, - GValue *value) -{ - switch (G_TYPE_FUNDAMENTAL (arg->type)) - { - case G_TYPE_CHAR: g_value_set_char (value, GTK_VALUE_CHAR (*arg)); break; - case G_TYPE_UCHAR: g_value_set_uchar (value, GTK_VALUE_UCHAR (*arg)); break; - case G_TYPE_BOOLEAN: g_value_set_boolean (value, GTK_VALUE_BOOL (*arg)); break; - case G_TYPE_INT: g_value_set_int (value, GTK_VALUE_INT (*arg)); break; - case G_TYPE_UINT: g_value_set_uint (value, GTK_VALUE_UINT (*arg)); break; - case G_TYPE_LONG: g_value_set_long (value, GTK_VALUE_LONG (*arg)); break; - case G_TYPE_ULONG: g_value_set_ulong (value, GTK_VALUE_ULONG (*arg)); break; - case G_TYPE_ENUM: g_value_set_enum (value, GTK_VALUE_ENUM (*arg)); break; - case G_TYPE_FLAGS: g_value_set_flags (value, GTK_VALUE_FLAGS (*arg)); break; - case G_TYPE_FLOAT: g_value_set_float (value, GTK_VALUE_FLOAT (*arg)); break; - case G_TYPE_DOUBLE: g_value_set_double (value, GTK_VALUE_DOUBLE (*arg)); break; - case G_TYPE_STRING: g_value_set_string (value, GTK_VALUE_STRING (*arg)); break; - case G_TYPE_BOXED: g_value_set_boxed (value, GTK_VALUE_BOXED (*arg)); break; - case G_TYPE_POINTER: g_value_set_pointer (value, GTK_VALUE_POINTER (*arg)); break; - case G_TYPE_OBJECT: g_value_set_object (value, GTK_VALUE_POINTER (*arg)); break; - default: - return FALSE; - } - return TRUE; -} - -static void -gtk_arg_proxy_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkObjectClass *class = g_type_class_peek (pspec->owner_type); - GtkArg arg; - - g_return_if_fail (class->set_arg != NULL); - - memset (&arg, 0, sizeof (arg)); - arg.type = G_VALUE_TYPE (value); - gtk_arg_set_from_value (&arg, value, FALSE); - arg.name = pspec->name; - class->set_arg (GTK_OBJECT (object), &arg, property_id); -} - -static void -gtk_arg_proxy_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GtkObjectClass *class = g_type_class_peek (pspec->owner_type); - GtkArg arg; - - g_return_if_fail (class->get_arg != NULL); - - memset (&arg, 0, sizeof (arg)); - arg.type = G_VALUE_TYPE (value); - arg.name = pspec->name; - class->get_arg (GTK_OBJECT (object), &arg, property_id); - gtk_arg_to_value (&arg, value); -} - -void -gtk_object_add_arg_type (const gchar *arg_name, - GType arg_type, - guint arg_flags, - guint arg_id) -{ - GObjectClass *oclass; - GParamSpec *pspec; - gchar *type_name, *pname; - GType type; - - g_return_if_fail (arg_name != NULL); - g_return_if_fail (arg_type > G_TYPE_NONE); - g_return_if_fail (arg_id > 0); - g_return_if_fail (arg_flags & G_PARAM_READWRITE); - if (arg_flags & G_PARAM_CONSTRUCT) - g_return_if_fail ((arg_flags & G_PARAM_CONSTRUCT_ONLY) == 0); - if (arg_flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) - g_return_if_fail (arg_flags & G_PARAM_WRITABLE); - g_return_if_fail ((arg_flags & ~(G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME)) == 0); - - pname = strchr (arg_name, ':'); - g_return_if_fail (pname && pname[1] == ':'); - - type_name = g_strndup (arg_name, pname - arg_name); - pname += 2; - type = g_type_from_name (type_name); - g_free (type_name); - g_return_if_fail (G_TYPE_IS_OBJECT (type)); - - oclass = gtk_type_class (type); - if (arg_flags & G_PARAM_READABLE) - { - if (oclass->get_property && oclass->get_property != gtk_arg_proxy_get_property) - { - g_warning (G_STRLOC ": GtkArg compatibility code can't be mixed with customized %s.get_property() implementation", - g_type_name (type)); - return; - } - oclass->get_property = gtk_arg_proxy_get_property; - } - if (arg_flags & G_PARAM_WRITABLE) - { - if (oclass->set_property && oclass->set_property != gtk_arg_proxy_set_property) - { - g_warning (G_STRLOC ": GtkArg compatibility code can't be mixed with customized %s.set_property() implementation", - g_type_name (type)); - return; - } - oclass->set_property = gtk_arg_proxy_set_property; - } - switch (G_TYPE_FUNDAMENTAL (arg_type)) - { - case G_TYPE_ENUM: - pspec = g_param_spec_enum (pname, NULL, NULL, arg_type, 0, arg_flags); - break; - case G_TYPE_FLAGS: - pspec = g_param_spec_flags (pname, NULL, NULL, arg_type, 0, arg_flags); - break; - case G_TYPE_CHAR: - pspec = g_param_spec_char (pname, NULL, NULL, -128, 127, 0, arg_flags); - break; - case G_TYPE_UCHAR: - pspec = g_param_spec_uchar (pname, NULL, NULL, 0, 255, 0, arg_flags); - break; - case G_TYPE_BOOLEAN: - pspec = g_param_spec_boolean (pname, NULL, NULL, FALSE, arg_flags); - break; - case G_TYPE_INT: - pspec = g_param_spec_int (pname, NULL, NULL, G_MININT, G_MAXINT, 0, arg_flags); - break; - case G_TYPE_UINT: - pspec = g_param_spec_uint (pname, NULL, NULL, 0, G_MAXUINT, 0, arg_flags); - break; - case G_TYPE_FLOAT: - pspec = g_param_spec_float (pname, NULL, NULL, -G_MAXFLOAT, G_MAXFLOAT, 0, arg_flags); - break; - case G_TYPE_DOUBLE: - pspec = g_param_spec_double (pname, NULL, NULL, -G_MAXDOUBLE, G_MAXDOUBLE, 0, arg_flags); - break; - case G_TYPE_STRING: - pspec = g_param_spec_string (pname, NULL, NULL, NULL, arg_flags); - break; - case G_TYPE_POINTER: - pspec = g_param_spec_pointer (pname, NULL, NULL, arg_flags); - break; - case G_TYPE_OBJECT: - pspec = g_param_spec_object (pname, NULL, NULL, arg_type, arg_flags); - break; - case G_TYPE_BOXED: - if (!G_TYPE_IS_FUNDAMENTAL (arg_type)) - { - pspec = g_param_spec_boxed (pname, NULL, NULL, arg_type, arg_flags); - break; - } - default: - g_warning (G_STRLOC ": Property type `%s' is not supported by the GtkArg compatibility code", - g_type_name (arg_type)); - return; - } - g_object_class_install_property (oclass, arg_id, pspec); -} - -static guint (*gobject_floating_flag_handler) (GtkObject*,gint) = NULL; - -static guint -gtk_object_floating_flag_handler (GtkObject *object, - gint job) -{ - /* FIXME: remove this whole thing once GTK+ breaks ABI */ - if (!GTK_IS_OBJECT (object)) - return gobject_floating_flag_handler (object, job); - switch (job) - { - guint32 oldvalue; - case +1: /* force floating if possible */ - do - oldvalue = g_atomic_int_get (&object->flags); - while (!g_atomic_int_compare_and_exchange ((gint *)&object->flags, oldvalue, oldvalue | GTK_FLOATING)); - return oldvalue & GTK_FLOATING; - case -1: /* sink if possible */ - do - oldvalue = g_atomic_int_get (&object->flags); - while (!g_atomic_int_compare_and_exchange ((gint *)&object->flags, oldvalue, oldvalue & ~(guint32) GTK_FLOATING)); - return oldvalue & GTK_FLOATING; - default: /* check floating */ - return 0 != (g_atomic_int_get (&object->flags) & GTK_FLOATING); - } -} - static void gtk_object_class_init (GtkObjectClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); - gboolean is_glib_2_10_1; parent_class = g_type_class_ref (G_TYPE_OBJECT); - is_glib_2_10_1 = g_object_compat_control (3, &gobject_floating_flag_handler); - if (!is_glib_2_10_1) - g_error ("this version of Gtk+ requires GLib-2.10.1"); - g_object_compat_control (2, gtk_object_floating_flag_handler); - - gobject_class->set_property = gtk_object_set_property; - gobject_class->get_property = gtk_object_get_property; gobject_class->dispose = gtk_object_dispose; gobject_class->finalize = gtk_object_finalize; class->destroy = gtk_object_real_destroy; - g_object_class_install_property (gobject_class, - PROP_USER_DATA, - g_param_spec_pointer ("user-data", - P_("User Data"), - P_("Anonymous User Data Pointer"), - GTK_PARAM_READWRITE)); object_signals[DESTROY] = g_signal_new (I_("destroy"), G_TYPE_FROM_CLASS (gobject_class), @@ -384,12 +126,6 @@ static void gtk_object_init (GtkObject *object, GtkObjectClass *klass) { - gboolean was_floating; - /* sink the GInitiallyUnowned floating flag */ - was_floating = gobject_floating_flag_handler (object, -1); - /* set GTK_FLOATING via gtk_object_floating_flag_handler */ - if (was_floating) - g_object_force_floating (G_OBJECT (object)); } /******************************************** @@ -399,7 +135,6 @@ gtk_object_init (GtkObject *object, void gtk_object_destroy (GtkObject *object) { - g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_OBJECT (object)); if (!(GTK_OBJECT_FLAGS (object) & GTK_IN_DESTRUCTION)) @@ -445,336 +180,8 @@ gtk_object_finalize (GObject *gobject) "and must be removed with g_object_ref_sink()."); } - gtk_object_notify_weaks (object); - G_OBJECT_CLASS (parent_class)->finalize (gobject); } -/***************************************** - * GtkObject argument handlers - * - *****************************************/ - -static void -gtk_object_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (property_id) - { - case PROP_USER_DATA: - g_object_set_data (G_OBJECT (object), I_("user_data"), g_value_get_pointer (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gtk_object_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - switch (property_id) - { - case PROP_USER_DATA: - g_value_set_pointer (value, g_object_get_data (G_OBJECT (object), "user_data")); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -void -gtk_object_sink (GtkObject *object) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - g_object_ref_sink (object); - g_object_unref (object); -} - -/***************************************** - * Weak references. - * - * Weak refs are very similar to the old "destroy" signal. They allow - * one to register a callback that is called when the weakly - * referenced object is finalized. - * - * They are not implemented as a signal because they really are - * special and need to be used with great care. Unlike signals, which - * should be able to execute any code whatsoever. - * - * A weakref callback is not allowed to retain a reference to the - * object. Object data keys may be retrieved in a weak reference - * callback. - * - * A weakref callback is called at most once. - * - *****************************************/ - -typedef struct _GtkWeakRef GtkWeakRef; - -struct _GtkWeakRef -{ - GtkWeakRef *next; - GDestroyNotify notify; - gpointer data; -}; - -void -gtk_object_weakref (GtkObject *object, - GDestroyNotify notify, - gpointer data) -{ - GtkWeakRef *weak; - - g_return_if_fail (notify != NULL); - g_return_if_fail (GTK_IS_OBJECT (object)); - - if (!quark_weakrefs) - quark_weakrefs = g_quark_from_static_string ("gtk-weakrefs"); - - weak = g_new (GtkWeakRef, 1); - weak->next = g_object_get_qdata (G_OBJECT (object), quark_weakrefs); - weak->notify = notify; - weak->data = data; - g_object_set_qdata (G_OBJECT (object), quark_weakrefs, weak); -} - -void -gtk_object_weakunref (GtkObject *object, - GDestroyNotify notify, - gpointer data) -{ - GtkWeakRef *weaks, *w, **wp; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - if (!quark_weakrefs) - return; - - weaks = g_object_get_qdata (G_OBJECT (object), quark_weakrefs); - for (wp = &weaks; *wp; wp = &(*wp)->next) - { - w = *wp; - if (w->notify == notify && w->data == data) - { - if (w == weaks) - g_object_set_qdata (G_OBJECT (object), quark_weakrefs, w->next); - else - *wp = w->next; - g_free (w); - return; - } - } -} - -static void -gtk_object_notify_weaks (GtkObject *object) -{ - if (quark_weakrefs) - { - GtkWeakRef *w1, *w2; - - w1 = g_object_get_qdata (G_OBJECT (object), quark_weakrefs); - - while (w1) - { - w1->notify (w1->data); - w2 = w1->next; - g_free (w1); - w1 = w2; - } - } -} - -GtkObject* -gtk_object_new (GType object_type, - const gchar *first_property_name, - ...) -{ - GtkObject *object; - va_list var_args; - - g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL); - - va_start (var_args, first_property_name); - object = (GtkObject *)g_object_new_valist (object_type, first_property_name, var_args); - va_end (var_args); - - return object; -} - -void -gtk_object_get (GtkObject *object, - const gchar *first_property_name, - ...) -{ - va_list var_args; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - va_start (var_args, first_property_name); - g_object_get_valist (G_OBJECT (object), first_property_name, var_args); - va_end (var_args); -} - -void -gtk_object_set (GtkObject *object, - const gchar *first_property_name, - ...) -{ - va_list var_args; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - va_start (var_args, first_property_name); - g_object_set_valist (G_OBJECT (object), first_property_name, var_args); - va_end (var_args); -} - -/***************************************** - * GtkObject object_data mechanism - * - *****************************************/ - -void -gtk_object_set_data_by_id (GtkObject *object, - GQuark data_id, - gpointer data) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_datalist_id_set_data (&G_OBJECT (object)->qdata, data_id, data); -} - -void -gtk_object_set_data (GtkObject *object, - const gchar *key, - gpointer data) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - g_return_if_fail (key != NULL); - - g_datalist_set_data (&G_OBJECT (object)->qdata, key, data); -} - -void -gtk_object_set_data_by_id_full (GtkObject *object, - GQuark data_id, - gpointer data, - GDestroyNotify destroy) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_datalist_id_set_data_full (&G_OBJECT (object)->qdata, data_id, data, destroy); -} - -void -gtk_object_set_data_full (GtkObject *object, - const gchar *key, - gpointer data, - GDestroyNotify destroy) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - g_return_if_fail (key != NULL); - - g_datalist_set_data_full (&G_OBJECT (object)->qdata, key, data, destroy); -} - -gpointer -gtk_object_get_data_by_id (GtkObject *object, - GQuark data_id) -{ - g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); - - return g_datalist_id_get_data (&G_OBJECT (object)->qdata, data_id); -} - -gpointer -gtk_object_get_data (GtkObject *object, - const gchar *key) -{ - g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); - g_return_val_if_fail (key != NULL, NULL); - - return g_datalist_get_data (&G_OBJECT (object)->qdata, key); -} - -void -gtk_object_remove_data_by_id (GtkObject *object, - GQuark data_id) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_datalist_id_remove_data (&G_OBJECT (object)->qdata, data_id); -} - -void -gtk_object_remove_data (GtkObject *object, - const gchar *key) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - g_return_if_fail (key != NULL); - - g_datalist_remove_data (&G_OBJECT (object)->qdata, key); -} - -void -gtk_object_remove_no_notify_by_id (GtkObject *object, - GQuark key_id) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_datalist_id_remove_no_notify (&G_OBJECT (object)->qdata, key_id); -} - -void -gtk_object_remove_no_notify (GtkObject *object, - const gchar *key) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - g_return_if_fail (key != NULL); - - g_datalist_remove_no_notify (&G_OBJECT (object)->qdata, key); -} - -void -gtk_object_set_user_data (GtkObject *object, - gpointer data) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_object_set_data (G_OBJECT (object), "user_data", data); -} - -gpointer -gtk_object_get_user_data (GtkObject *object) -{ - g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); - - return g_object_get_data (G_OBJECT (object), "user_data"); -} - -GtkObject* -gtk_object_ref (GtkObject *object) -{ - g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); - - return (GtkObject*) g_object_ref ((GObject*) object); -} - -void -gtk_object_unref (GtkObject *object) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_object_unref ((GObject*) object); -} - #define __GTK_OBJECT_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkobject.h b/gtk/gtkobject.h index a32ecd0bf0..bb141c3d19 100644 --- a/gtk/gtkobject.h +++ b/gtk/gtkobject.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -82,9 +82,6 @@ G_BEGIN_DECLS typedef enum { GTK_IN_DESTRUCTION = 1 << 0, /* Used internally during dispose */ -#if !defined (GTK_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) - GTK_FLOATING = 1 << 1, -#endif GTK_RESERVED_1 = 1 << 2, GTK_RESERVED_2 = 1 << 3 } GtkObjectFlags; @@ -92,9 +89,6 @@ typedef enum /* Macros for extracting the object_flags from GtkObject. */ #define GTK_OBJECT_FLAGS(obj) (GTK_OBJECT (obj)->flags) -#ifndef GTK_DISABLE_DEPRECATED -#define GTK_OBJECT_FLOATING(obj) (g_object_is_floating (obj)) -#endif /* Macros for setting and clearing bits in the object_flags field of GtkObject. */ @@ -120,14 +114,6 @@ struct _GtkObjectClass { GInitiallyUnownedClass parent_class; - /* Non overridable class methods to set and get per class arguments */ - void (*set_arg) (GtkObject *object, - GtkArg *arg, - guint arg_id); - void (*get_arg) (GtkObject *object, - GtkArg *arg, - guint arg_id); - /* Default signal handler for the ::destroy signal, which is * invoked to request that references to the widget be dropped. * If an object class overrides destroy() in order to perform class @@ -139,112 +125,12 @@ struct _GtkObjectClass void (*destroy) (GtkObject *object); }; - - /* Application-level methods */ GType gtk_object_get_type (void) G_GNUC_CONST; -#ifndef GTK_DISABLE_DEPRECATED -void gtk_object_sink (GtkObject *object); -#endif void gtk_object_destroy (GtkObject *object); -/****************************************************************/ - -#ifndef GTK_DISABLE_DEPRECATED - -GtkObject* gtk_object_new (GType type, - const gchar *first_property_name, - ...); -GtkObject* gtk_object_ref (GtkObject *object); -void gtk_object_unref (GtkObject *object); -void gtk_object_weakref (GtkObject *object, - GDestroyNotify notify, - gpointer data); -void gtk_object_weakunref (GtkObject *object, - GDestroyNotify notify, - gpointer data); - -/* Set 'data' to the "object_data" field of the object. The - * data is indexed by the "key". If there is already data - * associated with "key" then the new data will replace it. - * If 'data' is NULL then this call is equivalent to - * 'gtk_object_remove_data'. - * The gtk_object_set_data_full variant acts just the same, - * but takes an additional argument which is a function to - * be called when the data is removed. - * `gtk_object_remove_data' is equivalent to the above, - * where 'data' is NULL - * `gtk_object_get_data' gets the data associated with "key". - */ -void gtk_object_set_data (GtkObject *object, - const gchar *key, - gpointer data); -void gtk_object_set_data_full (GtkObject *object, - const gchar *key, - gpointer data, - GDestroyNotify destroy); -void gtk_object_remove_data (GtkObject *object, - const gchar *key); -gpointer gtk_object_get_data (GtkObject *object, - const gchar *key); -void gtk_object_remove_no_notify (GtkObject *object, - const gchar *key); - -/* Set/get the "user_data" object data field of "object". It should - * be noted that these functions are no different than calling - * `gtk_object_set_data'/`gtk_object_get_data' with a key of "user_data". - * They are merely provided as a convenience. - */ -void gtk_object_set_user_data (GtkObject *object, - gpointer data); -gpointer gtk_object_get_user_data (GtkObject *object); - - -/* Object-level methods */ - -/* Object data method variants that operate on key ids. */ -void gtk_object_set_data_by_id (GtkObject *object, - GQuark data_id, - gpointer data); -void gtk_object_set_data_by_id_full (GtkObject *object, - GQuark data_id, - gpointer data, - GDestroyNotify destroy); -gpointer gtk_object_get_data_by_id (GtkObject *object, - GQuark data_id); -void gtk_object_remove_data_by_id (GtkObject *object, - GQuark data_id); -void gtk_object_remove_no_notify_by_id (GtkObject *object, - GQuark key_id); -#define gtk_object_data_try_key g_quark_try_string -#define gtk_object_data_force_id g_quark_from_string - -/* GtkArg flag bits for gtk_object_add_arg_type - */ -typedef enum -{ - GTK_ARG_READABLE = G_PARAM_READABLE, - GTK_ARG_WRITABLE = G_PARAM_WRITABLE, - GTK_ARG_CONSTRUCT = G_PARAM_CONSTRUCT, - GTK_ARG_CONSTRUCT_ONLY = G_PARAM_CONSTRUCT_ONLY, - GTK_ARG_CHILD_ARG = 1 << 4 -} GtkArgFlags; -#define GTK_ARG_READWRITE (GTK_ARG_READABLE | GTK_ARG_WRITABLE) -void gtk_object_get (GtkObject *object, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; -void gtk_object_set (GtkObject *object, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; -void gtk_object_add_arg_type (const gchar *arg_name, - GType arg_type, - guint arg_flags, - guint arg_id); - -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_OBJECT_H__ */ diff --git a/gtk/gtkoldeditable.c b/gtk/gtkoldeditable.c deleted file mode 100644 index 983e99fd3a..0000000000 --- a/gtk/gtkoldeditable.c +++ /dev/null @@ -1,829 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" -#include <string.h> -#include "gdk/gdkkeysyms.h" -#include "gdk/gdki18n.h" -#include "gtkclipboard.h" -#include "gtkoldeditable.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtkselection.h" -#include "gtksignal.h" -#include "gtkintl.h" - -#include "gtkalias.h" - -#define MIN_EDITABLE_WIDTH 150 -#define DRAW_TIMEOUT 20 -#define INNER_BORDER 2 - -enum { - /* Binding actions */ - ACTIVATE, - SET_EDITABLE, - MOVE_CURSOR, - MOVE_WORD, - MOVE_PAGE, - MOVE_TO_ROW, - MOVE_TO_COLUMN, - KILL_CHAR, - KILL_WORD, - KILL_LINE, - CUT_CLIPBOARD, - COPY_CLIPBOARD, - PASTE_CLIPBOARD, - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_TEXT_POSITION, - ARG_EDITABLE -}; - -/* values for selection info */ - -enum { - TARGET_STRING, - TARGET_TEXT, - TARGET_COMPOUND_TEXT -}; - -static void gtk_old_editable_editable_init (GtkEditableClass *iface); -static void gtk_old_editable_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_old_editable_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void *gtk_old_editable_get_public_chars (GtkOldEditable *old_editable, - gint start, - gint end); - -static gint gtk_old_editable_selection_clear (GtkWidget *widget, - GdkEventSelection *event); -static void gtk_old_editable_selection_get (GtkWidget *widget, - GtkSelectionData *selection_data, - guint info, - guint time); -static void gtk_old_editable_selection_received (GtkWidget *widget, - GtkSelectionData *selection_data, - guint time); - -static void gtk_old_editable_set_selection (GtkOldEditable *old_editable, - gint start, - gint end); - -static void gtk_old_editable_real_set_editable (GtkOldEditable *old_editable, - gboolean is_editable); -static void gtk_old_editable_real_cut_clipboard (GtkOldEditable *old_editable); -static void gtk_old_editable_real_copy_clipboard (GtkOldEditable *old_editable); -static void gtk_old_editable_real_paste_clipboard (GtkOldEditable *old_editable); - -static void gtk_old_editable_insert_text (GtkEditable *editable, - const gchar *new_text, - gint new_text_length, - gint *position); -static void gtk_old_editable_delete_text (GtkEditable *editable, - gint start_pos, - gint end_pos); -static gchar * gtk_old_editable_get_chars (GtkEditable *editable, - gint start, - gint end); -static void gtk_old_editable_set_selection_bounds (GtkEditable *editable, - gint start, - gint end); -static gboolean gtk_old_editable_get_selection_bounds (GtkEditable *editable, - gint *start, - gint *end); -static void gtk_old_editable_set_position (GtkEditable *editable, - gint position); -static gint gtk_old_editable_get_position (GtkEditable *editable); -static void gtk_old_editable_finalize (GObject *object); - -static guint editable_signals[LAST_SIGNAL] = { 0 }; - -G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GtkOldEditable, gtk_old_editable, GTK_TYPE_WIDGET, - G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, - gtk_old_editable_editable_init)) - -static void -gtk_old_editable_class_init (GtkOldEditableClass *class) -{ - GObjectClass *gobject_class; - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - gobject_class = (GObjectClass*) class; - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - - gobject_class->finalize = gtk_old_editable_finalize; - - object_class->set_arg = gtk_old_editable_set_arg; - object_class->get_arg = gtk_old_editable_get_arg; - - widget_class->selection_clear_event = gtk_old_editable_selection_clear; - widget_class->selection_received = gtk_old_editable_selection_received; - widget_class->selection_get = gtk_old_editable_selection_get; - - class->activate = NULL; - class->set_editable = gtk_old_editable_real_set_editable; - - class->move_cursor = NULL; - class->move_word = NULL; - class->move_page = NULL; - class->move_to_row = NULL; - class->move_to_column = NULL; - - class->kill_char = NULL; - class->kill_word = NULL; - class->kill_line = NULL; - - class->cut_clipboard = gtk_old_editable_real_cut_clipboard; - class->copy_clipboard = gtk_old_editable_real_copy_clipboard; - class->paste_clipboard = gtk_old_editable_real_paste_clipboard; - - class->update_text = NULL; - class->get_chars = NULL; - class->set_selection = NULL; - class->set_position = NULL; - - editable_signals[ACTIVATE] = - gtk_signal_new (I_("activate"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, activate), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - widget_class->activate_signal = editable_signals[ACTIVATE]; - - editable_signals[SET_EDITABLE] = - gtk_signal_new (I_("set-editable"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, set_editable), - _gtk_marshal_VOID__BOOLEAN, - GTK_TYPE_NONE, 1, - GTK_TYPE_BOOL); - - editable_signals[MOVE_CURSOR] = - gtk_signal_new (I_("move-cursor"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, move_cursor), - _gtk_marshal_VOID__INT_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_INT, - GTK_TYPE_INT); - - editable_signals[MOVE_WORD] = - gtk_signal_new (I_("move-word"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, move_word), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - editable_signals[MOVE_PAGE] = - gtk_signal_new (I_("move-page"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, move_page), - _gtk_marshal_VOID__INT_INT, - GTK_TYPE_NONE, 2, - GTK_TYPE_INT, - GTK_TYPE_INT); - - editable_signals[MOVE_TO_ROW] = - gtk_signal_new (I_("move-to-row"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, move_to_row), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - editable_signals[MOVE_TO_COLUMN] = - gtk_signal_new (I_("move-to-column"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, move_to_column), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - editable_signals[KILL_CHAR] = - gtk_signal_new (I_("kill-char"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, kill_char), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - editable_signals[KILL_WORD] = - gtk_signal_new (I_("kill-word"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, kill_word), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - editable_signals[KILL_LINE] = - gtk_signal_new (I_("kill-line"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, kill_line), - _gtk_marshal_VOID__INT, - GTK_TYPE_NONE, 1, - GTK_TYPE_INT); - - editable_signals[CUT_CLIPBOARD] = - gtk_signal_new (I_("cut-clipboard"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, cut_clipboard), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - - editable_signals[COPY_CLIPBOARD] = - gtk_signal_new (I_("copy-clipboard"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, copy_clipboard), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - - editable_signals[PASTE_CLIPBOARD] = - gtk_signal_new (I_("paste-clipboard"), - GTK_RUN_LAST | GTK_RUN_ACTION, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkOldEditableClass, paste_clipboard), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - - gtk_object_add_arg_type ("GtkOldEditable::text-position", GTK_TYPE_INT, GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, ARG_TEXT_POSITION); - gtk_object_add_arg_type ("GtkOldEditable::editable", GTK_TYPE_BOOL, GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, ARG_EDITABLE); -} - -static void -gtk_old_editable_editable_init (GtkEditableClass *iface) -{ - iface->do_insert_text = gtk_old_editable_insert_text; - iface->do_delete_text = gtk_old_editable_delete_text; - iface->get_chars = gtk_old_editable_get_chars; - iface->set_selection_bounds = gtk_old_editable_set_selection_bounds; - iface->get_selection_bounds = gtk_old_editable_get_selection_bounds; - iface->set_position = gtk_old_editable_set_position; - iface->get_position = gtk_old_editable_get_position; -} - -static void -gtk_old_editable_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkEditable *editable = GTK_EDITABLE (object); - - switch (arg_id) - { - case ARG_TEXT_POSITION: - gtk_editable_set_position (editable, GTK_VALUE_INT (*arg)); - break; - case ARG_EDITABLE: - gtk_signal_emit (object, editable_signals[SET_EDITABLE], - GTK_VALUE_BOOL (*arg) != FALSE); - break; - default: - break; - } -} - -static void -gtk_old_editable_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkOldEditable *old_editable; - - old_editable = GTK_OLD_EDITABLE (object); - - switch (arg_id) - { - case ARG_TEXT_POSITION: - GTK_VALUE_INT (*arg) = old_editable->current_pos; - break; - case ARG_EDITABLE: - GTK_VALUE_BOOL (*arg) = old_editable->editable; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -gtk_old_editable_init (GtkOldEditable *old_editable) -{ - static const GtkTargetEntry targets[] = { - { "UTF8_STRING", 0, 0 }, - { "STRING", 0, 0 }, - { "TEXT", 0, 0 }, - { "COMPOUND_TEXT", 0, 0 } - }; - - gtk_widget_set_can_focus (GTK_WIDGET (old_editable), TRUE); - - old_editable->selection_start_pos = 0; - old_editable->selection_end_pos = 0; - old_editable->has_selection = FALSE; - old_editable->editable = 1; - old_editable->visible = 1; - old_editable->clipboard_text = NULL; - - gtk_selection_add_targets (GTK_WIDGET (old_editable), GDK_SELECTION_PRIMARY, - targets, G_N_ELEMENTS (targets)); -} - -static void -gtk_old_editable_finalize (GObject *object) -{ - gtk_selection_clear_targets (GTK_WIDGET (object), GDK_SELECTION_PRIMARY); - - G_OBJECT_CLASS (gtk_old_editable_parent_class)->finalize (object); -} - -static void -gtk_old_editable_insert_text (GtkEditable *editable, - const gchar *new_text, - gint new_text_length, - gint *position) -{ - gchar buf[64]; - gchar *text; - - g_object_ref (editable); - - if (new_text_length <= 63) - text = buf; - else - text = g_new (gchar, new_text_length + 1); - - text[new_text_length] = '\0'; - strncpy (text, new_text, new_text_length); - - g_signal_emit_by_name (editable, "insert-text", text, new_text_length, - position); - g_signal_emit_by_name (editable, "changed"); - - if (new_text_length > 63) - g_free (text); - - g_object_unref (editable); -} - -static void -gtk_old_editable_delete_text (GtkEditable *editable, - gint start_pos, - gint end_pos) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (editable); - - g_object_ref (old_editable); - - g_signal_emit_by_name (editable, "delete-text", start_pos, end_pos); - g_signal_emit_by_name (editable, "changed"); - - if (old_editable->selection_start_pos == old_editable->selection_end_pos && - old_editable->has_selection) - gtk_old_editable_claim_selection (old_editable, FALSE, GDK_CURRENT_TIME); - - g_object_unref (old_editable); -} - -static void -gtk_old_editable_update_text (GtkOldEditable *old_editable, - gint start_pos, - gint end_pos) -{ - GtkOldEditableClass *klass = GTK_OLD_EDITABLE_GET_CLASS (old_editable); - klass->update_text (GTK_OLD_EDITABLE (old_editable), start_pos, end_pos); -} - -static gchar * -gtk_old_editable_get_chars (GtkEditable *editable, - gint start, - gint end) -{ - GtkOldEditableClass *klass = GTK_OLD_EDITABLE_GET_CLASS (editable); - return klass->get_chars (GTK_OLD_EDITABLE (editable), start, end); -} - -/* - * Like gtk_editable_get_chars, but if the editable is not - * visible, return asterisks; also convert result to UTF-8. - */ -static void * -gtk_old_editable_get_public_chars (GtkOldEditable *old_editable, - gint start, - gint end) -{ - gchar *str = NULL; - const gchar *charset; - gboolean need_conversion = !g_get_charset (&charset); - - if (old_editable->visible) - { - GError *error = NULL; - gchar *tmp = gtk_editable_get_chars (GTK_EDITABLE (old_editable), start, end); - - if (need_conversion) - { - str = g_convert (tmp, -1, - "UTF-8", charset, - NULL, NULL, &error); - - if (!str) - { - g_warning ("Cannot convert text from charset to UTF-8 %s: %s", charset, error->message); - g_error_free (error); - } - - g_free (tmp); - } - else - str = tmp; - } - else - { - gint i; - gint nchars = end - start; - - if (nchars < 0) - nchars = -nchars; - - str = g_new (gchar, nchars + 1); - for (i = 0; i<nchars; i++) - str[i] = '*'; - str[i] = '\0'; - } - - return str; -} - -static void -gtk_old_editable_set_selection (GtkOldEditable *old_editable, - gint start_pos, - gint end_pos) -{ - GtkOldEditableClass *klass = GTK_OLD_EDITABLE_GET_CLASS (old_editable); - klass->set_selection (old_editable, start_pos, end_pos); -} - -static void -gtk_old_editable_set_position (GtkEditable *editable, - gint position) -{ - GtkOldEditableClass *klass = GTK_OLD_EDITABLE_GET_CLASS (editable); - - klass->set_position (GTK_OLD_EDITABLE (editable), position); -} - -static gint -gtk_old_editable_get_position (GtkEditable *editable) -{ - return GTK_OLD_EDITABLE (editable)->current_pos; -} - -static gint -gtk_old_editable_selection_clear (GtkWidget *widget, - GdkEventSelection *event) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (widget); - - /* Let the selection handling code know that the selection - * has been changed, since we've overriden the default handler */ - if (!GTK_WIDGET_CLASS (gtk_old_editable_parent_class)->selection_clear_event (widget, event)) - return FALSE; - - if (old_editable->has_selection) - { - old_editable->has_selection = FALSE; - gtk_old_editable_update_text (old_editable, old_editable->selection_start_pos, - old_editable->selection_end_pos); - } - - return TRUE; -} - -static void -gtk_old_editable_selection_get (GtkWidget *widget, - GtkSelectionData *selection_data, - guint info, - guint time) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (widget); - gint selection_start_pos; - gint selection_end_pos; - - gchar *str; - - selection_start_pos = MIN (old_editable->selection_start_pos, old_editable->selection_end_pos); - selection_end_pos = MAX (old_editable->selection_start_pos, old_editable->selection_end_pos); - - str = gtk_old_editable_get_public_chars (old_editable, - selection_start_pos, - selection_end_pos); - - if (str) - { - gtk_selection_data_set_text (selection_data, str, -1); - g_free (str); - } -} - -static void -gtk_old_editable_paste_received (GtkOldEditable *old_editable, - const gchar *text, - gboolean is_clipboard) -{ - const gchar *str = NULL; - const gchar *charset; - gboolean need_conversion = FALSE; - - if (text) - { - GError *error = NULL; - - need_conversion = !g_get_charset (&charset); - - if (need_conversion) - { - str = g_convert_with_fallback (text, -1, - charset, "UTF-8", NULL, - NULL, NULL, &error); - if (!str) - { - g_warning ("Cannot convert text from UTF-8 to %s: %s", - charset, error->message); - g_error_free (error); - return; - } - } - else - str = text; - } - - if (str) - { - gboolean reselect; - gint old_pos; - gint tmp_pos; - - reselect = FALSE; - - if ((old_editable->selection_start_pos != old_editable->selection_end_pos) && - (!old_editable->has_selection || is_clipboard)) - { - reselect = TRUE; - - /* Don't want to call gtk_editable_delete_selection here if we are going - * to reclaim the selection to avoid extra server traffic */ - if (old_editable->has_selection) - { - gtk_editable_delete_text (GTK_EDITABLE (old_editable), - MIN (old_editable->selection_start_pos, old_editable->selection_end_pos), - MAX (old_editable->selection_start_pos, old_editable->selection_end_pos)); - } - else - gtk_editable_delete_selection (GTK_EDITABLE (old_editable)); - } - - tmp_pos = old_pos = old_editable->current_pos; - - gtk_editable_insert_text (GTK_EDITABLE (old_editable), str, -1, &tmp_pos); - - if (reselect) - gtk_old_editable_set_selection (old_editable, old_pos, old_editable->current_pos); - - if (str && str != text) - g_free ((gchar *) str); - } -} - -static void -gtk_old_editable_selection_received (GtkWidget *widget, - GtkSelectionData *selection_data, - guint time) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (widget); - - guchar *text = gtk_selection_data_get_text (selection_data); - - if (!text) - { - /* If we asked for UTF8 and didn't get it, try text; if we asked - * for text and didn't get it, try string. If we asked for - * anything else and didn't get it, give up. - */ - if (selection_data->target == gdk_atom_intern_static_string ("UTF8_STRING")) - { - gtk_selection_convert (widget, GDK_SELECTION_PRIMARY, - gdk_atom_intern_static_string ("TEXT"), - time); - return; - } - else if (selection_data->target == gdk_atom_intern_static_string ("TEXT")) - { - gtk_selection_convert (widget, GDK_SELECTION_PRIMARY, - GDK_TARGET_STRING, - time); - return; - } - } - - if (text) - { - gtk_old_editable_paste_received (old_editable, (gchar *) text, FALSE); - g_free (text); - } -} - -static void -old_editable_text_received_cb (GtkClipboard *clipboard, - const gchar *text, - gpointer data) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (data); - - gtk_old_editable_paste_received (old_editable, text, TRUE); - g_object_unref (G_OBJECT (old_editable)); -} - -/** - * gtk_old_editable_claim_selection: - * @old_editable: a #GtkOldEditable - * @claim: if %TRUE, claim ownership of the selection, if %FALSE, give - * up ownership - * @time_: timestamp for this operation - * - * Claims or gives up ownership of the selection. - */ -void -gtk_old_editable_claim_selection (GtkOldEditable *old_editable, - gboolean claim, - guint32 time) -{ - GtkWidget *widget; - GdkDisplay *display; - - g_return_if_fail (GTK_IS_OLD_EDITABLE (old_editable)); - widget = GTK_WIDGET (old_editable); - g_return_if_fail (gtk_widget_get_realized (widget)); - - display = gtk_widget_get_display (widget); - old_editable->has_selection = FALSE; - - if (claim) - { - if (gtk_selection_owner_set_for_display (display, widget, - GDK_SELECTION_PRIMARY, time)) - old_editable->has_selection = TRUE; - } - else - { - if (gdk_selection_owner_get_for_display (display, GDK_SELECTION_PRIMARY) == widget->window) - gtk_selection_owner_set_for_display (display, - NULL, - GDK_SELECTION_PRIMARY, time); - } -} - -static void -gtk_old_editable_set_selection_bounds (GtkEditable *editable, - gint start, - gint end) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (editable); - - if (gtk_widget_get_realized (GTK_WIDGET (editable))) - gtk_old_editable_claim_selection (old_editable, start != end, GDK_CURRENT_TIME); - - gtk_old_editable_set_selection (old_editable, start, end); -} - -static gboolean -gtk_old_editable_get_selection_bounds (GtkEditable *editable, - gint *start, - gint *end) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (editable); - - *start = old_editable->selection_start_pos; - *end = old_editable->selection_end_pos; - - return (old_editable->selection_start_pos != old_editable->selection_end_pos); -} - -static void -gtk_old_editable_real_set_editable (GtkOldEditable *old_editable, - gboolean is_editable) -{ - is_editable = is_editable != FALSE; - - if (old_editable->editable != is_editable) - { - old_editable->editable = is_editable; - gtk_widget_queue_draw (GTK_WIDGET (old_editable)); - } -} - -static void -gtk_old_editable_real_cut_clipboard (GtkOldEditable *old_editable) -{ - gtk_old_editable_real_copy_clipboard (old_editable); - gtk_editable_delete_selection (GTK_EDITABLE (old_editable)); -} - -static void -gtk_old_editable_real_copy_clipboard (GtkOldEditable *old_editable) -{ - gint selection_start_pos; - gint selection_end_pos; - - selection_start_pos = MIN (old_editable->selection_start_pos, old_editable->selection_end_pos); - selection_end_pos = MAX (old_editable->selection_start_pos, old_editable->selection_end_pos); - - if (selection_start_pos != selection_end_pos) - { - gchar *text = gtk_old_editable_get_public_chars (old_editable, - selection_start_pos, - selection_end_pos); - - if (text) - { - GtkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (old_editable), - GDK_SELECTION_CLIPBOARD); - - gtk_clipboard_set_text (clipboard, text, -1); - g_free (text); - } - } -} - -static void -gtk_old_editable_real_paste_clipboard (GtkOldEditable *old_editable) -{ - GtkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (old_editable), - GDK_SELECTION_CLIPBOARD); - - g_object_ref (G_OBJECT (old_editable)); - gtk_clipboard_request_text (clipboard, old_editable_text_received_cb, old_editable); -} - -/** - * gtk_old_editable_changed: - * @old_editable: a #GtkOldEditable - * - * Emits the ::changed signal on @old_editable. - */ -void -gtk_old_editable_changed (GtkOldEditable *old_editable) -{ - g_return_if_fail (GTK_IS_OLD_EDITABLE (old_editable)); - - g_signal_emit_by_name (old_editable, "changed"); -} - -#define __GTK_OLD_EDITABLE_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkoldeditable.h b/gtk/gtkoldeditable.h deleted file mode 100644 index ba497cd1cc..0000000000 --- a/gtk/gtkoldeditable.h +++ /dev/null @@ -1,126 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_OLD_EDITABLE_H__ -#define __GTK_OLD_EDITABLE_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_OLD_EDITABLE (gtk_old_editable_get_type ()) -#define GTK_OLD_EDITABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_OLD_EDITABLE, GtkOldEditable)) -#define GTK_OLD_EDITABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_OLD_EDITABLE, GtkOldEditableClass)) -#define GTK_IS_OLD_EDITABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_OLD_EDITABLE)) -#define GTK_IS_OLD_EDITABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_OLD_EDITABLE)) -#define GTK_OLD_EDITABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_OLD_EDITABLE, GtkOldEditableClass)) - - -typedef struct _GtkOldEditable GtkOldEditable; -typedef struct _GtkOldEditableClass GtkOldEditableClass; - -typedef void (*GtkTextFunction) (GtkOldEditable *editable, guint32 time_); - -struct _GtkOldEditable -{ - GtkWidget widget; - - /*< public >*/ - guint current_pos; - - guint selection_start_pos; - guint selection_end_pos; - guint has_selection : 1; - - /*< private >*/ - guint editable : 1; - guint visible : 1; - - gchar *clipboard_text; -}; - -struct _GtkOldEditableClass -{ - GtkWidgetClass parent_class; - - /* Bindings actions */ - void (* activate) (GtkOldEditable *editable); - void (* set_editable) (GtkOldEditable *editable, - gboolean is_editable); - void (* move_cursor) (GtkOldEditable *editable, - gint x, - gint y); - void (* move_word) (GtkOldEditable *editable, - gint n); - void (* move_page) (GtkOldEditable *editable, - gint x, - gint y); - void (* move_to_row) (GtkOldEditable *editable, - gint row); - void (* move_to_column) (GtkOldEditable *editable, - gint row); - void (* kill_char) (GtkOldEditable *editable, - gint direction); - void (* kill_word) (GtkOldEditable *editable, - gint direction); - void (* kill_line) (GtkOldEditable *editable, - gint direction); - void (* cut_clipboard) (GtkOldEditable *editable); - void (* copy_clipboard) (GtkOldEditable *editable); - void (* paste_clipboard) (GtkOldEditable *editable); - - /* Virtual functions. get_chars is in paricular not a signal because - * it returns malloced memory. The others are not signals because - * they would not be particularly useful as such. (All changes to - * selection and position do not go through these functions) - */ - void (* update_text) (GtkOldEditable *editable, - gint start_pos, - gint end_pos); - gchar* (* get_chars) (GtkOldEditable *editable, - gint start_pos, - gint end_pos); - void (* set_selection)(GtkOldEditable *editable, - gint start_pos, - gint end_pos); - void (* set_position) (GtkOldEditable *editable, - gint position); -}; - -GType gtk_old_editable_get_type (void) G_GNUC_CONST; -void gtk_old_editable_claim_selection (GtkOldEditable *old_editable, - gboolean claim, - guint32 time_); -void gtk_old_editable_changed (GtkOldEditable *old_editable); - -G_END_DECLS - -#endif /* __GTK_OLD_EDITABLE_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkoptionmenu.c b/gtk/gtkoptionmenu.c deleted file mode 100644 index c53018c478..0000000000 --- a/gtk/gtkoptionmenu.c +++ /dev/null @@ -1,1036 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Jsh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include "gdk/gdkkeysyms.h" - -#undef GTK_DISABLE_DEPRECATED - -#include "gtkmenu.h" -#include "gtkmenuitem.h" -#include "gtkmarshalers.h" -#include "gtkoptionmenu.h" -#include "gtkprivate.h" -#include "gtkintl.h" -#include "gtkalias.h" - -#define CHILD_LEFT_SPACING 4 -#define CHILD_RIGHT_SPACING 1 -#define CHILD_TOP_SPACING 1 -#define CHILD_BOTTOM_SPACING 1 - -typedef struct _GtkOptionMenuProps GtkOptionMenuProps; - -struct _GtkOptionMenuProps -{ - gboolean interior_focus; - GtkRequisition indicator_size; - GtkBorder indicator_spacing; - gint focus_width; - gint focus_pad; -}; - -static const GtkOptionMenuProps default_props = { - TRUE, - { 7, 13 }, - { 7, 5, 2, 2 }, /* Left, right, top, bottom */ - 1, - 0 -}; - -static void gtk_option_menu_destroy (GtkObject *object); -static void gtk_option_menu_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_option_menu_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void gtk_option_menu_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_option_menu_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_option_menu_paint (GtkWidget *widget, - GdkRectangle *area); -static gint gtk_option_menu_expose (GtkWidget *widget, - GdkEventExpose *event); -static gint gtk_option_menu_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_option_menu_key_press (GtkWidget *widget, - GdkEventKey *event); -static void gtk_option_menu_selection_done (GtkMenuShell *menu_shell, - GtkOptionMenu *option_menu); -static void gtk_option_menu_update_contents (GtkOptionMenu *option_menu); -static void gtk_option_menu_remove_contents (GtkOptionMenu *option_menu); -static void gtk_option_menu_calc_size (GtkOptionMenu *option_menu); -static void gtk_option_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gint *scroll_offet, - gpointer user_data); -static void gtk_option_menu_show_all (GtkWidget *widget); -static void gtk_option_menu_hide_all (GtkWidget *widget); -static gboolean gtk_option_menu_mnemonic_activate (GtkWidget *widget, - gboolean group_cycling); -static GType gtk_option_menu_child_type (GtkContainer *container); -static gint gtk_option_menu_scroll_event (GtkWidget *widget, - GdkEventScroll *event); - -enum -{ - CHANGED, - LAST_SIGNAL -}; - -enum -{ - PROP_0, - PROP_MENU -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -G_DEFINE_TYPE (GtkOptionMenu, gtk_option_menu, GTK_TYPE_BUTTON) - -static void -gtk_option_menu_class_init (GtkOptionMenuClass *class) -{ - GObjectClass *gobject_class; - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - gobject_class = (GObjectClass*) class; - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - container_class = (GtkContainerClass*) class; - - signals[CHANGED] = - g_signal_new (I_("changed"), - G_OBJECT_CLASS_TYPE (class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkOptionMenuClass, changed), - NULL, NULL, - _gtk_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - gobject_class->set_property = gtk_option_menu_set_property; - gobject_class->get_property = gtk_option_menu_get_property; - object_class->destroy = gtk_option_menu_destroy; - - widget_class->size_request = gtk_option_menu_size_request; - widget_class->size_allocate = gtk_option_menu_size_allocate; - widget_class->expose_event = gtk_option_menu_expose; - widget_class->button_press_event = gtk_option_menu_button_press; - widget_class->key_press_event = gtk_option_menu_key_press; - widget_class->scroll_event = gtk_option_menu_scroll_event; - widget_class->show_all = gtk_option_menu_show_all; - widget_class->hide_all = gtk_option_menu_hide_all; - widget_class->mnemonic_activate = gtk_option_menu_mnemonic_activate; - - container_class->child_type = gtk_option_menu_child_type; - - g_object_class_install_property (gobject_class, - PROP_MENU, - g_param_spec_object ("menu", - P_("Menu"), - P_("The menu of options"), - GTK_TYPE_MENU, - GTK_PARAM_READWRITE)); - - gtk_widget_class_install_style_property (widget_class, - g_param_spec_boxed ("indicator-size", - P_("Indicator Size"), - P_("Size of dropdown indicator"), - GTK_TYPE_REQUISITION, - GTK_PARAM_READABLE)); - gtk_widget_class_install_style_property (widget_class, - g_param_spec_boxed ("indicator-spacing", - P_("Indicator Spacing"), - P_("Spacing around indicator"), - GTK_TYPE_BORDER, - GTK_PARAM_READABLE)); -} - -static GType -gtk_option_menu_child_type (GtkContainer *container) -{ - return G_TYPE_NONE; -} - -static void -gtk_option_menu_init (GtkOptionMenu *option_menu) -{ - GtkWidget *widget = GTK_WIDGET (option_menu); - - gtk_widget_set_can_focus (widget, TRUE); - gtk_widget_set_can_default (widget, FALSE); - gtk_widget_set_receives_default (widget, FALSE); - - option_menu->menu = NULL; - option_menu->menu_item = NULL; - option_menu->width = 0; - option_menu->height = 0; -} - -GtkWidget* -gtk_option_menu_new (void) -{ - return g_object_new (GTK_TYPE_OPTION_MENU, NULL); -} - -GtkWidget* -gtk_option_menu_get_menu (GtkOptionMenu *option_menu) -{ - g_return_val_if_fail (GTK_IS_OPTION_MENU (option_menu), NULL); - - return option_menu->menu; -} - -static void -gtk_option_menu_detacher (GtkWidget *widget, - GtkMenu *menu) -{ - GtkOptionMenu *option_menu; - - g_return_if_fail (GTK_IS_OPTION_MENU (widget)); - - option_menu = GTK_OPTION_MENU (widget); - g_return_if_fail (option_menu->menu == (GtkWidget*) menu); - - gtk_option_menu_remove_contents (option_menu); - g_signal_handlers_disconnect_by_func (option_menu->menu, - gtk_option_menu_selection_done, - option_menu); - g_signal_handlers_disconnect_by_func (option_menu->menu, - gtk_option_menu_calc_size, - option_menu); - - option_menu->menu = NULL; - g_object_notify (G_OBJECT (option_menu), "menu"); -} - -void -gtk_option_menu_set_menu (GtkOptionMenu *option_menu, - GtkWidget *menu) -{ - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - g_return_if_fail (GTK_IS_MENU (menu)); - - if (option_menu->menu != menu) - { - gtk_option_menu_remove_menu (option_menu); - - option_menu->menu = menu; - gtk_menu_attach_to_widget (GTK_MENU (menu), - GTK_WIDGET (option_menu), - gtk_option_menu_detacher); - - gtk_option_menu_calc_size (option_menu); - - g_signal_connect_after (option_menu->menu, "selection-done", - G_CALLBACK (gtk_option_menu_selection_done), - option_menu); - g_signal_connect_swapped (option_menu->menu, "size-request", - G_CALLBACK (gtk_option_menu_calc_size), - option_menu); - - if (GTK_WIDGET (option_menu)->parent) - gtk_widget_queue_resize (GTK_WIDGET (option_menu)); - - gtk_option_menu_update_contents (option_menu); - - g_object_notify (G_OBJECT (option_menu), "menu"); - } -} - -void -gtk_option_menu_remove_menu (GtkOptionMenu *option_menu) -{ - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - if (option_menu->menu) - { - if (GTK_MENU_SHELL (option_menu->menu)->active) - gtk_menu_shell_cancel (GTK_MENU_SHELL (option_menu->menu)); - - gtk_menu_detach (GTK_MENU (option_menu->menu)); - } -} - -void -gtk_option_menu_set_history (GtkOptionMenu *option_menu, - guint index) -{ - GtkWidget *menu_item; - - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - if (option_menu->menu) - { - gtk_menu_set_active (GTK_MENU (option_menu->menu), index); - menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - - if (menu_item != option_menu->menu_item) - gtk_option_menu_update_contents (option_menu); - } -} - -/** - * gtk_option_menu_get_history: - * @option_menu: a #GtkOptionMenu - * - * Retrieves the index of the currently selected menu item. The menu - * items are numbered from top to bottom, starting with 0. - * - * Return value: index of the selected menu item, or -1 if there are no menu items - * Deprecated: 2.4: Use #GtkComboBox instead. - **/ -gint -gtk_option_menu_get_history (GtkOptionMenu *option_menu) -{ - GtkWidget *active_widget; - - g_return_val_if_fail (GTK_IS_OPTION_MENU (option_menu), -1); - - if (option_menu->menu) - { - active_widget = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - - if (active_widget) - return g_list_index (GTK_MENU_SHELL (option_menu->menu)->children, - active_widget); - else - return -1; - } - else - return -1; -} - -static void -gtk_option_menu_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkOptionMenu *option_menu = GTK_OPTION_MENU (object); - - switch (prop_id) - { - case PROP_MENU: - gtk_option_menu_set_menu (option_menu, g_value_get_object (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_option_menu_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkOptionMenu *option_menu = GTK_OPTION_MENU (object); - - switch (prop_id) - { - case PROP_MENU: - g_value_set_object (value, option_menu->menu); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_option_menu_destroy (GtkObject *object) -{ - GtkOptionMenu *option_menu = GTK_OPTION_MENU (object); - - if (option_menu->menu) - gtk_widget_destroy (option_menu->menu); - - GTK_OBJECT_CLASS (gtk_option_menu_parent_class)->destroy (object); -} - -static void -gtk_option_menu_get_props (GtkOptionMenu *option_menu, - GtkOptionMenuProps *props) -{ - GtkRequisition *indicator_size; - GtkBorder *indicator_spacing; - - gtk_widget_style_get (GTK_WIDGET (option_menu), - "indicator-size", &indicator_size, - "indicator-spacing", &indicator_spacing, - "interior-focus", &props->interior_focus, - "focus-line-width", &props->focus_width, - "focus-padding", &props->focus_pad, - NULL); - - if (indicator_size) - props->indicator_size = *indicator_size; - else - props->indicator_size = default_props.indicator_size; - - if (indicator_spacing) - props->indicator_spacing = *indicator_spacing; - else - props->indicator_spacing = default_props.indicator_spacing; - - gtk_requisition_free (indicator_size); - gtk_border_free (indicator_spacing); -} - -static void -gtk_option_menu_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkOptionMenu *option_menu = GTK_OPTION_MENU (widget); - GtkOptionMenuProps props; - gint tmp; - GtkRequisition child_requisition = { 0, 0 }; - - gtk_option_menu_get_props (option_menu, &props); - - if (GTK_BIN (option_menu)->child && gtk_widget_get_visible (GTK_BIN (option_menu)->child)) - { - gtk_widget_size_request (GTK_BIN (option_menu)->child, &child_requisition); - - requisition->width += child_requisition.width; - requisition->height += child_requisition.height; - } - - requisition->width = ((GTK_CONTAINER (widget)->border_width + - GTK_WIDGET (widget)->style->xthickness + props.focus_pad) * 2 + - MAX (child_requisition.width, option_menu->width) + - props.indicator_size.width + - props.indicator_spacing.left + props.indicator_spacing.right + - CHILD_LEFT_SPACING + CHILD_RIGHT_SPACING + props.focus_width * 2); - requisition->height = ((GTK_CONTAINER (widget)->border_width + - GTK_WIDGET (widget)->style->ythickness + props.focus_pad) * 2 + - MAX (child_requisition.height, option_menu->height) + - CHILD_TOP_SPACING + CHILD_BOTTOM_SPACING + props.focus_width * 2); - - tmp = (requisition->height - MAX (child_requisition.height, option_menu->height) + - props.indicator_size.height + props.indicator_spacing.top + props.indicator_spacing.bottom); - requisition->height = MAX (requisition->height, tmp); -} - -static void -gtk_option_menu_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkWidget *child; - GtkButton *button = GTK_BUTTON (widget); - GtkAllocation child_allocation; - GtkOptionMenuProps props; - gint border_width; - - gtk_option_menu_get_props (GTK_OPTION_MENU (widget), &props); - border_width = GTK_CONTAINER (widget)->border_width; - - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) - gdk_window_move_resize (button->event_window, - allocation->x + border_width, allocation->y + border_width, - allocation->width - border_width * 2, allocation->height - border_width * 2); - - child = GTK_BIN (widget)->child; - if (child && gtk_widget_get_visible (child)) - { - gint xthickness = GTK_WIDGET (widget)->style->xthickness; - gint ythickness = GTK_WIDGET (widget)->style->ythickness; - - child_allocation.x = widget->allocation.x + border_width + xthickness + props.focus_width + props.focus_pad + CHILD_LEFT_SPACING; - child_allocation.y = widget->allocation.y + border_width + ythickness + props.focus_width + props.focus_pad + CHILD_TOP_SPACING; - child_allocation.width = MAX (1, allocation->width - (border_width + xthickness + props.focus_width + props.focus_pad) * 2 - - props.indicator_size.width - props.indicator_spacing.left - props.indicator_spacing.right - - CHILD_LEFT_SPACING - CHILD_RIGHT_SPACING); - child_allocation.height = MAX (1, allocation->height - (border_width + ythickness + props.focus_width + props.focus_pad) * 2 - - CHILD_TOP_SPACING - CHILD_BOTTOM_SPACING); - - if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL) - child_allocation.x += props.indicator_size.width + props.indicator_spacing.left + props.indicator_spacing.right; - - gtk_widget_size_allocate (child, &child_allocation); - } -} - -static void -gtk_option_menu_paint (GtkWidget *widget, - GdkRectangle *area) -{ - GdkRectangle button_area; - GtkOptionMenuProps props; - gint border_width; - gint tab_x; - - g_return_if_fail (GTK_IS_OPTION_MENU (widget)); - g_return_if_fail (area != NULL); - - if (GTK_WIDGET_DRAWABLE (widget)) - { - border_width = GTK_CONTAINER (widget)->border_width; - gtk_option_menu_get_props (GTK_OPTION_MENU (widget), &props); - - button_area.x = widget->allocation.x + border_width; - button_area.y = widget->allocation.y + border_width; - button_area.width = widget->allocation.width - 2 * border_width; - button_area.height = widget->allocation.height - 2 * border_width; - - if (!props.interior_focus && gtk_widget_has_focus (widget)) - { - button_area.x += props.focus_width + props.focus_pad; - button_area.y += props.focus_width + props.focus_pad; - button_area.width -= 2 * (props.focus_width + props.focus_pad); - button_area.height -= 2 * (props.focus_width + props.focus_pad); - } - - gtk_paint_box (widget->style, widget->window, - gtk_widget_get_state (widget), GTK_SHADOW_OUT, - area, widget, "optionmenu", - button_area.x, button_area.y, - button_area.width, button_area.height); - - if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL) - tab_x = button_area.x + props.indicator_spacing.right + - widget->style->xthickness; - else - tab_x = button_area.x + button_area.width - - props.indicator_size.width - props.indicator_spacing.right - - widget->style->xthickness; - - gtk_paint_tab (widget->style, widget->window, - gtk_widget_get_state (widget), GTK_SHADOW_OUT, - area, widget, "optionmenutab", - tab_x, - button_area.y + (button_area.height - props.indicator_size.height) / 2, - props.indicator_size.width, props.indicator_size.height); - - if (gtk_widget_has_focus (widget)) - { - if (props.interior_focus) - { - button_area.x += widget->style->xthickness + props.focus_pad; - button_area.y += widget->style->ythickness + props.focus_pad; - button_area.width -= 2 * (widget->style->xthickness + props.focus_pad) + - props.indicator_spacing.left + - props.indicator_spacing.right + - props.indicator_size.width; - button_area.height -= 2 * (widget->style->ythickness + props.focus_pad); - if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL) - button_area.x += props.indicator_spacing.left + - props.indicator_spacing.right + - props.indicator_size.width; - } - else - { - button_area.x -= props.focus_width + props.focus_pad; - button_area.y -= props.focus_width + props.focus_pad; - button_area.width += 2 * (props.focus_width + props.focus_pad); - button_area.height += 2 * (props.focus_width + props.focus_pad); - } - - gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget), - area, widget, "button", - button_area.x, - button_area.y, - button_area.width, - button_area.height); - } - } -} - -static gint -gtk_option_menu_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - if (GTK_WIDGET_DRAWABLE (widget)) - { - gtk_option_menu_paint (widget, &event->area); - - - /* The following code tries to draw the child in two places at - * once. It fails miserably for several reasons - * - * - If the child is not no-window, removing generates - * more expose events. Bad, bad, bad. - * - * - Even if the child is no-window, removing it now (properly) - * clears the space where it was, so it does no good - */ - -#if 0 - remove_child = FALSE; - child = GTK_BUTTON (widget)->child; - - if (!child) - { - if (!GTK_OPTION_MENU (widget)->menu) - return FALSE; - gtk_option_menu_update_contents (GTK_OPTION_MENU (widget)); - child = GTK_BUTTON (widget)->child; - if (!child) - return FALSE; - remove_child = TRUE; - } - - child_event = *event; - - if (!gtk_widget_get_has_window (child) && - gtk_widget_intersect (child, &event->area, &child_event.area)) - gtk_widget_event (child, (GdkEvent*) &child_event); - - if (remove_child) - gtk_option_menu_remove_contents (GTK_OPTION_MENU (widget)); -#else - if (GTK_BIN (widget)->child) - gtk_container_propagate_expose (GTK_CONTAINER (widget), - GTK_BIN (widget)->child, - event); -#endif /* 0 */ - } - - return FALSE; -} - -static gint -gtk_option_menu_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - GtkOptionMenu *option_menu; - GtkWidget *menu_item; - - g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - option_menu = GTK_OPTION_MENU (widget); - - if ((event->type == GDK_BUTTON_PRESS) && - (event->button == 1)) - { - gtk_option_menu_remove_contents (option_menu); - gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL, - gtk_option_menu_position, option_menu, - event->button, event->time); - menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - if (menu_item) - gtk_menu_shell_select_item (GTK_MENU_SHELL (option_menu->menu), menu_item); - return TRUE; - } - - return FALSE; -} - -static gint -gtk_option_menu_key_press (GtkWidget *widget, - GdkEventKey *event) -{ - GtkOptionMenu *option_menu; - GtkWidget *menu_item; - - g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - option_menu = GTK_OPTION_MENU (widget); - - switch (event->keyval) - { - case GDK_KP_Space: - case GDK_space: - gtk_option_menu_remove_contents (option_menu); - gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL, - gtk_option_menu_position, option_menu, - 0, event->time); - menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - if (menu_item) - gtk_menu_shell_select_item (GTK_MENU_SHELL (option_menu->menu), menu_item); - return TRUE; - } - - return FALSE; -} - -static void -gtk_option_menu_selection_done (GtkMenuShell *menu_shell, - GtkOptionMenu *option_menu) -{ - g_return_if_fail (menu_shell != NULL); - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - gtk_option_menu_update_contents (option_menu); -} - -static void -gtk_option_menu_changed (GtkOptionMenu *option_menu) -{ - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - g_signal_emit (option_menu, signals[CHANGED], 0); -} - -static void -gtk_option_menu_select_first_sensitive (GtkOptionMenu *option_menu) -{ - if (option_menu->menu) - { - GList *children = GTK_MENU_SHELL (option_menu->menu)->children; - gint index = 0; - - while (children) - { - if (gtk_widget_get_sensitive (children->data)) - { - gtk_option_menu_set_history (option_menu, index); - return; - } - - children = children->next; - index++; - } - } -} - -static void -gtk_option_menu_item_state_changed_cb (GtkWidget *widget, - GtkStateType previous_state, - GtkOptionMenu *option_menu) -{ - GtkWidget *child = GTK_BIN (option_menu)->child; - - if (child && gtk_widget_get_sensitive (child) != gtk_widget_is_sensitive (widget)) - gtk_widget_set_sensitive (child, gtk_widget_is_sensitive (widget)); -} - -static void -gtk_option_menu_item_destroy_cb (GtkWidget *widget, - GtkOptionMenu *option_menu) -{ - GtkWidget *child = GTK_BIN (option_menu)->child; - - if (child) - { - g_object_ref (child); - gtk_option_menu_remove_contents (option_menu); - gtk_widget_destroy (child); - g_object_unref (child); - - gtk_option_menu_select_first_sensitive (option_menu); - } -} - -static void -gtk_option_menu_update_contents (GtkOptionMenu *option_menu) -{ - GtkWidget *child; - GtkRequisition child_requisition; - - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - if (option_menu->menu) - { - GtkWidget *old_item = option_menu->menu_item; - - gtk_option_menu_remove_contents (option_menu); - - option_menu->menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - if (option_menu->menu_item) - { - g_object_ref (option_menu->menu_item); - child = GTK_BIN (option_menu->menu_item)->child; - if (child) - { - if (!gtk_widget_is_sensitive (option_menu->menu_item)) - gtk_widget_set_sensitive (child, FALSE); - gtk_widget_reparent (child, GTK_WIDGET (option_menu)); - } - - g_signal_connect (option_menu->menu_item, "state-changed", - G_CALLBACK (gtk_option_menu_item_state_changed_cb), option_menu); - g_signal_connect (option_menu->menu_item, "destroy", - G_CALLBACK (gtk_option_menu_item_destroy_cb), option_menu); - - gtk_widget_size_request (child, &child_requisition); - gtk_widget_size_allocate (GTK_WIDGET (option_menu), - &(GTK_WIDGET (option_menu)->allocation)); - - if (GTK_WIDGET_DRAWABLE (option_menu)) - gtk_widget_queue_draw (GTK_WIDGET (option_menu)); - } - - if (old_item != option_menu->menu_item) - gtk_option_menu_changed (option_menu); - } -} - -static void -gtk_option_menu_remove_contents (GtkOptionMenu *option_menu) -{ - GtkWidget *child; - - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - if (option_menu->menu_item) - { - child = GTK_BIN (option_menu)->child; - - if (child) - { - gtk_widget_set_sensitive (child, TRUE); - gtk_widget_set_state (child, GTK_STATE_NORMAL); - gtk_widget_reparent (child, option_menu->menu_item); - } - - g_signal_handlers_disconnect_by_func (option_menu->menu_item, - gtk_option_menu_item_state_changed_cb, - option_menu); - g_signal_handlers_disconnect_by_func (option_menu->menu_item, - gtk_option_menu_item_destroy_cb, - option_menu); - - g_object_unref (option_menu->menu_item); - option_menu->menu_item = NULL; - } -} - -static void -gtk_option_menu_calc_size (GtkOptionMenu *option_menu) -{ - GtkWidget *child; - GList *children; - GtkRequisition child_requisition; - gint old_width = option_menu->width; - gint old_height = option_menu->height; - - g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); - - option_menu->width = 0; - option_menu->height = 0; - - if (option_menu->menu) - { - children = GTK_MENU_SHELL (option_menu->menu)->children; - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child)) - { - GtkWidget *inner = GTK_BIN (child)->child; - - if (inner) - { - gtk_widget_size_request (inner, &child_requisition); - - option_menu->width = MAX (option_menu->width, child_requisition.width); - option_menu->height = MAX (option_menu->height, child_requisition.height); - } - } - } - } - - if (old_width != option_menu->width || old_height != option_menu->height) - gtk_widget_queue_resize (GTK_WIDGET (option_menu)); -} - -static void -gtk_option_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - gpointer user_data) -{ - GtkOptionMenu *option_menu; - GtkWidget *active; - GtkWidget *child; - GtkWidget *widget; - GtkRequisition requisition; - GList *children; - gint screen_width; - gint menu_xpos; - gint menu_ypos; - gint menu_width; - - g_return_if_fail (GTK_IS_OPTION_MENU (user_data)); - - option_menu = GTK_OPTION_MENU (user_data); - widget = GTK_WIDGET (option_menu); - - gtk_widget_get_child_requisition (GTK_WIDGET (menu), &requisition); - menu_width = requisition.width; - - active = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - gdk_window_get_origin (widget->window, &menu_xpos, &menu_ypos); - - /* set combo box type hint for menu popup */ - gtk_window_set_type_hint (GTK_WINDOW (GTK_MENU (option_menu->menu)->toplevel), - GDK_WINDOW_TYPE_HINT_COMBO); - - menu_xpos += widget->allocation.x; - menu_ypos += widget->allocation.y + widget->allocation.height / 2 - 2; - - if (active != NULL) - { - gtk_widget_get_child_requisition (active, &requisition); - menu_ypos -= requisition.height / 2; - } - - children = GTK_MENU_SHELL (option_menu->menu)->children; - while (children) - { - child = children->data; - - if (active == child) - break; - - if (gtk_widget_get_visible (child)) - { - gtk_widget_get_child_requisition (child, &requisition); - menu_ypos -= requisition.height; - } - - children = children->next; - } - - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) - menu_xpos = menu_xpos + widget->allocation.width - menu_width; - - /* Clamp the position on screen */ - screen_width = gdk_screen_get_width (gtk_widget_get_screen (widget)); - - if (menu_xpos < 0) - menu_xpos = 0; - else if ((menu_xpos + menu_width) > screen_width) - menu_xpos -= ((menu_xpos + menu_width) - screen_width); - - *x = menu_xpos; - *y = menu_ypos; - *push_in = TRUE; -} - - -static void -gtk_option_menu_show_all (GtkWidget *widget) -{ - GtkContainer *container; - GtkOptionMenu *option_menu; - - g_return_if_fail (GTK_IS_OPTION_MENU (widget)); - container = GTK_CONTAINER (widget); - option_menu = GTK_OPTION_MENU (widget); - - gtk_widget_show (widget); - gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL); - if (option_menu->menu) - gtk_widget_show_all (option_menu->menu); - if (option_menu->menu_item) - gtk_widget_show_all (option_menu->menu_item); -} - - -static void -gtk_option_menu_hide_all (GtkWidget *widget) -{ - GtkContainer *container; - - g_return_if_fail (GTK_IS_OPTION_MENU (widget)); - container = GTK_CONTAINER (widget); - - gtk_widget_hide (widget); - gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL); -} - -static gboolean -gtk_option_menu_mnemonic_activate (GtkWidget *widget, - gboolean group_cycling) -{ - gtk_widget_grab_focus (widget); - return TRUE; -} - -static gint -gtk_option_menu_scroll_event (GtkWidget *widget, - GdkEventScroll *event) -{ - GtkOptionMenu *option_menu = GTK_OPTION_MENU (widget); - gint index; - gint n_children; - gint index_dir; - GList *l; - GtkMenuItem *item; - - index = gtk_option_menu_get_history (option_menu); - - if (index != -1) - { - n_children = g_list_length (GTK_MENU_SHELL (option_menu->menu)->children); - - if (event->direction == GDK_SCROLL_UP) - index_dir = -1; - else - index_dir = 1; - - - while (TRUE) - { - index += index_dir; - - if (index < 0) - break; - if (index >= n_children) - break; - - l = g_list_nth (GTK_MENU_SHELL (option_menu->menu)->children, index); - item = GTK_MENU_ITEM (l->data); - if (gtk_widget_get_visible (GTK_WIDGET (item)) && - gtk_widget_is_sensitive (GTK_WIDGET (item))) - { - gtk_option_menu_set_history (option_menu, index); - gtk_menu_item_activate (GTK_MENU_ITEM (item)); - break; - } - - } - } - - return TRUE; -} - -#define __GTK_OPTION_MENU_C__ -#include "gtkaliasdef.c" - diff --git a/gtk/gtkoptionmenu.h b/gtk/gtkoptionmenu.h deleted file mode 100644 index 8521020edd..0000000000 --- a/gtk/gtkoptionmenu.h +++ /dev/null @@ -1,88 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_OPTION_MENU_H__ -#define __GTK_OPTION_MENU_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_OPTION_MENU (gtk_option_menu_get_type ()) -#define GTK_OPTION_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_OPTION_MENU, GtkOptionMenu)) -#define GTK_OPTION_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_OPTION_MENU, GtkOptionMenuClass)) -#define GTK_IS_OPTION_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_OPTION_MENU)) -#define GTK_IS_OPTION_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_OPTION_MENU)) -#define GTK_OPTION_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_OPTION_MENU, GtkOptionMenuClass)) - - -typedef struct _GtkOptionMenu GtkOptionMenu; -typedef struct _GtkOptionMenuClass GtkOptionMenuClass; - -struct _GtkOptionMenu -{ - GtkButton button; - - GtkWidget *menu; - GtkWidget *menu_item; - - guint16 width; - guint16 height; -}; - -struct _GtkOptionMenuClass -{ - GtkButtonClass parent_class; - - void (*changed) (GtkOptionMenu *option_menu); - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - - -GType gtk_option_menu_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_option_menu_new (void); -GtkWidget* gtk_option_menu_get_menu (GtkOptionMenu *option_menu); -void gtk_option_menu_set_menu (GtkOptionMenu *option_menu, - GtkWidget *menu); -void gtk_option_menu_remove_menu (GtkOptionMenu *option_menu); -gint gtk_option_menu_get_history (GtkOptionMenu *option_menu); -void gtk_option_menu_set_history (GtkOptionMenu *option_menu, - guint index_); - - -G_END_DECLS - -#endif /* __GTK_OPTION_MENU_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkpagesetup.h b/gtk/gtkpagesetup.h index d5eaea6d5d..b310e5c93a 100644 --- a/gtk/gtkpagesetup.h +++ b/gtk/gtkpagesetup.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkpagesetupunixdialog.h b/gtk/gtkpagesetupunixdialog.h index f64d004d9b..58d7b611f8 100644 --- a/gtk/gtkpagesetupunixdialog.h +++ b/gtk/gtkpagesetupunixdialog.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtkunixprint.h> can be included directly." #endif diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index a24468697b..ae27929c1d 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -1570,17 +1570,6 @@ gtk_paned_get_child2 (GtkPaned *paned) return paned->child2; } -void -gtk_paned_compute_position (GtkPaned *paned, - gint allocation, - gint child1_req, - gint child2_req) -{ - g_return_if_fail (GTK_IS_PANED (paned)); - - gtk_paned_calc_position (paned, allocation, child1_req, child2_req); -} - static void gtk_paned_calc_position (GtkPaned *paned, gint allocation, diff --git a/gtk/gtkpaned.h b/gtk/gtkpaned.h index 1da08a88f1..27e8201de2 100644 --- a/gtk/gtkpaned.h +++ b/gtk/gtkpaned.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -129,15 +129,6 @@ GtkWidget * gtk_paned_get_child2 (GtkPaned *paned); GdkWindow * gtk_paned_get_handle_window (GtkPaned *paned); -#ifndef GTK_DISABLE_DEPRECATED -/* Internal function */ -void gtk_paned_compute_position (GtkPaned *paned, - gint allocation, - gint child1_req, - gint child2_req); -#define gtk_paned_gutter_size(p,s) (void) 0 -#define gtk_paned_set_gutter_size(p,s) (void) 0 -#endif /* GTK_DISABLE_DEPRECATED */ G_END_DECLS diff --git a/gtk/gtkpapersize.h b/gtk/gtkpapersize.h index 18302cae77..a3ef2f1067 100644 --- a/gtk/gtkpapersize.h +++ b/gtk/gtkpapersize.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkpixmap.c b/gtk/gtkpixmap.c deleted file mode 100644 index e22e5edb78..0000000000 --- a/gtk/gtkpixmap.c +++ /dev/null @@ -1,286 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * Insensitive pixmap building code by Eckehard Berns from GNOME Stock - * Copyright (C) 1997, 1998 Free Software Foundation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" -#include <math.h> - -#undef GTK_DISABLE_DEPRECATED -#define __GTK_PIXMAP_C__ - -#include "gtkcontainer.h" -#include "gtkpixmap.h" -#include "gtkintl.h" - -#include "gtkalias.h" - - -static gint gtk_pixmap_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_pixmap_finalize (GObject *object); -static void build_insensitive_pixmap (GtkPixmap *gtkpixmap); - -G_DEFINE_TYPE (GtkPixmap, gtk_pixmap, GTK_TYPE_MISC) - -static void -gtk_pixmap_class_init (GtkPixmapClass *class) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (class); - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass*) class; - - gobject_class->finalize = gtk_pixmap_finalize; - - widget_class->expose_event = gtk_pixmap_expose; -} - -static void -gtk_pixmap_init (GtkPixmap *pixmap) -{ - gtk_widget_set_has_window (GTK_WIDGET (pixmap), FALSE); - - pixmap->pixmap = NULL; - pixmap->mask = NULL; -} - -/** - * gtk_pixmap_new: - * @mask: (allow-none): - */ -GtkWidget* -gtk_pixmap_new (GdkPixmap *val, - GdkBitmap *mask) -{ - GtkPixmap *pixmap; - - g_return_val_if_fail (val != NULL, NULL); - - pixmap = gtk_type_new (gtk_pixmap_get_type ()); - - pixmap->build_insensitive = TRUE; - gtk_pixmap_set (pixmap, val, mask); - - return GTK_WIDGET (pixmap); -} - -static void -gtk_pixmap_finalize (GObject *object) -{ - gtk_pixmap_set (GTK_PIXMAP (object), NULL, NULL); - - G_OBJECT_CLASS (gtk_pixmap_parent_class)->finalize (object); -} - -void -gtk_pixmap_set (GtkPixmap *pixmap, - GdkPixmap *val, - GdkBitmap *mask) -{ - gint width; - gint height; - gint oldwidth; - gint oldheight; - - g_return_if_fail (GTK_IS_PIXMAP (pixmap)); - if(GDK_IS_DRAWABLE(val)) - g_return_if_fail (gdk_colormap_get_visual (gtk_widget_get_colormap (GTK_WIDGET (pixmap)))->depth == gdk_drawable_get_depth (GDK_DRAWABLE (val))); - - if (pixmap->pixmap != val) - { - oldwidth = GTK_WIDGET (pixmap)->requisition.width; - oldheight = GTK_WIDGET (pixmap)->requisition.height; - if (pixmap->pixmap) - g_object_unref (pixmap->pixmap); - if (pixmap->pixmap_insensitive) - g_object_unref (pixmap->pixmap_insensitive); - pixmap->pixmap = val; - pixmap->pixmap_insensitive = NULL; - if (pixmap->pixmap) - { - g_object_ref (pixmap->pixmap); - gdk_drawable_get_size (pixmap->pixmap, &width, &height); - GTK_WIDGET (pixmap)->requisition.width = - width + GTK_MISC (pixmap)->xpad * 2; - GTK_WIDGET (pixmap)->requisition.height = - height + GTK_MISC (pixmap)->ypad * 2; - } - else - { - GTK_WIDGET (pixmap)->requisition.width = 0; - GTK_WIDGET (pixmap)->requisition.height = 0; - } - if (gtk_widget_get_visible (GTK_WIDGET (pixmap))) - { - if ((GTK_WIDGET (pixmap)->requisition.width != oldwidth) || - (GTK_WIDGET (pixmap)->requisition.height != oldheight)) - gtk_widget_queue_resize (GTK_WIDGET (pixmap)); - else - gtk_widget_queue_draw (GTK_WIDGET (pixmap)); - } - } - - if (pixmap->mask != mask) - { - if (pixmap->mask) - g_object_unref (pixmap->mask); - pixmap->mask = mask; - if (pixmap->mask) - g_object_ref (pixmap->mask); - } -} - -void -gtk_pixmap_get (GtkPixmap *pixmap, - GdkPixmap **val, - GdkBitmap **mask) -{ - g_return_if_fail (GTK_IS_PIXMAP (pixmap)); - - if (val) - *val = pixmap->pixmap; - if (mask) - *mask = pixmap->mask; -} - -static gint -gtk_pixmap_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkPixmap *pixmap; - GtkMisc *misc; - gint x, y; - gfloat xalign; - - g_return_val_if_fail (GTK_IS_PIXMAP (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - if (GTK_WIDGET_DRAWABLE (widget)) - { - pixmap = GTK_PIXMAP (widget); - misc = GTK_MISC (widget); - - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) - xalign = misc->xalign; - else - xalign = 1.0 - misc->xalign; - - x = floor (widget->allocation.x + misc->xpad - + ((widget->allocation.width - widget->requisition.width) * xalign)); - y = floor (widget->allocation.y + misc->ypad - + ((widget->allocation.height - widget->requisition.height) * misc->yalign)); - - if (pixmap->mask) - { - gdk_gc_set_clip_mask (widget->style->black_gc, pixmap->mask); - gdk_gc_set_clip_origin (widget->style->black_gc, x, y); - } - - if (gtk_widget_get_state (widget) == GTK_STATE_INSENSITIVE - && pixmap->build_insensitive) - { - if (!pixmap->pixmap_insensitive) - build_insensitive_pixmap (pixmap); - gdk_draw_drawable (widget->window, - widget->style->black_gc, - pixmap->pixmap_insensitive, - 0, 0, x, y, -1, -1); - } - else - { - gdk_draw_drawable (widget->window, - widget->style->black_gc, - pixmap->pixmap, - 0, 0, x, y, -1, -1); - } - - if (pixmap->mask) - { - gdk_gc_set_clip_mask (widget->style->black_gc, NULL); - gdk_gc_set_clip_origin (widget->style->black_gc, 0, 0); - } - } - return FALSE; -} - -void -gtk_pixmap_set_build_insensitive (GtkPixmap *pixmap, gboolean build) -{ - g_return_if_fail (GTK_IS_PIXMAP (pixmap)); - - pixmap->build_insensitive = build; - - if (gtk_widget_get_visible (GTK_WIDGET (pixmap))) - { - gtk_widget_queue_draw (GTK_WIDGET (pixmap)); - } -} - -static void -build_insensitive_pixmap (GtkPixmap *gtkpixmap) -{ - GdkPixmap *pixmap = gtkpixmap->pixmap; - GdkPixmap *insensitive; - gint w, h; - GdkPixbuf *pixbuf; - GdkPixbuf *stated; - - gdk_drawable_get_size (pixmap, &w, &h); - - pixbuf = gdk_pixbuf_get_from_drawable (NULL, - pixmap, - gtk_widget_get_colormap (GTK_WIDGET (gtkpixmap)), - 0, 0, - 0, 0, - w, h); - - stated = gdk_pixbuf_copy (pixbuf); - - gdk_pixbuf_saturate_and_pixelate (pixbuf, stated, - 0.8, TRUE); - - g_object_unref (pixbuf); - pixbuf = NULL; - - insensitive = gdk_pixmap_new (GTK_WIDGET (gtkpixmap)->window, w, h, -1); - - gdk_draw_pixbuf (insensitive, - GTK_WIDGET (gtkpixmap)->style->white_gc, - stated, - 0, 0, - 0, 0, - w, h, - GDK_RGB_DITHER_NORMAL, - 0, 0); - - gtkpixmap->pixmap_insensitive = insensitive; - - g_object_unref (stated); -} - -#include "gtkaliasdef.c" diff --git a/gtk/gtkpixmap.h b/gtk/gtkpixmap.h deleted file mode 100644 index 21fa349938..0000000000 --- a/gtk/gtkpixmap.h +++ /dev/null @@ -1,83 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#if !defined (GTK_DISABLE_DEPRECATED) || defined (__GTK_PIXMAP_C__) - -#ifndef __GTK_PIXMAP_H__ -#define __GTK_PIXMAP_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_PIXMAP (gtk_pixmap_get_type ()) -#define GTK_PIXMAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PIXMAP, GtkPixmap)) -#define GTK_PIXMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PIXMAP, GtkPixmapClass)) -#define GTK_IS_PIXMAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PIXMAP)) -#define GTK_IS_PIXMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PIXMAP)) -#define GTK_PIXMAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PIXMAP, GtkPixmapClass)) - - -typedef struct _GtkPixmap GtkPixmap; -typedef struct _GtkPixmapClass GtkPixmapClass; - -struct _GtkPixmap -{ - GtkMisc misc; - - GdkPixmap *pixmap; - GdkBitmap *mask; - - GdkPixmap *pixmap_insensitive; - guint build_insensitive : 1; -}; - -struct _GtkPixmapClass -{ - GtkMiscClass parent_class; -}; - - -GType gtk_pixmap_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_pixmap_new (GdkPixmap *pixmap, - GdkBitmap *mask); -void gtk_pixmap_set (GtkPixmap *pixmap, - GdkPixmap *val, - GdkBitmap *mask); -void gtk_pixmap_get (GtkPixmap *pixmap, - GdkPixmap **val, - GdkBitmap **mask); - -void gtk_pixmap_set_build_insensitive (GtkPixmap *pixmap, - gboolean build); - - -G_END_DECLS - -#endif /* __GTK_PIXMAP_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkplug.h b/gtk/gtkplug.h index 3ea9971960..c96ca774fa 100644 --- a/gtk/gtkplug.h +++ b/gtk/gtkplug.h @@ -23,7 +23,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkpreview.c b/gtk/gtkpreview.c deleted file mode 100644 index 458fed4efe..0000000000 --- a/gtk/gtkpreview.c +++ /dev/null @@ -1,565 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <math.h> -#include <string.h> -#include <sys/types.h> -#ifdef HAVE_SYS_PARAM_H -#include <sys/param.h> -#endif - -#undef GTK_DISABLE_DEPRECATED - -#include "gtkpreview.h" -#include "gtkprivate.h" -#include "gtkintl.h" -#include "gtkalias.h" - - -#define PREVIEW_CLASS(w) GTK_PREVIEW_CLASS (GTK_OBJECT (w)->klass) - -enum { - PROP_0, - PROP_EXPAND -}; - - -static void gtk_preview_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_preview_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void gtk_preview_finalize (GObject *object); -static void gtk_preview_realize (GtkWidget *widget); -static void gtk_preview_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static gint gtk_preview_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_preview_make_buffer (GtkPreview *preview); -static void gtk_fill_lookup_array (guchar *array); - -static GtkPreviewClass *preview_class = NULL; -static gint install_cmap = FALSE; - - -G_DEFINE_TYPE (GtkPreview, gtk_preview, GTK_TYPE_WIDGET) - -static void -gtk_preview_class_init (GtkPreviewClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class; - - widget_class = (GtkWidgetClass*) klass; - - preview_class = klass; - - gobject_class->finalize = gtk_preview_finalize; - - gobject_class->set_property = gtk_preview_set_property; - gobject_class->get_property = gtk_preview_get_property; - - widget_class->realize = gtk_preview_realize; - widget_class->size_allocate = gtk_preview_size_allocate; - widget_class->expose_event = gtk_preview_expose; - - klass->info.lookup = NULL; - - klass->info.gamma = 1.0; - - g_object_class_install_property (gobject_class, - PROP_EXPAND, - g_param_spec_boolean ("expand", - P_("Expand"), - P_("Whether the preview widget should take up the entire space it is allocated"), - FALSE, - GTK_PARAM_READWRITE)); -} - -static void -gtk_preview_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkPreview *preview = GTK_PREVIEW (object); - - switch (prop_id) - { - case PROP_EXPAND: - gtk_preview_set_expand (preview, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_preview_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkPreview *preview; - - preview = GTK_PREVIEW (object); - - switch (prop_id) - { - case PROP_EXPAND: - g_value_set_boolean (value, preview->expand); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -void -gtk_preview_reset (void) -{ - /* unimplemented */ -} - -static void -gtk_preview_init (GtkPreview *preview) -{ - preview->buffer = NULL; - preview->buffer_width = 0; - preview->buffer_height = 0; - preview->expand = FALSE; -} - -void -gtk_preview_uninit (void) -{ - /* unimplemented */ -} - -GtkWidget* -gtk_preview_new (GtkPreviewType type) -{ - GtkPreview *preview; - - preview = gtk_type_new (gtk_preview_get_type ()); - preview->type = type; - - if (type == GTK_PREVIEW_COLOR) - preview->bpp = 3; - else - preview->bpp = 1; - - preview->dither = GDK_RGB_DITHER_NORMAL; - - return GTK_WIDGET (preview); -} - -void -gtk_preview_size (GtkPreview *preview, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_PREVIEW (preview)); - - if ((width != GTK_WIDGET (preview)->requisition.width) || - (height != GTK_WIDGET (preview)->requisition.height)) - { - GTK_WIDGET (preview)->requisition.width = width; - GTK_WIDGET (preview)->requisition.height = height; - - g_free (preview->buffer); - preview->buffer = NULL; - } -} - -void -gtk_preview_put (GtkPreview *preview, - GdkWindow *window, - GdkGC *gc, - gint srcx, - gint srcy, - gint destx, - gint desty, - gint width, - gint height) -{ - GdkRectangle r1, r2, r3; - guchar *src; - guint bpp; - guint rowstride; - - g_return_if_fail (GTK_IS_PREVIEW (preview)); - g_return_if_fail (window != NULL); - - if (!preview->buffer) - return; - - r1.x = 0; - r1.y = 0; - r1.width = preview->buffer_width; - r1.height = preview->buffer_height; - - r2.x = srcx; - r2.y = srcy; - r2.width = width; - r2.height = height; - - if (!gdk_rectangle_intersect (&r1, &r2, &r3)) - return; - - bpp = preview->bpp; - rowstride = preview->rowstride; - - src = preview->buffer + r3.y * rowstride + r3.x * bpp; - - if (preview->type == GTK_PREVIEW_COLOR) - gdk_draw_rgb_image (window, - gc, - destx + (r3.x - srcx), - desty + (r3.y - srcy), - r3.width, - r3.height, - preview->dither, - src, - rowstride); - else - gdk_draw_gray_image (window, - gc, - destx + (r3.x - srcx), - desty + (r3.y - srcy), - r3.width, - r3.height, - preview->dither, - src, - rowstride); - -} - -void -gtk_preview_draw_row (GtkPreview *preview, - guchar *data, - gint x, - gint y, - gint w) -{ - guint bpp; - guint rowstride; - - g_return_if_fail (GTK_IS_PREVIEW (preview)); - g_return_if_fail (data != NULL); - - bpp = (preview->type == GTK_PREVIEW_COLOR ? 3 : 1); - rowstride = (preview->buffer_width * bpp + 3) & -4; - - if ((w <= 0) || (y < 0)) - return; - - g_return_if_fail (data != NULL); - - gtk_preview_make_buffer (preview); - - if (x + w > preview->buffer_width) - return; - - if (y + 1 > preview->buffer_height) - return; - - if (preview_class->info.gamma == 1.0) - memcpy (preview->buffer + y * rowstride + x * bpp, data, w * bpp); - else - { - guint i, size; - guchar *src, *dst; - guchar *lookup; - - if (preview_class->info.lookup != NULL) - lookup = preview_class->info.lookup; - else - { - preview_class->info.lookup = g_new (guchar, 256); - gtk_fill_lookup_array (preview_class->info.lookup); - lookup = preview_class->info.lookup; - } - size = w * bpp; - src = data; - dst = preview->buffer + y * rowstride + x * bpp; - for (i = 0; i < size; i++) - *dst++ = lookup[*src++]; - } -} - -void -gtk_preview_set_expand (GtkPreview *preview, - gboolean expand) -{ - g_return_if_fail (GTK_IS_PREVIEW (preview)); - - expand = expand != FALSE; - - if (preview->expand != expand) - { - preview->expand = expand; - gtk_widget_queue_resize (GTK_WIDGET (preview)); - - g_object_notify (G_OBJECT (preview), "expand"); - } -} - -void -gtk_preview_set_gamma (double _gamma) -{ - if (!preview_class) - preview_class = gtk_type_class (gtk_preview_get_type ()); - - if (preview_class->info.gamma != _gamma) - { - preview_class->info.gamma = _gamma; - if (preview_class->info.lookup != NULL) - { - g_free (preview_class->info.lookup); - preview_class->info.lookup = NULL; - } - } -} - -void -gtk_preview_set_color_cube (guint nred_shades, - guint ngreen_shades, - guint nblue_shades, - guint ngray_shades) -{ - /* unimplemented */ -} - -void -gtk_preview_set_install_cmap (gint _install_cmap) -{ - /* effectively unimplemented */ - install_cmap = _install_cmap; -} - -void -gtk_preview_set_reserved (gint nreserved) -{ - - /* unimplemented */ -} - -void -gtk_preview_set_dither (GtkPreview *preview, - GdkRgbDither dither) -{ - preview->dither = dither; -} - -GdkVisual* -gtk_preview_get_visual (void) -{ - return gdk_screen_get_rgb_visual (gdk_screen_get_default ()); -} - -GdkColormap* -gtk_preview_get_cmap (void) -{ - return gdk_screen_get_rgb_colormap (gdk_screen_get_default ()); -} - -GtkPreviewInfo* -gtk_preview_get_info (void) -{ - if (!preview_class) - preview_class = gtk_type_class (gtk_preview_get_type ()); - - return &preview_class->info; -} - - -static void -gtk_preview_finalize (GObject *object) -{ - GtkPreview *preview = GTK_PREVIEW (object); - - g_free (preview->buffer); - - G_OBJECT_CLASS (gtk_preview_parent_class)->finalize (object); -} - -static void -gtk_preview_realize (GtkWidget *widget) -{ - GtkPreview *preview = GTK_PREVIEW (widget); - GdkWindowAttr attributes; - gint attributes_mask; - - gtk_widget_set_realized (widget, TRUE); - - attributes.window_type = GDK_WINDOW_CHILD; - - if (preview->expand) - { - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - } - else - { - attributes.width = MIN (widget->requisition.width, widget->allocation.width); - attributes.height = MIN (widget->requisition.height, widget->allocation.height); - } - - attributes.x = widget->allocation.x + (widget->allocation.width - attributes.width) / 2; - attributes.y = widget->allocation.y + (widget->allocation.height - attributes.height) / 2;; - - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; - attributes_mask = GDK_WA_X | GDK_WA_Y; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, widget); - - widget->style = gtk_style_attach (widget->style, widget->window); - gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); -} - -static void -gtk_preview_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkPreview *preview = GTK_PREVIEW (widget); - gint width, height; - - widget->allocation = *allocation; - - if (gtk_widget_get_realized (widget)) - { - if (preview->expand) - { - width = widget->allocation.width; - height = widget->allocation.height; - } - else - { - width = MIN (widget->allocation.width, widget->requisition.width); - height = MIN (widget->allocation.height, widget->requisition.height); - } - - gdk_window_move_resize (widget->window, - widget->allocation.x + (widget->allocation.width - width) / 2, - widget->allocation.y + (widget->allocation.height - height) / 2, - width, height); - } -} - -static gint -gtk_preview_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkPreview *preview; - gint width, height; - - if (GTK_WIDGET_DRAWABLE (widget)) - { - preview = GTK_PREVIEW (widget); - - gdk_drawable_get_size (widget->window, &width, &height); - - gtk_preview_put (GTK_PREVIEW (widget), - widget->window, widget->style->black_gc, - event->area.x - (width - preview->buffer_width)/2, - event->area.y - (height - preview->buffer_height)/2, - event->area.x, event->area.y, - event->area.width, event->area.height); - } - - return FALSE; -} - -static void -gtk_preview_make_buffer (GtkPreview *preview) -{ - GtkWidget *widget; - gint width; - gint height; - - g_return_if_fail (GTK_IS_PREVIEW (preview)); - - widget = GTK_WIDGET (preview); - - if (preview->expand && - (widget->allocation.width != 0) && - (widget->allocation.height != 0)) - { - width = widget->allocation.width; - height = widget->allocation.height; - } - else - { - width = widget->requisition.width; - height = widget->requisition.height; - } - - if (!preview->buffer || - (preview->buffer_width != width) || - (preview->buffer_height != height)) - { - g_free (preview->buffer); - - preview->buffer_width = width; - preview->buffer_height = height; - - preview->rowstride = (preview->buffer_width * preview->bpp + 3) & -4; - preview->buffer = g_new0 (guchar, - preview->buffer_height * - preview->rowstride); - } -} - -/* This is used for implementing gamma. */ -static void -gtk_fill_lookup_array (guchar *array) -{ - double one_over_gamma; - double ind; - int val; - int i; - - one_over_gamma = 1.0 / preview_class->info.gamma; - - for (i = 0; i < 256; i++) - { - ind = (double) i / 255.0; - val = (int) (255 * pow (ind, one_over_gamma)); - array[i] = val; - } -} - -#define __GTK_PREVIEW_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtkpreview.h b/gtk/gtkpreview.h deleted file mode 100644 index 5e87c94aa3..0000000000 --- a/gtk/gtkpreview.h +++ /dev/null @@ -1,137 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_PREVIEW_H__ -#define __GTK_PREVIEW_H__ - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_PREVIEW (gtk_preview_get_type ()) -#define GTK_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_PREVIEW, GtkPreview)) -#define GTK_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PREVIEW, GtkPreviewClass)) -#define GTK_IS_PREVIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_PREVIEW)) -#define GTK_IS_PREVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PREVIEW)) -#define GTK_PREVIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PREVIEW, GtkPreviewClass)) - - -typedef struct _GtkPreview GtkPreview; -typedef struct _GtkPreviewInfo GtkPreviewInfo; -typedef union _GtkDitherInfo GtkDitherInfo; -typedef struct _GtkPreviewClass GtkPreviewClass; - -struct _GtkPreview -{ - GtkWidget widget; - - guchar *buffer; - guint16 buffer_width; - guint16 buffer_height; - - guint16 bpp; - guint16 rowstride; - - GdkRgbDither dither; - - guint type : 1; - guint expand : 1; -}; - -struct _GtkPreviewInfo -{ - guchar *lookup; - - gdouble gamma; -}; - -union _GtkDitherInfo -{ - gushort s[2]; - guchar c[4]; -}; - -struct _GtkPreviewClass -{ - GtkWidgetClass parent_class; - - GtkPreviewInfo info; - -}; - - -GType gtk_preview_get_type (void) G_GNUC_CONST; -void gtk_preview_uninit (void); -GtkWidget* gtk_preview_new (GtkPreviewType type); -void gtk_preview_size (GtkPreview *preview, - gint width, - gint height); -void gtk_preview_put (GtkPreview *preview, - GdkWindow *window, - GdkGC *gc, - gint srcx, - gint srcy, - gint destx, - gint desty, - gint width, - gint height); -void gtk_preview_draw_row (GtkPreview *preview, - guchar *data, - gint x, - gint y, - gint w); -void gtk_preview_set_expand (GtkPreview *preview, - gboolean expand); - -void gtk_preview_set_gamma (double gamma_); -void gtk_preview_set_color_cube (guint nred_shades, - guint ngreen_shades, - guint nblue_shades, - guint ngray_shades); -void gtk_preview_set_install_cmap (gint install_cmap); -void gtk_preview_set_reserved (gint nreserved); -void gtk_preview_set_dither (GtkPreview *preview, - GdkRgbDither dither); -GdkVisual* gtk_preview_get_visual (void); -GdkColormap* gtk_preview_get_cmap (void); -GtkPreviewInfo* gtk_preview_get_info (void); - -/* This function reinitializes the preview colormap and visual from - * the current gamma/color_cube/install_cmap settings. It must only - * be called if there are no previews or users's of the preview - * colormap in existence. - */ -void gtk_preview_reset (void); - - -G_END_DECLS - -#endif /* __GTK_PREVIEW_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtkprintcontext.h b/gtk/gtkprintcontext.h index 30572d6835..b38fd15ac4 100644 --- a/gtk/gtkprintcontext.h +++ b/gtk/gtkprintcontext.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkprinter.h b/gtk/gtkprinter.h index 527582c95d..e2cb534963 100644 --- a/gtk/gtkprinter.h +++ b/gtk/gtkprinter.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtkunixprint.h> can be included directly." #endif diff --git a/gtk/gtkprintjob.h b/gtk/gtkprintjob.h index fd821840f9..9d2c25b548 100644 --- a/gtk/gtkprintjob.h +++ b/gtk/gtkprintjob.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtkunixprint.h> can be included directly." #endif diff --git a/gtk/gtkprintoperation.h b/gtk/gtkprintoperation.h index ef9a2879f3..fed196a3e7 100644 --- a/gtk/gtkprintoperation.h +++ b/gtk/gtkprintoperation.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkprintoperationpreview.h b/gtk/gtkprintoperationpreview.h index a36b4afb71..850b0806e0 100644 --- a/gtk/gtkprintoperationpreview.h +++ b/gtk/gtkprintoperationpreview.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkprintsettings.h b/gtk/gtkprintsettings.h index 267854c351..102c6c497a 100644 --- a/gtk/gtkprintsettings.h +++ b/gtk/gtkprintsettings.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkprintunixdialog.h b/gtk/gtkprintunixdialog.h index 4ff22e4ed8..f0bb798012 100644 --- a/gtk/gtkprintunixdialog.h +++ b/gtk/gtkprintunixdialog.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_UNIX_PRINT_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtkunixprint.h> can be included directly." #endif diff --git a/gtk/gtkprogress.c b/gtk/gtkprogress.c index 8f46de45da..fd5585f204 100644 --- a/gtk/gtkprogress.c +++ b/gtk/gtkprogress.c @@ -274,7 +274,7 @@ static gboolean gtk_progress_expose (GtkWidget *widget, GdkEventExpose *event) { - if (GTK_WIDGET_DRAWABLE (widget)) + if (gtk_widget_is_drawable (widget)) gdk_draw_drawable (widget->window, widget->style->black_gc, GTK_PROGRESS (widget)->offscreen_pixmap, @@ -636,7 +636,7 @@ gtk_progress_set_text_alignment (GtkProgress *progress, } g_object_thaw_notify (G_OBJECT (progress)); - if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (progress))) + if (gtk_widget_is_drawable (GTK_WIDGET (progress))) gtk_widget_queue_resize (GTK_WIDGET (progress)); } } @@ -703,7 +703,7 @@ gtk_progress_set_activity_mode (GtkProgress *progress, if (progress->activity_mode) GTK_PROGRESS_GET_CLASS (progress)->act_mode_enter (progress); - if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (progress))) + if (gtk_widget_is_drawable (GTK_WIDGET (progress))) gtk_widget_queue_resize (GTK_WIDGET (progress)); g_object_notify (G_OBJECT (progress), "activity-mode"); diff --git a/gtk/gtkprogressbar.c b/gtk/gtkprogressbar.c index 798c6b43ef..853667db8a 100644 --- a/gtk/gtkprogressbar.c +++ b/gtk/gtkprogressbar.c @@ -52,12 +52,6 @@ enum { PROP_TEXT, PROP_ELLIPSIZE, - /* Deprecated args */ - PROP_ADJUSTMENT, - PROP_BAR_STYLE, - PROP_ACTIVITY_STEP, - PROP_ACTIVITY_BLOCKS, - PROP_DISCRETE_BLOCKS }; static void gtk_progress_bar_set_property (GObject *object, @@ -87,6 +81,14 @@ static void gtk_progress_bar_set_activity_step_internal (GtkProgressBar *pbar, static void gtk_progress_bar_set_activity_blocks_internal (GtkProgressBar *pbar, guint blocks); +typedef struct +{ + gchar* text; + gdouble fraction; +} GtkProgressBarPrivate; + +#define GTK_PROGRESS_BAR_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_PROGRESS_BAR, GtkProgressBarPrivate)) G_DEFINE_TYPE (GtkProgressBar, gtk_progress_bar, GTK_TYPE_PROGRESS) @@ -113,14 +115,6 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class) progress_class->act_mode_enter = gtk_progress_bar_act_mode_enter; g_object_class_install_property (gobject_class, - PROP_ADJUSTMENT, - g_param_spec_object ("adjustment", - P_("Adjustment"), - P_("The GtkAdjustment connected to the progress bar (Deprecated)"), - GTK_TYPE_ADJUSTMENT, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, PROP_ORIENTATION, g_param_spec_enum ("orientation", P_("Orientation"), @@ -128,39 +122,6 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class) GTK_TYPE_PROGRESS_BAR_ORIENTATION, GTK_PROGRESS_LEFT_TO_RIGHT, GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_BAR_STYLE, - g_param_spec_enum ("bar-style", - P_("Bar style"), - P_("Specifies the visual style of the bar in percentage mode (Deprecated)"), - GTK_TYPE_PROGRESS_BAR_STYLE, - GTK_PROGRESS_CONTINUOUS, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_ACTIVITY_STEP, - g_param_spec_uint ("activity-step", - P_("Activity Step"), - P_("The increment used for each iteration in activity mode (Deprecated)"), - 0, G_MAXUINT, 3, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_ACTIVITY_BLOCKS, - g_param_spec_uint ("activity-blocks", - P_("Activity Blocks"), - P_("The number of blocks which can fit in the progress bar area in activity mode (Deprecated)"), - 2, G_MAXUINT, 5, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_DISCRETE_BLOCKS, - g_param_spec_uint ("discrete-blocks", - P_("Discrete Blocks"), - P_("The number of discrete blocks in a progress bar (when shown in the discrete style)"), - 2, G_MAXUINT, 10, - GTK_PARAM_READWRITE)); g_object_class_install_property (gobject_class, PROP_FRACTION, @@ -274,11 +235,15 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class) P_("The minimum vertical height of the progress bar"), 1, G_MAXINT, MIN_VERTICAL_BAR_HEIGHT, G_PARAM_READWRITE)); + + g_type_class_add_private (class, sizeof (GtkProgressBarPrivate)); } static void gtk_progress_bar_init (GtkProgressBar *pbar) { + GtkProgressBarPrivate* priv; + pbar->bar_style = GTK_PROGRESS_CONTINUOUS; pbar->blocks = 10; pbar->in_block = -1; @@ -289,6 +254,11 @@ gtk_progress_bar_init (GtkProgressBar *pbar) pbar->activity_step = 3; pbar->activity_blocks = 5; pbar->ellipsize = PANGO_ELLIPSIZE_NONE; + + /* FIXME: Put priv in the structure once we break ABI */ + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); + priv->text = NULL; + priv->fraction = 0.0; } static void @@ -303,25 +273,9 @@ gtk_progress_bar_set_property (GObject *object, switch (prop_id) { - case PROP_ADJUSTMENT: - gtk_progress_set_adjustment (GTK_PROGRESS (pbar), - GTK_ADJUSTMENT (g_value_get_object (value))); - break; case PROP_ORIENTATION: gtk_progress_bar_set_orientation (pbar, g_value_get_enum (value)); break; - case PROP_BAR_STYLE: - gtk_progress_bar_set_bar_style_internal (pbar, g_value_get_enum (value)); - break; - case PROP_ACTIVITY_STEP: - gtk_progress_bar_set_activity_step_internal (pbar, g_value_get_uint (value)); - break; - case PROP_ACTIVITY_BLOCKS: - gtk_progress_bar_set_activity_blocks_internal (pbar, g_value_get_uint (value)); - break; - case PROP_DISCRETE_BLOCKS: - gtk_progress_bar_set_discrete_blocks_internal (pbar, g_value_get_uint (value)); - break; case PROP_FRACTION: gtk_progress_bar_set_fraction (pbar, g_value_get_double (value)); break; @@ -347,37 +301,24 @@ gtk_progress_bar_get_property (GObject *object, GParamSpec *pspec) { GtkProgressBar *pbar; + GtkProgressBarPrivate* priv; pbar = GTK_PROGRESS_BAR (object); + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); switch (prop_id) { - case PROP_ADJUSTMENT: - g_value_set_object (value, GTK_PROGRESS (pbar)->adjustment); - break; case PROP_ORIENTATION: g_value_set_enum (value, pbar->orientation); break; - case PROP_BAR_STYLE: - g_value_set_enum (value, pbar->bar_style); - break; - case PROP_ACTIVITY_STEP: - g_value_set_uint (value, pbar->activity_step); - break; - case PROP_ACTIVITY_BLOCKS: - g_value_set_uint (value, pbar->activity_blocks); - break; - case PROP_DISCRETE_BLOCKS: - g_value_set_uint (value, pbar->blocks); - break; case PROP_FRACTION: - g_value_set_double (value, gtk_progress_get_current_percentage (GTK_PROGRESS (pbar))); + g_value_set_double (value, priv->fraction); break; case PROP_PULSE_STEP: g_value_set_double (value, pbar->pulse_fraction); break; case PROP_TEXT: - g_value_set_string (value, gtk_progress_bar_get_text (pbar)); + g_value_set_string (value, priv->text); break; case PROP_ELLIPSIZE: g_value_set_enum (value, pbar->ellipsize); @@ -398,28 +339,6 @@ gtk_progress_bar_new (void) return pbar; } -/** - * gtk_progress_bar_new_with_adjustment: - * @adjustment: (allow-none): - * - * Creates a new #GtkProgressBar with an associated #GtkAdjustment. - * - * Returns: (transfer none): a #GtkProgressBar. - */ -GtkWidget* -gtk_progress_bar_new_with_adjustment (GtkAdjustment *adjustment) -{ - GtkWidget *pbar; - - g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), NULL); - - pbar = g_object_new (GTK_TYPE_PROGRESS_BAR, - "adjustment", adjustment, - NULL); - - return pbar; -} - static void gtk_progress_bar_real_update (GtkProgress *progress) { @@ -541,8 +460,8 @@ static void gtk_progress_bar_size_request (GtkWidget *widget, GtkRequisition *requisition) { - GtkProgress *progress; GtkProgressBar *pbar; + GtkProgressBarPrivate *priv; gchar *buf; PangoRectangle logical_rect; PangoLayout *layout; @@ -558,19 +477,14 @@ gtk_progress_bar_size_request (GtkWidget *widget, "yspacing", &yspacing, NULL); - progress = GTK_PROGRESS (widget); pbar = GTK_PROGRESS_BAR (widget); + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); width = 2 * widget->style->xthickness + xspacing; height = 2 * widget->style->ythickness + yspacing; - if (progress->show_text && pbar->bar_style != GTK_PROGRESS_DISCRETE) + if ((buf = priv->text)) { - if (!progress->adjustment) - gtk_progress_set_adjustment (progress, NULL); - - buf = gtk_progress_get_text_from_value (progress, progress->adjustment->upper); - layout = gtk_widget_create_pango_layout (widget, buf); pango_layout_get_pixel_extents (layout, NULL, &logical_rect); @@ -596,7 +510,6 @@ gtk_progress_bar_size_request (GtkWidget *widget, height += logical_rect.height; g_object_unref (layout); - g_free (buf); } if (pbar->orientation == GTK_PROGRESS_LEFT_TO_RIGHT || @@ -968,6 +881,7 @@ static void gtk_progress_bar_paint (GtkProgress *progress) { GtkProgressBar *pbar; + GtkProgressBarPrivate *priv; GtkWidget *widget; GtkProgressBarOrientation orientation; @@ -975,6 +889,7 @@ gtk_progress_bar_paint (GtkProgress *progress) g_return_if_fail (GTK_IS_PROGRESS_BAR (progress)); pbar = GTK_PROGRESS_BAR (progress); + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); widget = GTK_WIDGET (progress); orientation = pbar->orientation; @@ -1000,7 +915,7 @@ gtk_progress_bar_paint (GtkProgress *progress) { gtk_progress_bar_paint_activity (pbar, orientation); - if (GTK_PROGRESS (pbar)->show_text) + if (priv->text) { gint offset; gint amount; @@ -1027,7 +942,7 @@ gtk_progress_bar_paint (GtkProgress *progress) { gtk_progress_bar_paint_continuous (pbar, amount, orientation); - if (GTK_PROGRESS (pbar)->show_text) + if (priv->text) gtk_progress_bar_paint_text (pbar, -1, amount, orientation); } else @@ -1116,16 +1031,12 @@ void gtk_progress_bar_set_fraction (GtkProgressBar *pbar, gdouble fraction) { + GtkProgressBarPrivate* priv; + g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar)); - /* If we know the percentage, we don't want activity mode. */ - gtk_progress_set_activity_mode (GTK_PROGRESS (pbar), FALSE); - - /* We use the deprecated GtkProgress interface internally. - * Once everything's been deprecated for a good long time, - * we can clean up all this code. - */ - gtk_progress_set_percentage (GTK_PROGRESS (pbar), fraction); + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); + priv->fraction = fraction; g_object_notify (G_OBJECT (pbar), "fraction"); } @@ -1145,8 +1056,9 @@ gtk_progress_bar_pulse (GtkProgressBar *pbar) { g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar)); - /* If we don't know the percentage, we must want activity mode. */ - gtk_progress_set_activity_mode (GTK_PROGRESS (pbar), TRUE); + GTK_PROGRESS_GET_CLASS (pbar)->act_mode_enter (GTK_PROGRESS (pbar)); + if (gtk_widget_is_drawable (GTK_WIDGET (pbar))) + gtk_widget_queue_resize (GTK_WIDGET (pbar)); /* Sigh. */ gtk_progress_bar_real_update (GTK_PROGRESS (pbar)); @@ -1163,16 +1075,13 @@ void gtk_progress_bar_set_text (GtkProgressBar *pbar, const gchar *text) { + GtkProgressBarPrivate *priv; + g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar)); - gtk_progress_set_show_text (GTK_PROGRESS (pbar), text && *text); - gtk_progress_set_format_string (GTK_PROGRESS (pbar), text); - - /* We don't support formats in this interface, but turn - * them back on for NULL, which should put us back to - * the initial state. - */ - GTK_PROGRESS (pbar)->use_text_format = (text == NULL); + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); + g_free (priv->text); + priv->text = text && *text ? g_strdup (text) : NULL; g_object_notify (G_OBJECT (pbar), "text"); } @@ -1196,19 +1105,6 @@ gtk_progress_bar_set_pulse_step (GtkProgressBar *pbar, g_object_notify (G_OBJECT (pbar), "pulse-step"); } -void -gtk_progress_bar_update (GtkProgressBar *pbar, - gdouble percentage) -{ - g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar)); - - /* Use of gtk_progress_bar_update() is deprecated ! - * Use gtk_progress_bar_set_percentage () - */ - - gtk_progress_set_percentage (GTK_PROGRESS (pbar), percentage); -} - /** * gtk_progress_bar_set_orientation: * @pbar: a #GtkProgressBar @@ -1249,12 +1145,12 @@ gtk_progress_bar_set_orientation (GtkProgressBar *pbar, G_CONST_RETURN gchar* gtk_progress_bar_get_text (GtkProgressBar *pbar) { + GtkProgressBarPrivate* priv; + g_return_val_if_fail (GTK_IS_PROGRESS_BAR (pbar), NULL); - if (GTK_PROGRESS (pbar)->use_text_format) - return NULL; - else - return GTK_PROGRESS (pbar)->format; + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); + return priv->text; } /** @@ -1268,9 +1164,12 @@ gtk_progress_bar_get_text (GtkProgressBar *pbar) gdouble gtk_progress_bar_get_fraction (GtkProgressBar *pbar) { + GtkProgressBarPrivate* priv; + g_return_val_if_fail (GTK_IS_PROGRESS_BAR (pbar), 0); - return gtk_progress_get_current_percentage (GTK_PROGRESS (pbar)); + priv = GTK_PROGRESS_BAR_GET_PRIVATE (pbar); + return priv->fraction; } /** diff --git a/gtk/gtkprogressbar.h b/gtk/gtkprogressbar.h index 6f09b2ce8a..cefe6f12f7 100644 --- a/gtk/gtkprogressbar.h +++ b/gtk/gtkprogressbar.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -146,27 +146,6 @@ void gtk_progress_bar_set_ellipsize (GtkProgressBar *pbar, PangoEllipsizeMode gtk_progress_bar_get_ellipsize (GtkProgressBar *pbar); -#ifndef GTK_DISABLE_DEPRECATED - -/* Everything below here is deprecated */ -GtkWidget* gtk_progress_bar_new_with_adjustment (GtkAdjustment *adjustment); -void gtk_progress_bar_set_bar_style (GtkProgressBar *pbar, - GtkProgressBarStyle style); -void gtk_progress_bar_set_discrete_blocks (GtkProgressBar *pbar, - guint blocks); -/* set_activity_step() is not only deprecated, it doesn't even work. - * (Of course, it wasn't usable anyway, you had to set it from a size_allocate - * handler or something) - */ -void gtk_progress_bar_set_activity_step (GtkProgressBar *pbar, - guint step); -void gtk_progress_bar_set_activity_blocks (GtkProgressBar *pbar, - guint blocks); -void gtk_progress_bar_update (GtkProgressBar *pbar, - gdouble percentage); - -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_PROGRESS_BAR_H__ */ diff --git a/gtk/gtkradioaction.h b/gtk/gtkradioaction.h index 2b7d72361c..d4a971254c 100644 --- a/gtk/gtkradioaction.h +++ b/gtk/gtkradioaction.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkradiobutton.h b/gtk/gtkradiobutton.h index c39e214db2..fb075131f6 100644 --- a/gtk/gtkradiobutton.h +++ b/gtk/gtkradiobutton.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -85,10 +85,6 @@ GSList* gtk_radio_button_get_group (GtkRadioButton *radio void gtk_radio_button_set_group (GtkRadioButton *radio_button, GSList *group); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_radio_button_group gtk_radio_button_get_group -#endif - G_END_DECLS #endif /* __GTK_RADIO_BUTTON_H__ */ diff --git a/gtk/gtkradiomenuitem.h b/gtk/gtkradiomenuitem.h index 46daa4dc5c..7382bfb7e7 100644 --- a/gtk/gtkradiomenuitem.h +++ b/gtk/gtkradiomenuitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -85,10 +85,6 @@ GSList* gtk_radio_menu_item_get_group (GtkRadioMenuItem * void gtk_radio_menu_item_set_group (GtkRadioMenuItem *radio_menu_item, GSList *group); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_radio_menu_item_group gtk_radio_menu_item_get_group -#endif - G_END_DECLS #endif /* __GTK_RADIO_MENU_ITEM_H__ */ diff --git a/gtk/gtkradiotoolbutton.h b/gtk/gtkradiotoolbutton.h index 768c7630b6..7f77efd429 100644 --- a/gtk/gtkradiotoolbutton.h +++ b/gtk/gtkradiotoolbutton.h @@ -20,7 +20,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrange.h b/gtk/gtkrange.h index abfbc7c137..abbd105fb1 100644 --- a/gtk/gtkrange.h +++ b/gtk/gtkrange.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c index 556e92be8e..7ddd3311f8 100644 --- a/gtk/gtkrc.c +++ b/gtk/gtkrc.c @@ -1304,22 +1304,6 @@ _gtk_rc_style_unset_rc_property (GtkRcStyle *rc_style, } } -void -gtk_rc_style_ref (GtkRcStyle *rc_style) -{ - g_return_if_fail (GTK_IS_RC_STYLE (rc_style)); - - g_object_ref (rc_style); -} - -void -gtk_rc_style_unref (GtkRcStyle *rc_style) -{ - g_return_if_fail (GTK_IS_RC_STYLE (rc_style)); - - g_object_unref (rc_style); -} - static GtkRcStyle * gtk_rc_style_real_create_rc_style (GtkRcStyle *style) { @@ -2162,86 +2146,6 @@ gtk_rc_get_style_by_paths (GtkSettings *settings, return NULL; } -static GSList * -gtk_rc_add_rc_sets (GSList *slist, - GtkRcStyle *rc_style, - const gchar *pattern, - GtkPathType path_type) -{ - GtkRcStyle *new_style; - GtkRcSet *rc_set; - guint i; - - new_style = gtk_rc_style_new (); - *new_style = *rc_style; - new_style->name = g_strdup (rc_style->name); - if (rc_style->font_desc) - new_style->font_desc = pango_font_description_copy (rc_style->font_desc); - - for (i = 0; i < 5; i++) - new_style->bg_pixmap_name[i] = g_strdup (rc_style->bg_pixmap_name[i]); - - rc_set = g_new (GtkRcSet, 1); - rc_set->type = path_type; - - if (path_type == GTK_PATH_WIDGET_CLASS) - { - rc_set->pspec = NULL; - rc_set->path = _gtk_rc_parse_widget_class_path (pattern); - } - else - { - rc_set->pspec = g_pattern_spec_new (pattern); - rc_set->path = NULL; - } - - rc_set->rc_style = rc_style; - - return g_slist_prepend (slist, rc_set); -} - -void -gtk_rc_add_widget_name_style (GtkRcStyle *rc_style, - const gchar *pattern) -{ - GtkRcContext *context; - - g_return_if_fail (rc_style != NULL); - g_return_if_fail (pattern != NULL); - - context = gtk_rc_context_get (gtk_settings_get_default ()); - - context->rc_sets_widget = gtk_rc_add_rc_sets (context->rc_sets_widget, rc_style, pattern, GTK_PATH_WIDGET); -} - -void -gtk_rc_add_widget_class_style (GtkRcStyle *rc_style, - const gchar *pattern) -{ - GtkRcContext *context; - - g_return_if_fail (rc_style != NULL); - g_return_if_fail (pattern != NULL); - - context = gtk_rc_context_get (gtk_settings_get_default ()); - - context->rc_sets_widget_class = gtk_rc_add_rc_sets (context->rc_sets_widget_class, rc_style, pattern, GTK_PATH_WIDGET_CLASS); -} - -void -gtk_rc_add_class_style (GtkRcStyle *rc_style, - const gchar *pattern) -{ - GtkRcContext *context; - - g_return_if_fail (rc_style != NULL); - g_return_if_fail (pattern != NULL); - - context = gtk_rc_context_get (gtk_settings_get_default ()); - - context->rc_sets_class = gtk_rc_add_rc_sets (context->rc_sets_class, rc_style, pattern, GTK_PATH_CLASS); -} - GScanner* gtk_rc_scanner_new (void) { diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h index 0d5e0cebaf..fb923c2f6b 100644 --- a/gtk/gtkrc.h +++ b/gtk/gtkrc.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -159,25 +159,10 @@ void gtk_rc_parse (const gchar *filename); void gtk_rc_parse_string (const gchar *rc_string); gboolean gtk_rc_reparse_all (void); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_rc_add_widget_name_style (GtkRcStyle *rc_style, - const gchar *pattern); -void gtk_rc_add_widget_class_style (GtkRcStyle *rc_style, - const gchar *pattern); -void gtk_rc_add_class_style (GtkRcStyle *rc_style, - const gchar *pattern); -#endif /* GTK_DISABLE_DEPRECATED */ - - GType gtk_rc_style_get_type (void) G_GNUC_CONST; GtkRcStyle* gtk_rc_style_new (void); GtkRcStyle* gtk_rc_style_copy (GtkRcStyle *orig); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_rc_style_ref (GtkRcStyle *rc_style); -void gtk_rc_style_unref (GtkRcStyle *rc_style); -#endif - gchar* gtk_rc_find_module_in_path (const gchar *module_file); gchar* gtk_rc_get_theme_dir (void); gchar* gtk_rc_get_module_dir (void); diff --git a/gtk/gtkrecentaction.h b/gtk/gtkrecentaction.h index 96d5ca6a19..777a8baf7b 100644 --- a/gtk/gtkrecentaction.h +++ b/gtk/gtkrecentaction.h @@ -19,7 +19,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrecentchooser.c b/gtk/gtkrecentchooser.c index bb84ef5e07..71a5bcfcd8 100644 --- a/gtk/gtkrecentchooser.c +++ b/gtk/gtkrecentchooser.c @@ -607,72 +607,6 @@ recent_chooser_has_show_numbers (GtkRecentChooser *chooser) } /** - * gtk_recent_chooser_set_show_numbers: - * @chooser: a #GtkRecentChooser - * @show_numbers: %TRUE to show numbers, %FALSE otherwise - * - * Whether to show recently used resources prepended by a unique number. - * - * Deprecated: 2.12: Use gtk_recent_chooser_menu_set_show_numbers() instead. - * - * Since: 2.10 - */ -void -gtk_recent_chooser_set_show_numbers (GtkRecentChooser *chooser, - gboolean show_numbers) -{ - g_return_if_fail (GTK_IS_RECENT_CHOOSER (chooser)); - - if (!recent_chooser_has_show_numbers (chooser)) - { - g_warning ("Choosers of type `%s' do not support showing numbers", - G_OBJECT_TYPE_NAME (chooser)); - - return; - } - - g_object_set (chooser, "show-numbers", show_numbers, NULL); -} - -/** - * gtk_recent_chooser_get_show_numbers: - * @chooser: a #GtkRecentChooser - * - * Returns whether @chooser should display recently used resources - * prepended by a unique number. - * - * Deprecated: 2.12: use gtk_recent_chooser_menu_get_show_numbers() instead. - * - * Return value: %TRUE if the recent chooser should show display numbers, - * %FALSE otherwise. - * - * Since: 2.10 - */ -gboolean -gtk_recent_chooser_get_show_numbers (GtkRecentChooser *chooser) -{ - GParamSpec *pspec; - gboolean show_numbers; - - g_return_val_if_fail (GTK_IS_RECENT_CHOOSER (chooser), FALSE); - - pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (chooser), - "show-numbers"); - if (!pspec || pspec->value_type != G_TYPE_BOOLEAN) - { - g_warning ("Choosers of type `%s' do not support showing numbers", - G_OBJECT_TYPE_NAME (chooser)); - - return FALSE; - } - - g_object_get (chooser, "show-numbers", &show_numbers, NULL); - - return show_numbers; -} - - -/** * gtk_recent_chooser_set_sort_type: * @chooser: a #GtkRecentChooser * @sort_type: sort order that the chooser should use diff --git a/gtk/gtkrecentchooser.h b/gtk/gtkrecentchooser.h index 2b5dd7e55f..8b891e1d51 100644 --- a/gtk/gtkrecentchooser.h +++ b/gtk/gtkrecentchooser.h @@ -19,7 +19,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -138,11 +138,6 @@ gboolean gtk_recent_chooser_get_local_only (GtkRecentChooser *cho void gtk_recent_chooser_set_show_tips (GtkRecentChooser *chooser, gboolean show_tips); gboolean gtk_recent_chooser_get_show_tips (GtkRecentChooser *chooser); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_recent_chooser_set_show_numbers (GtkRecentChooser *chooser, - gboolean show_numbers); -gboolean gtk_recent_chooser_get_show_numbers (GtkRecentChooser *chooser); -#endif /* GTK_DISABLE_DEPRECATED */ void gtk_recent_chooser_set_show_icons (GtkRecentChooser *chooser, gboolean show_icons); gboolean gtk_recent_chooser_get_show_icons (GtkRecentChooser *chooser); diff --git a/gtk/gtkrecentchooserdialog.h b/gtk/gtkrecentchooserdialog.h index d8c12214a8..cfcce51362 100644 --- a/gtk/gtkrecentchooserdialog.h +++ b/gtk/gtkrecentchooserdialog.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrecentchoosermenu.h b/gtk/gtkrecentchoosermenu.h index 6b401d6918..c30547a786 100644 --- a/gtk/gtkrecentchoosermenu.h +++ b/gtk/gtkrecentchoosermenu.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrecentchooserwidget.h b/gtk/gtkrecentchooserwidget.h index d5aa58f51f..0a01428471 100644 --- a/gtk/gtkrecentchooserwidget.h +++ b/gtk/gtkrecentchooserwidget.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrecentfilter.h b/gtk/gtkrecentfilter.h index 3be8e5e979..8dc64a85f9 100644 --- a/gtk/gtkrecentfilter.h +++ b/gtk/gtkrecentfilter.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkrecentmanager.c b/gtk/gtkrecentmanager.c index 4181d4a0e2..a9ee6d37e7 100644 --- a/gtk/gtkrecentmanager.c +++ b/gtk/gtkrecentmanager.c @@ -641,58 +641,6 @@ gtk_recent_manager_get_default (void) } /** - * gtk_recent_manager_get_for_screen: - * @screen: a #GdkScreen - * - * Gets the recent manager object associated with @screen; if this - * function has not previously been called for the given screen, - * a new recent manager object will be created and associated with - * the screen. Recent manager objects are fairly expensive to create, - * so using this function is usually a better choice than calling - * gtk_recent_manager_new() and setting the screen yourself; by using - * this function a single recent manager object will be shared between - * users. - * - * Return value: A unique #GtkRecentManager associated with the given - * screen. This recent manager is associated to the with the screen - * and can be used as long as the screen is open. Do not ref or - * unref it. - * - * Deprecated: 2.12: This function has been deprecated and should - * not be used in newly written code. Calling this function is - * equivalent to calling gtk_recent_manager_get_default(). - * - * Since: 2.10 - */ -GtkRecentManager * -gtk_recent_manager_get_for_screen (GdkScreen *screen) -{ - return gtk_recent_manager_get_default (); -} - -/** - * gtk_recent_manager_set_screen: - * @manager: a #GtkRecentManager - * @screen: a #GdkScreen - * - * Sets the screen for a recent manager; the screen is used to - * track the user's currently configured recently used documents - * storage. - * - * Since: 2.10 - * - * Deprecated: 2.12: This function has been deprecated and should - * not be used in newly written code. Calling this function has - * no effect. - */ -void -gtk_recent_manager_set_screen (GtkRecentManager *manager, - GdkScreen *screen) -{ - -} - -/** * gtk_recent_manager_set_limit: * @manager: a #GtkRecentManager * @limit: the maximum number of items to return, or -1. diff --git a/gtk/gtkrecentmanager.h b/gtk/gtkrecentmanager.h index ccc6581594..d13fcf4148 100644 --- a/gtk/gtkrecentmanager.h +++ b/gtk/gtkrecentmanager.h @@ -18,7 +18,7 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -140,12 +140,6 @@ GType gtk_recent_manager_get_type (void) G_GNUC_CONST; GtkRecentManager *gtk_recent_manager_new (void); GtkRecentManager *gtk_recent_manager_get_default (void); -#ifndef GTK_DISABLE_DEPRECATED -GtkRecentManager *gtk_recent_manager_get_for_screen (GdkScreen *screen); -void gtk_recent_manager_set_screen (GtkRecentManager *manager, - GdkScreen *screen); -#endif - gboolean gtk_recent_manager_add_item (GtkRecentManager *manager, const gchar *uri); gboolean gtk_recent_manager_add_full (GtkRecentManager *manager, diff --git a/gtk/gtkruler.h b/gtk/gtkruler.h index ed149e3af6..2702125809 100644 --- a/gtk/gtkruler.h +++ b/gtk/gtkruler.h @@ -34,7 +34,7 @@ * distribution. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkscale.h b/gtk/gtkscale.h index 4221dd281c..204aa79891 100644 --- a/gtk/gtkscale.h +++ b/gtk/gtkscale.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkscalebutton.c b/gtk/gtkscalebutton.c index 7259622001..029123b10b 100644 --- a/gtk/gtkscalebutton.c +++ b/gtk/gtkscalebutton.c @@ -707,46 +707,6 @@ gtk_scale_button_set_adjustment (GtkScaleButton *button, } /** - * gtk_scale_button_get_orientation: - * @button: a #GtkScaleButton - * - * Gets the orientation of the #GtkScaleButton's popup window. - * - * Returns: the #GtkScaleButton's orientation. - * - * Since: 2.14 - * - * Deprecated: 2.16: Use gtk_orientable_get_orientation() instead. - **/ -GtkOrientation -gtk_scale_button_get_orientation (GtkScaleButton *button) -{ - g_return_val_if_fail (GTK_IS_SCALE_BUTTON (button), GTK_ORIENTATION_VERTICAL); - - return button->priv->orientation; -} - -/** - * gtk_scale_button_set_orientation: - * @button: a #GtkScaleButton - * @orientation: the new orientation - * - * Sets the orientation of the #GtkScaleButton's popup window. - * - * Since: 2.14 - * - * Deprecated: 2.16: Use gtk_orientable_set_orientation() instead. - **/ -void -gtk_scale_button_set_orientation (GtkScaleButton *button, - GtkOrientation orientation) -{ - g_return_if_fail (GTK_IS_SCALE_BUTTON (button)); - - gtk_scale_button_set_orientation_private (button, orientation); -} - -/** * gtk_scale_button_get_plus_button: * @button: a #GtkScaleButton * diff --git a/gtk/gtkscalebutton.h b/gtk/gtkscalebutton.h index 61239098db..fc6cc583c9 100644 --- a/gtk/gtkscalebutton.h +++ b/gtk/gtkscalebutton.h @@ -33,7 +33,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -99,14 +99,6 @@ GtkWidget * gtk_scale_button_get_plus_button (GtkScaleButton *button); GtkWidget * gtk_scale_button_get_minus_button (GtkScaleButton *button); GtkWidget * gtk_scale_button_get_popup (GtkScaleButton *button); -#ifndef GTK_DISABLE_DEPRECATED - -GtkOrientation gtk_scale_button_get_orientation (GtkScaleButton *button); -void gtk_scale_button_set_orientation (GtkScaleButton *button, - GtkOrientation orientation); - -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_SCALE_BUTTON_H__ */ diff --git a/gtk/gtkscrollbar.h b/gtk/gtkscrollbar.h index 524335da14..eab137e68c 100644 --- a/gtk/gtkscrollbar.h +++ b/gtk/gtkscrollbar.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkscrolledwindow.h b/gtk/gtkscrolledwindow.h index a82b3b0967..c5d50663f7 100644 --- a/gtk/gtkscrolledwindow.h +++ b/gtk/gtkscrolledwindow.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index cbc2b3ec35..5c7db9cc7f 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -2177,7 +2177,7 @@ gtk_selection_init (void) } /** - * gtk_selection_clear: + * _gtk_selection_clear: * @widget: a #GtkWidget * @event: the event * @@ -2185,15 +2185,9 @@ gtk_selection_init (void) * signal. * * Return value: %TRUE if the event was handled, otherwise false - * - * Since: 2.2 - * - * Deprecated: 2.4: Instead of calling this function, chain up from - * your selection-clear-event handler. Calling this function - * from any other context is illegal. **/ gboolean -gtk_selection_clear (GtkWidget *widget, +_gtk_selection_clear (GtkWidget *widget, GdkEventSelection *event) { /* Note that we filter clear events in gdkselection-x11.c, so diff --git a/gtk/gtkselection.h b/gtk/gtkselection.h index 55bfcad89a..ae689d552e 100644 --- a/gtk/gtkselection.h +++ b/gtk/gtkselection.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -197,10 +197,8 @@ gboolean gtk_targets_include_uri (GdkAtom *targets, void gtk_selection_remove_all (GtkWidget *widget); /* Event handlers */ -#if !defined(GTK_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) -gboolean gtk_selection_clear (GtkWidget *widget, +gboolean _gtk_selection_clear (GtkWidget *widget, GdkEventSelection *event); -#endif gboolean _gtk_selection_request (GtkWidget *widget, GdkEventSelection *event); gboolean _gtk_selection_incr_event (GdkWindow *window, diff --git a/gtk/gtkseparator.h b/gtk/gtkseparator.h index e0f6467358..b2ae0fba0c 100644 --- a/gtk/gtkseparator.h +++ b/gtk/gtkseparator.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkseparatormenuitem.h b/gtk/gtkseparatormenuitem.h index 8b9bb5920f..146174bd3d 100644 --- a/gtk/gtkseparatormenuitem.h +++ b/gtk/gtkseparatormenuitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkseparatortoolitem.h b/gtk/gtkseparatortoolitem.h index f015f65443..1547742c23 100644 --- a/gtk/gtkseparatortoolitem.h +++ b/gtk/gtkseparatortoolitem.h @@ -19,7 +19,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtksettings.h b/gtk/gtksettings.h index 4be0772c63..36fb9a5db9 100644 --- a/gtk/gtksettings.h +++ b/gtk/gtksettings.h @@ -16,7 +16,7 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtksignal.c b/gtk/gtksignal.c deleted file mode 100644 index c855582da5..0000000000 --- a/gtk/gtksignal.c +++ /dev/null @@ -1,394 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include <config.h> -#include "gtksignal.h" -#include "gtkalias.h" - -/* the real parameter limit is of course given by GSignal, bu we need - * an upper limit for the implementations. so this should be adjusted - * with any future changes on the GSignal side of things. - */ -#define SIGNAL_MAX_PARAMS 12 - - -/* --- functions --- */ -guint -gtk_signal_newv (const gchar *name, - GtkSignalRunType signal_flags, - GType object_type, - guint function_offset, - GSignalCMarshaller marshaller, - GType return_val, - guint n_params, - GType *params) -{ - GClosure *closure; - - g_return_val_if_fail (n_params < SIGNAL_MAX_PARAMS, 0); - - closure = function_offset ? g_signal_type_cclosure_new (object_type, function_offset) : NULL; - - return g_signal_newv (name, object_type, (GSignalFlags)signal_flags, closure, - NULL, NULL, marshaller, return_val, n_params, params); -} - -guint -gtk_signal_new (const gchar *name, - GtkSignalRunType signal_flags, - GType object_type, - guint function_offset, - GSignalCMarshaller marshaller, - GType return_val, - guint n_params, - ...) -{ - GType *params; - guint signal_id; - - if (n_params) - { - va_list args; - guint i; - - params = g_new (GType, n_params); - va_start (args, n_params); - for (i = 0; i < n_params; i++) - params[i] = va_arg (args, GType); - va_end (args); - } - else - params = NULL; - signal_id = gtk_signal_newv (name, - signal_flags, - object_type, - function_offset, - marshaller, - return_val, - n_params, - params); - g_free (params); - - return signal_id; -} - -void -gtk_signal_emit_stop_by_name (GtkObject *object, - const gchar *name) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_signal_stop_emission (object, g_signal_lookup (name, G_OBJECT_TYPE (object)), 0); -} - -void -gtk_signal_connect_object_while_alive (GtkObject *object, - const gchar *name, - GCallback func, - GtkObject *alive_object) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_signal_connect_closure_by_id (object, - g_signal_lookup (name, G_OBJECT_TYPE (object)), 0, - g_cclosure_new_object_swap (func, G_OBJECT (alive_object)), - FALSE); -} - -void -gtk_signal_connect_while_alive (GtkObject *object, - const gchar *name, - GCallback func, - gpointer func_data, - GtkObject *alive_object) -{ - GClosure *closure; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - closure = g_cclosure_new (func, func_data, NULL); - g_object_watch_closure (G_OBJECT (alive_object), closure); - g_signal_connect_closure_by_id (object, - g_signal_lookup (name, G_OBJECT_TYPE (object)), 0, - closure, - FALSE); -} - -gulong -gtk_signal_connect_full (GtkObject *object, - const gchar *name, - GCallback func, - GtkCallbackMarshal unsupported, - gpointer data, - GDestroyNotify destroy_func, - gint object_signal, - gint after) -{ - g_return_val_if_fail (GTK_IS_OBJECT (object), 0); - g_return_val_if_fail (unsupported == NULL, 0); - - return g_signal_connect_closure_by_id (object, - g_signal_lookup (name, G_OBJECT_TYPE (object)), 0, - (object_signal - ? g_cclosure_new_swap - : g_cclosure_new) (func, - data, - (GClosureNotify) destroy_func), - after); -} - -void -gtk_signal_compat_matched (GtkObject *object, - GCallback func, - gpointer data, - GSignalMatchType match, - guint action) -{ - guint n_handlers; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - switch (action) - { - case 0: n_handlers = g_signal_handlers_disconnect_matched (object, match, 0, 0, NULL, (gpointer) func, data); break; - case 1: n_handlers = g_signal_handlers_block_matched (object, match, 0, 0, NULL, (gpointer) func, data); break; - case 2: n_handlers = g_signal_handlers_unblock_matched (object, match, 0, 0, NULL, (gpointer) func, data); break; - default: n_handlers = 0; break; - } - - if (!n_handlers) - g_warning ("unable to find signal handler for object(%s:%p) with func(%p) and data(%p)", - G_OBJECT_TYPE_NAME (object), object, func, data); -} - -static inline gboolean -gtk_arg_to_value (GtkArg *arg, - GValue *value) -{ - switch (G_TYPE_FUNDAMENTAL (arg->type)) - { - case G_TYPE_CHAR: g_value_set_char (value, GTK_VALUE_CHAR (*arg)); break; - case G_TYPE_UCHAR: g_value_set_uchar (value, GTK_VALUE_UCHAR (*arg)); break; - case G_TYPE_BOOLEAN: g_value_set_boolean (value, GTK_VALUE_BOOL (*arg)); break; - case G_TYPE_INT: g_value_set_int (value, GTK_VALUE_INT (*arg)); break; - case G_TYPE_UINT: g_value_set_uint (value, GTK_VALUE_UINT (*arg)); break; - case G_TYPE_LONG: g_value_set_long (value, GTK_VALUE_LONG (*arg)); break; - case G_TYPE_ULONG: g_value_set_ulong (value, GTK_VALUE_ULONG (*arg)); break; - case G_TYPE_ENUM: g_value_set_enum (value, GTK_VALUE_ENUM (*arg)); break; - case G_TYPE_FLAGS: g_value_set_flags (value, GTK_VALUE_FLAGS (*arg)); break; - case G_TYPE_FLOAT: g_value_set_float (value, GTK_VALUE_FLOAT (*arg)); break; - case G_TYPE_DOUBLE: g_value_set_double (value, GTK_VALUE_DOUBLE (*arg)); break; - case G_TYPE_STRING: g_value_set_string (value, GTK_VALUE_STRING (*arg)); break; - case G_TYPE_BOXED: g_value_set_boxed (value, GTK_VALUE_BOXED (*arg)); break; - case G_TYPE_POINTER: g_value_set_pointer (value, GTK_VALUE_POINTER (*arg)); break; - case G_TYPE_OBJECT: g_value_set_object (value, GTK_VALUE_POINTER (*arg)); break; - default: - return FALSE; - } - return TRUE; -} - -static inline gboolean -gtk_arg_static_to_value (GtkArg *arg, - GValue *value) -{ - switch (G_TYPE_FUNDAMENTAL (arg->type)) - { - case G_TYPE_CHAR: g_value_set_char (value, GTK_VALUE_CHAR (*arg)); break; - case G_TYPE_UCHAR: g_value_set_uchar (value, GTK_VALUE_UCHAR (*arg)); break; - case G_TYPE_BOOLEAN: g_value_set_boolean (value, GTK_VALUE_BOOL (*arg)); break; - case G_TYPE_INT: g_value_set_int (value, GTK_VALUE_INT (*arg)); break; - case G_TYPE_UINT: g_value_set_uint (value, GTK_VALUE_UINT (*arg)); break; - case G_TYPE_LONG: g_value_set_long (value, GTK_VALUE_LONG (*arg)); break; - case G_TYPE_ULONG: g_value_set_ulong (value, GTK_VALUE_ULONG (*arg)); break; - case G_TYPE_ENUM: g_value_set_enum (value, GTK_VALUE_ENUM (*arg)); break; - case G_TYPE_FLAGS: g_value_set_flags (value, GTK_VALUE_FLAGS (*arg)); break; - case G_TYPE_FLOAT: g_value_set_float (value, GTK_VALUE_FLOAT (*arg)); break; - case G_TYPE_DOUBLE: g_value_set_double (value, GTK_VALUE_DOUBLE (*arg)); break; - case G_TYPE_STRING: g_value_set_static_string (value, GTK_VALUE_STRING (*arg)); break; - case G_TYPE_BOXED: g_value_set_static_boxed (value, GTK_VALUE_BOXED (*arg)); break; - case G_TYPE_POINTER: g_value_set_pointer (value, GTK_VALUE_POINTER (*arg)); break; - case G_TYPE_OBJECT: g_value_set_object (value, GTK_VALUE_POINTER (*arg)); break; - default: - return FALSE; - } - return TRUE; -} - -static inline gboolean -gtk_arg_set_from_value (GtkArg *arg, - GValue *value, - gboolean copy_string) -{ - switch (G_TYPE_FUNDAMENTAL (arg->type)) - { - case G_TYPE_CHAR: GTK_VALUE_CHAR (*arg) = g_value_get_char (value); break; - case G_TYPE_UCHAR: GTK_VALUE_UCHAR (*arg) = g_value_get_uchar (value); break; - case G_TYPE_BOOLEAN: GTK_VALUE_BOOL (*arg) = g_value_get_boolean (value); break; - case G_TYPE_INT: GTK_VALUE_INT (*arg) = g_value_get_int (value); break; - case G_TYPE_UINT: GTK_VALUE_UINT (*arg) = g_value_get_uint (value); break; - case G_TYPE_LONG: GTK_VALUE_LONG (*arg) = g_value_get_long (value); break; - case G_TYPE_ULONG: GTK_VALUE_ULONG (*arg) = g_value_get_ulong (value); break; - case G_TYPE_ENUM: GTK_VALUE_ENUM (*arg) = g_value_get_enum (value); break; - case G_TYPE_FLAGS: GTK_VALUE_FLAGS (*arg) = g_value_get_flags (value); break; - case G_TYPE_FLOAT: GTK_VALUE_FLOAT (*arg) = g_value_get_float (value); break; - case G_TYPE_DOUBLE: GTK_VALUE_DOUBLE (*arg) = g_value_get_double (value); break; - case G_TYPE_BOXED: GTK_VALUE_BOXED (*arg) = g_value_get_boxed (value); break; - case G_TYPE_POINTER: GTK_VALUE_POINTER (*arg) = g_value_get_pointer (value); break; - case G_TYPE_OBJECT: GTK_VALUE_POINTER (*arg) = g_value_get_object (value); break; - case G_TYPE_STRING: if (copy_string) - GTK_VALUE_STRING (*arg) = g_value_dup_string (value); - else - GTK_VALUE_STRING (*arg) = (char *) g_value_get_string (value); - break; - default: - return FALSE; - } - return TRUE; -} - -static inline gboolean -gtk_argloc_set_from_value (GtkArg *arg, - GValue *value, - gboolean copy_string) -{ - switch (G_TYPE_FUNDAMENTAL (arg->type)) - { - case G_TYPE_CHAR: *GTK_RETLOC_CHAR (*arg) = g_value_get_char (value); break; - case G_TYPE_UCHAR: *GTK_RETLOC_UCHAR (*arg) = g_value_get_uchar (value); break; - case G_TYPE_BOOLEAN: *GTK_RETLOC_BOOL (*arg) = g_value_get_boolean (value); break; - case G_TYPE_INT: *GTK_RETLOC_INT (*arg) = g_value_get_int (value); break; - case G_TYPE_UINT: *GTK_RETLOC_UINT (*arg) = g_value_get_uint (value); break; - case G_TYPE_LONG: *GTK_RETLOC_LONG (*arg) = g_value_get_long (value); break; - case G_TYPE_ULONG: *GTK_RETLOC_ULONG (*arg) = g_value_get_ulong (value); break; - case G_TYPE_ENUM: *GTK_RETLOC_ENUM (*arg) = g_value_get_enum (value); break; - case G_TYPE_FLAGS: *GTK_RETLOC_FLAGS (*arg) = g_value_get_flags (value); break; - case G_TYPE_FLOAT: *GTK_RETLOC_FLOAT (*arg) = g_value_get_float (value); break; - case G_TYPE_DOUBLE: *GTK_RETLOC_DOUBLE (*arg) = g_value_get_double (value); break; - case G_TYPE_BOXED: *GTK_RETLOC_BOXED (*arg) = g_value_get_boxed (value); break; - case G_TYPE_POINTER: *GTK_RETLOC_POINTER (*arg) = g_value_get_pointer (value); break; - case G_TYPE_OBJECT: *GTK_RETLOC_POINTER (*arg) = g_value_get_object (value); break; - case G_TYPE_STRING: if (copy_string) - *GTK_RETLOC_STRING (*arg) = g_value_dup_string (value); - else - *GTK_RETLOC_STRING (*arg) = (char *) g_value_get_string (value); - break; - default: - return FALSE; - } - return TRUE; -} - -void -gtk_signal_emitv (GtkObject *object, - guint signal_id, - GtkArg *args) -{ - GSignalQuery query; - GValue params[SIGNAL_MAX_PARAMS + 1] = { { 0, }, }; - GValue rvalue = { 0, }; - guint i; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - g_signal_query (signal_id, &query); - g_return_if_fail (query.signal_id != 0); - g_return_if_fail (g_type_is_a (GTK_OBJECT_TYPE (object), query.itype)); - g_return_if_fail (query.n_params < SIGNAL_MAX_PARAMS); - if (query.n_params > 0) - g_return_if_fail (args != NULL); - - g_value_init (params + 0, GTK_OBJECT_TYPE (object)); - g_value_set_object (params + 0, G_OBJECT (object)); - for (i = 0; i < query.n_params; i++) - { - GValue *value = params + 1 + i; - GtkArg *arg = args + i; - - g_value_init (value, arg->type & ~G_SIGNAL_TYPE_STATIC_SCOPE); - if (!gtk_arg_static_to_value (arg, value)) - { - g_warning ("%s: failed to convert arg type `%s' to value type `%s'", - G_STRLOC, g_type_name (arg->type & ~G_SIGNAL_TYPE_STATIC_SCOPE), - g_type_name (G_VALUE_TYPE (value))); - return; - } - } - if (query.return_type != G_TYPE_NONE) - g_value_init (&rvalue, query.return_type); - - g_signal_emitv (params, signal_id, 0, &rvalue); - - if (query.return_type != G_TYPE_NONE) - { - gtk_argloc_set_from_value (args + query.n_params, &rvalue, TRUE); - g_value_unset (&rvalue); - } - for (i = 0; i < query.n_params; i++) - g_value_unset (params + 1 + i); - g_value_unset (params + 0); -} - -void -gtk_signal_emit (GtkObject *object, - guint signal_id, - ...) -{ - va_list var_args; - - g_return_if_fail (GTK_IS_OBJECT (object)); - - va_start (var_args, signal_id); - g_signal_emit_valist (G_OBJECT (object), signal_id, 0, var_args); - va_end (var_args); -} - -void -gtk_signal_emit_by_name (GtkObject *object, - const gchar *name, - ...) -{ - GSignalQuery query; - va_list var_args; - - g_return_if_fail (GTK_IS_OBJECT (object)); - g_return_if_fail (name != NULL); - - g_signal_query (g_signal_lookup (name, GTK_OBJECT_TYPE (object)), &query); - g_return_if_fail (query.signal_id != 0); - - va_start (var_args, name); - g_signal_emit_valist (G_OBJECT (object), query.signal_id, 0, var_args); - va_end (var_args); -} - -void -gtk_signal_emitv_by_name (GtkObject *object, - const gchar *name, - GtkArg *args) -{ - g_return_if_fail (GTK_IS_OBJECT (object)); - - gtk_signal_emitv (object, g_signal_lookup (name, GTK_OBJECT_TYPE (object)), args); -} - -#define __GTK_SIGNAL_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtksignal.h b/gtk/gtksignal.h deleted file mode 100644 index dbb5c430b6..0000000000 --- a/gtk/gtksignal.h +++ /dev/null @@ -1,149 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_SIGNAL_H__ -#define __GTK_SIGNAL_H__ - -#include <gtk/gtk.h> -#include <gtk/gtkmarshal.h> - -G_BEGIN_DECLS - -#define gtk_signal_default_marshaller g_cclosure_marshal_VOID__VOID - - -/* --- compat defines --- */ -#define GTK_SIGNAL_OFFSET G_STRUCT_OFFSET -#define gtk_signal_lookup(name,object_type) \ - g_signal_lookup ((name), (object_type)) -#define gtk_signal_name(signal_id) \ - g_signal_name (signal_id) -#define gtk_signal_emit_stop(object,signal_id) \ - g_signal_stop_emission ((object), (signal_id), 0) -#define gtk_signal_connect(object,name,func,func_data) \ - gtk_signal_connect_full ((object), (name), (func), NULL, (func_data), NULL, 0, 0) -#define gtk_signal_connect_after(object,name,func,func_data) \ - gtk_signal_connect_full ((object), (name), (func), NULL, (func_data), NULL, 0, 1) -#define gtk_signal_connect_object(object,name,func,slot_object) \ - gtk_signal_connect_full ((object), (name), (func), NULL, (slot_object), NULL, 1, 0) -#define gtk_signal_connect_object_after(object,name,func,slot_object) \ - gtk_signal_connect_full ((object), (name), (func), NULL, (slot_object), NULL, 1, 1) -#define gtk_signal_disconnect(object,handler_id) \ - g_signal_handler_disconnect ((object), (handler_id)) -#define gtk_signal_handler_block(object,handler_id) \ - g_signal_handler_block ((object), (handler_id)) -#define gtk_signal_handler_unblock(object,handler_id) \ - g_signal_handler_unblock ((object), (handler_id)) -#define gtk_signal_disconnect_by_func(object,func,data) \ - gtk_signal_compat_matched ((object), (func), (data), \ - (GSignalMatchType)(G_SIGNAL_MATCH_FUNC | \ - G_SIGNAL_MATCH_DATA), 0) -#define gtk_signal_disconnect_by_data(object,data) \ - gtk_signal_compat_matched ((object), 0, (data), G_SIGNAL_MATCH_DATA, 0) -#define gtk_signal_handler_block_by_func(object,func,data) \ - gtk_signal_compat_matched ((object), (func), (data), \ - (GSignalMatchType)(G_SIGNAL_MATCH_FUNC | \ - G_SIGNAL_MATCH_DATA), 1) -#define gtk_signal_handler_block_by_data(object,data) \ - gtk_signal_compat_matched ((object), 0, (data), G_SIGNAL_MATCH_DATA, 1) -#define gtk_signal_handler_unblock_by_func(object,func,data) \ - gtk_signal_compat_matched ((object), (func), (data), \ - (GSignalMatchType)(G_SIGNAL_MATCH_FUNC | \ - G_SIGNAL_MATCH_DATA), 2) -#define gtk_signal_handler_unblock_by_data(object,data) \ - gtk_signal_compat_matched ((object), 0, (data), G_SIGNAL_MATCH_DATA, 2) -#define gtk_signal_handler_pending(object,signal_id,may_be_blocked) \ - g_signal_has_handler_pending ((object), (signal_id), 0, (may_be_blocked)) -#define gtk_signal_handler_pending_by_func(object,signal_id,may_be_blocked,func,data) \ - (g_signal_handler_find ((object), \ - (GSignalMatchType)(G_SIGNAL_MATCH_ID | \ - G_SIGNAL_MATCH_FUNC | \ - G_SIGNAL_MATCH_DATA | \ - ((may_be_blocked) ? 0 : G_SIGNAL_MATCH_UNBLOCKED)),\ - (signal_id), 0, 0, (func), (data)) != 0) - - -/* --- compat functions --- */ -guint gtk_signal_newv (const gchar *name, - GtkSignalRunType signal_flags, - GType object_type, - guint function_offset, - GSignalCMarshaller marshaller, - GType return_val, - guint n_args, - GType *args); -guint gtk_signal_new (const gchar *name, - GtkSignalRunType signal_flags, - GType object_type, - guint function_offset, - GSignalCMarshaller marshaller, - GType return_val, - guint n_args, - ...); -void gtk_signal_emit_stop_by_name (GtkObject *object, - const gchar *name); -void gtk_signal_connect_object_while_alive (GtkObject *object, - const gchar *name, - GCallback func, - GtkObject *alive_object); -void gtk_signal_connect_while_alive (GtkObject *object, - const gchar *name, - GCallback func, - gpointer func_data, - GtkObject *alive_object); -gulong gtk_signal_connect_full (GtkObject *object, - const gchar *name, - GCallback func, - GtkCallbackMarshal unsupported, - gpointer data, - GDestroyNotify destroy_func, - gint object_signal, - gint after); -void gtk_signal_emitv (GtkObject *object, - guint signal_id, - GtkArg *args); -void gtk_signal_emit (GtkObject *object, - guint signal_id, - ...); -void gtk_signal_emit_by_name (GtkObject *object, - const gchar *name, - ...); -void gtk_signal_emitv_by_name (GtkObject *object, - const gchar *name, - GtkArg *args); -void gtk_signal_compat_matched (GtkObject *object, - GCallback func, - gpointer data, - GSignalMatchType match, - guint action); - -G_END_DECLS - -#endif /* __GTK_SIGNAL_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtksizegroup.h b/gtk/gtksizegroup.h index 28a06e9567..a41f8958ae 100644 --- a/gtk/gtksizegroup.h +++ b/gtk/gtksizegroup.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtksocket.c b/gtk/gtksocket.c index 3531af47fc..dfb20f001d 100644 --- a/gtk/gtksocket.c +++ b/gtk/gtksocket.c @@ -290,32 +290,6 @@ gtk_socket_new (void) } /** - * gtk_socket_steal: - * @socket_: a #GtkSocket - * @wid: the window ID of an existing toplevel window. - * - * Reparents a pre-existing toplevel window into a #GtkSocket. This is - * meant to embed clients that do not know about embedding into a - * #GtkSocket, however doing so is inherently unreliable, and using - * this function is not recommended. - * - * The #GtkSocket must have already be added into a toplevel window - * before you can make this call. - **/ -void -gtk_socket_steal (GtkSocket *socket, - GdkNativeWindow wid) -{ - g_return_if_fail (GTK_IS_SOCKET (socket)); - g_return_if_fail (GTK_WIDGET_ANCHORED (socket)); - - if (!gtk_widget_get_realized (GTK_WIDGET (socket))) - gtk_widget_realize (GTK_WIDGET (socket)); - - _gtk_socket_add_window (socket, wid, TRUE); -} - -/** * gtk_socket_add_id: * @socket_: a #GtkSocket * @window_id: the window ID of a client participating in the XEMBED protocol. diff --git a/gtk/gtksocket.h b/gtk/gtksocket.h index db347c06f0..e3cd3a36ce 100644 --- a/gtk/gtksocket.h +++ b/gtk/gtksocket.h @@ -23,7 +23,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -92,11 +92,6 @@ void gtk_socket_add_id (GtkSocket *socket_, GdkNativeWindow gtk_socket_get_id (GtkSocket *socket_); GdkWindow* gtk_socket_get_plug_window (GtkSocket *socket_); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_socket_steal (GtkSocket *socket_, - GdkNativeWindow wid); -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_SOCKET_H__ */ diff --git a/gtk/gtkspinbutton.h b/gtk/gtkspinbutton.h index 6767953792..4f43a4a2a1 100644 --- a/gtk/gtkspinbutton.h +++ b/gtk/gtkspinbutton.h @@ -27,7 +27,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -186,11 +186,6 @@ void gtk_spin_button_set_snap_to_ticks (GtkSpinButton *spin_button, gboolean gtk_spin_button_get_snap_to_ticks (GtkSpinButton *spin_button); void gtk_spin_button_update (GtkSpinButton *spin_button); - -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_spin_button_get_value_as_float gtk_spin_button_get_value -#endif - G_END_DECLS #endif /* __GTK_SPIN_BUTTON_H__ */ diff --git a/gtk/gtkstatusbar.h b/gtk/gtkstatusbar.h index ff0597655c..77558df23a 100644 --- a/gtk/gtkstatusbar.h +++ b/gtk/gtkstatusbar.h @@ -25,7 +25,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkstatusicon.c b/gtk/gtkstatusicon.c index 146b8f09c9..e6ec4057b8 100644 --- a/gtk/gtkstatusicon.c +++ b/gtk/gtkstatusicon.c @@ -2267,24 +2267,6 @@ gtk_status_icon_get_screen (GtkStatusIcon *status_icon) #endif } -/** - * gtk_status_icon_set_tooltip: - * @status_icon: a #GtkStatusIcon - * @tooltip_text: (allow-none): the tooltip text, or %NULL - * - * Sets the tooltip of the status icon. - * - * Since: 2.10 - * - * Deprecated: 2.16: Use gtk_status_icon_set_tooltip_text() instead. - */ -void -gtk_status_icon_set_tooltip (GtkStatusIcon *status_icon, - const gchar *tooltip_text) -{ - gtk_status_icon_set_tooltip_text (status_icon, tooltip_text); -} - static gboolean gtk_status_icon_blinker (GtkStatusIcon *status_icon) { diff --git a/gtk/gtkstatusicon.h b/gtk/gtkstatusicon.h index 0c08cfe212..9142367b12 100644 --- a/gtk/gtkstatusicon.h +++ b/gtk/gtkstatusicon.h @@ -21,7 +21,7 @@ * Mark McLoughlin <mark@skynet.ie> */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -110,10 +110,6 @@ void gtk_status_icon_set_screen (GtkStatusIcon *st GdkScreen *screen); GdkScreen *gtk_status_icon_get_screen (GtkStatusIcon *status_icon); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_status_icon_set_tooltip (GtkStatusIcon *status_icon, - const gchar *tooltip_text); -#endif void gtk_status_icon_set_has_tooltip (GtkStatusIcon *status_icon, gboolean has_tooltip); void gtk_status_icon_set_tooltip_text (GtkStatusIcon *status_icon, diff --git a/gtk/gtkstock.h b/gtk/gtkstock.h index 84c22a4db9..0d3d2c02d7 100644 --- a/gtk/gtkstock.h +++ b/gtk/gtkstock.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c index f18d76a2e7..53c4711f90 100644 --- a/gtk/gtkstyle.c +++ b/gtk/gtkstyle.c @@ -32,7 +32,6 @@ #include "gtkgc.h" #include "gtkmarshalers.h" #undef GTK_DISABLE_DEPRECATED -#include "gtkoptionmenu.h" #include "gtkrc.h" #include "gtkspinbutton.h" #include "gtkstyle.h" @@ -42,6 +41,7 @@ #include "gtksettings.h" /* _gtk_settings_parse_convert() */ #include "gtkintl.h" #include "gtkalias.h" +#include "gtkspinner.h" #define LIGHTNESS_MULT 1.3 #define DARKNESS_MULT 0.7 @@ -828,35 +828,6 @@ gtk_style_detach (GtkStyle *style) } } -/** - * gtk_style_ref: - * @style: a #GtkStyle. - * @returns: @style. - * - * Increase the reference count of @style. - * - * Deprecated: 2.0: use g_object_ref() instead. - */ -GtkStyle* -gtk_style_ref (GtkStyle *style) -{ - return (GtkStyle *) g_object_ref (style); -} - -/** - * gtk_style_unref: - * @style: a #GtkStyle. - * - * Decrease the reference count of @style. - * - * Deprecated: 2.0: use g_object_unref() instead. - */ -void -gtk_style_unref (GtkStyle *style) -{ - g_object_unref (style); -} - static void gtk_style_realize (GtkStyle *style, GdkColormap *colormap) @@ -949,675 +920,6 @@ gtk_style_lookup_color (GtkStyle *style, } /** - * gtk_draw_hline: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @x1: the starting x coordinate - * @x2: the ending x coordinate - * @y: the y coordinate - * - * Draws a horizontal line from (@x1, @y) to (@x2, @y) in @window - * using the given style and state. - * - * Deprecated: 2.0: Use gtk_paint_hline() instead. - **/ -void -gtk_draw_hline (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint x1, - gint x2, - gint y) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_hline != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_hline (style, window, state_type, NULL, NULL, NULL, x1, x2, y); -} - - -/** - * gtk_draw_vline: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @y1_: the starting y coordinate - * @y2_: the ending y coordinate - * @x: the x coordinate - * - * Draws a vertical line from (@x, @y1_) to (@x, @y2_) in @window - * using the given style and state. - * - * Deprecated: 2.0: Use gtk_paint_vline() instead. - **/ -void -gtk_draw_vline (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint y1_, - gint y2_, - gint x) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_vline != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_vline (style, window, state_type, NULL, NULL, NULL, y1_, y2_, x); -} - -/** - * gtk_draw_shadow: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: type of shadow to draw - * @x: x origin of the rectangle - * @y: y origin of the rectangle - * @width: width of the rectangle - * @height: width of the rectangle - * - * Draws a shadow around the given rectangle in @window - * using the given style and state and shadow type. - * - * Deprecated: 2.0: Use gtk_paint_shadow() instead. - */ -void -gtk_draw_shadow (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_shadow != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_shadow (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_polygon: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: type of shadow to draw - * @points: an array of #GdkPoint<!-- -->s - * @npoints: length of @points - * @fill: %TRUE if the polygon should be filled - * - * Draws a polygon on @window with the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_polygon() instead. - */ -void -gtk_draw_polygon (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - GdkPoint *points, - gint npoints, - gboolean fill) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_polygon != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_polygon (style, window, state_type, shadow_type, NULL, NULL, NULL, points, npoints, fill); -} - -/** - * gtk_draw_arrow: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @arrow_type: the type of arrow to draw - * @fill: %TRUE if the arrow tip should be filled - * @x: x origin of the rectangle to draw the arrow in - * @y: y origin of the rectangle to draw the arrow in - * @width: width of the rectangle to draw the arrow in - * @height: height of the rectangle to draw the arrow in - * - * Draws an arrow in the given rectangle on @window using the given - * parameters. @arrow_type determines the direction of the arrow. - * - * Deprecated: 2.0: Use gtk_paint_arrow() instead. - */ -void -gtk_draw_arrow (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - GtkArrowType arrow_type, - gboolean fill, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_arrow != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_arrow (style, window, state_type, shadow_type, NULL, NULL, NULL, arrow_type, fill, x, y, width, height); -} - -/** - * gtk_draw_diamond: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @x: x origin of the rectangle to draw the diamond in - * @y: y origin of the rectangle to draw the diamond in - * @width: width of the rectangle to draw the diamond in - * @height: height of the rectangle to draw the diamond in - * - * Draws a diamond in the given rectangle on @window using the given - * parameters. - * - * Deprecated: 2.0: Use gtk_paint_diamond() instead. - */ -void -gtk_draw_diamond (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_diamond != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_diamond (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_string: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @x: x origin - * @y: y origin - * @string: the string to draw - * - * Draws a text string on @window with the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_layout() instead. - */ -void -gtk_draw_string (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint x, - gint y, - const gchar *string) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_string != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_string (style, window, state_type, NULL, NULL, NULL, x, y, string); -} - -/** - * gtk_draw_box: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @x: x origin of the box - * @y: y origin of the box - * @width: the width of the box - * @height: the height of the box - * - * Draws a box on @window with the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_box() instead. - */ -void -gtk_draw_box (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_box != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_box (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_flat_box: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @x: x origin of the box - * @y: y origin of the box - * @width: the width of the box - * @height: the height of the box - * - * Draws a flat box on @window with the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_flat_box() instead. - */ -void -gtk_draw_flat_box (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_flat_box != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_flat_box (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_check: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @x: x origin of the rectangle to draw the check in - * @y: y origin of the rectangle to draw the check in - * @width: the width of the rectangle to draw the check in - * @height: the height of the rectangle to draw the check in - * - * Draws a check button indicator in the given rectangle on @window with - * the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_check() instead. - */ -void -gtk_draw_check (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_check != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_check (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_option: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @x: x origin of the rectangle to draw the option in - * @y: y origin of the rectangle to draw the option in - * @width: the width of the rectangle to draw the option in - * @height: the height of the rectangle to draw the option in - * - * Draws a radio button indicator in the given rectangle on @window with - * the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_option() instead. - */ -void -gtk_draw_option (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_option != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_option (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_tab: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: the type of shadow to draw - * @x: x origin of the rectangle to draw the tab in - * @y: y origin of the rectangle to draw the tab in - * @width: the width of the rectangle to draw the tab in - * @height: the height of the rectangle to draw the tab in - * - * Draws an option menu tab (i.e. the up and down pointing arrows) - * in the given rectangle on @window using the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_tab() instead. - */ -void -gtk_draw_tab (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_tab != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_tab (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_shadow_gap: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: type of shadow to draw - * @x: x origin of the rectangle - * @y: y origin of the rectangle - * @width: width of the rectangle - * @height: width of the rectangle - * @gap_side: side in which to leave the gap - * @gap_x: starting position of the gap - * @gap_width: width of the gap - * - * Draws a shadow around the given rectangle in @window - * using the given style and state and shadow type, leaving a - * gap in one side. - * - * Deprecated: 2.0: Use gtk_paint_shadow_gap() instead. -*/ -void -gtk_draw_shadow_gap (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkPositionType gap_side, - gint gap_x, - gint gap_width) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_shadow_gap != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_shadow_gap (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height, gap_side, gap_x, gap_width); -} - -/** - * gtk_draw_box_gap: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: type of shadow to draw - * @x: x origin of the rectangle - * @y: y origin of the rectangle - * @width: width of the rectangle - * @height: width of the rectangle - * @gap_side: side in which to leave the gap - * @gap_x: starting position of the gap - * @gap_width: width of the gap - * - * Draws a box in @window using the given style and state and shadow type, - * leaving a gap in one side. - * - * Deprecated: 2.0: Use gtk_paint_box_gap() instead. - */ -void -gtk_draw_box_gap (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkPositionType gap_side, - gint gap_x, - gint gap_width) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_box_gap != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_box_gap (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height, gap_side, gap_x, gap_width); -} - -/** - * gtk_draw_extension: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: type of shadow to draw - * @x: x origin of the extension - * @y: y origin of the extension - * @width: width of the extension - * @height: width of the extension - * @gap_side: the side on to which the extension is attached - * - * Draws an extension, i.e. a notebook tab. - * - * Deprecated: 2.0: Use gtk_paint_extension() instead. - **/ -void -gtk_draw_extension (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkPositionType gap_side) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_extension != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_extension (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height, gap_side); -} - -/** - * gtk_draw_focus: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @x: the x origin of the rectangle around which to draw a focus indicator - * @y: the y origin of the rectangle around which to draw a focus indicator - * @width: the width of the rectangle around which to draw a focus indicator - * @height: the height of the rectangle around which to draw a focus indicator - * - * Draws a focus indicator around the given rectangle on @window using the - * given style. - * - * Deprecated: 2.0: Use gtk_paint_focus() instead. - */ -void -gtk_draw_focus (GtkStyle *style, - GdkWindow *window, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_focus != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_focus (style, window, GTK_STATE_NORMAL, NULL, NULL, NULL, x, y, width, height); -} - -/** - * gtk_draw_slider: - * @style: a #GtkStyle - @window: a #GdkWindow - * @state_type: a state - * @shadow_type: a shadow - * @x: the x origin of the rectangle in which to draw a slider - * @y: the y origin of the rectangle in which to draw a slider - * @width: the width of the rectangle in which to draw a slider - * @height: the height of the rectangle in which to draw a slider - * @orientation: the orientation to be used - * - * Draws a slider in the given rectangle on @window using the - * given style and orientation. - */ -void -gtk_draw_slider (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkOrientation orientation) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_slider != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_slider (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height, orientation); -} - -/** - * gtk_draw_handle: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @shadow_type: type of shadow to draw - * @x: x origin of the handle - * @y: y origin of the handle - * @width: with of the handle - * @height: height of the handle - * @orientation: the orientation of the handle - * - * Draws a handle as used in #GtkHandleBox and #GtkPaned. - * - * Deprecated: 2.0: Use gtk_paint_handle() instead. - **/ -void -gtk_draw_handle (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkOrientation orientation) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_handle != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_handle (style, window, state_type, shadow_type, NULL, NULL, NULL, x, y, width, height, orientation); -} - -/** - * gtk_draw_expander: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @x: the x position to draw the expander at - * @y: the y position to draw the expander at - * @expander_style: the style to draw the expander in - * - * Draws an expander as used in #GtkTreeView. - * - * Deprecated: 2.0: Use gtk_paint_expander() instead. - **/ -void -gtk_draw_expander (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint x, - gint y, - GtkExpanderStyle expander_style) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_expander != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_expander (style, window, state_type, - NULL, NULL, NULL, - x, y, expander_style); -} - -/** - * gtk_draw_layout: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @use_text: whether to use the text or foreground - * graphics context of @style - * @x: x origin - * @y: y origin - * @layout: the layout to draw - * - * Draws a layout on @window using the given parameters. - */ -void -gtk_draw_layout (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gboolean use_text, - gint x, - gint y, - PangoLayout *layout) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_layout != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_layout (style, window, state_type, use_text, - NULL, NULL, NULL, - x, y, layout); -} - -/** - * gtk_draw_resize_grip: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @edge: the edge in which to draw the resize grip - * @x: the x origin of the rectangle in which to draw the resize grip - * @y: the y origin of the rectangle in which to draw the resize grip - * @width: the width of the rectangle in which to draw the resize grip - * @height: the height of the rectangle in which to draw the resize grip - * - * Draws a resize grip in the given rectangle on @window using the given - * parameters. - * - * Deprecated: 2.0: Use gtk_paint_resize_grip() instead. - */ -void -gtk_draw_resize_grip (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GdkWindowEdge edge, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_resize_grip != NULL); - - GTK_STYLE_GET_CLASS (style)->draw_resize_grip (style, window, state_type, - NULL, NULL, NULL, - edge, - x, y, width, height); -} - - -/** * gtk_style_set_background: * @style: a #GtkStyle * @window: a #GdkWindow @@ -3467,12 +2769,6 @@ option_menu_get_props (GtkWidget *widget, { GtkRequisition *tmp_size = NULL; GtkBorder *tmp_spacing = NULL; - - if (GTK_IS_OPTION_MENU (widget)) - gtk_widget_style_get (widget, - "indicator-size", &tmp_size, - "indicator-spacing", &tmp_spacing, - NULL); if (tmp_size) { @@ -6131,43 +5427,6 @@ gtk_paint_diamond (GtkStyle *style, } /** - * gtk_paint_string: - * @style: a #GtkStyle - * @window: a #GdkWindow - * @state_type: a state - * @area: (allow-none): clip rectangle, or %NULL if the - * output should not be clipped - * @widget: (allow-none): the widget - * @detail: (allow-none): a style detail - * @x: x origin - * @y: y origin - * @string: the string to draw - * - * Draws a text string on @window with the given parameters. - * - * Deprecated: 2.0: Use gtk_paint_layout() instead. - */ -void -gtk_paint_string (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - const GdkRectangle *area, - GtkWidget *widget, - const gchar *detail, - gint x, - gint y, - const gchar *string) -{ - g_return_if_fail (GTK_IS_STYLE (style)); - g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_string != NULL); - g_return_if_fail (style->depth == gdk_drawable_get_depth (window)); - - GTK_STYLE_GET_CLASS (style)->draw_string (style, window, state_type, - (GdkRectangle *) area, widget, detail, - x, y, string); -} - -/** * gtk_paint_box: * @style: a #GtkStyle * @window: a #GdkWindow @@ -6894,62 +6153,6 @@ gtk_style_get_font_internal (GtkStyle *style) return style->private_font; } -/** - * gtk_style_get_font: - * @style: a #GtkStyle - * - * Gets the #GdkFont to use for the given style. This is - * meant only as a replacement for direct access to @style->font - * and should not be used in new code. New code should - * use @style->font_desc instead. - * - * Return value: the #GdkFont for the style. This font is owned - * by the style; if you want to keep around a copy, you must - * call gdk_font_ref(). - **/ -GdkFont * -gtk_style_get_font (GtkStyle *style) -{ - g_return_val_if_fail (GTK_IS_STYLE (style), NULL); - - return gtk_style_get_font_internal (style); -} - -/** - * gtk_style_set_font: - * @style: a #GtkStyle. - * @font: (allow-none): a #GdkFont, or %NULL to use the #GdkFont corresponding - * to style->font_desc. - * - * Sets the #GdkFont to use for a given style. This is - * meant only as a replacement for direct access to style->font - * and should not be used in new code. New code should - * use style->font_desc instead. - **/ -void -gtk_style_set_font (GtkStyle *style, - GdkFont *font) -{ - GdkFont *old_font; - - g_return_if_fail (GTK_IS_STYLE (style)); - - old_font = style->private_font; - - style->private_font = font; - if (font) - gdk_font_ref (font); - - if (old_font) - gdk_font_unref (old_font); - - if (style->private_font_desc) - { - pango_font_description_free (style->private_font_desc); - style->private_font_desc = NULL; - } -} - typedef struct _CursorInfo CursorInfo; struct _CursorInfo diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h index 75dc109ec9..141cbcc379 100644 --- a/gtk/gtkstyle.h +++ b/gtk/gtkstyle.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -443,16 +443,6 @@ GtkStyle* gtk_style_copy (GtkStyle *style); GtkStyle* gtk_style_attach (GtkStyle *style, GdkWindow *window) G_GNUC_WARN_UNUSED_RESULT; void gtk_style_detach (GtkStyle *style); - -#ifndef GTK_DISABLE_DEPRECATED -GtkStyle* gtk_style_ref (GtkStyle *style); -void gtk_style_unref (GtkStyle *style); - -GdkFont * gtk_style_get_font (GtkStyle *style); -void gtk_style_set_font (GtkStyle *style, - GdkFont *font); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_style_set_background (GtkStyle *style, GdkWindow *window, GtkStateType state_type); @@ -480,170 +470,6 @@ GdkPixbuf* gtk_style_render_icon (GtkStyle *style, GtkWidget *widget, const gchar *detail); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_draw_hline (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint x1, - gint x2, - gint y); -void gtk_draw_vline (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint y1_, - gint y2_, - gint x); -void gtk_draw_shadow (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_polygon (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - GdkPoint *points, - gint npoints, - gboolean fill); -void gtk_draw_arrow (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - GtkArrowType arrow_type, - gboolean fill, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_diamond (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_box (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_flat_box (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_check (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_option (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_tab (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_shadow_gap (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkPositionType gap_side, - gint gap_x, - gint gap_width); -void gtk_draw_box_gap (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkPositionType gap_side, - gint gap_x, - gint gap_width); -void gtk_draw_extension (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkPositionType gap_side); -void gtk_draw_focus (GtkStyle *style, - GdkWindow *window, - gint x, - gint y, - gint width, - gint height); -void gtk_draw_slider (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkOrientation orientation); -void gtk_draw_handle (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GtkShadowType shadow_type, - gint x, - gint y, - gint width, - gint height, - GtkOrientation orientation); -void gtk_draw_expander (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint x, - gint y, - GtkExpanderStyle expander_style); -void gtk_draw_layout (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gboolean use_text, - gint x, - gint y, - PangoLayout *layout); -void gtk_draw_resize_grip (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - GdkWindowEdge edge, - gint x, - gint y, - gint width, - gint height); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_paint_hline (GtkStyle *style, GdkWindow *window, GtkStateType state_type, @@ -909,26 +735,6 @@ void _gtk_style_shade (const GdkColor *a, GdkColor *b, gdouble k); -/* deprecated */ -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_style_apply_default_pixmap(s,gw,st,a,x,y,w,h) gtk_style_apply_default_background (s,gw,1,st,a,x,y,w,h) -void gtk_draw_string (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - gint x, - gint y, - const gchar *string); -void gtk_paint_string (GtkStyle *style, - GdkWindow *window, - GtkStateType state_type, - const GdkRectangle *area, - GtkWidget *widget, - const gchar *detail, - gint x, - gint y, - const gchar *string); -#endif /* GTK_DISABLE_DEPRECATED */ - void gtk_draw_insertion_cursor (GtkWidget *widget, GdkDrawable *drawable, const GdkRectangle *area, diff --git a/gtk/gtktable.h b/gtk/gtktable.h index 9b3ebf9dd3..f993d7e8f1 100644 --- a/gtk/gtktable.h +++ b/gtk/gtktable.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktearoffmenuitem.h b/gtk/gtktearoffmenuitem.h index a30b0ec462..3fa32a613c 100644 --- a/gtk/gtktearoffmenuitem.h +++ b/gtk/gtktearoffmenuitem.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktext.c b/gtk/gtktext.c deleted file mode 100644 index 5535d5a3b8..0000000000 --- a/gtk/gtktext.c +++ /dev/null @@ -1,5461 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <ctype.h> -#include <string.h> - -#undef GDK_DISABLE_DEPRECATED - -#include "gdk/gdkkeysyms.h" -#include "gdk/gdki18n.h" - -#undef GTK_DISABLE_DEPRECATED - -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtkselection.h" -#include "gtksignal.h" -#include "gtkstyle.h" -#define GTK_ENABLE_BROKEN -#include "gtktext.h" -#include "line-wrap.xbm" -#include "line-arrow.xbm" -#include "gtkprivate.h" -#include "gtkintl.h" - -#include "gtkalias.h" - - -#define INITIAL_BUFFER_SIZE 1024 -#define INITIAL_LINE_CACHE_SIZE 256 -#define MIN_GAP_SIZE 256 -#define LINE_DELIM '\n' -#define MIN_TEXT_WIDTH_LINES 20 -#define MIN_TEXT_HEIGHT_LINES 10 -#define TEXT_BORDER_ROOM 1 -#define LINE_WRAP_ROOM 8 /* The bitmaps are 6 wide. */ -#define DEFAULT_TAB_STOP_WIDTH 4 -#define SCROLL_PIXELS 5 -#define KEY_SCROLL_PIXELS 10 -#define SCROLL_TIME 100 -#define FREEZE_LENGTH 1024 -/* Freeze text when inserting or deleting more than this many characters */ - -#define SET_PROPERTY_MARK(m, p, o) do { \ - (m)->property = (p); \ - (m)->offset = (o); \ - } while (0) -#define MARK_CURRENT_PROPERTY(mark) ((TextProperty*)(mark)->property->data) -#define MARK_NEXT_PROPERTY(mark) ((TextProperty*)(mark)->property->next->data) -#define MARK_PREV_PROPERTY(mark) ((TextProperty*)((mark)->property->prev ? \ - (mark)->property->prev->data \ - : NULL)) -#define MARK_PREV_LIST_PTR(mark) ((mark)->property->prev) -#define MARK_LIST_PTR(mark) ((mark)->property) -#define MARK_NEXT_LIST_PTR(mark) ((mark)->property->next) -#define MARK_OFFSET(mark) ((mark)->offset) -#define MARK_PROPERTY_LENGTH(mark) (MARK_CURRENT_PROPERTY(mark)->length) - - -#define MARK_CURRENT_FONT(text, mark) \ - ((MARK_CURRENT_PROPERTY(mark)->flags & PROPERTY_FONT) ? \ - MARK_CURRENT_PROPERTY(mark)->font->gdk_font : \ - gtk_style_get_font (GTK_WIDGET (text)->style)) -#define MARK_CURRENT_FORE(text, mark) \ - ((MARK_CURRENT_PROPERTY(mark)->flags & PROPERTY_FOREGROUND) ? \ - &MARK_CURRENT_PROPERTY(mark)->fore_color : \ - &((GtkWidget *)text)->style->text[((GtkWidget *)text)->state]) -#define MARK_CURRENT_BACK(text, mark) \ - ((MARK_CURRENT_PROPERTY(mark)->flags & PROPERTY_BACKGROUND) ? \ - &MARK_CURRENT_PROPERTY(mark)->back_color : \ - &((GtkWidget *)text)->style->base[((GtkWidget *)text)->state]) -#define MARK_CURRENT_TEXT_FONT(text, mark) \ - ((MARK_CURRENT_PROPERTY(mark)->flags & PROPERTY_FONT) ? \ - MARK_CURRENT_PROPERTY(mark)->font : \ - text->current_font) - -#define TEXT_LENGTH(t) ((t)->text_end - (t)->gap_size) -#define FONT_HEIGHT(f) ((f)->ascent + (f)->descent) -#define LINE_HEIGHT(l) ((l).font_ascent + (l).font_descent) -#define LINE_CONTAINS(l, i) ((l).start.index <= (i) && (l).end.index >= (i)) -#define LINE_STARTS_AT(l, i) ((l).start.index == (i)) -#define LINE_START_PIXEL(l) ((l).tab_cont.pixel_offset) -#define LAST_INDEX(t, m) ((m).index == TEXT_LENGTH(t)) -#define CACHE_DATA(c) (*(LineParams*)(c)->data) - -enum { - PROP_0, - PROP_HADJUSTMENT, - PROP_VADJUSTMENT, - PROP_LINE_WRAP, - PROP_WORD_WRAP -}; - -typedef struct _TextProperty TextProperty; -typedef struct _TabStopMark TabStopMark; -typedef struct _PrevTabCont PrevTabCont; -typedef struct _FetchLinesData FetchLinesData; -typedef struct _LineParams LineParams; -typedef struct _SetVerticalScrollData SetVerticalScrollData; - -typedef gint (*LineIteratorFunction) (GtkText* text, LineParams* lp, void* data); - -typedef enum -{ - FetchLinesPixels, - FetchLinesCount -} FLType; - -struct _SetVerticalScrollData { - gint pixel_height; - gint last_didnt_wrap; - gint last_line_start; - GtkPropertyMark mark; -}; - -struct _GtkTextFont -{ - /* The actual font. */ - GdkFont *gdk_font; - guint ref_count; - - gint16 char_widths[256]; -}; - -typedef enum { - PROPERTY_FONT = 1 << 0, - PROPERTY_FOREGROUND = 1 << 1, - PROPERTY_BACKGROUND = 1 << 2 -} TextPropertyFlags; - -struct _TextProperty -{ - /* Font. */ - GtkTextFont* font; - - /* Background Color. */ - GdkColor back_color; - - /* Foreground Color. */ - GdkColor fore_color; - - /* Show which properties are set */ - TextPropertyFlags flags; - - /* Length of this property. */ - guint length; -}; - -struct _TabStopMark -{ - GList* tab_stops; /* Index into list containing the next tab position. If - * NULL, using default widths. */ - gint to_next_tab; -}; - -struct _PrevTabCont -{ - guint pixel_offset; - TabStopMark tab_start; -}; - -struct _FetchLinesData -{ - GList* new_lines; - FLType fl_type; - gint data; - gint data_max; -}; - -struct _LineParams -{ - guint font_ascent; - guint font_descent; - guint pixel_width; - guint displayable_chars; - guint wraps : 1; - - PrevTabCont tab_cont; - PrevTabCont tab_cont_next; - - GtkPropertyMark start; - GtkPropertyMark end; -}; - - -static void gtk_text_class_init (GtkTextClass *klass); -static void gtk_text_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gtk_text_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void gtk_text_editable_init (GtkEditableClass *iface); -static void gtk_text_init (GtkText *text); -static void gtk_text_destroy (GtkObject *object); -static void gtk_text_finalize (GObject *object); -static void gtk_text_realize (GtkWidget *widget); -static void gtk_text_unrealize (GtkWidget *widget); -static void gtk_text_style_set (GtkWidget *widget, - GtkStyle *previous_style); -static void gtk_text_state_changed (GtkWidget *widget, - GtkStateType previous_state); -static void gtk_text_draw_focus (GtkWidget *widget); -static void gtk_text_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_text_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_text_adjustment (GtkAdjustment *adjustment, - GtkText *text); -static void gtk_text_insert_text (GtkEditable *editable, - const gchar *new_text, - gint new_text_length, - gint *position); -static void gtk_text_delete_text (GtkEditable *editable, - gint start_pos, - gint end_pos); -static void gtk_text_update_text (GtkOldEditable *old_editable, - gint start_pos, - gint end_pos); -static gchar *gtk_text_get_chars (GtkOldEditable *old_editable, - gint start, - gint end); -static void gtk_text_set_selection (GtkOldEditable *old_editable, - gint start, - gint end); -static void gtk_text_real_set_editable (GtkOldEditable *old_editable, - gboolean is_editable); - -static void gtk_text_adjustment_destroyed (GtkAdjustment *adjustment, - GtkText *text); - -/* Event handlers */ -static gint gtk_text_expose (GtkWidget *widget, - GdkEventExpose *event); -static gint gtk_text_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_text_button_release (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_text_motion_notify (GtkWidget *widget, - GdkEventMotion *event); -static gint gtk_text_key_press (GtkWidget *widget, - GdkEventKey *event); - -static void move_gap (GtkText* text, guint index); -static void make_forward_space (GtkText* text, guint len); - -/* Property management */ -static GtkTextFont* get_text_font (GdkFont* gfont); -static void text_font_unref (GtkTextFont *text_font); - -static void insert_text_property (GtkText* text, GdkFont* font, - const GdkColor *fore, const GdkColor* back, guint len); -static TextProperty* new_text_property (GtkText *text, GdkFont* font, - const GdkColor* fore, const GdkColor* back, guint length); -static void destroy_text_property (TextProperty *prop); -static void init_properties (GtkText *text); -static void realize_property (GtkText *text, TextProperty *prop); -static void realize_properties (GtkText *text); -static void unrealize_property (GtkText *text, TextProperty *prop); -static void unrealize_properties (GtkText *text); - -static void delete_text_property (GtkText* text, guint len); - -static guint pixel_height_of (GtkText* text, GList* cache_line); - -/* Property Movement and Size Computations */ -static void advance_mark (GtkPropertyMark* mark); -static void decrement_mark (GtkPropertyMark* mark); -static void advance_mark_n (GtkPropertyMark* mark, gint n); -static void decrement_mark_n (GtkPropertyMark* mark, gint n); -static void move_mark_n (GtkPropertyMark* mark, gint n); -static GtkPropertyMark find_mark (GtkText* text, guint mark_position); -static GtkPropertyMark find_mark_near (GtkText* text, guint mark_position, const GtkPropertyMark* near); -static void find_line_containing_point (GtkText* text, guint point, - gboolean scroll); - -/* Display */ -static void compute_lines_pixels (GtkText* text, guint char_count, - guint *lines, guint *pixels); - -static gint total_line_height (GtkText* text, - GList* line, - gint line_count); -static LineParams find_line_params (GtkText* text, - const GtkPropertyMark *mark, - const PrevTabCont *tab_cont, - PrevTabCont *next_cont); -static void recompute_geometry (GtkText* text); -static void insert_expose (GtkText* text, guint old_pixels, gint nchars, guint new_line_count); -static void delete_expose (GtkText* text, - guint nchars, - guint old_lines, - guint old_pixels); -static GdkGC *create_bg_gc (GtkText *text); -static void clear_area (GtkText *text, GdkRectangle *area); -static void draw_line (GtkText* text, - gint pixel_height, - LineParams* lp); -static void draw_line_wrap (GtkText* text, - guint height); -static void draw_cursor (GtkText* text, gint absolute); -static void undraw_cursor (GtkText* text, gint absolute); -static gint drawn_cursor_min (GtkText* text); -static gint drawn_cursor_max (GtkText* text); -static void expose_text (GtkText* text, GdkRectangle *area, gboolean cursor); - -/* Search and Placement. */ -static void find_cursor (GtkText* text, - gboolean scroll); -static void find_cursor_at_line (GtkText* text, - const LineParams* start_line, - gint pixel_height); -static void find_mouse_cursor (GtkText* text, gint x, gint y); - -/* Scrolling. */ -static void adjust_adj (GtkText* text, GtkAdjustment* adj); -static void scroll_up (GtkText* text, gint diff); -static void scroll_down (GtkText* text, gint diff); -static void scroll_int (GtkText* text, gint diff); - -static void process_exposes (GtkText *text); - -/* Cache Management. */ -static void free_cache (GtkText* text); -static GList* remove_cache_line (GtkText* text, GList* list); - -/* Key Motion. */ -static void move_cursor_buffer_ver (GtkText *text, int dir); -static void move_cursor_page_ver (GtkText *text, int dir); -static void move_cursor_ver (GtkText *text, int count); -static void move_cursor_hor (GtkText *text, int count); - -/* Binding actions */ -static void gtk_text_move_cursor (GtkOldEditable *old_editable, - gint x, - gint y); -static void gtk_text_move_word (GtkOldEditable *old_editable, - gint n); -static void gtk_text_move_page (GtkOldEditable *old_editable, - gint x, - gint y); -static void gtk_text_move_to_row (GtkOldEditable *old_editable, - gint row); -static void gtk_text_move_to_column (GtkOldEditable *old_editable, - gint row); -static void gtk_text_kill_char (GtkOldEditable *old_editable, - gint direction); -static void gtk_text_kill_word (GtkOldEditable *old_editable, - gint direction); -static void gtk_text_kill_line (GtkOldEditable *old_editable, - gint direction); - -/* To be removed */ -static void gtk_text_move_forward_character (GtkText *text); -static void gtk_text_move_backward_character (GtkText *text); -static void gtk_text_move_forward_word (GtkText *text); -static void gtk_text_move_backward_word (GtkText *text); -static void gtk_text_move_beginning_of_line (GtkText *text); -static void gtk_text_move_end_of_line (GtkText *text); -static void gtk_text_move_next_line (GtkText *text); -static void gtk_text_move_previous_line (GtkText *text); - -static void gtk_text_delete_forward_character (GtkText *text); -static void gtk_text_delete_backward_character (GtkText *text); -static void gtk_text_delete_forward_word (GtkText *text); -static void gtk_text_delete_backward_word (GtkText *text); -static void gtk_text_delete_line (GtkText *text); -static void gtk_text_delete_to_line_end (GtkText *text); -static void gtk_text_select_word (GtkText *text, - guint32 time); -static void gtk_text_select_line (GtkText *text, - guint32 time); - -static void gtk_text_set_position (GtkOldEditable *old_editable, - gint position); - -/* #define DEBUG_GTK_TEXT */ - -#if defined(DEBUG_GTK_TEXT) && defined(__GNUC__) -/* Debugging utilities. */ -static void gtk_text_assert_mark (GtkText *text, - GtkPropertyMark *mark, - GtkPropertyMark *before, - GtkPropertyMark *after, - const gchar *msg, - const gchar *where, - gint line); - -static void gtk_text_assert (GtkText *text, - const gchar *msg, - gint line); -static void gtk_text_show_cache_line (GtkText *text, GList *cache, - const char* what, const char* func, gint line); -static void gtk_text_show_cache (GtkText *text, const char* func, gint line); -static void gtk_text_show_adj (GtkText *text, - GtkAdjustment *adj, - const char* what, - const char* func, - gint line); -static void gtk_text_show_props (GtkText* test, - const char* func, - int line); - -#define TDEBUG(args) g_message args -#define TEXT_ASSERT(text) gtk_text_assert (text,__PRETTY_FUNCTION__,__LINE__) -#define TEXT_ASSERT_MARK(text,mark,msg) gtk_text_assert_mark (text,mark, \ - __PRETTY_FUNCTION__,msg,__LINE__) -#define TEXT_SHOW(text) gtk_text_show_cache (text, __PRETTY_FUNCTION__,__LINE__) -#define TEXT_SHOW_LINE(text,line,msg) gtk_text_show_cache_line (text,line,msg,\ - __PRETTY_FUNCTION__,__LINE__) -#define TEXT_SHOW_ADJ(text,adj,msg) gtk_text_show_adj (text,adj,msg, \ - __PRETTY_FUNCTION__,__LINE__) -#else -#define TDEBUG(args) -#define TEXT_ASSERT(text) -#define TEXT_ASSERT_MARK(text,mark,msg) -#define TEXT_SHOW(text) -#define TEXT_SHOW_LINE(text,line,msg) -#define TEXT_SHOW_ADJ(text,adj,msg) -#endif - -static GtkWidgetClass *parent_class = NULL; - -/**********************************************************************/ -/* Widget Crap */ -/**********************************************************************/ - -GtkType -gtk_text_get_type (void) -{ - static GtkType text_type = 0; - - if (!text_type) - { - static const GtkTypeInfo text_info = - { - "GtkText", - sizeof (GtkText), - sizeof (GtkTextClass), - (GtkClassInitFunc) gtk_text_class_init, - (GtkObjectInitFunc) gtk_text_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - const GInterfaceInfo editable_info = - { - (GInterfaceInitFunc) gtk_text_editable_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - I_("GtkText"); - text_type = gtk_type_unique (GTK_TYPE_OLD_EDITABLE, &text_info); - g_type_add_interface_static (text_type, - GTK_TYPE_EDITABLE, - &editable_info); - } - - return text_type; -} - -static void -gtk_text_class_init (GtkTextClass *class) -{ - GObjectClass *gobject_class; - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkOldEditableClass *old_editable_class; - - gobject_class = G_OBJECT_CLASS (class); - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - old_editable_class = (GtkOldEditableClass*) class; - parent_class = gtk_type_class (GTK_TYPE_OLD_EDITABLE); - - gobject_class->finalize = gtk_text_finalize; - gobject_class->set_property = gtk_text_set_property; - gobject_class->get_property = gtk_text_get_property; - - object_class->destroy = gtk_text_destroy; - - widget_class->realize = gtk_text_realize; - widget_class->unrealize = gtk_text_unrealize; - widget_class->style_set = gtk_text_style_set; - widget_class->state_changed = gtk_text_state_changed; - widget_class->size_request = gtk_text_size_request; - widget_class->size_allocate = gtk_text_size_allocate; - widget_class->expose_event = gtk_text_expose; - widget_class->button_press_event = gtk_text_button_press; - widget_class->button_release_event = gtk_text_button_release; - widget_class->motion_notify_event = gtk_text_motion_notify; - widget_class->key_press_event = gtk_text_key_press; - - old_editable_class->set_editable = gtk_text_real_set_editable; - - old_editable_class->move_cursor = gtk_text_move_cursor; - old_editable_class->move_word = gtk_text_move_word; - old_editable_class->move_page = gtk_text_move_page; - old_editable_class->move_to_row = gtk_text_move_to_row; - old_editable_class->move_to_column = gtk_text_move_to_column; - - old_editable_class->kill_char = gtk_text_kill_char; - old_editable_class->kill_word = gtk_text_kill_word; - old_editable_class->kill_line = gtk_text_kill_line; - - old_editable_class->update_text = gtk_text_update_text; - old_editable_class->get_chars = gtk_text_get_chars; - old_editable_class->set_selection = gtk_text_set_selection; - old_editable_class->set_position = gtk_text_set_position; - - class->set_scroll_adjustments = gtk_text_set_adjustments; - - g_object_class_install_property (gobject_class, - PROP_HADJUSTMENT, - g_param_spec_object ("hadjustment", - P_("Horizontal Adjustment"), - P_("Horizontal adjustment for the text widget"), - GTK_TYPE_ADJUSTMENT, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_VADJUSTMENT, - g_param_spec_object ("vadjustment", - P_("Vertical Adjustment"), - P_("Vertical adjustment for the text widget"), - GTK_TYPE_ADJUSTMENT, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_LINE_WRAP, - g_param_spec_boolean ("line-wrap", - P_("Line Wrap"), - P_("Whether lines are wrapped at widget edges"), - TRUE, - GTK_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_WORD_WRAP, - g_param_spec_boolean ("word-wrap", - P_("Word Wrap"), - P_("Whether words are wrapped at widget edges"), - FALSE, - GTK_PARAM_READWRITE)); - - widget_class->set_scroll_adjustments_signal = - gtk_signal_new (I_("set-scroll-adjustments"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTextClass, set_scroll_adjustments), - _gtk_marshal_VOID__OBJECT_OBJECT, - GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); -} - -static void -gtk_text_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GtkText *text; - - text = GTK_TEXT (object); - - switch (prop_id) - { - case PROP_HADJUSTMENT: - gtk_text_set_adjustments (text, - g_value_get_object (value), - text->vadj); - break; - case PROP_VADJUSTMENT: - gtk_text_set_adjustments (text, - text->hadj, - g_value_get_object (value)); - break; - case PROP_LINE_WRAP: - gtk_text_set_line_wrap (text, g_value_get_boolean (value)); - break; - case PROP_WORD_WRAP: - gtk_text_set_word_wrap (text, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_text_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GtkText *text; - - text = GTK_TEXT (object); - - switch (prop_id) - { - case PROP_HADJUSTMENT: - g_value_set_object (value, text->hadj); - break; - case PROP_VADJUSTMENT: - g_value_set_object (value, text->vadj); - break; - case PROP_LINE_WRAP: - g_value_set_boolean (value, text->line_wrap); - break; - case PROP_WORD_WRAP: - g_value_set_boolean (value, text->word_wrap); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gtk_text_editable_init (GtkEditableClass *iface) -{ - iface->insert_text = gtk_text_insert_text; - iface->delete_text = gtk_text_delete_text; -} - -static void -gtk_text_init (GtkText *text) -{ - gtk_widget_set_can_focus (GTK_WIDGET (text), TRUE); - - text->text_area = NULL; - text->hadj = NULL; - text->vadj = NULL; - text->gc = NULL; - text->bg_gc = NULL; - text->line_wrap_bitmap = NULL; - text->line_arrow_bitmap = NULL; - - text->use_wchar = FALSE; - text->text.ch = g_new (guchar, INITIAL_BUFFER_SIZE); - text->text_len = INITIAL_BUFFER_SIZE; - - text->scratch_buffer.ch = NULL; - text->scratch_buffer_len = 0; - - text->freeze_count = 0; - - text->default_tab_width = 4; - text->tab_stops = NULL; - - text->tab_stops = g_list_prepend (text->tab_stops, (void*)8); - text->tab_stops = g_list_prepend (text->tab_stops, (void*)8); - - text->line_start_cache = NULL; - text->first_cut_pixels = 0; - - text->line_wrap = TRUE; - text->word_wrap = FALSE; - - text->timer = 0; - text->button = 0; - - text->current_font = NULL; - - init_properties (text); - - GTK_OLD_EDITABLE (text)->editable = FALSE; - - gtk_text_set_adjustments (text, NULL, NULL); - gtk_editable_set_position (GTK_EDITABLE (text), 0); -} - -GtkWidget* -gtk_text_new (GtkAdjustment *hadj, - GtkAdjustment *vadj) -{ - GtkWidget *text; - - if (hadj) - g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadj), NULL); - if (vadj) - g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadj), NULL); - - text = g_object_new (GTK_TYPE_TEXT, - "hadjustment", hadj, - "vadjustment", vadj, - NULL); - - return text; -} - -void -gtk_text_set_word_wrap (GtkText *text, - gboolean word_wrap) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - - text->word_wrap = (word_wrap != FALSE); - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - { - recompute_geometry (text); - gtk_widget_queue_draw (GTK_WIDGET (text)); - } - - g_object_notify (G_OBJECT (text), "word-wrap"); -} - -void -gtk_text_set_line_wrap (GtkText *text, - gboolean line_wrap) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - - text->line_wrap = (line_wrap != FALSE); - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - { - recompute_geometry (text); - gtk_widget_queue_draw (GTK_WIDGET (text)); - } - - g_object_notify (G_OBJECT (text), "line-wrap"); -} - -void -gtk_text_set_editable (GtkText *text, - gboolean is_editable) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - - gtk_editable_set_editable (GTK_EDITABLE (text), is_editable); -} - -static void -gtk_text_real_set_editable (GtkOldEditable *old_editable, - gboolean is_editable) -{ - GtkText *text; - - g_return_if_fail (GTK_IS_TEXT (old_editable)); - - text = GTK_TEXT (old_editable); - - old_editable->editable = (is_editable != FALSE); - - if (is_editable) - draw_cursor (text, TRUE); - else - undraw_cursor (text, TRUE); -} - -void -gtk_text_set_adjustments (GtkText *text, - GtkAdjustment *hadj, - GtkAdjustment *vadj) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - if (hadj) - g_return_if_fail (GTK_IS_ADJUSTMENT (hadj)); - else - hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); - if (vadj) - g_return_if_fail (GTK_IS_ADJUSTMENT (vadj)); - else - vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); - - if (text->hadj && (text->hadj != hadj)) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (text->hadj), text); - g_object_unref (text->hadj); - } - - if (text->vadj && (text->vadj != vadj)) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (text->vadj), text); - g_object_unref (text->vadj); - } - - g_object_freeze_notify (G_OBJECT (text)); - if (text->hadj != hadj) - { - text->hadj = hadj; - g_object_ref_sink (text->hadj); - - gtk_signal_connect (GTK_OBJECT (text->hadj), "changed", - G_CALLBACK (gtk_text_adjustment), - text); - gtk_signal_connect (GTK_OBJECT (text->hadj), "value-changed", - G_CALLBACK (gtk_text_adjustment), - text); - gtk_signal_connect (GTK_OBJECT (text->hadj), "destroy", - G_CALLBACK (gtk_text_adjustment_destroyed), - text); - gtk_text_adjustment (hadj, text); - - g_object_notify (G_OBJECT (text), "hadjustment"); - } - - if (text->vadj != vadj) - { - text->vadj = vadj; - g_object_ref_sink (text->vadj); - - gtk_signal_connect (GTK_OBJECT (text->vadj), "changed", - G_CALLBACK (gtk_text_adjustment), - text); - gtk_signal_connect (GTK_OBJECT (text->vadj), "value-changed", - G_CALLBACK (gtk_text_adjustment), - text); - gtk_signal_connect (GTK_OBJECT (text->vadj), "destroy", - G_CALLBACK (gtk_text_adjustment_destroyed), - text); - gtk_text_adjustment (vadj, text); - - g_object_notify (G_OBJECT (text), "vadjustment"); - } - g_object_thaw_notify (G_OBJECT (text)); -} - -void -gtk_text_set_point (GtkText *text, - guint index) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - g_return_if_fail (index <= TEXT_LENGTH (text)); - - text->point = find_mark (text, index); -} - -guint -gtk_text_get_point (GtkText *text) -{ - g_return_val_if_fail (GTK_IS_TEXT (text), 0); - - return text->point.index; -} - -guint -gtk_text_get_length (GtkText *text) -{ - g_return_val_if_fail (GTK_IS_TEXT (text), 0); - - return TEXT_LENGTH (text); -} - -void -gtk_text_freeze (GtkText *text) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - - text->freeze_count++; -} - -void -gtk_text_thaw (GtkText *text) -{ - g_return_if_fail (GTK_IS_TEXT (text)); - - if (text->freeze_count) - if (!(--text->freeze_count) && gtk_widget_get_realized (GTK_WIDGET (text))) - { - recompute_geometry (text); - gtk_widget_queue_draw (GTK_WIDGET (text)); - } -} - -void -gtk_text_insert (GtkText *text, - GdkFont *font, - const GdkColor *fore, - const GdkColor *back, - const char *chars, - gint nchars) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (text); - gboolean frozen = FALSE; - - gint new_line_count = 1; - guint old_height = 0; - guint length; - guint i; - gint numwcs; - - g_return_if_fail (GTK_IS_TEXT (text)); - - if (nchars < 0) - length = strlen (chars); - else - length = nchars; - - if (length == 0) - return; - - if (!text->freeze_count && (length > FREEZE_LENGTH)) - { - gtk_text_freeze (text); - frozen = TRUE; - } - - if (!text->freeze_count && (text->line_start_cache != NULL)) - { - find_line_containing_point (text, text->point.index, TRUE); - old_height = total_line_height (text, text->current_line, 1); - } - - if ((TEXT_LENGTH (text) == 0) && (text->use_wchar == FALSE)) - { - GtkWidget *widget = GTK_WIDGET (text); - - gtk_widget_ensure_style (widget); - if ((widget->style) && - (gtk_style_get_font (widget->style)->type == GDK_FONT_FONTSET)) - { - text->use_wchar = TRUE; - g_free (text->text.ch); - text->text.wc = g_new (GdkWChar, INITIAL_BUFFER_SIZE); - text->text_len = INITIAL_BUFFER_SIZE; - g_free (text->scratch_buffer.ch); - text->scratch_buffer.wc = NULL; - text->scratch_buffer_len = 0; - } - } - - move_gap (text, text->point.index); - make_forward_space (text, length); - - if (text->use_wchar) - { - char *chars_nt = (char *)chars; - if (nchars > 0) - { - chars_nt = g_new (char, length+1); - memcpy (chars_nt, chars, length); - chars_nt[length] = 0; - } - numwcs = gdk_mbstowcs (text->text.wc + text->gap_position, chars_nt, - length); - if (chars_nt != chars) - g_free(chars_nt); - if (numwcs < 0) - numwcs = 0; - } - else - { - numwcs = length; - memcpy(text->text.ch + text->gap_position, chars, length); - } - - if (!text->freeze_count && (text->line_start_cache != NULL)) - { - if (text->use_wchar) - { - for (i=0; i<numwcs; i++) - if (text->text.wc[text->gap_position + i] == '\n') - new_line_count++; - } - else - { - for (i=0; i<numwcs; i++) - if (text->text.ch[text->gap_position + i] == '\n') - new_line_count++; - } - } - - if (numwcs > 0) - { - insert_text_property (text, font, fore, back, numwcs); - - text->gap_size -= numwcs; - text->gap_position += numwcs; - - if (text->point.index < text->first_line_start_index) - text->first_line_start_index += numwcs; - if (text->point.index < old_editable->selection_start_pos) - old_editable->selection_start_pos += numwcs; - if (text->point.index < old_editable->selection_end_pos) - old_editable->selection_end_pos += numwcs; - /* We'll reset the cursor later anyways if we aren't frozen */ - if (text->point.index < text->cursor_mark.index) - text->cursor_mark.index += numwcs; - - advance_mark_n (&text->point, numwcs); - - if (!text->freeze_count && (text->line_start_cache != NULL)) - insert_expose (text, old_height, numwcs, new_line_count); - } - - if (frozen) - gtk_text_thaw (text); -} - -gboolean -gtk_text_backward_delete (GtkText *text, - guint nchars) -{ - g_return_val_if_fail (GTK_IS_TEXT (text), FALSE); - - if (nchars > text->point.index || nchars <= 0) - return FALSE; - - gtk_text_set_point (text, text->point.index - nchars); - - return gtk_text_forward_delete (text, nchars); -} - -gboolean -gtk_text_forward_delete (GtkText *text, - guint nchars) -{ - guint old_lines = 0, old_height = 0; - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (text); - gboolean frozen = FALSE; - - g_return_val_if_fail (GTK_IS_TEXT (text), FALSE); - - if (text->point.index + nchars > TEXT_LENGTH (text) || nchars <= 0) - return FALSE; - - if (!text->freeze_count && nchars > FREEZE_LENGTH) - { - gtk_text_freeze (text); - frozen = TRUE; - } - - if (!text->freeze_count && text->line_start_cache != NULL) - { - /* We need to undraw the cursor here, since we may later - * delete the cursor's property - */ - undraw_cursor (text, FALSE); - find_line_containing_point (text, text->point.index, TRUE); - compute_lines_pixels (text, nchars, &old_lines, &old_height); - } - - /* FIXME, or resizing after deleting will be odd */ - if (text->point.index < text->first_line_start_index) - { - if (text->point.index + nchars >= text->first_line_start_index) - { - text->first_line_start_index = text->point.index; - while ((text->first_line_start_index > 0) && - (GTK_TEXT_INDEX (text, text->first_line_start_index - 1) - != LINE_DELIM)) - text->first_line_start_index -= 1; - - } - else - text->first_line_start_index -= nchars; - } - - if (text->point.index < old_editable->selection_start_pos) - old_editable->selection_start_pos -= - MIN(nchars, old_editable->selection_start_pos - text->point.index); - if (text->point.index < old_editable->selection_end_pos) - old_editable->selection_end_pos -= - MIN(nchars, old_editable->selection_end_pos - text->point.index); - /* We'll reset the cursor later anyways if we aren't frozen */ - if (text->point.index < text->cursor_mark.index) - move_mark_n (&text->cursor_mark, - -MIN(nchars, text->cursor_mark.index - text->point.index)); - - move_gap (text, text->point.index); - - text->gap_size += nchars; - - delete_text_property (text, nchars); - - if (!text->freeze_count && (text->line_start_cache != NULL)) - { - delete_expose (text, nchars, old_lines, old_height); - draw_cursor (text, FALSE); - } - - if (frozen) - gtk_text_thaw (text); - - return TRUE; -} - -static void -gtk_text_set_position (GtkOldEditable *old_editable, - gint position) -{ - GtkText *text = (GtkText *) old_editable; - - if (position < 0) - position = gtk_text_get_length (text); - - undraw_cursor (text, FALSE); - text->cursor_mark = find_mark (text, position); - find_cursor (text, TRUE); - draw_cursor (text, FALSE); - gtk_editable_select_region (GTK_EDITABLE (old_editable), 0, 0); -} - -static gchar * -gtk_text_get_chars (GtkOldEditable *old_editable, - gint start_pos, - gint end_pos) -{ - GtkText *text; - - gchar *retval; - - g_return_val_if_fail (GTK_IS_TEXT (old_editable), NULL); - text = GTK_TEXT (old_editable); - - if (end_pos < 0) - end_pos = TEXT_LENGTH (text); - - if ((start_pos < 0) || - (end_pos > TEXT_LENGTH (text)) || - (end_pos < start_pos)) - return NULL; - - move_gap (text, TEXT_LENGTH (text)); - make_forward_space (text, 1); - - if (text->use_wchar) - { - GdkWChar ch; - ch = text->text.wc[end_pos]; - text->text.wc[end_pos] = 0; - retval = gdk_wcstombs (text->text.wc + start_pos); - text->text.wc[end_pos] = ch; - } - else - { - guchar ch; - ch = text->text.ch[end_pos]; - text->text.ch[end_pos] = 0; - retval = g_strdup ((gchar *)(text->text.ch + start_pos)); - text->text.ch[end_pos] = ch; - } - - return retval; -} - - -static void -gtk_text_destroy (GtkObject *object) -{ - GtkText *text = GTK_TEXT (object); - - if (text->hadj) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (text->hadj), text); - g_object_unref (text->hadj); - text->hadj = NULL; - } - if (text->vadj) - { - gtk_signal_disconnect_by_data (GTK_OBJECT (text->vadj), text); - g_object_unref (text->vadj); - text->vadj = NULL; - } - - if (text->timer) - { - g_source_remove (text->timer); - text->timer = 0; - } - - GTK_OBJECT_CLASS(parent_class)->destroy (object); -} - -static void -gtk_text_finalize (GObject *object) -{ - GtkText *text = GTK_TEXT (object); - GList *tmp_list; - - /* Clean up the internal structures */ - if (text->use_wchar) - g_free (text->text.wc); - else - g_free (text->text.ch); - - tmp_list = text->text_properties; - while (tmp_list) - { - destroy_text_property (tmp_list->data); - tmp_list = tmp_list->next; - } - - if (text->current_font) - text_font_unref (text->current_font); - - g_list_free (text->text_properties); - - if (text->use_wchar) - { - g_free (text->scratch_buffer.wc); - } - else - { - g_free (text->scratch_buffer.ch); - } - - g_list_free (text->tab_stops); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gtk_text_realize (GtkWidget *widget) -{ - GtkText *text = GTK_TEXT (widget); - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (widget); - GdkWindowAttr attributes; - gint attributes_mask; - - gtk_widget_set_realized (widget, TRUE); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK | - GDK_KEY_PRESS_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, text); - - attributes.x = (widget->style->xthickness + TEXT_BORDER_ROOM); - attributes.y = (widget->style->ythickness + TEXT_BORDER_ROOM); - attributes.width = MAX (1, (gint)widget->allocation.width - (gint)attributes.x * 2); - attributes.height = MAX (1, (gint)widget->allocation.height - (gint)attributes.y * 2); - - attributes.cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_XTERM); - attributes_mask |= GDK_WA_CURSOR; - - text->text_area = gdk_window_new (widget->window, &attributes, attributes_mask); - gdk_window_set_user_data (text->text_area, text); - - gdk_cursor_unref (attributes.cursor); /* The X server will keep it around as long as necessary */ - - widget->style = gtk_style_attach (widget->style, widget->window); - - /* Can't call gtk_style_set_background here because it's handled specially */ - gdk_window_set_background (widget->window, &widget->style->base[gtk_widget_get_state (widget)]); - gdk_window_set_background (text->text_area, &widget->style->base[gtk_widget_get_state (widget)]); - - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) - text->bg_gc = create_bg_gc (text); - - text->line_wrap_bitmap = gdk_bitmap_create_from_data (text->text_area, - (gchar*) line_wrap_bits, - line_wrap_width, - line_wrap_height); - - text->line_arrow_bitmap = gdk_bitmap_create_from_data (text->text_area, - (gchar*) line_arrow_bits, - line_arrow_width, - line_arrow_height); - - text->gc = gdk_gc_new (text->text_area); - gdk_gc_set_exposures (text->gc, TRUE); - gdk_gc_set_foreground (text->gc, &widget->style->text[GTK_STATE_NORMAL]); - - realize_properties (text); - gdk_window_show (text->text_area); - init_properties (text); - - if (old_editable->selection_start_pos != old_editable->selection_end_pos) - gtk_old_editable_claim_selection (old_editable, TRUE, GDK_CURRENT_TIME); - - recompute_geometry (text); -} - -static void -gtk_text_style_set (GtkWidget *widget, - GtkStyle *previous_style) -{ - GtkText *text = GTK_TEXT (widget); - - if (gtk_widget_get_realized (widget)) - { - gdk_window_set_background (widget->window, &widget->style->base[gtk_widget_get_state (widget)]); - gdk_window_set_background (text->text_area, &widget->style->base[gtk_widget_get_state (widget)]); - - if (text->bg_gc) - { - g_object_unref (text->bg_gc); - text->bg_gc = NULL; - } - - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) - text->bg_gc = create_bg_gc (text); - - recompute_geometry (text); - } - - if (text->current_font) - text_font_unref (text->current_font); - text->current_font = get_text_font (gtk_style_get_font (widget->style)); -} - -static void -gtk_text_state_changed (GtkWidget *widget, - GtkStateType previous_state) -{ - GtkText *text = GTK_TEXT (widget); - - if (gtk_widget_get_realized (widget)) - { - gdk_window_set_background (widget->window, &widget->style->base[gtk_widget_get_state (widget)]); - gdk_window_set_background (text->text_area, &widget->style->base[gtk_widget_get_state (widget)]); - } -} - -static void -gtk_text_unrealize (GtkWidget *widget) -{ - GtkText *text = GTK_TEXT (widget); - - gdk_window_set_user_data (text->text_area, NULL); - gdk_window_destroy (text->text_area); - text->text_area = NULL; - - g_object_unref (text->gc); - text->gc = NULL; - - if (text->bg_gc) - { - g_object_unref (text->bg_gc); - text->bg_gc = NULL; - } - - g_object_unref (text->line_wrap_bitmap); - g_object_unref (text->line_arrow_bitmap); - - unrealize_properties (text); - - free_cache (text); - - GTK_WIDGET_CLASS (parent_class)->unrealize (widget); -} - -static void -clear_focus_area (GtkText *text, gint area_x, gint area_y, gint area_width, gint area_height) -{ - GtkWidget *widget = GTK_WIDGET (text); - GdkGC *gc; - - gint ythick = TEXT_BORDER_ROOM + widget->style->ythickness; - gint xthick = TEXT_BORDER_ROOM + widget->style->xthickness; - - gint width, height; - - if (area_width == 0 || area_height == 0) - return; - - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) - { - gdk_drawable_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height); - - gdk_gc_set_ts_origin (text->bg_gc, - (- text->first_onscreen_hor_pixel + xthick) % width, - (- text->first_onscreen_ver_pixel + ythick) % height); - - gc = text->bg_gc; - } - else - gc = widget->style->base_gc[widget->state]; - - gdk_draw_rectangle (GTK_WIDGET (text)->window, gc, TRUE, - area_x, area_y, area_width, area_height); -} - -static void -gtk_text_draw_focus (GtkWidget *widget) -{ - GtkText *text; - gint width, height; - gint x, y; - - g_return_if_fail (GTK_IS_TEXT (widget)); - - text = GTK_TEXT (widget); - - if (GTK_WIDGET_DRAWABLE (widget)) - { - gint ythick = widget->style->ythickness; - gint xthick = widget->style->xthickness; - gint xextra = TEXT_BORDER_ROOM; - gint yextra = TEXT_BORDER_ROOM; - - TDEBUG (("in gtk_text_draw_focus\n")); - - x = 0; - y = 0; - width = widget->allocation.width; - height = widget->allocation.height; - - if (gtk_widget_has_focus (widget)) - { - x += 1; - y += 1; - width -= 2; - height -= 2; - xextra -= 1; - yextra -= 1; - - gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget), - NULL, widget, "text", - 0, 0, - widget->allocation.width, - widget->allocation.height); - } - - gtk_paint_shadow (widget->style, widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_IN, - NULL, widget, "text", - x, y, width, height); - - x += xthick; - y += ythick; - width -= 2 * xthick; - height -= 2 * ythick; - - /* top rect */ - clear_focus_area (text, x, y, width, yextra); - /* left rect */ - clear_focus_area (text, x, y + yextra, - xextra, y + height - 2 * yextra); - /* right rect */ - clear_focus_area (text, x + width - xextra, y + yextra, - xextra, height - 2 * ythick); - /* bottom rect */ - clear_focus_area (text, x, x + height - yextra, width, yextra); - } - else - { - TDEBUG (("in gtk_text_draw_focus (undrawable !!!)\n")); - } -} - -static void -gtk_text_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GdkFont *font; - gint xthickness; - gint ythickness; - gint char_height; - gint char_width; - - xthickness = widget->style->xthickness + TEXT_BORDER_ROOM; - ythickness = widget->style->ythickness + TEXT_BORDER_ROOM; - - font = gtk_style_get_font (widget->style); - - char_height = MIN_TEXT_HEIGHT_LINES * (font->ascent + - font->descent); - - char_width = MIN_TEXT_WIDTH_LINES * (gdk_text_width (font, - "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - 26) - / 26); - - requisition->width = char_width + xthickness * 2; - requisition->height = char_height + ythickness * 2; -} - -static void -gtk_text_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkText *text = GTK_TEXT (widget); - - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) - { - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, allocation->height); - - gdk_window_move_resize (text->text_area, - widget->style->xthickness + TEXT_BORDER_ROOM, - widget->style->ythickness + TEXT_BORDER_ROOM, - MAX (1, (gint)widget->allocation.width - (gint)(widget->style->xthickness + - (gint)TEXT_BORDER_ROOM) * 2), - MAX (1, (gint)widget->allocation.height - (gint)(widget->style->ythickness + - (gint)TEXT_BORDER_ROOM) * 2)); - - recompute_geometry (text); - } -} - -static gint -gtk_text_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - if (event->window == GTK_TEXT (widget)->text_area) - { - TDEBUG (("in gtk_text_expose (expose)\n")); - expose_text (GTK_TEXT (widget), &event->area, TRUE); - } - else if (event->count == 0) - { - TDEBUG (("in gtk_text_expose (focus)\n")); - gtk_text_draw_focus (widget); - } - - return FALSE; -} - -static gint -gtk_text_scroll_timeout (gpointer data) -{ - GtkText *text; - gint x, y; - GdkModifierType mask; - - text = GTK_TEXT (data); - - text->timer = 0; - gdk_window_get_pointer (text->text_area, &x, &y, &mask); - - if (mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK)) - { - GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY); - - event->motion.is_hint = 0; - event->motion.x = x; - event->motion.y = y; - event->motion.state = mask; - - gtk_text_motion_notify (GTK_WIDGET (text), (GdkEventMotion *)event); - - gdk_event_free (event); - } - - return FALSE; -} - -static gint -gtk_text_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - GtkText *text = GTK_TEXT (widget); - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (widget); - - if (text->button && (event->button != text->button)) - return FALSE; - - text->button = event->button; - - if (!gtk_widget_has_focus (widget)) - gtk_widget_grab_focus (widget); - - if (event->button == 1) - { - switch (event->type) - { - case GDK_BUTTON_PRESS: - gtk_grab_add (widget); - - undraw_cursor (text, FALSE); - find_mouse_cursor (text, (gint)event->x, (gint)event->y); - draw_cursor (text, FALSE); - - /* Set it now, so we display things right. We'll unset it - * later if things don't work out */ - old_editable->has_selection = TRUE; - gtk_text_set_selection (GTK_OLD_EDITABLE (text), - text->cursor_mark.index, - text->cursor_mark.index); - - break; - - case GDK_2BUTTON_PRESS: - gtk_text_select_word (text, event->time); - break; - - case GDK_3BUTTON_PRESS: - gtk_text_select_line (text, event->time); - break; - - default: - break; - } - } - else if (event->type == GDK_BUTTON_PRESS) - { - if ((event->button == 2) && old_editable->editable) - { - if (old_editable->selection_start_pos == old_editable->selection_end_pos || - old_editable->has_selection) - { - undraw_cursor (text, FALSE); - find_mouse_cursor (text, (gint)event->x, (gint)event->y); - draw_cursor (text, FALSE); - - } - - gtk_selection_convert (widget, GDK_SELECTION_PRIMARY, - gdk_atom_intern_static_string ("UTF8_STRING"), - event->time); - } - else - { - GdkDisplay *display = gtk_widget_get_display (widget); - - gtk_grab_add (widget); - - undraw_cursor (text, FALSE); - find_mouse_cursor (text, event->x, event->y); - draw_cursor (text, FALSE); - - gtk_text_set_selection (GTK_OLD_EDITABLE (text), - text->cursor_mark.index, - text->cursor_mark.index); - - old_editable->has_selection = FALSE; - if (gdk_selection_owner_get_for_display (display, - GDK_SELECTION_PRIMARY) == widget->window) - gtk_selection_owner_set_for_display (display, - NULL, - GDK_SELECTION_PRIMARY, - event->time); - } - } - - return TRUE; -} - -static gint -gtk_text_button_release (GtkWidget *widget, - GdkEventButton *event) -{ - GtkText *text = GTK_TEXT (widget); - GtkOldEditable *old_editable; - GdkDisplay *display; - - gtk_grab_remove (widget); - - if (text->button != event->button) - return FALSE; - - text->button = 0; - - if (text->timer) - { - g_source_remove (text->timer); - text->timer = 0; - } - - if (event->button == 1) - { - text = GTK_TEXT (widget); - old_editable = GTK_OLD_EDITABLE (widget); - display = gtk_widget_get_display (widget); - - gtk_grab_remove (widget); - - old_editable->has_selection = FALSE; - if (old_editable->selection_start_pos != old_editable->selection_end_pos) - { - if (gtk_selection_owner_set_for_display (display, - widget, - GDK_SELECTION_PRIMARY, - event->time)) - old_editable->has_selection = TRUE; - else - gtk_text_update_text (old_editable, old_editable->selection_start_pos, - old_editable->selection_end_pos); - } - else - { - if (gdk_selection_owner_get_for_display (display, - GDK_SELECTION_PRIMARY) == widget->window) - gtk_selection_owner_set_for_display (display, - NULL, - GDK_SELECTION_PRIMARY, - event->time); - } - } - else if (event->button == 3) - { - gtk_grab_remove (widget); - } - - undraw_cursor (text, FALSE); - find_cursor (text, TRUE); - draw_cursor (text, FALSE); - - return TRUE; -} - -static gint -gtk_text_motion_notify (GtkWidget *widget, - GdkEventMotion *event) -{ - GtkText *text = GTK_TEXT (widget); - gint x, y; - gint height; - GdkModifierType mask; - - x = event->x; - y = event->y; - mask = event->state; - if (event->is_hint || (text->text_area != event->window)) - { - gdk_window_get_pointer (text->text_area, &x, &y, &mask); - } - - if ((text->button == 0) || - !(mask & (GDK_BUTTON1_MASK | GDK_BUTTON3_MASK))) - return FALSE; - - gdk_drawable_get_size (text->text_area, NULL, &height); - - if ((y < 0) || (y > height)) - { - if (text->timer == 0) - { - text->timer = gdk_threads_add_timeout (SCROLL_TIME, - gtk_text_scroll_timeout, - text); - - if (y < 0) - scroll_int (text, y/2); - else - scroll_int (text, (y - height)/2); - } - else - return FALSE; - } - - undraw_cursor (GTK_TEXT (widget), FALSE); - find_mouse_cursor (GTK_TEXT (widget), x, y); - draw_cursor (GTK_TEXT (widget), FALSE); - - gtk_text_set_selection (GTK_OLD_EDITABLE (text), - GTK_OLD_EDITABLE (text)->selection_start_pos, - text->cursor_mark.index); - - return FALSE; -} - -static void -gtk_text_insert_text (GtkEditable *editable, - const gchar *new_text, - gint new_text_length, - gint *position) -{ - GtkText *text = GTK_TEXT (editable); - GdkFont *font; - GdkColor *fore, *back; - - TextProperty *property; - - gtk_text_set_point (text, *position); - - property = MARK_CURRENT_PROPERTY (&text->point); - font = property->flags & PROPERTY_FONT ? property->font->gdk_font : NULL; - fore = property->flags & PROPERTY_FOREGROUND ? &property->fore_color : NULL; - back = property->flags & PROPERTY_BACKGROUND ? &property->back_color : NULL; - - gtk_text_insert (text, font, fore, back, new_text, new_text_length); - - *position = text->point.index; -} - -static void -gtk_text_delete_text (GtkEditable *editable, - gint start_pos, - gint end_pos) -{ - GtkText *text = GTK_TEXT (editable); - - g_return_if_fail (start_pos >= 0); - - gtk_text_set_point (text, start_pos); - if (end_pos < 0) - end_pos = TEXT_LENGTH (text); - - if (end_pos > start_pos) - gtk_text_forward_delete (text, end_pos - start_pos); -} - -static gint -gtk_text_key_press (GtkWidget *widget, - GdkEventKey *event) -{ - GtkText *text = GTK_TEXT (widget); - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (widget); - gchar key; - gint return_val; - gint position; - - key = event->keyval; - return_val = TRUE; - - if ((GTK_OLD_EDITABLE(text)->editable == FALSE)) - { - switch (event->keyval) - { - case GDK_Home: - case GDK_KP_Home: - if (event->state & GDK_CONTROL_MASK) - scroll_int (text, -text->vadj->value); - else - return_val = FALSE; - break; - case GDK_End: - case GDK_KP_End: - if (event->state & GDK_CONTROL_MASK) - scroll_int (text, +text->vadj->upper); - else - return_val = FALSE; - break; - case GDK_KP_Page_Up: - case GDK_Page_Up: scroll_int (text, -text->vadj->page_increment); break; - case GDK_KP_Page_Down: - case GDK_Page_Down: scroll_int (text, +text->vadj->page_increment); break; - case GDK_KP_Up: - case GDK_Up: scroll_int (text, -KEY_SCROLL_PIXELS); break; - case GDK_KP_Down: - case GDK_Down: scroll_int (text, +KEY_SCROLL_PIXELS); break; - case GDK_Return: - case GDK_ISO_Enter: - case GDK_KP_Enter: - if (event->state & GDK_CONTROL_MASK) - gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); - else - return_val = FALSE; - break; - default: - return_val = FALSE; - break; - } - } - else - { - gint extend_selection; - gint extend_start; - guint initial_pos = old_editable->current_pos; - - text->point = find_mark (text, text->cursor_mark.index); - - extend_selection = event->state & GDK_SHIFT_MASK; - extend_start = FALSE; - - if (extend_selection) - { - old_editable->has_selection = TRUE; - - if (old_editable->selection_start_pos == old_editable->selection_end_pos) - { - old_editable->selection_start_pos = text->point.index; - old_editable->selection_end_pos = text->point.index; - } - - extend_start = (text->point.index == old_editable->selection_start_pos); - } - - switch (event->keyval) - { - case GDK_KP_Home: - case GDK_Home: - if (event->state & GDK_CONTROL_MASK) - move_cursor_buffer_ver (text, -1); - else - gtk_text_move_beginning_of_line (text); - break; - case GDK_KP_End: - case GDK_End: - if (event->state & GDK_CONTROL_MASK) - move_cursor_buffer_ver (text, +1); - else - gtk_text_move_end_of_line (text); - break; - case GDK_KP_Page_Up: - case GDK_Page_Up: move_cursor_page_ver (text, -1); break; - case GDK_KP_Page_Down: - case GDK_Page_Down: move_cursor_page_ver (text, +1); break; - /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */ - case GDK_KP_Up: - case GDK_Up: move_cursor_ver (text, -1); break; - case GDK_KP_Down: - case GDK_Down: move_cursor_ver (text, +1); break; - case GDK_KP_Left: - case GDK_Left: - if (event->state & GDK_CONTROL_MASK) - gtk_text_move_backward_word (text); - else - move_cursor_hor (text, -1); - break; - case GDK_KP_Right: - case GDK_Right: - if (event->state & GDK_CONTROL_MASK) - gtk_text_move_forward_word (text); - else - move_cursor_hor (text, +1); - break; - - case GDK_BackSpace: - if (event->state & GDK_CONTROL_MASK) - gtk_text_delete_backward_word (text); - else - gtk_text_delete_backward_character (text); - break; - case GDK_Clear: - gtk_text_delete_line (text); - break; - case GDK_KP_Insert: - case GDK_Insert: - if (event->state & GDK_SHIFT_MASK) - { - extend_selection = FALSE; - gtk_editable_paste_clipboard (GTK_EDITABLE (old_editable)); - } - else if (event->state & GDK_CONTROL_MASK) - { - gtk_editable_copy_clipboard (GTK_EDITABLE (old_editable)); - } - else - { - /* gtk_toggle_insert(text) -- IMPLEMENT */ - } - break; - case GDK_Delete: - case GDK_KP_Delete: - if (event->state & GDK_CONTROL_MASK) - gtk_text_delete_forward_word (text); - else if (event->state & GDK_SHIFT_MASK) - { - extend_selection = FALSE; - gtk_editable_cut_clipboard (GTK_EDITABLE (old_editable)); - } - else - gtk_text_delete_forward_character (text); - break; - case GDK_Tab: - case GDK_ISO_Left_Tab: - case GDK_KP_Tab: - position = text->point.index; - gtk_editable_insert_text (GTK_EDITABLE (old_editable), "\t", 1, &position); - break; - case GDK_KP_Enter: - case GDK_ISO_Enter: - case GDK_Return: - if (event->state & GDK_CONTROL_MASK) - gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); - else - { - position = text->point.index; - gtk_editable_insert_text (GTK_EDITABLE (old_editable), "\n", 1, &position); - } - break; - case GDK_Escape: - /* Don't insert literally */ - return_val = FALSE; - break; - - default: - return_val = FALSE; - - if (event->state & GDK_CONTROL_MASK) - { - return_val = TRUE; - if ((key >= 'A') && (key <= 'Z')) - key -= 'A' - 'a'; - - switch (key) - { - case 'a': - gtk_text_move_beginning_of_line (text); - break; - case 'b': - gtk_text_move_backward_character (text); - break; - case 'c': - gtk_editable_copy_clipboard (GTK_EDITABLE (text)); - break; - case 'd': - gtk_text_delete_forward_character (text); - break; - case 'e': - gtk_text_move_end_of_line (text); - break; - case 'f': - gtk_text_move_forward_character (text); - break; - case 'h': - gtk_text_delete_backward_character (text); - break; - case 'k': - gtk_text_delete_to_line_end (text); - break; - case 'n': - gtk_text_move_next_line (text); - break; - case 'p': - gtk_text_move_previous_line (text); - break; - case 'u': - gtk_text_delete_line (text); - break; - case 'v': - gtk_editable_paste_clipboard (GTK_EDITABLE (text)); - break; - case 'w': - gtk_text_delete_backward_word (text); - break; - case 'x': - gtk_editable_cut_clipboard (GTK_EDITABLE (text)); - break; - default: - return_val = FALSE; - } - - break; - } - else if (event->state & GDK_MOD1_MASK) - { - return_val = TRUE; - if ((key >= 'A') && (key <= 'Z')) - key -= 'A' - 'a'; - - switch (key) - { - case 'b': - gtk_text_move_backward_word (text); - break; - case 'd': - gtk_text_delete_forward_word (text); - break; - case 'f': - gtk_text_move_forward_word (text); - break; - default: - return_val = FALSE; - } - - break; - } - else if (event->length > 0) - { - extend_selection = FALSE; - - gtk_editable_delete_selection (GTK_EDITABLE (old_editable)); - position = text->point.index; - gtk_editable_insert_text (GTK_EDITABLE (old_editable), event->string, event->length, &position); - - return_val = TRUE; - } - } - - if (return_val && (old_editable->current_pos != initial_pos)) - { - if (extend_selection) - { - if (old_editable->current_pos < old_editable->selection_start_pos) - gtk_text_set_selection (old_editable, old_editable->current_pos, - old_editable->selection_end_pos); - else if (old_editable->current_pos > old_editable->selection_end_pos) - gtk_text_set_selection (old_editable, old_editable->selection_start_pos, - old_editable->current_pos); - else - { - if (extend_start) - gtk_text_set_selection (old_editable, old_editable->current_pos, - old_editable->selection_end_pos); - else - gtk_text_set_selection (old_editable, old_editable->selection_start_pos, - old_editable->current_pos); - } - } - else - gtk_text_set_selection (old_editable, 0, 0); - - gtk_old_editable_claim_selection (old_editable, - old_editable->selection_start_pos != old_editable->selection_end_pos, - event->time); - } - } - - return return_val; -} - -static void -gtk_text_adjustment (GtkAdjustment *adjustment, - GtkText *text) -{ - g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - g_return_if_fail (GTK_IS_TEXT (text)); - - /* Just ignore it if we haven't been size-allocated and realized yet */ - if (text->line_start_cache == NULL) - return; - - if (adjustment == text->hadj) - { - g_warning ("horizontal scrolling not implemented"); - } - else - { - gint diff = ((gint)adjustment->value) - text->last_ver_value; - - if (diff != 0) - { - undraw_cursor (text, FALSE); - - if (diff > 0) - scroll_down (text, diff); - else /* if (diff < 0) */ - scroll_up (text, diff); - - draw_cursor (text, FALSE); - - text->last_ver_value = adjustment->value; - } - } -} - -static void -gtk_text_adjustment_destroyed (GtkAdjustment *adjustment, - GtkText *text) -{ - g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - g_return_if_fail (GTK_IS_TEXT (text)); - - if (adjustment == text->hadj) - gtk_text_set_adjustments (text, NULL, text->vadj); - if (adjustment == text->vadj) - gtk_text_set_adjustments (text, text->hadj, NULL); -} - - -static GtkPropertyMark -find_this_line_start_mark (GtkText* text, guint point_position, const GtkPropertyMark* near) -{ - GtkPropertyMark mark; - - mark = find_mark_near (text, point_position, near); - - while (mark.index > 0 && - GTK_TEXT_INDEX (text, mark.index - 1) != LINE_DELIM) - decrement_mark (&mark); - - return mark; -} - -static void -init_tab_cont (GtkText* text, PrevTabCont* tab_cont) -{ - tab_cont->pixel_offset = 0; - tab_cont->tab_start.tab_stops = text->tab_stops; - tab_cont->tab_start.to_next_tab = (gintptr) text->tab_stops->data; - - if (!tab_cont->tab_start.to_next_tab) - tab_cont->tab_start.to_next_tab = text->default_tab_width; -} - -static void -line_params_iterate (GtkText* text, - const GtkPropertyMark* mark0, - const PrevTabCont* tab_mark0, - gint8 alloc, - void* data, - LineIteratorFunction iter) - /* mark0 MUST be a real line start. if ALLOC, allocate line params - * from a mem chunk. DATA is passed to ITER_CALL, which is called - * for each line following MARK, iteration continues unless ITER_CALL - * returns TRUE. */ -{ - GtkPropertyMark mark = *mark0; - PrevTabCont tab_conts[2]; - LineParams *lp, lpbuf; - gint tab_cont_index = 0; - - if (tab_mark0) - tab_conts[0] = *tab_mark0; - else - init_tab_cont (text, tab_conts); - - for (;;) - { - if (alloc) - lp = g_slice_new (LineParams); - else - lp = &lpbuf; - - *lp = find_line_params (text, &mark, tab_conts + tab_cont_index, - tab_conts + (tab_cont_index + 1) % 2); - - if ((*iter) (text, lp, data)) - return; - - if (LAST_INDEX (text, lp->end)) - break; - - mark = lp->end; - advance_mark (&mark); - tab_cont_index = (tab_cont_index + 1) % 2; - } -} - -static gint -fetch_lines_iterator (GtkText* text, LineParams* lp, void* data) -{ - FetchLinesData *fldata = (FetchLinesData*) data; - - fldata->new_lines = g_list_prepend (fldata->new_lines, lp); - - switch (fldata->fl_type) - { - case FetchLinesCount: - if (!text->line_wrap || !lp->wraps) - fldata->data += 1; - - if (fldata->data >= fldata->data_max) - return TRUE; - - break; - case FetchLinesPixels: - - fldata->data += LINE_HEIGHT(*lp); - - if (fldata->data >= fldata->data_max) - return TRUE; - - break; - } - - return FALSE; -} - -static GList* -fetch_lines (GtkText* text, - const GtkPropertyMark* mark0, - const PrevTabCont* tab_cont0, - FLType fl_type, - gint data) -{ - FetchLinesData fl_data; - - fl_data.new_lines = NULL; - fl_data.data = 0; - fl_data.data_max = data; - fl_data.fl_type = fl_type; - - line_params_iterate (text, mark0, tab_cont0, TRUE, &fl_data, fetch_lines_iterator); - - return g_list_reverse (fl_data.new_lines); -} - -static void -fetch_lines_backward (GtkText* text) -{ - GList *new_line_start; - GtkPropertyMark mark; - - if (CACHE_DATA(text->line_start_cache).start.index == 0) - return; - - mark = find_this_line_start_mark (text, - CACHE_DATA(text->line_start_cache).start.index - 1, - &CACHE_DATA(text->line_start_cache).start); - - new_line_start = fetch_lines (text, &mark, NULL, FetchLinesCount, 1); - - while (new_line_start->next) - new_line_start = new_line_start->next; - - new_line_start->next = text->line_start_cache; - text->line_start_cache->prev = new_line_start; -} - -static void -fetch_lines_forward (GtkText* text, gint line_count) -{ - GtkPropertyMark mark; - GList* line = text->line_start_cache; - - while(line->next) - line = line->next; - - mark = CACHE_DATA(line).end; - - if (LAST_INDEX (text, mark)) - return; - - advance_mark(&mark); - - line->next = fetch_lines (text, &mark, &CACHE_DATA(line).tab_cont_next, FetchLinesCount, line_count); - - if (line->next) - line->next->prev = line; -} - -/* Compute the number of lines, and vertical pixels for n characters - * starting from the point - */ -static void -compute_lines_pixels (GtkText* text, guint char_count, - guint *lines, guint *pixels) -{ - GList *line = text->current_line; - gint chars_left = char_count; - - *lines = 0; - *pixels = 0; - - /* If chars_left == 0, that means we're joining two lines in a - * deletion, so add in the values for the next line as well - */ - for (; line && chars_left >= 0; line = line->next) - { - *pixels += LINE_HEIGHT(CACHE_DATA(line)); - - if (line == text->current_line) - chars_left -= CACHE_DATA(line).end.index - text->point.index + 1; - else - chars_left -= CACHE_DATA(line).end.index - CACHE_DATA(line).start.index + 1; - - if (!text->line_wrap || !CACHE_DATA(line).wraps) - *lines += 1; - else - if (chars_left < 0) - chars_left = 0; /* force another loop */ - - if (!line->next) - fetch_lines_forward (text, 1); - } -} - -static gint -total_line_height (GtkText* text, GList* line, gint line_count) -{ - gint height = 0; - - for (; line && line_count > 0; line = line->next) - { - height += LINE_HEIGHT(CACHE_DATA(line)); - - if (!text->line_wrap || !CACHE_DATA(line).wraps) - line_count -= 1; - - if (!line->next) - fetch_lines_forward (text, line_count); - } - - return height; -} - -static void -swap_lines (GtkText* text, GList* old, GList* new, guint old_line_count) -{ - if (old == text->line_start_cache) - { - GList* last; - - for (; old_line_count > 0; old_line_count -= 1) - { - while (text->line_start_cache && - text->line_wrap && - CACHE_DATA(text->line_start_cache).wraps) - remove_cache_line(text, text->line_start_cache); - - remove_cache_line(text, text->line_start_cache); - } - - last = g_list_last (new); - - last->next = text->line_start_cache; - - if (text->line_start_cache) - text->line_start_cache->prev = last; - - text->line_start_cache = new; - } - else - { - GList *last; - - g_assert (old->prev); - - last = old->prev; - - for (; old_line_count > 0; old_line_count -= 1) - { - while (old && text->line_wrap && CACHE_DATA(old).wraps) - old = remove_cache_line (text, old); - - old = remove_cache_line (text, old); - } - - last->next = new; - new->prev = last; - - last = g_list_last (new); - - last->next = old; - - if (old) - old->prev = last; - } -} - -static void -correct_cache_delete (GtkText* text, gint nchars, gint lines) -{ - GList* cache = text->current_line; - gint i; - - for (i = 0; cache && i < lines; i += 1, cache = cache->next) - /* nothing */; - - for (; cache; cache = cache->next) - { - GtkPropertyMark *start = &CACHE_DATA(cache).start; - GtkPropertyMark *end = &CACHE_DATA(cache).end; - - start->index -= nchars; - end->index -= nchars; - - if (LAST_INDEX (text, text->point) && - start->index == text->point.index) - *start = text->point; - else if (start->property == text->point.property) - start->offset = start->index - (text->point.index - text->point.offset); - - if (LAST_INDEX (text, text->point) && - end->index == text->point.index) - *end = text->point; - if (end->property == text->point.property) - end->offset = end->index - (text->point.index - text->point.offset); - - /*TEXT_ASSERT_MARK(text, start, "start");*/ - /*TEXT_ASSERT_MARK(text, end, "end");*/ - } -} - -static void -delete_expose (GtkText* text, guint nchars, guint old_lines, guint old_pixels) -{ - GtkWidget *widget = GTK_WIDGET (text); - - gint pixel_height; - guint new_pixels = 0; - GdkRectangle rect; - GList* new_line = NULL; - gint width, height; - - text->cursor_virtual_x = 0; - - correct_cache_delete (text, nchars, old_lines); - - pixel_height = pixel_height_of(text, text->current_line) - - LINE_HEIGHT(CACHE_DATA(text->current_line)); - - if (CACHE_DATA(text->current_line).start.index == text->point.index) - CACHE_DATA(text->current_line).start = text->point; - - new_line = fetch_lines (text, - &CACHE_DATA(text->current_line).start, - &CACHE_DATA(text->current_line).tab_cont, - FetchLinesCount, - 1); - - swap_lines (text, text->current_line, new_line, old_lines); - - text->current_line = new_line; - - new_pixels = total_line_height (text, new_line, 1); - - gdk_drawable_get_size (text->text_area, &width, &height); - - if (old_pixels != new_pixels) - { - if (!widget->style->bg_pixmap[GTK_STATE_NORMAL]) - { - gdk_draw_drawable (text->text_area, - text->gc, - text->text_area, - 0, - pixel_height + old_pixels, - 0, - pixel_height + new_pixels, - width, - height); - } - text->vadj->upper += new_pixels; - text->vadj->upper -= old_pixels; - adjust_adj (text, text->vadj); - } - - rect.x = 0; - rect.y = pixel_height; - rect.width = width; - rect.height = new_pixels; - - expose_text (text, &rect, FALSE); - gtk_text_draw_focus ( (GtkWidget *) text); - - text->cursor_mark = text->point; - - find_cursor (text, TRUE); - - if (old_pixels != new_pixels) - { - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) - { - rect.x = 0; - rect.y = pixel_height + new_pixels; - rect.width = width; - rect.height = height - rect.y; - - expose_text (text, &rect, FALSE); - } - else - process_exposes (text); - } - - TEXT_ASSERT (text); - TEXT_SHOW(text); -} - -/* note, the point has already been moved forward */ -static void -correct_cache_insert (GtkText* text, gint nchars) -{ - GList *cache; - GtkPropertyMark *start; - GtkPropertyMark *end; - gboolean was_split = FALSE; - - /* We need to distinguish whether the property was split in the - * insert or not, so we check if the point (which points after - * the insertion here), points to the same character as the - * point before. Ugh. - */ - if (nchars > 0) - { - GtkPropertyMark tmp_mark = text->point; - move_mark_n (&tmp_mark, -1); - - if (tmp_mark.property != text->point.property) - was_split = TRUE; - } - - /* If we inserted a property exactly at the beginning of the - * line, we have to correct here, or fetch_lines will - * fetch junk. - */ - start = &CACHE_DATA(text->current_line).start; - - /* Check if if we split exactly at the beginning of the line: - * (was_split won't be set if we are inserting at the end of the text, - * so we don't check) - */ - if (start->offset == MARK_CURRENT_PROPERTY (start)->length) - SET_PROPERTY_MARK (start, start->property->next, 0); - /* Check if we inserted a property at the beginning of the text: */ - else if (was_split && - (start->property == text->point.property) && - (start->index == text->point.index - nchars)) - SET_PROPERTY_MARK (start, start->property->prev, 0); - - /* Now correct the offsets, and check for start or end marks that - * are after the point, yet point to a property before the point's - * property. This indicates that they are meant to point to the - * second half of a property we split in insert_text_property(), so - * we fix them up that way. - */ - cache = text->current_line->next; - - for (; cache; cache = cache->next) - { - start = &CACHE_DATA(cache).start; - end = &CACHE_DATA(cache).end; - - if (LAST_INDEX (text, text->point) && - start->index == text->point.index) - *start = text->point; - else if (start->index >= text->point.index - nchars) - { - if (!was_split && start->property == text->point.property) - move_mark_n(start, nchars); - else - { - if (start->property->next && - (start->property->next->next == text->point.property)) - { - g_assert (start->offset >= MARK_CURRENT_PROPERTY (start)->length); - start->offset -= MARK_CURRENT_PROPERTY (start)->length; - start->property = text->point.property; - } - start->index += nchars; - } - } - - if (LAST_INDEX (text, text->point) && - end->index == text->point.index) - *end = text->point; - if (end->index >= text->point.index - nchars) - { - if (!was_split && end->property == text->point.property) - move_mark_n(end, nchars); - else - { - if (end->property->next && - (end->property->next->next == text->point.property)) - { - g_assert (end->offset >= MARK_CURRENT_PROPERTY (end)->length); - end->offset -= MARK_CURRENT_PROPERTY (end)->length; - end->property = text->point.property; - } - end->index += nchars; - } - } - - /*TEXT_ASSERT_MARK(text, start, "start");*/ - /*TEXT_ASSERT_MARK(text, end, "end");*/ - } -} - - -static void -insert_expose (GtkText* text, guint old_pixels, gint nchars, - guint new_line_count) -{ - GtkWidget *widget = GTK_WIDGET (text); - - gint pixel_height; - guint new_pixels = 0; - GdkRectangle rect; - GList* new_lines = NULL; - gint width, height; - - text->cursor_virtual_x = 0; - - undraw_cursor (text, FALSE); - - correct_cache_insert (text, nchars); - - TEXT_SHOW_ADJ (text, text->vadj, "vadj"); - - pixel_height = pixel_height_of(text, text->current_line) - - LINE_HEIGHT(CACHE_DATA(text->current_line)); - - new_lines = fetch_lines (text, - &CACHE_DATA(text->current_line).start, - &CACHE_DATA(text->current_line).tab_cont, - FetchLinesCount, - new_line_count); - - swap_lines (text, text->current_line, new_lines, 1); - - text->current_line = new_lines; - - new_pixels = total_line_height (text, new_lines, new_line_count); - - gdk_drawable_get_size (text->text_area, &width, &height); - - if (old_pixels != new_pixels) - { - if (!widget->style->bg_pixmap[GTK_STATE_NORMAL]) - { - gdk_draw_drawable (text->text_area, - text->gc, - text->text_area, - 0, - pixel_height + old_pixels, - 0, - pixel_height + new_pixels, - width, - height + (old_pixels - new_pixels) - pixel_height); - - } - text->vadj->upper += new_pixels; - text->vadj->upper -= old_pixels; - adjust_adj (text, text->vadj); - } - - rect.x = 0; - rect.y = pixel_height; - rect.width = width; - rect.height = new_pixels; - - expose_text (text, &rect, FALSE); - gtk_text_draw_focus ( (GtkWidget *) text); - - text->cursor_mark = text->point; - - find_cursor (text, TRUE); - - draw_cursor (text, FALSE); - - if (old_pixels != new_pixels) - { - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) - { - rect.x = 0; - rect.y = pixel_height + new_pixels; - rect.width = width; - rect.height = height - rect.y; - - expose_text (text, &rect, FALSE); - } - else - process_exposes (text); - } - - TEXT_SHOW_ADJ (text, text->vadj, "vadj"); - TEXT_ASSERT (text); - TEXT_SHOW(text); -} - -/* Text property functions */ - -static guint -font_hash (gconstpointer font) -{ - return gdk_font_id ((const GdkFont*) font); -} - -static GHashTable *font_cache_table = NULL; - -static GtkTextFont* -get_text_font (GdkFont* gfont) -{ - GtkTextFont* tf; - gint i; - - if (!font_cache_table) - font_cache_table = g_hash_table_new (font_hash, (GEqualFunc) gdk_font_equal); - - tf = g_hash_table_lookup (font_cache_table, gfont); - - if (tf) - { - tf->ref_count++; - return tf; - } - - tf = g_new (GtkTextFont, 1); - tf->ref_count = 1; - - tf->gdk_font = gfont; - gdk_font_ref (gfont); - - for(i = 0; i < 256; i += 1) - tf->char_widths[i] = gdk_char_width (gfont, (char)i); - - g_hash_table_insert (font_cache_table, gfont, tf); - - return tf; -} - -static void -text_font_unref (GtkTextFont *text_font) -{ - text_font->ref_count--; - if (text_font->ref_count == 0) - { - g_hash_table_remove (font_cache_table, text_font->gdk_font); - gdk_font_unref (text_font->gdk_font); - g_free (text_font); - } -} - -static gint -text_properties_equal (TextProperty* prop, GdkFont* font, const GdkColor *fore, const GdkColor *back) -{ - if (prop->flags & PROPERTY_FONT) - { - gboolean retval; - GtkTextFont *text_font; - - if (!font) - return FALSE; - - text_font = get_text_font (font); - - retval = (prop->font == text_font); - text_font_unref (text_font); - - if (!retval) - return FALSE; - } - else - if (font != NULL) - return FALSE; - - if (prop->flags & PROPERTY_FOREGROUND) - { - if (!fore || !gdk_color_equal (&prop->fore_color, fore)) - return FALSE; - } - else - if (fore != NULL) - return FALSE; - - if (prop->flags & PROPERTY_BACKGROUND) - { - if (!back || !gdk_color_equal (&prop->back_color, back)) - return FALSE; - } - else - if (back != NULL) - return FALSE; - - return TRUE; -} - -static void -realize_property (GtkText *text, TextProperty *prop) -{ - GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (text)); - - if (prop->flags & PROPERTY_FOREGROUND) - gdk_colormap_alloc_color (colormap, &prop->fore_color, FALSE, FALSE); - - if (prop->flags & PROPERTY_BACKGROUND) - gdk_colormap_alloc_color (colormap, &prop->back_color, FALSE, FALSE); -} - -static void -realize_properties (GtkText *text) -{ - GList *tmp_list = text->text_properties; - - while (tmp_list) - { - realize_property (text, tmp_list->data); - - tmp_list = tmp_list->next; - } -} - -static void -unrealize_property (GtkText *text, TextProperty *prop) -{ - GdkColormap *colormap = gtk_widget_get_colormap (GTK_WIDGET (text)); - - if (prop->flags & PROPERTY_FOREGROUND) - gdk_colormap_free_colors (colormap, &prop->fore_color, 1); - - if (prop->flags & PROPERTY_BACKGROUND) - gdk_colormap_free_colors (colormap, &prop->back_color, 1); -} - -static void -unrealize_properties (GtkText *text) -{ - GList *tmp_list = text->text_properties; - - while (tmp_list) - { - unrealize_property (text, tmp_list->data); - - tmp_list = tmp_list->next; - } -} - -static TextProperty* -new_text_property (GtkText *text, GdkFont *font, const GdkColor* fore, - const GdkColor* back, guint length) -{ - TextProperty *prop; - - prop = g_slice_new (TextProperty); - - prop->flags = 0; - if (font) - { - prop->flags |= PROPERTY_FONT; - prop->font = get_text_font (font); - } - else - prop->font = NULL; - - if (fore) - { - prop->flags |= PROPERTY_FOREGROUND; - prop->fore_color = *fore; - } - - if (back) - { - prop->flags |= PROPERTY_BACKGROUND; - prop->back_color = *back; - } - - prop->length = length; - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - realize_property (text, prop); - - return prop; -} - -static void -destroy_text_property (TextProperty *prop) -{ - if (prop->font) - text_font_unref (prop->font); - - g_slice_free (TextProperty, prop); -} - -/* Flop the memory between the point and the gap around like a - * dead fish. */ -static void -move_gap (GtkText* text, guint index) -{ - if (text->gap_position < index) - { - gint diff = index - text->gap_position; - - if (text->use_wchar) - g_memmove (text->text.wc + text->gap_position, - text->text.wc + text->gap_position + text->gap_size, - diff*sizeof (GdkWChar)); - else - g_memmove (text->text.ch + text->gap_position, - text->text.ch + text->gap_position + text->gap_size, - diff); - - text->gap_position = index; - } - else if (text->gap_position > index) - { - gint diff = text->gap_position - index; - - if (text->use_wchar) - g_memmove (text->text.wc + index + text->gap_size, - text->text.wc + index, - diff*sizeof (GdkWChar)); - else - g_memmove (text->text.ch + index + text->gap_size, - text->text.ch + index, - diff); - - text->gap_position = index; - } -} - -/* Increase the gap size. */ -static void -make_forward_space (GtkText* text, guint len) -{ - if (text->gap_size < len) - { - guint sum = MAX(2*len, MIN_GAP_SIZE) + text->text_end; - - if (sum >= text->text_len) - { - guint i = 1; - - while (i <= sum) i <<= 1; - - if (text->use_wchar) - text->text.wc = (GdkWChar *)g_realloc(text->text.wc, - i*sizeof(GdkWChar)); - else - text->text.ch = (guchar *)g_realloc(text->text.ch, i); - text->text_len = i; - } - - if (text->use_wchar) - g_memmove (text->text.wc + text->gap_position + text->gap_size + 2*len, - text->text.wc + text->gap_position + text->gap_size, - (text->text_end - (text->gap_position + text->gap_size)) - *sizeof(GdkWChar)); - else - g_memmove (text->text.ch + text->gap_position + text->gap_size + 2*len, - text->text.ch + text->gap_position + text->gap_size, - text->text_end - (text->gap_position + text->gap_size)); - - text->text_end += len*2; - text->gap_size += len*2; - } -} - -/* Inserts into the text property list a list element that guarantees - * that for len characters following the point, text has the correct - * property. does not move point. adjusts text_properties_point and - * text_properties_point_offset relative to the current value of - * point. */ -static void -insert_text_property (GtkText* text, GdkFont* font, - const GdkColor *fore, const GdkColor* back, guint len) -{ - GtkPropertyMark *mark = &text->point; - TextProperty* forward_prop = MARK_CURRENT_PROPERTY(mark); - TextProperty* backward_prop = MARK_PREV_PROPERTY(mark); - - if (MARK_OFFSET(mark) == 0) - { - /* Point is on the boundary of two properties. - * If it is the same as either, grow, else insert - * a new one. */ - - if (text_properties_equal(forward_prop, font, fore, back)) - { - /* Grow the property in front of us. */ - - MARK_PROPERTY_LENGTH(mark) += len; - } - else if (backward_prop && - text_properties_equal(backward_prop, font, fore, back)) - { - /* Grow property behind us, point property and offset - * change. */ - - SET_PROPERTY_MARK (&text->point, - MARK_PREV_LIST_PTR (mark), - backward_prop->length); - - backward_prop->length += len; - } - else if ((MARK_NEXT_LIST_PTR(mark) == NULL) && - (forward_prop->length == 1)) - { - /* Next property just has last position, take it over */ - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - unrealize_property (text, forward_prop); - - forward_prop->flags = 0; - if (font) - { - forward_prop->flags |= PROPERTY_FONT; - forward_prop->font = get_text_font (font); - } - else - forward_prop->font = NULL; - - if (fore) - { - forward_prop->flags |= PROPERTY_FOREGROUND; - forward_prop->fore_color = *fore; - } - if (back) - { - forward_prop->flags |= PROPERTY_BACKGROUND; - forward_prop->back_color = *back; - } - forward_prop->length += len; - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - realize_property (text, forward_prop); - } - else - { - /* Splice a new property into the list. */ - - GList* new_prop = g_list_alloc(); - - new_prop->next = MARK_LIST_PTR(mark); - new_prop->prev = MARK_PREV_LIST_PTR(mark); - new_prop->next->prev = new_prop; - - if (new_prop->prev) - new_prop->prev->next = new_prop; - - new_prop->data = new_text_property (text, font, fore, back, len); - - SET_PROPERTY_MARK (mark, new_prop, 0); - } - } - else - { - /* The following will screw up the line_start cache, - * we'll fix it up in correct_cache_insert - */ - - /* In the middle of forward_prop, if properties are equal, - * just add to its length, else split it into two and splice - * in a new one. */ - if (text_properties_equal (forward_prop, font, fore, back)) - { - forward_prop->length += len; - } - else if ((MARK_NEXT_LIST_PTR(mark) == NULL) && - (MARK_OFFSET(mark) + 1 == forward_prop->length)) - { - /* Inserting before only the last position in the text */ - - GList* new_prop; - forward_prop->length -= 1; - - new_prop = g_list_alloc(); - new_prop->data = new_text_property (text, font, fore, back, len+1); - new_prop->prev = MARK_LIST_PTR(mark); - new_prop->next = NULL; - MARK_NEXT_LIST_PTR(mark) = new_prop; - - SET_PROPERTY_MARK (mark, new_prop, 0); - } - else - { - GList* new_prop = g_list_alloc(); - GList* new_prop_forward = g_list_alloc(); - gint old_length = forward_prop->length; - GList* next = MARK_NEXT_LIST_PTR(mark); - - /* Set the new lengths according to where they are split. Construct - * two new properties. */ - forward_prop->length = MARK_OFFSET(mark); - - new_prop_forward->data = - new_text_property(text, - forward_prop->flags & PROPERTY_FONT ? - forward_prop->font->gdk_font : NULL, - forward_prop->flags & PROPERTY_FOREGROUND ? - &forward_prop->fore_color : NULL, - forward_prop->flags & PROPERTY_BACKGROUND ? - &forward_prop->back_color : NULL, - old_length - forward_prop->length); - - new_prop->data = new_text_property(text, font, fore, back, len); - - /* Now splice things in. */ - MARK_NEXT_LIST_PTR(mark) = new_prop; - new_prop->prev = MARK_LIST_PTR(mark); - - new_prop->next = new_prop_forward; - new_prop_forward->prev = new_prop; - - new_prop_forward->next = next; - - if (next) - next->prev = new_prop_forward; - - SET_PROPERTY_MARK (mark, new_prop, 0); - } - } - - while (text->text_properties_end->next) - text->text_properties_end = text->text_properties_end->next; - - while (text->text_properties->prev) - text->text_properties = text->text_properties->prev; -} - -static void -delete_text_property (GtkText* text, guint nchars) -{ - /* Delete nchars forward from point. */ - - /* Deleting text properties is problematical, because we - * might be storing around marks pointing to a property. - * - * The marks in question and how we handle them are: - * - * point: We know the new value, since it will be at the - * end of the deleted text, and we move it there - * first. - * cursor: We just remove the mark and set it equal to the - * point after the operation. - * line-start cache: We replace most affected lines. - * The current line gets used to fetch the new - * lines so, if necessary, (delete at the beginning - * of a line) we fix it up by setting it equal to the - * point. - */ - - TextProperty *prop; - GList *tmp; - gint is_first; - - for(; nchars; nchars -= 1) - { - prop = MARK_CURRENT_PROPERTY(&text->point); - - prop->length -= 1; - - if (prop->length == 0) - { - tmp = MARK_LIST_PTR (&text->point); - - is_first = tmp == text->text_properties; - - MARK_LIST_PTR (&text->point) = g_list_remove_link (tmp, tmp); - text->point.offset = 0; - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - unrealize_property (text, prop); - - destroy_text_property (prop); - g_list_free_1 (tmp); - - prop = MARK_CURRENT_PROPERTY (&text->point); - - if (is_first) - text->text_properties = MARK_LIST_PTR (&text->point); - - g_assert (prop->length != 0); - } - else if (prop->length == text->point.offset) - { - MARK_LIST_PTR (&text->point) = MARK_NEXT_LIST_PTR (&text->point); - text->point.offset = 0; - } - } - - /* Check to see if we have just the single final position remaining - * along in a property; if so, combine it with the previous property - */ - if (LAST_INDEX (text, text->point) && - (MARK_OFFSET (&text->point) == 0) && - (MARK_PREV_LIST_PTR(&text->point) != NULL)) - { - tmp = MARK_LIST_PTR (&text->point); - prop = MARK_CURRENT_PROPERTY(&text->point); - - MARK_LIST_PTR (&text->point) = MARK_PREV_LIST_PTR (&text->point); - MARK_CURRENT_PROPERTY(&text->point)->length += 1; - MARK_NEXT_LIST_PTR(&text->point) = NULL; - - text->point.offset = MARK_CURRENT_PROPERTY(&text->point)->length - 1; - - if (gtk_widget_get_realized (GTK_WIDGET (text))) - unrealize_property (text, prop); - - destroy_text_property (prop); - g_list_free_1 (tmp); - } -} - -static void -init_properties (GtkText *text) -{ - if (!text->text_properties) - { - text->text_properties = g_list_alloc(); - text->text_properties->next = NULL; - text->text_properties->prev = NULL; - text->text_properties->data = new_text_property (text, NULL, NULL, NULL, 1); - text->text_properties_end = text->text_properties; - - SET_PROPERTY_MARK (&text->point, text->text_properties, 0); - - text->point.index = 0; - } -} - - -/**********************************************************************/ -/* Property Movement */ -/**********************************************************************/ - -static void -move_mark_n (GtkPropertyMark* mark, gint n) -{ - if (n > 0) - advance_mark_n(mark, n); - else if (n < 0) - decrement_mark_n(mark, -n); -} - -static void -advance_mark (GtkPropertyMark* mark) -{ - TextProperty* prop = MARK_CURRENT_PROPERTY (mark); - - mark->index += 1; - - if (prop->length > mark->offset + 1) - mark->offset += 1; - else - { - mark->property = MARK_NEXT_LIST_PTR (mark); - mark->offset = 0; - } -} - -static void -advance_mark_n (GtkPropertyMark* mark, gint n) -{ - gint i; - TextProperty* prop; - - g_assert (n > 0); - - i = 0; /* otherwise it migth not be init. */ - prop = MARK_CURRENT_PROPERTY(mark); - - if ((prop->length - mark->offset - 1) < n) { /* if we need to change prop. */ - /* to make it easier */ - n += (mark->offset); - mark->index -= mark->offset; - mark->offset = 0; - /* first we take seven-mile-leaps to get to the right text - * property. */ - while ((n-i) > prop->length - 1) { - i += prop->length; - mark->index += prop->length; - mark->property = MARK_NEXT_LIST_PTR (mark); - prop = MARK_CURRENT_PROPERTY (mark); - } - } - - /* and then the rest */ - mark->index += n - i; - mark->offset += n - i; -} - -static void -decrement_mark (GtkPropertyMark* mark) -{ - mark->index -= 1; - - if (mark->offset > 0) - mark->offset -= 1; - else - { - mark->property = MARK_PREV_LIST_PTR (mark); - mark->offset = MARK_CURRENT_PROPERTY (mark)->length - 1; - } -} - -static void -decrement_mark_n (GtkPropertyMark* mark, gint n) -{ - g_assert (n > 0); - - while (mark->offset < n) { - /* jump to end of prev */ - n -= mark->offset + 1; - mark->index -= mark->offset + 1; - mark->property = MARK_PREV_LIST_PTR (mark); - mark->offset = MARK_CURRENT_PROPERTY (mark)->length - 1; - } - - /* and the rest */ - mark->index -= n; - mark->offset -= n; -} - -static GtkPropertyMark -find_mark (GtkText* text, guint mark_position) -{ - return find_mark_near (text, mark_position, &text->point); -} - -/* - * You can also start from the end, what a drag. - */ -static GtkPropertyMark -find_mark_near (GtkText* text, guint mark_position, const GtkPropertyMark* near) -{ - gint diffa; - gint diffb; - - GtkPropertyMark mark; - - if (!near) - diffa = mark_position + 1; - else - diffa = mark_position - near->index; - - diffb = mark_position; - - if (diffa < 0) - diffa = -diffa; - - if (diffa <= diffb) - { - mark = *near; - } - else - { - mark.index = 0; - mark.property = text->text_properties; - mark.offset = 0; - } - - move_mark_n (&mark, mark_position - mark.index); - - return mark; -} - -/* This routine must be called with scroll == FALSE, only when - * point is at least partially on screen - */ - -static void -find_line_containing_point (GtkText* text, guint point, - gboolean scroll) -{ - GList* cache; - gint height; - - text->current_line = NULL; - - TEXT_SHOW (text); - - /* Scroll backwards until the point is on screen - */ - while (CACHE_DATA(text->line_start_cache).start.index > point) - scroll_int (text, - LINE_HEIGHT(CACHE_DATA(text->line_start_cache))); - - /* Now additionally try to make sure that the point is fully on screen - */ - if (scroll) - { - while (text->first_cut_pixels != 0 && - text->line_start_cache->next && - CACHE_DATA(text->line_start_cache->next).start.index > point) - scroll_int (text, - LINE_HEIGHT(CACHE_DATA(text->line_start_cache->next))); - } - - gdk_drawable_get_size (text->text_area, NULL, &height); - - for (cache = text->line_start_cache; cache; cache = cache->next) - { - guint lph; - - if (CACHE_DATA(cache).end.index >= point || - LAST_INDEX(text, CACHE_DATA(cache).end)) - { - text->current_line = cache; /* LOOK HERE, this proc has an - * important side effect. */ - return; - } - - TEXT_SHOW_LINE (text, cache, "cache"); - - if (cache->next == NULL) - fetch_lines_forward (text, 1); - - if (scroll) - { - lph = pixel_height_of (text, cache->next); - - /* Scroll the bottom of the line is on screen, or until - * the line is the first onscreen line. - */ - while (cache->next != text->line_start_cache && lph > height) - { - TEXT_SHOW_LINE (text, cache, "cache"); - TEXT_SHOW_LINE (text, cache->next, "cache->next"); - scroll_int (text, LINE_HEIGHT(CACHE_DATA(cache->next))); - lph = pixel_height_of (text, cache->next); - } - } - } - - g_assert_not_reached (); /* Must set text->current_line here */ -} - -static guint -pixel_height_of (GtkText* text, GList* cache_line) -{ - gint pixels = - text->first_cut_pixels; - GList *cache = text->line_start_cache; - - while (TRUE) { - pixels += LINE_HEIGHT (CACHE_DATA(cache)); - - if (cache->data == cache_line->data) - break; - - cache = cache->next; - } - - return pixels; -} - -/**********************************************************************/ -/* Search and Placement */ -/**********************************************************************/ - -static gint -find_char_width (GtkText* text, const GtkPropertyMark *mark, const TabStopMark *tab_mark) -{ - GdkWChar ch; - gint16* char_widths; - - if (LAST_INDEX (text, *mark)) - return 0; - - ch = GTK_TEXT_INDEX (text, mark->index); - char_widths = MARK_CURRENT_TEXT_FONT (text, mark)->char_widths; - - if (ch == '\t') - { - return tab_mark->to_next_tab * char_widths[' ']; - } - else if (ch < 256) - { - return char_widths[ch]; - } - else - { - return gdk_char_width_wc(MARK_CURRENT_TEXT_FONT(text, mark)->gdk_font, ch); - } -} - -static void -advance_tab_mark (GtkText* text, TabStopMark* tab_mark, GdkWChar ch) -{ - if (tab_mark->to_next_tab == 1 || ch == '\t') - { - if (tab_mark->tab_stops->next) - { - tab_mark->tab_stops = tab_mark->tab_stops->next; - tab_mark->to_next_tab = (gintptr) tab_mark->tab_stops->data; - } - else - { - tab_mark->to_next_tab = text->default_tab_width; - } - } - else - { - tab_mark->to_next_tab -= 1; - } -} - -static void -advance_tab_mark_n (GtkText* text, TabStopMark* tab_mark, gint n) - /* No tabs! */ -{ - while (n--) - advance_tab_mark (text, tab_mark, 0); -} - -static void -find_cursor_at_line (GtkText* text, const LineParams* start_line, gint pixel_height) -{ - GdkWChar ch; - - GtkPropertyMark mark = start_line->start; - TabStopMark tab_mark = start_line->tab_cont.tab_start; - gint pixel_width = LINE_START_PIXEL (*start_line); - - while (mark.index < text->cursor_mark.index) - { - pixel_width += find_char_width (text, &mark, &tab_mark); - - advance_tab_mark (text, &tab_mark, GTK_TEXT_INDEX(text, mark.index)); - advance_mark (&mark); - } - - text->cursor_pos_x = pixel_width; - text->cursor_pos_y = pixel_height; - text->cursor_char_offset = start_line->font_descent; - text->cursor_mark = mark; - - ch = LAST_INDEX (text, mark) ? - LINE_DELIM : GTK_TEXT_INDEX (text, mark.index); - - if ((text->use_wchar) ? gdk_iswspace (ch) : isspace (ch)) - text->cursor_char = 0; - else - text->cursor_char = ch; -} - -static void -find_cursor (GtkText* text, gboolean scroll) -{ - if (gtk_widget_get_realized (GTK_WIDGET (text))) - { - find_line_containing_point (text, text->cursor_mark.index, scroll); - - if (text->current_line) - find_cursor_at_line (text, - &CACHE_DATA(text->current_line), - pixel_height_of(text, text->current_line)); - } - - GTK_OLD_EDITABLE (text)->current_pos = text->cursor_mark.index; -} - -static void -find_mouse_cursor_at_line (GtkText *text, const LineParams* lp, - guint line_pixel_height, - gint button_x) -{ - GtkPropertyMark mark = lp->start; - TabStopMark tab_mark = lp->tab_cont.tab_start; - - gint char_width = find_char_width(text, &mark, &tab_mark); - gint pixel_width = LINE_START_PIXEL (*lp) + (char_width+1)/2; - - text->cursor_pos_y = line_pixel_height; - - for (;;) - { - GdkWChar ch = LAST_INDEX (text, mark) ? - LINE_DELIM : GTK_TEXT_INDEX (text, mark.index); - - if (button_x < pixel_width || mark.index == lp->end.index) - { - text->cursor_pos_x = pixel_width - (char_width+1)/2; - text->cursor_mark = mark; - text->cursor_char_offset = lp->font_descent; - - if ((text->use_wchar) ? gdk_iswspace (ch) : isspace (ch)) - text->cursor_char = 0; - else - text->cursor_char = ch; - - break; - } - - advance_tab_mark (text, &tab_mark, ch); - advance_mark (&mark); - - pixel_width += char_width/2; - - char_width = find_char_width (text, &mark, &tab_mark); - - pixel_width += (char_width+1)/2; - } -} - -static void -find_mouse_cursor (GtkText* text, gint x, gint y) -{ - gint pixel_height; - GList* cache = text->line_start_cache; - - g_assert (cache); - - pixel_height = - text->first_cut_pixels; - - for (; cache; cache = cache->next) - { - pixel_height += LINE_HEIGHT(CACHE_DATA(cache)); - - if (y < pixel_height || !cache->next) - { - find_mouse_cursor_at_line (text, &CACHE_DATA(cache), pixel_height, x); - - find_cursor (text, FALSE); - - return; - } - } -} - -/**********************************************************************/ -/* Cache Manager */ -/**********************************************************************/ - -static void -free_cache (GtkText* text) -{ - GList* cache = text->line_start_cache; - - if (cache) - { - while (cache->prev) - cache = cache->prev; - - text->line_start_cache = cache; - } - - for (; cache; cache = cache->next) - g_slice_free (LineParams, cache->data); - - g_list_free (text->line_start_cache); - - text->line_start_cache = NULL; -} - -static GList* -remove_cache_line (GtkText* text, GList* member) -{ - GList *list; - - if (member == NULL) - return NULL; - - if (member == text->line_start_cache) - text->line_start_cache = text->line_start_cache->next; - - if (member->prev) - member->prev->next = member->next; - - if (member->next) - member->next->prev = member->prev; - - list = member->next; - - g_slice_free (LineParams, member->data); - g_list_free_1 (member); - - return list; -} - -/**********************************************************************/ -/* Key Motion */ -/**********************************************************************/ - -static void -move_cursor_buffer_ver (GtkText *text, int dir) -{ - undraw_cursor (text, FALSE); - - if (dir > 0) - { - scroll_int (text, text->vadj->upper); - text->cursor_mark = find_this_line_start_mark (text, - TEXT_LENGTH (text), - &text->cursor_mark); - } - else - { - scroll_int (text, - text->vadj->value); - text->cursor_mark = find_this_line_start_mark (text, - 0, - &text->cursor_mark); - } - - find_cursor (text, TRUE); - draw_cursor (text, FALSE); -} - -static void -move_cursor_page_ver (GtkText *text, int dir) -{ - scroll_int (text, dir * text->vadj->page_increment); -} - -static void -move_cursor_ver (GtkText *text, int count) -{ - gint i; - GtkPropertyMark mark; - gint offset; - - mark = find_this_line_start_mark (text, text->cursor_mark.index, &text->cursor_mark); - offset = text->cursor_mark.index - mark.index; - - if (offset > text->cursor_virtual_x) - text->cursor_virtual_x = offset; - - if (count < 0) - { - if (mark.index == 0) - return; - - decrement_mark (&mark); - mark = find_this_line_start_mark (text, mark.index, &mark); - } - else - { - mark = text->cursor_mark; - - while (!LAST_INDEX(text, mark) && GTK_TEXT_INDEX(text, mark.index) != LINE_DELIM) - advance_mark (&mark); - - if (LAST_INDEX(text, mark)) - return; - - advance_mark (&mark); - } - - for (i=0; i < text->cursor_virtual_x; i += 1, advance_mark(&mark)) - if (LAST_INDEX(text, mark) || - GTK_TEXT_INDEX(text, mark.index) == LINE_DELIM) - break; - - undraw_cursor (text, FALSE); - - text->cursor_mark = mark; - - find_cursor (text, TRUE); - - draw_cursor (text, FALSE); -} - -static void -move_cursor_hor (GtkText *text, int count) -{ - /* count should be +-1. */ - if ( (count > 0 && text->cursor_mark.index + count > TEXT_LENGTH(text)) || - (count < 0 && text->cursor_mark.index < (- count)) || - (count == 0) ) - return; - - text->cursor_virtual_x = 0; - - undraw_cursor (text, FALSE); - - move_mark_n (&text->cursor_mark, count); - - find_cursor (text, TRUE); - - draw_cursor (text, FALSE); -} - -static void -gtk_text_move_cursor (GtkOldEditable *old_editable, - gint x, - gint y) -{ - if (x > 0) - { - while (x-- != 0) - move_cursor_hor (GTK_TEXT (old_editable), 1); - } - else if (x < 0) - { - while (x++ != 0) - move_cursor_hor (GTK_TEXT (old_editable), -1); - } - - if (y > 0) - { - while (y-- != 0) - move_cursor_ver (GTK_TEXT (old_editable), 1); - } - else if (y < 0) - { - while (y++ != 0) - move_cursor_ver (GTK_TEXT (old_editable), -1); - } -} - -static void -gtk_text_move_forward_character (GtkText *text) -{ - move_cursor_hor (text, 1); -} - -static void -gtk_text_move_backward_character (GtkText *text) -{ - move_cursor_hor (text, -1); -} - -static void -gtk_text_move_next_line (GtkText *text) -{ - move_cursor_ver (text, 1); -} - -static void -gtk_text_move_previous_line (GtkText *text) -{ - move_cursor_ver (text, -1); -} - -static void -gtk_text_move_word (GtkOldEditable *old_editable, - gint n) -{ - if (n > 0) - { - while (n-- != 0) - gtk_text_move_forward_word (GTK_TEXT (old_editable)); - } - else if (n < 0) - { - while (n++ != 0) - gtk_text_move_backward_word (GTK_TEXT (old_editable)); - } -} - -static void -gtk_text_move_forward_word (GtkText *text) -{ - text->cursor_virtual_x = 0; - - undraw_cursor (text, FALSE); - - if (text->use_wchar) - { - while (!LAST_INDEX (text, text->cursor_mark) && - !gdk_iswalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index))) - advance_mark (&text->cursor_mark); - - while (!LAST_INDEX (text, text->cursor_mark) && - gdk_iswalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index))) - advance_mark (&text->cursor_mark); - } - else - { - while (!LAST_INDEX (text, text->cursor_mark) && - !isalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index))) - advance_mark (&text->cursor_mark); - - while (!LAST_INDEX (text, text->cursor_mark) && - isalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index))) - advance_mark (&text->cursor_mark); - } - - find_cursor (text, TRUE); - draw_cursor (text, FALSE); -} - -static void -gtk_text_move_backward_word (GtkText *text) -{ - text->cursor_virtual_x = 0; - - undraw_cursor (text, FALSE); - - if (text->use_wchar) - { - while ((text->cursor_mark.index > 0) && - !gdk_iswalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index-1))) - decrement_mark (&text->cursor_mark); - - while ((text->cursor_mark.index > 0) && - gdk_iswalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index-1))) - decrement_mark (&text->cursor_mark); - } - else - { - while ((text->cursor_mark.index > 0) && - !isalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index-1))) - decrement_mark (&text->cursor_mark); - - while ((text->cursor_mark.index > 0) && - isalnum (GTK_TEXT_INDEX(text, text->cursor_mark.index-1))) - decrement_mark (&text->cursor_mark); - } - - find_cursor (text, TRUE); - draw_cursor (text, FALSE); -} - -static void -gtk_text_move_page (GtkOldEditable *old_editable, - gint x, - gint y) -{ - if (y != 0) - scroll_int (GTK_TEXT (old_editable), - y * GTK_TEXT(old_editable)->vadj->page_increment); -} - -static void -gtk_text_move_to_row (GtkOldEditable *old_editable, - gint row) -{ -} - -static void -gtk_text_move_to_column (GtkOldEditable *old_editable, - gint column) -{ - GtkText *text; - - text = GTK_TEXT (old_editable); - - text->cursor_virtual_x = 0; /* FIXME */ - - undraw_cursor (text, FALSE); - - /* Move to the beginning of the line */ - while ((text->cursor_mark.index > 0) && - (GTK_TEXT_INDEX (text, text->cursor_mark.index - 1) != LINE_DELIM)) - decrement_mark (&text->cursor_mark); - - while (!LAST_INDEX (text, text->cursor_mark) && - (GTK_TEXT_INDEX (text, text->cursor_mark.index) != LINE_DELIM)) - { - if (column > 0) - column--; - else if (column == 0) - break; - - advance_mark (&text->cursor_mark); - } - - find_cursor (text, TRUE); - draw_cursor (text, FALSE); -} - -static void -gtk_text_move_beginning_of_line (GtkText *text) -{ - gtk_text_move_to_column (GTK_OLD_EDITABLE (text), 0); - -} - -static void -gtk_text_move_end_of_line (GtkText *text) -{ - gtk_text_move_to_column (GTK_OLD_EDITABLE (text), -1); -} - -static void -gtk_text_kill_char (GtkOldEditable *old_editable, - gint direction) -{ - GtkText *text; - - text = GTK_TEXT (old_editable); - - if (old_editable->selection_start_pos != old_editable->selection_end_pos) - gtk_editable_delete_selection (GTK_EDITABLE (old_editable)); - else - { - if (direction >= 0) - { - if (text->point.index + 1 <= TEXT_LENGTH (text)) - gtk_editable_delete_text (GTK_EDITABLE (old_editable), text->point.index, text->point.index + 1); - } - else - { - if (text->point.index > 0) - gtk_editable_delete_text (GTK_EDITABLE (old_editable), text->point.index - 1, text->point.index); - } - } -} - -static void -gtk_text_delete_forward_character (GtkText *text) -{ - gtk_text_kill_char (GTK_OLD_EDITABLE (text), 1); -} - -static void -gtk_text_delete_backward_character (GtkText *text) -{ - gtk_text_kill_char (GTK_OLD_EDITABLE (text), -1); -} - -static void -gtk_text_kill_word (GtkOldEditable *old_editable, - gint direction) -{ - if (old_editable->selection_start_pos != old_editable->selection_end_pos) - gtk_editable_delete_selection (GTK_EDITABLE (old_editable)); - else - { - gint old_pos = old_editable->current_pos; - if (direction >= 0) - { - gtk_text_move_word (old_editable, 1); - gtk_editable_delete_text (GTK_EDITABLE (old_editable), old_pos, old_editable->current_pos); - } - else - { - gtk_text_move_word (old_editable, -1); - gtk_editable_delete_text (GTK_EDITABLE (old_editable), old_editable->current_pos, old_pos); - } - } -} - -static void -gtk_text_delete_forward_word (GtkText *text) -{ - gtk_text_kill_word (GTK_OLD_EDITABLE (text), 1); -} - -static void -gtk_text_delete_backward_word (GtkText *text) -{ - gtk_text_kill_word (GTK_OLD_EDITABLE (text), -1); -} - -static void -gtk_text_kill_line (GtkOldEditable *old_editable, - gint direction) -{ - gint old_pos = old_editable->current_pos; - if (direction >= 0) - { - gtk_text_move_to_column (old_editable, -1); - gtk_editable_delete_text (GTK_EDITABLE (old_editable), old_pos, old_editable->current_pos); - } - else - { - gtk_text_move_to_column (old_editable, 0); - gtk_editable_delete_text (GTK_EDITABLE (old_editable), old_editable->current_pos, old_pos); - } -} - -static void -gtk_text_delete_line (GtkText *text) -{ - gtk_text_move_to_column (GTK_OLD_EDITABLE (text), 0); - gtk_text_kill_line (GTK_OLD_EDITABLE (text), 1); -} - -static void -gtk_text_delete_to_line_end (GtkText *text) -{ - gtk_text_kill_line (GTK_OLD_EDITABLE (text), 1); -} - -static void -gtk_text_select_word (GtkText *text, guint32 time) -{ - gint start_pos; - gint end_pos; - - GtkOldEditable *old_editable; - old_editable = GTK_OLD_EDITABLE (text); - - gtk_text_move_backward_word (text); - start_pos = text->cursor_mark.index; - - gtk_text_move_forward_word (text); - end_pos = text->cursor_mark.index; - - old_editable->has_selection = TRUE; - gtk_text_set_selection (old_editable, start_pos, end_pos); - gtk_old_editable_claim_selection (old_editable, start_pos != end_pos, time); -} - -static void -gtk_text_select_line (GtkText *text, guint32 time) -{ - gint start_pos; - gint end_pos; - - GtkOldEditable *old_editable; - old_editable = GTK_OLD_EDITABLE (text); - - gtk_text_move_beginning_of_line (text); - start_pos = text->cursor_mark.index; - - gtk_text_move_end_of_line (text); - gtk_text_move_forward_character (text); - end_pos = text->cursor_mark.index; - - old_editable->has_selection = TRUE; - gtk_text_set_selection (old_editable, start_pos, end_pos); - gtk_old_editable_claim_selection (old_editable, start_pos != end_pos, time); -} - -/**********************************************************************/ -/* Scrolling */ -/**********************************************************************/ - -static void -adjust_adj (GtkText* text, GtkAdjustment* adj) -{ - gint height; - - gdk_drawable_get_size (text->text_area, NULL, &height); - - adj->step_increment = MIN (adj->upper, SCROLL_PIXELS); - adj->page_increment = MIN (adj->upper, height - KEY_SCROLL_PIXELS); - adj->page_size = MIN (adj->upper, height); - adj->value = MIN (adj->value, adj->upper - adj->page_size); - adj->value = MAX (adj->value, 0.0); - - gtk_signal_emit_by_name (GTK_OBJECT (adj), "changed"); -} - -static gint -set_vertical_scroll_iterator (GtkText* text, LineParams* lp, void* data) -{ - SetVerticalScrollData *svdata = (SetVerticalScrollData *) data; - - if ((text->first_line_start_index >= lp->start.index) && - (text->first_line_start_index <= lp->end.index)) - { - svdata->mark = lp->start; - - if (text->first_line_start_index == lp->start.index) - { - text->first_onscreen_ver_pixel = svdata->pixel_height + text->first_cut_pixels; - } - else - { - text->first_onscreen_ver_pixel = svdata->pixel_height; - text->first_cut_pixels = 0; - } - - text->vadj->value = text->first_onscreen_ver_pixel; - } - - svdata->pixel_height += LINE_HEIGHT (*lp); - - return FALSE; -} - -static gint -set_vertical_scroll_find_iterator (GtkText* text, LineParams* lp, void* data) -{ - SetVerticalScrollData *svdata = (SetVerticalScrollData *) data; - gint return_val; - - if (svdata->pixel_height <= (gint) text->vadj->value && - svdata->pixel_height + LINE_HEIGHT(*lp) > (gint) text->vadj->value) - { - svdata->mark = lp->start; - - text->first_cut_pixels = (gint)text->vadj->value - svdata->pixel_height; - text->first_onscreen_ver_pixel = svdata->pixel_height; - text->first_line_start_index = lp->start.index; - - return_val = TRUE; - } - else - { - svdata->pixel_height += LINE_HEIGHT (*lp); - - return_val = FALSE; - } - - return return_val; -} - -static GtkPropertyMark -set_vertical_scroll (GtkText* text) -{ - GtkPropertyMark mark = find_mark (text, 0); - SetVerticalScrollData data; - gint height; - gint orig_value; - - data.pixel_height = 0; - line_params_iterate (text, &mark, NULL, FALSE, &data, set_vertical_scroll_iterator); - - text->vadj->upper = data.pixel_height; - orig_value = (gint) text->vadj->value; - - gdk_drawable_get_size (text->text_area, NULL, &height); - - text->vadj->step_increment = MIN (text->vadj->upper, SCROLL_PIXELS); - text->vadj->page_increment = MIN (text->vadj->upper, height - KEY_SCROLL_PIXELS); - text->vadj->page_size = MIN (text->vadj->upper, height); - text->vadj->value = MIN (text->vadj->value, text->vadj->upper - text->vadj->page_size); - text->vadj->value = MAX (text->vadj->value, 0.0); - - text->last_ver_value = (gint)text->vadj->value; - - gtk_signal_emit_by_name (GTK_OBJECT (text->vadj), "changed"); - - if (text->vadj->value != orig_value) - { - /* We got clipped, and don't really know which line to put first. */ - data.pixel_height = 0; - data.last_didnt_wrap = TRUE; - - line_params_iterate (text, &mark, NULL, - FALSE, &data, - set_vertical_scroll_find_iterator); - } - - return data.mark; -} - -static void -scroll_int (GtkText* text, gint diff) -{ - gdouble upper; - - text->vadj->value += diff; - - upper = text->vadj->upper - text->vadj->page_size; - text->vadj->value = MIN (text->vadj->value, upper); - text->vadj->value = MAX (text->vadj->value, 0.0); - - gtk_signal_emit_by_name (GTK_OBJECT (text->vadj), "value-changed"); -} - -static void -process_exposes (GtkText *text) -{ - GdkEvent *event; - - /* Make sure graphics expose events are processed before scrolling - * again */ - - while ((event = gdk_event_get_graphics_expose (text->text_area)) != NULL) - { - gtk_widget_send_expose (GTK_WIDGET (text), event); - if (event->expose.count == 0) - { - gdk_event_free (event); - break; - } - gdk_event_free (event); - } -} - -static gint last_visible_line_height (GtkText* text) -{ - GList *cache = text->line_start_cache; - gint height; - - gdk_drawable_get_size (text->text_area, NULL, &height); - - for (; cache->next; cache = cache->next) - if (pixel_height_of(text, cache->next) > height) - break; - - if (cache) - return pixel_height_of(text, cache) - 1; - else - return 0; -} - -static gint first_visible_line_height (GtkText* text) -{ - if (text->first_cut_pixels) - return pixel_height_of(text, text->line_start_cache) + 1; - else - return 1; -} - -static void -scroll_down (GtkText* text, gint diff0) -{ - GdkRectangle rect; - gint real_diff = 0; - gint width, height; - - text->first_onscreen_ver_pixel += diff0; - - while (diff0-- > 0) - { - g_assert (text->line_start_cache); - - if (text->first_cut_pixels < LINE_HEIGHT(CACHE_DATA(text->line_start_cache)) - 1) - { - text->first_cut_pixels += 1; - } - else - { - text->first_cut_pixels = 0; - - text->line_start_cache = text->line_start_cache->next; - - text->first_line_start_index = - CACHE_DATA(text->line_start_cache).start.index; - - if (!text->line_start_cache->next) - fetch_lines_forward (text, 1); - } - - real_diff += 1; - } - - gdk_drawable_get_size (text->text_area, &width, &height); - if (height > real_diff) - gdk_draw_drawable (text->text_area, - text->gc, - text->text_area, - 0, - real_diff, - 0, - 0, - width, - height - real_diff); - - rect.x = 0; - rect.y = MAX (0, height - real_diff); - rect.width = width; - rect.height = MIN (height, real_diff); - - expose_text (text, &rect, FALSE); - gtk_text_draw_focus ( (GtkWidget *) text); - - if (text->current_line) - { - gint cursor_min; - - text->cursor_pos_y -= real_diff; - cursor_min = drawn_cursor_min(text); - - if (cursor_min < 0) - find_mouse_cursor (text, text->cursor_pos_x, - first_visible_line_height (text)); - } - - if (height > real_diff) - process_exposes (text); -} - -static void -scroll_up (GtkText* text, gint diff0) -{ - gint real_diff = 0; - GdkRectangle rect; - gint width, height; - - text->first_onscreen_ver_pixel += diff0; - - while (diff0++ < 0) - { - g_assert (text->line_start_cache); - - if (text->first_cut_pixels > 0) - { - text->first_cut_pixels -= 1; - } - else - { - if (!text->line_start_cache->prev) - fetch_lines_backward (text); - - text->line_start_cache = text->line_start_cache->prev; - - text->first_line_start_index = - CACHE_DATA(text->line_start_cache).start.index; - - text->first_cut_pixels = LINE_HEIGHT(CACHE_DATA(text->line_start_cache)) - 1; - } - - real_diff += 1; - } - - gdk_drawable_get_size (text->text_area, &width, &height); - if (height > real_diff) - gdk_draw_drawable (text->text_area, - text->gc, - text->text_area, - 0, - 0, - 0, - real_diff, - width, - height - real_diff); - - rect.x = 0; - rect.y = 0; - rect.width = width; - rect.height = MIN (height, real_diff); - - expose_text (text, &rect, FALSE); - gtk_text_draw_focus ( (GtkWidget *) text); - - if (text->current_line) - { - gint cursor_max; - gint height; - - text->cursor_pos_y += real_diff; - cursor_max = drawn_cursor_max(text); - gdk_drawable_get_size (text->text_area, NULL, &height); - - if (cursor_max >= height) - find_mouse_cursor (text, text->cursor_pos_x, - last_visible_line_height (text)); - } - - if (height > real_diff) - process_exposes (text); -} - -/**********************************************************************/ -/* Display Code */ -/**********************************************************************/ - -/* Assumes mark starts a line. Calculates the height, width, and - * displayable character count of a single DISPLAYABLE line. That - * means that in line-wrap mode, this does may not compute the - * properties of an entire line. */ -static LineParams -find_line_params (GtkText* text, - const GtkPropertyMark* mark, - const PrevTabCont *tab_cont, - PrevTabCont *next_cont) -{ - LineParams lp; - TabStopMark tab_mark = tab_cont->tab_start; - guint max_display_pixels; - GdkWChar ch; - gint ch_width; - GdkFont *font; - - gdk_drawable_get_size (text->text_area, (gint*) &max_display_pixels, NULL); - max_display_pixels -= LINE_WRAP_ROOM; - - lp.wraps = 0; - lp.tab_cont = *tab_cont; - lp.start = *mark; - lp.end = *mark; - lp.pixel_width = tab_cont->pixel_offset; - lp.displayable_chars = 0; - lp.font_ascent = 0; - lp.font_descent = 0; - - init_tab_cont (text, next_cont); - - while (!LAST_INDEX(text, lp.end)) - { - g_assert (lp.end.property); - - ch = GTK_TEXT_INDEX (text, lp.end.index); - font = MARK_CURRENT_FONT (text, &lp.end); - - if (ch == LINE_DELIM) - { - /* Newline doesn't count in computation of line height, even - * if its in a bigger font than the rest of the line. Unless, - * of course, there are no other characters. */ - - if (!lp.font_ascent && !lp.font_descent) - { - lp.font_ascent = font->ascent; - lp.font_descent = font->descent; - } - - lp.tab_cont_next = *next_cont; - - return lp; - } - - ch_width = find_char_width (text, &lp.end, &tab_mark); - - if ((ch_width + lp.pixel_width > max_display_pixels) && - (lp.end.index > lp.start.index)) - { - lp.wraps = 1; - - if (text->line_wrap) - { - next_cont->tab_start = tab_mark; - next_cont->pixel_offset = 0; - - if (ch == '\t') - { - /* Here's the tough case, a tab is wrapping. */ - gint pixels_avail = max_display_pixels - lp.pixel_width; - gint space_width = MARK_CURRENT_TEXT_FONT(text, &lp.end)->char_widths[' ']; - gint spaces_avail = pixels_avail / space_width; - - if (spaces_avail == 0) - { - decrement_mark (&lp.end); - } - else - { - advance_tab_mark (text, &next_cont->tab_start, '\t'); - next_cont->pixel_offset = space_width * (tab_mark.to_next_tab - - spaces_avail); - lp.displayable_chars += 1; - } - } - else - { - if (text->word_wrap) - { - GtkPropertyMark saved_mark = lp.end; - guint saved_characters = lp.displayable_chars; - - lp.displayable_chars += 1; - - if (text->use_wchar) - { - while (!gdk_iswspace (GTK_TEXT_INDEX (text, lp.end.index)) && - (lp.end.index > lp.start.index)) - { - decrement_mark (&lp.end); - lp.displayable_chars -= 1; - } - } - else - { - while (!isspace(GTK_TEXT_INDEX (text, lp.end.index)) && - (lp.end.index > lp.start.index)) - { - decrement_mark (&lp.end); - lp.displayable_chars -= 1; - } - } - - /* If whole line is one word, revert to char wrapping */ - if (lp.end.index == lp.start.index) - { - lp.end = saved_mark; - lp.displayable_chars = saved_characters; - decrement_mark (&lp.end); - } - } - else - { - /* Don't include this character, it will wrap. */ - decrement_mark (&lp.end); - } - } - - lp.tab_cont_next = *next_cont; - - return lp; - } - } - else - { - lp.displayable_chars += 1; - } - - lp.font_ascent = MAX (font->ascent, lp.font_ascent); - lp.font_descent = MAX (font->descent, lp.font_descent); - lp.pixel_width += ch_width; - - advance_mark(&lp.end); - advance_tab_mark (text, &tab_mark, ch); - } - - if (LAST_INDEX(text, lp.start)) - { - /* Special case, empty last line. */ - font = MARK_CURRENT_FONT (text, &lp.end); - - lp.font_ascent = font->ascent; - lp.font_descent = font->descent; - } - - lp.tab_cont_next = *next_cont; - - return lp; -} - -static void -expand_scratch_buffer (GtkText* text, guint len) -{ - if (len >= text->scratch_buffer_len) - { - guint i = 1; - - while (i <= len && i < MIN_GAP_SIZE) i <<= 1; - - if (text->use_wchar) - { - if (text->scratch_buffer.wc) - text->scratch_buffer.wc = g_new (GdkWChar, i); - else - text->scratch_buffer.wc = g_realloc (text->scratch_buffer.wc, - i*sizeof (GdkWChar)); - } - else - { - if (text->scratch_buffer.ch) - text->scratch_buffer.ch = g_new (guchar, i); - else - text->scratch_buffer.ch = g_realloc (text->scratch_buffer.ch, i); - } - - text->scratch_buffer_len = i; - } -} - -/* Side effect: modifies text->gc - */ -static void -draw_bg_rect (GtkText* text, GtkPropertyMark *mark, - gint x, gint y, gint width, gint height, - gboolean already_cleared) -{ - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (text); - - if ((mark->index >= MIN(old_editable->selection_start_pos, old_editable->selection_end_pos) && - mark->index < MAX(old_editable->selection_start_pos, old_editable->selection_end_pos))) - { - gtk_paint_flat_box(GTK_WIDGET(text)->style, text->text_area, - old_editable->has_selection ? - GTK_STATE_SELECTED : GTK_STATE_ACTIVE, - GTK_SHADOW_NONE, - NULL, GTK_WIDGET(text), "text", - x, y, width, height); - } - else if (!gdk_color_equal(MARK_CURRENT_BACK (text, mark), - >K_WIDGET(text)->style->base[gtk_widget_get_state (GTK_WIDGET (text))])) - { - gdk_gc_set_foreground (text->gc, MARK_CURRENT_BACK (text, mark)); - - gdk_draw_rectangle (text->text_area, - text->gc, - TRUE, x, y, width, height); - } - else if (GTK_WIDGET (text)->style->bg_pixmap[GTK_STATE_NORMAL]) - { - GdkRectangle rect; - - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; - - clear_area (text, &rect); - } - else if (!already_cleared) - gdk_window_clear_area (text->text_area, x, y, width, height); -} - -static void -draw_line (GtkText* text, - gint pixel_start_height, - LineParams* lp) -{ - GdkGCValues gc_values; - gint i; - gint len = 0; - guint running_offset = lp->tab_cont.pixel_offset; - union { GdkWChar *wc; guchar *ch; } buffer; - GdkGC *fg_gc; - - GtkOldEditable *old_editable = GTK_OLD_EDITABLE (text); - - guint selection_start_pos = MIN (old_editable->selection_start_pos, old_editable->selection_end_pos); - guint selection_end_pos = MAX (old_editable->selection_start_pos, old_editable->selection_end_pos); - - GtkPropertyMark mark = lp->start; - TabStopMark tab_mark = lp->tab_cont.tab_start; - gint pixel_height = pixel_start_height + lp->font_ascent; - guint chars = lp->displayable_chars; - - /* First provide a contiguous segment of memory. This makes reading - * the code below *much* easier, and only incurs the cost of copying - * when the line being displayed spans the gap. */ - if (mark.index <= text->gap_position && - mark.index + chars > text->gap_position) - { - expand_scratch_buffer (text, chars); - - if (text->use_wchar) - { - for (i = 0; i < chars; i += 1) - text->scratch_buffer.wc[i] = GTK_TEXT_INDEX(text, mark.index + i); - buffer.wc = text->scratch_buffer.wc; - } - else - { - for (i = 0; i < chars; i += 1) - text->scratch_buffer.ch[i] = GTK_TEXT_INDEX(text, mark.index + i); - buffer.ch = text->scratch_buffer.ch; - } - } - else - { - if (text->use_wchar) - { - if (mark.index >= text->gap_position) - buffer.wc = text->text.wc + mark.index + text->gap_size; - else - buffer.wc = text->text.wc + mark.index; - } - else - { - if (mark.index >= text->gap_position) - buffer.ch = text->text.ch + mark.index + text->gap_size; - else - buffer.ch = text->text.ch + mark.index; - } - } - - - if (running_offset > 0) - { - draw_bg_rect (text, &mark, 0, pixel_start_height, running_offset, - LINE_HEIGHT (*lp), TRUE); - } - - while (chars > 0) - { - len = 0; - if ((text->use_wchar && buffer.wc[0] != '\t') || - (!text->use_wchar && buffer.ch[0] != '\t')) - { - union { GdkWChar *wc; guchar *ch; } next_tab; - gint pixel_width; - GdkFont *font; - - next_tab.wc = NULL; - if (text->use_wchar) - for (i=0; i<chars; i++) - { - if (buffer.wc[i] == '\t') - { - next_tab.wc = buffer.wc + i; - break; - } - } - else - next_tab.ch = memchr (buffer.ch, '\t', chars); - - len = MIN (MARK_CURRENT_PROPERTY (&mark)->length - mark.offset, chars); - - if (text->use_wchar) - { - if (next_tab.wc) - len = MIN (len, next_tab.wc - buffer.wc); - } - else - { - if (next_tab.ch) - len = MIN (len, next_tab.ch - buffer.ch); - } - - if (mark.index < selection_start_pos) - len = MIN (len, selection_start_pos - mark.index); - else if (mark.index < selection_end_pos) - len = MIN (len, selection_end_pos - mark.index); - - font = MARK_CURRENT_FONT (text, &mark); - if (font->type == GDK_FONT_FONT) - { - gdk_gc_set_font (text->gc, font); - gdk_gc_get_values (text->gc, &gc_values); - if (text->use_wchar) - pixel_width = gdk_text_width_wc (gc_values.font, - buffer.wc, len); - else - pixel_width = gdk_text_width (gc_values.font, - (gchar *)buffer.ch, len); - } - else - { - if (text->use_wchar) - pixel_width = gdk_text_width_wc (font, buffer.wc, len); - else - pixel_width = gdk_text_width (font, (gchar *)buffer.ch, len); - } - - draw_bg_rect (text, &mark, running_offset, pixel_start_height, - pixel_width, LINE_HEIGHT (*lp), TRUE); - - if ((mark.index >= selection_start_pos) && - (mark.index < selection_end_pos)) - { - if (old_editable->has_selection) - fg_gc = GTK_WIDGET(text)->style->text_gc[GTK_STATE_SELECTED]; - else - fg_gc = GTK_WIDGET(text)->style->text_gc[GTK_STATE_ACTIVE]; - } - else - { - gdk_gc_set_foreground (text->gc, MARK_CURRENT_FORE (text, &mark)); - fg_gc = text->gc; - } - - if (text->use_wchar) - gdk_draw_text_wc (text->text_area, MARK_CURRENT_FONT (text, &mark), - fg_gc, - running_offset, - pixel_height, - buffer.wc, - len); - else - gdk_draw_text (text->text_area, MARK_CURRENT_FONT (text, &mark), - fg_gc, - running_offset, - pixel_height, - (gchar *)buffer.ch, - len); - - running_offset += pixel_width; - - advance_tab_mark_n (text, &tab_mark, len); - } - else - { - gint pixels_remaining; - gint space_width; - gint spaces_avail; - - len = 1; - - gdk_drawable_get_size (text->text_area, &pixels_remaining, NULL); - pixels_remaining -= (LINE_WRAP_ROOM + running_offset); - - space_width = MARK_CURRENT_TEXT_FONT(text, &mark)->char_widths[' ']; - - spaces_avail = pixels_remaining / space_width; - spaces_avail = MIN (spaces_avail, tab_mark.to_next_tab); - - draw_bg_rect (text, &mark, running_offset, pixel_start_height, - spaces_avail * space_width, LINE_HEIGHT (*lp), TRUE); - - running_offset += tab_mark.to_next_tab * - MARK_CURRENT_TEXT_FONT(text, &mark)->char_widths[' ']; - - advance_tab_mark (text, &tab_mark, '\t'); - } - - advance_mark_n (&mark, len); - if (text->use_wchar) - buffer.wc += len; - else - buffer.ch += len; - chars -= len; - } -} - -static void -draw_line_wrap (GtkText* text, guint height /* baseline height */) -{ - gint width; - GdkPixmap *bitmap; - gint bitmap_width; - gint bitmap_height; - - if (text->line_wrap) - { - bitmap = text->line_wrap_bitmap; - bitmap_width = line_wrap_width; - bitmap_height = line_wrap_height; - } - else - { - bitmap = text->line_arrow_bitmap; - bitmap_width = line_arrow_width; - bitmap_height = line_arrow_height; - } - - gdk_drawable_get_size (text->text_area, &width, NULL); - width -= LINE_WRAP_ROOM; - - gdk_gc_set_stipple (text->gc, - bitmap); - - gdk_gc_set_fill (text->gc, GDK_STIPPLED); - - gdk_gc_set_foreground (text->gc, >K_WIDGET (text)->style->text[GTK_STATE_NORMAL]); - - gdk_gc_set_ts_origin (text->gc, - width + 1, - height - bitmap_height - 1); - - gdk_draw_rectangle (text->text_area, - text->gc, - TRUE, - width + 1, - height - bitmap_height - 1 /* one pixel above the baseline. */, - bitmap_width, - bitmap_height); - - gdk_gc_set_ts_origin (text->gc, 0, 0); - - gdk_gc_set_fill (text->gc, GDK_SOLID); -} - -static void -undraw_cursor (GtkText* text, gint absolute) -{ - GtkOldEditable *old_editable = (GtkOldEditable *) text; - - TDEBUG (("in undraw_cursor\n")); - - if (absolute) - text->cursor_drawn_level = 0; - - if ((text->cursor_drawn_level ++ == 0) && - (old_editable->selection_start_pos == old_editable->selection_end_pos) && - GTK_WIDGET_DRAWABLE (text) && text->line_start_cache) - { - GdkFont* font; - - g_assert(text->cursor_mark.property); - - font = MARK_CURRENT_FONT(text, &text->cursor_mark); - - draw_bg_rect (text, &text->cursor_mark, - text->cursor_pos_x, - text->cursor_pos_y - text->cursor_char_offset - font->ascent, - 1, font->ascent + 1, FALSE); - - if (text->cursor_char) - { - if (font->type == GDK_FONT_FONT) - gdk_gc_set_font (text->gc, font); - - gdk_gc_set_foreground (text->gc, MARK_CURRENT_FORE (text, &text->cursor_mark)); - - gdk_draw_text_wc (text->text_area, font, - text->gc, - text->cursor_pos_x, - text->cursor_pos_y - text->cursor_char_offset, - &text->cursor_char, - 1); - } - } -} - -static gint -drawn_cursor_min (GtkText* text) -{ - GdkFont* font; - - g_assert(text->cursor_mark.property); - - font = MARK_CURRENT_FONT(text, &text->cursor_mark); - - return text->cursor_pos_y - text->cursor_char_offset - font->ascent; -} - -static gint -drawn_cursor_max (GtkText* text) -{ - g_assert(text->cursor_mark.property); - - return text->cursor_pos_y - text->cursor_char_offset; -} - -static void -draw_cursor (GtkText* text, gint absolute) -{ - GtkOldEditable *old_editable = (GtkOldEditable *)text; - - TDEBUG (("in draw_cursor\n")); - - if (absolute) - text->cursor_drawn_level = 1; - - if ((--text->cursor_drawn_level == 0) && - old_editable->editable && - (old_editable->selection_start_pos == old_editable->selection_end_pos) && - GTK_WIDGET_DRAWABLE (text) && text->line_start_cache) - { - GdkFont* font; - - g_assert (text->cursor_mark.property); - - font = MARK_CURRENT_FONT (text, &text->cursor_mark); - - gdk_gc_set_foreground (text->gc, >K_WIDGET (text)->style->text[GTK_STATE_NORMAL]); - - gdk_draw_line (text->text_area, text->gc, text->cursor_pos_x, - text->cursor_pos_y - text->cursor_char_offset, - text->cursor_pos_x, - text->cursor_pos_y - text->cursor_char_offset - font->ascent); - } -} - -static GdkGC * -create_bg_gc (GtkText *text) -{ - GdkGCValues values; - - values.tile = GTK_WIDGET (text)->style->bg_pixmap[GTK_STATE_NORMAL]; - values.fill = GDK_TILED; - - return gdk_gc_new_with_values (text->text_area, &values, - GDK_GC_FILL | GDK_GC_TILE); -} - -static void -clear_area (GtkText *text, GdkRectangle *area) -{ - GtkWidget *widget = GTK_WIDGET (text); - - if (text->bg_gc) - { - gint width, height; - - gdk_drawable_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height); - - gdk_gc_set_ts_origin (text->bg_gc, - (- text->first_onscreen_hor_pixel) % width, - (- text->first_onscreen_ver_pixel) % height); - - gdk_draw_rectangle (text->text_area, text->bg_gc, TRUE, - area->x, area->y, area->width, area->height); - } - else - gdk_window_clear_area (text->text_area, area->x, area->y, area->width, area->height); -} - -static void -expose_text (GtkText* text, GdkRectangle *area, gboolean cursor) -{ - GList *cache = text->line_start_cache; - gint pixels = - text->first_cut_pixels; - gint min_y = MAX (0, area->y); - gint max_y = MAX (0, area->y + area->height); - gint height; - - gdk_drawable_get_size (text->text_area, NULL, &height); - max_y = MIN (max_y, height); - - TDEBUG (("in expose x=%d y=%d w=%d h=%d\n", area->x, area->y, area->width, area->height)); - - clear_area (text, area); - - for (; pixels < height; cache = cache->next) - { - if (pixels < max_y && (pixels + (gint)LINE_HEIGHT(CACHE_DATA(cache))) >= min_y) - { - draw_line (text, pixels, &CACHE_DATA(cache)); - - if (CACHE_DATA(cache).wraps) - draw_line_wrap (text, pixels + CACHE_DATA(cache).font_ascent); - } - - if (cursor && gtk_widget_has_focus (GTK_WIDGET (text))) - { - if (CACHE_DATA(cache).start.index <= text->cursor_mark.index && - CACHE_DATA(cache).end.index >= text->cursor_mark.index) - { - /* We undraw and draw the cursor here to get the drawn - * level right ... FIXME - maybe the second parameter - * of draw_cursor should work differently - */ - undraw_cursor (text, FALSE); - draw_cursor (text, FALSE); - } - } - - pixels += LINE_HEIGHT(CACHE_DATA(cache)); - - if (!cache->next) - { - fetch_lines_forward (text, 1); - - if (!cache->next) - break; - } - } -} - -static void -gtk_text_update_text (GtkOldEditable *old_editable, - gint start_pos, - gint end_pos) -{ - GtkText *text = GTK_TEXT (old_editable); - - GList *cache = text->line_start_cache; - gint pixels = - text->first_cut_pixels; - GdkRectangle area; - gint width; - gint height; - - if (end_pos < 0) - end_pos = TEXT_LENGTH (text); - - if (end_pos < start_pos) - return; - - gdk_drawable_get_size (text->text_area, &width, &height); - area.x = 0; - area.y = -1; - area.width = width; - area.height = 0; - - TDEBUG (("in expose span start=%d stop=%d\n", start_pos, end_pos)); - - for (; pixels < height; cache = cache->next) - { - if (CACHE_DATA(cache).start.index < end_pos) - { - if (CACHE_DATA(cache).end.index >= start_pos) - { - if (area.y < 0) - area.y = MAX(0,pixels); - area.height = pixels + LINE_HEIGHT(CACHE_DATA(cache)) - area.y; - } - } - else - break; - - pixels += LINE_HEIGHT(CACHE_DATA(cache)); - - if (!cache->next) - { - fetch_lines_forward (text, 1); - - if (!cache->next) - break; - } - } - - if (area.y >= 0) - expose_text (text, &area, TRUE); -} - -static void -recompute_geometry (GtkText* text) -{ - GtkPropertyMark mark, start_mark; - GList *new_lines; - gint height; - gint width; - - free_cache (text); - - mark = start_mark = set_vertical_scroll (text); - - /* We need a real start of a line when calling fetch_lines(). - * not the start of a wrapped line. - */ - while (mark.index > 0 && - GTK_TEXT_INDEX (text, mark.index - 1) != LINE_DELIM) - decrement_mark (&mark); - - gdk_drawable_get_size (text->text_area, &width, &height); - - /* Fetch an entire line, to make sure that we get all the text - * we backed over above, in addition to enough text to fill up - * the space vertically - */ - - new_lines = fetch_lines (text, - &mark, - NULL, - FetchLinesCount, - 1); - - mark = CACHE_DATA (g_list_last (new_lines)).end; - if (!LAST_INDEX (text, mark)) - { - advance_mark (&mark); - - new_lines = g_list_concat (new_lines, - fetch_lines (text, - &mark, - NULL, - FetchLinesPixels, - height + text->first_cut_pixels)); - } - - /* Now work forward to the actual first onscreen line */ - - while (CACHE_DATA (new_lines).start.index < start_mark.index) - new_lines = new_lines->next; - - text->line_start_cache = new_lines; - - find_cursor (text, TRUE); -} - -/**********************************************************************/ -/* Selection */ -/**********************************************************************/ - -static void -gtk_text_set_selection (GtkOldEditable *old_editable, - gint start, - gint end) -{ - GtkText *text = GTK_TEXT (old_editable); - - guint start1, end1, start2, end2; - - if (end < 0) - end = TEXT_LENGTH (text); - - start1 = MIN(start,end); - end1 = MAX(start,end); - start2 = MIN(old_editable->selection_start_pos, old_editable->selection_end_pos); - end2 = MAX(old_editable->selection_start_pos, old_editable->selection_end_pos); - - if (start2 < start1) - { - guint tmp; - - tmp = start1; start1 = start2; start2 = tmp; - tmp = end1; end1 = end2; end2 = tmp; - } - - undraw_cursor (text, FALSE); - old_editable->selection_start_pos = start; - old_editable->selection_end_pos = end; - draw_cursor (text, FALSE); - - /* Expose only what changed */ - - if (start1 < start2) - gtk_text_update_text (old_editable, start1, MIN(end1, start2)); - - if (end2 > end1) - gtk_text_update_text (old_editable, MAX(end1, start2), end2); - else if (end2 < end1) - gtk_text_update_text (old_editable, end2, end1); -} - - -/**********************************************************************/ -/* Debug */ -/**********************************************************************/ - -#ifdef DEBUG_GTK_TEXT -static void -gtk_text_show_cache_line (GtkText *text, GList *cache, - const char* what, const char* func, gint line) -{ - LineParams *lp = &CACHE_DATA(cache); - gint i; - - if (cache == text->line_start_cache) - g_message ("Line Start Cache: "); - - if (cache == text->current_line) - g_message("Current Line: "); - - g_message ("%s:%d: cache line %s s=%d,e=%d,lh=%d (", - func, - line, - what, - lp->start.index, - lp->end.index, - LINE_HEIGHT(*lp)); - - for (i = lp->start.index; i < (lp->end.index + lp->wraps); i += 1) - g_message ("%c", GTK_TEXT_INDEX (text, i)); - - g_message (")\n"); -} - -static void -gtk_text_show_cache (GtkText *text, const char* func, gint line) -{ - GList *l = text->line_start_cache; - - if (!l) { - return; - } - - /* back up to the absolute beginning of the line cache */ - while (l->prev) - l = l->prev; - - g_message ("*** line cache ***\n"); - for (; l; l = l->next) - gtk_text_show_cache_line (text, l, "all", func, line); -} - -static void -gtk_text_assert_mark (GtkText *text, - GtkPropertyMark *mark, - GtkPropertyMark *before, - GtkPropertyMark *after, - const gchar *msg, - const gchar *where, - gint line) -{ - GtkPropertyMark correct_mark = find_mark (text, mark->index); - - if (mark->offset != correct_mark.offset || - mark->property != correct_mark.property) - g_warning ("incorrect %s text property marker in %s:%d, index %d -- bad!", where, msg, line, mark->index); -} - -static void -gtk_text_assert (GtkText *text, - const gchar *msg, - gint line) -{ - GList* cache = text->line_start_cache; - GtkPropertyMark* before_mark = NULL; - GtkPropertyMark* after_mark = NULL; - - gtk_text_show_props (text, msg, line); - - for (; cache->prev; cache = cache->prev) - /* nothing */; - - g_message ("*** line markers ***\n"); - - for (; cache; cache = cache->next) - { - after_mark = &CACHE_DATA(cache).end; - gtk_text_assert_mark (text, &CACHE_DATA(cache).start, before_mark, after_mark, msg, "start", line); - before_mark = &CACHE_DATA(cache).start; - - if (cache->next) - after_mark = &CACHE_DATA(cache->next).start; - else - after_mark = NULL; - - gtk_text_assert_mark (text, &CACHE_DATA(cache).end, before_mark, after_mark, msg, "end", line); - before_mark = &CACHE_DATA(cache).end; - } -} - -static void -gtk_text_show_adj (GtkText *text, - GtkAdjustment *adj, - const char* what, - const char* func, - gint line) -{ - g_message ("*** adjustment ***\n"); - - g_message ("%s:%d: %s adjustment l=%.1f u=%.1f v=%.1f si=%.1f pi=%.1f ps=%.1f\n", - func, - line, - what, - adj->lower, - adj->upper, - adj->value, - adj->step_increment, - adj->page_increment, - adj->page_size); -} - -static void -gtk_text_show_props (GtkText *text, - const char* msg, - int line) -{ - GList* props = text->text_properties; - int proplen = 0; - - g_message ("%s:%d: ", msg, line); - - for (; props; props = props->next) - { - TextProperty *p = (TextProperty*)props->data; - - proplen += p->length; - - g_message ("[%d,%p,", p->length, p); - if (p->flags & PROPERTY_FONT) - g_message ("%p,", p->font); - else - g_message ("-,"); - if (p->flags & PROPERTY_FOREGROUND) - g_message ("%ld, ", p->fore_color.pixel); - else - g_message ("-,"); - if (p->flags & PROPERTY_BACKGROUND) - g_message ("%ld] ", p->back_color.pixel); - else - g_message ("-] "); - } - - g_message ("\n"); - - if (proplen - 1 != TEXT_LENGTH(text)) - g_warning ("incorrect property list length in %s:%d -- bad!", msg, line); -} -#endif - -#define __GTK_TEXT_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtktext.h b/gtk/gtktext.h deleted file mode 100644 index 8bfa71aa21..0000000000 --- a/gtk/gtktext.h +++ /dev/null @@ -1,217 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifdef GTK_ENABLE_BROKEN - -#ifndef __GTK_TEXT_H__ -#define __GTK_TEXT_H__ - - -#include <gtk/gtkoldeditable.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_TEXT (gtk_text_get_type ()) -#define GTK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TEXT, GtkText)) -#define GTK_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TEXT, GtkTextClass)) -#define GTK_IS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TEXT)) -#define GTK_IS_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TEXT)) -#define GTK_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TEXT, GtkTextClass)) - - -typedef struct _GtkTextFont GtkTextFont; -typedef struct _GtkPropertyMark GtkPropertyMark; -typedef struct _GtkText GtkText; -typedef struct _GtkTextClass GtkTextClass; - -struct _GtkPropertyMark -{ - /* Position in list. */ - GList* property; - - /* Offset into that property. */ - guint offset; - - /* Current index. */ - guint index; -}; - -struct _GtkText -{ - GtkOldEditable old_editable; - - GdkWindow *text_area; - - GtkAdjustment *hadj; - GtkAdjustment *vadj; - - GdkGC *gc; - - GdkPixmap* line_wrap_bitmap; - GdkPixmap* line_arrow_bitmap; - - /* GAPPED TEXT SEGMENT */ - - /* The text, a single segment of text a'la emacs, with a gap - * where insertion occurs. */ - union { GdkWChar *wc; guchar *ch; } text; - /* The allocated length of the text segment. */ - guint text_len; - /* The gap position, index into address where a char - * should be inserted. */ - guint gap_position; - /* The gap size, s.t. *(text + gap_position + gap_size) is - * the first valid character following the gap. */ - guint gap_size; - /* The last character position, index into address where a - * character should be appeneded. Thus, text_end - gap_size - * is the length of the actual data. */ - guint text_end; - /* LINE START CACHE */ - - /* A cache of line-start information. Data is a LineParam*. */ - GList *line_start_cache; - /* Index to the start of the first visible line. */ - guint first_line_start_index; - /* The number of pixels cut off of the top line. */ - guint first_cut_pixels; - /* First visible horizontal pixel. */ - guint first_onscreen_hor_pixel; - /* First visible vertical pixel. */ - guint first_onscreen_ver_pixel; - - /* FLAGS */ - - /* True iff this buffer is wrapping lines, otherwise it is using a - * horizontal scrollbar. */ - guint line_wrap : 1; - guint word_wrap : 1; - /* If a fontset is supplied for the widget, use_wchar become true, - * and we use GdkWchar as the encoding of text. */ - guint use_wchar : 1; - - /* Frozen, don't do updates. @@@ fixme */ - guint freeze_count; - /* TEXT PROPERTIES */ - - /* A doubly-linked-list containing TextProperty objects. */ - GList *text_properties; - /* The end of this list. */ - GList *text_properties_end; - /* The first node before or on the point along with its offset to - * the point and the buffer's current point. This is the only - * PropertyMark whose index is guaranteed to remain correct - * following a buffer insertion or deletion. */ - GtkPropertyMark point; - - /* SCRATCH AREA */ - - union { GdkWChar *wc; guchar *ch; } scratch_buffer; - guint scratch_buffer_len; - - /* SCROLLING */ - - gint last_ver_value; - - /* CURSOR */ - - gint cursor_pos_x; /* Position of cursor. */ - gint cursor_pos_y; /* Baseline of line cursor is drawn on. */ - GtkPropertyMark cursor_mark; /* Where it is in the buffer. */ - GdkWChar cursor_char; /* Character to redraw. */ - gchar cursor_char_offset; /* Distance from baseline of the font. */ - gint cursor_virtual_x; /* Where it would be if it could be. */ - gint cursor_drawn_level; /* How many people have undrawn. */ - - /* Current Line */ - - GList *current_line; - - /* Tab Stops */ - - GList *tab_stops; - gint default_tab_width; - - GtkTextFont *current_font; /* Text font for current style */ - - /* Timer used for auto-scrolling off ends */ - gint timer; - - guint button; /* currently pressed mouse button */ - GdkGC *bg_gc; /* gc for drawing background pixmap */ -}; - -struct _GtkTextClass -{ - GtkOldEditableClass parent_class; - - void (*set_scroll_adjustments) (GtkText *text, - GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment); -}; - - -GType gtk_text_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_text_new (GtkAdjustment *hadj, - GtkAdjustment *vadj); -void gtk_text_set_editable (GtkText *text, - gboolean editable); -void gtk_text_set_word_wrap (GtkText *text, - gboolean word_wrap); -void gtk_text_set_line_wrap (GtkText *text, - gboolean line_wrap); -void gtk_text_set_adjustments (GtkText *text, - GtkAdjustment *hadj, - GtkAdjustment *vadj); -void gtk_text_set_point (GtkText *text, - guint index); -guint gtk_text_get_point (GtkText *text); -guint gtk_text_get_length (GtkText *text); -void gtk_text_freeze (GtkText *text); -void gtk_text_thaw (GtkText *text); -void gtk_text_insert (GtkText *text, - GdkFont *font, - const GdkColor *fore, - const GdkColor *back, - const char *chars, - gint length); -gboolean gtk_text_backward_delete (GtkText *text, - guint nchars); -gboolean gtk_text_forward_delete (GtkText *text, - guint nchars); - -#define GTK_TEXT_INDEX(t, index) (((t)->use_wchar) \ - ? ((index) < (t)->gap_position ? (t)->text.wc[index] : \ - (t)->text.wc[(index)+(t)->gap_size]) \ - : ((index) < (t)->gap_position ? (t)->text.ch[index] : \ - (t)->text.ch[(index)+(t)->gap_size])) - -G_END_DECLS - -#endif /* __GTK_TEXT_H__ */ - -#endif /* GTK_ENABLE_BROKEN */ diff --git a/gtk/gtktextbuffer.h b/gtk/gtktextbuffer.h index d160c49065..3a773e50ea 100644 --- a/gtk/gtktextbuffer.h +++ b/gtk/gtktextbuffer.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktextbufferrichtext.h b/gtk/gtktextbufferrichtext.h index bbbf6e2b0d..614b43dcfd 100644 --- a/gtk/gtktextbufferrichtext.h +++ b/gtk/gtktextbufferrichtext.h @@ -19,7 +19,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktextchild.h b/gtk/gtktextchild.h index 20cee010bc..7835e68f91 100644 --- a/gtk/gtktextchild.h +++ b/gtk/gtktextchild.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktextiter.h b/gtk/gtktextiter.h index 44ba8721e7..046d436802 100644 --- a/gtk/gtktextiter.h +++ b/gtk/gtktextiter.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktextmark.h b/gtk/gtktextmark.h index 87118df7ec..5bddf92739 100644 --- a/gtk/gtktextmark.h +++ b/gtk/gtktextmark.h @@ -47,7 +47,7 @@ * */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktexttag.h b/gtk/gtktexttag.h index 406cc393c7..39c9f73d92 100644 --- a/gtk/gtktexttag.h +++ b/gtk/gtktexttag.h @@ -47,7 +47,7 @@ * */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktexttagtable.h b/gtk/gtktexttagtable.h index ecc172d1c9..f33ae8f797 100644 --- a/gtk/gtktexttagtable.h +++ b/gtk/gtktexttagtable.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktextview.h b/gtk/gtktextview.h index c3fa8024f9..a8d65dc360 100644 --- a/gtk/gtktextview.h +++ b/gtk/gtktextview.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktipsquery.c b/gtk/gtktipsquery.c deleted file mode 100644 index 4963de2288..0000000000 --- a/gtk/gtktipsquery.c +++ /dev/null @@ -1,524 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkQueryTips: Query onscreen widgets for their tooltips - * Copyright (C) 1998 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" -#include "gtktipsquery.h" -#include "gtksignal.h" -#include "gtktooltips.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtkintl.h" - -#include "gtkalias.h" - - - -/* --- arguments --- */ -enum { - ARG_0, - ARG_EMIT_ALWAYS, - ARG_CALLER, - ARG_LABEL_INACTIVE, - ARG_LABEL_NO_TIP -}; - - -/* --- signals --- */ -enum -{ - SIGNAL_START_QUERY, - SIGNAL_STOP_QUERY, - SIGNAL_WIDGET_ENTERED, - SIGNAL_WIDGET_SELECTED, - SIGNAL_LAST -}; - -/* --- prototypes --- */ -static void gtk_tips_query_class_init (GtkTipsQueryClass *class); -static void gtk_tips_query_init (GtkTipsQuery *tips_query); -static void gtk_tips_query_destroy (GtkObject *object); -static gint gtk_tips_query_event (GtkWidget *widget, - GdkEvent *event); -static void gtk_tips_query_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_tips_query_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_tips_query_real_start_query (GtkTipsQuery *tips_query); -static void gtk_tips_query_real_stop_query (GtkTipsQuery *tips_query); -static void gtk_tips_query_widget_entered (GtkTipsQuery *tips_query, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private); - - -/* --- variables --- */ -static GtkLabelClass *parent_class = NULL; -static guint tips_query_signals[SIGNAL_LAST] = { 0 }; - - -/* --- functions --- */ -GtkType -gtk_tips_query_get_type (void) -{ - static GtkType tips_query_type = 0; - - if (!tips_query_type) - { - static const GtkTypeInfo tips_query_info = - { - "GtkTipsQuery", - sizeof (GtkTipsQuery), - sizeof (GtkTipsQueryClass), - (GtkClassInitFunc) gtk_tips_query_class_init, - (GtkObjectInitFunc) gtk_tips_query_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkTipsQuery"); - tips_query_type = gtk_type_unique (gtk_label_get_type (), &tips_query_info); - } - - return tips_query_type; -} - -static void -gtk_tips_query_class_init (GtkTipsQueryClass *class) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - - parent_class = gtk_type_class (gtk_label_get_type ()); - - - object_class->set_arg = gtk_tips_query_set_arg; - object_class->get_arg = gtk_tips_query_get_arg; - object_class->destroy = gtk_tips_query_destroy; - - widget_class->event = gtk_tips_query_event; - - class->start_query = gtk_tips_query_real_start_query; - class->stop_query = gtk_tips_query_real_stop_query; - class->widget_entered = gtk_tips_query_widget_entered; - class->widget_selected = NULL; - - gtk_object_add_arg_type ("GtkTipsQuery::emit-always", GTK_TYPE_BOOL, GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, ARG_EMIT_ALWAYS); - gtk_object_add_arg_type ("GtkTipsQuery::caller", GTK_TYPE_WIDGET, GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, ARG_CALLER); - gtk_object_add_arg_type ("GtkTipsQuery::label-inactive", GTK_TYPE_STRING, GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, ARG_LABEL_INACTIVE); - gtk_object_add_arg_type ("GtkTipsQuery::label-no-tip", GTK_TYPE_STRING, GTK_ARG_READWRITE | G_PARAM_STATIC_NAME, ARG_LABEL_NO_TIP); - - tips_query_signals[SIGNAL_START_QUERY] = - gtk_signal_new (I_("start-query"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTipsQueryClass, start_query), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - tips_query_signals[SIGNAL_STOP_QUERY] = - gtk_signal_new (I_("stop-query"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTipsQueryClass, stop_query), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - tips_query_signals[SIGNAL_WIDGET_ENTERED] = - gtk_signal_new (I_("widget-entered"), - GTK_RUN_LAST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTipsQueryClass, widget_entered), - _gtk_marshal_VOID__OBJECT_STRING_STRING, - GTK_TYPE_NONE, 3, - GTK_TYPE_WIDGET, - GTK_TYPE_STRING, - GTK_TYPE_STRING); - tips_query_signals[SIGNAL_WIDGET_SELECTED] = - g_signal_new (I_("widget-selected"), - G_TYPE_FROM_CLASS(object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GtkTipsQueryClass, widget_selected), - _gtk_boolean_handled_accumulator, NULL, - _gtk_marshal_BOOLEAN__OBJECT_STRING_STRING_BOXED, - G_TYPE_BOOLEAN, 4, - GTK_TYPE_WIDGET, - G_TYPE_STRING, - G_TYPE_STRING, - GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); -} - -static void -gtk_tips_query_init (GtkTipsQuery *tips_query) -{ - tips_query->emit_always = FALSE; - tips_query->in_query = FALSE; - tips_query->label_inactive = g_strdup (""); - tips_query->label_no_tip = g_strdup (_("--- No Tip ---")); - tips_query->caller = NULL; - tips_query->last_crossed = NULL; - tips_query->query_cursor = NULL; - - gtk_label_set_text (GTK_LABEL (tips_query), tips_query->label_inactive); -} - -static void -gtk_tips_query_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkTipsQuery *tips_query; - - tips_query = GTK_TIPS_QUERY (object); - - switch (arg_id) - { - case ARG_EMIT_ALWAYS: - tips_query->emit_always = (GTK_VALUE_BOOL (*arg) != FALSE); - break; - case ARG_CALLER: - gtk_tips_query_set_caller (tips_query, GTK_WIDGET (GTK_VALUE_OBJECT (*arg))); - break; - case ARG_LABEL_INACTIVE: - gtk_tips_query_set_labels (tips_query, GTK_VALUE_STRING (*arg), tips_query->label_no_tip); - break; - case ARG_LABEL_NO_TIP: - gtk_tips_query_set_labels (tips_query, tips_query->label_inactive, GTK_VALUE_STRING (*arg)); - break; - default: - break; - } -} - -static void -gtk_tips_query_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) -{ - GtkTipsQuery *tips_query; - - tips_query = GTK_TIPS_QUERY (object); - - switch (arg_id) - { - case ARG_EMIT_ALWAYS: - GTK_VALUE_BOOL (*arg) = tips_query->emit_always; - break; - case ARG_CALLER: - GTK_VALUE_OBJECT (*arg) = (GtkObject*) tips_query->caller; - break; - case ARG_LABEL_INACTIVE: - GTK_VALUE_STRING (*arg) = g_strdup (tips_query->label_inactive); - break; - case ARG_LABEL_NO_TIP: - GTK_VALUE_STRING (*arg) = g_strdup (tips_query->label_no_tip); - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -gtk_tips_query_destroy (GtkObject *object) -{ - GtkTipsQuery *tips_query = GTK_TIPS_QUERY (object); - - if (tips_query->in_query) - gtk_tips_query_stop_query (tips_query); - - gtk_tips_query_set_caller (tips_query, NULL); - - g_free (tips_query->label_inactive); - tips_query->label_inactive = NULL; - g_free (tips_query->label_no_tip); - tips_query->label_no_tip = NULL; - - GTK_OBJECT_CLASS (parent_class)->destroy (object); -} - -GtkWidget* -gtk_tips_query_new (void) -{ - GtkTipsQuery *tips_query; - - tips_query = gtk_type_new (gtk_tips_query_get_type ()); - - return GTK_WIDGET (tips_query); -} - -void -gtk_tips_query_set_labels (GtkTipsQuery *tips_query, - const gchar *label_inactive, - const gchar *label_no_tip) -{ - gchar *old; - - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - g_return_if_fail (label_inactive != NULL); - g_return_if_fail (label_no_tip != NULL); - - old = tips_query->label_inactive; - tips_query->label_inactive = g_strdup (label_inactive); - g_free (old); - old = tips_query->label_no_tip; - tips_query->label_no_tip = g_strdup (label_no_tip); - g_free (old); -} - -void -gtk_tips_query_set_caller (GtkTipsQuery *tips_query, - GtkWidget *caller) -{ - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - g_return_if_fail (tips_query->in_query == FALSE); - if (caller) - g_return_if_fail (GTK_IS_WIDGET (caller)); - - if (caller) - g_object_ref (caller); - - if (tips_query->caller) - g_object_unref (tips_query->caller); - - tips_query->caller = caller; -} - -void -gtk_tips_query_start_query (GtkTipsQuery *tips_query) -{ - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - g_return_if_fail (tips_query->in_query == FALSE); - g_return_if_fail (gtk_widget_get_realized (GTK_WIDGET (tips_query))); - - tips_query->in_query = TRUE; - gtk_signal_emit (GTK_OBJECT (tips_query), tips_query_signals[SIGNAL_START_QUERY]); -} - -void -gtk_tips_query_stop_query (GtkTipsQuery *tips_query) -{ - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - g_return_if_fail (tips_query->in_query == TRUE); - - gtk_signal_emit (GTK_OBJECT (tips_query), tips_query_signals[SIGNAL_STOP_QUERY]); - tips_query->in_query = FALSE; -} - -static void -gtk_tips_query_real_start_query (GtkTipsQuery *tips_query) -{ - gint failure; - - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - - tips_query->query_cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (tips_query)), - GDK_QUESTION_ARROW); - failure = gdk_pointer_grab (GTK_WIDGET (tips_query)->window, - TRUE, - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | - GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK, - NULL, - tips_query->query_cursor, - GDK_CURRENT_TIME); - if (failure) - { - gdk_cursor_unref (tips_query->query_cursor); - tips_query->query_cursor = NULL; - } - gtk_grab_add (GTK_WIDGET (tips_query)); -} - -static void -gtk_tips_query_real_stop_query (GtkTipsQuery *tips_query) -{ - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - - gtk_grab_remove (GTK_WIDGET (tips_query)); - if (tips_query->query_cursor) - { - gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (tips_query)), - GDK_CURRENT_TIME); - gdk_cursor_unref (tips_query->query_cursor); - tips_query->query_cursor = NULL; - } - if (tips_query->last_crossed) - { - g_object_unref (tips_query->last_crossed); - tips_query->last_crossed = NULL; - } - - gtk_label_set_text (GTK_LABEL (tips_query), tips_query->label_inactive); -} - -static void -gtk_tips_query_widget_entered (GtkTipsQuery *tips_query, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private) -{ - g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query)); - - if (!tip_text) - tip_text = tips_query->label_no_tip; - - if (!g_str_equal (GTK_LABEL (tips_query)->label, (gchar*) tip_text)) - gtk_label_set_text (GTK_LABEL (tips_query), tip_text); -} - -static void -gtk_tips_query_emit_widget_entered (GtkTipsQuery *tips_query, - GtkWidget *widget) -{ - GtkTooltipsData *tdata; - - if (widget == (GtkWidget*) tips_query) - widget = NULL; - - if (widget) - tdata = gtk_tooltips_data_get (widget); - else - tdata = NULL; - - if (!widget && tips_query->last_crossed) - { - gtk_signal_emit (GTK_OBJECT (tips_query), - tips_query_signals[SIGNAL_WIDGET_ENTERED], - NULL, - NULL, - NULL); - g_object_unref (tips_query->last_crossed); - tips_query->last_crossed = NULL; - } - else if (widget && widget != tips_query->last_crossed) - { - g_object_ref (widget); - if (tdata || tips_query->emit_always) - gtk_signal_emit (GTK_OBJECT (tips_query), - tips_query_signals[SIGNAL_WIDGET_ENTERED], - widget, - tdata ? tdata->tip_text : NULL, - tdata ? tdata->tip_private : NULL); - if (tips_query->last_crossed) - g_object_unref (tips_query->last_crossed); - tips_query->last_crossed = widget; - } -} - -static gint -gtk_tips_query_event (GtkWidget *widget, - GdkEvent *event) -{ - GtkTipsQuery *tips_query; - GtkWidget *event_widget; - gboolean event_handled; - - g_return_val_if_fail (GTK_IS_TIPS_QUERY (widget), FALSE); - - tips_query = GTK_TIPS_QUERY (widget); - if (!tips_query->in_query) - { - if (GTK_WIDGET_CLASS (parent_class)->event) - return GTK_WIDGET_CLASS (parent_class)->event (widget, event); - else - return FALSE; - } - - event_widget = gtk_get_event_widget (event); - - event_handled = FALSE; - switch (event->type) - { - GdkWindow *pointer_window; - - case GDK_LEAVE_NOTIFY: - if (event_widget) - pointer_window = gdk_window_get_pointer (event_widget->window, NULL, NULL, NULL); - else - pointer_window = NULL; - event_widget = NULL; - if (pointer_window) - { - gpointer event_widget_ptr; - gdk_window_get_user_data (pointer_window, &event_widget_ptr); - event_widget = event_widget_ptr; - } - gtk_tips_query_emit_widget_entered (tips_query, event_widget); - event_handled = TRUE; - break; - - case GDK_ENTER_NOTIFY: - gtk_tips_query_emit_widget_entered (tips_query, event_widget); - event_handled = TRUE; - break; - - case GDK_BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - if (event_widget) - { - if (event_widget == (GtkWidget*) tips_query || - event_widget == tips_query->caller) - gtk_tips_query_stop_query (tips_query); - else - { - gint stop; - GtkTooltipsData *tdata; - - stop = TRUE; - tdata = gtk_tooltips_data_get (event_widget); - if (tdata || tips_query->emit_always) - gtk_signal_emit (GTK_OBJECT (tips_query), - tips_query_signals[SIGNAL_WIDGET_SELECTED], - event_widget, - tdata ? tdata->tip_text : NULL, - tdata ? tdata->tip_private : NULL, - event, - &stop); - - if (stop) - gtk_tips_query_stop_query (tips_query); - } - } - event_handled = TRUE; - break; - - default: - break; - } - - return event_handled; -} - -#define __GTK_TIPS_QUERY_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtktipsquery.h b/gtk/gtktipsquery.h deleted file mode 100644 index b792d81219..0000000000 --- a/gtk/gtktipsquery.h +++ /dev/null @@ -1,110 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * GtkQueryTips: Query onscreen widgets for their tooltips - * Copyright (C) 1998 Tim Janik - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_TIPS_QUERY_H__ -#define __GTK_TIPS_QUERY_H__ - - -#include <gtk/gtk.h> - - -G_BEGIN_DECLS - -/* --- type macros --- */ -#define GTK_TYPE_TIPS_QUERY (gtk_tips_query_get_type ()) -#define GTK_TIPS_QUERY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TIPS_QUERY, GtkTipsQuery)) -#define GTK_TIPS_QUERY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TIPS_QUERY, GtkTipsQueryClass)) -#define GTK_IS_TIPS_QUERY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TIPS_QUERY)) -#define GTK_IS_TIPS_QUERY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TIPS_QUERY)) -#define GTK_TIPS_QUERY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TIPS_QUERY, GtkTipsQueryClass)) - - -/* --- typedefs --- */ -typedef struct _GtkTipsQuery GtkTipsQuery; -typedef struct _GtkTipsQueryClass GtkTipsQueryClass; - - -/* --- structures --- */ -struct _GtkTipsQuery -{ - GtkLabel label; - - guint emit_always : 1; - guint in_query : 1; - gchar *label_inactive; - gchar *label_no_tip; - - GtkWidget *caller; - GtkWidget *last_crossed; - - GdkCursor *query_cursor; -}; - -struct _GtkTipsQueryClass -{ - GtkLabelClass parent_class; - - void (*start_query) (GtkTipsQuery *tips_query); - void (*stop_query) (GtkTipsQuery *tips_query); - void (*widget_entered) (GtkTipsQuery *tips_query, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private); - gint (*widget_selected) (GtkTipsQuery *tips_query, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private, - GdkEventButton *event); - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - - -/* --- prototypes --- */ -GType gtk_tips_query_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_tips_query_new (void); -void gtk_tips_query_start_query (GtkTipsQuery *tips_query); -void gtk_tips_query_stop_query (GtkTipsQuery *tips_query); -void gtk_tips_query_set_caller (GtkTipsQuery *tips_query, - GtkWidget *caller); -void gtk_tips_query_set_labels (GtkTipsQuery *tips_query, - const gchar *label_inactive, - const gchar *label_no_tip); - -G_END_DECLS - -#endif /* __GTK_TIPS_QUERY_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtktoggleaction.h b/gtk/gtktoggleaction.h index 5f72546326..2cdf3fd184 100644 --- a/gtk/gtktoggleaction.h +++ b/gtk/gtktoggleaction.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktogglebutton.h b/gtk/gtktogglebutton.h index 686dab8614..321b472ffb 100644 --- a/gtk/gtktogglebutton.h +++ b/gtk/gtktogglebutton.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -88,10 +88,6 @@ void gtk_toggle_button_set_inconsistent (GtkToggleButton *toggle_button, gboolean gtk_toggle_button_get_inconsistent (GtkToggleButton *toggle_button); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_toggle_button_set_state gtk_toggle_button_set_active -#endif /* GTK_DISABLE_DEPRECATED */ - G_END_DECLS #endif /* __GTK_TOGGLE_BUTTON_H__ */ diff --git a/gtk/gtktoggletoolbutton.h b/gtk/gtktoggletoolbutton.h index bc04d1e45e..90314327c9 100644 --- a/gtk/gtktoggletoolbutton.h +++ b/gtk/gtktoggletoolbutton.h @@ -20,7 +20,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index b56abdf462..dcd0bc988b 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -219,20 +219,7 @@ static void gtk_toolbar_arrow_button_clicked (GtkWidget *button, GtkToolbar *toolbar); static void gtk_toolbar_update_button_relief (GtkToolbar *toolbar); static gboolean gtk_toolbar_popup_menu (GtkWidget *toolbar); -static GtkWidget *internal_insert_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data, - gint position, - gboolean use_stock); static void gtk_toolbar_reconfigured (GtkToolbar *toolbar); -static gboolean gtk_toolbar_check_new_api (GtkToolbar *toolbar); -static gboolean gtk_toolbar_check_old_api (GtkToolbar *toolbar); static GtkReliefStyle get_button_relief (GtkToolbar *toolbar); static gint get_internal_padding (GtkToolbar *toolbar); @@ -246,12 +233,6 @@ static ToolbarContent *toolbar_content_new_tool_item (GtkToolbar GtkToolItem *item, gboolean is_placeholder, gint pos); -static ToolbarContent *toolbar_content_new_compatibility (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - GtkWidget *icon, - GtkWidget *label, - gint pos); static void toolbar_content_remove (ToolbarContent *content, GtkToolbar *toolbar); static void toolbar_content_free (ToolbarContent *content); @@ -503,23 +484,6 @@ gtk_toolbar_class_init (GtkToolbarClass *klass) P_("If an arrow should be shown if the toolbar doesn't fit"), TRUE, GTK_PARAM_READWRITE)); - - - /** - * GtkToolbar:tooltips: - * - * If the tooltips of the toolbar should be active or not. - * - * Since: 2.8 - */ - g_object_class_install_property (gobject_class, - PROP_TOOLTIPS, - g_param_spec_boolean ("tooltips", - P_("Tooltips"), - P_("If the tooltips of the toolbar should be active or not"), - TRUE, - GTK_PARAM_READWRITE)); - /** * GtkToolbar:icon-size: @@ -676,9 +640,7 @@ gtk_toolbar_init (GtkToolbar *toolbar) toolbar->style = DEFAULT_TOOLBAR_STYLE; toolbar->icon_size = DEFAULT_ICON_SIZE; priv->animation = DEFAULT_ANIMATION_STATE; - toolbar->tooltips = gtk_tooltips_new (); - g_object_ref_sink (toolbar->tooltips); - + priv->arrow_button = gtk_toggle_button_new (); g_signal_connect (priv->arrow_button, "button-press-event", G_CALLBACK (gtk_toolbar_arrow_button_press), toolbar); @@ -728,9 +690,6 @@ gtk_toolbar_set_property (GObject *object, case PROP_SHOW_ARROW: gtk_toolbar_set_show_arrow (toolbar, g_value_get_boolean (value)); break; - case PROP_TOOLTIPS: - gtk_toolbar_set_tooltips (toolbar, g_value_get_boolean (value)); - break; case PROP_ICON_SIZE: gtk_toolbar_set_icon_size (toolbar, g_value_get_int (value)); break; @@ -766,9 +725,6 @@ gtk_toolbar_get_property (GObject *object, case PROP_SHOW_ARROW: g_value_set_boolean (value, priv->show_arrow); break; - case PROP_TOOLTIPS: - g_value_set_boolean (value, gtk_toolbar_get_tooltips (toolbar)); - break; case PROP_ICON_SIZE: g_value_set_int (value, gtk_toolbar_get_icon_size (toolbar)); break; @@ -2283,8 +2239,6 @@ gtk_toolbar_set_drop_highlight_item (GtkToolbar *toolbar, g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); g_return_if_fail (tool_item == NULL || GTK_IS_TOOL_ITEM (tool_item)); - gtk_toolbar_check_new_api (toolbar); - priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); if (!tool_item) @@ -2466,10 +2420,7 @@ gtk_toolbar_add (GtkContainer *container, { GtkToolbar *toolbar = GTK_TOOLBAR (container); - if (GTK_IS_TOOL_ITEM (widget)) - gtk_toolbar_insert (toolbar, GTK_TOOL_ITEM (widget), -1); - else - gtk_toolbar_append_widget (toolbar, widget, NULL, NULL); + gtk_toolbar_insert (toolbar, GTK_TOOL_ITEM (widget), -1); } static void @@ -2763,9 +2714,6 @@ gtk_toolbar_insert (GtkToolbar *toolbar, g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); g_return_if_fail (GTK_IS_TOOL_ITEM (item)); - if (!gtk_toolbar_check_new_api (toolbar)) - return; - if (pos >= 0) pos = logical_to_physical (toolbar, pos); @@ -2796,9 +2744,6 @@ gtk_toolbar_get_item_index (GtkToolbar *toolbar, g_return_val_if_fail (GTK_IS_TOOL_ITEM (item), -1); g_return_val_if_fail (GTK_WIDGET (item)->parent == GTK_WIDGET (toolbar), -1); - if (!gtk_toolbar_check_new_api (toolbar)) - return -1; - priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); n = 0; @@ -2819,43 +2764,6 @@ gtk_toolbar_get_item_index (GtkToolbar *toolbar, } /** - * gtk_toolbar_set_orientation: - * @toolbar: a #GtkToolbar. - * @orientation: a new #GtkOrientation. - * - * Sets whether a toolbar should appear horizontally or vertically. - * - * Deprecated: 2.16: Use gtk_orientable_set_orientation() instead. - **/ -void -gtk_toolbar_set_orientation (GtkToolbar *toolbar, - GtkOrientation orientation) -{ - g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); - - g_signal_emit (toolbar, toolbar_signals[ORIENTATION_CHANGED], 0, orientation); -} - -/** - * gtk_toolbar_get_orientation: - * @toolbar: a #GtkToolbar - * - * Retrieves the current orientation of the toolbar. See - * gtk_toolbar_set_orientation(). - * - * Return value: the orientation - * - * Deprecated: 2.16: Use gtk_orientable_get_orientation() instead. - **/ -GtkOrientation -gtk_toolbar_get_orientation (GtkToolbar *toolbar) -{ - g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), GTK_ORIENTATION_HORIZONTAL); - - return toolbar->orientation; -} - -/** * gtk_toolbar_set_style: * @toolbar: a #GtkToolbar. * @style: the new style for @toolbar. @@ -2922,50 +2830,6 @@ gtk_toolbar_unset_style (GtkToolbar *toolbar) } /** - * gtk_toolbar_set_tooltips: - * @toolbar: a #GtkToolbar. - * @enable: set to %FALSE to disable the tooltips, or %TRUE to enable them. - * - * Sets if the tooltips of a toolbar should be active or not. - * - * Deprecated: 2.14: The toolkit-wide #GtkSettings:gtk-enable-tooltips property - * is now used instead. - **/ -void -gtk_toolbar_set_tooltips (GtkToolbar *toolbar, - gboolean enable) -{ - g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); - - if (enable) - gtk_tooltips_enable (toolbar->tooltips); - else - gtk_tooltips_disable (toolbar->tooltips); - - g_object_notify (G_OBJECT (toolbar), "tooltips"); -} - -/** - * gtk_toolbar_get_tooltips: - * @toolbar: a #GtkToolbar - * - * Retrieves whether tooltips are enabled. See - * gtk_toolbar_set_tooltips(). - * - * Return value: %TRUE if tooltips are enabled - * - * Deprecated: 2.14: The toolkit-wide #GtkSettings:gtk-enable-tooltips property - * is now used instead. - **/ -gboolean -gtk_toolbar_get_tooltips (GtkToolbar *toolbar) -{ - g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), FALSE); - - return TRUE; -} - -/** * gtk_toolbar_get_n_items: * @toolbar: a #GtkToolbar * @@ -2982,9 +2846,6 @@ gtk_toolbar_get_n_items (GtkToolbar *toolbar) g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), -1); - if (!gtk_toolbar_check_new_api (toolbar)) - return -1; - priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); return physical_to_logical (toolbar, g_list_length (priv->content)); @@ -3013,9 +2874,6 @@ gtk_toolbar_get_nth_item (GtkToolbar *toolbar, g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL); - if (!gtk_toolbar_check_new_api (toolbar)) - return NULL; - n_items = gtk_toolbar_get_n_items (toolbar); if (n < 0 || n >= n_items) @@ -3120,9 +2978,6 @@ gtk_toolbar_get_show_arrow (GtkToolbar *toolbar) g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), FALSE); - if (!gtk_toolbar_check_new_api (toolbar)) - return FALSE; - priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); return priv->show_arrow; @@ -3152,9 +3007,6 @@ gtk_toolbar_get_drop_index (GtkToolbar *toolbar, { g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), -1); - if (!gtk_toolbar_check_new_api (toolbar)) - return -1; - return physical_to_logical (toolbar, find_drop_index (toolbar, x, y)); } @@ -3165,9 +3017,6 @@ gtk_toolbar_finalize (GObject *object) GtkToolbar *toolbar = GTK_TOOLBAR (object); GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); - if (toolbar->tooltips) - g_object_unref (toolbar->tooltips); - if (priv->arrow_button) gtk_widget_unparent (priv->arrow_button); @@ -3269,458 +3118,6 @@ gtk_toolbar_unset_icon_size (GtkToolbar *toolbar) } } -/* - * Deprecated API - */ - -/** - * gtk_toolbar_append_item: - * @toolbar: a #GtkToolbar. - * @text: give your toolbar button a label. - * @tooltip_text: a string that appears when the user holds the mouse over this item. - * @tooltip_private_text: use with #GtkTipsQuery. - * @icon: a #GtkWidget that should be used as the button's icon. - * @callback: the function to be executed when the button is pressed. - * @user_data: a pointer to any data you wish to be passed to the callback. - * - * Inserts a new item into the toolbar. You must specify the position - * in the toolbar where it will be inserted. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Return value: the new toolbar item as a #GtkWidget. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -GtkWidget * -gtk_toolbar_append_item (GtkToolbar *toolbar, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data) -{ - return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON, - NULL, text, - tooltip_text, tooltip_private_text, - icon, callback, user_data, - toolbar->num_children); -} - -/** - * gtk_toolbar_prepend_item: - * @toolbar: a #GtkToolbar. - * @text: give your toolbar button a label. - * @tooltip_text: a string that appears when the user holds the mouse over this item. - * @tooltip_private_text: use with #GtkTipsQuery. - * @icon: a #GtkWidget that should be used as the button's icon. - * @callback: the function to be executed when the button is pressed. - * @user_data: a pointer to any data you wish to be passed to the callback. - * - * Adds a new button to the beginning (top or left edges) of the given toolbar. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Return value: the new toolbar item as a #GtkWidget. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -GtkWidget * -gtk_toolbar_prepend_item (GtkToolbar *toolbar, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data) -{ - return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON, - NULL, text, - tooltip_text, tooltip_private_text, - icon, callback, user_data, - 0); -} - -/** - * gtk_toolbar_insert_item: - * @toolbar: a #GtkToolbar. - * @text: give your toolbar button a label. - * @tooltip_text: a string that appears when the user holds the mouse over this item. - * @tooltip_private_text: use with #GtkTipsQuery. - * @icon: a #GtkWidget that should be used as the button's icon. - * @callback: the function to be executed when the button is pressed. - * @user_data: a pointer to any data you wish to be passed to the callback. - * @position: the number of widgets to insert this item after. - * - * Inserts a new item into the toolbar. You must specify the position in the - * toolbar where it will be inserted. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Return value: the new toolbar item as a #GtkWidget. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -GtkWidget * -gtk_toolbar_insert_item (GtkToolbar *toolbar, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data, - gint position) -{ - return gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON, - NULL, text, - tooltip_text, tooltip_private_text, - icon, callback, user_data, - position); -} - -/** - * gtk_toolbar_insert_stock: - * @toolbar: A #GtkToolbar - * @stock_id: The id of the stock item you want to insert - * @tooltip_text: The text in the tooltip of the toolbar button - * @tooltip_private_text: The private text of the tooltip - * @callback: The callback called when the toolbar button is clicked. - * @user_data: user data passed to callback - * @position: The position the button shall be inserted at. - * -1 means at the end. - * - * Inserts a stock item at the specified position of the toolbar. If - * @stock_id is not a known stock item ID, it's inserted verbatim, - * except that underscores used to mark mnemonics are removed. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Returns: the inserted widget - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - */ -GtkWidget* -gtk_toolbar_insert_stock (GtkToolbar *toolbar, - const gchar *stock_id, - const char *tooltip_text, - const char *tooltip_private_text, - GCallback callback, - gpointer user_data, - gint position) -{ - return internal_insert_element (toolbar, GTK_TOOLBAR_CHILD_BUTTON, - NULL, stock_id, - tooltip_text, tooltip_private_text, - NULL, callback, user_data, - position, TRUE); -} - -/** - * gtk_toolbar_append_space: - * @toolbar: a #GtkToolbar. - * - * Adds a new space to the end of the toolbar. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_append_space (GtkToolbar *toolbar) -{ - gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE, - NULL, NULL, - NULL, NULL, - NULL, NULL, NULL, - toolbar->num_children); -} - -/** - * gtk_toolbar_prepend_space: - * @toolbar: a #GtkToolbar. - * - * Adds a new space to the beginning of the toolbar. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_prepend_space (GtkToolbar *toolbar) -{ - gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE, - NULL, NULL, - NULL, NULL, - NULL, NULL, NULL, - 0); -} - -/** - * gtk_toolbar_insert_space: - * @toolbar: a #GtkToolbar - * @position: the number of widgets after which a space should be inserted. - * - * Inserts a new space in the toolbar at the specified position. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_insert_space (GtkToolbar *toolbar, - gint position) -{ - gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_SPACE, - NULL, NULL, - NULL, NULL, - NULL, NULL, NULL, - position); -} - -/** - * gtk_toolbar_remove_space: - * @toolbar: a #GtkToolbar. - * @position: the index of the space to remove. - * - * Removes a space from the specified position. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_remove_space (GtkToolbar *toolbar, - gint position) -{ - GtkToolbarPrivate *priv; - ToolbarContent *content; - - g_return_if_fail (GTK_IS_TOOLBAR (toolbar)); - - if (!gtk_toolbar_check_old_api (toolbar)) - return; - - priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); - - content = g_list_nth_data (priv->content, position); - - if (!content) - { - g_warning ("Toolbar position %d doesn't exist", position); - return; - } - - if (!toolbar_content_is_separator (content)) - { - g_warning ("Toolbar position %d is not a space", position); - return; - } - - toolbar_content_remove (content, toolbar); - toolbar_content_free (content); -} - -/** - * gtk_toolbar_append_widget: - * @toolbar: a #GtkToolbar. - * @widget: a #GtkWidget to add to the toolbar. - * @tooltip_text: (allow-none): the element's tooltip. - * @tooltip_private_text: (allow-none): used for context-sensitive help about this toolbar element. - * - * Adds a widget to the end of the given toolbar. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_append_widget (GtkToolbar *toolbar, - GtkWidget *widget, - const gchar *tooltip_text, - const gchar *tooltip_private_text) -{ - gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET, - widget, NULL, - tooltip_text, tooltip_private_text, - NULL, NULL, NULL, - toolbar->num_children); -} - -/** - * gtk_toolbar_prepend_widget: - * @toolbar: a #GtkToolbar. - * @widget: a #GtkWidget to add to the toolbar. - * @tooltip_text: (allow-none): the element's tooltip. - * @tooltip_private_text: (allow-none): used for context-sensitive help about this toolbar element. - * - * Adds a widget to the beginning of the given toolbar. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_prepend_widget (GtkToolbar *toolbar, - GtkWidget *widget, - const gchar *tooltip_text, - const gchar *tooltip_private_text) -{ - gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET, - widget, NULL, - tooltip_text, tooltip_private_text, - NULL, NULL, NULL, - 0); -} - -/** - * gtk_toolbar_insert_widget: - * @toolbar: a #GtkToolbar. - * @widget: a #GtkWidget to add to the toolbar. - * @tooltip_text: (allow-none): the element's tooltip. - * @tooltip_private_text: (allow-none): used for context-sensitive help about this toolbar element. - * @position: the number of widgets to insert this widget after. - * - * Inserts a widget in the toolbar at the given position. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -void -gtk_toolbar_insert_widget (GtkToolbar *toolbar, - GtkWidget *widget, - const char *tooltip_text, - const char *tooltip_private_text, - gint position) -{ - gtk_toolbar_insert_element (toolbar, GTK_TOOLBAR_CHILD_WIDGET, - widget, NULL, - tooltip_text, tooltip_private_text, - NULL, NULL, NULL, - position); -} - -/** - * gtk_toolbar_append_element: - * @toolbar: a #GtkToolbar. - * @type: a value of type #GtkToolbarChildType that determines what @widget will be. - * @widget: (allow-none): a #GtkWidget, or %NULL. - * @text: the element's label. - * @tooltip_text: the element's tooltip. - * @tooltip_private_text: used for context-sensitive help about this toolbar element. - * @icon: a #GtkWidget that provides pictorial representation of the element's function. - * @callback: the function to be executed when the button is pressed. - * @user_data: any data you wish to pass to the callback. - * - * Adds a new element to the end of a toolbar. - * - * If @type == %GTK_TOOLBAR_CHILD_WIDGET, @widget is used as the new element. - * If @type == %GTK_TOOLBAR_CHILD_RADIOBUTTON, @widget is used to determine - * the radio group for the new element. In all other cases, @widget must - * be %NULL. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Return value: the new toolbar element as a #GtkWidget. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -GtkWidget* -gtk_toolbar_append_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data) -{ - return gtk_toolbar_insert_element (toolbar, type, widget, text, - tooltip_text, tooltip_private_text, - icon, callback, user_data, - toolbar->num_children); -} - -/** - * gtk_toolbar_prepend_element: - * @toolbar: a #GtkToolbar. - * @type: a value of type #GtkToolbarChildType that determines what @widget will be. - * @widget: (allow-none): a #GtkWidget, or %NULL - * @text: the element's label. - * @tooltip_text: the element's tooltip. - * @tooltip_private_text: used for context-sensitive help about this toolbar element. - * @icon: a #GtkWidget that provides pictorial representation of the element's function. - * @callback: the function to be executed when the button is pressed. - * @user_data: any data you wish to pass to the callback. - * - * Adds a new element to the beginning of a toolbar. - * - * If @type == %GTK_TOOLBAR_CHILD_WIDGET, @widget is used as the new element. - * If @type == %GTK_TOOLBAR_CHILD_RADIOBUTTON, @widget is used to determine - * the radio group for the new element. In all other cases, @widget must - * be %NULL. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Return value: the new toolbar element as a #GtkWidget. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -GtkWidget * -gtk_toolbar_prepend_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data) -{ - return gtk_toolbar_insert_element (toolbar, type, widget, text, - tooltip_text, tooltip_private_text, - icon, callback, user_data, 0); -} - -/** - * gtk_toolbar_insert_element: - * @toolbar: a #GtkToolbar. - * @type: a value of type #GtkToolbarChildType that determines what @widget - * will be. - * @widget: (allow-none): a #GtkWidget, or %NULL. - * @text: the element's label. - * @tooltip_text: the element's tooltip. - * @tooltip_private_text: used for context-sensitive help about this toolbar element. - * @icon: a #GtkWidget that provides pictorial representation of the element's function. - * @callback: the function to be executed when the button is pressed. - * @user_data: any data you wish to pass to the callback. - * @position: the number of widgets to insert this element after. - * - * Inserts a new element in the toolbar at the given position. - * - * If @type == %GTK_TOOLBAR_CHILD_WIDGET, @widget is used as the new element. - * If @type == %GTK_TOOLBAR_CHILD_RADIOBUTTON, @widget is used to determine - * the radio group for the new element. In all other cases, @widget must - * be %NULL. - * - * @callback must be a pointer to a function taking a #GtkWidget and a gpointer as - * arguments. Use G_CALLBACK() to cast the function to #GCallback. - * - * Return value: the new toolbar element as a #GtkWidget. - * - * Deprecated: 2.4: Use gtk_toolbar_insert() instead. - **/ -GtkWidget * -gtk_toolbar_insert_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data, - gint position) -{ - return internal_insert_element (toolbar, type, widget, text, - tooltip_text, tooltip_private_text, - icon, callback, user_data, position, FALSE); -} - static void set_child_packing_and_visibility(GtkToolbar *toolbar, GtkToolbarChild *child) @@ -3759,138 +3156,6 @@ set_child_packing_and_visibility(GtkToolbar *toolbar, } } -static GtkWidget * -internal_insert_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data, - gint position, - gboolean use_stock) -{ - GtkWidget *box; - ToolbarContent *content; - char *free_me = NULL; - - GtkWidget *child_widget; - GtkWidget *child_label; - GtkWidget *child_icon; - - g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL); - if (type == GTK_TOOLBAR_CHILD_WIDGET) - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON) - g_return_val_if_fail (widget == NULL, NULL); - if (GTK_IS_TOOL_ITEM (widget)) - g_warning (MIXED_API_WARNING); - - if (!gtk_toolbar_check_old_api (toolbar)) - return NULL; - - child_widget = NULL; - child_label = NULL; - child_icon = NULL; - - switch (type) - { - case GTK_TOOLBAR_CHILD_SPACE: - break; - - case GTK_TOOLBAR_CHILD_WIDGET: - child_widget = widget; - break; - - case GTK_TOOLBAR_CHILD_BUTTON: - case GTK_TOOLBAR_CHILD_TOGGLEBUTTON: - case GTK_TOOLBAR_CHILD_RADIOBUTTON: - if (type == GTK_TOOLBAR_CHILD_BUTTON) - { - child_widget = gtk_button_new (); - } - else if (type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON) - { - child_widget = gtk_toggle_button_new (); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child_widget), FALSE); - } - else /* type == GTK_TOOLBAR_CHILD_RADIOBUTTON */ - { - GSList *group = NULL; - - if (widget) - group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget)); - - child_widget = gtk_radio_button_new (group); - gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (child_widget), FALSE); - } - - gtk_button_set_relief (GTK_BUTTON (child_widget), get_button_relief (toolbar)); - gtk_button_set_focus_on_click (GTK_BUTTON (child_widget), FALSE); - - if (callback) - { - g_signal_connect (child_widget, "clicked", - callback, user_data); - } - - if (toolbar->style == GTK_TOOLBAR_BOTH_HORIZ) - box = gtk_hbox_new (FALSE, 0); - else - box = gtk_vbox_new (FALSE, 0); - - gtk_container_add (GTK_CONTAINER (child_widget), box); - gtk_widget_show (box); - - if (text && use_stock) - { - GtkStockItem stock_item; - if (gtk_stock_lookup (text, &stock_item)) - { - if (!icon) - icon = gtk_image_new_from_stock (text, toolbar->icon_size); - - text = free_me = _gtk_toolbar_elide_underscores (stock_item.label); - } - } - - if (text) - { - child_label = gtk_label_new (text); - - gtk_container_add (GTK_CONTAINER (box), child_label); - } - - if (icon) - { - child_icon = GTK_WIDGET (icon); - gtk_container_add (GTK_CONTAINER (box), child_icon); - } - - gtk_widget_show (child_widget); - break; - - default: - g_assert_not_reached (); - break; - } - - if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text) - { - gtk_tooltips_set_tip (toolbar->tooltips, child_widget, - tooltip_text, tooltip_private_text); - } - - content = toolbar_content_new_compatibility (toolbar, type, child_widget, - child_icon, child_label, position); - - g_free (free_me); - - return child_widget; -} - /* * ToolbarContent methods */ @@ -3959,54 +3224,6 @@ toolbar_content_new_tool_item (GtkToolbar *toolbar, return content; } -static ToolbarContent * -toolbar_content_new_compatibility (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - GtkWidget *icon, - GtkWidget *label, - gint pos) -{ - ToolbarContent *content; - GtkToolbarChild *child; - GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); - - content = g_slice_new0 (ToolbarContent); - - child = &(content->u.compatibility.child); - - content->type = COMPATIBILITY; - child->type = type; - child->widget = widget; - child->icon = icon; - child->label = label; - - if (type != GTK_TOOLBAR_CHILD_SPACE) - { - gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar)); - } - else - { - content->u.compatibility.space_visible = TRUE; - gtk_widget_queue_resize (GTK_WIDGET (toolbar)); - } - - if (type == GTK_TOOLBAR_CHILD_BUTTON || - type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON || - type == GTK_TOOLBAR_CHILD_RADIOBUTTON) - { - set_child_packing_and_visibility (toolbar, child); - } - - priv->content = g_list_insert (priv->content, content, pos); - toolbar->children = g_list_insert (toolbar->children, child, pos); - priv->need_rebuild = TRUE; - - toolbar->num_children++; - - return content; -} - static void toolbar_content_remove (ToolbarContent *content, GtkToolbar *toolbar) @@ -4824,39 +4041,6 @@ get_shadow_type (GtkToolbar *toolbar) return shadow_type; } -/* - * API checks - */ -static gboolean -gtk_toolbar_check_old_api (GtkToolbar *toolbar) -{ - GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); - - if (priv->api_mode == NEW_API) - { - g_warning (MIXED_API_WARNING); - return FALSE; - } - - priv->api_mode = OLD_API; - return TRUE; -} - -static gboolean -gtk_toolbar_check_new_api (GtkToolbar *toolbar) -{ - GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); - - if (priv->api_mode == OLD_API) - { - g_warning (MIXED_API_WARNING); - return FALSE; - } - - priv->api_mode = NEW_API; - return TRUE; -} - /* GTK+ internal methods */ gint diff --git a/gtk/gtktoolbar.h b/gtk/gtktoolbar.h index 333b328871..89af1d82a5 100644 --- a/gtk/gtktoolbar.h +++ b/gtk/gtktoolbar.h @@ -29,7 +29,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -38,19 +38,11 @@ #include <gtk/gtkcontainer.h> -#include <gtk/gtktooltips.h> #include <gtk/gtktoolitem.h> -#ifndef GTK_DISABLE_DEPRECATED - -/* Not needed, retained for compatibility -Yosh */ -#include <gtk/gtkpixmap.h> -#include <gtk/gtksignal.h> - -#endif /* GTK_DISABLE_DEPRECATED */ - G_BEGIN_DECLS + #define GTK_TYPE_TOOLBAR (gtk_toolbar_get_type ()) #define GTK_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TOOLBAR, GtkToolbar)) #define GTK_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TOOLBAR, GtkToolbarClass)) @@ -101,12 +93,6 @@ struct _GtkToolbar GtkToolbarStyle GSEAL (style); GtkIconSize GSEAL (icon_size); -#ifndef GTK_DISABLE_DEPRECATED - GtkTooltips *GSEAL (tooltips); -#else - gpointer GSEAL (_tooltips); -#endif - /*< private >*/ gint GSEAL (button_maxw); /* maximum width of homogeneous children */ gint GSEAL (button_maxh); /* maximum height of homogeneous children */ @@ -183,106 +169,6 @@ void _gtk_toolbar_paint_space_line (GtkWidget *widget gint _gtk_toolbar_get_default_space_size (void); - -#ifndef GTK_DISABLE_DEPRECATED - -GtkOrientation gtk_toolbar_get_orientation (GtkToolbar *toolbar); -void gtk_toolbar_set_orientation (GtkToolbar *toolbar, - GtkOrientation orientation); -gboolean gtk_toolbar_get_tooltips (GtkToolbar *toolbar); -void gtk_toolbar_set_tooltips (GtkToolbar *toolbar, - gboolean enable); - -/* Simple button items */ -GtkWidget* gtk_toolbar_append_item (GtkToolbar *toolbar, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data); -GtkWidget* gtk_toolbar_prepend_item (GtkToolbar *toolbar, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data); -GtkWidget* gtk_toolbar_insert_item (GtkToolbar *toolbar, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data, - gint position); - -/* Stock Items */ -GtkWidget* gtk_toolbar_insert_stock (GtkToolbar *toolbar, - const gchar *stock_id, - const char *tooltip_text, - const char *tooltip_private_text, - GCallback callback, - gpointer user_data, - gint position); - -/* Space Items */ -void gtk_toolbar_append_space (GtkToolbar *toolbar); -void gtk_toolbar_prepend_space (GtkToolbar *toolbar); -void gtk_toolbar_insert_space (GtkToolbar *toolbar, - gint position); -void gtk_toolbar_remove_space (GtkToolbar *toolbar, - gint position); -/* Any element type */ -GtkWidget* gtk_toolbar_append_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data); - -GtkWidget* gtk_toolbar_prepend_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data); - -GtkWidget* gtk_toolbar_insert_element (GtkToolbar *toolbar, - GtkToolbarChildType type, - GtkWidget *widget, - const char *text, - const char *tooltip_text, - const char *tooltip_private_text, - GtkWidget *icon, - GCallback callback, - gpointer user_data, - gint position); - -/* Generic Widgets */ -void gtk_toolbar_append_widget (GtkToolbar *toolbar, - GtkWidget *widget, - const char *tooltip_text, - const char *tooltip_private_text); -void gtk_toolbar_prepend_widget (GtkToolbar *toolbar, - GtkWidget *widget, - const char *tooltip_text, - const char *tooltip_private_text); -void gtk_toolbar_insert_widget (GtkToolbar *toolbar, - GtkWidget *widget, - const char *tooltip_text, - const char *tooltip_private_text, - gint position); - -#endif /* GTK_DISABLE_DEPRECATED */ - - G_END_DECLS #endif /* __GTK_TOOLBAR_H__ */ diff --git a/gtk/gtktoolbutton.h b/gtk/gtktoolbutton.h index cacabe1700..e9ba386a16 100644 --- a/gtk/gtktoolbutton.h +++ b/gtk/gtktoolbutton.h @@ -20,7 +20,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktoolitem.c b/gtk/gtktoolitem.c index 606ce1e847..536392c4f3 100644 --- a/gtk/gtktoolitem.c +++ b/gtk/gtktoolitem.c @@ -24,8 +24,6 @@ #include <string.h> -#undef GTK_DISABLE_DEPRECATED /* GtkTooltips */ - #include "gtktoolitem.h" #include "gtkmarshalers.h" #include "gtktoolshell.h" @@ -78,7 +76,6 @@ enum { CREATE_MENU_PROXY, TOOLBAR_RECONFIGURED, - SET_TOOLTIP, LAST_SIGNAL }; @@ -138,10 +135,6 @@ static void gtk_tool_item_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_tool_item_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static gboolean gtk_tool_item_real_set_tooltip (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private); static void gtk_tool_item_activatable_interface_init (GtkActivatableIface *iface); static void gtk_tool_item_update (GtkActivatable *activatable, @@ -184,7 +177,6 @@ gtk_tool_item_class_init (GtkToolItemClass *klass) widget_class->parent_set = gtk_tool_item_parent_set; klass->create_menu_proxy = _gtk_tool_item_create_menu_proxy; - klass->set_tooltip = gtk_tool_item_real_set_tooltip; g_object_class_install_property (object_class, PROP_VISIBLE_HORIZONTAL, @@ -274,33 +266,6 @@ gtk_tool_item_class_init (GtkToolItemClass *klass) NULL, NULL, _gtk_marshal_VOID__VOID, G_TYPE_NONE, 0); -/** - * GtkToolItem::set-tooltip: - * @tool_item: the object the signal was emitted on - * @tooltips: the #GtkTooltips - * @tip_text: the tooltip text - * @tip_private: the tooltip private text - * - * This signal is emitted when the toolitem's tooltip changes. - * Application developers can use gtk_tool_item_set_tooltip() to - * set the item's tooltip. - * - * Return value: %TRUE if the signal was handled, %FALSE if not - * - * Deprecated: 2.12: With the new tooltip API, there is no - * need to use this signal anymore. - **/ - toolitem_signals[SET_TOOLTIP] = - g_signal_new (I_("set-tooltip"), - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkToolItemClass, set_tooltip), - _gtk_boolean_handled_accumulator, NULL, - _gtk_marshal_BOOLEAN__OBJECT_STRING_STRING, - G_TYPE_BOOLEAN, 3, - GTK_TYPE_TOOLTIPS, - G_TYPE_STRING, - G_TYPE_STRING); g_type_class_add_private (object_class, sizeof (GtkToolItemPrivate)); } @@ -1077,51 +1042,6 @@ gtk_tool_item_set_is_important (GtkToolItem *tool_item, gboolean is_important) } } -static gboolean -gtk_tool_item_real_set_tooltip (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private) -{ - GtkWidget *child = GTK_BIN (tool_item)->child; - - if (!child) - return FALSE; - - gtk_widget_set_tooltip_text (child, tip_text); - - return TRUE; -} - -/** - * gtk_tool_item_set_tooltip: - * @tool_item: a #GtkToolItem - * @tooltips: The #GtkTooltips object to be used - * @tip_text: (allow-none): text to be used as tooltip text for @tool_item - * @tip_private: (allow-none): text to be used as private tooltip text - * - * Sets the #GtkTooltips object to be used for @tool_item, the - * text to be displayed as tooltip on the item and the private text - * to be used. See gtk_tooltips_set_tip(). - * - * Since: 2.4 - * - * Deprecated: 2.12: Use gtk_tool_item_set_tooltip_text() instead. - **/ -void -gtk_tool_item_set_tooltip (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private) -{ - gboolean retval; - - g_return_if_fail (GTK_IS_TOOL_ITEM (tool_item)); - - g_signal_emit (tool_item, toolitem_signals[SET_TOOLTIP], 0, - tooltips, tip_text, tip_private, &retval); -} - /** * gtk_tool_item_set_tooltip_text: * @tool_item: a #GtkToolItem diff --git a/gtk/gtktoolitem.h b/gtk/gtktoolitem.h index 7f8d9ada18..1e1ecbfc3d 100644 --- a/gtk/gtktoolitem.h +++ b/gtk/gtktoolitem.h @@ -20,7 +20,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -28,7 +28,6 @@ #define __GTK_TOOL_ITEM_H__ #include <gtk/gtkbin.h> -#include <gtk/gtktooltips.h> #include <gtk/gtkmenuitem.h> #include <gtk/gtksizegroup.h> @@ -60,14 +59,6 @@ struct _GtkToolItemClass /* signals */ gboolean (* create_menu_proxy) (GtkToolItem *tool_item); void (* toolbar_reconfigured) (GtkToolItem *tool_item); -#ifndef GTK_DISABLE_DEPRECATED - gboolean (* set_tooltip) (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private); -#else - gpointer _set_tooltip; -#endif /* Padding for future expansion */ void (* _gtk_reserved1) (void); @@ -86,13 +77,6 @@ gboolean gtk_tool_item_get_homogeneous (GtkToolItem *tool_item); void gtk_tool_item_set_expand (GtkToolItem *tool_item, gboolean expand); gboolean gtk_tool_item_get_expand (GtkToolItem *tool_item); - -#ifndef GTK_DISABLE_DEPRECATED -void gtk_tool_item_set_tooltip (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private); -#endif /* GTK_DISABLE_DEPRECATED */ void gtk_tool_item_set_tooltip_text (GtkToolItem *tool_item, const gchar *text); void gtk_tool_item_set_tooltip_markup (GtkToolItem *tool_item, diff --git a/gtk/gtktooltip.h b/gtk/gtktooltip.h index cc16cb0454..ac310c908d 100644 --- a/gtk/gtktooltip.h +++ b/gtk/gtktooltip.h @@ -19,7 +19,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktooltips.c b/gtk/gtktooltips.c deleted file mode 100644 index 6c9131073d..0000000000 --- a/gtk/gtktooltips.c +++ /dev/null @@ -1,338 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> - -#undef GTK_DISABLE_DEPRECATED - -#include "gtklabel.h" -#include "gtkmain.h" -#include "gtkmenuitem.h" -#include "gtkprivate.h" -#include "gtkwidget.h" -#include "gtkwindow.h" -#include "gtkstyle.h" -#include "gtktooltips.h" -#include "gtkintl.h" -#include "gtkalias.h" - - -#define DEFAULT_DELAY 500 /* Default delay in ms */ -#define STICKY_DELAY 0 /* Delay before popping up next tip - * if we're sticky - */ -#define STICKY_REVERT_DELAY 1000 /* Delay before sticky tooltips revert - * to normal - */ -#define GTK_TOOLTIPS_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TOOLTIPS, GtkTooltipsPrivate)) - -typedef struct _GtkTooltipsPrivate GtkTooltipsPrivate; - -struct _GtkTooltipsPrivate -{ - GHashTable *tips_data_table; -}; - - -static void gtk_tooltips_finalize (GObject *object); -static void gtk_tooltips_destroy (GtkObject *object); - -static void gtk_tooltips_destroy_data (GtkTooltipsData *tooltipsdata); - -static void gtk_tooltips_widget_remove (GtkWidget *widget, - gpointer data); - -static const gchar tooltips_data_key[] = "_GtkTooltipsData"; -static const gchar tooltips_info_key[] = "_GtkTooltipsInfo"; - -G_DEFINE_TYPE (GtkTooltips, gtk_tooltips, GTK_TYPE_OBJECT) - -static void -gtk_tooltips_class_init (GtkTooltipsClass *class) -{ - GtkObjectClass *object_class = (GtkObjectClass *) class; - GObjectClass *gobject_class = (GObjectClass *) class; - - gobject_class->finalize = gtk_tooltips_finalize; - - object_class->destroy = gtk_tooltips_destroy; - - g_type_class_add_private (gobject_class, sizeof (GtkTooltipsPrivate)); -} - -static void -gtk_tooltips_init (GtkTooltips *tooltips) -{ - GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); - - tooltips->tip_window = NULL; - tooltips->active_tips_data = NULL; - tooltips->tips_data_list = NULL; - - tooltips->delay = DEFAULT_DELAY; - tooltips->enabled = TRUE; - tooltips->timer_tag = 0; - tooltips->use_sticky_delay = FALSE; - tooltips->last_popdown.tv_sec = -1; - tooltips->last_popdown.tv_usec = -1; - - private->tips_data_table = - g_hash_table_new_full (NULL, NULL, NULL, - (GDestroyNotify) gtk_tooltips_destroy_data); - - gtk_tooltips_force_window (tooltips); -} - -static void -gtk_tooltips_finalize (GObject *object) -{ - GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (object); - - g_hash_table_destroy (private->tips_data_table); - - G_OBJECT_CLASS (gtk_tooltips_parent_class)->finalize (object); -} - -GtkTooltips * -gtk_tooltips_new (void) -{ - return g_object_new (GTK_TYPE_TOOLTIPS, NULL); -} - -static void -gtk_tooltips_destroy_data (GtkTooltipsData *tooltipsdata) -{ - g_free (tooltipsdata->tip_text); - g_free (tooltipsdata->tip_private); - - g_signal_handlers_disconnect_by_func (tooltipsdata->widget, - gtk_tooltips_widget_remove, - tooltipsdata); - - g_object_set_data (G_OBJECT (tooltipsdata->widget), I_(tooltips_data_key), NULL); - g_object_unref (tooltipsdata->widget); - g_free (tooltipsdata); -} - -static void -gtk_tooltips_destroy (GtkObject *object) -{ - GtkTooltips *tooltips = GTK_TOOLTIPS (object); - GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); - - if (tooltips->tip_window) - { - gtk_widget_destroy (tooltips->tip_window); - tooltips->tip_window = NULL; - } - - g_hash_table_remove_all (private->tips_data_table); - - GTK_OBJECT_CLASS (gtk_tooltips_parent_class)->destroy (object); -} - -void -gtk_tooltips_force_window (GtkTooltips *tooltips) -{ - g_return_if_fail (GTK_IS_TOOLTIPS (tooltips)); - - if (!tooltips->tip_window) - { - tooltips->tip_window = gtk_window_new (GTK_WINDOW_POPUP); - g_signal_connect (tooltips->tip_window, - "destroy", - G_CALLBACK (gtk_widget_destroyed), - &tooltips->tip_window); - - tooltips->tip_label = gtk_label_new (NULL); - gtk_container_add (GTK_CONTAINER (tooltips->tip_window), - tooltips->tip_label); - } -} - -void -gtk_tooltips_enable (GtkTooltips *tooltips) -{ - g_return_if_fail (tooltips != NULL); - - tooltips->enabled = TRUE; -} - -void -gtk_tooltips_disable (GtkTooltips *tooltips) -{ - g_return_if_fail (tooltips != NULL); - - tooltips->enabled = FALSE; -} - -void -gtk_tooltips_set_delay (GtkTooltips *tooltips, - guint delay) -{ - g_return_if_fail (tooltips != NULL); - - tooltips->delay = delay; -} - -GtkTooltipsData* -gtk_tooltips_data_get (GtkWidget *widget) -{ - g_return_val_if_fail (widget != NULL, NULL); - - return g_object_get_data (G_OBJECT (widget), tooltips_data_key); -} - - -/** - * gtk_tooltips_set_tip: - * @tooltips: a #GtkTooltips. - * @widget: the #GtkWidget you wish to associate the tip with. - * @tip_text: (allow-none): a string containing the tip itself. - * @tip_private: (allow-none): a string of any further information that may be useful if the user gets stuck. - * - * Adds a tooltip containing the message @tip_text to the specified #GtkWidget. - * Deprecated: 2.12: - */ -void -gtk_tooltips_set_tip (GtkTooltips *tooltips, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private) -{ - GtkTooltipsData *tooltipsdata; - - g_return_if_fail (GTK_IS_TOOLTIPS (tooltips)); - g_return_if_fail (widget != NULL); - - tooltipsdata = gtk_tooltips_data_get (widget); - - if (!tip_text) - { - if (tooltipsdata) - gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata); - return; - } - - if (tooltips->active_tips_data - && tooltipsdata - && tooltips->active_tips_data->widget == widget - && GTK_WIDGET_DRAWABLE (tooltips->active_tips_data->widget)) - { - g_free (tooltipsdata->tip_text); - g_free (tooltipsdata->tip_private); - - tooltipsdata->tip_text = g_strdup (tip_text); - tooltipsdata->tip_private = g_strdup (tip_private); - } - else - { - g_object_ref (widget); - - if (tooltipsdata) - gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata); - - tooltipsdata = g_new0 (GtkTooltipsData, 1); - - tooltipsdata->tooltips = tooltips; - tooltipsdata->widget = widget; - - tooltipsdata->tip_text = g_strdup (tip_text); - tooltipsdata->tip_private = g_strdup (tip_private); - - g_hash_table_insert (GTK_TOOLTIPS_GET_PRIVATE (tooltips)->tips_data_table, - widget, tooltipsdata); - - g_object_set_data (G_OBJECT (widget), I_(tooltips_data_key), - tooltipsdata); - - g_signal_connect (widget, "destroy", - G_CALLBACK (gtk_tooltips_widget_remove), - tooltipsdata); - } - - gtk_widget_set_tooltip_text (widget, tip_text); -} - -static void -gtk_tooltips_widget_remove (GtkWidget *widget, - gpointer data) -{ - GtkTooltipsData *tooltipsdata = (GtkTooltipsData*) data; - GtkTooltips *tooltips = tooltipsdata->tooltips; - GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); - - g_hash_table_remove (private->tips_data_table, tooltipsdata->widget); -} - -/** - * gtk_tooltips_get_info_from_tip_window: - * @tip_window: a #GtkWindow - * @tooltips: the return location for the tooltips which are displayed - * in @tip_window, or %NULL - * @current_widget: the return location for the widget whose tooltips - * are displayed, or %NULL - * - * Determines the tooltips and the widget they belong to from the window in - * which they are displayed. - * - * This function is mostly intended for use by accessibility technologies; - * applications should have little use for it. - * - * Return value: %TRUE if @tip_window is displaying tooltips, otherwise %FALSE. - * - * Since: 2.4 - * - * Deprecated: 2.12: - **/ -gboolean -gtk_tooltips_get_info_from_tip_window (GtkWindow *tip_window, - GtkTooltips **tooltips, - GtkWidget **current_widget) -{ - GtkTooltips *current_tooltips; - gboolean has_tips; - - g_return_val_if_fail (GTK_IS_WINDOW (tip_window), FALSE); - - current_tooltips = g_object_get_data (G_OBJECT (tip_window), tooltips_info_key); - - has_tips = current_tooltips != NULL; - - if (tooltips) - *tooltips = current_tooltips; - if (current_widget) - *current_widget = (has_tips && current_tooltips->active_tips_data) ? current_tooltips->active_tips_data->widget : NULL; - - return has_tips; -} - -#define __GTK_TOOLTIPS_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtktooltips.h b/gtk/gtktooltips.h deleted file mode 100644 index a86085652c..0000000000 --- a/gtk/gtktooltips.h +++ /dev/null @@ -1,109 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef GTK_DISABLE_DEPRECATED - -#ifndef __GTK_TOOLTIPS_H__ -#define __GTK_TOOLTIPS_H__ - -#include <gtk/gtkwidget.h> -#include <gtk/gtkwindow.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_TOOLTIPS (gtk_tooltips_get_type ()) -#define GTK_TOOLTIPS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TOOLTIPS, GtkTooltips)) -#define GTK_TOOLTIPS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TOOLTIPS, GtkTooltipsClass)) -#define GTK_IS_TOOLTIPS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TOOLTIPS)) -#define GTK_IS_TOOLTIPS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TOOLTIPS)) -#define GTK_TOOLTIPS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TOOLTIPS, GtkTooltipsClass)) - - -typedef struct _GtkTooltips GtkTooltips; -typedef struct _GtkTooltipsClass GtkTooltipsClass; -typedef struct _GtkTooltipsData GtkTooltipsData; - -struct _GtkTooltipsData -{ - GtkTooltips *tooltips; - GtkWidget *widget; - gchar *tip_text; - gchar *tip_private; -}; - -struct _GtkTooltips -{ - GtkObject parent_instance; - - /*< private >*/ - GtkWidget *tip_window; - GtkWidget *tip_label; - GtkTooltipsData *active_tips_data; - GList *tips_data_list; /* unused */ - - guint delay : 30; - guint enabled : 1; - guint have_grab : 1; - guint use_sticky_delay : 1; - gint timer_tag; - GTimeVal last_popdown; -}; - -struct _GtkTooltipsClass -{ - GtkObjectClass parent_class; - - /* Padding for future expansion */ - void (*_gtk_reserved1) (void); - void (*_gtk_reserved2) (void); - void (*_gtk_reserved3) (void); - void (*_gtk_reserved4) (void); -}; - -GType gtk_tooltips_get_type (void) G_GNUC_CONST; -GtkTooltips* gtk_tooltips_new (void); - -void gtk_tooltips_enable (GtkTooltips *tooltips); -void gtk_tooltips_disable (GtkTooltips *tooltips); -void gtk_tooltips_set_delay (GtkTooltips *tooltips, - guint delay); -void gtk_tooltips_set_tip (GtkTooltips *tooltips, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private); -GtkTooltipsData* gtk_tooltips_data_get (GtkWidget *widget); -void gtk_tooltips_force_window (GtkTooltips *tooltips); - -gboolean gtk_tooltips_get_info_from_tip_window (GtkWindow *tip_window, - GtkTooltips **tooltips, - GtkWidget **current_widget); - -G_END_DECLS - -#endif /* __GTK_TOOLTIPS_H__ */ - -#endif /* GTK_DISABLE_DEPRECATED */ diff --git a/gtk/gtktree.c b/gtk/gtktree.c deleted file mode 100644 index 7d842c1378..0000000000 --- a/gtk/gtktree.c +++ /dev/null @@ -1,1136 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtksignal.h" -#include "gtklist.h" - -#define GTK_ENABLE_BROKEN -#include "gtktree.h" -#include "gtktreeitem.h" -#include "gtkintl.h" - -#include "gtkalias.h" - -enum { - SELECTION_CHANGED, - SELECT_CHILD, - UNSELECT_CHILD, - LAST_SIGNAL -}; - -static void gtk_tree_class_init (GtkTreeClass *klass); -static void gtk_tree_init (GtkTree *tree); -static void gtk_tree_destroy (GtkObject *object); -static void gtk_tree_map (GtkWidget *widget); -static void gtk_tree_parent_set (GtkWidget *widget, - GtkWidget *previous_parent); -static void gtk_tree_unmap (GtkWidget *widget); -static void gtk_tree_realize (GtkWidget *widget); -static gint gtk_tree_motion_notify (GtkWidget *widget, - GdkEventMotion *event); -static gint gtk_tree_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_tree_button_release (GtkWidget *widget, - GdkEventButton *event); -static void gtk_tree_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_tree_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_tree_add (GtkContainer *container, - GtkWidget *widget); -static void gtk_tree_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -static void gtk_real_tree_select_child (GtkTree *tree, - GtkWidget *child); -static void gtk_real_tree_unselect_child (GtkTree *tree, - GtkWidget *child); - -static GtkType gtk_tree_child_type (GtkContainer *container); - -static GtkContainerClass *parent_class = NULL; -static guint tree_signals[LAST_SIGNAL] = { 0 }; - -GtkType -gtk_tree_get_type (void) -{ - static GtkType tree_type = 0; - - if (!tree_type) - { - static const GtkTypeInfo tree_info = - { - "GtkTree", - sizeof (GtkTree), - sizeof (GtkTreeClass), - (GtkClassInitFunc) gtk_tree_class_init, - (GtkObjectInitFunc) gtk_tree_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkTree"); - tree_type = gtk_type_unique (gtk_container_get_type (), &tree_info); - } - - return tree_type; -} - -static void -gtk_tree_class_init (GtkTreeClass *class) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - container_class = (GtkContainerClass*) class; - - parent_class = gtk_type_class (gtk_container_get_type ()); - - - object_class->destroy = gtk_tree_destroy; - - widget_class->map = gtk_tree_map; - widget_class->unmap = gtk_tree_unmap; - widget_class->parent_set = gtk_tree_parent_set; - widget_class->realize = gtk_tree_realize; - widget_class->motion_notify_event = gtk_tree_motion_notify; - widget_class->button_press_event = gtk_tree_button_press; - widget_class->button_release_event = gtk_tree_button_release; - widget_class->size_request = gtk_tree_size_request; - widget_class->size_allocate = gtk_tree_size_allocate; - - container_class->add = gtk_tree_add; - container_class->remove = - (void (*)(GtkContainer *, GtkWidget *)) gtk_tree_remove_item; - container_class->forall = gtk_tree_forall; - container_class->child_type = gtk_tree_child_type; - - class->selection_changed = NULL; - class->select_child = gtk_real_tree_select_child; - class->unselect_child = gtk_real_tree_unselect_child; - - tree_signals[SELECTION_CHANGED] = - gtk_signal_new (I_("selection-changed"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTreeClass, selection_changed), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - tree_signals[SELECT_CHILD] = - gtk_signal_new (I_("select-child"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTreeClass, select_child), - _gtk_marshal_VOID__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_WIDGET); - tree_signals[UNSELECT_CHILD] = - gtk_signal_new (I_("unselect-child"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTreeClass, unselect_child), - _gtk_marshal_VOID__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_WIDGET); -} - -static GtkType -gtk_tree_child_type (GtkContainer *container) -{ - return GTK_TYPE_TREE_ITEM; -} - -static void -gtk_tree_init (GtkTree *tree) -{ - tree->children = NULL; - tree->root_tree = tree; - tree->selection = NULL; - tree->tree_owner = NULL; - tree->selection_mode = GTK_SELECTION_SINGLE; - tree->indent_value = 9; - tree->current_indent = 0; - tree->level = 0; - tree->view_mode = GTK_TREE_VIEW_LINE; - tree->view_line = TRUE; -} - -GtkWidget* -gtk_tree_new (void) -{ - return GTK_WIDGET (gtk_type_new (gtk_tree_get_type ())); -} - -void -gtk_tree_append (GtkTree *tree, - GtkWidget *tree_item) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_tree_insert (tree, tree_item, -1); -} - -void -gtk_tree_prepend (GtkTree *tree, - GtkWidget *tree_item) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_tree_insert (tree, tree_item, 0); -} - -void -gtk_tree_insert (GtkTree *tree, - GtkWidget *tree_item, - gint position) -{ - gint nchildren; - - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - nchildren = g_list_length (tree->children); - - if ((position < 0) || (position > nchildren)) - position = nchildren; - - if (position == nchildren) - tree->children = g_list_append (tree->children, tree_item); - else - tree->children = g_list_insert (tree->children, tree_item, position); - - gtk_widget_set_parent (tree_item, GTK_WIDGET (tree)); -} - -static void -gtk_tree_add (GtkContainer *container, - GtkWidget *child) -{ - GtkTree *tree; - - g_return_if_fail (GTK_IS_TREE (container)); - g_return_if_fail (GTK_IS_TREE_ITEM (child)); - - tree = GTK_TREE (container); - - tree->children = g_list_append (tree->children, child); - - gtk_widget_set_parent (child, GTK_WIDGET (container)); - - if (!tree->selection && (tree->selection_mode == GTK_SELECTION_BROWSE)) - gtk_tree_select_child (tree, child); -} - -static gint -gtk_tree_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - GtkTree *tree; - GtkWidget *item; - - g_return_val_if_fail (GTK_IS_TREE (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - tree = GTK_TREE (widget); - item = gtk_get_event_widget ((GdkEvent*) event); - - while (item && !GTK_IS_TREE_ITEM (item)) - item = item->parent; - - if (!item || (item->parent != widget)) - return FALSE; - - switch(event->button) - { - case 1: - gtk_tree_select_child (tree, item); - break; - case 2: - if(GTK_TREE_ITEM(item)->subtree) gtk_tree_item_expand(GTK_TREE_ITEM(item)); - break; - case 3: - if(GTK_TREE_ITEM(item)->subtree) gtk_tree_item_collapse(GTK_TREE_ITEM(item)); - break; - } - - return TRUE; -} - -static gint -gtk_tree_button_release (GtkWidget *widget, - GdkEventButton *event) -{ - GtkTree *tree; - GtkWidget *item; - - g_return_val_if_fail (GTK_IS_TREE (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - tree = GTK_TREE (widget); - item = gtk_get_event_widget ((GdkEvent*) event); - - return TRUE; -} - -gint -gtk_tree_child_position (GtkTree *tree, - GtkWidget *child) -{ - GList *children; - gint pos; - - - g_return_val_if_fail (GTK_IS_TREE (tree), -1); - g_return_val_if_fail (child != NULL, -1); - - pos = 0; - children = tree->children; - - while (children) - { - if (child == GTK_WIDGET (children->data)) - return pos; - - pos += 1; - children = children->next; - } - - - return -1; -} - -void -gtk_tree_clear_items (GtkTree *tree, - gint start, - gint end) -{ - GtkWidget *widget; - GList *clear_list; - GList *tmp_list; - guint nchildren; - guint index; - - g_return_if_fail (GTK_IS_TREE (tree)); - - nchildren = g_list_length (tree->children); - - if (nchildren > 0) - { - if ((end < 0) || (end > nchildren)) - end = nchildren; - - if (start >= end) - return; - - tmp_list = g_list_nth (tree->children, start); - clear_list = NULL; - index = start; - while (tmp_list && index <= end) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - index++; - - clear_list = g_list_prepend (clear_list, widget); - } - - gtk_tree_remove_items (tree, clear_list); - } -} - -static void -gtk_tree_destroy (GtkObject *object) -{ - GtkTree *tree; - GtkWidget *child; - GList *children; - - g_return_if_fail (GTK_IS_TREE (object)); - - tree = GTK_TREE (object); - - children = tree->children; - while (children) - { - child = children->data; - children = children->next; - - g_object_ref (child); - gtk_widget_unparent (child); - gtk_widget_destroy (child); - g_object_unref (child); - } - - g_list_free (tree->children); - tree->children = NULL; - - if (tree->root_tree == tree) - { - GList *node; - for (node = tree->selection; node; node = node->next) - g_object_unref (node->data); - g_list_free (tree->selection); - tree->selection = NULL; - } - - GTK_OBJECT_CLASS (parent_class)->destroy (object); -} - -static void -gtk_tree_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkTree *tree; - GtkWidget *child; - GList *children; - - - g_return_if_fail (GTK_IS_TREE (container)); - g_return_if_fail (callback != NULL); - - tree = GTK_TREE (container); - children = tree->children; - - while (children) - { - child = children->data; - children = children->next; - - (* callback) (child, callback_data); - } -} - -static void -gtk_tree_unselect_all (GtkTree *tree) -{ - GList *tmp_list, *selection; - GtkWidget *tmp_item; - - selection = tree->selection; - tree->selection = NULL; - - tmp_list = selection; - while (tmp_list) - { - tmp_item = selection->data; - - if (tmp_item->parent && - GTK_IS_TREE (tmp_item->parent) && - GTK_TREE (tmp_item->parent)->root_tree == tree) - gtk_tree_item_deselect (GTK_TREE_ITEM (tmp_item)); - - g_object_unref (tmp_item); - - tmp_list = tmp_list->next; - } - - g_list_free (selection); -} - -static void -gtk_tree_parent_set (GtkWidget *widget, - GtkWidget *previous_parent) -{ - GtkTree *tree = GTK_TREE (widget); - GtkWidget *child; - GList *children; - - if (GTK_IS_TREE (widget->parent)) - { - gtk_tree_unselect_all (tree); - - /* set root tree for this tree */ - tree->root_tree = GTK_TREE(widget->parent)->root_tree; - - tree->level = GTK_TREE(GTK_WIDGET(tree)->parent)->level+1; - tree->indent_value = GTK_TREE(GTK_WIDGET(tree)->parent)->indent_value; - tree->current_indent = GTK_TREE(GTK_WIDGET(tree)->parent)->current_indent + - tree->indent_value; - tree->view_mode = GTK_TREE(GTK_WIDGET(tree)->parent)->view_mode; - tree->view_line = GTK_TREE(GTK_WIDGET(tree)->parent)->view_line; - } - else - { - tree->root_tree = tree; - - tree->level = 0; - tree->current_indent = 0; - } - - children = tree->children; - while (children) - { - child = children->data; - children = children->next; - - if (GTK_TREE_ITEM (child)->subtree) - gtk_tree_parent_set (GTK_TREE_ITEM (child)->subtree, child); - } -} - -static void -gtk_tree_map (GtkWidget *widget) -{ - GtkTree *tree = GTK_TREE (widget); - GtkWidget *child; - GList *children; - - gtk_widget_set_mapped (widget, TRUE); - - children = tree->children; - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child) && - !gtk_widget_get_mapped (child)) - gtk_widget_map (child); - - if (GTK_TREE_ITEM (child)->subtree) - { - child = GTK_WIDGET (GTK_TREE_ITEM (child)->subtree); - - if (gtk_widget_get_visible (child) && !gtk_widget_get_mapped (child)) - gtk_widget_map (child); - } - } - - gdk_window_show (widget->window); -} - -static gint -gtk_tree_motion_notify (GtkWidget *widget, - GdkEventMotion *event) -{ - g_return_val_if_fail (GTK_IS_TREE (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - -#ifdef TREE_DEBUG - g_message("gtk_tree_motion_notify\n"); -#endif /* TREE_DEBUG */ - - return FALSE; -} - -static void -gtk_tree_realize (GtkWidget *widget) -{ - GdkWindowAttr attributes; - gint attributes_mask; - - - g_return_if_fail (GTK_IS_TREE (widget)); - - gtk_widget_set_realized (widget, TRUE); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; - - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, widget); - - widget->style = gtk_style_attach (widget->style, widget->window); - gdk_window_set_background (widget->window, - &widget->style->base[GTK_STATE_NORMAL]); -} - -void -gtk_tree_remove_item (GtkTree *container, - GtkWidget *widget) -{ - GList *item_list; - - g_return_if_fail (GTK_IS_TREE (container)); - g_return_if_fail (widget != NULL); - g_return_if_fail (container == GTK_TREE (widget->parent)); - - item_list = g_list_append (NULL, widget); - - gtk_tree_remove_items (GTK_TREE (container), item_list); - - g_list_free (item_list); -} - -/* used by gtk_tree_remove_items to make the function independent of - order in list of items to remove. - Sort item by depth in tree */ -static gint -gtk_tree_sort_item_by_depth(GtkWidget* a, GtkWidget* b) -{ - if((GTK_TREE(a->parent)->level) < (GTK_TREE(b->parent)->level)) - return 1; - if((GTK_TREE(a->parent)->level) > (GTK_TREE(b->parent)->level)) - return -1; - - return 0; -} - -void -gtk_tree_remove_items (GtkTree *tree, - GList *items) -{ - GtkWidget *widget; - GList *selected_widgets; - GList *tmp_list; - GList *sorted_list; - GtkTree *real_tree; - GtkTree *root_tree; - - g_return_if_fail (GTK_IS_TREE (tree)); - -#ifdef TREE_DEBUG - g_message("+ gtk_tree_remove_items [ tree %#x items list %#x ]\n", (int)tree, (int)items); -#endif /* TREE_DEBUG */ - - /* We may not yet be mapped, so we actively have to find our - * root tree - */ - if (tree->root_tree) - root_tree = tree->root_tree; - else - { - GtkWidget *tmp = GTK_WIDGET (tree); - while (GTK_IS_TREE (tmp->parent)) - tmp = tmp->parent; - - root_tree = GTK_TREE (tmp); - } - - tmp_list = items; - selected_widgets = NULL; - sorted_list = NULL; - widget = NULL; - -#ifdef TREE_DEBUG - g_message("* sort list by depth\n"); -#endif /* TREE_DEBUG */ - - while (tmp_list) - { - -#ifdef TREE_DEBUG - g_message ("* item [%#x] depth [%d]\n", - (int)tmp_list->data, - (int)GTK_TREE(GTK_WIDGET(tmp_list->data)->parent)->level); -#endif /* TREE_DEBUG */ - - sorted_list = g_list_insert_sorted(sorted_list, - tmp_list->data, - (GCompareFunc)gtk_tree_sort_item_by_depth); - tmp_list = g_list_next(tmp_list); - } - -#ifdef TREE_DEBUG - /* print sorted list */ - g_message("* sorted list result\n"); - tmp_list = sorted_list; - while(tmp_list) - { - g_message("* item [%#x] depth [%d]\n", - (int)tmp_list->data, - (int)GTK_TREE(GTK_WIDGET(tmp_list->data)->parent)->level); - tmp_list = g_list_next(tmp_list); - } -#endif /* TREE_DEBUG */ - -#ifdef TREE_DEBUG - g_message("* scan sorted list\n"); -#endif /* TREE_DEBUG */ - - tmp_list = sorted_list; - while (tmp_list) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - -#ifdef TREE_DEBUG - g_message("* item [%#x] subtree [%#x]\n", - (int)widget, (int)GTK_TREE_ITEM_SUBTREE(widget)); -#endif /* TREE_DEBUG */ - - /* get real owner of this widget */ - real_tree = GTK_TREE(widget->parent); -#ifdef TREE_DEBUG - g_message("* subtree having this widget [%#x]\n", (int)real_tree); -#endif /* TREE_DEBUG */ - - - if (widget->state == GTK_STATE_SELECTED) - { - selected_widgets = g_list_prepend (selected_widgets, widget); -#ifdef TREE_DEBUG - g_message("* selected widget - adding it in selected list [%#x]\n", - (int)selected_widgets); -#endif /* TREE_DEBUG */ - } - - /* remove this item from its real parent */ -#ifdef TREE_DEBUG - g_message("* remove widget from its owner tree\n"); -#endif /* TREE_DEBUG */ - real_tree->children = g_list_remove (real_tree->children, widget); - - /* remove subtree associate at this item if it exist */ - if(GTK_TREE_ITEM(widget)->subtree) - { -#ifdef TREE_DEBUG - g_message("* remove subtree associate at this item [%#x]\n", - (int) GTK_TREE_ITEM(widget)->subtree); -#endif /* TREE_DEBUG */ - if (gtk_widget_get_mapped (GTK_TREE_ITEM(widget)->subtree)) - gtk_widget_unmap (GTK_TREE_ITEM(widget)->subtree); - - gtk_widget_unparent (GTK_TREE_ITEM(widget)->subtree); - GTK_TREE_ITEM(widget)->subtree = NULL; - } - - /* really remove widget for this item */ -#ifdef TREE_DEBUG - g_message("* unmap and unparent widget [%#x]\n", (int)widget); -#endif /* TREE_DEBUG */ - if (gtk_widget_get_mapped (widget)) - gtk_widget_unmap (widget); - - gtk_widget_unparent (widget); - - /* delete subtree if there is no children in it */ - if(real_tree->children == NULL && - real_tree != root_tree) - { -#ifdef TREE_DEBUG - g_message("* owner tree don't have children ... destroy it\n"); -#endif /* TREE_DEBUG */ - gtk_tree_item_remove_subtree(GTK_TREE_ITEM(real_tree->tree_owner)); - } - -#ifdef TREE_DEBUG - g_message("* next item in list\n"); -#endif /* TREE_DEBUG */ - } - - if (selected_widgets) - { -#ifdef TREE_DEBUG - g_message("* scan selected item list\n"); -#endif /* TREE_DEBUG */ - tmp_list = selected_widgets; - while (tmp_list) - { - widget = tmp_list->data; - tmp_list = tmp_list->next; - -#ifdef TREE_DEBUG - g_message("* widget [%#x] subtree [%#x]\n", - (int)widget, (int)GTK_TREE_ITEM_SUBTREE(widget)); -#endif /* TREE_DEBUG */ - - /* remove widget of selection */ - root_tree->selection = g_list_remove (root_tree->selection, widget); - - /* unref it to authorize is destruction */ - g_object_unref (widget); - } - - /* emit only one selection_changed signal */ - gtk_signal_emit (GTK_OBJECT (root_tree), - tree_signals[SELECTION_CHANGED]); - } - -#ifdef TREE_DEBUG - g_message("* free selected_widgets list\n"); -#endif /* TREE_DEBUG */ - g_list_free (selected_widgets); - g_list_free (sorted_list); - - if (root_tree->children && !root_tree->selection && - (root_tree->selection_mode == GTK_SELECTION_BROWSE)) - { -#ifdef TREE_DEBUG - g_message("* BROWSE mode, select another item\n"); -#endif /* TREE_DEBUG */ - widget = root_tree->children->data; - gtk_tree_select_child (root_tree, widget); - } - - if (gtk_widget_get_visible (GTK_WIDGET (root_tree))) - { -#ifdef TREE_DEBUG - g_message("* query queue resizing for root_tree\n"); -#endif /* TREE_DEBUG */ - gtk_widget_queue_resize (GTK_WIDGET (root_tree)); - } -} - -void -gtk_tree_select_child (GtkTree *tree, - GtkWidget *tree_item) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_signal_emit (GTK_OBJECT (tree), tree_signals[SELECT_CHILD], tree_item); -} - -void -gtk_tree_select_item (GtkTree *tree, - gint item) -{ - GList *tmp_list; - - g_return_if_fail (GTK_IS_TREE (tree)); - - tmp_list = g_list_nth (tree->children, item); - if (tmp_list) - gtk_tree_select_child (tree, GTK_WIDGET (tmp_list->data)); - -} - -static void -gtk_tree_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkTree *tree; - GtkWidget *child, *subtree; - GtkAllocation child_allocation; - GList *children; - - - g_return_if_fail (GTK_IS_TREE (widget)); - g_return_if_fail (allocation != NULL); - - tree = GTK_TREE (widget); - - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, allocation->height); - - if (tree->children) - { - child_allocation.x = GTK_CONTAINER (tree)->border_width; - child_allocation.y = GTK_CONTAINER (tree)->border_width; - child_allocation.width = MAX (1, (gint)allocation->width - child_allocation.x * 2); - - children = tree->children; - - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child)) - { - GtkRequisition child_requisition; - gtk_widget_get_child_requisition (child, &child_requisition); - - child_allocation.height = child_requisition.height; - - gtk_widget_size_allocate (child, &child_allocation); - - child_allocation.y += child_allocation.height; - - if((subtree = GTK_TREE_ITEM(child)->subtree)) - if(gtk_widget_get_visible (subtree)) - { - child_allocation.height = subtree->requisition.height; - gtk_widget_size_allocate (subtree, &child_allocation); - child_allocation.y += child_allocation.height; - } - } - } - } - -} - -static void -gtk_tree_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkTree *tree; - GtkWidget *child, *subtree; - GList *children; - GtkRequisition child_requisition; - - - g_return_if_fail (GTK_IS_TREE (widget)); - g_return_if_fail (requisition != NULL); - - tree = GTK_TREE (widget); - requisition->width = 0; - requisition->height = 0; - - children = tree->children; - while (children) - { - child = children->data; - children = children->next; - - if (gtk_widget_get_visible (child)) - { - gtk_widget_size_request (child, &child_requisition); - - requisition->width = MAX (requisition->width, child_requisition.width); - requisition->height += child_requisition.height; - - if((subtree = GTK_TREE_ITEM(child)->subtree) && - gtk_widget_get_visible (subtree)) - { - gtk_widget_size_request (subtree, &child_requisition); - - requisition->width = MAX (requisition->width, - child_requisition.width); - - requisition->height += child_requisition.height; - } - } - } - - requisition->width += GTK_CONTAINER (tree)->border_width * 2; - requisition->height += GTK_CONTAINER (tree)->border_width * 2; - - requisition->width = MAX (requisition->width, 1); - requisition->height = MAX (requisition->height, 1); - -} - -static void -gtk_tree_unmap (GtkWidget *widget) -{ - - g_return_if_fail (GTK_IS_TREE (widget)); - - gtk_widget_set_mapped (widget, FALSE); - gdk_window_hide (widget->window); - -} - -void -gtk_tree_unselect_child (GtkTree *tree, - GtkWidget *tree_item) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_signal_emit (GTK_OBJECT (tree), tree_signals[UNSELECT_CHILD], tree_item); -} - -void -gtk_tree_unselect_item (GtkTree *tree, - gint item) -{ - GList *tmp_list; - - g_return_if_fail (GTK_IS_TREE (tree)); - - tmp_list = g_list_nth (tree->children, item); - if (tmp_list) - gtk_tree_unselect_child (tree, GTK_WIDGET (tmp_list->data)); - -} - -static void -gtk_real_tree_select_child (GtkTree *tree, - GtkWidget *child) -{ - GList *selection, *root_selection; - GList *tmp_list; - GtkWidget *tmp_item; - - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (child)); - - root_selection = tree->root_tree->selection; - - switch (tree->root_tree->selection_mode) - { - case GTK_SELECTION_SINGLE: - - selection = root_selection; - - /* remove old selection list */ - while (selection) - { - tmp_item = selection->data; - - if (tmp_item != child) - { - gtk_tree_item_deselect (GTK_TREE_ITEM (tmp_item)); - - tmp_list = selection; - selection = selection->next; - - root_selection = g_list_remove_link (root_selection, tmp_list); - g_object_unref (tmp_item); - - g_list_free (tmp_list); - } - else - selection = selection->next; - } - - if (child->state == GTK_STATE_NORMAL) - { - gtk_tree_item_select (GTK_TREE_ITEM (child)); - root_selection = g_list_prepend (root_selection, child); - g_object_ref (child); - } - else if (child->state == GTK_STATE_SELECTED) - { - gtk_tree_item_deselect (GTK_TREE_ITEM (child)); - root_selection = g_list_remove (root_selection, child); - g_object_unref (child); - } - - tree->root_tree->selection = root_selection; - - gtk_signal_emit (GTK_OBJECT (tree->root_tree), - tree_signals[SELECTION_CHANGED]); - break; - - - case GTK_SELECTION_BROWSE: - selection = root_selection; - - while (selection) - { - tmp_item = selection->data; - - if (tmp_item != child) - { - gtk_tree_item_deselect (GTK_TREE_ITEM (tmp_item)); - - tmp_list = selection; - selection = selection->next; - - root_selection = g_list_remove_link (root_selection, tmp_list); - g_object_unref (tmp_item); - - g_list_free (tmp_list); - } - else - selection = selection->next; - } - - tree->root_tree->selection = root_selection; - - if (child->state == GTK_STATE_NORMAL) - { - gtk_tree_item_select (GTK_TREE_ITEM (child)); - root_selection = g_list_prepend (root_selection, child); - g_object_ref (child); - tree->root_tree->selection = root_selection; - gtk_signal_emit (GTK_OBJECT (tree->root_tree), - tree_signals[SELECTION_CHANGED]); - } - break; - - case GTK_SELECTION_MULTIPLE: - break; - } -} - -static void -gtk_real_tree_unselect_child (GtkTree *tree, - GtkWidget *child) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - g_return_if_fail (GTK_IS_TREE_ITEM (child)); - - switch (tree->selection_mode) - { - case GTK_SELECTION_SINGLE: - case GTK_SELECTION_BROWSE: - if (child->state == GTK_STATE_SELECTED) - { - GtkTree* root_tree = GTK_TREE_ROOT_TREE(tree); - gtk_tree_item_deselect (GTK_TREE_ITEM (child)); - root_tree->selection = g_list_remove (root_tree->selection, child); - g_object_unref (child); - gtk_signal_emit (GTK_OBJECT (tree->root_tree), - tree_signals[SELECTION_CHANGED]); - } - break; - - case GTK_SELECTION_MULTIPLE: - break; - } -} - -void -gtk_tree_set_selection_mode (GtkTree *tree, - GtkSelectionMode mode) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - - tree->selection_mode = mode; -} - -void -gtk_tree_set_view_mode (GtkTree *tree, - GtkTreeViewMode mode) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - - tree->view_mode = mode; -} - -void -gtk_tree_set_view_lines (GtkTree *tree, - gboolean flag) -{ - g_return_if_fail (GTK_IS_TREE (tree)); - - tree->view_line = flag; -} - -#define __GTK_TREE_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtktree.h b/gtk/gtktree.h deleted file mode 100644 index 1d0e1f7343..0000000000 --- a/gtk/gtktree.h +++ /dev/null @@ -1,132 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifdef GTK_ENABLE_BROKEN - -#ifndef __GTK_TREE_H__ -#define __GTK_TREE_H__ - - -#include <gtk/gtkcontainer.h> - - -G_BEGIN_DECLS - -/* set this flag to enable tree debugging output */ -/* #define TREE_DEBUG */ - -#define GTK_TYPE_TREE (gtk_tree_get_type ()) -#define GTK_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE, GtkTree)) -#define GTK_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TREE, GtkTreeClass)) -#define GTK_IS_TREE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE)) -#define GTK_IS_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TREE)) -#define GTK_TREE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TREE, GtkTreeClass)) - - -#define GTK_IS_ROOT_TREE(obj) ((GtkObject*) GTK_TREE(obj)->root_tree == (GtkObject*)obj) -#define GTK_TREE_ROOT_TREE(obj) (GTK_TREE(obj)->root_tree ? GTK_TREE(obj)->root_tree : GTK_TREE(obj)) -#define GTK_TREE_SELECTION_OLD(obj) (GTK_TREE_ROOT_TREE(obj)->selection) - -typedef enum -{ - GTK_TREE_VIEW_LINE, /* default view mode */ - GTK_TREE_VIEW_ITEM -} GtkTreeViewMode; - -typedef struct _GtkTree GtkTree; -typedef struct _GtkTreeClass GtkTreeClass; - -struct _GtkTree -{ - GtkContainer container; - - GList *children; - - GtkTree* root_tree; /* owner of selection list */ - GtkWidget* tree_owner; - GList *selection; - guint level; - guint indent_value; - guint current_indent; - guint selection_mode : 2; - guint view_mode : 1; - guint view_line : 1; -}; - -struct _GtkTreeClass -{ - GtkContainerClass parent_class; - - void (* selection_changed) (GtkTree *tree); - void (* select_child) (GtkTree *tree, - GtkWidget *child); - void (* unselect_child) (GtkTree *tree, - GtkWidget *child); -}; - - -GType gtk_tree_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_tree_new (void); -void gtk_tree_append (GtkTree *tree, - GtkWidget *tree_item); -void gtk_tree_prepend (GtkTree *tree, - GtkWidget *tree_item); -void gtk_tree_insert (GtkTree *tree, - GtkWidget *tree_item, - gint position); -void gtk_tree_remove_items (GtkTree *tree, - GList *items); -void gtk_tree_clear_items (GtkTree *tree, - gint start, - gint end); -void gtk_tree_select_item (GtkTree *tree, - gint item); -void gtk_tree_unselect_item (GtkTree *tree, - gint item); -void gtk_tree_select_child (GtkTree *tree, - GtkWidget *tree_item); -void gtk_tree_unselect_child (GtkTree *tree, - GtkWidget *tree_item); -gint gtk_tree_child_position (GtkTree *tree, - GtkWidget *child); -void gtk_tree_set_selection_mode (GtkTree *tree, - GtkSelectionMode mode); -void gtk_tree_set_view_mode (GtkTree *tree, - GtkTreeViewMode mode); -void gtk_tree_set_view_lines (GtkTree *tree, - gboolean flag); - -/* deprecated function, use gtk_container_remove instead. - */ -void gtk_tree_remove_item (GtkTree *tree, - GtkWidget *child); - - -G_END_DECLS - -#endif /* __GTK_TREE_H__ */ - -#endif /* GTK_ENABLE_BROKEN */ diff --git a/gtk/gtktreednd.h b/gtk/gtktreednd.h index 517ba50d2a..e0de421f90 100644 --- a/gtk/gtktreednd.h +++ b/gtk/gtktreednd.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktreeitem.c b/gtk/gtktreeitem.c deleted file mode 100644 index a6ca505ffe..0000000000 --- a/gtk/gtktreeitem.c +++ /dev/null @@ -1,1000 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#undef GTK_DISABLE_DEPRECATED - -#include "config.h" - -#include "gtklabel.h" -#include "gtkeventbox.h" -#include "gtkpixmap.h" -#include "gtkmain.h" -#include "gtkmarshalers.h" -#include "gtksignal.h" -#define GTK_ENABLE_BROKEN -#include "gtktree.h" -#include "gtktreeitem.h" -#include "gtkintl.h" - -#include "gtkalias.h" - -#include "tree_plus.xpm" -#include "tree_minus.xpm" - -#define DEFAULT_DELTA 9 - -enum { - COLLAPSE_TREE, - EXPAND_TREE, - LAST_SIGNAL -}; - -typedef struct _GtkTreePixmaps GtkTreePixmaps; - -struct _GtkTreePixmaps { - gint refcount; - GdkColormap *colormap; - - GdkPixmap *pixmap_plus; - GdkPixmap *pixmap_minus; - GdkBitmap *mask_plus; - GdkBitmap *mask_minus; -}; - -static GList *pixmaps = NULL; - -static void gtk_tree_item_class_init (GtkTreeItemClass *klass); -static void gtk_tree_item_init (GtkTreeItem *tree_item); -static void gtk_tree_item_realize (GtkWidget *widget); -static void gtk_tree_item_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_tree_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_tree_item_paint (GtkWidget *widget, - GdkRectangle *area); -static gint gtk_tree_item_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_tree_item_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_tree_item_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -static void gtk_real_tree_item_select (GtkItem *item); -static void gtk_real_tree_item_deselect (GtkItem *item); -static void gtk_real_tree_item_toggle (GtkItem *item); -static void gtk_real_tree_item_expand (GtkTreeItem *item); -static void gtk_real_tree_item_collapse (GtkTreeItem *item); -static void gtk_tree_item_destroy (GtkObject *object); -static gint gtk_tree_item_subtree_button_click (GtkWidget *widget); -static void gtk_tree_item_subtree_button_changed_state (GtkWidget *widget); - -static void gtk_tree_item_map(GtkWidget*); -static void gtk_tree_item_unmap(GtkWidget*); - -static void gtk_tree_item_add_pixmaps (GtkTreeItem *tree_item); -static void gtk_tree_item_remove_pixmaps (GtkTreeItem *tree_item); - -static GtkItemClass *parent_class = NULL; -static guint tree_item_signals[LAST_SIGNAL] = { 0 }; - -GtkType -gtk_tree_item_get_type (void) -{ - static GtkType tree_item_type = 0; - - if (!tree_item_type) - { - static const GtkTypeInfo tree_item_info = - { - "GtkTreeItem", - sizeof (GtkTreeItem), - sizeof (GtkTreeItemClass), - (GtkClassInitFunc) gtk_tree_item_class_init, - (GtkObjectInitFunc) gtk_tree_item_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - I_("GtkTreeItem"); - tree_item_type = gtk_type_unique (gtk_item_get_type (), &tree_item_info); - } - - return tree_item_type; -} - -static void -gtk_tree_item_class_init (GtkTreeItemClass *class) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkContainerClass *container_class; - GtkItemClass *item_class; - - parent_class = gtk_type_class (GTK_TYPE_ITEM); - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - item_class = (GtkItemClass*) class; - container_class = (GtkContainerClass*) class; - - object_class->destroy = gtk_tree_item_destroy; - - widget_class->realize = gtk_tree_item_realize; - widget_class->size_request = gtk_tree_item_size_request; - widget_class->size_allocate = gtk_tree_item_size_allocate; - widget_class->button_press_event = gtk_tree_item_button_press; - widget_class->expose_event = gtk_tree_item_expose; - widget_class->map = gtk_tree_item_map; - widget_class->unmap = gtk_tree_item_unmap; - - container_class->forall = gtk_tree_item_forall; - - item_class->select = gtk_real_tree_item_select; - item_class->deselect = gtk_real_tree_item_deselect; - item_class->toggle = gtk_real_tree_item_toggle; - - class->expand = gtk_real_tree_item_expand; - class->collapse = gtk_real_tree_item_collapse; - - tree_item_signals[EXPAND_TREE] = - gtk_signal_new (I_("expand"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTreeItemClass, expand), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); - tree_item_signals[COLLAPSE_TREE] = - gtk_signal_new (I_("collapse"), - GTK_RUN_FIRST, - GTK_CLASS_TYPE (object_class), - GTK_SIGNAL_OFFSET (GtkTreeItemClass, collapse), - _gtk_marshal_VOID__VOID, - GTK_TYPE_NONE, 0); -} - -/* callback for event box mouse event */ -static gint -gtk_tree_item_subtree_button_click (GtkWidget *widget) -{ - GtkTreeItem* item; - - g_return_val_if_fail (GTK_IS_EVENT_BOX (widget), FALSE); - - item = (GtkTreeItem*) gtk_object_get_user_data (GTK_OBJECT (widget)); - if (!gtk_widget_is_sensitive (GTK_WIDGET (item))) - return FALSE; - - if (item->expanded) - gtk_tree_item_collapse (item); - else - gtk_tree_item_expand (item); - - return TRUE; -} - -/* callback for event box state changed */ -static void -gtk_tree_item_subtree_button_changed_state (GtkWidget *widget) -{ - g_return_if_fail (GTK_IS_EVENT_BOX (widget)); - - if (gtk_widget_get_visible (widget)) - { - - if (widget->state == GTK_STATE_NORMAL) - gdk_window_set_background (widget->window, &widget->style->base[widget->state]); - else - gdk_window_set_background (widget->window, &widget->style->bg[widget->state]); - - if (gtk_widget_is_drawable (widget)) - gdk_window_clear_area (widget->window, 0, 0, - widget->allocation.width, widget->allocation.height); - } -} - -static void -gtk_tree_item_init (GtkTreeItem *tree_item) -{ - GtkWidget *eventbox, *pixmapwid; - - tree_item->expanded = FALSE; - tree_item->subtree = NULL; - gtk_widget_set_can_focus (GTK_WIDGET (tree_item), TRUE); - - /* create an event box containing one pixmaps */ - eventbox = gtk_event_box_new(); - gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK); - gtk_signal_connect(GTK_OBJECT(eventbox), "state-changed", - G_CALLBACK (gtk_tree_item_subtree_button_changed_state), - (gpointer)NULL); - gtk_signal_connect(GTK_OBJECT(eventbox), "realize", - G_CALLBACK (gtk_tree_item_subtree_button_changed_state), - (gpointer)NULL); - gtk_signal_connect(GTK_OBJECT(eventbox), "button-press-event", - G_CALLBACK (gtk_tree_item_subtree_button_click), - (gpointer)NULL); - gtk_object_set_user_data(GTK_OBJECT(eventbox), tree_item); - tree_item->pixmaps_box = eventbox; - - /* create pixmap for button '+' */ - pixmapwid = gtk_type_new (gtk_pixmap_get_type ()); - if (!tree_item->expanded) - gtk_container_add (GTK_CONTAINER (eventbox), pixmapwid); - gtk_widget_show (pixmapwid); - tree_item->plus_pix_widget = pixmapwid; - g_object_ref_sink (tree_item->plus_pix_widget); - - /* create pixmap for button '-' */ - pixmapwid = gtk_type_new (gtk_pixmap_get_type ()); - if (tree_item->expanded) - gtk_container_add (GTK_CONTAINER (eventbox), pixmapwid); - gtk_widget_show (pixmapwid); - tree_item->minus_pix_widget = pixmapwid; - g_object_ref_sink (tree_item->minus_pix_widget); - - gtk_widget_set_parent (eventbox, GTK_WIDGET (tree_item)); -} - - -GtkWidget* -gtk_tree_item_new (void) -{ - GtkWidget *tree_item; - - tree_item = GTK_WIDGET (gtk_type_new (gtk_tree_item_get_type ())); - - return tree_item; -} - -GtkWidget* -gtk_tree_item_new_with_label (const gchar *label) -{ - GtkWidget *tree_item; - GtkWidget *label_widget; - - tree_item = gtk_tree_item_new (); - label_widget = gtk_label_new (label); - gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.5); - - gtk_container_add (GTK_CONTAINER (tree_item), label_widget); - gtk_widget_show (label_widget); - - - return tree_item; -} - -void -gtk_tree_item_set_subtree (GtkTreeItem *tree_item, - GtkWidget *subtree) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - g_return_if_fail (GTK_IS_TREE (subtree)); - - if (tree_item->subtree) - { - g_warning("there is already a subtree for this tree item\n"); - return; - } - - tree_item->subtree = subtree; - GTK_TREE (subtree)->tree_owner = GTK_WIDGET (tree_item); - - /* show subtree button */ - if (tree_item->pixmaps_box) - gtk_widget_show (tree_item->pixmaps_box); - - if (tree_item->expanded) - gtk_widget_show (subtree); - else - gtk_widget_hide (subtree); - - gtk_widget_set_parent (subtree, GTK_WIDGET (tree_item)->parent); -} - -void -gtk_tree_item_select (GtkTreeItem *tree_item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_item_select (GTK_ITEM (tree_item)); -} - -void -gtk_tree_item_deselect (GtkTreeItem *tree_item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_item_deselect (GTK_ITEM (tree_item)); -} - -void -gtk_tree_item_expand (GtkTreeItem *tree_item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_signal_emit (GTK_OBJECT (tree_item), tree_item_signals[EXPAND_TREE], NULL); -} - -void -gtk_tree_item_collapse (GtkTreeItem *tree_item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - gtk_signal_emit (GTK_OBJECT (tree_item), tree_item_signals[COLLAPSE_TREE], NULL); -} - -static void -gtk_tree_item_add_pixmaps (GtkTreeItem *tree_item) -{ - GList *tmp_list; - GdkColormap *colormap; - GtkTreePixmaps *pixmap_node = NULL; - - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - if (tree_item->pixmaps) - return; - - colormap = gtk_widget_get_colormap (GTK_WIDGET (tree_item)); - - tmp_list = pixmaps; - while (tmp_list) - { - pixmap_node = (GtkTreePixmaps *)tmp_list->data; - - if (pixmap_node->colormap == colormap) - break; - - tmp_list = tmp_list->next; - } - - if (tmp_list) - { - pixmap_node->refcount++; - tree_item->pixmaps = tmp_list; - } - else - { - pixmap_node = g_new (GtkTreePixmaps, 1); - - pixmap_node->colormap = colormap; - g_object_ref (colormap); - - pixmap_node->refcount = 1; - - /* create pixmaps for plus icon */ - pixmap_node->pixmap_plus = - gdk_pixmap_create_from_xpm_d (GTK_WIDGET (tree_item)->window, - &pixmap_node->mask_plus, - NULL, - (gchar **)tree_plus); - - /* create pixmaps for minus icon */ - pixmap_node->pixmap_minus = - gdk_pixmap_create_from_xpm_d (GTK_WIDGET (tree_item)->window, - &pixmap_node->mask_minus, - NULL, - (gchar **)tree_minus); - - tree_item->pixmaps = pixmaps = g_list_prepend (pixmaps, pixmap_node); - } - - gtk_pixmap_set (GTK_PIXMAP (tree_item->plus_pix_widget), - pixmap_node->pixmap_plus, pixmap_node->mask_plus); - gtk_pixmap_set (GTK_PIXMAP (tree_item->minus_pix_widget), - pixmap_node->pixmap_minus, pixmap_node->mask_minus); -} - -static void -gtk_tree_item_remove_pixmaps (GtkTreeItem *tree_item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - if (tree_item->pixmaps) - { - GtkTreePixmaps *pixmap_node = (GtkTreePixmaps *)tree_item->pixmaps->data; - - g_assert (pixmap_node->refcount > 0); - - if (--pixmap_node->refcount == 0) - { - g_object_unref (pixmap_node->colormap); - g_object_unref (pixmap_node->pixmap_plus); - g_object_unref (pixmap_node->mask_plus); - g_object_unref (pixmap_node->pixmap_minus); - g_object_unref (pixmap_node->mask_minus); - - pixmaps = g_list_remove_link (pixmaps, tree_item->pixmaps); - g_list_free_1 (tree_item->pixmaps); - g_free (pixmap_node); - } - - tree_item->pixmaps = NULL; - } -} - -static void -gtk_tree_item_realize (GtkWidget *widget) -{ - GTK_WIDGET_CLASS (parent_class)->realize (widget); - - gdk_window_set_background (widget->window, - &widget->style->base[GTK_STATE_NORMAL]); - - gtk_tree_item_add_pixmaps (GTK_TREE_ITEM (widget)); -} - -static void -gtk_tree_item_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - GtkBin *bin = GTK_BIN (widget); - GtkTreeItem *item = GTK_TREE_ITEM (widget); - GtkRequisition child_requisition; - - requisition->width = (GTK_CONTAINER (widget)->border_width + - widget->style->xthickness) * 2; - requisition->height = GTK_CONTAINER (widget)->border_width * 2; - - if (bin->child && gtk_widget_get_visible (bin->child)) - { - GtkRequisition pix_requisition; - - gtk_widget_size_request (bin->child, &child_requisition); - - requisition->width += child_requisition.width; - - gtk_widget_size_request (item->pixmaps_box, - &pix_requisition); - requisition->width += pix_requisition.width + DEFAULT_DELTA + - GTK_TREE (widget->parent)->current_indent; - - requisition->height += MAX (child_requisition.height, - pix_requisition.height); - } -} - -static void -gtk_tree_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkBin *bin = GTK_BIN (widget); - GtkTreeItem *item = GTK_TREE_ITEM (widget); - GtkAllocation child_allocation; - gint border_width; - int temp; - - widget->allocation = *allocation; - if (gtk_widget_get_realized (widget)) - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, allocation->height); - - if (bin->child) - { - border_width = (GTK_CONTAINER (widget)->border_width + - widget->style->xthickness); - - child_allocation.x = border_width + GTK_TREE(widget->parent)->current_indent; - child_allocation.y = GTK_CONTAINER (widget)->border_width; - - child_allocation.width = item->pixmaps_box->requisition.width; - child_allocation.height = item->pixmaps_box->requisition.height; - - temp = allocation->height - child_allocation.height; - child_allocation.y += ( temp / 2 ) + ( temp % 2 ); - - gtk_widget_size_allocate (item->pixmaps_box, &child_allocation); - - child_allocation.y = GTK_CONTAINER (widget)->border_width; - child_allocation.height = MAX (1, (gint)allocation->height - child_allocation.y * 2); - child_allocation.x += item->pixmaps_box->requisition.width+DEFAULT_DELTA; - - child_allocation.width = - MAX (1, (gint)allocation->width - ((gint)child_allocation.x + border_width)); - - gtk_widget_size_allocate (bin->child, &child_allocation); - } -} - -static void -gtk_tree_item_draw_lines (GtkWidget *widget) -{ - GtkTreeItem* item; - GtkTree* tree; - guint lx1, ly1, lx2, ly2; - GdkGC* gc; - - g_return_if_fail (GTK_IS_TREE_ITEM (widget)); - - item = GTK_TREE_ITEM(widget); - tree = GTK_TREE(widget->parent); - - if (!tree->view_line) - return; - - gc = widget->style->text_gc[GTK_STATE_NORMAL]; - - /* draw vertical line */ - lx1 = item->pixmaps_box->allocation.width; - lx1 = lx2 = ((lx1 / 2) + (lx1 % 2) + - GTK_CONTAINER (widget)->border_width + 1 + tree->current_indent); - ly1 = 0; - ly2 = widget->allocation.height; - - if (g_list_last (tree->children)->data == widget) - ly2 = (ly2 / 2) + (ly2 % 2); - - if (tree != tree->root_tree) - gdk_draw_line (widget->window, gc, lx1, ly1, lx2, ly2); - - /* draw vertical line for subtree connecting */ - if(g_list_last(tree->children)->data != (gpointer)widget) - ly2 = (ly2 / 2) + (ly2 % 2); - - lx2 += DEFAULT_DELTA; - - if (item->subtree && item->expanded) - gdk_draw_line (widget->window, gc, - lx2, ly2, lx2, widget->allocation.height); - - /* draw horizontal line */ - ly1 = ly2; - lx2 += 2; - - gdk_draw_line (widget->window, gc, lx1, ly1, lx2, ly2); - - lx2 -= DEFAULT_DELTA+2; - ly1 = 0; - ly2 = widget->allocation.height; - - if (tree != tree->root_tree) - { - item = GTK_TREE_ITEM (tree->tree_owner); - tree = GTK_TREE (GTK_WIDGET (tree)->parent); - while (tree != tree->root_tree) - { - lx1 = lx2 -= tree->indent_value; - - if (g_list_last (tree->children)->data != item) - gdk_draw_line (widget->window, gc, lx1, ly1, lx2, ly2); - item = GTK_TREE_ITEM (tree->tree_owner); - tree = GTK_TREE (GTK_WIDGET (tree)->parent); - } - } -} - -static void -gtk_tree_item_paint (GtkWidget *widget, - GdkRectangle *area) -{ - GdkRectangle child_area, item_area; - GtkTreeItem* tree_item; - - /* FIXME: We should honor tree->view_mode, here - I think - * the desired effect is that when the mode is VIEW_ITEM, - * only the subitem is drawn as selected, not the entire - * line. (Like the way that the tree in Windows Explorer - * works). - */ - if (gtk_widget_is_drawable (widget)) - { - tree_item = GTK_TREE_ITEM(widget); - - if (widget->state == GTK_STATE_NORMAL) - { - gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height); - } - else - { - if (!gtk_widget_is_sensitive (widget)) - gtk_paint_flat_box(widget->style, widget->window, - widget->state, GTK_SHADOW_NONE, - area, widget, "treeitem", - 0, 0, -1, -1); - else - gtk_paint_flat_box(widget->style, widget->window, - widget->state, GTK_SHADOW_ETCHED_OUT, - area, widget, "treeitem", - 0, 0, -1, -1); - } - - /* draw left size of tree item */ - item_area.x = 0; - item_area.y = 0; - item_area.width = (tree_item->pixmaps_box->allocation.width + DEFAULT_DELTA + - GTK_TREE (widget->parent)->current_indent + 2); - item_area.height = widget->allocation.height; - - - if (gdk_rectangle_intersect(&item_area, area, &child_area)) - { - - gtk_tree_item_draw_lines(widget); - - if (tree_item->pixmaps_box && - gtk_widget_get_visible(tree_item->pixmaps_box) && - gtk_widget_intersect (tree_item->pixmaps_box, area, &child_area)) - { - gtk_widget_queue_draw_area (tree_item->pixmaps_box, - child_area.x, child_area.y, - child_area.width, child_area.height); - gdk_window_process_updates (tree_item->pixmaps_box->window, TRUE); - } - } - - if (gtk_widget_has_focus (widget)) - gtk_paint_focus (widget->style, widget->window, gtk_widget_get_state (widget), - NULL, widget, "treeitem", - 0, 0, - widget->allocation.width, - widget->allocation.height); - - } -} - -static gint -gtk_tree_item_button_press (GtkWidget *widget, - GdkEventButton *event) -{ - if (event->type == GDK_BUTTON_PRESS - && gtk_widget_is_sensitive(widget) - && !gtk_widget_has_focus (widget)) - gtk_widget_grab_focus (widget); - - return (event->type == GDK_BUTTON_PRESS && gtk_widget_is_sensitive(widget)); -} - -static void -gtk_tree_item_expose_child (GtkWidget *child, - gpointer client_data) -{ - struct { - GtkWidget *container; - GdkEventExpose *event; - } *data = client_data; - - if (gtk_widget_is_drawable (child) && - !gtk_widget_get_has_window (child) && - (child->window == data->event->window)) - { - GdkEvent *child_event = gdk_event_new (GDK_EXPOSE); - child_event->expose = *data->event; - g_object_ref (child_event->expose.window); - - child_event->expose.region = gtk_widget_region_intersect (child, - data->event->region); - if (!gdk_region_empty (child_event->expose.region)) - { - gdk_region_get_clipbox (child_event->expose.region, &child_event->expose.area); - gtk_widget_send_expose (child, child_event); - } - gdk_event_free (child_event); - } -} - -static gint -gtk_tree_item_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - struct { - GtkWidget *container; - GdkEventExpose *event; - } data; - - if (gtk_widget_is_drawable (widget)) - { - gtk_tree_item_paint (widget, &event->area); - - data.container = widget; - data.event = event; - - gtk_container_forall (GTK_CONTAINER (widget), - gtk_tree_item_expose_child, - &data); - } - - return FALSE; -} - -static void -gtk_real_tree_item_select (GtkItem *item) -{ - GtkWidget *widget; - - g_return_if_fail (GTK_IS_TREE_ITEM (item)); - - widget = GTK_WIDGET (item); - - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); - - if (!widget->parent || GTK_TREE (widget->parent)->view_mode == GTK_TREE_VIEW_LINE) - gtk_widget_set_state (GTK_TREE_ITEM (item)->pixmaps_box, GTK_STATE_SELECTED); -} - -static void -gtk_real_tree_item_deselect (GtkItem *item) -{ - GtkTreeItem *tree_item; - GtkWidget *widget; - - g_return_if_fail (GTK_IS_TREE_ITEM (item)); - - tree_item = GTK_TREE_ITEM (item); - widget = GTK_WIDGET (item); - - gtk_widget_set_state (widget, GTK_STATE_NORMAL); - - if (!widget->parent || GTK_TREE (widget->parent)->view_mode == GTK_TREE_VIEW_LINE) - gtk_widget_set_state (tree_item->pixmaps_box, GTK_STATE_NORMAL); -} - -static void -gtk_real_tree_item_toggle (GtkItem *item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM (item)); - - if(!gtk_widget_is_sensitive(GTK_WIDGET (item))) - return; - - if (GTK_IS_TREE (GTK_WIDGET (item)->parent)) - gtk_tree_select_child (GTK_TREE (GTK_WIDGET (item)->parent), - GTK_WIDGET (item)); - else - { - /* Should we really bother with this bit? A listitem not in a list? - * -Johannes Keukelaar - * yes, always be on the safe side! - * -timj - */ - if (GTK_WIDGET (item)->state == GTK_STATE_SELECTED) - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_NORMAL); - else - gtk_widget_set_state (GTK_WIDGET (item), GTK_STATE_SELECTED); - } -} - -static void -gtk_real_tree_item_expand (GtkTreeItem *tree_item) -{ - GtkTree* tree; - - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - if (tree_item->subtree && !tree_item->expanded) - { - tree = GTK_TREE (GTK_WIDGET (tree_item)->parent); - - /* hide subtree widget */ - gtk_widget_show (tree_item->subtree); - - /* hide button '+' and show button '-' */ - if (tree_item->pixmaps_box) - { - gtk_container_remove (GTK_CONTAINER (tree_item->pixmaps_box), - tree_item->plus_pix_widget); - gtk_container_add (GTK_CONTAINER (tree_item->pixmaps_box), - tree_item->minus_pix_widget); - } - if (tree->root_tree) - gtk_widget_queue_resize (GTK_WIDGET (tree->root_tree)); - tree_item->expanded = TRUE; - } -} - -static void -gtk_real_tree_item_collapse (GtkTreeItem *tree_item) -{ - GtkTree* tree; - - g_return_if_fail (GTK_IS_TREE_ITEM (tree_item)); - - if (tree_item->subtree && tree_item->expanded) - { - tree = GTK_TREE (GTK_WIDGET (tree_item)->parent); - - /* hide subtree widget */ - gtk_widget_hide (tree_item->subtree); - - /* hide button '-' and show button '+' */ - if (tree_item->pixmaps_box) - { - gtk_container_remove (GTK_CONTAINER (tree_item->pixmaps_box), - tree_item->minus_pix_widget); - gtk_container_add (GTK_CONTAINER (tree_item->pixmaps_box), - tree_item->plus_pix_widget); - } - if (tree->root_tree) - gtk_widget_queue_resize (GTK_WIDGET (tree->root_tree)); - tree_item->expanded = FALSE; - } -} - -static void -gtk_tree_item_destroy (GtkObject *object) -{ - GtkTreeItem* item = GTK_TREE_ITEM(object); - GtkWidget* child; - -#ifdef TREE_DEBUG - g_message("+ gtk_tree_item_destroy [object %#x]\n", (int)object); -#endif /* TREE_DEBUG */ - - /* free sub tree if it exist */ - child = item->subtree; - if (child) - { - g_object_ref (child); - gtk_widget_unparent (child); - gtk_widget_destroy (child); - g_object_unref (child); - item->subtree = NULL; - } - - /* free pixmaps box */ - child = item->pixmaps_box; - if (child) - { - g_object_ref (child); - gtk_widget_unparent (child); - gtk_widget_destroy (child); - g_object_unref (child); - item->pixmaps_box = NULL; - } - - - /* destroy plus pixmap */ - if (item->plus_pix_widget) - { - gtk_widget_destroy (item->plus_pix_widget); - g_object_unref (item->plus_pix_widget); - item->plus_pix_widget = NULL; - } - - /* destroy minus pixmap */ - if (item->minus_pix_widget) - { - gtk_widget_destroy (item->minus_pix_widget); - g_object_unref (item->minus_pix_widget); - item->minus_pix_widget = NULL; - } - - /* By removing the pixmaps here, and not in unrealize, we depend on - * the fact that a widget can never change colormap or visual. - */ - gtk_tree_item_remove_pixmaps (item); - - GTK_OBJECT_CLASS (parent_class)->destroy (object); - -#ifdef TREE_DEBUG - g_message("- gtk_tree_item_destroy\n"); -#endif /* TREE_DEBUG */ -} - -void -gtk_tree_item_remove_subtree (GtkTreeItem* item) -{ - g_return_if_fail (GTK_IS_TREE_ITEM(item)); - g_return_if_fail (item->subtree != NULL); - - if (GTK_TREE (item->subtree)->children) - { - /* The following call will remove the children and call - * gtk_tree_item_remove_subtree() again. So we are done. - */ - gtk_tree_remove_items (GTK_TREE (item->subtree), - GTK_TREE (item->subtree)->children); - return; - } - - if (gtk_widget_get_mapped (item->subtree)) - gtk_widget_unmap (item->subtree); - - gtk_widget_unparent (item->subtree); - - if (item->pixmaps_box) - gtk_widget_hide (item->pixmaps_box); - - item->subtree = NULL; - - if (item->expanded) - { - item->expanded = FALSE; - if (item->pixmaps_box) - { - gtk_container_remove (GTK_CONTAINER (item->pixmaps_box), - item->minus_pix_widget); - gtk_container_add (GTK_CONTAINER (item->pixmaps_box), - item->plus_pix_widget); - } - } -} - -static void -gtk_tree_item_map (GtkWidget *widget) -{ - GtkBin *bin = GTK_BIN (widget); - GtkTreeItem* item = GTK_TREE_ITEM(widget); - - gtk_widget_set_mapped (widget, TRUE); - - if(item->pixmaps_box && - gtk_widget_get_visible (item->pixmaps_box) && - !gtk_widget_get_mapped (item->pixmaps_box)) - gtk_widget_map (item->pixmaps_box); - - if (bin->child && - gtk_widget_get_visible (bin->child) && - !gtk_widget_get_mapped (bin->child)) - gtk_widget_map (bin->child); - - gdk_window_show (widget->window); -} - -static void -gtk_tree_item_unmap (GtkWidget *widget) -{ - GtkBin *bin = GTK_BIN (widget); - GtkTreeItem* item = GTK_TREE_ITEM(widget); - - gtk_widget_set_mapped (widget, FALSE); - - gdk_window_hide (widget->window); - - if(item->pixmaps_box && - gtk_widget_get_visible (item->pixmaps_box) && - gtk_widget_get_mapped (item->pixmaps_box)) - gtk_widget_unmap (bin->child); - - if (bin->child && - gtk_widget_get_visible (bin->child) && - gtk_widget_get_mapped (bin->child)) - gtk_widget_unmap (bin->child); -} - -static void -gtk_tree_item_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - GtkBin *bin = GTK_BIN (container); - GtkTreeItem *tree_item = GTK_TREE_ITEM (container); - - if (bin->child) - (* callback) (bin->child, callback_data); - if (include_internals && tree_item->subtree) - (* callback) (tree_item->subtree, callback_data); - if (include_internals && tree_item->pixmaps_box) - (* callback) (tree_item->pixmaps_box, callback_data); -} - -#define __GTK_TREE_ITEM_C__ -#include "gtkaliasdef.c" diff --git a/gtk/gtktreeitem.h b/gtk/gtktreeitem.h deleted file mode 100644 index 0e8dbaf1dd..0000000000 --- a/gtk/gtktreeitem.h +++ /dev/null @@ -1,90 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifdef GTK_ENABLE_BROKEN - -#ifndef __GTK_TREE_ITEM_H__ -#define __GTK_TREE_ITEM_H__ - - -#include <gtk/gtkitem.h> - - -G_BEGIN_DECLS - -#define GTK_TYPE_TREE_ITEM (gtk_tree_item_get_type ()) -#define GTK_TREE_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE_ITEM, GtkTreeItem)) -#define GTK_TREE_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_TREE_ITEM, GtkTreeItemClass)) -#define GTK_IS_TREE_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE_ITEM)) -#define GTK_IS_TREE_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_TREE_ITEM)) -#define GTK_TREE_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_TREE_ITEM, GtkTreeItemClass)) - - -#define GTK_TREE_ITEM_SUBTREE(obj) (GTK_TREE_ITEM(obj)->subtree) - - -typedef struct _GtkTreeItem GtkTreeItem; -typedef struct _GtkTreeItemClass GtkTreeItemClass; - -struct _GtkTreeItem -{ - GtkItem item; - - GtkWidget *subtree; - GtkWidget *pixmaps_box; - GtkWidget *plus_pix_widget, *minus_pix_widget; - - GList *pixmaps; /* pixmap node for this items color depth */ - - guint expanded : 1; -}; - -struct _GtkTreeItemClass -{ - GtkItemClass parent_class; - - void (* expand) (GtkTreeItem *tree_item); - void (* collapse) (GtkTreeItem *tree_item); -}; - - -GType gtk_tree_item_get_type (void) G_GNUC_CONST; -GtkWidget* gtk_tree_item_new (void); -GtkWidget* gtk_tree_item_new_with_label (const gchar *label); -void gtk_tree_item_set_subtree (GtkTreeItem *tree_item, - GtkWidget *subtree); -void gtk_tree_item_remove_subtree (GtkTreeItem *tree_item); -void gtk_tree_item_select (GtkTreeItem *tree_item); -void gtk_tree_item_deselect (GtkTreeItem *tree_item); -void gtk_tree_item_expand (GtkTreeItem *tree_item); -void gtk_tree_item_collapse (GtkTreeItem *tree_item); - - -G_END_DECLS - -#endif /* __GTK_TREE_ITEM_H__ */ - -#endif /* GTK_ENABLE_BROKEN */ diff --git a/gtk/gtktreemodel.h b/gtk/gtktreemodel.h index ba0fe4ef3e..e7f59c672b 100644 --- a/gtk/gtktreemodel.h +++ b/gtk/gtktreemodel.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -153,10 +153,6 @@ gboolean gtk_tree_path_is_ancestor (GtkTreePath *path, gboolean gtk_tree_path_is_descendant (GtkTreePath *path, GtkTreePath *ancestor); -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_tree_path_new_root() gtk_tree_path_new_first() -#endif /* !GTK_DISABLE_DEPRECATED */ - /* Row reference (an object that tracks model changes so it refers to the same * row always; a path refers to a position, not a fixed row). You almost always * want to call gtk_tree_row_reference_new. @@ -245,11 +241,6 @@ void gtk_tree_model_foreach (GtkTreeModel *model GtkTreeModelForeachFunc func, gpointer user_data); - -#ifndef GTK_DISABLE_DEPRECATED -#define gtk_tree_model_get_iter_root(tree_model, iter) gtk_tree_model_get_iter_first(tree_model, iter) -#endif /* !GTK_DISABLE_DEPRECATED */ - /* Signals */ void gtk_tree_model_row_changed (GtkTreeModel *tree_model, GtkTreePath *path, diff --git a/gtk/gtktreemodelfilter.h b/gtk/gtktreemodelfilter.h index dbff64aed3..653e395a03 100644 --- a/gtk/gtktreemodelfilter.h +++ b/gtk/gtktreemodelfilter.h @@ -18,7 +18,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktreemodelsort.h b/gtk/gtktreemodelsort.h index 4823398579..e144b32c78 100644 --- a/gtk/gtktreemodelsort.h +++ b/gtk/gtktreemodelsort.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktreeselection.h b/gtk/gtktreeselection.h index ece7ab8e6c..267a2af37e 100644 --- a/gtk/gtktreeselection.h +++ b/gtk/gtktreeselection.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktreesortable.h b/gtk/gtktreesortable.h index a576e2dff0..52dea7199d 100644 --- a/gtk/gtktreesortable.h +++ b/gtk/gtktreesortable.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktreestore.h b/gtk/gtktreestore.h index b47b1ecb33..aee9baca97 100644 --- a/gtk/gtktreestore.h +++ b/gtk/gtktreestore.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index f464ec4010..5f1fb04f55 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -13018,71 +13018,6 @@ gtk_tree_view_get_visible_rect (GtkTreeView *tree_view, } /** - * gtk_tree_view_widget_to_tree_coords: - * @tree_view: a #GtkTreeView - * @wx: X coordinate relative to bin_window - * @wy: Y coordinate relative to bin_window - * @tx: return location for tree X coordinate - * @ty: return location for tree Y coordinate - * - * Converts bin_window coordinates to coordinates for the - * tree (the full scrollable area of the tree). - * - * Deprecated: 2.12: Due to historial reasons the name of this function is - * incorrect. For converting coordinates relative to the widget to - * bin_window coordinates, please see - * gtk_tree_view_convert_widget_to_bin_window_coords(). - * - **/ -void -gtk_tree_view_widget_to_tree_coords (GtkTreeView *tree_view, - gint wx, - gint wy, - gint *tx, - gint *ty) -{ - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); - - if (tx) - *tx = wx + tree_view->priv->hadjustment->value; - if (ty) - *ty = wy + tree_view->priv->dy; -} - -/** - * gtk_tree_view_tree_to_widget_coords: - * @tree_view: a #GtkTreeView - * @tx: tree X coordinate - * @ty: tree Y coordinate - * @wx: return location for X coordinate relative to bin_window - * @wy: return location for Y coordinate relative to bin_window - * - * Converts tree coordinates (coordinates in full scrollable area of the tree) - * to bin_window coordinates. - * - * Deprecated: 2.12: Due to historial reasons the name of this function is - * incorrect. For converting bin_window coordinates to coordinates relative - * to bin_window, please see - * gtk_tree_view_convert_bin_window_to_widget_coords(). - * - **/ -void -gtk_tree_view_tree_to_widget_coords (GtkTreeView *tree_view, - gint tx, - gint ty, - gint *wx, - gint *wy) -{ - g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); - - if (wx) - *wx = tx - tree_view->priv->hadjustment->value; - if (wy) - *wy = ty - tree_view->priv->dy; -} - - -/** * gtk_tree_view_convert_widget_to_tree_coords: * @tree_view: a #GtkTreeView * @wx: X coordinate relative to the widget diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index 098ab5ce17..71734c941e 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -260,19 +260,6 @@ void gtk_tree_view_get_background_area (GtkTreeView GdkRectangle *rect); void gtk_tree_view_get_visible_rect (GtkTreeView *tree_view, GdkRectangle *visible_rect); - -#ifndef GTK_DISABLE_DEPRECATED -void gtk_tree_view_widget_to_tree_coords (GtkTreeView *tree_view, - gint wx, - gint wy, - gint *tx, - gint *ty); -void gtk_tree_view_tree_to_widget_coords (GtkTreeView *tree_view, - gint tx, - gint ty, - gint *wx, - gint *wy); -#endif /* !GTK_DISABLE_DEPRECATED */ gboolean gtk_tree_view_get_visible_range (GtkTreeView *tree_view, GtkTreePath **start_path, GtkTreePath **end_path); diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 348a9df98a..5c36375321 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -1587,23 +1587,6 @@ gtk_tree_view_column_cell_layout_get_cells (GtkCellLayout *layout) } /** - * gtk_tree_view_column_get_cell_renderers: - * @tree_column: A #GtkTreeViewColumn - * - * Returns a newly-allocated #GList of all the cell renderers in the column, - * in no particular order. The list must be freed with g_list_free(). - * - * Return value: A list of #GtkCellRenderers - * - * Deprecated: 2.18: use gtk_cell_layout_get_cells() instead. - **/ -GList * -gtk_tree_view_column_get_cell_renderers (GtkTreeViewColumn *tree_column) -{ - return gtk_tree_view_column_cell_layout_get_cells (GTK_CELL_LAYOUT (tree_column)); -} - -/** * gtk_tree_view_column_add_attribute: * @tree_column: A #GtkTreeViewColumn. * @cell_renderer: the #GtkCellRenderer to set attributes on diff --git a/gtk/gtktreeviewcolumn.h b/gtk/gtktreeviewcolumn.h index b06e845d9f..4e72235bc8 100644 --- a/gtk/gtktreeviewcolumn.h +++ b/gtk/gtktreeviewcolumn.h @@ -17,7 +17,7 @@ * Boston, MA 02111-1307, USA. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -135,9 +135,6 @@ void gtk_tree_view_column_pack_end (GtkTreeViewCol GtkCellRenderer *cell, gboolean expand); void gtk_tree_view_column_clear (GtkTreeViewColumn *tree_column); -#ifndef GTK_DISABLE_DEPRECATED -GList *gtk_tree_view_column_get_cell_renderers (GtkTreeViewColumn *tree_column); -#endif void gtk_tree_view_column_add_attribute (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell_renderer, const gchar *attribute, diff --git a/gtk/gtktypeutils.c b/gtk/gtktypeutils.c index 6047d6f218..b66289d019 100644 --- a/gtk/gtktypeutils.c +++ b/gtk/gtktypeutils.c @@ -24,8 +24,6 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#undef GTK_DISABLE_DEPRECATED - #include "config.h" #include <string.h> /* strcmp */ @@ -34,111 +32,6 @@ #include "gtkintl.h" #include "gtkalias.h" - -/* --- functions --- */ -GtkType -gtk_type_unique (GtkType parent_type, - const GtkTypeInfo *gtkinfo) -{ - GTypeInfo tinfo = { 0, }; - - g_return_val_if_fail (GTK_TYPE_IS_OBJECT (parent_type), 0); - g_return_val_if_fail (gtkinfo != NULL, 0); - g_return_val_if_fail (gtkinfo->type_name != NULL, 0); - g_return_val_if_fail (g_type_from_name (gtkinfo->type_name) == 0, 0); - - tinfo.class_size = gtkinfo->class_size; - tinfo.base_init = gtkinfo->base_class_init_func; - tinfo.base_finalize = NULL; - tinfo.class_init = (GClassInitFunc) gtkinfo->class_init_func; - tinfo.class_finalize = NULL; - tinfo.class_data = NULL; - tinfo.instance_size = gtkinfo->object_size; - tinfo.n_preallocs = 0; - tinfo.instance_init = gtkinfo->object_init_func; - - return g_type_register_static (parent_type, gtkinfo->type_name, &tinfo, 0); -} - -/** - * gtk_type_class - * @type: a #GtkType. - * - * Returns a pointer pointing to the class of @type or %NULL if there - * was any trouble identifying @type. Initializes the class if - * necessary. - * - * Returns: pointer to the class. - * - * Deprecated: 2.14: Use g_type_class_peek() or g_type_class_ref() instead. - **/ -gpointer -gtk_type_class (GtkType type) -{ - static GQuark quark_static_class = 0; - gpointer class; - - if (!G_TYPE_IS_ENUM (type) && !G_TYPE_IS_FLAGS (type)) - g_return_val_if_fail (G_TYPE_IS_OBJECT (type), NULL); - - /* ok, this is a bit ugly, GLib reference counts classes, - * and gtk_type_class() used to always return static classes. - * while we coud be faster with just peeking the glib class - * for the normal code path, we can't be sure that that - * class stays around (someone else might be holding the - * reference count and is going to drop it later). so to - * ensure that Gtk actually holds a static reference count - * on the class, we use GType qdata to store referenced - * classes, and only return those. - */ - - class = g_type_get_qdata (type, quark_static_class); - if (!class) - { - if (!quark_static_class) - quark_static_class = g_quark_from_static_string ("GtkStaticTypeClass"); - - class = g_type_class_ref (type); - g_assert (class != NULL); - g_type_set_qdata (type, quark_static_class, class); - } - - return class; -} - -gpointer -gtk_type_new (GtkType type) -{ - gpointer object; - - g_return_val_if_fail (GTK_TYPE_IS_OBJECT (type), NULL); - - object = g_object_new (type, NULL); - - return object; -} - -void -gtk_type_init (GTypeDebugFlags debug_flags) -{ - static gboolean initialized = FALSE; - - if (!initialized) - { - GType unused; - - initialized = TRUE; - - /* initialize GLib type system - */ - g_type_init_with_debug_flags (debug_flags); - - /* GTK_TYPE_OBJECT - */ - unused = gtk_object_get_type (); - } -} - GType gtk_identifier_get_type (void) { @@ -153,66 +46,5 @@ gtk_identifier_get_type (void) return our_type; } -GtkEnumValue* -gtk_type_enum_get_values (GtkType enum_type) -{ - GEnumClass *class; - - g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL); - - class = gtk_type_class (enum_type); - - return class->values; -} - -GtkFlagValue* -gtk_type_flags_get_values (GtkType flags_type) -{ - GFlagsClass *class; - - g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL); - - class = gtk_type_class (flags_type); - - return class->values; -} - -GtkEnumValue* -gtk_type_enum_find_value (GtkType enum_type, - const gchar *value_name) -{ - GtkEnumValue *value; - GEnumClass *class; - - g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL); - g_return_val_if_fail (value_name != NULL, NULL); - - class = gtk_type_class (enum_type); - value = g_enum_get_value_by_name (class, value_name); - if (!value) - value = g_enum_get_value_by_nick (class, value_name); - - return value; -} - -GtkFlagValue* -gtk_type_flags_find_value (GtkType flags_type, - const gchar *value_name) -{ - GtkFlagValue *value; - GFlagsClass *class; - - g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL); - g_return_val_if_fail (value_name != NULL, NULL); - - class = gtk_type_class (flags_type); - value = g_flags_get_value_by_name (class, value_name); - if (!value) - value = g_flags_get_value_by_nick (class, value_name); - - return value; -} - - #define __GTK_TYPE_UTILS_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtktypeutils.h b/gtk/gtktypeutils.h index 48b664c2a7..75711a3f4a 100644 --- a/gtk/gtktypeutils.h +++ b/gtk/gtktypeutils.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -59,79 +59,7 @@ typedef void (*GtkCallbackMarshal) (GtkObject *object, typedef gchar * (*GtkTranslateFunc) (const gchar *path, gpointer func_data); - -/* Everything below is deprecated and superseded by GType API - */ - -#ifndef GTK_DISABLE_DEPRECATED - -/* Fundamental Types - * many of these are just aliases for GLib types to maintain - * compatibility - */ - -#define GTK_TYPE_INVALID G_TYPE_INVALID -#define GTK_TYPE_NONE G_TYPE_NONE -#define GTK_TYPE_ENUM G_TYPE_ENUM -#define GTK_TYPE_FLAGS G_TYPE_FLAGS - -/* GtkArg types */ -#define GTK_TYPE_CHAR G_TYPE_CHAR -#define GTK_TYPE_UCHAR G_TYPE_UCHAR -#define GTK_TYPE_BOOL G_TYPE_BOOLEAN -#define GTK_TYPE_INT G_TYPE_INT -#define GTK_TYPE_UINT G_TYPE_UINT -#define GTK_TYPE_LONG G_TYPE_LONG -#define GTK_TYPE_ULONG G_TYPE_ULONG -#define GTK_TYPE_FLOAT G_TYPE_FLOAT -#define GTK_TYPE_DOUBLE G_TYPE_DOUBLE -#define GTK_TYPE_STRING G_TYPE_STRING -#define GTK_TYPE_BOXED G_TYPE_BOXED -#define GTK_TYPE_POINTER G_TYPE_POINTER - -typedef GType GtkFundamentalType; - -/* --- type macros --- */ -#define GTK_CLASS_NAME(class) (g_type_name (G_TYPE_FROM_CLASS (class))) -#define GTK_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class)) -#define GTK_TYPE_IS_OBJECT(type) (g_type_is_a ((type), GTK_TYPE_OBJECT)) - -/* outdated macros that really shouldn't e used anymore, - * use the GLib type system instead - */ -#define GTK_TYPE_FUNDAMENTAL_LAST (G_TYPE_LAST_RESERVED_FUNDAMENTAL - 1) -#define GTK_TYPE_FUNDAMENTAL_MAX (G_TYPE_FUNDAMENTAL_MAX) - -#define GTK_FUNDAMENTAL_TYPE G_TYPE_FUNDAMENTAL -#define GTK_STRUCT_OFFSET G_STRUCT_OFFSET - -/* glib macro wrappers (compatibility) */ -#define GTK_CHECK_CAST G_TYPE_CHECK_INSTANCE_CAST -#define GTK_CHECK_CLASS_CAST G_TYPE_CHECK_CLASS_CAST -#define GTK_CHECK_GET_CLASS G_TYPE_INSTANCE_GET_CLASS -#define GTK_CHECK_TYPE G_TYPE_CHECK_INSTANCE_TYPE -#define GTK_CHECK_CLASS_TYPE G_TYPE_CHECK_CLASS_TYPE - -/* glib type wrappers (compatibility) */ - -typedef GType GtkType; -typedef GTypeInstance GtkTypeObject; -typedef GTypeClass GtkTypeClass; -typedef GBaseInitFunc GtkClassInitFunc; -typedef GInstanceInitFunc GtkObjectInitFunc; -typedef GSignalCMarshaller GtkSignalMarshaller; - -typedef void (*GtkDestroyNotify) (gpointer data); -typedef void (*GtkSignalFunc) (void); - -#define GTK_SIGNAL_FUNC(f) G_CALLBACK(f) - -#endif /* GTK_DISABLE_DEPRECATED */ - -#if !defined (GTK_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) - -/* Used by gtk_container_foreach_unmarshal () */ - +#if defined (GTK_COMPILATION) /* GtkArg, used to hold differently typed values */ struct _GtkArg { @@ -166,96 +94,7 @@ struct _GtkArg } signal_data; } d; }; - -/* argument value access macros, these must not contain casts, - * to allow the usage of these macros in combination with the - * address operator, e.g. >K_VALUE_CHAR (*arg) - */ -#define GTK_VALUE_CHAR(a) ((a).d.char_data) -#define GTK_VALUE_UCHAR(a) ((a).d.uchar_data) -#define GTK_VALUE_BOOL(a) ((a).d.bool_data) -#define GTK_VALUE_INT(a) ((a).d.int_data) -#define GTK_VALUE_UINT(a) ((a).d.uint_data) -#define GTK_VALUE_LONG(a) ((a).d.long_data) -#define GTK_VALUE_ULONG(a) ((a).d.ulong_data) -#define GTK_VALUE_FLOAT(a) ((a).d.float_data) -#define GTK_VALUE_DOUBLE(a) ((a).d.double_data) -#define GTK_VALUE_STRING(a) ((a).d.string_data) -#define GTK_VALUE_ENUM(a) ((a).d.int_data) -#define GTK_VALUE_FLAGS(a) ((a).d.uint_data) -#define GTK_VALUE_BOXED(a) ((a).d.pointer_data) -#define GTK_VALUE_OBJECT(a) ((a).d.object_data) -#define GTK_VALUE_POINTER(a) ((a).d.pointer_data) -#define GTK_VALUE_SIGNAL(a) ((a).d.signal_data) - -#endif /* !GTK_DISABLE_DEPRECATED || GTK_COMPILATION */ - -#ifndef GTK_DISABLE_DEPRECATED - -/* return location macros, these all narrow down to - * pointer types, because return values need to be - * passed by reference - */ -#define GTK_RETLOC_CHAR(a) ((gchar*) (a).d.pointer_data) -#define GTK_RETLOC_UCHAR(a) ((guchar*) (a).d.pointer_data) -#define GTK_RETLOC_BOOL(a) ((gboolean*) (a).d.pointer_data) -#define GTK_RETLOC_INT(a) ((gint*) (a).d.pointer_data) -#define GTK_RETLOC_UINT(a) ((guint*) (a).d.pointer_data) -#define GTK_RETLOC_LONG(a) ((glong*) (a).d.pointer_data) -#define GTK_RETLOC_ULONG(a) ((gulong*) (a).d.pointer_data) -#define GTK_RETLOC_FLOAT(a) ((gfloat*) (a).d.pointer_data) -#define GTK_RETLOC_DOUBLE(a) ((gdouble*) (a).d.pointer_data) -#define GTK_RETLOC_STRING(a) ((gchar**) (a).d.pointer_data) -#define GTK_RETLOC_ENUM(a) ((gint*) (a).d.pointer_data) -#define GTK_RETLOC_FLAGS(a) ((guint*) (a).d.pointer_data) -#define GTK_RETLOC_BOXED(a) ((gpointer*) (a).d.pointer_data) -#define GTK_RETLOC_OBJECT(a) ((GtkObject**) (a).d.pointer_data) -#define GTK_RETLOC_POINTER(a) ((gpointer*) (a).d.pointer_data) -/* GTK_RETLOC_SIGNAL() - no such thing */ - -/* type registration, it is recommended to use - * g_type_register_static() or - * g_type_register_dynamic() instead - */ -typedef struct _GtkTypeInfo GtkTypeInfo; - -struct _GtkTypeInfo -{ - gchar *type_name; - guint object_size; - guint class_size; - GtkClassInitFunc class_init_func; - GtkObjectInitFunc object_init_func; - gpointer reserved_1; - gpointer reserved_2; - GtkClassInitFunc base_class_init_func; -}; - -void gtk_type_init (GTypeDebugFlags debug_flags); -GtkType gtk_type_unique (GtkType parent_type, - const GtkTypeInfo *gtkinfo); -gpointer gtk_type_class (GtkType type); -gpointer gtk_type_new (GtkType type); - -/* --- compatibility defines --- */ -#define gtk_type_name(type) g_type_name (type) -#define gtk_type_from_name(name) g_type_from_name (name) -#define gtk_type_parent(type) g_type_parent (type) -#define gtk_type_is_a(type, is_a_type) g_type_is_a ((type), (is_a_type)) - -/* enum/flags compatibility functions, we strongly - * recommend to use the glib enum/flags classes directly - */ -typedef GEnumValue GtkEnumValue; -typedef GFlagsValue GtkFlagValue; -GtkEnumValue* gtk_type_enum_get_values (GtkType enum_type); -GtkFlagValue* gtk_type_flags_get_values (GtkType flags_type); -GtkEnumValue* gtk_type_enum_find_value (GtkType enum_type, - const gchar *value_name); -GtkFlagValue* gtk_type_flags_find_value (GtkType flags_type, - const gchar *value_name); - -#endif /* GTK_DISABLE_DEPRECATED */ +#endif /* GTK_COMPILATION */ G_END_DECLS diff --git a/gtk/gtkuimanager.h b/gtk/gtkuimanager.h index e58c2912db..faaf9ef787 100644 --- a/gtk/gtkuimanager.h +++ b/gtk/gtkuimanager.h @@ -28,7 +28,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvbbox.c b/gtk/gtkvbbox.c index c6bf3696cf..ef8ea6c352 100644 --- a/gtk/gtkvbbox.c +++ b/gtk/gtkvbbox.c @@ -55,7 +55,6 @@ * gtk_button_box_set_layout(). */ -static gint default_spacing = 10; static GtkButtonBoxStyle default_layout_style = GTK_BUTTONBOX_EDGE; G_DEFINE_TYPE (GtkVButtonBox, gtk_vbutton_box, GTK_TYPE_BUTTON_BOX) @@ -85,68 +84,6 @@ gtk_vbutton_box_new (void) return g_object_new (GTK_TYPE_VBUTTON_BOX, NULL); } -/** - * gtk_vbutton_box_set_spacing_default: - * @spacing: an integer value. - * - * Changes the default spacing that is placed between widgets in an - * vertical button box. - * - * Deprecated: 2.0: Use gtk_box_set_spacing() instead. - */ -void -gtk_vbutton_box_set_spacing_default (gint spacing) -{ - default_spacing = spacing; -} - -/** - * gtk_vbutton_box_set_layout_default: - * @layout: a new #GtkButtonBoxStyle. - * - * Sets a new layout mode that will be used by all button boxes. - * - * Deprecated: 2.0: Use gtk_button_box_set_layout() instead. - */ -void -gtk_vbutton_box_set_layout_default (GtkButtonBoxStyle layout) -{ - g_return_if_fail (layout >= GTK_BUTTONBOX_DEFAULT_STYLE && - layout <= GTK_BUTTONBOX_CENTER); - - default_layout_style = layout; -} - -/** - * gtk_vbutton_box_get_spacing_default: - * - * Retrieves the current default spacing for vertical button boxes. This is the number of pixels - * to be placed between the buttons when they are arranged. - * - * Returns: the default number of pixels between buttons. - * - * Deprecated: 2.0: Use gtk_box_get_spacing() instead. - */ -gint -gtk_vbutton_box_get_spacing_default (void) -{ - return default_spacing; -} - -/** - * gtk_vbutton_box_get_layout_default: - * - * Retrieves the current layout used to arrange buttons in button box widgets. - * - * Returns: the current #GtkButtonBoxStyle. - * - * Deprecated: 2.0: Use gtk_button_box_get_layout() instead. - */ -GtkButtonBoxStyle -gtk_vbutton_box_get_layout_default (void) -{ - return default_layout_style; -} GtkButtonBoxStyle _gtk_vbutton_box_get_layout_default (void) diff --git a/gtk/gtkvbbox.h b/gtk/gtkvbbox.h index 996eb57a60..c21be52303 100644 --- a/gtk/gtkvbbox.h +++ b/gtk/gtkvbbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -63,20 +63,11 @@ struct _GtkVButtonBoxClass GType gtk_vbutton_box_get_type (void) G_GNUC_CONST; GtkWidget *gtk_vbutton_box_new (void); -/* buttons can be added by gtk_container_add() */ - -#ifndef GTK_DISABLE_DEPRECATED -gint gtk_vbutton_box_get_spacing_default (void); -void gtk_vbutton_box_set_spacing_default (gint spacing); - -GtkButtonBoxStyle gtk_vbutton_box_get_layout_default (void); -void gtk_vbutton_box_set_layout_default (GtkButtonBoxStyle layout); -#endif /* private API */ GtkButtonBoxStyle _gtk_vbutton_box_get_layout_default (void); -G_END_DECLS +G_END_DECLS #endif /* __GTK_VBBOX_H__ */ diff --git a/gtk/gtkvbox.h b/gtk/gtkvbox.h index 68b549a743..5cd7bb9551 100644 --- a/gtk/gtkvbox.h +++ b/gtk/gtkvbox.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkviewport.h b/gtk/gtkviewport.h index da6b97c8d5..15427e8801 100644 --- a/gtk/gtkviewport.h +++ b/gtk/gtkviewport.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvolumebutton.h b/gtk/gtkvolumebutton.h index 1fd9bd9074..d5afa8fa04 100644 --- a/gtk/gtkvolumebutton.h +++ b/gtk/gtkvolumebutton.h @@ -27,7 +27,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvpaned.h b/gtk/gtkvpaned.h index 49a1aec48b..a42efa3edc 100644 --- a/gtk/gtkvpaned.h +++ b/gtk/gtkvpaned.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvruler.h b/gtk/gtkvruler.h index 4cade7ba66..b9c7829220 100644 --- a/gtk/gtkvruler.h +++ b/gtk/gtkvruler.h @@ -34,7 +34,7 @@ * distribution. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvscale.h b/gtk/gtkvscale.h index cf67920596..ce4953e5ec 100644 --- a/gtk/gtkvscale.h +++ b/gtk/gtkvscale.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvscrollbar.h b/gtk/gtkvscrollbar.h index 2cd2ec971c..ca2179075b 100644 --- a/gtk/gtkvscrollbar.h +++ b/gtk/gtkvscrollbar.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkvseparator.h b/gtk/gtkvseparator.h index a82ebfe10a..62c7bf50e1 100644 --- a/gtk/gtkvseparator.h +++ b/gtk/gtkvseparator.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index b27207c927..c97a56164e 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -540,7 +540,7 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->unmap_event = NULL; klass->window_state_event = NULL; klass->property_notify_event = _gtk_selection_property_notify; - klass->selection_clear_event = gtk_selection_clear; + klass->selection_clear_event = _gtk_selection_clear; klass->selection_request_event = _gtk_selection_request; klass->selection_notify_event = _gtk_selection_notify; klass->selection_received = NULL; @@ -3002,31 +3002,6 @@ gtk_widget_new (GType type, return widget; } -/** - * gtk_widget_set: - * @widget: a #GtkWidget - * @first_property_name: name of first property to set - * @Varargs: value of first property, followed by more properties, - * %NULL-terminated - * - * Precursor of g_object_set(). - * - * Deprecated: 2.0: Use g_object_set() instead. - **/ -void -gtk_widget_set (GtkWidget *widget, - const gchar *first_property_name, - ...) -{ - va_list var_args; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - - va_start (var_args, first_property_name); - g_object_set_valist (G_OBJECT (widget), first_property_name, var_args); - va_end (var_args); -} - static inline void gtk_widget_queue_draw_child (GtkWidget *widget) { @@ -3743,55 +3718,6 @@ gtk_widget_queue_draw (GtkWidget *widget) rect.width, rect.height); } -/* Invalidates the given area (allocation-relative-coordinates) - * in all of the widget's windows - */ -/** - * gtk_widget_queue_clear_area: - * @widget: a #GtkWidget - * @x: x coordinate of upper-left corner of rectangle to redraw - * @y: y coordinate of upper-left corner of rectangle to redraw - * @width: width of region to draw - * @height: height of region to draw - * - * This function is no longer different from - * gtk_widget_queue_draw_area(), though it once was. Now it just calls - * gtk_widget_queue_draw_area(). Originally - * gtk_widget_queue_clear_area() would force a redraw of the - * background for %GTK_NO_WINDOW widgets, and - * gtk_widget_queue_draw_area() would not. Now both functions ensure - * the background will be redrawn. - * - * Deprecated: 2.2: Use gtk_widget_queue_draw_area() instead. - **/ -void -gtk_widget_queue_clear_area (GtkWidget *widget, - gint x, - gint y, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_WIDGET (widget)); - - gtk_widget_queue_draw_area (widget, x, y, width, height); -} - -/** - * gtk_widget_queue_clear: - * @widget: a #GtkWidget - * - * This function does the same as gtk_widget_queue_draw(). - * - * Deprecated: 2.2: Use gtk_widget_queue_draw() instead. - **/ -void -gtk_widget_queue_clear (GtkWidget *widget) -{ - g_return_if_fail (GTK_IS_WIDGET (widget)); - - gtk_widget_queue_draw (widget); -} - /** * gtk_widget_queue_resize: * @widget: a #GtkWidget @@ -3831,39 +3757,6 @@ gtk_widget_queue_resize_no_redraw (GtkWidget *widget) } /** - * gtk_widget_draw: - * @widget: a #GtkWidget - * @area: area to draw - * - * In GTK+ 1.2, this function would immediately render the - * region @area of a widget, by invoking the virtual draw method of a - * widget. In GTK+ 2.0, the draw method is gone, and instead - * gtk_widget_draw() simply invalidates the specified region of the - * widget, then updates the invalid region of the widget immediately. - * Usually you don't want to update the region immediately for - * performance reasons, so in general gtk_widget_queue_draw_area() is - * a better choice if you want to draw a region of a widget. - **/ -void -gtk_widget_draw (GtkWidget *widget, - const GdkRectangle *area) -{ - g_return_if_fail (GTK_IS_WIDGET (widget)); - - if (gtk_widget_is_drawable (widget)) - { - if (area) - gtk_widget_queue_draw_area (widget, - area->x, area->y, - area->width, area->height); - else - gtk_widget_queue_draw (widget); - - gdk_window_process_updates (widget->window, TRUE); - } -} - -/** * gtk_widget_size_request: * @widget: a #GtkWidget * @requisition: a #GtkRequisition to be filled in @@ -4650,7 +4543,7 @@ _gtk_widget_get_accel_path (GtkWidget *widget, apath = g_object_get_qdata (G_OBJECT (widget), quark_accel_path); if (locked) - *locked = apath ? apath->accel_group->lock_count > 0 : TRUE; + *locked = apath ? gtk_accel_group_get_is_locked (apath->accel_group) : TRUE; return apath ? g_quark_to_string (apath->path_quark) : NULL; } @@ -7848,76 +7741,6 @@ gtk_widget_error_bell (GtkWidget *widget) gdk_window_beep (widget->window); } -/** - * gtk_widget_set_uposition: - * @widget: a #GtkWidget - * @x: x position; -1 to unset x; -2 to leave x unchanged - * @y: y position; -1 to unset y; -2 to leave y unchanged - * - * - * Sets the position of a widget. The funny "u" in the name comes from - * the "user position" hint specified by the X Window System, and - * exists for legacy reasons. This function doesn't work if a widget - * is inside a container; it's only really useful on #GtkWindow. - * - * Don't use this function to center dialogs over the main application - * window; most window managers will do the centering on your behalf - * if you call gtk_window_set_transient_for(), and it's really not - * possible to get the centering to work correctly in all cases from - * application code. But if you insist, use gtk_window_set_position() - * to set #GTK_WIN_POS_CENTER_ON_PARENT, don't do the centering - * manually. - * - * Note that although @x and @y can be individually unset, the position - * is not honoured unless both @x and @y are set. - **/ -void -gtk_widget_set_uposition (GtkWidget *widget, - gint x, - gint y) -{ - /* FIXME this function is the only place that aux_info->x and - * aux_info->y are even used I believe, and this function is - * deprecated. Should be cleaned up. - * - * (Actually, size_allocate uses them) -Yosh - */ - - GtkWidgetAuxInfo *aux_info; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - - aux_info =_gtk_widget_get_aux_info (widget, TRUE); - - if (x > -2) - { - if (x == -1) - aux_info->x_set = FALSE; - else - { - aux_info->x_set = TRUE; - aux_info->x = x; - } - } - - if (y > -2) - { - if (y == -1) - aux_info->y_set = FALSE; - else - { - aux_info->y_set = TRUE; - aux_info->y = y; - } - } - - if (GTK_IS_WINDOW (widget) && aux_info->x_set && aux_info->y_set) - _gtk_window_reposition (GTK_WINDOW (widget), aux_info->x, aux_info->y); - - if (gtk_widget_get_visible (widget) && widget->parent) - gtk_widget_size_allocate (widget, &widget->allocation); -} - static void gtk_widget_set_usize_internal (GtkWidget *widget, gint width, @@ -7950,42 +7773,6 @@ gtk_widget_set_usize_internal (GtkWidget *widget, } /** - * gtk_widget_set_usize: - * @widget: a #GtkWidget - * @width: minimum width, or -1 to unset - * @height: minimum height, or -1 to unset - * - * Sets the minimum size of a widget; that is, the widget's size - * request will be @width by @height. You can use this function to - * force a widget to be either larger or smaller than it is. The - * strange "usize" name dates from the early days of GTK+, and derives - * from X Window System terminology. In many cases, - * gtk_window_set_default_size() is a better choice for toplevel - * windows than this function; setting the default size will still - * allow users to shrink the window. Setting the usize will force them - * to leave the window at least as large as the usize. When dealing - * with window sizes, gtk_window_set_geometry_hints() can be a useful - * function as well. - * - * Note the inherent danger of setting any fixed size - themes, - * translations into other languages, different fonts, and user action - * can all change the appropriate size for a given widget. So, it's - * basically impossible to hardcode a size that will always be - * correct. - * - * Deprecated: 2.2: Use gtk_widget_set_size_request() instead. - **/ -void -gtk_widget_set_usize (GtkWidget *widget, - gint width, - gint height) -{ - g_return_if_fail (GTK_IS_WIDGET (widget)); - - gtk_widget_set_usize_internal (widget, width, height); -} - -/** * gtk_widget_set_size_request: * @widget: a #GtkWidget * @width: width @widget should request, or -1 to unset @@ -9516,43 +9303,6 @@ gtk_widget_reset_shapes (GtkWidget *widget) gtk_reset_shapes_recurse (widget, widget->window); } -/** - * gtk_widget_ref: - * @widget: a #GtkWidget - * - * Adds a reference to a widget. This function is exactly the same - * as calling g_object_ref(), and exists mostly for historical - * reasons. It can still be convenient to avoid casting a widget - * to a #GObject, it saves a small amount of typing. - * - * Return value: the widget that was referenced - * - * Deprecated: 2.12: Use g_object_ref() instead. - **/ -GtkWidget* -gtk_widget_ref (GtkWidget *widget) -{ - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - - return (GtkWidget*) g_object_ref ((GObject*) widget); -} - -/** - * gtk_widget_unref: - * @widget: a #GtkWidget - * - * Inverse of gtk_widget_ref(). Equivalent to g_object_unref(). - * - * Deprecated: 2.12: Use g_object_unref() instead. - **/ -void -gtk_widget_unref (GtkWidget *widget) -{ - g_return_if_fail (GTK_IS_WIDGET (widget)); - - g_object_unref ((GObject*) widget); -} - static void expose_window (GdkWindow *window) { diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 760d7ce569..38b2dca9c6 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -138,49 +138,6 @@ typedef enum #define GTK_IS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WIDGET)) #define GTK_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WIDGET, GtkWidgetClass)) -/* Macros for extracting various fields from GtkWidget and GtkWidgetClass. - */ -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_TYPE: - * @wid: a #GtkWidget. - * - * Gets the type of a widget. - * - * Deprecated: 2.20: Use G_OBJECT_TYPE() instead. - */ -#define GTK_WIDGET_TYPE(wid) (GTK_OBJECT_TYPE (wid)) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_STATE: - * @wid: a #GtkWidget. - * - * Returns the current state of the widget, as a #GtkStateType. - * - * Deprecated: 2.20: Use gtk_widget_get_state() instead. - */ -#define GTK_WIDGET_STATE(wid) (GTK_WIDGET (wid)->state) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_SAVED_STATE: - * @wid: a #GtkWidget. - * - * Returns the saved state of the widget, as a #GtkStateType. - * - * The saved state will be restored when a widget gets sensitive - * again, after it has been made insensitive with gtk_widget_set_state() - * or gtk_widget_set_sensitive(). - * - * Deprecated: 2.20: Do not used it. - */ -#define GTK_WIDGET_SAVED_STATE(wid) (GTK_WIDGET (wid)->saved_state) -#endif - - /* Macros for extracting the widget flags from GtkWidget. */ /** @@ -202,241 +159,6 @@ typedef enum #define GTK_WIDGET_FLAGS(wid) (GTK_OBJECT_FLAGS (wid)) /* FIXME: Deprecating GTK_WIDGET_FLAGS requires fixing GTK internals. */ -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_TOPLEVEL: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is a toplevel widget. - * - * Deprecated: 2.20: Use gtk_widget_is_toplevel() instead. - */ -#define GTK_WIDGET_TOPLEVEL(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_TOPLEVEL) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_NO_WINDOW: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget doesn't have an own #GdkWindow. - * - * Deprecated: 2.20: Use gtk_widget_get_has_window() instead. - */ -#define GTK_WIDGET_NO_WINDOW(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_NO_WINDOW) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_REALIZED: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is realized. - * - * Deprecated: 2.20: Use gtk_widget_get_realized() instead. - */ -#define GTK_WIDGET_REALIZED(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_REALIZED) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_MAPPED: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is mapped. - * - * Deprecated: 2.20: Use gtk_widget_get_mapped() instead. - */ -#define GTK_WIDGET_MAPPED(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_MAPPED) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_VISIBLE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is visible. - * - * Deprecated: 2.20: Use gtk_widget_get_visible() instead. - */ -#define GTK_WIDGET_VISIBLE(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_VISIBLE) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_DRAWABLE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is mapped and visible. - * - * Deprecated: 2.20: Use gtk_widget_is_drawable() instead. - */ -#define GTK_WIDGET_DRAWABLE(wid) (GTK_WIDGET_VISIBLE (wid) && GTK_WIDGET_MAPPED (wid)) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_SENSITIVE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the #GTK_SENSITIVE flag has be set on the widget. - * - * Deprecated: 2.20: Use gtk_widget_get_sensitive() instead. - */ -#define GTK_WIDGET_SENSITIVE(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_SENSITIVE) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_PARENT_SENSITIVE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the #GTK_PARENT_SENSITIVE flag has be set on the widget. - * - * Deprecated: 2.20: Use gtk_widget_get_sensitive() on the parent widget instead. - */ -#define GTK_WIDGET_PARENT_SENSITIVE(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_PARENT_SENSITIVE) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_IS_SENSITIVE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is effectively sensitive. - * - * Deprecated: 2.20: Use gtk_widget_is_sensitive() instead. - */ -#define GTK_WIDGET_IS_SENSITIVE(wid) (GTK_WIDGET_SENSITIVE (wid) && \ - GTK_WIDGET_PARENT_SENSITIVE (wid)) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_CAN_FOCUS: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is able to handle focus grabs. - * - * Deprecated: 2.20: Use gtk_widget_get_can_focus() instead. - */ -#define GTK_WIDGET_CAN_FOCUS(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_CAN_FOCUS) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_HAS_FOCUS: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget has grabbed the focus and no other - * widget has done so more recently. - * - * Deprecated: 2.20: Use gtk_widget_has_focus() instead. - */ -#define GTK_WIDGET_HAS_FOCUS(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_HAS_FOCUS) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_CAN_DEFAULT: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is allowed to receive the default action - * via gtk_widget_grab_default(). - * - * Deprecated: 2.20: Use gtk_widget_get_can_default() instead. - */ -#define GTK_WIDGET_CAN_DEFAULT(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_CAN_DEFAULT) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_HAS_DEFAULT: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget currently is receiving the default action. - * - * Deprecated: 2.20: Use gtk_widget_has_default() instead. - */ -#define GTK_WIDGET_HAS_DEFAULT(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_HAS_DEFAULT) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_HAS_GRAB: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is in the grab_widgets stack, and will be - * the preferred one for receiving events other than ones of cosmetic value. - * - * Deprecated: 2.20: Use gtk_widget_has_grab() instead. - */ -#define GTK_WIDGET_HAS_GRAB(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_HAS_GRAB) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_RC_STYLE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget's style has been looked up through the rc - * mechanism. - * - * Deprecated: 2.20: Use gtk_widget_has_rc_style() instead. - */ -#define GTK_WIDGET_RC_STYLE(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_RC_STYLE) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_COMPOSITE_CHILD: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget is a composite child of its parent. - * - * Deprecated: 2.20: Use the #GtkWidget:composite-child property instead. - */ -#define GTK_WIDGET_COMPOSITE_CHILD(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_COMPOSITE_CHILD) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_APP_PAINTABLE: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the #GTK_APP_PAINTABLE flag has been set on the widget. - * - * Deprecated: 2.20: Use gtk_widget_get_app_paintable() instead. - */ -#define GTK_WIDGET_APP_PAINTABLE(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_APP_PAINTABLE) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_RECEIVES_DEFAULT: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the widget when focused will receive the default action - * even if there is a different widget set as default. - * - * Deprecated: 2.20: Use gtk_widget_get_receives_default() instead. - */ -#define GTK_WIDGET_RECEIVES_DEFAULT(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_RECEIVES_DEFAULT) != 0) -#endif - -#ifndef GTK_DISABLE_DEPRECATED -/** - * GTK_WIDGET_DOUBLE_BUFFERED: - * @wid: a #GtkWidget. - * - * Evaluates to %TRUE if the #GTK_DOUBLE_BUFFERED flag has been set on the widget. - * - * Deprecated: 2.20: Use gtk_widget_get_double_buffered() instead. - */ -#define GTK_WIDGET_DOUBLE_BUFFERED(wid) ((GTK_WIDGET_FLAGS (wid) & GTK_DOUBLE_BUFFERED) != 0) -#endif - - /* Macros for setting and clearing widget flags. */ /** @@ -837,13 +559,6 @@ GtkWidget* gtk_widget_new (GType type, void gtk_widget_destroy (GtkWidget *widget); void gtk_widget_destroyed (GtkWidget *widget, GtkWidget **widget_pointer); -#ifndef GTK_DISABLE_DEPRECATED -GtkWidget* gtk_widget_ref (GtkWidget *widget); -void gtk_widget_unref (GtkWidget *widget); -void gtk_widget_set (GtkWidget *widget, - const gchar *first_property_name, - ...) G_GNUC_NULL_TERMINATED; -#endif /* GTK_DISABLE_DEPRECATED */ void gtk_widget_unparent (GtkWidget *widget); void gtk_widget_show (GtkWidget *widget); void gtk_widget_show_now (GtkWidget *widget); @@ -865,22 +580,8 @@ void gtk_widget_queue_draw_area (GtkWidget *widget, gint y, gint width, gint height); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_widget_queue_clear (GtkWidget *widget); -void gtk_widget_queue_clear_area (GtkWidget *widget, - gint x, - gint y, - gint width, - gint height); -#endif /* GTK_DISABLE_DEPRECATED */ - - void gtk_widget_queue_resize (GtkWidget *widget); void gtk_widget_queue_resize_no_redraw (GtkWidget *widget); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_widget_draw (GtkWidget *widget, - const GdkRectangle *area); -#endif /* GTK_DISABLE_DEPRECATED */ void gtk_widget_size_request (GtkWidget *widget, GtkRequisition *requisition); void gtk_widget_size_allocate (GtkWidget *widget, @@ -1028,15 +729,6 @@ void gtk_widget_set_size_request (GtkWidget *widget, void gtk_widget_get_size_request (GtkWidget *widget, gint *width, gint *height); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_widget_set_uposition (GtkWidget *widget, - gint x, - gint y); -void gtk_widget_set_usize (GtkWidget *widget, - gint width, - gint height); -#endif - void gtk_widget_set_events (GtkWidget *widget, gint events); void gtk_widget_add_events (GtkWidget *widget, @@ -1061,42 +753,6 @@ GtkClipboard *gtk_widget_get_clipboard (GtkWidget *widget, GdkPixmap * gtk_widget_get_snapshot (GtkWidget *widget, GdkRectangle *clip_rect); -#ifndef GTK_DISABLE_DEPRECATED - -/** - * gtk_widget_set_visual: - * @widget: a #GtkWidget - * @visual: a visual - * - * This function is deprecated; it does nothing. - */ -#define gtk_widget_set_visual(widget,visual) ((void) 0) - -/** - * gtk_widget_push_visual: - * @visual: a visual - * - * This function is deprecated; it does nothing. - */ -#define gtk_widget_push_visual(visual) ((void) 0) - -/** - * gtk_widget_pop_visual: - * - * This function is deprecated; it does nothing. - */ -#define gtk_widget_pop_visual() ((void) 0) - -/** - * gtk_widget_set_default_visual: - * @visual: a visual - * - * This function is deprecated; it does nothing. - */ -#define gtk_widget_set_default_visual(visual) ((void) 0) - -#endif /* GTK_DISABLE_DEPRECATED */ - /* Accessibility support */ AtkObject* gtk_widget_get_accessible (GtkWidget *widget); @@ -1162,29 +818,6 @@ void gtk_widget_modify_symbolic_color (GtkWidget *widget, const gchar *name, const GdkColor *color); -#ifndef GTK_DISABLE_DEPRECATED - -/** - * gtk_widget_set_rc_style: - * @widget: a #GtkWidget. - * - * Equivalent to <literal>gtk_widget_set_style (widget, NULL)</literal>. - * - * Deprecated: 2.0: Use gtk_widget_set_style() with a %NULL @style argument instead. - */ -#define gtk_widget_set_rc_style(widget) (gtk_widget_set_style (widget, NULL)) - -/** - * gtk_widget_restore_default_style: - * @widget: a #GtkWidget. - * - * Equivalent to <literal>gtk_widget_set_style (widget, NULL)</literal>. - * - * Deprecated: 2.0: Use gtk_widget_set_style() with a %NULL @style argument instead. - */ -#define gtk_widget_restore_default_style(widget) (gtk_widget_set_style (widget, NULL)) -#endif - PangoContext *gtk_widget_create_pango_context (GtkWidget *widget); PangoContext *gtk_widget_get_pango_context (GtkWidget *widget); PangoLayout *gtk_widget_create_pango_layout (GtkWidget *widget, @@ -1308,11 +941,6 @@ GType gtk_requisition_get_type (void) G_GNUC_CONST; GtkRequisition *gtk_requisition_copy (const GtkRequisition *requisition); void gtk_requisition_free (GtkRequisition *requisition); -#if defined (GTK_TRACE_OBJECTS) && defined (__GNUC__) -# define gtk_widget_ref g_object_ref -# define gtk_widget_unref g_object_unref -#endif /* GTK_TRACE_OBJECTS && __GNUC__ */ - void _gtk_widget_set_has_default (GtkWidget *widget, gboolean has_default); void _gtk_widget_set_has_grab (GtkWidget *widget, diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 1af7d0205e..8ddf8701b9 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -1734,17 +1734,6 @@ gtk_window_set_policy_internal (GtkWindow *window, gtk_widget_queue_resize_no_redraw (GTK_WIDGET (window)); } -void -gtk_window_set_policy (GtkWindow *window, - gboolean allow_shrink, - gboolean allow_grow, - gboolean auto_shrink) -{ - g_return_if_fail (GTK_IS_WINDOW (window)); - - gtk_window_set_policy_internal (window, allow_shrink, allow_grow, auto_shrink); -} - static gboolean handle_keys_changed (gpointer data) { @@ -8178,9 +8167,9 @@ _gtk_window_keys_foreach (GtkWindow *window, GtkAccelGroup *group = groups->data; gint i; - for (i = 0; i < group->n_accels; i++) + for (i = 0; i < group->priv->n_accels; i++) { - GtkAccelKey *key = &group->priv_accels[i].key; + GtkAccelKey *key = &group->priv->priv_accels[i].key; if (key->accel_key) (*func) (window, key->accel_key, key->accel_mods, FALSE, func_data); diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h index 1b4362feaa..22753fcd0e 100644 --- a/gtk/gtkwindow.h +++ b/gtk/gtkwindow.h @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(GTK_DISABLE_SINGLE_INCLUDES) && !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) +#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION) #error "Only <gtk/gtk.h> can be included directly." #endif @@ -35,6 +35,8 @@ #include <gtk/gtkaccelgroup.h> #include <gtk/gtkbin.h> +#include "gtk/gtkaccelgroupprivate.h" + G_BEGIN_DECLS @@ -352,14 +354,6 @@ void gtk_window_begin_move_drag (GtkWindow *window, gint root_y, guint32 timestamp); -#ifndef GTK_DISABLE_DEPRECATED -void gtk_window_set_policy (GtkWindow *window, - gint allow_shrink, - gint allow_grow, - gint auto_shrink); -#define gtk_window_position gtk_window_set_position -#endif /* GTK_DISABLE_DEPRECATED */ - /* Set initial default size of the window (does not constrain user * resize operations) */ diff --git a/gtk/makefile.msc.in b/gtk/makefile.msc.in index bb6ac9999e..73bedddcf0 100644 --- a/gtk/makefile.msc.in +++ b/gtk/makefile.msc.in @@ -114,8 +114,6 @@ gtk_OBJECTS_deprecated = \ gtkprogress.obj \ gtktipsquery.obj \ gtkshow.obj \ - gtksignal.obj \ - gtkpixmap.obj \ gtkpreview.obj \ gtkseparatortoolitem.obj \ gtktypeutils.obj \ @@ -469,7 +467,6 @@ gtk_public_h_sources = \ gtkpagesetup.h \ gtkpaned.h \ gtkpapersize.h \ - gtkpixmap.h \ gtkplug.h \ gtkpreview.h \ gtkprintcontext.h \ @@ -502,7 +499,6 @@ gtk_public_h_sources = \ gtkseparatormenuitem.h \ gtkseparatortoolitem.h \ gtksettings.h \ - gtksignal.h \ gtksizegroup.h \ gtksocket.h \ gtkspinbutton.h \ @@ -618,8 +614,6 @@ gtkmarshal.c : gtkmarshal.list gtktypefuncs.c : makefile.msc echo /*none*/ > gtktypefuncs.c -gtksignal.obj : gtksignal.c gtkmarshal.c gtkmarshal.h - $(CC) $(CFLAGS) -GD -c -DGTK_COMPILATION -DG_LOG_DOMAIN=\"Gtk\" gtksignal.c gtk-win32.res : gtk-win32.rc rc -DBUILDNUMBER=0 -r -fo gtk-win32.res gtk-win32.rc diff --git a/gtk/tests/builder.c b/gtk/tests/builder.c index 1e2d86a6de..33f2f84f9b 100644 --- a/gtk/tests/builder.c +++ b/gtk/tests/builder.c @@ -2420,10 +2420,10 @@ test_menus (void) gtk_accel_label_refetch (GTK_ACCEL_LABEL (sample_accel_label)); gtk_accel_label_refetch (GTK_ACCEL_LABEL (item_accel_label)); - g_assert (GTK_ACCEL_LABEL (sample_accel_label)->accel_string != NULL); - g_assert (GTK_ACCEL_LABEL (item_accel_label)->accel_string != NULL); - g_assert (strcmp (GTK_ACCEL_LABEL (item_accel_label)->accel_string, - GTK_ACCEL_LABEL (sample_accel_label)->accel_string) == 0); + g_assert (gtk_label_get_text (GTK_LABEL (sample_accel_label)) != NULL); + g_assert (gtk_label_get_text (GTK_LABEL (item_accel_label)) != NULL); + g_assert (strcmp (gtk_label_get_text (GTK_LABEL (item_accel_label)), + gtk_label_get_text (GTK_LABEL (sample_accel_label))) == 0); /* Check the menu hierarchy worked here */ g_assert (get_parent_menubar (item)); diff --git a/gtk/tests/defaultvalue.c b/gtk/tests/defaultvalue.c index 5253884b98..dca1ccd0e2 100644 --- a/gtk/tests/defaultvalue.c +++ b/gtk/tests/defaultvalue.c @@ -81,13 +81,6 @@ test_type (gconstpointer data) g_type_is_a (type, gdk_pixbuf_simple_anim_iter_get_type ())) return; - /* The gtk_arg compat wrappers can't set up default values */ - if (g_type_is_a (type, GTK_TYPE_CLIST) || - g_type_is_a (type, GTK_TYPE_CTREE) || - g_type_is_a (type, GTK_TYPE_LIST) || - g_type_is_a (type, GTK_TYPE_TIPS_QUERY)) - return; - klass = g_type_class_ref (type); if (g_type_is_a (type, GTK_TYPE_SETTINGS)) @@ -177,11 +170,6 @@ test_type (gconstpointer data) strcmp (pspec->name, "buffer") == 0)) continue; - /* Gets set to the cwd */ - if (g_type_is_a (type, GTK_TYPE_FILE_SELECTION) && - strcmp (pspec->name, "filename") == 0) - continue; - if (g_type_is_a (type, GTK_TYPE_FONT_SELECTION) && strcmp (pspec->name, "font") == 0) continue; @@ -269,11 +257,6 @@ test_type (gconstpointer data) strcmp (pspec->name, "font-desc") == 0)) continue; - if (g_type_is_a (type, GTK_TYPE_TEXT) && - (strcmp (pspec->name, "hadjustment") == 0 || - strcmp (pspec->name, "vadjustment") == 0)) - continue; - if (g_type_is_a (type, GTK_TYPE_TEXT_VIEW) && strcmp (pspec->name, "buffer") == 0) continue; diff --git a/gtk/tests/floating.c b/gtk/tests/floating.c index d0682cf5d2..9c2e93049d 100644 --- a/gtk/tests/floating.c +++ b/gtk/tests/floating.c @@ -32,28 +32,16 @@ floating_tests (void) GtkWidget *widget = g_object_new (GTK_TYPE_LABEL, NULL); g_object_connect (widget, "signal::destroy", destroy, NULL, NULL); - g_assert (GTK_OBJECT_FLOATING (widget)); - g_assert (g_object_is_floating (widget)); - - GTK_OBJECT_UNSET_FLAGS (widget, GTK_FLOATING); - g_assert (!GTK_OBJECT_FLOATING (widget)); - g_assert (!g_object_is_floating (widget)); - - GTK_OBJECT_SET_FLAGS (widget, GTK_FLOATING); - g_assert (GTK_OBJECT_FLOATING (widget)); g_assert (g_object_is_floating (widget)); g_object_ref_sink (widget); - g_assert (!GTK_OBJECT_FLOATING (widget)); g_assert (!g_object_is_floating (widget)); g_object_force_floating (G_OBJECT (widget)); - g_assert (GTK_OBJECT_FLOATING (widget)); g_assert (g_object_is_floating (widget)); g_object_ref (widget); - gtk_object_sink (GTK_OBJECT (widget)); - g_assert (!GTK_OBJECT_FLOATING (widget)); + g_object_ref_sink (widget); g_assert (!g_object_is_floating (widget)); g_assert (!destroyed); diff --git a/gtk/tests/object.c b/gtk/tests/object.c index 4b77e93466..feb724adad 100644 --- a/gtk/tests/object.c +++ b/gtk/tests/object.c @@ -55,7 +55,6 @@ list_ignore_properties (gboolean buglist) { /* currently untestable properties */ static const IgnoreProperty ignore_properties[] = { - { "GtkCurve", "", NULL, }, /* Just ignore it, not worth fixing */ { "GtkContainer", "child", NULL, }, /* needs working child widget */ { "GtkRadioMenuItem", "group", NULL, }, /* needs working sibling */ { "GtkWidget", "parent", NULL, }, /* needs working parent widget */ |