mirror of
https://github.com/HerrCraziDev/tiny-kyoukai.git
synced 2025-12-13 09:36:16 +01:00
Move Kyoukai with mouse drag anywhere + exit on wheel
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,4 +4,5 @@ build
|
|||||||
kyoutest
|
kyoutest
|
||||||
tiny-kyoukai
|
tiny-kyoukai
|
||||||
*.swp
|
*.swp
|
||||||
.vscode
|
.vscode
|
||||||
|
gtkerr.log
|
||||||
|
|||||||
53
main.c
53
main.c
@@ -51,8 +51,8 @@ typedef struct s_kyou_options {
|
|||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
* GTK devs are RETARDED greasy fucks (imagine being a gnome dev!)
|
* GTK devs are RETARDED greasy fucks (imagine being a gnome dev!)
|
||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
*/
|
*/ /* Move Kyoukai */
|
||||||
static void kyou_window_move(GtkWindow* window, uint16 x, uint16 y) {
|
static void kyou_window_move(GtkWindow* window, int16 x, int16 y) {
|
||||||
|
|
||||||
Window xw = gdk_x11_surface_get_xid( GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(window) )) );
|
Window xw = gdk_x11_surface_get_xid( GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(window) )) );
|
||||||
Display *xd = gdk_x11_display_get_xdisplay( gtk_widget_get_display( GTK_WIDGET(window) ) );
|
Display *xd = gdk_x11_display_get_xdisplay( gtk_widget_get_display( GTK_WIDGET(window) ) );
|
||||||
@@ -60,6 +60,19 @@ static void kyou_window_move(GtkWindow* window, uint16 x, uint16 y) {
|
|||||||
XMoveWindow( xd, xw, x, y );
|
XMoveWindow( xd, xw, x, y );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get Kyoukai's screen pos */
|
||||||
|
static void kyou_get_pos(GtkWindow* window, int16* x, int16* y) {
|
||||||
|
XWindowAttributes xwa;
|
||||||
|
|
||||||
|
Window xw = gdk_x11_surface_get_xid( GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(window) )) );
|
||||||
|
Display *xd = gdk_x11_display_get_xdisplay( gtk_widget_get_display( GTK_WIDGET(window) ) );
|
||||||
|
|
||||||
|
XGetWindowAttributes( xd, xw, &xwa );
|
||||||
|
XTranslateCoordinates( xd, xwa.root, xw, 0, 0, &xwa.x, &xwa.y, &(Window){0} );
|
||||||
|
*x = -xwa.x;
|
||||||
|
*y = -xwa.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
@@ -71,7 +84,7 @@ static void kyou_window_move(GtkWindow* window, uint16 x, uint16 y) {
|
|||||||
static bool kyou_keypress(GtkEventControllerKey* ev, guint keyval, guint keycode, GdkModifierType state, gpointer user_data) {
|
static bool kyou_keypress(GtkEventControllerKey* ev, guint keyval, guint keycode, GdkModifierType state, gpointer user_data) {
|
||||||
|
|
||||||
t_kyou_options* opt = (t_kyou_options*) user_data;
|
t_kyou_options* opt = (t_kyou_options*) user_data;
|
||||||
GtkWidget* widget = gtk_event_controller_get_widget( (GtkEventController*)ev );
|
GtkWidget* widget = gtk_event_controller_get_widget( GTK_EVENT_CONTROLLER(ev) );
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("Aloha~ '%c' (0x%X) %d %04X\n", (keyval & 0xFF00) ? ' ' : keyval, keyval, keycode, state);
|
printf("Aloha~ '%c' (0x%X) %d %04X\n", (keyval & 0xFF00) ? ' ' : keyval, keyval, keycode, state);
|
||||||
@@ -108,24 +121,44 @@ static bool kyou_keypress(GtkEventControllerKey* ev, guint keyval, guint keycode
|
|||||||
static bool kyou_clicked(GtkGestureClick* ev, gint n_press, gdouble x, gdouble y, gpointer user_data) {
|
static bool kyou_clicked(GtkGestureClick* ev, gint n_press, gdouble x, gdouble y, gpointer user_data) {
|
||||||
|
|
||||||
t_kyou_options* opt = (t_kyou_options*) user_data;
|
t_kyou_options* opt = (t_kyou_options*) user_data;
|
||||||
GtkWidget* widget = gtk_event_controller_get_widget( (GtkEventController*)ev );
|
GtkWidget* widget = gtk_event_controller_get_widget( GTK_EVENT_CONTROLLER(ev) );
|
||||||
|
uint8 btn = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(ev));
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("Aloha~ click %d at %f %f\n", n_press, x, y);
|
printf( "Aloha~ click %d at %f %f (btn: %d)\n", n_press, x, y, btn );
|
||||||
#else
|
#else
|
||||||
printf( "Nfu~ !\n" );
|
printf( "Nfu~ !\n" );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Middle click -> exit window */
|
||||||
|
if ( btn == GDK_BUTTON_MIDDLE ) gtk_window_close(GTK_WINDOW(widget));
|
||||||
|
|
||||||
/* Double-click -> toggle frame */
|
/* Double-click -> toggle frame */
|
||||||
if ( n_press > 1 ) {
|
if ( n_press > 1 ) {
|
||||||
opt->bDrawFrame = !opt->bDrawFrame;
|
opt->bDrawFrame = !opt->bDrawFrame;
|
||||||
gtk_window_set_decorated(GTK_WINDOW(widget), opt->bDrawFrame);
|
gtk_window_set_decorated(GTK_WINDOW(widget), opt->bDrawFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool kyou_mousemove(GtkGestureDrag* ev, gdouble x, gdouble y, gpointer user_data) {
|
||||||
|
|
||||||
|
int16 px, py;
|
||||||
|
GtkWidget* widget = gtk_event_controller_get_widget( GTK_EVENT_CONTROLLER(ev) );
|
||||||
|
|
||||||
|
kyou_get_pos( GTK_WINDOW(widget), &px, &py);
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("move (%f,%f)\n", x, y);
|
||||||
|
printf("pos: (%d,%d)\n", px, py);
|
||||||
|
#endif
|
||||||
|
kyou_window_move( GTK_WINDOW(widget), px+x, py+y );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move Kyoukai as soon as window is created */
|
/* Move Kyoukai as soon as window is created */
|
||||||
static void kyou_on_display( GtkWidget* widget, gpointer user_data ) {
|
static void kyou_on_display( GtkWidget* widget, gpointer user_data ) {
|
||||||
|
|
||||||
GdkRectangle geom = {0};
|
GdkRectangle geom = {0};
|
||||||
GdkDisplay* disp = gdk_display_get_default();
|
GdkDisplay* disp = gdk_display_get_default();
|
||||||
GdkSurface* surf = GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(widget) ));
|
GdkSurface* surf = GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(widget) ));
|
||||||
@@ -149,7 +182,7 @@ static void activate(GtkApplication *app, gpointer user_data) {
|
|||||||
GtkWidget *layout;
|
GtkWidget *layout;
|
||||||
GtkIconTheme* icon_theme;
|
GtkIconTheme* icon_theme;
|
||||||
GtkEventController* ev_key;
|
GtkEventController* ev_key;
|
||||||
GtkGesture* ev_clic;
|
GtkGesture* ev_clic, * ev_move;
|
||||||
|
|
||||||
t_kyou_options* opt = (t_kyou_options*) user_data;
|
t_kyou_options* opt = (t_kyou_options*) user_data;
|
||||||
|
|
||||||
@@ -179,8 +212,12 @@ static void activate(GtkApplication *app, gpointer user_data) {
|
|||||||
g_signal_connect(ev_key, "key-pressed", G_CALLBACK(kyou_keypress), opt);
|
g_signal_connect(ev_key, "key-pressed", G_CALLBACK(kyou_keypress), opt);
|
||||||
gtk_widget_add_controller(window, ev_key);
|
gtk_widget_add_controller(window, ev_key);
|
||||||
ev_clic = gtk_gesture_click_new();
|
ev_clic = gtk_gesture_click_new();
|
||||||
g_signal_connect(ev_clic, "pressed", G_CALLBACK(kyou_clicked), opt);
|
gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(ev_clic), AnyButton);
|
||||||
|
g_signal_connect(ev_clic, "released", G_CALLBACK(kyou_clicked), opt);
|
||||||
|
ev_move = gtk_gesture_drag_new();
|
||||||
|
g_signal_connect(ev_move, "drag-update", G_CALLBACK(kyou_mousemove), opt);
|
||||||
gtk_widget_add_controller(window, GTK_EVENT_CONTROLLER(ev_clic));
|
gtk_widget_add_controller(window, GTK_EVENT_CONTROLLER(ev_clic));
|
||||||
|
gtk_widget_add_controller(window, GTK_EVENT_CONTROLLER(ev_move));
|
||||||
|
|
||||||
/* Setup box layout aligned to bottom right, no padding */
|
/* Setup box layout aligned to bottom right, no padding */
|
||||||
layout = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
layout = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
@@ -203,7 +240,7 @@ static void activate(GtkApplication *app, gpointer user_data) {
|
|||||||
gtk_window_set_child(GTK_WINDOW(window), layout);
|
gtk_window_set_child(GTK_WINDOW(window), layout);
|
||||||
|
|
||||||
/* Move Kyoukai as soon as the window is ready */
|
/* Move Kyoukai as soon as the window is ready */
|
||||||
g_signal_connect( window, "show", kyou_on_display, opt);
|
g_signal_connect( window, "show", G_CALLBACK(kyou_on_display), opt);
|
||||||
|
|
||||||
/* Display window */
|
/* Display window */
|
||||||
gtk_window_present(GTK_WINDOW(window));
|
gtk_window_present(GTK_WINDOW(window));
|
||||||
|
|||||||
Reference in New Issue
Block a user