This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository lightdm-efl-greeter.
View the commit online.
commit 210da85a16488d4bbcde67b2e2b3f0ee44cd12a0
Author: Swagtoy <m...@ow.swag.toys>
AuthorDate: Mon Jun 30 22:50:03 2025 -0400
Multimonitor
---
src/greeter.c | 187 +++++++++++++++++++++++++++++++++++++++-----------------
src/meson.build | 1 +
2 files changed, 131 insertions(+), 57 deletions(-)
diff --git a/src/greeter.c b/src/greeter.c
index a242865..7280181 100644
--- a/src/greeter.c
+++ b/src/greeter.c
@@ -4,6 +4,7 @@
#include <signal.h>
#include "Ecore_Common.h"
#include "Evas.h"
+#include "elm_list_eo.legacy.h"
#include "gdk/gdk.h"
#include "gio/gio.h"
#include "glib.h"
@@ -14,12 +15,20 @@
#include <stdbool.h>
#include <X11/extensions/Xrandr.h>
+#define INSIDE(x, y, xx, yy, ww, hh) \
+ (((x) < ((xx) + (ww))) && ((y) < ((yy) + (hh))) && \
+ ((x) >= (xx)) && ((y) >= (yy)))
+
+#define E_BEGIN(noop) ;
+#define E_END(noop) ;
+
static void
show_message_cb(LightDMGreeter *ldm, const gchar *text, LightDMPromptType type);
static void
create_notification(const gchar *text);
static LightDMGreeter *greeter;
+static GList *users = NULL;
static Evas_Object *root;
static Evas_Object *win;
static Evas_Object *sessions;
@@ -30,6 +39,9 @@ static Evas_Object *notify;
static gchar const *curr_key = "enlightenment";
static GMainLoop *loop;
static LightDMPromptType type = LIGHTDM_PROMPT_TYPE_QUESTION;
+static XRRMonitorInfo *monitors = NULL;
+static int primary_idx = 0,
+ monitors_len = 0;
Evas_Object*
E_SHOW(Evas_Object *obj)
@@ -173,6 +185,7 @@ autologin_timer_expired_cb(LightDMGreeter *ldm, const gchar *text, LightDMPrompt
static void
sigterm_cb(int catch)
{
+ XRRFreeMonitors(monitors);
gtk_main_quit();
//elm_shutdown();
elm_exit();
@@ -191,39 +204,50 @@ build_login_prompt(Evas_Object *parent)
elm_box_padding_set(box, 5, 5);
o = E_SHOW(elm_label_add(this));
- elm_object_text_set(o, "Username:");
- elm_table_pack(this, o, 0, 0, 1, 1);
+ E_BEGIN(o)
+ elm_object_text_set(o, "Username:");
+ elm_table_pack(this, o, 0, 0, 1, 1);
+ E_END()
+ //users = lightdm_user_list_get_users(lightdm_user_list_get_instance());
username_in = E_SHOW(elm_entry_add(this));
- elm_entry_single_line_set(username_in, EINA_TRUE);
- elm_entry_scrollable_set(username_in, EINA_TRUE);
- evas_object_size_hint_weight_set(username_in, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(username_in, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_table_pack(this, username_in, 1, 0, 50, 1);
+ E_BEGIN(username_in)
+ elm_entry_single_line_set(username_in, EINA_TRUE);
+ elm_entry_scrollable_set(username_in, EINA_TRUE);
+ evas_object_size_hint_weight_set(username_in, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(username_in, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(this, username_in, 1, 0, 50, 1);
+ E_END(username_in)
o = E_SHOW(elm_label_add(this));
- elm_object_text_set(o, "Password:");
- elm_table_pack(this, o, 0, 1, 1, 1);
+ E_BEGIN(o)
+ elm_object_text_set(o, "Password:");
+ elm_table_pack(this, o, 0, 1, 1, 1);
+ E_END(o)
password_in = E_SHOW(elm_entry_add(this));
- elm_entry_single_line_set(password_in, EINA_TRUE);
- elm_entry_password_set(password_in, EINA_TRUE);
- elm_entry_scrollable_set(password_in, EINA_TRUE);
- evas_object_size_hint_weight_set(password_in, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(password_in, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_table_pack(this, password_in, 1, 1, 50, 1);
+ E_BEGIN(password_in)
+ elm_entry_single_line_set(password_in, EINA_TRUE);
+ elm_entry_password_set(password_in, EINA_TRUE);
+ elm_entry_scrollable_set(password_in, EINA_TRUE);
+ evas_object_size_hint_weight_set(password_in, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(password_in, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_table_pack(this, password_in, 1, 1, 50, 1);
+ E_END()
elm_box_pack_end(box, this);
o = E_SHOW(elm_button_add(this));
- elm_object_text_set(o, "Login");
- evas_object_smart_callback_add(o, "clicked", login_cb, NULL);
- elm_box_pack_end(box, o);
-
- elm_object_text_set(frame, "Login");
- //evas_object_size_hint_weight_set(this, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- //evas_object_size_hint_align_set(this, EVAS_HINT_FILL, EVAS_HINT_FILL);
- elm_object_content_set(frame, box);
+ E_BEGIN(o)
+ elm_object_text_set(o, "Login");
+ evas_object_smart_callback_add(o, "clicked", login_cb, NULL);
+ elm_box_pack_end(box, o);
+
+ elm_object_text_set(frame, "Login");
+ //evas_object_size_hint_weight_set(this, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ //evas_object_size_hint_align_set(this, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_object_content_set(frame, box);
+ E_END(o)
return frame;
@@ -284,6 +308,50 @@ rootless_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root, int
}
}
+static void
+read_monitor_bounds()
+{
+ Ecore_X_Display *disp = ecore_x_display_get();
+ int count = ecore_x_screen_count_get();
+ Ecore_X_Window xwindow = elm_win_xwindow_get(win);
+
+ if (monitors)
+ XRRFreeMonitors(monitors);
+ monitors = XRRGetMonitors(disp, xwindow, False, &monitors_len);
+ for (int i = 0; i < monitors_len; ++i)
+ {
+ XRRMonitorInfo mon = monitors[i];
+ if (mon.primary == 1)
+ primary_idx = i;
+ printf("Monitor %s\n"
+ "\tx: %d\n"
+ "\ty: %d\n"
+ "\tw: %d\n"
+ "\th: %d\n",
+ XGetAtomName(disp, mon.name), mon.x, mon.y, mon.width, mon.height);
+ }
+}
+
+static void
+mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *_ev)
+{
+ Evas_Event_Mouse_Move *ev = _ev;
+ Evas_Coord x = ev->cur.canvas.x,
+ y = ev->cur.canvas.y;
+
+ //evas_object_move(root, x, y);
+ for (int i = 0; i < monitors_len; ++i)
+ {
+ XRRMonitorInfo *mon = monitors + i;
+ if (INSIDE(x, y, mon->x, mon->y, mon->width, mon->height))
+ {
+ printf("Inside %s\n", XGetAtomName(ecore_x_display_get(), mon->name));
+ evas_object_move(root, mon->x, mon->y);
+ evas_object_resize(root, mon->width, mon->height);
+ }
+ }
+}
+
int
main(int argc, char **argv)
{
@@ -308,58 +376,63 @@ main(int argc, char **argv)
//lightdm_greeter_authenticate(greeter, NULL, NULL);
- win =
- E_SHOW(elm_win_util_standard_add("lightdm-efl-greeter-root", "Lightdm"));
+ win = E_SHOW(elm_win_util_standard_add("lightdm-efl-greeter-root", "Lightdm"));
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
elm_win_autodel_set(win, EINA_TRUE);
+ /* snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get()); */
+ /* elm_theme_extension_add(NULL, buf); */
- snprintf(buf, sizeof(buf), "%s/objects/cursors.edj", elm_app_data_dir_get());
- elm_theme_extension_add(NULL, buf);
elm_config_cursor_engine_only_set(EINA_TRUE);
elm_object_cursor_set(win, "left_ptr");
- //elm_object_cursor_style_set(win, "hand1");
root = E_SHOW(elm_table_add(win));
- //elm_box_padding_set(root, 12, 12);
- //elm_box_homogeneous_set(root, EINA_FALSE);
evas_object_size_hint_weight_set(root, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
ob = E_SHOW(elm_box_add(win));
- elm_box_horizontal_set(ob, EINA_TRUE);
- evas_object_size_hint_align_set(ob, 0.0, 0.0);
- evas_object_size_hint_weight_set(ob, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
- elm_box_padding_set(ob, 5, 0);
- o = E_SHOW(elm_label_add(win));
- // XXX: Bad
- elm_object_text_set(o, " Session:");
- elm_box_pack_end(ob, o);
+ E_BEGIN(ob)
+ elm_box_horizontal_set(ob, EINA_TRUE);
+ evas_object_size_hint_align_set(ob, 0.0, 0.0);
+ evas_object_size_hint_weight_set(ob, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ elm_box_padding_set(ob, 5, 0);
+ o = E_SHOW(elm_label_add(win));
+ // XXX: Bad
+ elm_object_text_set(o, " Session:");
+ elm_box_pack_end(ob, o);
+ E_END()
sessions = E_SHOW(elm_hoversel_add(win));
- elm_hoversel_auto_update_set(sessions, EINA_TRUE);
- elm_object_text_set(sessions, " ");
- GList *sessions_list = lightdm_get_sessions();
- for (GList *elem = sessions_list; elem; elem = elem->next)
- {
- LightDMSession *session = elem->data;
- elm_hoversel_item_add(sessions, lightdm_session_get_name(session), NULL, ELM_ICON_NONE, session_set_cb, session);
- }
- elm_box_pack_end(ob, sessions);
- elm_table_pack(root, ob, 0, 0, 1, 1);
-
- ob = E_SHOW(elm_box_add(win));
- evas_object_size_hint_weight_set(ob, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- evas_object_size_hint_align_set(ob, EVAS_HINT_FILL, EVAS_HINT_FILL);
- o = E_SHOW(build_login_prompt(root));
- evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- elm_table_pack(root, o, 0, 1, 1, 1);
+ E_BEGIN(sessions)
+ elm_hoversel_auto_update_set(sessions, EINA_TRUE);
+ elm_object_text_set(sessions, " ");
+ GList *sessions_list = lightdm_get_sessions();
+ for (GList *elem = sessions_list; elem; elem = elem->next)
+ {
+ LightDMSession *session = elem->data;
+ elm_hoversel_item_add(sessions, lightdm_session_get_name(session), NULL, ELM_ICON_NONE, session_set_cb, session);
+ }
+ elm_box_pack_end(ob, sessions);
+ elm_table_pack(root, ob, 0, 0, 1, 1);
+
+ ob = E_SHOW(elm_box_add(win));
+ evas_object_size_hint_weight_set(ob, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ob, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ o = E_SHOW(build_login_prompt(root));
+ evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_table_pack(root, o, 0, 1, 1, 1);
+ E_END()
// XXX: Should get monitor size, look at x_randr functions later, but this is easier for me
int w = ELM_SCALE_SIZE(800), h = ELM_SCALE_SIZE(600);
Ecore_X_Window xwindow = elm_win_xwindow_get(win);
+ Ecore_X_Screen *xscreen = ecore_x_screen_get(0);
- if (!no_lightdm)
- rootless_x_randr_screen_primary_output_current_size_get(xwindow, &w, &h, NULL, NULL, NULL);
+ if (!no_lightdm || true)
+ ecore_x_screen_size_get(xscreen, &w, &h);
+ //rootless_x_randr_screen_primary_output_current_size_get(xwindow, &w, &h, NULL, NULL, NULL);
+ read_monitor_bounds();
+
+ evas_object_event_callback_add(win, EVAS_CALLBACK_MOUSE_MOVE, mouse_move_cb, win);
// TODO maybe not this?
//elm_win_resize_object_add(win, root);
diff --git a/src/meson.build b/src/meson.build
index a5044f4..4ab3e83 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -9,6 +9,7 @@ executable(meson.project_name(),
dependency('ecore', version: '>= 1.26.0'),
dependency('ecore-x', version: '>= 1.26.0'),
dependency('xrandr'),
+ dependency('x11'),
meson.get_compiler('c').find_library('m')
],
install: true
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.