Split library from RapidLauncher

This commit is contained in:
echo-devim 2016-03-06 10:49:26 +01:00
parent 1e1698b211
commit ec28b4c336
31 changed files with 80 additions and 559 deletions

View File

@ -1,59 +0,0 @@
Installation Instructions
=========================
GTK+ 3
------
To install RapidLauncher you will need to have GTK+ 3 and its Vala
bindings installed.
On Ubuntu (12.04) these packages are called:
* ``gir1.2-gtk-3.0``
* ``libgtk-3-dev``
Vala
----
Since *RapidLauncher* is written in Vala you also need the Vala compiler
(valac) and it's dependencies.
You will need at least version 0.16 to compile successfully, but the newer
the better.
On Ubuntu (12.04) theses packages are called:
* ``valac-0.16``
* ``valac-0.16-vapi``
* ``libvala-0.16-0``
If you use Ubuntu you can add a Vala ppa to always get the lastest
Vala compiler:
``ppa:vala-team/ppa``
Building
---------------
When you have all dependencies installed simply run the install.sh script,
which will interactively ask you for your requirements, set the environment
variables accordingly and run *make*.
``$ make``
``$ sudo make install``
Usage
-----
Once you have installed RapidLauncher you can start it with the
'rapidlauncher' command or by using the included .desktop file.
You probably want to bind the ``rapidlauncher`` command to a keyboard
shortcut.

104
Makefile
View File

@ -1,56 +1,98 @@
SHARED_LIBRARY := libappman.so
VAPI_FILE := appman.vapi
HEADER_FILE := appman.h
RCKTL_INSTALL_LIB_DIR := /usr/lib/rapidlauncher
BUILD_DIR := build
DIR_SOURCES := src
BINARY_DIR := src/
LIB_DIR := lib/
MISC_DIR := misc
PACKAGES := gobject-2.0
PACKAGES += glib-2.0
PACKAGES += gio-2.0
PACKAGES += x11
PACKAGES += gtk+-3.0
GEN_FLAGS := $(addprefix --pkg ,$(PACKAGES))
GEN_FLAGS += --target-glib=2.32
GEN_FLAGS += --ccode
GEN_FLAGS += --header="$(BUILD_DIR)/$(HEADER_FILE)"
GEN_FLAGS += --vapi="$(BUILD_DIR)/$(VAPI_FILE)"
CC_FLAGS := -w
CC_FLAGS += -fPIC
CC_FLAGS += -shared
CC_FLAGS += $(shell pkg-config --cflags $(PACKAGES))
LD_FLAGS := -fPIC
LD_FLAGS += -shared
LD_FLAGS += $(shell pkg-config --libs $(PACKAGES))
SOURCES := $(wildcard $(DIR_SOURCES)/*.vala)
OBJECTS := ${SOURCES:.vala=.o}
VAPIFILES := ${SOURCES:.vala=.vapi}
export RCKTL_INSTALL_LIB_DIR=/usr/lib/rapidlauncher
export RCKTL_INSTALL_BIN_DIR=/usr/bin
export RCKTL_INSTALL_ICON_DIR=/usr/share/icons/hicolor
export RCKTL_INSTALL_DESKTOPFILE_DIR=/usr/share/applications
ifndef BUILD_DIR
$(error variable BUILD_DIR is not set)
endif
export RCKTL_DIR=../$(BUILD_DIR)
ifndef RCKTL_INSTALL_LIB_DIR
$(error variable RCKTL_INSTALL_LIB_DIR is not set)
endif
export RCKTL_BUILD_DEBUG
export RCKTL_BUILD_RELEASE
export RCKTL_FEATURE_APPINDICATOR
ifdef RCKTL_BUILD_DEBUG
GEN_FLAGS += --debug
CC_FLAGS += --debug
endif
ifdef RCKTL_BUILD_RELEASE
CC_FLAGS += -O3
endif
.SECONDARY:
@#
.PHONY: all clean install uninstall
@#
all: .LIBRARY .BINARY .MISC
all: $(SOURCES) $(CFILES) $(BUILD_DIR)/$(SHARED_LIBRARY) $(BUILD_DIR)/$(VAPI_FILE) $(BUILD_DIR)/$(HEADER_FILE)
@#
clean:
@$(MAKE) clean -C "$(BINARY_DIR)"
@$(MAKE) clean -C "$(LIB_DIR)"
@$(MAKE) clean -C "$(MISC_DIR)"
rm -f ${SOURCES:.vala=.c}
rm -f ${SOURCES:.vala=.h}
rm -f ${SOURCES:.vala=.o}
rm -f ${SOURCES:.vala=.vapi}
rm -f "$(BUILD_DIR)/$(VAPI_FILE)"
rm -f "$(BUILD_DIR)/$(HEADER_FILE)"
rm -f "$(BUILD_DIR)/$(SHARED_LIBRARY)"
install:
@$(MAKE) install -C "$(BINARY_DIR)"
@$(MAKE) install -C "$(LIB_DIR)"
@$(MAKE) install -C "$(MISC_DIR)"
install -D "$(BUILD_DIR)/$(SHARED_LIBRARY)" "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)/$(SHARED_LIBRARY)"
uninstall:
@$(MAKE) uninstall -C "$(BINARY_DIR)"
@$(MAKE) uninstall -C "$(LIB_DIR)"
@$(MAKE) uninstall -C "$(MISC_DIR)"
-rmdir "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)/$(SHARED_LIBRARY)"
$(BUILD_DIR):
mkdir --parents "$(BUILD_DIR)"
%.vapi: %.vala
@echo " GEN $(notdir $@)"
@valac --fast-vapi="$@" $<
.BINARY: $(BUILD_DIR) .LIBRARY
@$(MAKE) -C "$(BINARY_DIR)"
MISSINGVAPIFILES=$(subst $(subst .c,.vapi,$@),,$(VAPIFILES))
$(BUILD_DIR)/$(HEADER_FILE):
$(BUILD_DIR)/$(VAPI_FILE):
%.c: $(MISSINGVAPIFILES) %.vala
@echo " GEN $(notdir $@)"
@valac $(GEN_FLAGS) $(addprefix --use-fast-vapi=,$(MISSINGVAPIFILES)) "$(subst .c,.vala,$@)"
.LIBRARY: $(BUILD_DIR)
@$(MAKE) -C "$(LIB_DIR)"
%.o: %.c
@echo " CC $(notdir $@)"
@$(CC) $(CC_FLAGS) -c $< -o $@
.MISC: $(BUILD_DIR)
@$(MAKE) -C "$(MISC_DIR)"
$(BUILD_DIR)/$(SHARED_LIBRARY): $(OBJECTS)
@echo " LD $(notdir $@)"
@$(CC) $(OBJECTS) $(LD_FLAGS) -o "$(BUILD_DIR)/$(SHARED_LIBRARY)"

View File

@ -1,16 +1,9 @@
Rapid Launcher
Appman
===============
Rapid Launcher is an application launcher that is supposed to be fast and
relatively lightweight.
The backend is written in Vala and the frontend is written with C/GTK+ 3.
Rapid Launcher is born to give a good launcher also for old PCs. It's really simple and is inspired by the Android and OSX launchers.
![Screenshot](screenshot.jpg "Screenshot")
Appman is a library (single-threaded) written in Vala to manage the applications installed on a Linux system. Infact, its name means Application Manager (Appman).
You could use this library to write your application launchers.
The library comes from Rocket-Launcher but I made some changes to make it better. Look at the [strcture] (https://github.com/echo-devim/RapidLauncher/blob/master/STRUCTURE.md).
### Version
@ -18,16 +11,15 @@ Rapid Launcher is born to give a good launcher also for old PCs. It's really sim
### Dependencies
Install gtk+ 3 devel to compile this software. For Fedora/RHEL/CentOS is `gtk3-devel` and for Ubuntu/Debian is `libgtk-3-dev`.
Install *valac* (at least version 0.16) from your repository. You need also *glib-2.0*.
### Backend
### Installation
The backend is a library (single-threaded) written in Vala from Rocket-Launcher. I made some changes to this library to make it better. You can use this library to manage the applications installed on your system and build new launchers. Look at the [strcture] (https://github.com/echo-devim/RapidLauncher/blob/master/STRUCTURE.md).
Just run `make` and then `sudo make install` to install it.
### TODO
* Reduce memory usage
* Align the matching applications of a search in the right way
### License

View File

@ -1,100 +0,0 @@
SHARED_LIBRARY := libappman.so
VAPI_FILE := appman.vapi
HEADER_FILE := appman.h
PACKAGES := gobject-2.0
PACKAGES += glib-2.0
PACKAGES += gio-2.0
PACKAGES += x11
PACKAGES += gtk+-3.0
GEN_FLAGS := $(addprefix --pkg ,$(PACKAGES))
GEN_FLAGS += --target-glib=2.32
GEN_FLAGS += --ccode
GEN_FLAGS += --header="$(RCKTL_DIR)/$(HEADER_FILE)"
GEN_FLAGS += --vapi="$(RCKTL_DIR)/$(VAPI_FILE)"
CC_FLAGS := -w
CC_FLAGS += -fPIC
CC_FLAGS += -shared
CC_FLAGS += $(shell pkg-config --cflags $(PACKAGES))
LD_FLAGS := -fPIC
LD_FLAGS += -shared
LD_FLAGS += $(shell pkg-config --libs $(PACKAGES))
SOURCES := ApplicationHandler.vala
SOURCES += App.vala
SOURCES += Constants.vala
SOURCES += IconDirectory.vala
SOURCES += IconManager.vala
SOURCES += IconTheme.vala
SOURCES += Printer.vala
OBJECTS := ${SOURCES:.vala=.o}
VAPIFILES := ${SOURCES:.vala=.vapi}
ifndef RCKTL_DIR
$(error variable RCKTL_DIR is not set)
endif
ifndef RCKTL_INSTALL_LIB_DIR
$(error variable RCKTL_INSTALL_LIB_DIR is not set)
endif
ifdef RCKTL_BUILD_DEBUG
GEN_FLAGS += --debug
CC_FLAGS += --debug
endif
ifdef RCKTL_BUILD_RELEASE
CC_FLAGS += -O3
endif
.SECONDARY:
@#
.PHONY: all clean install uninstall
@#
all: $(SOURCES) $(CFILES) $(RCKTL_DIR)/$(SHARED_LIBRARY) $(RCKTL_DIR)/$(VAPI_FILE) $(RCKTL_DIR)/$(HEADER_FILE)
@#
clean:
rm -f ${SOURCES:.vala=.c}
rm -f ${SOURCES:.vala=.h}
rm -f ${SOURCES:.vala=.o}
rm -f ${SOURCES:.vala=.vapi}
rm -f "$(RCKTL_DIR)/$(VAPI_FILE)"
rm -f "$(RCKTL_DIR)/$(HEADER_FILE)"
rm -f "$(RCKTL_DIR)/$(SHARED_LIBRARY)"
install:
install -D "$(RCKTL_DIR)/$(SHARED_LIBRARY)" "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)/$(SHARED_LIBRARY)"
uninstall:
rm -f "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)/$(SHARED_LIBRARY)"
%.vapi: %.vala
@echo " GEN $(notdir $@)"
@valac --fast-vapi="$@" $<
MISSINGVAPIFILES=$(subst $(subst .c,.vapi,$@),,$(VAPIFILES))
$(RCKTL_DIR)/$(HEADER_FILE):
$(RCKTL_DIR)/$(VAPI_FILE):
%.c: $(MISSINGVAPIFILES) %.vala
@echo " GEN $(notdir $@)"
@valac $(GEN_FLAGS) $(addprefix --use-fast-vapi=,$(MISSINGVAPIFILES)) "$(subst .c,.vala,$@)"
%.o: %.c
@echo " CC $(notdir $@)"
@$(CC) $(CC_FLAGS) -c $<
$(RCKTL_DIR)/$(SHARED_LIBRARY): $(OBJECTS)
@echo " LD $(notdir $@)"
@$(CC) $(OBJECTS) $(LD_FLAGS) -o "$(RCKTL_DIR)/$(SHARED_LIBRARY)"

View File

@ -1,83 +0,0 @@
PORTABLE_SCRIPT := run.sh
RUN_SCRIPT := rapidlauncher
DESKTOP_FILE := rapidlauncher.desktop
ICON_NAME := rapidlauncher
ifndef RCKTL_DIR
$(error variable RCKTL_DIR is not set)
endif
ifndef RCKTL_INSTALL_LIB_DIR
$(error variable RCKTL_INSTALL_LIB_DIR is not set)
endif
ifndef RCKTL_INSTALL_BIN_DIR
$(error variable RCKTL_INSTALL_BIN_DIR is not set)
endif
ifndef RCKTL_INSTALL_ICON_DIR
$(error variable RCKTL_INSTALL_ICON_DIR is not set)
endif
ifndef RCKTL_INSTALL_DESKTOPFILE_DIR
$(error variable RCKTL_INSTALL_DESKTOPFILE_DIR is not set)
endif
all: $(RCKTL_DIR)/$(PORTABLE_SCRIPT)
clean:
rm -f "$(RCKTL_DIR)/$(PORTABLE_SCRIPT)"
install:
install -D "$(RUN_SCRIPT)" "$(DESTDIR)$(RCKTL_INSTALL_BIN_DIR)/$(RUN_SCRIPT)"
install -D "$(DESKTOP_FILE)" "$(DESTDIR)$(RCKTL_INSTALL_DESKTOPFILE_DIR)/$(DESKTOP_FILE)"
install -D "$(ICON_NAME)_16x16.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/16x16/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_22x22.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/22x22/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_24x24.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/24x24/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_32x32.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/32x32/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_36x36.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/36x36/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_48x48.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/48x48/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_48x48.png" "/usr/share/pixmaps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_64x64.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/64x64/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_72x72.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/72x72/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_96x96.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/96x96/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_128x128.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/128x128/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_192x192.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/192x192/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_256x256.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/256x256/apps/$(ICON_NAME).png"
install -D "$(ICON_NAME)_512x512.png" "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/512x512/apps/$(ICON_NAME).png"
-update-icon-caches "$(RCKTL_INSTALL_ICON_DIR)"
-gtk-update-icon-cache "$(RCKTL_INSTALL_ICON_DIR)"
uninstall:
rm -f "$(DESTDIR)$(RCKTL_INSTALL_BIN_DIR)/$(RUN_SCRIPT)"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_DESKTOPFILE_DIR)/$(DESKTOP_FILE)"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/16x16/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/22x22/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/24x24/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/32x32/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/36x36/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/48x48/apps/$(ICON_NAME).png"
rm -f "/usr/share/pixmaps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/64x64/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/72x72/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/96x96/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/128x128/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/192x192/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/256x256/apps/$(ICON_NAME).png"
rm -f "$(DESTDIR)$(RCKTL_INSTALL_ICON_DIR)/512x512/apps/$(ICON_NAME).png"
-update-icon-caches "$(RCKTL_INSTALL_ICON_DIR)"
-gtk-update-icon-cache "$(RCKTL_INSTALL_ICON_DIR)"
$(RCKTL_DIR)/$(PORTABLE_SCRIPT): $(PORTABLE_SCRIPT)
@echo " CP $(notdir $@)"
@cp "$(PORTABLE_SCRIPT)" "$(RCKTL_DIR)/$(PORTABLE_SCRIPT)"
@chmod +x "$(RCKTL_DIR)/$(PORTABLE_SCRIPT)"

View File

@ -1,4 +0,0 @@
#!/bin/sh
export LD_LIBRARY_PATH="/usr/lib/rapidlauncher":LD_LIBRARY_PATH
exec /usr/lib/rapidlauncher/rapidlauncher "$@"

View File

@ -1,9 +0,0 @@
[Desktop Entry]
Name=RapidLauncher
GenericName=Application launcher
Comment=Fast lightweight application launcher
Exec=rapidlauncher
Icon=rapidlauncher
Terminal=false
Type=Application
Categories=Utility;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 767 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -1,6 +0,0 @@
#!/bin/sh
cd "$(dirname $0)"
export LD_LIBRARY_PATH="$PWD"
export GI_TYPELIB_PATH="$PWD"
./rapidlauncher

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

View File

@ -1,13 +0,0 @@
BINARY := rapidlauncher
all:
gcc `pkg-config --cflags gtk+-3.0` RapidLauncher.c `pkg-config --libs gtk+-3.0` -L../build/ -lappman `pkg-config --cflags --libs glib-2.0` -o ../build/$(BINARY) -O3
clean:
rm ../build/$(BINARY)
install:
install -D "$(RCKTL_DIR)/$(BINARY)" "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)/$(BINARY)"
uninstall:
rm -f "$(DESTDIR)$(RCKTL_INSTALL_LIB_DIR)/$(BINARY)"

View File

@ -1,239 +0,0 @@
#include <gtk/gtk.h>
#include "../build/appman.h"
#define SPACE 40
#define ICON_SIZE 80
#define ICON_PADDING 10
#define BUTTON_WIDTH 100
#define BUTTON_HEIGHT 30
static gint screen_width;
static gint screen_height;
static AppmanApp** apps = NULL;
static int apps_count = 0;
void set_widget_color(GtkWidget *widget, float red, float green, float blue, float opacity) {
GdkRGBA bgcolor = {.0, .0, .1, 1.0}; //Default color
if (red || green || blue || opacity) {
bgcolor.red = red;
bgcolor.green = green;
bgcolor.blue = blue;
bgcolor.alpha = opacity;
}
gchar *css;
GtkCssProvider *provider;
provider = gtk_css_provider_new ();
css = g_strdup_printf ("* { background-color: %s; }", gdk_rgba_to_string (&bgcolor));
gtk_css_provider_load_from_data (provider, css, -1, NULL);
g_free (css);
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref (provider);
}
gboolean resize_image(GtkWidget *widget, int width, int height) {
GdkPixbuf *pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(widget));
if (pixbuf == NULL)
{
g_printerr("Failed to resize image\n");
return FALSE;
}
GdkPixbuf *scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf, width, height, GDK_INTERP_BILINEAR);
gtk_image_set_from_pixbuf(GTK_IMAGE(widget), scaled_pixbuf);
return TRUE;
}
void resize_text(gchar* str, int limit) {
if (strlen(str) > limit) {
str[limit-2] = '.';
str[limit-1] = '.';
str[limit] = '\0';
}
}
/* Signal Handlers */
static gboolean on_icon_mouse_enter_callback (GtkWidget *widget, GdkEvent *event, gpointer data) {
set_widget_color((GtkWidget*)widget, 0.1, 0.5, .8, 1.0); //sky-blue
return FALSE;
}
static gboolean on_icon_mouse_leave_callback (GtkWidget *widget, GdkEvent *event, gpointer data) {
set_widget_color((GtkWidget*)widget, 0, 0, 0, 0); //set default color
return FALSE;
}
static gboolean on_icon_button_press_callback (GtkWidget *widget, GdkEventButton *event, gpointer data) {
appman_app_start((AppmanApp*)data);
gtk_main_quit ();
return TRUE;
}
static gboolean on_window_key_press_callback (GtkSearchEntry *searchentry, GdkEvent *event, gpointer data)
{
if (((GdkEventKey*)event)->keyval == GDK_KEY_Escape)
gtk_main_quit ();
return FALSE;
}
static gboolean on_icon_key_press_callback (GtkWidget *widget, GdkEvent *event, gpointer data)
{
if (((GdkEventKey*)event)->keyval == GDK_KEY_Return) {
appman_app_start((AppmanApp*)data);
gtk_main_quit ();
}
return FALSE;
}
static gboolean on_search_entry_key_release_callback (GtkSearchEntry *searchentry, GdkEvent *event, gpointer data)
{
gint keyval = ((GdkEventKey*)event)->keyval;
if (((keyval >= GDK_KEY_A) && (keyval <= GDK_KEY_Z)) || ((keyval >= GDK_KEY_0) && (keyval <= GDK_KEY_9)) || ((keyval >= GDK_KEY_a) && (keyval <= GDK_KEY_z)) || (keyval == GDK_KEY_BackSpace) || (keyval == GDK_KEY_Cancel)) {
gint i, row;
gint columns = screen_width/(SPACE+ICON_SIZE) - 2;
/* I'm not using TRIE or binary search because in general there is a small number of installed application,
* so the efficiency is good enought also with this simple code.
*/
const gchar *query = gtk_entry_get_text((GtkEntry*)searchentry);
AppmanApp *app;
for (i = 0; i < apps_count; i++) {
row = i / columns;
GtkWidget *child = gtk_grid_get_child_at((GtkGrid*)data, i - (row * columns), row);
gchar *name = appman_app_get_name (apps[i]);
if (!(g_str_has_prefix ( g_utf8_strdown ( name, strlen(name) ), g_utf8_strdown (query, strlen(query))))) {
gtk_widget_hide (child);
} else {
gtk_widget_show (child);
if (strlen(name) == strlen(query))
gtk_widget_grab_focus (child);
}
}
}
return FALSE;
}
void add_application(GtkGrid *grid, AppmanApp *app, int i, int j) {
GtkWidget *event_box = gtk_event_box_new ();
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
GtkWidget *image = gtk_image_new_from_file (appman_app_get_icon_path (app));
resize_image(image, ICON_SIZE, ICON_SIZE);
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, ICON_PADDING);
gchar *str = appman_app_get_name (app);
resize_text(str, 15);
GtkWidget *label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), g_strconcat("<span color='#FFFFFF'>",str,"</span>", NULL));
g_free(str);
gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (event_box), box);
gtk_widget_set_can_focus (event_box, TRUE);
gtk_grid_attach(GTK_GRID(grid), event_box, j, i, 1, 1);
g_signal_connect (G_OBJECT (event_box), "button-press-event", G_CALLBACK (on_icon_button_press_callback), (gpointer) app);
g_signal_connect (G_OBJECT (event_box), "enter-notify-event", G_CALLBACK (on_icon_mouse_enter_callback), NULL);
g_signal_connect (G_OBJECT (event_box), "leave-notify-event", G_CALLBACK (on_icon_mouse_leave_callback), NULL);
g_signal_connect (G_OBJECT (event_box), "key-press-event", G_CALLBACK (on_icon_key_press_callback), (gpointer) app);
g_signal_connect (G_OBJECT (event_box), "focus-in-event", G_CALLBACK (on_icon_mouse_enter_callback), NULL); //Same as mouse events
g_signal_connect (G_OBJECT (event_box), "focus-out-event", G_CALLBACK (on_icon_mouse_leave_callback), NULL);
}
void add_applications(GtkGrid *grid) {
int columns = screen_width/(SPACE+ICON_SIZE) - 2;
AppmanApplicationHandler *apphandl = appman_application_handler_new ();
apps = appman_application_handler_get_apps (apphandl, &apps_count);
int j = 0;
int t = apps_count/columns;
int i = 0;
int x = 0;
for (j = 0; j < columns; j++) gtk_grid_insert_column (grid, j);
for (i=0; i < t; i++) {
gtk_grid_insert_row (grid, i);
for (j = 0; j < columns; j++) {
add_application(grid, apps[x], i, j);
x++;
}
}
//reminder of division
j = apps_count % columns;
gtk_grid_insert_row (grid, i);
for (x = 0; x < j; x++) {
add_application(grid, apps[x+i*columns], i, x);
}
g_object_unref (apphandl);
}
/** Maybe they aren't so useful
void add_filter_buttons (GtkWidget *box, GtkWidget *grid) {
GtkWidget *btn_utility = gtk_button_new_with_label ("Utility");
gtk_widget_set_size_request (btn_utility, BUTTON_WIDTH, BUTTON_HEIGHT);
g_signal_connect (G_OBJECT (btn_utility), "clicked", G_CALLBACK (on_button_clicked_callback), (gpointer) grid);
GtkWidget *btn_audiovideo = gtk_button_new_with_label ("AudioVideo");
gtk_widget_set_size_request (btn_audiovideo, BUTTON_WIDTH, BUTTON_HEIGHT);
GtkWidget *btn_game = gtk_button_new_with_label ("Game");
gtk_widget_set_size_request (btn_game, BUTTON_WIDTH, BUTTON_HEIGHT);
GtkWidget *btn_network = gtk_button_new_with_label ("Network");
gtk_widget_set_size_request (btn_network, BUTTON_WIDTH, BUTTON_HEIGHT);
GtkWidget *btn_office = gtk_button_new_with_label ("Office");
gtk_widget_set_size_request (btn_office, BUTTON_WIDTH, BUTTON_HEIGHT);
GtkWidget *btn_development = gtk_button_new_with_label ("Development");
gtk_widget_set_size_request (btn_development, BUTTON_WIDTH, BUTTON_HEIGHT);
GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20);
gtk_widget_set_halign(hbox, GTK_ALIGN_CENTER);
gtk_box_pack_start (GTK_BOX (hbox), btn_utility, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), btn_audiovideo, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), btn_game, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), btn_network, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), btn_office, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (hbox), btn_development, FALSE, FALSE, 0);
gtk_widget_set_margin_top(hbox, 20);
gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
}
*/
int main (int argc, char **argv) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* Get the size of the screen */
GdkScreen *screen = gdk_screen_get_default ();
screen_width = gdk_screen_get_width (screen);
screen_height = gdk_screen_get_height (screen);
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 20);
GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_min_content_height ((GtkScrolledWindow*)scrolled_window, screen_height-80 );
GtkWidget *search_entry = gtk_search_entry_new ();
gtk_widget_set_margin_top(search_entry, 20);
gtk_widget_set_margin_start(search_entry, screen_width-800);
gtk_widget_set_margin_end(search_entry, screen_width-800);
GtkWidget *grid = gtk_grid_new ();
gtk_grid_set_row_spacing((GtkGrid*)grid, SPACE);
gtk_grid_set_column_spacing((GtkGrid*)grid, SPACE);
add_applications((GtkGrid*)grid);
set_widget_color(window, 0, 0, 0, 0);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_window_fullscreen (GTK_WINDOW(window));
gtk_window_set_modal(GTK_WINDOW(window), TRUE);
gtk_window_set_title(GTK_WINDOW(window), "RapidLauncher");
//add_filter_buttons (box, grid); DISABLED
gtk_box_pack_start (GTK_BOX (box), search_entry, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER(scrolled_window), grid);
gtk_widget_set_halign(grid, GTK_ALIGN_CENTER);
gtk_box_pack_start (GTK_BOX (box), scrolled_window, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box);
gtk_widget_set_events(window, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK);
g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (on_window_key_press_callback), NULL);
g_signal_connect (G_OBJECT (search_entry), "key-release-event", G_CALLBACK (on_search_entry_key_release_callback), grid);
gtk_widget_grab_focus (search_entry);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}