рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк (рдбреА рдПрдВрдб рдбреА) рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдпрд╣ рдорд╛рдирддреА рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд▓рд┐рдВрдХ рдПрдХ рд╡рд┐рдЬреЗрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рджреВрд╕рд░реА рд╡рд┐рдВрдбреЛ рдпрд╛ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдбреА рдПрдВрдб рдбреА рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЦрд┐рдбрд╝рдХреА рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рднреАрддрд░ рд╡рд┐рдЬреЗрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдХреЛрдб рдареЛрд╕ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИ, рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реА рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдкрд╛рджрдХ рдХреЛрдбрдмреНрд▓реЙрдХ 17.12 рд╣реИ, рдЬреЛ 16 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдмрдВрдЯреВ x64 рдкрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЧрдпрд╛ред

рдПрдХ рд╡рд┐рдЬреЗрдЯ рдХрдВрдЯреЗрдирд░ GtkFixed рд╣реИ, рдЬреЛ рдХреБрдЫ рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЛ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, GTK рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рд╡рд┐рдВрдбреЛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдлреИрд▓рд╛рдиреЗ рдФрд░ рд╕реНрдерд╛рди рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреЗрдЯ рдХрдВрдЯреЗрдирд░ GtkBox (рдФрд░ рдЕрдиреНрдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред рдХрдВрдЯреЗрдирд░ рдпрд╛ рддреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЖрдХрд╛рд░ рддрдХ рдлреИрд▓рд╛ рд╣реБрдЖ рд╣реИ (рдФрд░ рдЕрдиреНрдп рд╡рд┐рдЬреЗрдЯ рдХреА рд╕реАрдорд╛рдУрдВ рддрдХ), рдпрд╛ рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рдмрдЪреНрдЪреЗ рдХреЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрдб main.cpp, main.hpp, movable_widgets.hpp рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИред рдореИрдВрдиреЗ рдЕрд▓рдЧ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред Main.cpp рдХреА рд╕рд╛рдордЧреНрд░реА рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ:
#include "main.hpp" #include "movable_widgets.hpp" void builder_init(gpointer user_data) { appdata *data=(appdata*) user_data; GError *error = NULL; GtkBuilder *builder = gtk_builder_new(); if (!gtk_builder_add_from_file (builder, "window.glade", &error)) {
рдХреБрдЫ рд╡рд┐рдЧреЗрдЯреНрд╕ рдПрдХ XML рд╡рд┐рд╡рд░рдг (рдлрд╝рдВрдХреНрд╢рди рдмрд┐рд▓реНрдбрд░_рдЗрдирд┐рдЯ) рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рджреВрд╕рд░рд╛ рднрд╛рдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХрд▓реА (рдкреЗрдЬ-> add_widget)ред Gtk_widget_show_all рдлрд╝рдВрдХреНрд╢рди (рдбреЗрдЯрд╛-> рдЬреАрдд); рд╡рд┐рдЧреЗрдЯреНрд╕ рдФрд░ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХред рдЬреАрдЯреАрдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рд╣рдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдЪрд╛рдЗрд▓реНрдб рд╡рд┐рдЬреЗрдЯ рдореЗрдВред рдЬрдм рддрдХ application_shutdown рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддрдм рддрдХ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдФрд░ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рд╡рд┐рдЬреЗрдЯ рдкрд╣рд▓реЗ рд╣реА рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВред
#ifndef MAIN_H #define MAIN_H #include <gtk/gtk.h> #include <stdbool.h> #include <stdlib.h> #define restrict __restrict__ class appdata { public: char *glade_name=(char*)"window.glade"; GtkApplication *restrict app; GtkWidget *restrict win; GtkNotebook *restrict notebook; GArray *restrict pages; }; #endif
рдкреГрд╖реНрда рдлрд╝реАрд▓реНрдб рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ 1 рдЯреИрдм рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╢реМрдХрд┐рдпрд╛ рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реГрджреНрдзрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдореНрдорд┐рд▓рд┐рдд рд╡рд┐рдЬреЗрдЯ рдХреЛ GtkEventBox рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╣ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ
buttonclickред рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╕рдордп рдлрд╝реНрд░реЗрдо рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GtkFrame рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрдВрдЯреЗрдирд░ рднреАред рдХрдВрдЯреЗрдирд░ рдкрд░рд┐рд╡рд░реНрддрди рдСрдкрд░реЗрд╢рди рдХрд╛рдлреА рддреЗрдЬ рд╣реИред рдЯреИрдм рд╣реА, рдЬрд╣рд╛рдБ рд╡рд┐рдЬреЗрдЯреНрд╕ рдбрд╛рд▓реЗ рдЧрдП рд╣реИрдВ, рдореЗрдВ рд╕рдВрд▓рдЧреНрдирдХ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ: GtkScrolledWindow-> GtkViewport-> GtkFixedред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╡рд┐рдЬреЗрдЯ рдкреНрд░рдХрд╛рд░ GtkWidget рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ GtkViewport, GtkFixed рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЬреЛрд░ рджреВрдВрдЧрд╛
рдореИрдХреНрд░реЛ рд╡реНрдпреВ рдкрд░ рдзреНрдпрд╛рди
InsertedWidgetWithProperty * widget_with_property = & g_array_index (рд╡рд┐рдЬреЗрдЯ, InsertedWidgetWithProperty, i);
рдЪреВрдВрдХрд┐ рдпрд╣рд╛рдВ рдЧрд▓рддреА рдХрд░рдирд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ x_correction, y_correction - рдорд╛рдЙрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рд╡рд┐рдЬреЗрдЯ GtkEvent рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред Button_not_pressed рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝реНрд░реЗрдо рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрд░реНрдХ рд╕реЗ, рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдорд╛рдЙрд╕ рдмрдЯрди рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рд╡рд┐рдЬреЗрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдлреНрд░реЗрдо рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА, рдмрдЯрди-рдХреНрд▓рд┐рдХ рдФрд░ рдмрдЯрдирд░реЗрд▓ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рджрд░реНрдЬ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдВрдЯрд░-рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди-рдЗрд╡реЗрдВрдЯ рдФрд░ рд▓реАрд╡-рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди-рдЗрд╡реЗрдВрдЯ рдИрд╡реЗрдВрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдХрд░реНрд╕рд░ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ x_correction, рдмрдЯрди_not_pressed рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрд╡рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдЙрдиреНрд╣реЗрдВ рдирд┐рдЬреА рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдмрд╛рдХреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдЬреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ_рдСрд░реНрдбрд░ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
typedef struct { GtkWidget *restrict widget_ptr; GtkWidget *restrict eventbox; GtkWidget *restrict frame;
рд╡рд┐рдЬреЗрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реВрддреНрд░ рддрд╛рдХрд┐ рдЖрдк рдЙрд╕ рдкрд░ рдорд╛рдЙрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдХрд┐рд╕реА рднреА рджрд┐рд╢рд╛ рдореЗрдВ рди рдЪрд▓реЗрдВред рдЗрд╕рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреНрд▓рд┐рдХ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ,
GtkFixed рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рдВрдбреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИред
рдХрд░реЗрдХреНрд╢рди рдлреИрдХреНрдЯрд░ 5.2 рдореБрдЭреЗ рдХреБрдЫ рд╣рдж рддрдХ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд▓рд┐рдЦрдирд╛ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред рдореИрдВрдиреЗ Ubuntu 15.10, 16.04, 18.04 рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХреАред 0 рдФрд░ -1 рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╡рд┐рдЬреЗрдЯ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рди рдЬрд╛рдПред рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕реНрд╡рдпрдВ GtkScrolledWindow рд╡рд┐рдЬреЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╣реИред
gboolean fixed_motion_notify (GtkWidget *widget, GdkEvent *event, gpointer user_data) { page_body *page=(page_body*) user_data; int x_win, y_win, x_fixed, y_fixed; gtk_window_get_position(GTK_WINDOW(page->window),&x_win,&y_win); gtk_widget_translate_coordinates(page->window,page->fixed,x_win,y_win,&x_fixed,&y_fixed); double correction_y=(-y_fixed+y_win)*2+25; double correction_x=(-x_fixed+x_win); double x_corr=page->x_correction; double y_corr=page->y_correction; int position_x=event->motion.x_root-x_corr-x_win-correction_x; int position_y=event->motion.y_root-y_corr-y_fixed-correction_y; InsertedWidgetWithProperty *widget_with_property=&g_array_index(page->widgets,InsertedWidgetWithProperty,page->num_of_current_widget); GtkWidget *fixed=page->fixed; GtkWidget *eventbox=widget_with_property->eventbox; if(position_x<-1) position_x=0; if(position_y<-1) position_y=0; gtk_fixed_move(GTK_FIXED(fixed), eventbox, position_x, position_y); return FALSE; }
рдмрд╛рдХреА рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдиред рд╕рд╣реА рдорд╛рдЙрд╕ рдмрдЯрди рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ред рдкреЗрдЬ_рдмреЙрдбреА рдХреНрд▓рд╛рд╕ рдХреЛ рд╣рдЯрд╛рдХрд░ GtkScrolledWindow рдбрд┐рд▓реАрдЯ рдЗрд╡реЗрдВрдЯ рд╕реЗ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
void scrolled_window_destroy_cb (GtkWidget *object, gpointer user_data) { page_body *page=(page_body*) user_data; delete page; } void menu_delete_activate (GtkMenuItem *menuitem, gpointer user_data) { page_body *page=(page_body*) user_data; page->delete_widget(page->num_of_current_widget); } gboolean eventbox_leave_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { page_body *page=(page_body*) user_data; page->change_cursor(NULL); } gboolean eventbox_enter_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { page_body *page=(page_body*) user_data; page->change_cursor("pointer"); } gboolean eventbox_press_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { page_body *page=(page_body*) user_data; page->x_correction=event->button.x; page->y_correction=event->button.y; int i=0; InsertedWidgetWithProperty *widget_compare; for(i; i<=page->widgets->len; i++) { widget_compare=(InsertedWidgetWithProperty*) page->widgets->data+i; if(widget==widget_compare->eventbox) { page->num_of_current_widget=i; break; } } if(widget_compare->button_not_pressed==FALSE) { GtkWidget *eventbox=widget_compare->eventbox; if(page->click_order) { int x, y; gtk_widget_translate_coordinates(page->fixed, eventbox,0,0,&x, &y); gtk_container_remove(GTK_CONTAINER(page->fixed),eventbox); gtk_fixed_put(GTK_FIXED(page->fixed),eventbox,-x,-y); } g_object_ref(widget_compare->widget_ptr); gtk_container_remove(GTK_CONTAINER(eventbox),widget_compare->widget_ptr); if(widget_compare->frame==NULL) widget_compare->frame=gtk_frame_new(NULL); gtk_container_add(GTK_CONTAINER(widget_compare->frame),widget_compare->widget_ptr); gtk_container_add(GTK_CONTAINER(eventbox),widget_compare->frame); gtk_widget_show_all(eventbox); widget_compare->button_not_pressed=TRUE; }
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
github.com/SanyaZ7/movable_widgets_on_GtkFixed-