mirror of
https://github.com/HerrCraziDev/tiny-kyoukai.git
synced 2025-12-17 06:36:16 +01:00
Move Kyoukai to bottom right + snap to current monitor (key: m)
This commit is contained in:
7
Makefile
7
Makefile
@@ -3,9 +3,9 @@ PROJECT_NAME = tiny-kyoukai
|
|||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -std=c11
|
CFLAGS = -std=c11 -g
|
||||||
LDFLAGS =
|
LDFLAGS = -g
|
||||||
LIBS = gtk4
|
LIBS = gtk4 x11 gtk4-x11
|
||||||
LDLIBS = $(shell if [ -n "$(LIBS)" ]; then pkg-config -libs $(LIBS); fi)
|
LDLIBS = $(shell if [ -n "$(LIBS)" ]; then pkg-config -libs $(LIBS); fi)
|
||||||
INCLUDES = $(shell if [ -n "$(LIBS)" ]; then pkg-config -cflags $(LIBS); fi) -Isrc/includes
|
INCLUDES = $(shell if [ -n "$(LIBS)" ]; then pkg-config -cflags $(LIBS); fi) -Isrc/includes
|
||||||
|
|
||||||
@@ -76,6 +76,7 @@ run: $(PROJECT_NAME)
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rif *.o *.gch
|
@rm -rif *.o *.gch
|
||||||
|
@rm -rif $(BUILD_DIR)/*.o $(BUILD_DIR)/*.gch
|
||||||
|
|
||||||
clear: clean
|
clear: clean
|
||||||
@rm $(PROJECT_NAME)
|
@rm $(PROJECT_NAME)
|
||||||
|
|||||||
55
main.c
55
main.c
@@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <gdk/x11/gdkx.h>
|
||||||
|
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
@@ -35,6 +37,9 @@
|
|||||||
#define KYOU_ICON_NAME TINYKYOU_NAME
|
#define KYOU_ICON_NAME TINYKYOU_NAME
|
||||||
#define KYOU_PATH "kyoukai_peek.png"
|
#define KYOU_PATH "kyoukai_peek.png"
|
||||||
|
|
||||||
|
#define KYOU_WIN_WIDTH 250
|
||||||
|
#define KYOU_WIN_HEIGHT 120
|
||||||
|
|
||||||
typedef struct s_kyou_options {
|
typedef struct s_kyou_options {
|
||||||
char* szKyouPath;
|
char* szKyouPath;
|
||||||
bool bAllowResize;
|
bool bAllowResize;
|
||||||
@@ -42,6 +47,20 @@ typedef struct s_kyou_options {
|
|||||||
} t_kyou_options;
|
} t_kyou_options;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
* GTK devs are RETARDED greasy fucks (imagine being a gnome dev!)
|
||||||
|
*------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
static void kyou_window_move(GtkWindow* window, uint16 x, uint16 y) {
|
||||||
|
|
||||||
|
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) ) );
|
||||||
|
/* I WILL move my windows no matter what gnometards think is bad! */
|
||||||
|
XMoveWindow( xd, xw, x, y );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
* Events
|
* Events
|
||||||
@@ -50,6 +69,7 @@ typedef struct s_kyou_options {
|
|||||||
|
|
||||||
/* On keypress */
|
/* On keypress */
|
||||||
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( (GtkEventController*)ev );
|
||||||
|
|
||||||
@@ -65,10 +85,20 @@ static bool kyou_keypress(GtkEventControllerKey* ev, guint keyval, guint keycode
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ' ':
|
case ' ':
|
||||||
case 'f':
|
case 'f': /* Toggle frame */
|
||||||
opt->bDrawFrame = !opt->bDrawFrame; /* Toggle frame */
|
opt->bDrawFrame = !opt->bDrawFrame;
|
||||||
gtk_window_set_decorated(GTK_WINDOW(widget), opt->bDrawFrame);
|
gtk_window_set_decorated(GTK_WINDOW(widget), opt->bDrawFrame);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'm': /* Snap to bottom corner of current monitor */
|
||||||
|
GdkRectangle geom = {0};
|
||||||
|
gdk_monitor_get_geometry(
|
||||||
|
gdk_display_get_monitor_at_surface(
|
||||||
|
gdk_display_get_default(),
|
||||||
|
GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(widget) ))
|
||||||
|
),
|
||||||
|
&geom );
|
||||||
|
kyou_window_move( GTK_WINDOW(widget), geom.x+geom.width-KYOU_WIN_WIDTH, geom.y+geom.height-KYOU_WIN_HEIGHT );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -76,6 +106,7 @@ static bool kyou_keypress(GtkEventControllerKey* ev, guint keyval, guint keycode
|
|||||||
|
|
||||||
/* On click */
|
/* On click */
|
||||||
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( (GtkEventController*)ev );
|
||||||
|
|
||||||
@@ -93,12 +124,26 @@ static bool kyou_clicked(GtkGestureClick* ev, gint n_press, gdouble x, gdouble y
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Move Kyoukai as soon as window is created */
|
||||||
|
static void kyou_on_display( GtkWidget* widget, gpointer user_data ) {
|
||||||
|
GdkRectangle geom = {0};
|
||||||
|
GdkDisplay* disp = gdk_display_get_default();
|
||||||
|
GdkSurface* surf = GDK_SURFACE(gtk_native_get_surface( GTK_NATIVE(widget) ));
|
||||||
|
GdkMonitor* mon = gdk_x11_display_get_primary_monitor( disp );
|
||||||
|
|
||||||
|
gdk_monitor_get_geometry( mon, &geom );
|
||||||
|
|
||||||
|
kyou_window_move( GTK_WINDOW(widget), geom.x+geom.width-KYOU_WIN_WIDTH, geom.y+geom.height-KYOU_WIN_HEIGHT );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
* ACTIVATE - Main GTK setup function
|
* ACTIVATE - Main GTK setup function
|
||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
static void activate(GtkApplication *app, gpointer user_data) {
|
static void activate(GtkApplication *app, gpointer user_data) {
|
||||||
|
|
||||||
GtkWidget *window;
|
GtkWidget *window;
|
||||||
GtkWidget *kyou;
|
GtkWidget *kyou;
|
||||||
GtkWidget *layout;
|
GtkWidget *layout;
|
||||||
@@ -122,7 +167,7 @@ static void activate(GtkApplication *app, gpointer user_data) {
|
|||||||
/* Create window */
|
/* Create window */
|
||||||
window = gtk_application_window_new(app);
|
window = gtk_application_window_new(app);
|
||||||
gtk_window_set_title(GTK_WINDOW(window), "Tiny Kyoukai !");
|
gtk_window_set_title(GTK_WINDOW(window), "Tiny Kyoukai !");
|
||||||
gtk_window_set_default_size(GTK_WINDOW(window), 250, 120);
|
gtk_window_set_default_size(GTK_WINDOW(window), KYOU_WIN_WIDTH, KYOU_WIN_HEIGHT);
|
||||||
|
|
||||||
/* Load Kyoukai */
|
/* Load Kyoukai */
|
||||||
kyou = gtk_picture_new_for_filename( opt->szKyouPath );
|
kyou = gtk_picture_new_for_filename( opt->szKyouPath );
|
||||||
@@ -157,6 +202,9 @@ static void activate(GtkApplication *app, gpointer user_data) {
|
|||||||
/* Add everything to window */
|
/* Add everything to window */
|
||||||
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 */
|
||||||
|
g_signal_connect( window, "show", kyou_on_display, opt);
|
||||||
|
|
||||||
/* Display window */
|
/* Display window */
|
||||||
gtk_window_present(GTK_WINDOW(window));
|
gtk_window_present(GTK_WINDOW(window));
|
||||||
}
|
}
|
||||||
@@ -168,6 +216,7 @@ static void activate(GtkApplication *app, gpointer user_data) {
|
|||||||
*------------------------------------------------------------------------------
|
*------------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
GtkApplication *app;
|
GtkApplication *app;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user