41#include <gdk/gdkkeysyms.h>
44#define GEANY_DND_NOTEBOOK_TAB_TYPE "geany_dnd_notebook_tab"
53 {
"UTF8_STRING", 0, 0 },
54 {
"text/plain", 0, 0 },
55 {
"text/uri-list", 0, 0 }
73 gint x, gint y, GtkSelectionData *data, guint target_type,
74 guint event_time, gpointer user_data);
97 gpointer page, guint page_num, gpointer user_data)
105 if (g_queue_get_length(
mru_docs) == 0 && gtk_notebook_get_n_pages(notebook) == 2)
130 dialog = gtk_window_new(GTK_WINDOW_POPUP);
134 gtk_window_set_transient_for(GTK_WINDOW(
dialog), parent);
135 gtk_window_set_destroy_with_parent(GTK_WINDOW(
dialog), TRUE);
137 gtk_window_set_title(GTK_WINDOW(
dialog), title);
138 gtk_window_set_type_hint(GTK_WINDOW(
dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
139 gtk_window_set_position(GTK_WINDOW(
dialog), GTK_WIN_POS_CENTER_ON_PARENT);
141 gtk_widget_set_name(
dialog,
"GeanyDialog");
150 case GDK_KEY_Shift_L:
151 case GDK_KEY_Shift_R:
152 case GDK_KEY_Control_L:
153 case GDK_KEY_Control_R:
158 case GDK_KEY_Super_L:
159 case GDK_KEY_Super_R:
160 case GDK_KEY_Hyper_L:
161 case GDK_KEY_Hyper_R:
195 GtkWidget *
dialog, *widget, *vbox;
198 gtk_window_set_decorated(GTK_WINDOW(
dialog), FALSE);
199 gtk_window_set_default_size(GTK_WINDOW(
dialog), 200, -1);
201 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
202 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
205 widget = gtk_image_new_from_stock(GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_BUTTON);
208 widget = gtk_label_new(
NULL);
209 gtk_label_set_justify(GTK_LABEL(widget), GTK_JUSTIFY_CENTER);
231 queue_length = g_queue_get_length(
mru_docs);
238 msg = g_markup_printf_escaped (
"<b>%s</b>", basename);
239 else if (i % queue_length ==
mru_pos)
247 SETPTR(basename, g_markup_printf_escaped (
"\n%s", basename));
248 SETPTR(msg, g_strconcat(msg, basename,
NULL));
304static gboolean
focus_sci(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
308 if (doc !=
NULL && event->button == 1)
309 gtk_widget_grab_focus(GTK_WIDGET(doc->
editor->
sci));
317 return gtk_notebook_get_scrollable(notebook);
328 gboolean show_arrow = FALSE;
331 if (! notebook->scrollable)
334 children = notebook->children;
337 struct _FakeGtkNotebookPage *page = children->data;
339 if (page->tab_label && ! gtk_widget_get_child_visible(page->tab_label))
342 children = children->next;
354 GtkPositionType tab_pos;
355 gint scroll_arrow_hlength, scroll_arrow_vlength;
358 page = gtk_notebook_get_nth_page(notebook, 0);
359 g_return_val_if_fail(page !=
NULL, FALSE);
361 tab = gtk_notebook_get_tab_label(notebook, page);
362 g_return_val_if_fail(tab !=
NULL, FALSE);
364 tab_pos = gtk_notebook_get_tab_pos(notebook);
365 nb = GTK_WIDGET(notebook);
367 gtk_widget_style_get(GTK_WIDGET(notebook),
"scroll-arrow-hlength", &scroll_arrow_hlength,
368 "scroll-arrow-vlength", &scroll_arrow_vlength,
NULL);
370 if (! gdk_event_get_coords((GdkEvent*) event, &x, &y))
381 if (event->y >= 0 && event->y <= gtk_widget_get_allocated_height(tab))
384 x > scroll_arrow_hlength &&
385 x < gtk_widget_get_allocated_width(nb) - scroll_arrow_hlength))
393 if (event->x >= 0 && event->x <= gtk_widget_get_allocated_width(tab))
396 y > scroll_arrow_vlength &&
397 y < gtk_widget_get_allocated_height(nb) - scroll_arrow_vlength))
434 gint total_pages = gtk_notebook_get_n_pages(nb);
436 return total_pages > (doc_page + 1);
444 gint current_page = gtk_notebook_get_current_page(nb);
446 for (gint i = doc_page + 1; i < gtk_notebook_get_n_pages(nb); )
453 gtk_notebook_set_current_page(nb, MIN(current_page, doc_page));
459 GtkWidget *menu_item;
460 static GtkWidget *menu =
NULL;
463 menu = gtk_menu_new();
466 gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback) gtk_widget_destroy,
NULL);
471 menu_item = gtk_separator_menu_item_new();
472 gtk_widget_show(menu_item);
476 gtk_widget_show(menu_item);
478 g_signal_connect(menu_item,
"activate",
482 gtk_widget_set_sensitive(menu_item, FALSE);
484 menu_item = gtk_separator_menu_item_new();
485 gtk_widget_show(menu_item);
488 menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE,
NULL);
489 gtk_widget_show(menu_item);
492 gtk_widget_set_sensitive(GTK_WIDGET(menu_item), (doc !=
NULL));
495 gtk_widget_show(menu_item);
498 gtk_widget_set_sensitive(GTK_WIDGET(menu_item), (doc !=
NULL));
501 gtk_widget_show(menu_item);
507 gtk_widget_show(menu_item);
511 gtk_menu_popup(GTK_MENU(menu),
NULL,
NULL,
NULL,
NULL, event->button, event->time);
518 if (event->type == GDK_2BUTTON_PRESS)
520 GtkNotebook *notebook = GTK_NOTEBOOK(widget);
521 GtkWidget *event_widget = gtk_get_event_widget((GdkEvent *) event);
522 GtkWidget *child = gtk_notebook_get_nth_page(notebook, gtk_notebook_get_current_page(notebook));
527 if (event_widget ==
NULL || event_widget == child || gtk_widget_is_ancestor(event_widget, child))
538 else if (event->button == 3)
601 GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK);
621 if (event->type == GDK_2BUTTON_PRESS)
629 if (event->button == 2)
643 if (event->button == 3)
658 gtk_icon_size_lookup_for_settings(gtk_widget_get_settings(btn), GTK_ICON_SIZE_MENU, &w, &h);
659 gtk_widget_set_size_request(btn, w + 2, h + 2);
673 GtkWidget *hbox, *ebox, *vbox;
678 g_return_val_if_fail(
this !=
NULL, -1);
681 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
682 page = GTK_WIDGET(this->editor->sci);
683 gtk_box_pack_start(GTK_BOX(vbox), page, TRUE, TRUE, 0);
685 this->
priv->tab_label = gtk_label_new(
NULL);
689 ebox = gtk_event_box_new();
690 gtk_widget_set_has_window(ebox, FALSE);
693 g_signal_connect_after(ebox,
"button-release-event",
696 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
697 gtk_box_pack_start(GTK_BOX(hbox), this->
priv->tab_label, FALSE, FALSE, 0);
702 GtkWidget *image, *btn, *align;
704 btn = gtk_button_new();
705 gtk_button_set_relief(GTK_BUTTON(btn), GTK_RELIEF_NONE);
706 gtk_button_set_focus_on_click(GTK_BUTTON(btn), FALSE);
707 gtk_widget_set_name(btn,
"geany-close-tab-button");
709 image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
712 align = gtk_alignment_new(1.0, 0.5, 0.0, 0.0);
714 gtk_box_pack_start(GTK_BOX(hbox), align, TRUE, TRUE, 0);
733 ebox,
NULL, cur_page + 1);
736 ebox,
NULL, cur_page);
761 if (page_num == page)
772 last_doc = g_queue_peek_nth(
mru_docs, 0);
789 gint x, gint y, GtkSelectionData *data, guint target_type,
790 guint event_time, gpointer user_data)
792 gboolean success = FALSE;
793 gint length = gtk_selection_data_get_length(data);
795 if (length > 0 && gtk_selection_data_get_format(data) == 8)
801 gtk_drag_finish(drag_context, success, FALSE, event_time);
void on_menu_toggle_all_additional_widgets1_activate(GtkMenuItem *menuitem, gpointer user_data)
void on_close_all1_activate(GtkMenuItem *menuitem, gpointer user_data)
void on_close_other_documents1_activate(GtkMenuItem *menuitem, gpointer user_data)
GeanyDocument * document_get_current(void)
Finds the current document.
GeanyDocument * document_get_from_page(guint page_num)
Finds the document for the given notebook page page_num.
gint document_get_notebook_page(GeanyDocument *doc)
Gets the notebook page index for a document.
void document_show_tab(GeanyDocument *doc)
gboolean document_check_disk_status(GeanyDocument *doc, gboolean force)
GeanyFilePrefs file_prefs
void document_open_file_list(const gchar *data, gsize length)
void document_update_tab_label(GeanyDocument *doc)
GeanyDocument * document_new_file(const gchar *utf8_filename, GeanyFiletype *ft, const gchar *text)
Creates a new document.
#define DOC_VALID(doc_ptr)
Null-safe way to check GeanyDocument::is_valid.
#define DOC_FILENAME(doc)
Returns the filename of the document passed or GEANY_STRING_UNTITLED (e.g.
void keybindings_send_command(guint group_id, guint key_id)
Mimics a (built-in only) keybinding action.
GdkModifierType keybindings_get_modifiers(GdkModifierType mods)
Gets significant modifiers from a GdkModifierType mask.
Configurable keyboard shortcuts.
#define GEANY_PRIMARY_MOD_MASK
Defines the primary modifier mask which is the Ctrl key mask on UNIX/Windows and Command key mask on ...
@ GEANY_KEY_GROUP_NOTEBOOK
Group.
@ GEANY_KEYS_NOTEBOOK_SWITCHTABLASTUSED
Keybinding.
Main program-related commands.
static void on_open_in_new_window_activate(GtkMenuItem *menuitem, gpointer user_data)
static GtkWidget * switch_dialog
gboolean notebook_switch_in_progress(void)
static void notebook_tab_close_clicked_cb(GtkButton *button, gpointer user_data)
static gboolean notebook_tab_click(GtkWidget *widget, GdkEventButton *event, gpointer data)
static void on_notebook_switch_page(GtkNotebook *notebook, gpointer page, guint page_num, gpointer user_data)
static void on_document_close(GObject *obj, GeanyDocument *doc)
static void update_filename_label(void)
static gboolean gtk_notebook_show_arrows(GtkNotebook *notebook)
static void on_close_documents_right_activate(GtkMenuItem *menuitem, GeanyDocument *doc)
static gboolean is_modifier_key(guint keyval)
void notebook_remove_page(gint page_num)
static const GtkTargetEntry drag_targets[]
#define GEANY_DND_NOTEBOOK_TAB_TYPE
void notebook_switch_tablastused(void)
static gboolean on_key_release_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data)
static void notebook_page_reordered_cb(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc)
static gboolean is_position_on_tab_bar(GtkNotebook *notebook, GdkEventButton *event)
static gboolean on_switch_timeout(G_GNUC_UNUSED gpointer data)
static GtkWidget * create_switch_dialog(void)
static gboolean focus_sci(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static void tab_count_changed(void)
static void on_window_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint target_type, guint event_time, gpointer user_data)
static gboolean has_tabs_on_right(GeanyDocument *doc)
static void notebook_tab_close_button_style_set(GtkWidget *btn, GtkRcStyle *prev_style, gpointer data)
static GtkWidget * switch_dialog_label
static gboolean switch_in_progress
static void update_mru_docs_head(GeanyDocument *doc)
static const gsize MAX_MRU_DOCS
static void setup_tab_dnd(void)
static GtkTargetEntry files_drop_targets[]
static GtkWidget * ui_minimal_dialog_new(GtkWindow *parent, const gchar *title)
gint notebook_new_tab(GeanyDocument *this)
static gboolean notebook_tab_bar_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static void tab_bar_menu_activate_cb(GtkMenuItem *menuitem, gpointer data)
signal void(* document_close)(GObject *obj, GeanyDocument *doc, gpointer user_data)
Sent before closing a document.
static GeanyProjectPrivate priv
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
gtk_widget_show_all(dialog)
Structure for representing an open tab with all its properties.
gchar * file_name
The UTF-8 encoded file name.
gchar * real_path
The link-dereferenced, locale-encoded file name.
gboolean is_valid
Flag used to check if this document is valid when iterating GeanyData::documents_array.
GeanyEditor * editor
The editor associated with the document.
ScintillaObject * sci
The Scintilla editor GtkWidget.
gboolean tab_order_beside
gboolean tab_close_switch_to_mru
gboolean notebook_double_click_hides_widgets
whether a double click on notebook tabs hides all other windows
GtkWidget * window
Main window.
GtkWidget * notebook
Document notebook.
Defines internationalization macros.
void ui_menu_add_document_items(GtkMenu *menu, GeanyDocument *active, GCallback callback)
<simplesect kind="geany:skip"></simplesect> Adds a list of document items to menu.
GeanyMainWidgets main_widgets
GtkWidget * ui_image_menu_item_new(const gchar *stock_id, const gchar *label)
Creates a GtkImageMenuItem with a stock image and a custom label.
GeanyInterfacePrefs interface_prefs
User Interface general utility functions.
void utils_start_new_geany_instance(const gchar *doc_path)
gchar * utils_get_locale_from_utf8(const gchar *utf8_text)
Converts the given UTF-8 encoded string into locale encoding.
General utility functions, non-GTK related.
#define SETPTR(ptr, result)
Assigns result to ptr, then frees the old value.